Kubernetes 서비스 계정(Service Account)으로 워크로드에 AWS 액세스 권한 부여

Kubernetes 서비스 계정(Service Account)으로 워크로드에 AWS 액세스 권한 부여

Kubernetes 서비스 계정을 사용해 Amazon EKS 클러스터의 워크로드에 AWS 액세스 권한을 부여하는 방법을 설명합니다.

출처: 문서

본문

Kubernetes 서비스 계정은 Pod에서 실행되는 프로세스에 ID를 제공합니다. 자세한 내용은 Kubernetes 문서의 "서비스 계정 관리"를 참고하세요. Pod가 AWS 서비스에 액세스해야 한다면 서비스 계정을 AWS Identity and Access Management ID에 매핑해 그 액세스 권한을 부여할 수 있습니다. 자세한 내용은 "서비스 계정용 IAM 역할" 또는 "EKS Pod Identity가 Pod에 AWS 서비스 액세스 권한을 부여하는 방법"을 참고하세요.

서비스 계정 토큰

BoundServiceAccountTokenVolume 기능은 Kubernetes 버전에서 기본적으로 활성화되어 있습니다. 이 기능은 Kubernetes에서 실행되는 워크로드가 오디언스(audience), 시간, 키에 바인딩된 JSON 웹 토큰을 요청할 수 있게 하여 서비스 계정 토큰의 보안을 개선합니다. 서비스 계정 토큰의 만료 시간은 1시간입니다. 이전 Kubernetes 버전에서는 토큰에 만료 시간이 없었습니다. 즉, 이 토큰에 의존하는 클라이언트는 1시간 내에 토큰을 갱신해야 합니다. 다음 Kubernetes 클라이언트 SDK는 필요 시간 내에 토큰을 자동으로 갱신합니다.

  • Go 버전 0.15.7 이상
  • Python 버전 12.0.0 이상
  • Java 버전 9.0.0 이상
  • JavaScript 버전 0.10.3 이상
  • Ruby master 브랜치
  • Haskell 버전 0.3.0.0
  • C# 버전 7.0.5 이상

워크로드가 이보다 이전 클라이언트 버전을 사용한다면 업데이트해야 합니다. 클라이언트가 더 새로운 시간 제한 서비스 계정 토큰으로 원활하게 마이그레이션할 수 있도록, Kubernetes는 기본 1시간 외에 서비스 계정 토큰에 확장 만료 기간을 추가합니다. Amazon EKS 클러스터의 경우 확장 만료 기간은 90일입니다. Amazon EKS 클러스터의 Kubernetes API 서버는 90일보다 오래된 토큰이 포함된 요청을 거부합니다. 애플리케이션과 그 종속성이 앞서 나열한 버전 이상의 Kubernetes 클라이언트 SDK를 사용하는지 확인할 것을 권장합니다.

API 서버가 1시간보다 오래된 토큰이 포함된 요청을 받으면 API 감사 로그 이벤트에 annotations.authentication.k8s.io/stale-token으로 주석을 답니다. 주석 값은 다음 예제와 같습니다.

subject: system:serviceaccount:common:fluent-bit, seconds after warning threshold: 4185802.

클러스터에 컨트롤 플레인 로깅이 활성화되어 있으면 주석이 감사 로그에 있습니다. 다음 CloudWatch Logs Insights 쿼리로 Amazon EKS 클러스터에서 오래된 토큰(stale token)을 사용하는 모든 Pod를 식별할 수 있습니다.

fields @timestamp
|filter @logStream like /kube-apiserver-audit/
|filter @message like /seconds after warning threshold/
|parse @message "subject: *, seconds after warning threshold:*\"" as subject, elapsedtime

subject는 Pod가 사용한 서비스 계정을 나타냅니다. elapsedtime은 최신 토큰을 읽은 후 경과된 시간(초)을 나타냅니다. elapsedtime이 90일(7,776,000초)을 초과하면 API 서버에 대한 요청이 거부됩니다. 애플리케이션의 Kubernetes 클라이언트 SDK를 앞서 나열한, 토큰을 자동으로 갱신하는 버전 중 하나로 사전에 업데이트해야 합니다. 사용 중인 서비스 계정 토큰이 90일에 가까워졌고 토큰 만료 전에 클라이언트 SDK 버전을 업데이트할 시간이 충분하지 않다면, 기존 Pod를 종료하고 새 Pod를 생성할 수 있습니다. 이렇게 하면 서비스 계정 토큰이 다시 가져와지므로 클라이언트 버전 SDK를 업데이트할 90일이 추가로 주어집니다.

Pod가 배포(deployment)의 일부라면, 고가용성을 유지하면서 Pod를 종료하는 권장 방법은 다음 명령으로 롤아웃을 수행하는 것입니다. my-deployment를 배포 이름으로 바꾸세요.

kubectl rollout restart deployment/my-deployment

클러스터 애드온

다음 클러스터 애드온은 서비스 계정 토큰을 자동으로 다시 가져오는 Kubernetes 클라이언트 SDK를 사용하도록 업데이트되었습니다. 나열된 버전 이상이 클러스터에 설치되어 있는지 확인할 것을 권장합니다.

  • Amazon VPC CNI plugin for Kubernetes 및 metrics helper 플러그인 버전 1.8.0 이상. 현재 버전을 확인하거나 업데이트하려면 "Amazon VPC CNI로 Pod에 IP 할당" 및 cni-metrics-helper를 참고하세요.
  • CoreDNS 버전 1.8.4 이상. 현재 버전을 확인하거나 업데이트하려면 "Amazon EKS 클러스터에서 DNS용 CoreDNS 관리"를 참고하세요.
  • AWS Load Balancer Controller 버전 2.0.0 이상. 현재 버전을 확인하거나 업데이트하려면 "AWS Load Balancer Controller로 인터넷 트래픽 라우팅"을 참고하세요.
  • 현재 kube-proxy 버전. 현재 버전을 확인하거나 업데이트하려면 "Amazon EKS 클러스터에서 kube-proxy 관리"를 참고하세요.
  • AWS for Fluent Bit 버전 2.25.0 이상. 현재 버전을 업데이트하려면 GitHub의 "Releases"를 참고하세요.
  • Fluentd 이미지 버전 1.14.6-1.2 이상 및 Kubernetes 메타데이터용 Fluentd filter 플러그인 버전 2.11.1 이상.

Amazon Elastic Kubernetes Service 클러스터의 워크로드에 AWS Identity and Access Management 권한 부여

Amazon EKS는 Amazon EKS 클러스터에서 실행되는 워크로드에 AWS Identity and Access Management 권한을 부여하는 두 가지 방법을 제공합니다: 서비스 계정용 IAM 역할(IRSA)과 EKS Pod Identity.

  • 서비스 계정용 IAM 역할: 서비스 계정용 IAM 역할(IRSA)은 AWS에서 실행되는 Kubernetes 애플리케이션에 세분화된 IAM 권한을 구성해 Amazon S3 버킷, Amazon DynamoDB 테이블 등 다양한 AWS 리소스에 액세스할 수 있게 합니다. 동일한 Amazon EKS 클러스터에서 여러 애플리케이션을 함께 실행하면서 각 애플리케이션이 필요한 최소 권한만 갖도록 보장할 수 있습니다. IRSA는 Amazon EKS, Amazon EKS Anywhere, Red Hat OpenShift Service on AWS, Amazon EC2 인스턴스의 자체 관리형 Kubernetes 클러스터 등 AWS가 지원하는 다양한 Kubernetes 배포 옵션을 지원하도록 설계되었습니다. 따라서 IRSA는 IAM 같은 기반 AWS 서비스를 사용해 구축되었으며 Amazon EKS 서비스나 EKS API에 직접적으로 의존하지 않습니다. 자세한 내용은 "서비스 계정용 IAM 역할"을 참고하세요.
  • EKS Pod Identity: EKS Pod Identity는 클러스터 관리자에게 Amazon S3 버킷, Amazon DynamoDB 테이블 등 다양한 AWS 리소스에 액세스하기 위해 애플리케이션을 인증하는 간소화된 워크플로를 제공합니다. EKS Pod Identity는 EKS 전용이므로, 클러스터 관리자가 Kubernetes 애플리케이션이 IAM 권한을 얻도록 구성하는 방식을 단순화합니다. 이제 AWS Management Console, EKS API, AWS CLI를 통해 더 적은 단계로 권한을 쉽게 구성할 수 있으며, 클러스터 내 Kubernetes 객체에서 취해야 할 조치는 없습니다. 클러스터 관리자는 EKS와 IAM 서비스를 전환하거나 권한 있는 IAM 작업을 사용해 애플리케이션에 필요한 권한을 구성할 필요가 없습니다. 이제 IAM 역할은 새 클러스터를 만들 때 역할 신뢰 정책을 업데이트할 필요 없이 여러 클러스터에서 사용할 수 있습니다. EKS Pod Identity가 제공하는 IAM 자격 증명에는 클러스터 이름, 네임스페이스, 서비스 계정 이름 같은 속성의 역할 세션 태그(role session tags)가 포함됩니다. 역할 세션 태그를 사용하면 관리자가 일치하는 태그를 기반으로 AWS 리소스 액세스를 허용해 여러 서비스 계정에서 작동할 수 있는 단일 역할을 작성할 수 있습니다. 자세한 내용은 "EKS Pod Identity가 Pod에 AWS 서비스 액세스 권한을 부여하는 방법"을 참고하세요.

EKS Pod Identity와 IRSA 비교

높은 수준에서 보면 EKS Pod Identity와 IRSA 모두 Kubernetes 클러스터에서 실행되는 애플리케이션에 IAM 권한을 부여할 수 있게 합니다. 하지만 구성 방식, 지원되는 한도, 활성화되는 기능에서 근본적으로 다릅니다. 아래에서 두 솔루션의 주요 측면을 비교합니다.

참고: AWS는 가능할 때마다 Pod에 AWS 리소스 액세스 권한을 부여하는 데 EKS Pod Identity를 사용할 것을 권장합니다. 자세한 내용은 "EKS Pod Identity가 Pod에 AWS 서비스 액세스 권한을 부여하는 방법"을 참고하세요.

속성 EKS Pod Identity IRSA
역할 확장성 새로 도입된 Amazon EKS 서비스 보안 주체 pods.eks.amazonaws.com과의 신뢰를 확립하려면 각 역할을 한 번 설정해야 합니다. 이 일회성 단계 후에는 역할이 새 클러스터에서 사용될 때마다 역할의 신뢰 정책을 업데이트할 필요가 없습니다. 새 클러스터에서 역할을 사용할 때마다 새 EKS 클러스터 OIDC 공급자 엔드포인트로 IAM 역할의 신뢰 정책을 업데이트해야 합니다.
클러스터 확장성 EKS Pod Identity는 사용자가 IAM OIDC 공급자를 설정할 필요가 없으므로 이 한도가 적용되지 않습니다. 각 EKS 클러스터에는 OpenID Connect(OIDC) 발급자 URL이 연결되어 있습니다. IRSA를 사용하려면 각 EKS 클러스터에 대해 IAM에 고유한 OpenID Connect 공급자를 만들어야 합니다. IAM에는 각 AWS 계정에 대해 기본 전역 한도인 OIDC 공급자 100개가 있습니다. IRSA로 계정당 EKS 클러스터를 100개 넘게 계획한다면 IAM OIDC 공급자 한도에 도달하게 됩니다.
역할 확장성 EKS Pod Identity는 사용자가 신뢰 정책에서 IAM 역할과 서비스 계정 간의 신뢰 관계를 정의할 필요가 없으므로 이 한도가 적용되지 않습니다. IRSA에서는 역할의 신뢰 정책에서 IAM 역할과 서비스 계정 간의 신뢰 관계를 정의합니다. 기본적으로 신뢰 정책 크기는 2048입니다. 즉, 단일 신뢰 정책에서 일반적으로 4개의 신뢰 관계를 정의할 수 있습니다. 신뢰 정책 길이 한도를 늘릴 수는 있지만, 일반적으로 단일 신뢰 정책 내 최대 8개의 신뢰 관계로 제한됩니다.
STS API 할당량 사용 EKS Pod Identity는 Pod에 AWS 자격 증명 전달을 단순화하며, 코드가 AWS Security Token Service(STS)에 직접 호출을 할 필요가 없습니다. EKS 서비스가 역할 수임을 처리하고, Pod의 AWS SDK로 작성된 애플리케이션에 자격 증명을 전달하며, Pod가 AWS STS와 통신하거나 STS API 할당량을 사용할 필요가 없습니다. IRSA에서는 Pod의 AWS SDK로 작성된 애플리케이션이 토큰을 사용해 AWS Security Token Service(STS)의 AssumeRoleWithWebIdentity API를 호출합니다. AWS SDK의 코드 로직에 따라, 코드가 불필요하게 AWS STS를 호출해 제한(throttling) 오류를 받을 수 있습니다.
역할 재사용성 EKS Pod Identity가 제공하는 AWS STS 임시 자격 증명에는 클러스터 이름, 네임스페이스, 서비스 계정 이름 같은 역할 세션 태그가 포함됩니다. 역할 세션 태그를 사용하면 관리자가 태그를 기반으로 AWS 리소스 액세스를 허용해 여러 서비스 계정에서 서로 다른 유효 권한으로 사용할 수 있는 단일 IAM 역할을 작성할 수 있습니다. 이를 속성 기반 액세스 제어(ABAC)라고도 합니다. 자세한 내용은 "태그를 기반으로 Pod에 AWS 리소스 액세스 권한 부여"를 참고하세요. AWS STS 세션 태그는 지원되지 않습니다. 클러스터 간에 역할을 재사용할 수 있지만 모든 Pod가 역할의 모든 권한을 받습니다.
지원 환경 EKS Pod Identity는 Amazon EKS에서만 사용할 수 있습니다. IRSA는 Amazon EKS, Amazon EKS Anywhere, Red Hat OpenShift Service on AWS, Amazon EC2 인스턴스의 자체 관리형 Kubernetes 클러스터 등에서 사용할 수 있습니다.
지원 EKS 버전 모든 지원되는 EKS 클러스터 버전. 특정 플랫폼 버전은 "EKS Pod Identity 클러스터 버전"을 참고하세요. 모든 지원되는 EKS 클러스터 버전.

더 알아보기 (Learn more)