새소식

AWS/EKS

[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 을 활용하면 다음과 같은 구조를 실현할 수 있습니다.

IAM Group 을 통한 EKS 인증 처리

 

아키텍처의 흐름은 다음과 같습니다.

  1. Dev IAM Role 에게 Account 의 모든 User 가 AssumeRole 을 실행할 수 있도록 신뢰 정책 부여
  2. Dev IAM Group 에게 Dev IAM Role 에 대해 AssumeRole 을 실행할 수 있도록 정책 부여
  3. Dev IAM Role 과 EKS ClusterRole 을 매핑
  4. 해당 ClusterRole 을 사용할 IAM User 를 Dev IAM Group 에 추가
  5. 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 에 국한할 수 없다는 것입니다.

'sts:assumerole' 권한을 보유한 사용자는 해당 Role 을 사용할 수 있다.

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

 

'sts:AssumeRole' 만 보유하고 있어도...

 

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

 

Contents

포스팅 주소를 복사했습니다