RBAC 설정하기

쿠버네티스 RBAC의 기본을 이해하려면 권한 설정 - RBAC 모듈을 참조 할 수 있습니다.

1. 네임스페이스 생성하기

k8sdev group의 IAM 사용자가 접근할 수 있는 네임스페이스 development 와 k8sInteg group의 IAM 사용자가 접근할 수 있는 네임스페이스 integration 을 생성합니다.

kubectl create namespace integration
kubectl create namespace development

dev-user에게 development 네임스페이스에 대한 액세스를 할 수 있는 role 및 rolebinding을 구성합니다.

cat << EOF | kubectl apply -f - -n development
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dev-role
rules:
  - apiGroups:
      - ""
      - "apps"
      - "batch"
      - "extensions"
    resources:
      - "configmaps"
      - "cronjobs"
      - "deployments"
      - "events"
      - "ingresses"
      - "jobs"
      - "pods"
      - "pods/attach"
      - "pods/exec"
      - "pods/log"
      - "pods/portforward"
      - "secrets"
      - "services"
    verbs:
      - "create"
      - "delete"
      - "describe"
      - "get"
      - "list"
      - "patch"
      - "update"
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dev-role-binding
subjects:
- kind: User
  name: dev-user
roleRef:
  kind: Role
  name: dev-role
  apiGroup: rbac.authorization.k8s.io
EOF

정의한 역할은 해당 네임스페이스의 모든 것에 대해 액세스 권한을 부여하였습니다. 이 Role은 ClusterRole이 아니므로 development 네임스페이스에서만 적용됩니다.

이번에는 integ-user에게 integration 네임스페이스에 대한 액세스를 할 수 있는 role 및 rolebinding을 구성합니다.

cat << EOF | kubectl apply -f - -n integration
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: integ-role
rules:
  - apiGroups:
      - ""
      - "apps"
      - "batch"
      - "extensions"
    resources:
      - "configmaps"
      - "cronjobs"
      - "deployments"
      - "events"
      - "ingresses"
      - "jobs"
      - "pods"
      - "pods/attach"
      - "pods/exec"
      - "pods/log"
      - "pods/portforward"
      - "secrets"
      - "services"
    verbs:
      - "create"
      - "delete"
      - "describe"
      - "get"
      - "list"
      - "patch"
      - "update"
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: integ-role-binding
subjects:
- kind: User
  name: integ-user
roleRef:
  kind: Role
  name: integ-role
  apiGroup: rbac.authorization.k8s.io
EOF

정의한 역할은 해당 네임스페이스의 모든 것에 대해 액세스 권한을 부여하였습니다. 이 Role은 ClusterRole이 아니므로 integration 네임스페이스에서만 적용됩니다.

2. Role 세스 설정

EKS 클러스터의 IAM 역할에 대한 액세스 권한을 부여 합니다. 이전에 정의한 IAM 역할에 대한 액세스 권한을 EKS 클러스터에 부여 하려면 특정 mapRolesaws-authConfigMap에 추가해야 합니다.

IAM 사용자가 직접 지정하는 대신 클러스터에 액세스하는 role을 사용하는 것의 장점은 관리가 더 쉽다는 것 입니다. 우리가 사용자를 추가 하거나 제거 하려는 경우 ConfigMap을 업데이트 할 필요가 없으며 사용자를 추가하거나 제거 할 필요가 있습니다. IAM 그룹은 IAM 그룹과 연관된 IAM 역할을 허용 하도록 ConfigMap을 구성 합니다.

aws-auth ConfigMap을 업데이트하여 IAM 역할을 허용하게 할 수 있습니다. 이 파일은 IAM 역할과 K8S RBAC 권한 사이의 매핑을 만들며, 수동으로 편집 할 수 있습니다.

eksctl을 사용하여 편집 할 수 있습니다:

eksctl create iamidentitymapping \
  --cluster eksworkshop-eksctl \
  --arn arn:aws:iam::${ACCOUNT_ID}:role/k8sDev \
  --username dev-user

eksctl create iamidentitymapping \
  --cluster eksworkshop-eksctl \
  --arn arn:aws:iam::${ACCOUNT_ID}:role/k8sInteg \
  --username integ-user

eksctl create iamidentitymapping \
  --cluster eksworkshop-eksctl \
  --arn arn:aws:iam::${ACCOUNT_ID}:role/k8sAdmin \
  --username admin \
  --group system:masters
  

항목을 삭제하는 데에도 사용할 수 있습니다.

eksctl delete iamidentitymapping --cluster eksworkshop-eksctlv --arn arn:aws:iam::xxxxxxxxxx:role/k8sDev --username dev-user

다음과 같은 ConfigMap이 있어야 합니다.

kubectl get cm -n kube-system aws-auth -o yaml

eksctl을 활용하여 클러스터에서 관리되는 모든 ID의 목록을 얻을 수 있습니다:

eksctl get iamidentitymapping --cluster eksworkshop-eksctl

여기서 생성한 것은 다음과 같습니다.

  • system:masters 쿠버네티스 그룹에 액세스 권한을 부여하고 (완전 관리 권한이 있으므로) admin 사용자에게 맵핑 한 K8sAdmin의 RBAC 역할

  • 개발 네임스페이스에서 dev-user에 맵핑한 k8sdev RBAC 역할

  • 통합 네임스페이스에서 integ-user에 맵핑한 k8sInteg RBAC 역할

Last updated