AKS(Azure Kubernetes Service) ID 바인딩 설정

단일 FIC(페더레이션 ID 자격 증명)를 사용하는 동안 여러 클러스터에 사용자 할당 UAMI(관리 ID)를 매핑하도록 AKS(Azure Kubernetes Service) 클러스터에서 ID 바인딩 을 설정합니다. 이 설정은 FIC 제한에 도달하지 않고 워크로드에 대한 Microsoft Entra 인증의 크기를 조정하는 데 도움이 됩니다.

필수 조건

  • ID 바인딩의 작동 방식을 이해하려면 ID 바인딩 개념을 검토합니다.
  • Azure CLI 버전 2.73.0 이상. 버전을 확인하려면 명령을 사용합니다 az version . Azure CLI를 설치하거나 업데이트하려면 Azure CLI 설치를 참조하세요.
  • ID에 대해 Azure Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials/write 권한, 클러스터 범위에 대해 Azure Microsoft.ContainerService/managedClusters/write 권한이 필요합니다.
  • ClusterRole 및 ClusterRoleBinding 리소스를 생성하려면 Kubernetes 클러스터 관리자 권한(또는 이에 상응하는 권한)이 필요합니다.

제한점

테스트 리소스 만들기

  1. az group create 명령을 사용하여 Azure 리소스 그룹을 만듭니다.

    export RESOURCE_GROUP="ib-test"
    export LOCATION="westus2"
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. az aks create 명령과 --enable-workload-identity 및 --enable-oidc-issuer 플래그를 사용하여 워크로드 아이덴티티 및 OIDC 발급자가 활성화된 AKS 클러스터를 만듭니다.

    export CLUSTER_NAME="ib-test-cluster"
    
    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --location $LOCATION --no-ssh-key --enable-workload-identity --enable-oidc-issuer
    
  3. 명령을 사용하여 UAMI(사용자 할당 관리 ID)를 만듭니다 az identity create .

    export MI_NAME="ib-test-mi"
    az identity create --resource-group $RESOURCE_GROUP --name $MI_NAME
    

UAMI ID 가져오기

  • UAMI의 리소스, 보안 주체, 클라이언트 및 테넌트 ID를 가져와서 다음 az identity show 명령을 사용하여 환경 변수로 설정합니다.

    export MI_RESOURCE_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query id --output tsv)
    export MI_PRINCIPAL_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query principalId --output tsv)
    export MI_CLIENT_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query clientId --output tsv)
    export MI_TENANT_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query tenantId --output tsv)
    

ID 바인딩 만들기

  • az aks identity-binding create 명령을 사용하여 ID 바인딩을 통해 UAMI를 AKS 클러스터에 매핑합니다.

    az aks identity-binding create --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name "${MI_NAME}-ib" --managed-identity-resource-id $MI_RESOURCE_ID
    

    비고

    ID 바인딩을 만들 때 AKS는 UAMI 아래에 명명 aks-identity-binding 된 페더레이션된 FIC(ID 자격 증명)를 자동으로 만듭니다. 이 자격 증명은 AKS에서 관리됩니다. ID 바인딩을 사용하는 동안에는 수정하거나 삭제하지 마세요. ID 바인딩을 위해 만든 FIC는 동일한 UAMI를 참조하는 모든 ID 바인딩에서 공유됩니다.

UAMI에 대한 OIDC 발급자 URL 가져오기

  • 명령을 사용하여 ID 바인딩을 검사하여 UAMI와 연결된 OIDC 발급자 URL을 az aks identity-binding show 가져옵니다.

    az aks identity-binding show --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name "${MI_NAME}-ib"
    

    압축된 예제 출력:

    {
      "oidcIssuer": {
        "oidcIssuerUrl": "https://ib.oic.prod-aks.azure.com/<MI-tenant-id>/<MI-client-id>"
      }
    }
    

AKS 클러스터에 연결

  1. 명령을 사용하여 AKS 클러스터 자격 증명을 az aks get-credentials 가져와서 별도의 kubeconfig 파일에 저장합니다.

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME -a -f "${CLUSTER_NAME}.kubeconfig"
    
  2. KUBECONFIG 새 kubeconfig 파일을 가리키도록 환경 변수를 설정합니다.

    export KUBECONFIG="$(pwd)/${CLUSTER_NAME}.kubeconfig"
    

네임스페이스 및 서비스 계정 권한 부여

  • 다음 kubectl apply 명령을 사용하여 다음 매니페스트를 적용하여 특정 주체에게 ID 바인딩을 통해 관리 ID를 사용할 수 있는 권한을 부여하도록 RBAC(역할 기반 액세스 제어)를 구성합니다.

    비고

    다음 예제에서는 demo 네임스페이스의 demo 서비스 계정을 명시적으로 참조합니다. 특정 서비스 계정을 명시적으로 참조하는 것은 하나의 옵션이지만 아래 subjects의 서비스 계정 컬렉션을 참조할 수도 있습니다. 자세한 내용은 Kubernetes 설명서의 주제 참조 를 참조하세요.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: demo
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: demo
      namespace: demo
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: use-mi-${MI_CLIENT_ID}
    rules:
      - verbs: ["use-managed-identity"]
        apiGroups: ["cid.wi.aks.azure.com"]
        resources: ["${MI_CLIENT_ID}"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: use-mi-${MI_CLIENT_ID}
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: use-mi-${MI_CLIENT_ID}
    subjects:
      - kind: ServiceAccount
        name: demo
        namespace: demo
    EOF
    

제거 보호 및 Azure RBAC 권한 부여를 사용하여 키 자격 증명 모음을 생성하세요.

  • 삭제 보호 기능과 Azure RBAC 권한 부여가 활성화된 키 자격 증명 모음을 az keyvault create 명령과 --enable-purge-protection 및 --enable-rbac-authorization 플래그를 사용하여 생성하세요. 제거 보호 및 Azure RBAC 권한 부여 모두에 대해 구성된 경우 기존 키 자격 증명 모음을 사용할 수도 있습니다.

    export KEY_VAULT_NAME="ib-test"
    
    az keyvault create \
        --name $KEY_VAULT_NAME \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --enable-purge-protection \
        --enable-rbac-authorization
    

키 볼트 리소스 ID 및 URL 가져오기

  1. 명령을 사용하여 키 자격 증명 모음의 리소스 ID를 az keyvault show 가져와서 환경 변수로 설정합니다.

    export KEY_VAULT_RESOURCE_ID=$(az keyvault show --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query id \
        --output tsv)
    
  2. 명령을 사용하여 키 자격 증명 모음 URL을 az keyvault show 가져와서 환경 변수로 설정합니다.

    export KEYVAULT_URL="$(az keyvault show \
        --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query properties.vaultUri \
        --output tsv)"
    

키 보관소 액세스 구성 및 비밀 정보 만들기

다음 단계에서는 Pod에서 Azure Key Vault의 비밀, 키 또는 인증서에 액세스하는 방법을 보여 줍니다. 이 섹션의 예에서는 워크로드 ID에 대한 키 자격 증명 모음의 비밀에 대한 액세스를 구성하지만 유사한 단계를 수행하여 키 또는 인증서에 대한 액세스를 구성할 수 있습니다.

다음 예제에서는 Azure RBAC 권한 모델을 사용하여 Pod에 키 자격 증명 모음에 대한 액세스 권한을 부여하는 방법을 보여 줍니다. Azure Key Vault에 대한 Azure RBAC 권한 모델에 대한 자세한 내용은 Azure RBAC를 사용하여 애플리케이션에 Azure Key Vault에 액세스할 수 있는 권한 부여를 참조하세요.

  1. 명령을 사용하여 로그인한 사용자의 개체 ID를 az ad signed-in-user show 가져와서 환경 변수로 설정합니다.

    export CALLER_OBJECT_ID=$(az ad signed-in-user show --query id --output tsv)
    
  2. 키 자격 증명 모음에서 Azure RBAC 키 자격 증명 모음 비밀 책임자 역할을 az role assignment create 명령을 사용하여 본인에게 할당하세요.

    az role assignment create --assignee $CALLER_OBJECT_ID \
        --role "Key Vault Secrets Officer" \
        --scope $KEY_VAULT_RESOURCE_ID
    
  3. az keyvault secret set 명령을 사용하여 키 자격 증명 모음에 비밀을 만듭니다.

    export KEY_VAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set \
        --vault-name $KEY_VAULT_NAME \
        --name $KEY_VAULT_SECRET_NAME \
        --value "Hello\!"
    
  4. 명령을 사용하여 Key Vault 비밀 사용자 역할을 UAMI에 할당합니다 az role assignment create .

    az role assignment create \
        --assignee-object-id $MI_PRINCIPAL_ID \
        --role "Key Vault Secrets User" \
        --scope $KEY_VAULT_RESOURCE_ID \
        --assignee-principal-type ServicePrincipal
    

서비스 계정에 주석 달기

  1. kubectl annotate 명령을 사용하여 관리 ID 테넌트 ID로 서비스 계정에 주석을 추가합니다.

    kubectl annotate sa demo -n demo azure.workload.identity/tenant-id=$MI_TENANT_ID
    
  2. 서비스 계정에 관리 ID 클라이언트 ID를 주석으로 추가하려면 kubectl annotate 명령을 사용하세요.

    kubectl annotate sa demo -n demo azure.workload.identity/client-id=$MI_CLIENT_ID
    

샘플 애플리케이션 배포

  • 다음 kubectl apply 명령을 사용하여 ID 바인딩을 사용하여 관리 ID에 대한 액세스 토큰을 가져와 Azure Key Vault에 액세스하는 샘플 Pod를 배포합니다.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: demo
      labels:
        azure.workload.identity/use: "true"
      annotations:
        azure.workload.identity/use-identity-binding: "true"
    spec:
      serviceAccount: demo
      containers:
        - name: azure-sdk
          # source code: https://github.com/Azure/azure-workload-identity/blob/feature/custom-token-endpoint/examples/identitybinding-msal-go/main.go
          image: ghcr.io/bahe-msft/azure-workload-identity/identitybinding-msal-go:latest-linux-amd64
          env:
            - name: KEYVAULT_URL
              value: ${KEYVAULT_URL}
            - name: SECRET_NAME
              value: ${KEY_VAULT_SECRET_NAME}
      restartPolicy: Never
    EOF
    

샘플 애플리케이션에서 Key Vault에 대한 접근 확인

  1. Pod를 설명하고 kubectl describe pod 명령을 사용하여 환경 변수와 프로젝션된 토큰 볼륨 탑재가 있는지를 확인합니다.

    kubectl describe pod demo -n demo
    

    예상 출력에는 AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_FEDERATED_TOKEN_FILE, AZURE_AUTHORITY_HOST, AZURE_KUBERNETES_TOKEN_PROXY에 대한 값이 포함되어야 합니다. AZURE_KUBERNETES_SNI_NAME 및 AZURE_KUBERNETES_CA_FILE.

  2. Pod가 토큰을 가져오고 kubectl logs 명령을 사용하여 리소스에 액세스할 수 있는지 확인합니다.

    kubectl logs demo -n demo
    

    성공하면 출력은 다음 예제와 유사해야 합니다.

    I1107 20:03:42.865180       1 main.go:77] "successfully got secret" secret="Hello!"
    

여러 클러스터에서 ID 바인딩 크기 조정

ID 바인딩을 사용하면 단일 FIC를 사용하는 동안 여러 AKS 클러스터를 동일한 UAMI에 매핑할 수 있습니다. 여러 클러스터에서 ID 바인딩을 확장하려면, 동일한 UAMI에 매핑하려는 각 추가 클러스터에 대해 (클러스터당 새 ID 바인딩 만들기) 샘플 애플리케이션에서 키 자격 증명 모음에 대한 액세스를 확인하는 단계를 반복할 수 있습니다.

자원을 정리하세요

이 문서에서 만든 리소스가 더 이상 필요하지 않은 경우 향후 비용이 발생하지 않도록 정리할 수 있습니다.

  1. kubectl delete pod 명령을 사용하여 Pod를 삭제합니다.

    kubectl delete pod demo -n demo
    
  2. 명령을 사용하여 네임스페이스를 삭제합니다 kubectl delete ns .

    kubectl delete ns demo
    
  3. 명령을 사용하여 리소스 그룹 및 모든 관련 리소스를 삭제합니다 az group delete .

    az group delete --name $RESOURCE_GROUP --yes --no-wait