궁금한게 많은 개발자 노트

[ AWS ] EKS사용 시 AWS IAM User와 k8s Role의 관계 본문

DevOps

[ AWS ] EKS사용 시 AWS IAM User와 k8s Role의 관계

궁금한게 많은 개발자 2023. 11. 10. 00:04

AWS에서 제공하는 EKS(Elastic Kubernetes Service)를 사용하다 보면, IAM User권한을 통해 EKS를 생성하고 생성한 User는 클러스터를 구성할 수 있는 system:master권한을 가져, EKS에 접근하거나 EKS내에서 생성된 k8s resource들에 대한 접근 권한이 생성됩니다. 물론, terraform이나 ansible등의 IaC를 사용하여 CLI를 통해 EKS를 구축하였더라도 kube config를 업데이트하여 IAM Role, User, Account등을 지정할 수 있습니다.

 

 

AWS에서는 AWS서비스에 접근하기 위한 사용자 IAM정보를 ~/.aws/config에 저장해둔다면, EKS에서는 EKS에 접근하기 위한 토큰을 발급하여 사용하도록 하는 정보를 ~/.kube/config에 저장합니다.

AWS는 EKS 클러스터를 생성할 때의 IAM을 클러스터 master 계정으로 생성한다. master 계정 외에 다른 계정에서 클러스터에 접근하기 위해서는 aws-auth ConfigMap에 권한을 부여해야 한다. 

EKS를 생성했다고 하더라도 CLI에서 아래 명령을 통해 kubeconfig를 생성/IAM 정보를 등록해주어야 합니다.

aws eks --region <region-code> update-kubeconfig --name <cluster_name>

 

위 그림을 보면 kubectl을 통해 EKS에 접근하기 위한 절차가 상세히 설명되어 있습니다.

AWS에서 Role/Policy를 통해 각 service들에 접근할 수 있는 권한을 제어한다면, EKS내에서도 Role을 통해 k8s resource들에 접근할 수 있는 rule들을 정의하고, 그 Role을 k8s user, group에 부여하는 방식으로 접근 권한을 제어합니다.

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
  name: developer-role
  namespace: developer
rules:
  - apiGroups: ["*"]
    resources: ["pods"]
    verbs: ["list", "get", "create", "update"]

developer-role을 정의하고, 해당 role을 특정 group에 binding하여 권한을 부여합니다. 이러한 방식으로 EKS를 생성한 사용자 뿐만 아니라, 여러 다른 사용자에게도 해당 EKS에 접근할 수 있는 권한을 부여할 수 있습니다.

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: developer-rolebinding
  namespace: developer
subjects:
  - kind: Group
    name: developer
roleRef:
  kind: Role
  name: developer-role
  apiGroup: rbac.authorization.k8s.io

이렇게 k8s내에서 role/rolebinding, k8s group을 만들어 두고, 아래와 같이 aws-auth configmap에서 EKS를 생성한 사용자 이외의 IAM사용자와 매핑시켜 RBAC을 통해 권한을 부여할 수 있습니다.

apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::************:role/EKS-NodeGroup-Role
      username: system:node:{{EC2PrivateDNSName}}
  mapUsers: |
    - userarn: arn:aws:iam::************:user/kyungse.park_developer
      username: kyungse.park_developer
      groups:
        - developer

이러한 과정을 다 이해하고 나면, kubectl을 통해 api-server와 AWS IAM, k8s RBAC의 구성요소들이 어떤 상호작용으로 명령이 전달되고 응답이 오는지에 대해 더 이해하기 쉬울 것 같습니다.

 

 

Comments