본문 바로가기

AWS EKS 실습/EKS Beginner

Intro to RBAC

RBAC의 논리적 구성요소는 다음과 같다.

 

ㅇ Entity 

     그룹, 사용자 또는 서비스 계정 (특정 작업을 실행하고 이를 수행하는데 권한이 필요한 애플리케이션을 나타내는 ID)

 

ㅇ Resource

     Entity가 특정 작업을 사용하여 액세스하려는 Pod, Service 또는 Password

 

ㅇ Role

     Entity가 다양한 Resource에 대해 수행 할 수 있는 작업에 대한 규칙을 정의하는데 사용

 

ㅇ Role binding

      규칙 집합이 지정된 리소스에 대해 연결된 Entity가 허용하는 작업을 정의함을 나타내며 Role을 Entity에 연결(Binding) 한다.

      두 가지 유형의 Roles(Role, ClusterRole)과 각 바인딩(RoleBinding, ClusterRoleBinding)이 있다. 이는 namespace 또는
      Cluster 전체의 인증을 구별한다.

 

ㅇ Namespace

       Namespace는 security boundary를 만들며 namespace로 적용되는 객체 이름을 위한 고유한 범위를 제공한다. 또한 네임스페이스는 멀티 테넌트 환경에서 동일한 물리적 클러스터에서 가상의 쿠버네티스 클러스트를 생성 위해  사용된다. 

 

이번 실습은 EKS 클러스터에 액세스하도록 인증되었지만 RBAC을 통해서만 권한이 부여된 rbac-user라는 IAM 사용자를 생성하여 k8s RBAC를 살펴 보도록 한다. 

 

이를 위해 IAM 사용자를 생성하고 해당 사용자를 kubernetes 역할에 매핑한 다음 해당 사용자의 컨텍스트에서 kubernetes 작업을 수행한다.

 

ㅁ Install Test Pods

kubectl create namespace rbac-test
kubectl create deploy nginx --image=nginx -n rbac-test

 

rbac-test namespace의 정보 조회

kubectl get all -n rbac-test

ㅁ 유저 생성

aws iam create-user --user-name rbac-user
aws iam create-access-key --user-name rbac-user | tee /tmp/create_output.json

클러스터 생성 관리자와 새로운  rbac-user 간 쉽게 전환이 가능하도록 활성 사용자를 rbac-user로 설정하는 스크립트 생성

cat << EoF > rbacuser_creds.sh
export AWS_SECRET_ACCESS_KEY=$(jq -r .AccessKey.SecretAccessKey /tmp/create_output.json)
export AWS_ACCESS_KEY_ID=$(jq -r .AccessKey.AccessKeyId /tmp/create_output.json)
EoF

 

ㅁ IAM 사용자를 K8S에 매핑

 

rbac-user라는 k8s 사용자를 정의하고 해당 IAM 사용자에 매핑한다. 다음을 실행하여 기존 ConfigMap을 가져오고 aws-auth.yaml이라는 파일에 저장

kubectl get configmap -n kube-system aws-auth -o yaml > aws-auth.yaml

 

rbac-user 매핑을 configMap에 추가한다.

cat << EoF >> aws-auth.yaml
data:
  mapUsers: |
    - userarn: arn:aws:iam::${ACCOUNT_ID}:user/rbac-user
      username: rbac-user
EoF

 

cat aws-auth.yaml

해당 내용을 ConfigMap에 적용한다.

kubectl apply -f aws-auth.yaml

이제 새로 생성된 rbac-user로 클러스터에 엑세스하여 내용을 살펴 본다.

. rbacuser_creds.sh

위의 명령 실행 후 기본 관리자 또는 역할을 재정의해야 하는 AWS 환경 변수를 설정한다. 그 이후 기본 사용자 설정을 덮어 썼는지 확인하려면 다음 명령을 실행한다.  

aws sts get-caller-identity

rbac-user가 Arn에 정상적으로 표시되어 pod를 가져오는 요청을 수행해 본다.

kubectl get pods -n rbac-test

위에서 발생하는 오류는 사용자를 생성 이후 해당 사용자에게 클러스터의 리소스에 대한 액세스 권한이 부여되지 않았기 때문이다. 이를 위해 rbac-user를 해당 역할에 바인딩해야 한다.

 

ㅁ Create the Role and Binding

 

우선적으로 기존 rbac-user 에 정의된 환경 변수를 unset 한다.

 

unset AWS_SECRET_ACCESS_KEY
unset AWS_ACCESS_KEY_ID

  다시 Admin이고 더 이상 rbac-user가 아님을 확인한다.

aws sts get-caller-identity

 

다시 관리자로서 pod-reader라는 Role을 만든다.  pod 및 deployment에 대한 list, get, watch 액세스를 제공하는 role을 만든다. 적용되는 namespace는 rbac-test이다.

 

cat << EoF > rbacuser-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: rbac-test
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["list","get","watch"]
- apiGroups: ["extensions","apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch"]
EoF

User와 Role을 바인딩한다.

cat << EoF > rbacuser-role-binding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: rbac-test
subjects:
- kind: User
  name: rbac-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
EoF

Role과 Role Binding을 적용한다.

kubectl apply -f rbacuser-role.yaml
kubectl apply -f rbacuser-role-binding.yaml

ㅁ Verify the role and binding

 

rbac-user로 다시 전환하고. 테스트 진행

. rbacuser_creds.sh; aws sts get-caller-identity

이제 kubect get pods 명령어로 권한 확인을 해 본다.

 

kubectl get pods -n rbac-test

다른 namespace에는 권한이 없는지 확인한다.

동일한 요청에 대해 admin에서는 kube-system namespaced에 대한 조회가 되나 rbac-user에서는 조회가 안되는 것을 볼 수 있다.

 

ㅁ cleanup script

 

unset AWS_SECRET_ACCESS_KEY
unset AWS_ACCESS_KEY_ID
kubectl delete namespace rbac-test
rm rbacuser_creds.sh
rm rbacuser-role.yaml
rm rbacuser-role-binding.yaml
aws iam delete-access-key --user-name=rbac-user --access-key-id=$(jq -r .AccessKey.AccessKeyId /tmp/create_output.json)
aws iam delete-user --user-name rbac-user
rm /tmp/create_output.json

기존 aws-auth.ayml 에서 아래 내용을 편집하여 적용한다.

 

data:
  mapUsers: |
    []

 

그 이후 ConfigMap을 다시 적용하고 aws-auth.yaml 파일을 삭제한다.

kubectl apply -f aws-auth.yaml
rm aws-auth.yaml