IAM 역할을 수임하도록 Kubernetes 서비스 계정 구성 - Amazon EKS

IAM 역할을 수임하도록 Kubernetes 서비스 계정 구성

이 주제에서는 AWS Identity and Access Management(IAM) 역할을 수임하도록 Kubernetes 서비스 계정을 구성하는 방법을 다룹니다. 서비스 계정을 사용하도록 구성된 모든 Pods는 해당 역할에 액세스 권한이 있는 모든 AWS 서비스에 액세스할 수 있습니다.

필수 조건
  • 기존 클러스터가 있어야 합니다. 아직 없는 경우 Amazon EKS 시작하기 안내서 중 하나에 따라 생성할 수 있습니다.

  • 클러스터에 대한 기존 IAM OpenID Connect(OIDC) 제공업체입니다. 이미 있는지 확인하거나 생성하는 방법을 알아보려면 클러스터에 대한 IAM OIDC 공급자 생성 섹션을 참조하세요.

  • AWS Command Line Interface(AWS CLI) 버전 2.12.3 이상 또는 1.27.160 이상이 디바이스나 AWS CloudShell에 설치 및 구성되어 있습니다. 현재 버전을 확인하려면 aws --version | cut -d / -f2 | cut -d ' ' -f1을 사용합니다. macOS용 yum, apt-get 또는 Homebrew와 같은 패키지 관리자는 최신 버전의 AWS CLI보다 여러 버전 이전인 경우가 많습니다. 최신 버전을 설치하려면 AWS Command Line Interface 사용 설명서의 AWS CLI 설치, 업데이트 및 제거aws configure를 통한 빠른 구성을 참조하세요. AWS CloudShell에 설치된 AWS CLI 버전도 최신 버전보다 여러 버전 이전일 수도 있습니다. 업데이트하려면 AWS CloudShell 사용 설명서의 홈 디렉터리에 AWS CLI 설치를 참조하세요.

  • 디바이스 또는 AWS CloudShell에 설치된 kubectl 명령줄 도구. 버전은 클러스터의 Kubernetes 버전과 동일하거나 최대 하나 이전 또는 이후의 마이너 버전일 수 있습니다. 예를 들어 클러스터 버전이 1.28인 경우 kubectl 버전 1.27, 1.28 또는 1.29를 함께 사용할 수 있습니다. kubectl을 설치하거나 업그레이드하려면 kubectl 설치 또는 업데이트 부분을 참조하세요.

  • 클러스터 구성이 포함된 기존 kubectl config 파일입니다. kubectl config 파일을 생성하려면 Amazon EKS 클러스터용 kubeconfig 파일 생성 또는 업데이트 섹션을 참조하세요.

Kubernetes 서비스 계정과 IAM 역할 연결
  1. IAM 역할에 기존 IAM 정책을 연결하려면 다음 단계로 건너뜁니다.

    IAM 정책을 생성합니다. 자체 정책을 생성하거나 필요한 권한 중 일부를 이미 부여하는 AWS 관리형 정책을 복사하여 특정 요구 사항에 맞게 사용자 지정할 수 있습니다. 자세한 내용은 IAM 사용 설명서에서 IAM 정책 생성을 참조하세요.

    1. Pods가 액세스할 AWS 서비스에 대한 권한이 포함된 파일을 생성합니다. 모든 AWS 서비스에 대한 모든 작업 목록은 서비스 승인 참조에서 확인하세요.

      다음 명령을 실행하여 Amazon S3 버킷에 대한 읽기 전용 액세스를 허용하는 예제 정책 파일을 생성할 수 있습니다. 이 버킷에 구성 정보 또는 부트스트랩 스크립트를 저장할 수도 있고, Pod의 컨테이너는 이 버킷에서 파일을 읽어 애플리케이션으로 로드할 수 있습니다. 이 예제 정책을 생성하려면 다음 내용을 디바이스에 복사합니다. my-pod-secrets-bucket을 버킷 이름으로 바꾸고 명령을 실행합니다.

      cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
    2. IAM 정책을 생성합니다.

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. IAM 역할을 생성하고 Kubernetes 서비스 계정과 연결합니다. eksctl 또는 AWS CLI를 사용할 수 있습니다.

    eksctl
    전제 조건

    디바이스 또는 0.175.0에 설치된 버전 AWS CloudShell 이상의 eksctl 명령줄 도구. eksctl을 설치 또는 업그레이드하려면 eksctl 설명서에서 Installation을 참조하세요.

    my-service-accounteksctl이 생성하고 IAM 역할과 연결할 Kubernetes 서비스 계정의 이름으로 바꿉니다. defaulteksctl이 서비스 계정을 생성할 네임스페이스로 바꿉니다. my-cluster를 해당 클러스터의 이름으로 바꿉니다. my-role을 서비스 계정을 연결할 역할의 이름으로 바꿉니다. 역할이 아직 없는 경우 eksctl이 자동으로 생성합니다. 111122223333을 계정 ID로 바꾸고 my-policy를 기존 정책의 이름으로 바꿉니다.

    eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
    중요

    역할 또는 서비스 계정이 이미 있는 경우 이전 명령이 실패할 수 있습니다. eksctl에는 이러한 상황에서 제공할 수 있는 다양한 옵션이 있습니다. 자세한 내용을 알아보려면 eksctl create iamserviceaccount --help를 실행하세요.

    AWS CLI
    1. IAM 역할을 수임하려는 기존 Kubernetes 서비스 계정이 있는 경우 이 단계를 건너뛸 수 있습니다.

      Kubernetes 서비스 계정을 생성합니다. 다음 콘텐츠를 디바이스에 복사합니다. my-service-account를 원하는 이름으로 바꾸고 필요한 경우 default를 다른 네임스페이스로 바꿉니다. default를 변경하는 경우 네임스페이스가 이미 존재해야 합니다.

      cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml
    2. 다음 명령을 사용해 AWS 계정 ID를 환경 변수로 설정합니다.

      account_id=$(aws sts get-caller-identity --query "Account" --output text)
    3. 다음 명령을 사용해 클러스터의 OIDC ID 제공업체를 환경 변수로 설정합니다. my-cluster를 클러스터 이름으로 바꿉니다.

      oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
    4. 서비스 계정의 네임스페이스 및 이름에 대한 변수를 설정합니다. my-service-account를 역할을 수임할 Kubernetes 서비스 계정으로 바꿉니다. default를 서비스 계정의 네임스페이스로 바꿉니다.

      export namespace=default export service_account=my-service-account
    5. 다음 명령을 실행하여 IAM 역할에 대한 신뢰 정책 파일을 생성합니다. 네임스페이스 내의 모든 서비스 계정이 역할을 사용하도록 허용하려면 다음 내용을 디바이스에 복사합니다. StringEqualsStringLike로 바꾸고 $service_account*로 바꿉니다. 여러 서비스 계정 또는 네임스페이스가 역할을 수임할 수 있도록 StringEquals 또는 StringLike 조건에 여러 항목을 추가할 수 있습니다. 클러스터가 속한 계정과 다른 AWS 계정의 역할이 역할을 수임하도록 허용하려면 교차 계정 IAM 권한 섹션에서 자세한 내용을 참조하세요.

      cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
    6. 역할을 생성합니다. my-role을 IAM 역할의 이름으로, my-role-description를 역할에 대한 간략한 설명으로 바꿉니다.

      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
    7. 역할에 IAM 정책을 연결합니다. my-role을 IAM 역할의 이름으로 바꾸고 my-policy를 생성한 기존 정책의 이름으로 바꿉니다.

      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy
    8. 서비스 계정이 수임할 IAM 역할의 Amazon 리소스 이름(ARN)을 서비스 계정에 주석으로 답니다. my-role을 기존 IAM 역할의 이름으로 바꿉니다. 클러스터가 속한 계정과 다른 AWS 계정의 역할이 이전 단계에서 역할을 수임하도록 허용했다고 가정합니다. 그런 다음 AWS 계정과 다른 계정의 역할을 지정해야 합니다. 자세한 내용은 교차 계정 IAM 권한 단원을 참조하십시오.

      kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  3. 역할 및 서비스 계정이 올바르게 구성되었는지 확인합니다.

    1. IAM 역할의 신뢰 정책이 올바르게 구성되었는지 확인합니다.

      aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument

      예제 출력은 다음과 같습니다.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
    2. 이전 단계에서 역할에 연결한 정책이 해당 역할에 연결되었는지 확인합니다.

      aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text

      예제 출력은 다음과 같습니다.

      arn:aws:iam::111122223333:policy/my-policy
    3. 사용하려는 정책의 Amazon 리소스 이름(ARN)을 저장할 변수를 설정합니다. my-policy를 권한을 확인하려는 정책의 이름으로 바꿉니다.

      export policy_arn=arn:aws:iam::111122223333:policy/my-policy
    4. 정책의 기본 버전을 봅니다.

      aws iam get-policy --policy-arn $policy_arn

      예제 출력은 다음과 같습니다.

      { "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
    5. 정책 내용을 보고 Pod에 필요한 모든 권한이 정책에 포함되어 있는지 확인합니다. 필요한 경우 다음 명령에서 1을 이전 출력에서 반환된 버전으로 바꿉니다.

      aws iam get-policy-version --policy-arn $policy_arn --version-id v1

      예제 출력은 다음과 같습니다.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }

      이전 단계에서 예제 정책을 생성한 경우 출력은 동일합니다. 다른 정책을 생성한 경우 예제 내용이 다릅니다.

    6. Kubernetes 서비스 계정에 역할이 주석으로 달렸는지 확인합니다.

      kubectl describe serviceaccount my-service-account -n default

      예제 출력은 다음과 같습니다.

      Name:                my-service-account
      Namespace:           default
      Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role
      Image pull secrets:  <none>
      Mountable secrets:   my-service-account-token-qqjfl
      Tokens:              my-service-account-token-qqjfl
      [...]
  4. (선택 사항) 서비스 계정의 AWS Security Token Service 엔드포인트 구성. AWS는 글로벌 엔드포인트 대신 리전별 AWS STS 엔드포인트를 사용할 것을 권장합니다. 이렇게 하면 지연 시간이 줄고, 중복성이 기본 제공되고, 세션 토큰 유효성이 향상됩니다.

다음 단계

Kubernetes 서비스 계정을 사용하도록 Pods 구성