Azure Kubernetes Service에서 Microsoft Entra Pod 관리 ID 사용(미리 보기)

Microsoft Entra Pod 관리 ID는 Kubernetes 기본 형식을 사용하여 Microsoft Entra ID의 Azure 리소스 및 ID에 대한 관리 ID를 Pod와 연결합니다. 관리이스트레이터는 Pod가 Microsoft Entra ID를 ID 공급자로 사용하는 Azure 리소스에 액세스할 수 있도록 하는 Kubernetes 기본 형식으로 ID 및 바인딩을 만듭니다.

Important

Microsoft Entra 워크로드 ID 검토하는 것이 좋습니다. 이 인증 방법은 Kubernetes 네이티브 기능과 통합되어 애플리케이션을 대신하여 외부 ID 공급자와 페더레이션하는 Pod 관리 ID(미리 보기)를 대체합니다.

Azure Kubernetes Service의 오픈 소스 Microsoft Entra Pod 관리 ID(미리 보기)는 2022년 10월 24일에 더 이상 사용되지 않으며, 프로젝트는 2023년 Sept에 보관되었습니다. 자세한 내용은 사용 중단 알림을 참조하세요. AKS 관리되는 추가 기능은 2024년 Sept에서 사용 중단을 시작합니다.

AKS 관리되는 추가 기능을 사용하지 않도록 설정하려면 다음 명령을 az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"사용합니다.

시작하기 전에

Azure CLI 버전 2.20.0 이상이 설치되어 있어야 합니다.

제한 사항

  • 클러스터에는 최대 200개의 Pod 관리 ID가 허용됩니다.
  • 클러스터에 대해 최대 200개의 Pod 관리 ID 예외가 허용됩니다.
  • Pod 관리 ID는 Linux 노드 풀에서만 사용할 수 있습니다.
  • 이 기능은 Virtual Machine Scale Sets 지원 클러스터에 대해서만 지원됩니다.

aks-preview Azure CLI 확장 설치

Important

AKS 미리 보기 기능은 셀프 서비스에서 옵트인(opt-in)으로 사용할 수 있습니다. 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.

aks-preview 확장을 설치하려면 다음 명령을 실행합니다.

az extension add --name aks-preview

다음 명령을 실행하여 릴리스된 확장의 최신 버전으로 업데이트합니다.

az extension update --name aks-preview

'EnablePodIdentityPreview' 기능 플래그 등록

EnablePodIdentityPreview 다음 예제와 같이 az feature register 명령을 사용하여 기능 플래그를 등록합니다.

az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

상태 등록됨을 표시하는 데 몇 분 정도 걸립니다. az feature show 명령을 사용하여 등록 상태 확인합니다.

az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

상태 Registered가 반영되면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록새로 고칩니다.

az provider register --namespace Microsoft.ContainerService

작업 모드 옵션

Microsoft Entra Pod 관리 ID는 두 가지 작업 모드를 지원합니다.

  • 표준 모드: 이 모드에서는 다음 두 구성 요소가 AKS 클러스터에 배포됩니다.
    • MIC(Managed Identity Controller): MIC는 Kubernetes API Server를 통해 Pod, AzureIdentityAzureIdentityBinding의 변경을 감시하는 Kubernetes 컨트롤러입니다. 관련 변경 내용이 감지되면 MIC는 필요에 따라 AzureAssignedIdentity를 추가하거나 삭제합니다. 특히 Pod가 예약되면 MIC는 생성 단계 중에 노드 풀에서 사용하는 기본 Virtual Machine Scale Set에 Azure의 관리 ID를 할당합니다. ID를 사용하는 모든 Pod가 삭제되면 다른 Pod에서 동일한 관리 ID를 사용하지 않는 한 노드 풀의 Virtual Machine Scale Set에서 ID를 제거합니다. MIC는 AzureIdentity 또는 AzureIdentityBinding을 만들거나 삭제할 때도 유사한 작업을 수행합니다.
    • NMI(Node Managed Identity): NMI는 AKS 클러스터의 각 노드에서 DaemonSet로 실행되는 Pod입니다. NMI는 각 노드에서 Azure Instance Metadata Service에 대한 보안 토큰 요청을 가로채서 자체로 리디렉션하고 Pod가 토큰을 요청하는 ID에 액세스할 수 있는지 확인하고 애플리케이션을 대신하여 Microsoft Entra 테넌트에서 토큰을 가져옵니다.
  • 관리 모드: 이 모드는 NMI만 제공합니다. AKS 클러스터 추가 항목을 통해 설치하는 경우 Azure는 사용자의 CLI 명령에 대한 응답으로 Kubernetes 기본 형식(AzureIdentity 및 AzureIdentityBinding) 및 ID 할당 만들기를 관리합니다. 그렇지 않으면 Helm 차트를 통해 설치되는 경우 ID를 사용자가 수동으로 할당하고 관리해야 합니다. 자세한 내용은 관리형 모드의 Pod ID를 참조하세요.

설치 가이드와 같이 Helm 차트 또는 YAML 매니페스트를 통해 Microsoft Entra Pod 관리 ID를 설치하는 경우 모드와 managed 모드 중 standard 에서 선택할 수 있습니다. 대신 이 문서에 표시된 대로 AKS 클러스터 추가 기능을 사용하여 Microsoft Entra Pod 관리 ID를 설치하기로 결정한 경우 설치 프로그램에서 모드를 managed 사용합니다.

Azure CNI(Container Networking Interface)를 사용하여 AKS 클러스터 만들기

참고 항목

기본 권장 구성입니다.

Azure CNI 및 Pod 관리 ID를 사용하도록 설정된 AKS 클러스터를 만듭니다. 다음 명령은 az group create를 사용하여 myResourceGroup 이라는 리소스 그룹을 만들고 az aks create 명령을 사용하여 myResourceGroup 리소스 그룹에 myAKSCluster라는 AKS 클러스터를 만듭니다.

az group create --name myResourceGroup --location eastus
az aks create -g myResourceGroup -n myAKSCluster --enable-pod-identity --network-plugin azure

AKS 클러스터에 로그인하려면 az aks get-credentials를 사용합니다. 또한 이 명령은 개발 컴퓨터에서 클라이언트 인증서를 kubectl 다운로드하고 구성합니다.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

참고 항목

AKS 클러스터에서 Pod 관리 ID를 사용하도록 설정하면 aks-addon-exception이라는 AzurePodIdentityException이 kube-system 네임스페이스에 추가됩니다. AzurePodIdentityException을 사용하면 특정 레이블이 있는 Pod가 Azure IMDS(Instance Metadata Service) 엔드포인트에 액세스할 수 있으며 NMI 서버가 해당 Pod를 가로채지 못합니다. aks-addon-exception을 사용하면 Microsoft Entra Pod 관리 ID와 같은 AKS 자사 추가 기능이 AzurePodIdentityException을 수동으로 구성하지 않고도 작동할 수 있습니다. 필요에 따라 , 또는 .를 사용하여 az aks pod-identity exception addaz aks pod-identity exception deleteaz aks pod-identity exception updateAzurePodIdentityException을 추가, 제거 및 업데이트할 kubectl수 있습니다.

Azure CNI를 사용하여 기존 AKS 클러스터 업데이트

Pod 관리 ID를 포함하도록 Azure CNI를 사용하여 기존 AKS 클러스터를 업데이트합니다.

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity

Microsoft Entra Pod 관리 ID와 Kubenet 네트워크 플러그 인 사용

Important

Kubenet을 사용하여 클러스터에서 Microsoft Entra Pod 관리 ID를 실행하는 것은 보안 문제로 인해 권장되는 구성이 아닙니다. 기본 Kubenet 구성은 ARP 스푸핑을 방지하지 못합니다. 이 스푸핑은 Pod가 다른 Pod 역할을 하고 의도되지 않은 ID에 액세스하는 데 사용될 수 있습니다. Kubenet을 사용하여 클러스터에서 Microsoft Entra Pod 관리 ID를 사용하도록 설정하기 전에 완화 단계를 수행하고 정책을 구성하세요.

마이그레이션

클러스터 수준에서 취약성을 완화하기 위해 Azure 기본 제공 정책 "Kubernetes 클러스터 컨테이너는 허용된 기능만 사용해야 함"을 사용하여 CAP_NET_RAW 공격을 제한할 수 있습니다.

"필수 드롭 기능"에 NET_RAW 추가

image

Azure Policy를 사용하지 않는 경우 OpenPolicyAgent 허용 컨트롤러를 Gatekeeper와 함께 사용하여 웹후크의 유효성을 검사할 수 있습니다. 클러스터에 Gatekeeper가 이미 설치되어 있는 경우 K8sPSPCapabilities 형식의 ConstraintTemplate을 추가합니다.

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/capabilities/template.yaml

NET_RAW 기능을 사용하여 Pod 생성을 제한하는 템플릿을 추가합니다.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPCapabilities
metadata:
  name: prevent-net-raw
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - "kube-system"
  parameters:
    requiredDropCapabilities: ["NET_RAW"]

Kubenet 네트워크 플러그 인을 사용하여 AKS 클러스터 만들기

Kubenet 네트워크 플러그 인 및 Pod 관리 ID를 사용하도록 설정된 AKS 클러스터를 만듭니다.

az aks create -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

Kubenet 네트워크 플러그 인을 사용하여 기존 AKS 클러스터 업데이트

Pod 관리 ID를 포함하도록 Kubenet 네트워크 플러그 인을 사용하여 기존 AKS 클러스터를 업데이트합니다.

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

ID 만들기

Important

ID를 만들려면 구독에 관련 권한(예: 소유자)이 있어야 합니다.

az identity create을 사용하여 데모 Pod에서 사용할 ID를 만들고 IDENTITY_CLIENT_ID 변수 및 IDENTITY_RESOURCE_ID 변수를 설정합니다.

az group create --name myIdentityResourceGroup --location eastus
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query clientId -otsv)"
export IDENTITY_RESOURCE_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query id -otsv)"

관리 ID에 대한 권한 할당

Pod에 할당될 관리 ID에는 수행할 작업에 맞는 권한이 부여되어야 합니다.

데모 를 실행하려면 IDENTITY_CLIENT_ID 관리 ID에 AKS 클러스터의 Virtual Machine Scale Set이 포함된 리소스 그룹에 Virtual Machine 기여자 권한이 있어야 합니다.

# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show -g myResourceGroup -n myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group 
NODES_RESOURCE_ID=$(az group show -n $NODE_GROUP -o tsv --query "id")

# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID

Pod ID 만들기

az aks pod-identity add를 사용하여 클러스터에 대한 Pod 관리 ID를 만듭니다.

export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}

참고 항목

"POD_IDENTITY_NAME"은 RFC 1123정의된 유효한 DNS 하위 기본 이름이어야 합니다.

참고 항목

pod-identity add를 사용하여 Pod 관리 ID를 할당하면 Azure CLI는 Pod 관리 ID(IDENTITY_RESOURCE_ID)에 대한 관리 ID 운영자 역할을 클러스터 ID에 부여하려고 시도합니다.

Azure는 클러스터에서 Azure의 ID를 나타내는 AzureIdentity 리소스와 AzureIdentity를 선택기로 연결하는 AzureIdentityBinding 리소스를 만듭니다. 다음을 사용하여 이러한 리소스를 볼 수 있습니다.

kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE

샘플 애플리케이션 실행

Pod가 Microsoft Entra Pod 관리 ID를 사용하려면 Pod에 AzureIdentityBinding의 선택기와 일치하는 값이 있는 aadpodidbinding 레이블이 필요합니다. 기본적으로 선택기는 Pod 관리 ID의 이름과 일치하지만 az aks pod-identity add 호출 시 --binding-selector 옵션을 사용하여 설정할 수도 있습니다.

Microsoft Entra Pod 관리 ID를 사용하여 샘플 애플리케이션을 실행하려면 다음 내용이 포함된 demo.yaml 파일을 만듭니다. POD_IDENTITY_NAME, IDENTITY_CLIENT_IDIDENTITY_RESOURCE_GROUP 이전 단계의 값으로 바꿉다. SUBSCRIPTION_ID 구독 ID로 대체합니다.

참고 항목

이전 단계에서는 POD_IDENTITY_NAME, IDENTITY_CLIENT_IDIDENTITY_RESOURCE_GROUP 변수를 만들었습니다. 예를 들어 echo $POD_IDENTITY_NAME변수에 대해 설정한 값을 표시하는 등의 echo 명령을 사용할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: $POD_IDENTITY_NAME
spec:
  containers:
  - name: demo
    image: mcr.microsoft.com/oss/azure/aad-pod-identity/demo:v1.6.3
    args:
      - --subscriptionid=$SUBSCRIPTION_ID
      - --clientid=$IDENTITY_CLIENT_ID
      - --resourcegroup=$IDENTITY_RESOURCE_GROUP
    env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: MY_POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  nodeSelector:
    kubernetes.io/os: linux

Pod 정의에는 이전 단계에서 az aks pod-identity add를 실행한 Pod 관리 ID 이름과 일치하는 값을 가진 aadpodidbinding 레이블이 있습니다.

kubectl apply를 사용하여 Pod 관리 ID와 동일한 네임스페이스에 demo.yaml을 배포합니다.

kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE

를 사용하여 샘플 애플리케이션이 성공적으로 실행되는지 확인합니다 kubectl logs.

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

로그에 토큰이 성공적으로 획득되고 GET 작업이 성공했다고 표시되는지 확인합니다.

...
successfully doARMOperations vm count 0
successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
successfully made GET on instance metadata
...

여러 ID를 사용하여 애플리케이션 실행

애플리케이션에서 여러 ID를 사용하도록 설정하려면 Pod ID를 만들 때 --binding-selector를 동일한 선택기로 설정합니다.

az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector

그런 다음, Pod YAML의 aadpodidbinding 필드를 지정한 바인딩 선택기로 설정합니다.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: myMultiIdentitySelector
...

기존 클러스터에서 Pod 관리 ID 사용 안 함

기존 클러스터에서 Pod 관리 ID를 사용하지 않도록 설정하려면 클러스터에서 Pod 관리 ID를 제거합니다. 그런 다음 클러스터에서 기능을 사용하지 않도록 설정합니다.

az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity

정리

클러스터에서 Microsoft Entra Pod 관리 ID를 제거하려면 클러스터에서 샘플 애플리케이션 및 Pod 관리 ID를 제거합니다. 그런 다음 클러스터 ID의 ID 및 역할 할당을 제거합니다.

kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az identity delete -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

다음 단계

관리 ID에 대한 자세한 내용은 Azure 리소스에 대한 관리 ID를 참조 하세요.