EKS에 IAM Role/User 접근 권한 부여하기

brillog·2023년 8월 21일
0

Kubernetes

목록 보기
6/11

EKS는 최초 생성 후 오직 'EKS를 생성한 IAM User'만 해당 EKS에 접근이 가능합니다. 만약 '생성한 User'가 아닌 다른 User로 접근을 시도할 경우, 다음과 같은 에러가 발생합니다.

$ kubectl get po -A
error: You must be logged in to the server (Unauthorized)

따라서 'IAM User' 혹은 'IAM Role'의 EKS 접근을 허용하려면 EKS를 생성한 IAM User로 접속하여 권한을 부여해 주어야 합니다. 이제부터 EKS에 IAM 보안 주체(IAM Role/User)를 추가하는 방법에 대해 알아보겠습니다.

클러스터에 대한 IAM 보안 주체 액세스 사용을 참고하여 작성하였습니다.
RBAC에 대한 개념은 Kubernetes - RBAC이란?을 참고해 주세요.

ConfigMap 확인

kube-system Namespace에 aws-auth라는 ConfigMap이 있습니다.

$ kubectl get configmap -n kube-system
NAME                                 DATA   AGE
aws-auth                             2      157m
coredns                              1      3h17m
extension-apiserver-authentication   6      3h17m
kube-proxy                           1      3h17m
kube-proxy-config                    1      3h17m
kube-root-ca.crt                     1      3h17m

위와 같이 kubectl get configmap -n kube-system 수행 시 확인이 가능한데, 이 ConfigMap을 수정하면 EKS에 IAM 보안 주체를 추가할 수 있습니다.

클러스터에 접근할 수 있는 보안 주체 확인을 위한 aws-auth ConfigMap 수정
: kubectl describe -n kube-system configmap/aws-auth

EKS 생성 후 아무것도 건드리지 않은 default 상태는 아래와 같습니다.

$ kubectl describe -n kube-system configmap/aws-auth
Name:         aws-auth
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>

Data
====
mapRoles:
----
- groups:
  - system:bootstrappers
  - system:nodes
  rolearn: arn:aws:iam::<ACCOUNT_ID>:role/<EKS_NODE_IAM_ROLE_NAME>
  username: system:node:{{EC2PrivateDNSName}}


BinaryData
====

Events:  <none>

ClusterRole 생성

아래 예시와 같이 원하는 rule을 지정하여 ClusterRole을 생성합니다. (저는 IAM User가 모든 API에 접근이 가능할 수 있도록 하기 위해 apiGroups, resources, verbs를 모두 ['*']로 지정하였습니다.)

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: admin-role
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]

ClusterRoleBinding 생성

ClusterRole을 생성하였으니 ClusterRoleBinding을 생성해 보겠습니다. admin-group이라는 Group에 위에서 생성한 admin-role을 할당하는 역할을 합니다. 이 Group은 이따가 ConfigMap에서 사용됩니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-group-rolebinding
subjects:
- kind: Group
  name: admin-group  # 'EKS 접근 권한을 부여할 IAM Role/User'에 해당 Group으로 권한을 부여
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: admin-role  # 생성한 ClusterRole Name
  apiGroup: rbac.authorization.k8s.io

ConfigMap 수정

ClusterRole과 ClusterRoleBinding을 모두 생성하였으니 이제 ConfigMap을 수정하겠습니다.

$ kubectl edit -n kube-system configmap/aws-auth

admin-role(생성한 ClusterRole) 권한이 binding 된 admin-group(ClusterRoleBinding한 Group) 권한을 부여해 줄 'IAM Role'은 data.mapRoles 하위에, 'IAM User'는 data.mapUsers 하위에 YAML 형식에 맞춰 추가해 주면 됩니다.

apiVersion: v1
data:
  mapRoles: |
    - groups:
      - admin-group
      rolearn: arn:aws:iam::<ACCOUNT_ID>:role/<권한_부여할_IAM_ROLE_NAME>
      username: <권한_부여할_IAM_ROLE_NAME>
  mapUsers: |
    - groups:
      - admin-group
      userarn: arn:aws:iam::<ACCOUNT_ID>:role/<권한_부여할_IAM_USER_NAME>
      username: <권한_부여할_IAM_USER_NAME>
...

수정한 최종 버전은 아래와 같습니다.

apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::<ACCOUNT_ID>:role/<EKS_NODE_IAM_ROLE_NAME>
      username: system:node:{{EC2PrivateDNSName}}
    - groups:
      - admin-group
      rolearn: arn:aws:iam::<ACCOUNT_ID>:role/<권한_부여할_IAM_ROLE_NAME>
      username: <권한_부여할_IAM_ROLE_NAME>
  mapUsers: |
    - groups:
      - admin-group
      userarn: arn:aws:iam::<ACCOUNT_ID>:user/<권한_부여할_IAM_USER_NAME>
      username: <권한_부여할_IAM_USER_NAME>
kind: ConfigMap
metadata:
  creationTimestamp: "2023-xx-xxTxx:xx:xxZ"
  name: aws-auth
  namespace: kube-system
  resourceVersion: "xxxxx"
  uid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

저는 ClusterRole에 모든 권한을 부여(["*"])하여 문제가 없었지만 만약 ClusterRole에서 권한이 부여되지 않은 API를 호출할 경우 아래와 같은 에러가 발생할 수 있습니다.

# (예시) ClusterRole에 Pod를 Get하는 권한이 없을 경우
$ kubectl get po -A
Error from server (Forbidden): pods is forbidden: User "<권한_부여할_IAM_USER_NAME>" cannot list resource "pods" in API group "" at the cluster scope

Reference

개인적으로 공부하며 작성한 글로, 내용에 오류가 있을 수 있습니다.

profile
Cloud & DevOps ♡

0개의 댓글