AKS의 Secrets Store CSI driver를 통해 Key Vault 사용

AKS(Azure Kubernetes Service)에서는 Secrets Store CSI driver를 통해 Key Vault에 액세스하는 미리보기가 공개됩니다.
키 볼트(Key Vault)를 활용하면 안전한 방법으로 비밀 정보를 저장·취득할 수 있을 것으로 기대할 수 있다.
튜토리얼 프로그램은 다음 공식 문서를 참조합니다.
Azure Kubernetes Service Service Secret 비밀 스토어 CSI 드라이버 사용 - Azure Kubernetes Service | Microsoft Docs
해보려고 했는데 막힌 부분도 있어서 기사로 미리 남기고 싶었어요.

컨디션

  • AKS (1.19.11)
  • Windows 10
  • 고려 사항


    kubectl의 자격 정보 저장


    '시크릿스토어 CSI 드라이버 설치 확인'에서는 단계별로'샤샤'kubectl get pods이지만 환경에 따라 이전 접속 정보 등이 있어 접속이 되지 않을 수 있다.
    kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver, secrets-store-provider-azure)'
    Unable to connect to the server: dial tcp: lookup xxx: no such host
    
    다음 명령을 사용하여kubectl의 연결 목표를 설정합니다.
    az aks get-credentials --resource-group myResourceGroup  --name myAKSCluster
    
    그리고 집행kubectl get pods하면 순조롭게 통과할 수 있을 것이다.
    > kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver, secrets-store-provider-azure)'
    
    NAME                                     READY   STATUS    RESTARTS   AGE
    aks-secrets-store-csi-driver-j9gjh       3/3     Running   1          4m20s
    aks-secrets-store-csi-driver-nmzjs       3/3     Running   2          4m31s
    aks-secrets-store-csi-driver-wkhwd       3/3     Running   1          4m20s
    aks-secrets-store-provider-azure-54vp5   1/1     Running   0          4m20s
    aks-secrets-store-provider-azure-pztzs   1/1     Running   0          4m31s
    aks-secrets-store-provider-azure-vms2g   1/1     Running   0          4m20s
    

    비밀 및 키 만들기


    튜토리얼의 yaml 파일을 직접 사용하면 "Azure Key Vault 만들기 또는 기존 파일 사용"의 경우 객체의 Key Vault에서 사전 제작secret1의 비밀과key1 키가 필요합니다.

    서비스 공급업체의 생성 및 액세스 라이센스 필요


    Azure Key Vault에 접근하기 위한 ID 제공'에 프로그램이 기재되지 않았지만 서비스 주관자의 펄스 제작과 Key Vault에 대한 접근 허가가 필요하다.
    이 단계를 수행하지 않으면 후면busybox-secrets-store-inlinePod 제작ContainerCreating 상태가 유지됩니다.이때 kubectl describe pod 확인을 통해 다음과 같은 오류가 발생했음을 확인할 수 있다.
    Events:
      Type     Reason       Age              From               Message
      ----     ------       ----             ----               -------
      Normal   Scheduled    4s               default-scheduler  Successfully assigned default/busybox-secrets-store-inline to aks-nodepool1-42592859-vmss000001
      Warning  FailedMount  1s (x2 over 2s)  kubelet            <下記参照>
    
    MountVolume.SetUp failed for volume "secrets-store-inline": fetching NodePublishSecretRef default/secrets-store-creds failed: kubernetes.io/csi: failed to find the secret secrets-store-creds in the namespace default with error: secrets "secrets-store-creds"not found
    "secrets-store-creds 같은 비밀은 없다"는 욕을 먹었지만, 이를 만드는 절차는 다음 문서에 기재돼 있다.
    Service Principal | Azure Key Vault Provider for Secrets Store CSI Driver
    우선 서비스 선호도 만들기
    az ad sp create-for-rbac --skip-assignment --name myAKSClusterServicePrincipal
    
    {
      "appId": "06634dda-f18b-4688-b941-ff71d363ca10",
      "displayName": "myAKSClusterServicePrincipal",
      "name": "http://myAKSClusterServicePrincipal",
      "password": "TAy5g~0d-NPskcesNsS9DhFNbxNnFQGYjw",
      "tenant": "xxxxxx"
    }
    
    Key Vault의 액세스 정책에서 상기 서비스 중요 사항에 대해 최소한 기밀 및 키 액세스 권한을 부여합니다.
    참조: Azure Key Vault 액세스 정책 할당(포털) | Microsoft Docs
    다음 느낌으로 바뀌면 OK.

    그리고 사전 제작secrets-store-creds의 비밀.
    kubectl create secret generic secrets-store-creds --from-literal clientid="06634dda-f18b-4688-b941-ff71d363ca10" --from-literal clientsecret="TAy5g~0d-NPskcesNsS9DhFNbxNnFQGYjw"
    
    다시 Pod를 만들면 Pod가 Running로 변하고 kubectl describe pod에서 다음과 같이 오류가 없으면 OK.
    Events:
      Type    Reason     Age   From               Message
      ----    ------     ----  ----               -------
      Normal  Scheduled  4s    default-scheduler  Successfully assigned default/busybox-secrets-store-inline to aks-nodepool1-42592859-vmss000001
      Normal  Pulling    4s    kubelet            Pulling image "k8s.gcr.io/e2e-test-images/busybox:1.29"
      Normal  Pulled     2s    kubelet            Successfully pulled image "k8s.gcr.io/e2e-test-images/busybox:1.29" in 2.198869156s
      Normal  Created    1s    kubelet            Created container busybox
      Normal  Started    1s    kubelet            Started container busybox
    
    또한 액세스 권한 부여 오류 등의 경우 방금 오류 메시지가 발생한 곳에서 다음과 같은 액세스 거부(403 Forbidden) 오류가 발생할 수 있으므로 이 오류가 발생한 경우 액세스 정책이 정확한지 확인하는 것이 좋습니다.
    MountVolume.SetUp failed for volume "secrets-store-inline": rpc error: code = Unknown desc = failed to mount secrets store objects for pod default/busybox-secrets-store-inline, err: rpc error: code = Unknown desc = failed to mount objects, error: failed to get objectType:secret, objectName:secret1, objectVersion::keyvault.BaseClient#GetSecret: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="Forbidden"Message="The user, group or application 'appid=06634dda-f18b-4688-b941-ff71d363ca10;oid=xxxxxx;iss=https://sts.windows.net/xxxxxx/' does not have secrets get permission on key vault 'ndsouMyKeyVault3;location=japaneast'. For help resolving this issue, please see https://go.microsoft.com/fwlink/?linkid=2125287 "InnerError={"code":"AccessDenied"}
    이 정도면 강좌의 프로그램이 끝까지 실행될 수 있다.
    > kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
    key1
    secret1
    
    > kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/secret1
    P@ssw0rd!!
    

    기타 고려 사항


    글 첫머리에서 말한 바와 같이 Azure Key Vault를 활용하면 안전한 방법으로 비밀 정보를 저장하고 얻을 수 있을 것으로 기대할 수 있다.
    다른 한편, 의존하는 서비스가 증가한 것은 사실이다.서비스 전체의 가용성을 계산하는 공식 등에서도 Key Vault의 가용성을 곱해야 한다는 점에 유의해야 한다.편하긴 한데

    좋은 웹페이지 즐겨찾기