단일 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권한, 클러스터 범위에 대해 AzureMicrosoft.ContainerService/managedClusters/write권한이 필요합니다. -
ClusterRole및ClusterRoleBinding리소스를 생성하려면 Kubernetes 클러스터 관리자 권한(또는 이에 상응하는 권한)이 필요합니다.
제한점
- ID 바인딩은 API 서버 VNet 통합으로 구성된 클러스터에서 아직 지원되지 않습니다.
테스트 리소스 만들기
az group create명령을 사용하여 Azure 리소스 그룹을 만듭니다.export RESOURCE_GROUP="ib-test" export LOCATION="westus2" az group create --name $RESOURCE_GROUP --location $LOCATIONaz 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명령을 사용하여 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 클러스터에 연결
명령을 사용하여 AKS 클러스터 자격 증명을
az aks get-credentials가져와서 별도의 kubeconfig 파일에 저장합니다.az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME -a -f "${CLUSTER_NAME}.kubeconfig"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 가져오기
명령을 사용하여 키 자격 증명 모음의 리소스 ID를
az keyvault show가져와서 환경 변수로 설정합니다.export KEY_VAULT_RESOURCE_ID=$(az keyvault show --resource-group $RESOURCE_GROUP \ --name $KEY_VAULT_NAME \ --query id \ --output tsv)명령을 사용하여 키 자격 증명 모음 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에 액세스할 수 있는 권한 부여를 참조하세요.
명령을 사용하여 로그인한 사용자의 개체 ID를
az ad signed-in-user show가져와서 환경 변수로 설정합니다.export CALLER_OBJECT_ID=$(az ad signed-in-user show --query id --output tsv)키 자격 증명 모음에서 Azure RBAC 키 자격 증명 모음 비밀 책임자 역할을
az role assignment create명령을 사용하여 본인에게 할당하세요.az role assignment create --assignee $CALLER_OBJECT_ID \ --role "Key Vault Secrets Officer" \ --scope $KEY_VAULT_RESOURCE_IDaz 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\!"명령을 사용하여 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
서비스 계정에 주석 달기
kubectl annotate명령을 사용하여 관리 ID 테넌트 ID로 서비스 계정에 주석을 추가합니다.kubectl annotate sa demo -n demo azure.workload.identity/tenant-id=$MI_TENANT_ID서비스 계정에 관리 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에 대한 접근 확인
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.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 바인딩 만들기) 샘플 애플리케이션에서 키 자격 증명 모음에 대한 액세스를 확인하는 단계를 반복할 수 있습니다.
자원을 정리하세요
이 문서에서 만든 리소스가 더 이상 필요하지 않은 경우 향후 비용이 발생하지 않도록 정리할 수 있습니다.
kubectl delete pod명령을 사용하여 Pod를 삭제합니다.kubectl delete pod demo -n demo명령을 사용하여 네임스페이스를 삭제합니다
kubectl delete ns.kubectl delete ns demo명령을 사용하여 리소스 그룹 및 모든 관련 리소스를 삭제합니다
az group delete.az group delete --name $RESOURCE_GROUP --yes --no-wait