다음을 통해 공유


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에서 완벽하게 지원되며 아래 오픈 소스 솔루션 대신 권장됩니다.

필수 조건

필요한 필수 구성 요소는 다음과 같습니다.

환경 변수 설정

이 절차 전체에서 사용할 다음 변수를 설정합니다.

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 드라이버 설치

  1. ARO 프로젝트를 만듭니다. 이 프로젝트에 CSI 드라이버를 배포합니다.

    oc new-project k8s-secrets-store-csi
    
  2. SecurityContextConstraints를 설정하여 CSI 드라이버 실행을 허용합니다(그렇지 않으면 CSI 드라이버가 Pod를 만들 수 없음).

    oc adm policy add-scc-to-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
    
  3. Helm 리포지토리에 비밀 리포지토리 CSI 드라이버를 추가합니다.

    helm repo add secrets-store-csi-driver \
      https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    
  4. Helm 리포지토리를 업데이트합니다.

    helm repo update
    
  5. 비밀 저장소 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"

  6. 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 공급자 배포

  1. Azure Helm 리포지토리를 추가합니다.

    helm repo add csi-secrets-store-provider-azure \
       https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
    
  2. 로컬 Helm 리포지토리를 업데이트합니다.

    helm repo update
    
  3. 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
    
  4. CSI 드라이버가 실행되도록 SecurityContextConstraints를 설정합니다.

    oc adm policy add-scc-to-user privileged \
       system:serviceaccount:k8s-secrets-store-csi:csi-secrets-store-provider-azure
    

키 자격 증명 모음 및 비밀 만들기

  1. 애플리케이션의 네임스페이스를 만듭니다.

    oc new-project my-application
    
  2. ARO가 포함된 리소스 그룹에 Azure Key Vault를 만듭니다.

    az keyvault create -n ${KEYVAULT_NAME} \
       -g ${KEYVAULT_RESOURCE_GROUP} \
       --location ${KEYVAULT_LOCATION}
    
  3. 키 자격 증명 모음에서 비밀을 만듭니다.

    az keyvault secret set \
       --vault-name ${KEYVAULT_NAME} \
       --name secret1 --value "Hello"
    
  4. 키 자격 증명 모음에 대한 서비스 주체를 만듭니다.

    참고 항목

    서비스 주체를 만들 때 오류가 발생하면 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)"
    
  5. 서비스 주체에 대한 액세스 정책을 설정합니다.

    az keyvault set-policy -n ${KEYVAULT_NAME} \
       --secret-permissions get \
       --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
    
  6. 키 자격 증명 모음에 액세스하는 데 사용할 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 드라이버를 사용하는 애플리케이션 배포

  1. 이 보안 비밀에 대한 액세스 권한을 부여하려면 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
    
  2. 이전 단계에서 만든 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
    
  3. 보안 비밀이 탑재되었는지 확인합니다.

    kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
    

    출력은 다음과 일치해야 합니다.

    secret1
    
  4. 비밀을 인쇄합니다.

    kubectl exec busybox-secrets-store-inline \
       -- cat /mnt/secrets-store/secret1
    

    출력은 다음과 일치해야 합니다.

    Hello
    

정리

Key Vault 공급자 및 CSI 드라이버를 제거합니다.

Key Vault 공급자 제거

  1. Helm 차트 제거:

    helm uninstall -n k8s-secrets-store-csi azure-csi-provider
    
  2. 앱 삭제:

    oc delete project my-application
    
  3. Azure Key Vault을 삭제합니다.

    az keyvault delete -n ${KEYVAULT_NAME}
    
  4. 서비스 주체를 삭제합니다.

    az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
    

Kubernetes 비밀 저장소 CSI 드라이버 제거

  1. 비밀 저장소 CSI 드라이버를 삭제합니다.

    helm uninstall -n k8s-secrets-store-csi csi-secrets-store
    oc delete project k8s-secrets-store-csi
    
  2. SecurityContextConstraints를 삭제합니다.

    oc adm policy remove-scc-from-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver