[AWS/EKS] IAM Group 을 통한 EKS 인증 관리
- -
이번 포스팅에서는 IAM Group 을 활용해 Group 에 속한 사용자들이 생성한 EKS 에 대해 권한을 가지도록 하는 방법에 대해 알아보겠습니다.
- EKS 인증/인가 절차에 대해 모르는 분은 이전 포스팅을 참고바랍니다.
[AWS/EKS] EKS 인증/인가 파헤치기
이번 포스팅에서는 EKS 의 인증/인가 절차에 대해 자세하게 알아보겠습니다. EKS 권한에 대해 말할 때 흔히 IAM, 인증, 인가, RBAC, RoleBinding, Role, ServiceAccount 등의 용어가 사용됩니다. 이번 포스팅을
kimalarm.tistory.com
1. IAM Group 을 활용한 EKS 인증이 가능한가??
EKS 에서는 aws-auth 파일을 기반으로 AWS IAM User , Role 에 대해 권한을 부여합니다.
아래의 aws-auth Full Format 에서 볼 수 있듯이, IAM Group 을 직접적으로 지원하지는 않습니다.
GitHub - kubernetes-sigs/aws-iam-authenticator: A tool to use AWS IAM credentials to authenticate to a Kubernetes cluster
A tool to use AWS IAM credentials to authenticate to a Kubernetes cluster - GitHub - kubernetes-sigs/aws-iam-authenticator: A tool to use AWS IAM credentials to authenticate to a Kubernetes cluster
github.com
그렇기 때문에, 원칙적으로는 불가능하다입니다.
하지만 AssumeRole 을 사용하면 IAM Group 을 통해 EKS 인증 처리를 할 수 있는 편법이 있습니다.
AssumeRole 에 대한 AWS Docs
AssumeRole, AssumeRoleWithSAML 및 AssumeRoleWithWebIdentity에 대한 권한 - AWS Identity and Access Management
AssumeRole, AssumeRoleWithSAML 및 AssumeRoleWithWebIdentity에 대한 권한 수임된 역할에 대한 권한 정책은 AssumeRole, AssumeRoleWithSAML 및 AssumeRoleWithWebIdentity에 의해 반환되는 임시 보안 자격 증명에 대한 권한을
docs.aws.amazon.com
AssumeRole 은 복잡하지만 이번 포스팅에서는 단순하게 권한을 부여받는다라고만 이해하고 넘어가겠습니다.
2. AssumeRole 을 활용한 IAM Group 과 EKS 인증
AssumeRole 을 활용하면 다음과 같은 구조를 실현할 수 있습니다.

아키텍처의 흐름은 다음과 같습니다.
- Dev IAM Role 에게 Account 의 모든 User 가 AssumeRole 을 실행할 수 있도록 신뢰 정책 부여
- Dev IAM Group 에게 Dev IAM Role 에 대해 AssumeRole 을 실행할 수 있도록 정책 부여
- Dev IAM Role 과 EKS ClusterRole 을 매핑
- 해당 ClusterRole 을 사용할 IAM User 를 Dev IAM Group 에 추가
- IAM User 는 EKS 인증 시, Dev IAM Role 을 사용하도록 설정
그럼 해당 아키텍처를 구현해보겠습니다.
2.1. IAM Role 생성
IAM Role 을 생성할 때 다음 신뢰 정책을 부여합니다.
해당 Role 이 다른 서비스를 사용하지 않는다는 전제하에 신뢰 정책 외에 별도의 정책은 필요없습니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<ACCOUNT_ID>:root" }, "Action": "sts:AssumeRole" } ] }

2.2. IAM Group 생성
IAM Group 을 생성할 때 다음 정책을 부여합니다.
해당 Group의 사용자들이 EKS 접속 후 kubectl 명령어 외에 AWS 에서 다른 작업을 하지 않는다는 전제하에 인증에 필요한 최소 권한입니다.
{ "Version" : "2012-10-17", "Statement" : [ { "Sid" : "AllowAssumeOrganizationAccountRole", "Effect" : "Allow", "Action" : "sts:AssumeRole", "Resource" : "arn:aws:iam::<ACCOUNT_ID>:role/<DEV_IAM_ROLE>" }, { "Sid" : "AllowEKSClusterAccess", "Effect" : "Allow", "Action" : "eks:DescribeCluster", "Resource" : "arn:aws:eks:ap-northeast-2:<ACCOUNT_ID>:cluster/<CLUSTER_NAME>" }, { "Sid" : "AllowGetEKSClusterLists", "Effect" : "Allow", "Action" : "eks:ListClusters", "Resource" : "*" } ] }
여기까지 했다면 AssumeRole 을 위한 모든 작업은 종료되었습니다.
다음으로 EKS - IAM Role 간의 ClusterRole 매핑 작업을 진행합니다.
2.3. ClusterRole , ClusterRoleBinding 생성
이전 포스팅과 같이 ReadOnly 권한으로 테스트를 진행하겠습니다.
ReadOnly ClusterRole 생성
cat << EOT > clusterrole.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: kimalarm:cluster-readonly rules: - apiGroups: - '*' resources: - '*' verbs: - get - list - watch EOT
kubectl apply -f clusterrole.yaml
ReadOnly ClusterRoleBinding 생성
cat << EOT > clusterrolebinding.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: readonly roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: kimalarm:cluster-readonly subjects: - kind: Group name: kimalarm:cluster-readonly apiGroup: rbac.authorization.k8s.io EOT
kubectl apply -f clusterrolebinding.yaml
2.4. IAM Role Mapping
생성한 Dev IAM Role 과 EKS ClusterRole 을 매핑합니다.
이전 포스팅과 동일하게 eksctl 을 사용합니다.
eksctl create iamidentitymapping \ --cluster myeks \ --region=ap-northeast-2 \ --arn arn:aws:iam::<ACCOUNT_ID>:role/<DEV_IAM_ROLE> \ --username Dev_kimalarm_role \ --group kimalarm:cluster-readonly \ --no-duplicate-arns
kubectl get cm aws-auth -o yaml -n kube-system
정상적으로 수행되었다면 aws-auth 에서 다음과 같은 역할이 매핑되어 있습니다.

2.5. IAM Group 에 User 추가
Test 를 위해 모든 정책을 제거한 terraform_kimalarm user를 Dev_IAM_Group 에 추가하겠습니다.


2.6. EKS Config 파일 생성
Dev_IAM_Group 에 추가된 terraform_kimalarm 을 사용하여 EKS 인증을 처리하는 방법입니다.
확실한 사용 효과를 위해 기존 .kube/config 파일이 있다면 삭제해줍니다.
rm ~/.kube/config
기존 EKS 인증은 아래 명령어를 통해 가능했으나, AssumeRole 을 사용할 때는 인증되지 않습니다.
aws eks --region ap-northeast-2 update-kubeconfig --name myeks

이 방법은 아무 권한이 없는 terraform_kimalarm 유저가 EKS 인증을 시도하고 있기 때문입니다.
Dev_IAM_Group 에 의해 부여받은 Dev_IAM_Role 에 대한 사용권한을 실행해서 EKS 인증을 처리합니다.
aws eks --region ap-northeast-2 update-kubeconfig --name myeks --role-arn <DEV_IAM_ROLE_ARN>
해당 사용자는 Dev IAM Role 을 통해 EKS 인증을 처리하는 것을 알 수 있습니다.

2.7. IAM Group 에 속해있지 않은 사용자
IAM Group 에 속해있지 않은 사용자를 테스트 하기 위해 기존 terraform_kimalarm 유저를 IAM Group 에서 제거합니다.

이후 다시 아래 명령어를 통해 EKS 접속을 시도해봅니다.
aws eks --region ap-northeast-2 update-kubeconfig --name myeks --role-arn <DEV_IAM_ROLE_ARN>
IAM Group 에서 제거 후 AssumeRole 에 대한 권한이 없다는 오류가 발생합니다.

3. IAM Group AssumeRole 을 통한 EKS 인증의 한계
앞서 알 수 있듯이, AssumeRole 을 통해 IAM Group 에서 EKS 인증과 관련된 사용자를 관리할 수 있습니다.
이를 통해 EKS 사용자가 늘어날때마다 aws-auth 를 업데이트해주는 불편함을 해결할 수 있을 것입니다.
하지만 이 방법에는 맹점이 한 가지 존재합니다.
바로 EKS 와 연결된 IAM Role 에 대한 AssumeRole 접근 권한을 IAM Group 에 국한할 수 없다는 것입니다.

IAM Role 의 신뢰 정책을 Root Account 로 지정했기 때문에,
해당 Account의 Admin 권한을 가진 슈퍼유저 혹은 sts:assumerole 권한을 보유한 모든 유저는 EKS 와 연결된 IAM Role 을 사용할 수 있습니다.


IAM Role 의 신뢰 정책에 대해 Condition(조건) 을 지정하고자 하여도,
Condition 에서는 IAM Group 에 대한 어떠한 정책도 제공하고 있지 않기에 한계가 있습니다.
반드시 특정해야한다고 하면 Tag 기반 혹은 SourceIP 기반 등의 Condition을 사용하여 접근 범위를 축소시킬 수 있을 것입니다.
참고 문서
https://archive.eksworkshop.com/beginner/091_iam-groups/
https://eng.grip.security/enabling-aws-iam-group-access-to-an-eks-cluster-using-rbac