Azure Red Hat OpenShift에서 비밀 자격 증명 모음 CSI 드라이버용 Azure Key Vault 공급자 사용
비밀 자격 증명 모음 CSI 드라이버용 Azure Key Vault 공급자를 사용하면 Azure Key Vault 인스턴스에 저장된 비밀 콘텐츠를 가져오고 비밀 자격 증명 모음 CSI 드라이버를 사용하여 이를 Kubernetes Pod에 탑재할 수 있습니다. 이 문서에서는 Azure Red Hat OpenShift에서 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자를 사용하는 방법을 설명합니다.
참고 항목
이 문서에 제시된 오픈 소스 솔루션 대신 Azure Arc를 사용하여 Azure Key Vault Provider for Secrets Store CSI 드라이버 확장과 함께 ARO 클러스터를 관리할 수 있습니다. 이 방법은 Microsoft에서 완벽하게 지원되며 아래 오픈 소스 솔루션 대신 권장됩니다.
필수 조건
필요한 필수 구성 요소는 다음과 같습니다.
- Azure Red Hat OpenShift 클러스터(자세한 내용은 Azure Red Hat OpenShift 클러스터 만들기 참조)
- Azure CLI(로그인됨)
- Helm 3.x CLI
환경 변수 설정
이 절차 전체에서 사용할 다음 변수를 설정합니다.
export KEYVAULT_RESOURCE_GROUP=${AZR_RESOURCE_GROUP:-"openshift"}
export KEYVAULT_LOCATION=${AZR_RESOURCE_LOCATION:-"eastus"}
export KEYVAULT_NAME=secret-store-$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1)
export AZ_TENANT_ID=$(az account show -o tsv --query tenantId)
Kubernetes 비밀 저장소 CSI 드라이버 설치
ARO 프로젝트를 만듭니다. 이 프로젝트에 CSI 드라이버를 배포합니다.
oc new-project k8s-secrets-store-csi
SecurityContextConstraints를 설정하여 CSI 드라이버 실행을 허용합니다(그렇지 않으면 CSI 드라이버가 Pod를 만들 수 없음).
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
Helm 리포지토리에 비밀 리포지토리 CSI 드라이버를 추가합니다.
helm repo add secrets-store-csi-driver \ https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
Helm 리포지토리를 업데이트합니다.
helm repo update
비밀 저장소 CSI 드라이버를 설치합니다.
helm install -n k8s-secrets-store-csi csi-secrets-store \ secrets-store-csi-driver/secrets-store-csi-driver \ --version v1.3.1 \ --set "linux.providersDir=/var/run/secrets-store-csi-providers"
필요에 따라 위의 명령에 다음 매개 변수를 추가하여 비밀 자동 회전을 사용하도록 설정할 수 있습니다.
--set "syncSecret.enabled=true" --set "enableSecretRotation=true"
CSI Driver DaemonSets가 실행 중인지 확인합니다.
kubectl --namespace=k8s-secrets-store-csi get pods -l "app=secrets-store-csi-driver"
위의 명령을 실행하면 다음이 표시됩니다.
NAME READY STATUS RESTARTS AGE csi-secrets-store-secrets-store-csi-driver-cl7dv 3/3 Running 0 57s csi-secrets-store-secrets-store-csi-driver-gbz27 3/3 Running 0 57s
비밀 자격 증명 모음 CSI 드라이버용 Azure Key Vault 공급자 배포
Azure Helm 리포지토리를 추가합니다.
helm repo add csi-secrets-store-provider-azure \ https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
로컬 Helm 리포지토리를 업데이트합니다.
helm repo update
Azure Key Vault CSI 공급자를 설치합니다.
helm install -n k8s-secrets-store-csi azure-csi-provider \ csi-secrets-store-provider-azure/csi-secrets-store-provider-azure \ --set linux.privileged=true --set secrets-store-csi-driver.install=false \ --set "linux.providersDir=/var/run/secrets-store-csi-providers" \ --version=v1.4.1
CSI 드라이버가 실행되도록 SecurityContextConstraints를 설정합니다.
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:csi-secrets-store-provider-azure
키 자격 증명 모음 및 비밀 만들기
애플리케이션의 네임스페이스를 만듭니다.
oc new-project my-application
ARO가 포함된 리소스 그룹에 Azure Key Vault를 만듭니다.
az keyvault create -n ${KEYVAULT_NAME} \ -g ${KEYVAULT_RESOURCE_GROUP} \ --location ${KEYVAULT_LOCATION}
키 자격 증명 모음에서 비밀을 만듭니다.
az keyvault secret set \ --vault-name ${KEYVAULT_NAME} \ --name secret1 --value "Hello"
키 자격 증명 모음에 대한 서비스 주체를 만듭니다.
참고 항목
서비스 주체를 만들 때 오류가 발생하면 Azure CLI를 최신 버전으로 업그레이드해야 할 수 있습니다.
export SERVICE_PRINCIPAL_CLIENT_SECRET="$(az ad sp create-for-rbac --skip-assignment --name http://$KEYVAULT_NAME --query 'password' -otsv)" export SERVICE_PRINCIPAL_CLIENT_ID="$(az ad sp list --display-name http://$KEYVAULT_NAME --query '[0].appId' -otsv)"
서비스 주체에 대한 액세스 정책을 설정합니다.
az keyvault set-policy -n ${KEYVAULT_NAME} \ --secret-permissions get \ --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
키 자격 증명 모음에 액세스하는 데 사용할 Kubernetes의 비밀을 만들고 레이블을 지정합니다.
kubectl create secret generic secrets-store-creds \ -n my-application \ --from-literal clientid=${SERVICE_PRINCIPAL_CLIENT_ID} \ --from-literal clientsecret=${SERVICE_PRINCIPAL_CLIENT_SECRET} kubectl -n my-application label secret \ secrets-store-creds secrets-store.csi.k8s.io/used=true
CSI 드라이버를 사용하는 애플리케이션 배포
이 보안 비밀에 대한 액세스 권한을 부여하려면
SecretProviderClass
를 만듭니다.cat <<EOF | kubectl apply -f - apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: azure-kvname namespace: my-application spec: provider: azure parameters: usePodIdentity: "false" useVMManagedIdentity: "false" userAssignedIdentityID: "" keyvaultName: "${KEYVAULT_NAME}" objects: | array: - | objectName: secret1 objectType: secret objectVersion: "" tenantId: "${AZ_TENANT_ID}" EOF
이전 단계에서 만든
SecretProviderClass
를 사용하는 Pod를 만듭니다.cat <<EOF | kubectl apply -f - kind: Pod apiVersion: v1 metadata: name: busybox-secrets-store-inline namespace: my-application spec: containers: - name: busybox image: k8s.gcr.io/e2e-test-images/busybox:1.29 command: - "/bin/sleep" - "10000" volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "azure-kvname" nodePublishSecretRef: name: secrets-store-creds EOF
보안 비밀이 탑재되었는지 확인합니다.
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
출력은 다음과 일치해야 합니다.
secret1
비밀을 인쇄합니다.
kubectl exec busybox-secrets-store-inline \ -- cat /mnt/secrets-store/secret1
출력은 다음과 일치해야 합니다.
Hello
정리
Key Vault 공급자 및 CSI 드라이버를 제거합니다.
Key Vault 공급자 제거
Helm 차트 제거:
helm uninstall -n k8s-secrets-store-csi azure-csi-provider
앱 삭제:
oc delete project my-application
Azure Key Vault을 삭제합니다.
az keyvault delete -n ${KEYVAULT_NAME}
서비스 주체를 삭제합니다.
az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
Kubernetes 비밀 저장소 CSI 드라이버 제거
비밀 저장소 CSI 드라이버를 삭제합니다.
helm uninstall -n k8s-secrets-store-csi csi-secrets-store oc delete project k8s-secrets-store-csi
SecurityContextConstraints를 삭제합니다.
oc adm policy remove-scc-from-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver