IRSA로 다른 계정에 인증
IRSA로 다른 계정에 인증
다른 AWS 계정의 클러스터에서 ID 공급자를 만들거나 연결된 AssumeRole 작업을 사용해 크로스 계정 IAM 권한을 구성하는 방법을 설명합니다.
출처: 문서
본문
다른 계정의 클러스터에서 ID 공급자를 만들거나 연결된(chained) AssumeRole 작업을 사용해 크로스 계정 IAM 권한을 구성할 수 있습니다. 다음 예제에서 계정 A는 서비스 계정용 IAM 역할을 지원하는 Amazon EKS 클러스터를 소유합니다. 해당 클러스터에서 실행되는 Pod는 계정 B의 IAM 권한을 수임해야 합니다.
- 옵션 1은 더 간단하지만 계정 B가 계정 A 클러스터용 OIDC ID 공급자를 생성하고 관리해야 합니다.
- 옵션 2는 OIDC 관리를 계정 A에 유지하지만 두 번의
AssumeRole호출을 통한 역할 연결이 필요합니다.
옵션 1: 다른 계정의 클러스터에서 ID 공급자 생성
이 예제에서 계정 A는 클러스터의 OpenID Connect(OIDC) 발급자 URL을 계정 B에 제공합니다. 계정 B는 계정 A 클러스터의 OIDC 발급자 URL을 사용해 "클러스터용 IAM OIDC 공급자 생성"과 "Kubernetes 서비스 계정에 IAM 역할 할당"의 지침을 따릅니다. 그런 다음 클러스터 관리자는 계정 A 클러스터의 서비스 계정에 계정 B(444455556666)의 역할을 사용하도록 주석을 답니다.
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::444455556666:role/account-b-role
옵션 2: 연결된 AssumeRole 작업 사용
이 접근 방식에서는 각 계정이 IAM 역할을 생성합니다. 계정 B의 역할은 계정 A를 신뢰하고, 계정 A의 역할은 OIDC 페더레이션을 사용해 클러스터에서 자격 증명을 가져옵니다. 그러면 Pod가 AWS CLI 프로파일을 사용해 두 역할을 연결합니다.
1단계: 계정 B에서 대상 역할 생성
계정 B(444455556666)는 계정 A 클러스터의 Pod에 필요한 권한을 가진 IAM 역할을 생성합니다. 계정 B는 원하는 권한 정책을 이 역할에 연결한 다음 다음 신뢰 정책을 추가합니다.
계정 B 역할의 신뢰 정책 – 이 정책은 계정 A의 특정 IRSA 역할이 이 역할을 수임하도록 허용합니다.
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
중요: 최소 권한을 위해 계정 루트(
arn:aws:iam::111122223333:root)를 사용하는 대신PrincipalARN을 계정 A의 특정 역할 ARN으로 바꾸세요. 계정 루트를 사용하면 계정 A의 모든 IAM 보안 주체가 이 역할을 수임할 수 있습니다.
2단계: 계정 A에서 IRSA 역할 생성
계정 A(111122223333)는 클러스터의 OIDC 발급자 주소로 생성된 ID 공급자에서 자격 증명을 가져오는 신뢰 정책을 가진 역할을 생성합니다.
계정 A 역할의 신뢰 정책(OIDC 페더레이션) – 이 정책은 EKS 클러스터의 OIDC 공급자가 이 역할에 대한 자격 증명을 발급하도록 허용합니다.
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
}
}
}
]
}
중요: 최소 권한을 위해, 이 역할을 특정 Kubernetes 서비스 계정으로 제한하도록
sub클레임에 대한StringEquals조건을 추가하세요.sub조건이 없으면 클러스터의 모든 서비스 계정이 이 역할을 수임할 수 있습니다.sub값은system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT_NAME형식을 사용합니다. 예를 들어default네임스페이스의my-service-account라는 서비스 계정으로 제한하려면:
"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account"
3단계: 계정 A의 역할에 AssumeRole 권한 연결
계정 A는 2단계에서 생성한 역할에 권한 정책을 연결합니다. 이 정책은 역할이 계정 B의 역할을 수임하도록 허용합니다.
계정 A 역할의 권한 정책 – 이 정책은 계정 B의 대상 역할에 대한 sts:AssumeRole을 부여합니다.
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::444455556666:role/account-b-role"
}
]
}
4단계: Pod가 역할을 연결하도록 구성
Pod가 계정 B의 역할을 수임하기 위한 애플리케이션 코드는 두 프로파일(account_b_role과 account_a_role)을 사용합니다. account_b_role 프로파일은 account_a_role 프로파일을 소스로 사용합니다. AWS CLI의 경우 ~/.aws/config 파일은 다음과 유사합니다.
[profile account_b_role]
source_profile = account_a_role
role_arn=arn:aws:iam::444455556666:role/account-b-role
[profile account_a_role]
web_identity_token_file = /var/run/secrets/eks.amazonaws.com/serviceaccount/token
role_arn=arn:aws:iam::111122223333:role/account-a-role
다른 AWS SDK에 연결된 프로파일을 지정하려면 사용 중인 SDK의 문서를 참고하세요. 자세한 내용은 "Tools to Build on AWS"를 참고하세요.