본문 바로가기

EKS/EKS Cluster

EKS Cluster 구축 - 8. EKS IAM User - RBAC 권한 부여

EKS Cluster를 구축하면, 구축한 IAM에 대해서는 마스터 권한이 있습니다.

 

또한 아래와 같이 수정하여 다른 IAM 유저에게도 그 권한을 부여할 수 있습니다.

 

kubectl edit configmap aws-auth -n kube-system

 

apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::{account_id}:role/{workernode-role}
      username: system:node:{{EC2PrivateDNSName}}
  mapUsers: |
    - userarn: arn:aws:iam::{account_id}:user/{user_name1}
      username: user_name1
      groups:
        - system:mastsers
    - userarn: arn:aws:iam::{account_id}:user/{user_name2}
      username: user_name2
      groups:
        - system:masters

 

하지만, 쿠버네티스의 RBAC를 IAM 유저에게 할당하게 하고 싶을 때는 어떻게 할까요?

 

먼저, 유저에게 주고 싶은 RBAC를 할당하겠습니다.

 

저는 dev-was / dev-batch 네임스페이스에 대해서만 유저가 컨트롤 하게 하고 싶기 때문에 아래와 같이 Role을 생성하겠습니다.

 

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dev-was
  namespace: dev-was
rules:
  - apiGroups: ["*"]
    resources: ["*"]
    verbs: ["*"]

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dev-batch
  namespace: dev-batch
rules:
  - apiGroups: ["*"]
    resources: ["*"]
    verbs: ["*"]

 

그리고 이 Role을 주고자 하는 Group 이름으로 매핑하여 할당하겠습니다.

이때, Group은 따로 생성하지 않고, 작성한 스트링값만 맞추면 되기 때문에 사용하고자 하는 값을 넣으시면 됩니다.

 

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


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

 

그리고 위의 aws-auth Configmap에서 추가 했던 것 처럼 아래와 같이 추가해주세요

 

apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::{account_id}:role/{workernode-role}
      username: system:node:{{EC2PrivateDNSName}}
  mapUsers: |
    - userarn: arn:aws:iam::{account_id}:user/{user_name1}
      username: user_name1
      groups:
        - system:mastsers
    - userarn: arn:aws:iam::{account_id}:user/{user_name2}
      username: user_name2
      groups:
        - system:masters
    - userarn: arn:aws:iam::{account_id}:user/{dev_user1}
      username: dev_user1
      groups:
        - dev
    - userarn: arn:aws:iam::{account_id}:user/{dev_user2}
      username: dev_user2
      groups:
        - dev

 

그러면 이제 이 유저는 해당 네임스페이스만 접근하여 사용할 수 있게 됩니다.

 

하지만, 우리가 실제로 쿠버네티스 환경에서 구축하다 보면, CRD 등 Cluster Role 단위에 있는 롤이 필요한 경우가 있습니다.

 

이 역시도 같은 방법으로 부여해주시면 됩니다.

 

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

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: crd-cluster-role-binding
subjects:
- kind: Group
  name: dev
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: crd-cluster-role
  apiGroup: rbac.authorization.k8s.io

 

위와 같이 CRD에 대한 Cluster Role을 부여해주시고, 바인딩을 해주시면 사용할 수 있게 됩니다.

 

하지만, 다른 리소스를 건드릴 수 있기 때문에 클러스터 롤의 경우에는 더 권한을 세분화 해서 넣거나,

 

아니면 관리자에게 전달하여 총 관리자가 배포하게 하는것이 좋을 것으로 판단됩니다.