서비스 계정에 대한 IAM 역할 - Amazon EKS

서비스 계정에 대한 IAM 역할

Pod의 컨테이너에 있는 애플리케이션에서는 AWS SDK 또는 AWS CLI를 통해 AWS Identity and Access Management(IAM) 권한을 사용하여 AWS 서비스에 API를 요청할 수 있습니다. 애플리케이션은 AWS 자격 증명으로 AWS API 요청에 서명해야 합니다. 서비스 계정에 대한 IAM 역할은 Amazon EC2 인스턴스 프로파일이 Amazon EC2 인스턴스에 자격 증명을 제공하는 것과 비슷한 방식으로 애플리케이션에 대한 자격 증명을 관리하는 기능을 제공합니다. AWS 자격 증명을 생성하여 컨테이너에 배포하거나 Amazon EC2 인스턴스의 역할을 사용하는 대신에 IAM 역할을 Kubernetes 서비스 계정과 연결하고 서비스 계정을 사용하도록 Pods를 구성합니다. AWS Outposts의 Amazon EKS에 대한 로컬 클러스터가 있는 서비스 계정에는 IAM 역할을 사용할 수 없습니다.

서비스 계정의 IAM 역할을 통해 다음과 같은 이점을 누릴 수 있습니다.

  • 최소 권한 – IAM 권한의 범위를 서비스 계정으로 지정할 수 있습니다. 그러면 해당 서비스 계정을 사용하는 Pods만 이 권한에 액세스할 수 있습니다. 또한 이 기능을 사용하면 kiam, kube2iam 같은 타사 솔루션이 필요 없습니다.

  • 자격 증명 격리 - Pod's 컨테이너는 컨테이너가 사용하는 서비스 계정과 연결된 IAM 역할에 대한 자격 증명만 검색할 수 있습니다. 컨테이너는 다른 Pods의 다른 컨테이너에서 사용하는 자격 증명에 액세스할 수 없습니다. 서비스 계정에 대해 IAM 역할을 사용할 때 Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 대한 Pod 액세스를 차단하지 않는 한 Pod's 컨테이너는 Amazon EKS 노드 IAM 역할에 할당된 권한도 갖습니다. 자세한 내용은 작업자 노드에 할당된 인스턴스 프로파일에 대한 액세스 제한 부분을 참조하세요.

  • 감사 - 소급적 감사를 위해 AWS CloudTrail을 통해 액세스 및 이벤트 로깅이 가능합니다.

다음 절차를 완료하여 서비스 계정에 대한 IAM 역할을 활성화합니다.

  1. 클러스터의 IAM OIDC 제공업체 생성 - 각 클러스터에 대해 한 번만 이 절차를 완료합니다.

    참고

    EKS VPC 엔드포인트를 활성화할 경우 해당 VPC 내에서 EKS OIDC 서비스 엔드포인트에 액세스할 수 없습니다. 따라서 VPC에서 eksctl을 통해 OIDC 공급자를 생성하는 등의 작업은 작동하지 않으며 https://oidc.eks.region.amazonaws.com 요청을 시도할 때 시간 초과가 발생합니다. 오류 메시지의 예는 다음과 같습니다.

    ** server can't find oidc.eks.region.amazonaws.com: NXDOMAIN

    이 단계를 완료하려면 VPC 외부(예: AWS CloudShell 또는 인터넷에 연결된 컴퓨터)에서 명령을 실행할 수 있습니다.

  2. IAM 역할을 수임하도록 Kubernetes 서비스 계정 구성 - 애플리케이션에 부여하려는 고유한 권한 세트에 대해 이 절차를 완료합니다.

  3. Kubernetes 서비스 계정을 사용하도록 Pods 구성 - AWS 서비스에 액세스해야 하는 각 Pod에 대해 이 절차를 완료합니다.

  4. 지원되는 AWS SDK 사용 - 워크로드가 지원되는 버전의 AWS SDK를 사용하고 워크로드가 기본 보안 인증 정보 체인을 사용하는지 확인합니다.

IAM, Kubernetes 및 OpenID Connect(OIDC) 배경 정보

2014년 AWS Identity and Access Management에서는 OpenID Connect(OIDC)를 사용하여 페더레이션형 ID를 지원하는 기능을 추가했습니다. 이 기능을 사용하면 지원되는 ID 제공업체를 이용해 AWS API 호출을 인증하고 유효한 OIDC JSON 웹 토큰(JWT)을 수신할 수 있습니다. 이 토큰을 AWS STS AssumeRoleWithWebIdentity API 작업에 전달하고 IAM 임시 역할 자격 증명을 수신할 수 있습니다. 이 자격 증명을 사용하여 Amazon S3 및 DynamoDB와 같은 AWS 서비스와 상호 작용할 수 있습니다.

각 JWT 토큰은 서명 키 페어로 서명됩니다. 키는 Amazon EKS에서 관리하는 OIDC 공급자가 제공하며 프라이빗 키는 7일마다 교체됩니다. Amazon EKS는 퍼블릭 키를 만료될 때까지 보관합니다. 외부 OIDC 클라이언트를 연결하는 경우 퍼블릭 키가 만료되기 전에 서명 키를 갱신해야 합니다. 서명 키 가져오기 방법에 대해 알아봅니다.

Kubernetes는 오랫동안 서비스 계정을 자체 내부 ID 시스템으로 사용해 왔습니다. Pods는 Kubernetes API 서버만 검증할 수 있는 자동 탑재 토큰(OIDC가 아닌 JWT)을 사용하여 Kubernetes API 서버에 인증할 수 있습니다. 이러한 레거시 서비스 계정 토큰은 만료되지 않으며, 서명 키를 교체하려면 까다로운 프로세스를 거쳐야 합니다. Kubernetes 버전 1.12에서 새로운 ProjectedServiceAccountToken 기능에 대한 지원이 추가되었습니다. 이 기능은 서비스 계정 ID도 포함된 OIDC JSON 웹 토큰이며 구성 가능한 대상을 지원합니다.

Amazon EKS는 ProjectedServiceAccountToken JSON 웹 토큰에 대한 서명 키가 포함된 각 클러스터에 대한 퍼블릭 OIDC 검색 엔드포인트를 호스팅하므로 IAM과 같은 외부 시스템이 Kubernetes에서 발급한 OIDC 토큰을 확인하고 수락할 수 있습니다.