[AWS/EKS] IAM Group 을 통한 EKS 인증 관리
- -
이번 포스팅에서는 IAM Group 을 활용해 Group 에 속한 사용자들이 생성한 EKS 에 대해 권한을 가지도록 하는 방법에 대해 알아보겠습니다.
- EKS 인증/인가 절차에 대해 모르는 분은 이전 포스팅을 참고바랍니다.
1. IAM Group 을 활용한 EKS 인증이 가능한가??
EKS 에서는 aws-auth 파일을 기반으로 AWS IAM User , Role 에 대해 권한을 부여합니다.
아래의 aws-auth Full Format 에서 볼 수 있듯이, IAM Group 을 직접적으로 지원하지는 않습니다.
그렇기 때문에, 원칙적으로는 불가능하다입니다.
하지만 AssumeRole 을 사용하면 IAM Group 을 통해 EKS 인증 처리를 할 수 있는 편법이 있습니다.
AssumeRole 에 대한 AWS Docs
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
'AWS > EKS' 카테고리의 다른 글
ECR 멀티 아키텍처 이미지를 활용하여 EKS Graviton 노드 그룹 관리하기 (0) | 2023.08.31 |
---|---|
[EKS Study 7주차] EKS Automation - ACK (0) | 2023.06.10 |
[AWS/EKS] EKS 인증/인가 파헤치기 (4) | 2023.06.02 |
[EKS Study 5주차] EKS AutoScaling - Karpenter (0) | 2023.05.28 |
[EKS Study 5주차] EKS AutoScaling - CA (0) | 2023.05.28 |