클러스터에 대한 IAM 사용자 및 역할 액세스 사용 설정 - Amazon EKS

클러스터에 대한 IAM 사용자 및 역할 액세스 사용 설정

AWS Identity and Access Management(IAM) 엔터티를 사용하는 클러스터에 대한 액세스는 Amazon EKS 컨트롤 플레인에서 실행되는 Kubernetes용 AWS IAM Authenticator에 의해 사용 설정됩니다. 인증자는 aws-auth ConfigMap에서 구성 정보를 가져옵니다. 모든 aws-auth ConfigMap 설정은 GitHub의 Full Configuration Format을 참조하세요.

Amazon EKS 클러스터에 IAM 사용자 또는 역할 추가

Amazon EKS 클러스터를 생성할 경우 클러스터를 생성하는 AWS Identity and Access Management(IAM) 엔터티 사용자 또는 역할(예: 페더레이션 사용자)에는 Amazon EKS 제어 영역의 클러스터 역할 기반 액세스 제어(RBAC) 구성에 system:masters 권한이 자동으로 부여됩니다. 이 IAM 엔터티는 표시되는 구성에 나타나지 않으므로 클러스터를 원래 생성한 IAM 엔터티를 추적해야 합니다. 추가 AWS 사용자 또는 역할에 클러스터와 상호 작용할 수 있는 기능을 부여하려면 Kubernetes 내에서 aws-auth ConfigMap을 편집하고 aws-auth ConfigMap에 지정하는 group의 이름으로 Kubernetes rolebinding 또는 clusterrolebinding을 생성해야 합니다.

참고

다양한 IAM 자격 증명에 대한 자세한 내용은 IAM 사용 설명서에서 자격 증명(사용자, 그룹 및 역할) 섹션을 참조하세요. Kubernetes 역할 기반 액세스 제어(RBAC) 구성에 대한 자세한 내용은 RBAC 승인 사용을 참조하세요.

IAM 사용자 또는 역할을 Amazon EKS 클러스터에 추가하려면

  1. kubectl이 클러스터에 액세스하는 데 사용하는 자격 증명을 확인합니다. 컴퓨터에서 다음 명령으로 kubectl이 사용하는 자격 증명을 볼 수 있습니다. 기본 경로를 사용하지 않는 경우 ~/.kube/configkubeconfig 파일의 경로로 바꿉니다.

    cat ~/.kube/config

    출력 예는 다음과 같습니다.

    ... contexts: - context: cluster: my-cluster.region-code.eksctl.io user: admin@my-cluster.region-code.eksctl.io name: admin@my-cluster.region-code.eksctl.io current-context: admin@my-cluster.region-code.eksctl.io ...

    이전 예제 출력에서는 admin이라는 사용자의 자격 증명이 my-cluster라는 클러스터에 대해 구성되었습니다. 클러스터를 생성한 사용자인 경우 클러스터에 대한 액세스 권한이 이미 있습니다. 클러스터를 생성한 사용자가 아닌 경우 다른 사용자에 대한 클러스터 액세스를 사용 설정하기 위해 나머지 단계를 완료해야 합니다. 다음 명령을 사용하여 현재 클러스터에 액세스할 수 있는 다른 역할 또는 사용자를 확인할 수 있습니다.

    kubectl describe -n kube-system configmap/aws-auth

    출력 예는 다음과 같습니다.

    Name: aws-auth Namespace: kube-system Labels: <none> Annotations: <none> Data ==== mapRoles: ---- - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-node-role username: system:node:{{EC2PrivateDNSName}} BinaryData ==== Events: <none>

    이전 예는 기본 aws-auth ConfigMap입니다. 노드 인스턴스 역할만 클러스터에 액세스할 수 있습니다.

  2. IAM 사용자 또는 역할을 매핑할 수 있는 기존 Kubernetes rolesrolebindings 또는 clusterrolesclusterrolebindings가 있어야 합니다. 이런 리소스에 대한 자세한 내용을 알아보려면 Kubernetes 설명서의 RBAC 승인 사용을 참조하세요.

    1. 기존 Kubernetes roles 또는 clusterroles를 확인합니다. Rolesnamespace로 범위가 지정되지만 clusterroles는 클러스터로 범위가 지정됩니다.

      kubectl get roles -A
      kubectl get clusterroles
    2. 이전 출력에서 반환된 모든 role 또는 clusterrole의 세부 정보를 보고 IAM 사용자가 클러스터에서 보유하려는 권한(rules)이 있는지 확인합니다.

      role-name을 이전 명령의 출력에서 반환된 role 이름으로 바꿉니다. kube-systemrole의 네임스페이스로 바꿉니다.

      kubectl describe role role-name -n kube-system

      cluster-role-name을 이전 명령의 출력에서 반환된 clusterrole 이름으로 바꿉니다.

      kubectl describe clusterrole cluster-role-name
    3. 기존 Kubernetes rolebindings 또는 clusterrolebindings를 확인합니다. Rolebindingsnamespace로 범위가 지정되지만 clusterrolebindings는 클러스터로 범위가 지정됩니다.

      kubectl get rolebindings -A
      kubectl get clusterrolebindings
    4. rolebinding 또는 clusterrolebinding의 모든 세부 정보를 보고 roleRef로 나열된 이전 단계의 role 또는 clusterrole 그리고 subjects에 나열된 그룹 이름이 있는지 확인합니다.

      role-binding-name을 이전 명령의 출력에서 반환된 rolebinding 이름으로 바꿉니다. kube-systemrolebindingnamespace로 바꿉니다.

      kubectl describe rolebinding role-binding-name -n kube-system

      출력 예는 다음과 같습니다.

      apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: eks-console-dashboard-restricted-access-role-binding namespace: default subjects: - kind: Group name: eks-console-dashboard-restricted-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: eks-console-dashboard-restricted-access-role apiGroup: rbac.authorization.k8s.io

      cluster-role-binding-name을 이전 명령의 출력에서 반환된 clusterrolebinding 이름으로 바꿉니다.

      kubectl describe clusterrolebinding cluster-role-binding-name

      출력 예는 다음과 같습니다.

      apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks-console-dashboard-full-access-binding subjects: - kind: Group name: eks-console-dashboard-full-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: eks-console-dashboard-full-access-clusterrole apiGroup: rbac.authorization.k8s.io
  3. aws-auth ConfigMap을 편집합니다. eksctl과 같은 도구를 사용하여 ConfigMap을 업데이트하거나 편집하여 수동으로 업데이트할 수 있습니다.

    중요

    eksctl 또는 다른 도구를 사용하여 ConfigMap을 편집하는 것이 좋습니다. 사용할 수 있는 다른 도구에 대한 자세한 내용을 알아보려면 Amazon EKS 모범 사례 가이드의 도구를 사용하여 aws-authConfigMap을 변경을 참조하세요. 부적절하게 형식이 지정된 aws-auth ConfigMap으로 인해 클러스터에 대한 액세스 권한을 상실할 수 있습니다.

    eksctl

    사전 조건

    컴퓨터 또는 AWS CloudShell에 설치된 eksctl 명령줄 도구의 버전 0.105.0 이상. eksctl를 설치 또는 업데이트하려면 eksctl 설치 또는 업데이트 섹션을 참조하세요.

    1. ConfigMap에서 현재 매핑을 확인합니다. my-cluster를 클러스터 이름으로 바꿉니다. region-code를 클러스터가 있는 AWS 리전으로 바꿉니다.

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      출력 예는 다음과 같습니다.

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
    2. 역할에 대한 매핑을 추가합니다. my-role을 역할 이름으로 바꿉니다. eks-console-dashboard-full-access-group을 Kubernetes rolebinding 또는 clusterrolebinding에 지정된 그룹 이름으로 바꿉니다. 111122223333을 계정 ID로 바꿉니다.

      eksctl create iamidentitymapping \ --cluster my-cluster \ --region=region-code \ --arn arn:aws:iam::111122223333:role/my-role \ --group eks-console-dashboard-full-access-group \ --no-duplicate-arns
      중요

      역할 ARN에는 role/my-team/developers/my-role과 같은 경로가 포함될 수 없습니다. ARN 형식은 arn:aws:iam::111122223333:role/my-role이어야 합니다. 이 예에서는 my-team/developers/를 제거해야 합니다.

      출력 예는 다음과 같습니다.

      ... 2022-05-09 14:51:20 [ℹ] adding identity "arn:aws:iam::111122223333:role/my-role" to auth ConfigMap
    3. 사용자에 대한 매핑을 추가합니다. my-user를 사용자 이름으로 바꿉니다. eks-console-dashboard-restricted-access-group을 Kubernetes rolebinding 또는 clusterrolebinding에서 지정한 그룹 이름으로 바꿉니다. 111122223333을 계정 ID로 바꿉니다.

      eksctl create iamidentitymapping \ --cluster my-cluster \ --region=region-code \ --arn arn:aws:iam::111122223333:user/my-user \ --group eks-console-dashboard-restricted-access-group \ --no-duplicate-arns

      출력 예는 다음과 같습니다.

      ... 2022-05-09 14:53:48 [ℹ] adding identity "arn:aws:iam::111122223333:user/my-user" to auth ConfigMap
    4. ConfigMap에서 매핑을 다시 확인합니다.

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      출력 예는 다음과 같습니다.

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes arn:aws:iam::111122223333:role/my-role eks-console-dashboard-full-access-group arn:aws:iam::111122223333:user/my-user eks-console-dashboard-restricted-access-group
    Edit ConfigMap manually
    1. 편집을 위해 ConfigMap을 엽니다.

      kubectl edit -n kube-system configmap/aws-auth
      참고

      "Error from server (NotFound): configmaps "aws-auth" not found"와 같은 오류가 발생할 경우 클러스터에 aws-authConfigMap 적용의 절차를 통해 스톡 ConfigMap을 적용합니다.

    2. IAM 사용자, 역할 또는 AWS 계정을 ConfigMap에 추가합니다. ConfigMap에 IAM 그룹을 추가할 수 없습니다.

      • IAM 역할(예: 페더레이션 사용자)을 추가하려면: 역할 세부 정보를 data 아래 ConfigMapmapRoles 섹션에 추가합니다. 파일에 이미 존재하지 않는 경우 이 섹션을 추가합니다. 각 항목은 다음 파라미터를 지원합니다.

        • rolearn: 추가할 IAM 역할의 ARN. 이 값은 경로를 포함할 수 없습니다. 예를 들어 arn:aws:iam::111122223333:role/my-team/developers/role-name과 같은 ARN을 지정할 수 없습니다. 대신 ARN은 arn:aws:iam::111122223333:role/role-name이어야 합니다.

        • username: Kubernetes 내에서 IAM 역할에 매핑할 사용자 이름.

        • groups: 역할을 매핑할 그룹 또는 Kubernetes 그룹 목록. 그룹은 기본 그룹이나 clusterrolebinding 또는 rolebinding에 지정된 그룹일 수 있습니다. 자세한 내용은 Kubernetes 설명서의 기본 역할 및 역할 바인딩을 참조하세요.

      • IAM 사용자 추가: 사용자 세부 정보를 data 아래 ConfigMapmapUsers 섹션에 추가합니다. 파일에 이미 존재하지 않는 경우 이 섹션을 추가합니다. 각 항목은 다음 파라미터를 지원합니다.

        • userarn: 추가할 IAM 사용자의 ARN.

        • username: Kubernetes 내에서 IAM 사용자에 매핑할 사용자 이름.

        • groups: 사용자를 매핑할 그룹 또는 Kubernetes 그룹 목록. 그룹은 기본 그룹이나 clusterrolebinding 또는 rolebinding에 지정된 그룹일 수 있습니다. 자세한 내용은 Kubernetes 설명서의 기본 역할 및 역할 바인딩을 참조하세요.

      예를 들어 아래 YAML 블록에는 다음이 포함됩니다.

      • 노드가 클러스터에 직접 등록할 수 있도록 IAM 노드 인스턴스를 Kubernetes 그룹에 매핑하는 mapRoles 섹션 및 모든 클러스터에 대한 모든 Kubernetes 리소스를 볼 수 있는 Kubernetes 그룹에 매핑되는 my-console-viewer-role IAM 역할. my-console-viewer-role IAM 역할에 필요한 IAM 및 Kubernetes 그룹 권한 목록은 필수 권한 섹션을 참조하세요.

      • 기본 AWS 계정의 admin IAM 사용자를 system:masters Kubernetes 그룹에 매핑하는 mapUsers 섹션 및 특정 네임스페이스에 대한 Kubernetes 리소스를 볼 수 있는 Kubernetes 그룹에 매핑되는 다른 AWS 계정의 my-user 사용자. my-user IAM 사용자에 필요한 IAM 및 Kubernetes 그룹 권한 목록은 필수 권한 섹션을 참조하세요.

      필요에 따라 줄을 추가하거나 제거하고 모든 example-values를 자신의 값으로 바꿉니다.

      # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 data: mapRoles: | - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-role username: system:node:{{EC2PrivateDNSName}} - groups: - eks-console-dashboard-full-access-group rolearn: arn:aws:iam::111122223333:role/my-console-viewer-role username: my-console-viewer-role mapUsers: | - groups: - system:masters userarn: arn:aws:iam::111122223333:user/admin username: admin - groups: - eks-console-dashboard-restricted-access-group userarn: arn:aws:iam::444455556666:user/my-user username: my-user
    3. 파일을 저장하고 텍스트 편집기를 종료합니다.

클러스터에 aws-authConfigMap 적용

aws-auth ConfigMap은 관리형 노드 그룹을 생성하거나 eksctl을 사용하여 노드 그룹을 생성할 때 자동으로 생성되어 클러스터에 적용됩니다. 이 ConfigMap은 처음에는 노드를 클러스터에 조인하기 만들어졌으나 이 ConfigMap을 사용하여 IAM 사용자 및 역할에 역할 기반 액세스 제어(RBAC) 액세스를 추가할 수도 있습니다. 아직 자체 관리형 노드를 시작하지 않았고 클러스터에 aws-auth ConfigMap을 적용하지 않았다면 다음 절차를 수행하면 됩니다.

클러스터에 aws-authConfigMap 적용

  1. aws-auth ConfigMap을 이미 적용했는지 확인합니다.

    kubectl describe configmap -n kube-system aws-auth

    "Error from server (NotFound): configmaps "aws-auth" not found"와 같은 오류가 발생할 경우 다음 단계를 수행하여 스톡 ConfigMap을 적용합니다.

  2. AWS Authenticator 구성 맵을 다운로드, 편집 및 적용합니다.

    1. 구성 맵을 다운로드합니다.

      curl -o aws-auth-cm.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. 텍스트 편집기로 파일을 엽니다. <ARN of instance role (not instance profile)>을 노드와 연결된 IAM 역할의 Amazon 리소스 이름(ARN)으로 바꾸고 파일을 저장합니다. 이 파일에서 어떠한 행도 수정하지 마십시오.

      중요

      역할 ARN에는 role/my-team/developers/my-role과 같은 경로가 포함될 수 없습니다. ARN 형식은 arn:aws:iam::111122223333:role/my-role이어야 합니다. 이 예에서는 my-team/developers/를 제거해야 합니다.

      apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes

      노드 그룹에 대해 AWS CloudFormation 스택 출력을 점검하고 다음 값을 찾습니다.

      • InstanceRoleARN - eksctl로 생성된 노드 그룹용

      • NodeInstanceRole - AWS Management Console에서 Amazon EKS 판매 AWS CloudFormation 템플릿으로 생성된 노드 그룹용

    3. 구성을 적용합니다. 이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.

      kubectl apply -f aws-auth-cm.yaml
      참고

      권한 부여 또는 리소스 유형 오류가 표시되는 경우 문제 해결 단원에서 권한이 없거나 액세스가 거부됨(kubectl)을 참조하십시오.

  3. 노드의 상태를 확인하고 Ready 상태가 될 때까지 대기합니다.

    kubectl get nodes --watch