Kubernetes 권한 부여에 Azure RBAC(역할 기반 액세스 제어) 사용

적용 대상: Azure Stack HCI 23H2의 AKS

인프라 관리자는 Azure RBAC(Azure 역할 기반 액세스 제어)를 사용하여 kubeconfig 파일에 액세스할 수 있는 사용자와 권한이 있는 사용자를 제어할 수 있습니다. Kubernetes 연산자는 지정된 권한에 따라 kubectl 도구를 사용하여 Kubernetes 클러스터와 상호 작용할 수 있습니다. Azure CLI는 kubectl을 사용하여 AKS 클러스터에 연결하는 액세스 자격 증명 및 kubeconfig 구성 파일을 쉽게 가져올 수 있는 방법을 제공합니다.

Microsoft Entra ID와 AKS 간에 통합 인증을 사용하는 경우 Kubernetes RBAC(Kubernetes 역할 기반 액세스 제어)에서 Microsoft Entra 사용자, 그룹 또는 서비스 주체를 주체로 사용할 수 있습니다. 이 기능을 사용하면 Kubernetes에 대한 사용자 ID와 자격 증명을 별도로 관리할 필요가 없습니다. 그러나 Azure RBAC 및 Kubernetes RBAC를 별도로 설정하고 관리해야 합니다.

이 문서에서는 Microsoft Entra ID 및 Azure 역할 할당을 사용하여 Kubernetes용 Azure RBAC 클러스터 권한 부여를 사용하는 방법을 설명합니다.

개념적 개요는 Azure Arc에서 사용하도록 설정된 AKS에 대한 Kubernetes 권한 부여용 Azure RBAC를 참조하세요.

시작하기 전에

시작하기 전에 다음 필수 조건을 갖추고 있는지 확인합니다.

  • Azure Stack HCI 23H2의 AKS는 현재 Kubernetes 클러스터를 만드는 동안에만 Azure RBAC를 사용하도록 설정합니다. Kubernetes 클러스터를 만든 후에는 Azure RBAC를 사용하도록 설정할 수 없습니다.

  • aksarcconnectedk8s Azure CLI 확장의 최신 버전을 설치합니다. Azure RBAC를 사용하도록 설정하려면 aksarc 확장 버전 1.1.1 이상을 실행해야 합니다. az --version을(를) 실행하여 현재 버전을 찾습니다. Azure CLI를 설치하거나 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

    az extension add --name aksarc
    az extension add --name connectedk8s
    

    확장을 이미 설치한 aksarc 경우 확장을 최신 버전으로 업데이트합니다.

    az extension update --name aksarc
    az extension update --name connectedk8s
    
  • Kubernetes 클러스터와 상호 작용하려면 kubectl kubelogin을 설치해야 합니다.

  • Kubernetes 클러스터를 만드는 동안 Azure RBAC를 사용하도록 설정하려면 다음 권한이 필요합니다.

    • Kubernetes 클러스터를 만들려면 Azure Kubernetes Service Arc 기여자 역할이 필요합니다.
    • 매개 변수를 --enable-azure-rbac 사용하려면 Microsoft.Authorization/roleAssignments/쓰기 권한에 액세스하려면 역할 기반 액세스 제어 관리자 역할이 필요합니다. 자세한 정보는 Azure 기본 제공 역할을 참조하세요.
    • 새 역할 할당은 전파하고 권한 부여 서버에서 업데이트하는 데 최대 5분이 소요될 수 있습니다.
  • Azure RBAC를 사용하도록 설정하면 직접 모드 또는 프록시 모드를 사용하여 지정된 권한으로 Kubernetes 클러스터에 액세스할 수 있습니다.

    • 명령을 사용하여 az aksarc get-credentials Kubernetes 클러스터에 직접 액세스하려면 Azure Kubernetes Service Arc 클러스터 사용자 역할 권한에 포함된 Microsoft.HybridContainerService/provisionedClusterInstances/listUserKubeconfig/action이 필요합니다.
    • 명령을 사용하여 az connectedk8s proxy 프록시 모드로 어디서나 또는 Azure Portal에서 Kubernetes 클러스터에 액세스하려면 Azure Arc 지원 Kubernetes 클러스터 사용자 역할 권한에 포함된 Microsoft.Kubernetes/connectedClusters/listClusterUserCredential/action이 필요합니다. 한편, 온보딩 프로세스를 수행하는 에이전트와 컴퓨터가 Azure Arc 지원 Kubernetes 네트워크 요구 사항에 지정된 네트워크 요구 사항을 충족하는지 확인해야 합니다.
  • kubectl을 사용하려면 Azure RBAC 또는 AAD 관리 그룹을 사용하여 액세스할 수 있습니다.

    • Azure RBAC에서 kubectl을 사용하려면 연결된 클러스터 리소스로 범위가 지정된 Azure Arc Kubernetes 뷰어 역할이 필요합니다.
    • AAD 관리 그룹에서 kubectl을 사용하려면 특정 역할이 필요하지 않지만 연결된 클러스터 리소스의 추가 관리자 그룹 목록에 있는 그룹 중 하나에 있는지 확인해야 합니다.

1단계: Azure RBAC 지원 Kubernetes 클러스터 만들기

권한 부여를 위한 Azure RBAC 지원 Kubernetes 클러스터 및 인증을 위한 Microsoft Entra ID를 만들 수 있습니다.

az aksarc create -n $aks_cluster_name -g $resource_group_name --custom-location $customlocation_ID --vnet-ids $logicnet_Id --generate-ssh-keys --control-plane-ip $controlplaneIP --enable-azure-rbac

몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

2단계: 사용자가 클러스터에 액세스할 수 있도록 역할 할당 만들기

Arc에서 사용하도록 설정된 AKS는 다음과 같은 5가지 기본 제공 역할을 제공합니다. CRD 지원과 같은 몇 가지 차이점이 있는 Kubernetes 기본 제공 역할과 유사합니다. 각 Azure 기본 제공 역할에서 허용되는 전체 작업 목록을 참조하세요.

역할 설명
Azure Arc 지원 Kubernetes 클러스터 사용자 클러스터 연결 기반 kubeconfig 파일을 검색하여 어디서나 클러스터를 관리할 수 있습니다.
Azure Arc Kubernetes 뷰어 네임스페이스에 있는 대부분의 개체를 볼 수 있는 읽기 전용 권한을 허용합니다.
비밀에 대한 읽기 권한을 사용하면 네임스페이스의 ServiceAccount 자격 증명에 액세스할 수 있으므로 비밀 보기를 허용하지 않습니다. 이러한 자격 증명을 사용하면 해당 ServiceAccount 값(권한 에스컬레이션의 한 형태)을 통해 API에 액세스할 수 있습니다.
Azure Arc Kubernetes 작성자 네임스페이스에 있는 대부분의 개체에 대해 읽기/쓰기 액세스 권한을 허용합니다.
역할 또는 역할 바인딩을 보거나 수정할 수 없습니다. 그러나 이 역할을 사용하면 비밀에 액세스하고 네임스페이스에서 ServiceAccount 값으로 Pod를 실행할 수 있으므로 네임스페이스에서 이러한 ServiceAccount 값의 API 액세스 수준을 얻는 데 사용할 수 있습니다.
Azure Arc Kubernetes 관리자 관리자 액세스 권한을 허용합니다. RoleBinding을 통해 네임스페이스 내에서 부여됩니다. RoleBinding에서 사용하는 경우 네임스페이스 내에서 역할 및 역할 바인딩을 만드는 기능을 포함하여 네임스페이스의 대부분의 리소스에 대한 읽기/쓰기 액세스를 허용합니다. 이 역할은 리소스 할당량 혹은 네임스페이스 자체에 대한 쓰기 권한을 허용하지 않습니다.
Azure Arc Kubernetes 클러스터 관리자 "superuser" 액세스를 허용하여 모든 리소스에 대한 모든 작업을 실행할 수 있습니다. ClusterRoleBinding에서 사용하는 경우 클러스터의 모든 리소스와 모든 네임스페이스에 대한 모든 권한을 부여합니다. RoleBinding에서 사용하는 경우 네임스페이스 자체를 포함하여 역할 바인딩 네임스페이스의 모든 리소스를 완전히 제어할 수 있습니다.

az role assignment create 명령을 사용하여 역할 할당을 만들 수 있습니다.

먼저 역할을 할당할 대상 클러스터에 대한 값을 가져옵니다 $ARM-ID .

$ARM_ID = (az connectedk8s show -g "$resource_group_name" -n $aks_cluster_name --query id -o tsv)

그런 다음, 명령을 사용하여 az role assignment create Kubernetes 클러스터에 역할을 할당합니다. 첫 번째 단계와 assignee-object-id 이 단계를 제공해야 $ARM_ID 합니다. Microsoft assignee-object-id Entra ID 또는 서비스 주체 클라이언트 ID일 수 있습니다.

다음 예제에서는 Azure Arc Kubernetes 뷰어 역할을 Kubernetes 클러스터에 할당합니다.

az role assignment create --role "Azure Arc Kubernetes Viewer" --assignee <assignee-object-id> --scope $ARM_ID

이 예제에서 범위는 클러스터의 Azure Resource Manager ID입니다. Kubernetes 클러스터를 포함하는 리소스 그룹일 수도 있습니다.

사용자 지정 역할 정의 만들기

역할 할당의 용도에 따라 고유 역할 정의를 만들도록 선택할 수 있습니다.

다음 예제에서는 사용자가 배포만 읽을 수 있도록 하는 역할 정의를 보여 줍니다. 자세한 내용은 역할 정의를 생성하는 데 사용할 수 있는 데이터 작업의 전체 목록을 참조하세요. 사용자 지정 역할을 만드는 방법에 대한 자세한 내용은 사용자 지정 역할을 만드는 단계를 참조 하세요.

사용자 고유의 사용자 지정 역할 정의를 만들려면 다음 JSON 개체를 custom-role.json 파일에 복사합니다. <subscription-id> 자리 표시자를 실제 구독 ID로 바꿉니다. 사용자 지정 역할에는 데이터 작업 중 하나가 사용되며, 이를 사용해서 역할 할당이 생성되는 범위(클러스터 또는 네임스페이스)의 모든 배포를 볼 수 있습니다.

{
    "Name": "AKS Arc Deployment Reader",
    "Description": "Lets you view all deployments in cluster/namespace.",
    "Actions": [],
    "NotActions": [],
    "DataActions": [
        "Microsoft.Kubernetes/connectedClusters/apps/deployments/read"
    ],
    "NotDataActions": [],
    "assignableScopes": [
        "/subscriptions/<YOUR SUBSCRIPTION ID>"
    ]
}

사용자 지정 역할 및 사용자 지정 역할을 작성하는 방법에 대한 자세한 내용은 Azure 사용자 지정 역할을 참조하세요.

명령을 사용하여 az role definition create 역할 정의를 만들고 매개 변수를 --role-definition 이전 단계에서 만든 deploy-view.json 파일로 설정합니다.

az role definition create --role-definition @deploy-view.json 

명령을 사용하여 사용자 또는 다른 ID에 역할 정의를 할당합니다 az role assignment create .

az role assignment create --role "AKS Arc Deployment Reader" --assignee <assignee-object-id> --scope $ARM_ID

3단계: Kubernetes 클러스터에 액세스

이제 직접 모드 또는 프록시 모드를 사용하여 지정된 권한으로 Kubernetes 클러스터에 액세스할 수 있습니다.

kubectl을 사용하여 클러스터에 액세스(직접 모드)

지정된 권한으로 Kubernetes 클러스터에 액세스하려면 Kubernetes 운영자에게 명령을 사용할 수 있는 Microsoft Entra kubeconfigaz aksarc get-credentials 필요합니다. 이 명령은 관리자 기반 kubeconfig 및 사용자 기반 kubeconfig에 대한 액세스를 제공합니다. 관리자 기반 kubeconfig 파일에는 비밀이 포함되어 있으며 정기적으로 안전하게 저장 및 회전해야 합니다. 반면에 사용자 기반 Microsoft Entra ID kubeconfig는 비밀을 포함하지 않으며 클라이언트 컴퓨터에서 연결하는 사용자에게 배포할 수 있습니다.

이 Azure CLI 명령을 실행하려면 Azure Kubernetes Service Arc 클러스터 사용자 역할 권한에 포함된 Microsoft.HybridContainerService/provisionedClusterInstances/listUserKubeconfig/action이 필요합니다.

az aksarc get-credentials -g "$resource_group_name" -n $aks_cluster_name --file <file-name>

이제 kubectl을 사용하여 클러스터를 관리할 수 있습니다. 예를 들어 kubectl get nodes를 사용하여 클러스터의 노드를 나열할 수 있습니다. 처음 실행할 때는 다음 예제와 같이 로그인해야 합니다.

kubectl get nodes

클라이언트 디바이스에서 클러스터 액세스(프록시 모드)

명령을 사용하여 az connectedk8s proxy 프록시 모드로 어디서나 Kubernetes 클러스터에 액세스하려면 Azure Arc 지원 Kubernetes 클러스터 사용자 역할 권한에 포함된 Microsoft.Kubernetes/connectedClusters/listClusterUserCredential/action이 필요합니다.

다른 클라이언트 디바이스에서 다음 단계를 실행합니다.

  1. Microsoft Entra 인증을 사용하여 로그인

  2. 클러스터를 둘러싼 방화벽 외부에서도 어디서나 클러스터와 통신하는 데 필요한 클러스터 연결 kubeconfig 를 가져옵니다.

    az connectedk8s proxy -n $CLUSTER_NAME -g $RESOURCE_GROUP
    

    참고 항목

    이 명령은 프록시를 열고 현재 셸을 차단합니다.

  3. 다른 셸 세션에서 kubectl을 사용하여 클러스터에 요청을 보냅니다.

    kubectl get pods -A
    

이제 default 네임스페이스 아래의 모든 Pod 목록이 포함된 클러스터의 응답이 표시되어야 합니다.

자세한 내용은 클라이언트 디바이스에서 클러스터 액세스를 참조하세요.

리소스 정리

역할 할당 삭제

# List role assignments
az role assignment list --scope $ARM_ID --query [].id -o tsv

# Delete role assignments
az role assignment delete --ids <LIST OF ASSIGNMENT IDS>

역할 정의 삭제

az role definition delete -n "AKS Arc Deployment Reader"

다음 단계