본문 바로가기

⭐ Kubernetes & EKS/RBAC (Role-Based Access Control)

쿠버네티스 RBAC 개요 및 예제 실습

RBAC.drawio
0.00MB

# RBAC 개념도

# 쿠버네티스 RBAC 이란?

쿠버네티스의 RBAC(Role-Based Access Control)은 역할(Role) 기반 쿠버네티스 시스템의 권한을 관리 한다. 특정 사용자(User)와 역할(Role) 두가지를 조합하여 사용자에게 접근 권한을 부여한다.

 

# 쿠버네티스 롤바인딩(rolebinding) 이란?

롤은 특정 API나 리소스(pod,deploy 등), 사용 권한(get, edit 등)을 매니페스트 파일에 명시해둔 규칙의 집합며, 특정 네임스페이스에 대한 권한을 관리한다. 롤바인딩은 위에 설명한 롤과 특정 사용자를 묶어주는 역할을 수행, 지정한 사용자들에 한해서 롤에 명시한 규칙들을 기준으로 권한을 사용할 수 있도록 권한을 부여 및 관리한다.

예로, 운영팀에게 운영 전용 네임스페이스를 따로 만들어주고, 운영 전용 네임스페이스만을 컨트롤할 수 있는 계정을 부여할 수 다.

또는 운영 전용 네임스페이스에서 get을 사용한 조회만이 가능한 계정을 부여하는것도 가능하다.

 

# 롤바인딩 구성

예제 디플로이 먼트 생성

vim rbac-test.yaml
# 아래내용 입력 후 저장
kubectl apply -f rbac-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment
  labels:
    app: test-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test-deployment
  template:
    metadata:
      labels:
        app: test-deployment
    spec:
      containers:
      - name: test-deployment
        image: nginx:1.7.9
        ports:
        - containerPort: 80

룰 생성

간단한 롤을 구성한 파일 이며 apply 진행. 참고로 이후에 설정할 롤바인딩은 롤의 name을 참조하여 사용.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: role-dev
rules:
- apiGroups: ["", "apps"]
  resources: ["pods", "deployments"]
  verbs: ["get", "list", "edit"]

rules 옵션설명 확인은 더보기 클릭하여 확인

더보기

apiGroups → 사용할 api들을 명시한다. 쿠버네티스 특정 버전 이상부터는 각각의 resources 들을 사용하기 위한 api를 모두지정 해야함. 위의 코드에서 deployments를 사용하기 위해선 apps api가 필요하고, resources → pod, deployment과 같은 resources를 나타낸다.
verbs → get, edit, list와 같은 verbs를 나타낸다. list가 없으면 api와 resource를 읽어오지 못해 에러가 발생한다.

나머지 정보는 쿠버네티스 인 액션 책에서 참고하면 된다.

사용자 생성

우선 아래 코드를 이용하여 ServiceAccount를 생성한다.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dev01
  namespace: default

토큰값 확인

위에서 생성한 서비스 어카운트의 토큰 값을 확인하고 가져올수 있다.

시크릿 확인

kubectl get secret
kubectl get secret
NAME                  TYPE                                  DATA   AGE
db-user-pass          Opaque                                2      18h
default-token-x7vbj   kubernetes.io/service-account-token   3      5d17h
dev01-token-9rvqc     kubernetes.io/service-account-token   3      15h

생성한 계정의 토큰값을 확인

kubectl describe secret <계정 어카운트>
kubectl describe secret dev01-token-9rvqc
Name:         dev01-token-9rvqc
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dev01
              kubernetes.io/service-account.uid: fb7ad5c8-3e1c-4780-a2ed-4712334566

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlhBZ0lQRFQwQ1UifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRldjAxLXRva2VuLTlydnFjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRldjAxIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZmI3YWQ1YzgtM2UxYy00NzgwLWEyZWQtNDdhNmVlOWU2ZDg5Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6ZGV2MDEifQ.m-Ll4aMFzQnjrKiPrE6ymAHQPBaW0vcIot41KShrOI2ksoYphU5SD2Zfpf5oduke9Fdi8PZca127kFrF73rx5Md8XwrrXWFbf7AYFA3xyFdppk8co3IKcHwAvSCJzutNGLU7mItMEG_j2gJFaoLRL-6k9MOSmPXQlI34rEltOEh64PlJT2NMx08WtP26SQvPVm4aJEMNZuXUgeaX_oJE2txsAKiwSBM6PyW4p6kqz1KaNSme-VHQfdK4hApyB3W9hG1wWjiERrTMPFGe877wVA7njVj2aIWs6iLJvo7ozmG7sd_ezDCsnSpipVIl1RoBkUY7ZoGIccY7H8XNk7idNw

참고! : 해당 내용은 모두 $HOME_DIR/.kube/config 파일에 입력되며 해당 파일에서 직접 추가,수정,삭제를 해도 된다.

위의 과정이 모두 완료되면 아래의 명령어를 통해서 사용자 생성을 이어서 진행한다.

# kubectl config set-credentials [생성할 계정명] --token=[확인한 secret token 값]
kubectl config set-credentials dev01 --token=eyJhb~~

# 아래 명령어 입력 후 클러스터명을 확인
kubectl config get-clusters

# kubectl config set-context [생성할 context명] --cluster=[확인한 클러스터명] --user=[위에서 생성한 계정명]
kubectl config set-context dev-user --cluster=cluster.local --user=dev01

## 참고 : 삭제 명령은 kubectl config delete-context [context명]

롤 바인딩 생성

롤바인딩 구성 파일 이며 subjects는 위에서 만든 사용자 계정, roleRef는 위에서 만든 룰을 참조. apply 해준다.

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dev-rolebinding
  namespace: default
subjects:
- kind: ServiceAccount
  name: dev01
  apiGroup: ""
roleRef:
  kind: Role
  name: role-dev
  apiGroup: rbac.authorization.k8s.io

context 전환 및 롤바인딩 확인

위에서 생성했던 context 으로 전환.

# 사용 가능한 context 확인
kubectl config get-contexts

# dev-user context로 전환
# kubectl config use-context [변경할 context]
kubectl config use-context dev-user

# 현재 사용중인 context 확인
kubectl config current-context

이제 role-dev.yaml 에서 입력했던 get, edit와 pods, deployment는 정상적으로 사용할 수 있지만 scale 기능은 사용이 불가능하다.

마지막으로, 해당 context는 권한이 한정되어 있으므로  다시 원래의 context로 전환 해주셔야 정상적인 이용이 가능 하다.

# 사용 가능한 context 확인
kubectl config get-contexts

# dev-user context로 전환
# kubectl config use-context [변경할 context]
kubectl config use-context kubernetes-admin@cluster

# 현재 사용중인 context 확인
kubectl config current-context

# 최종적으로 Role 맵핑을 정리한 Worflow

RBAC.drawio
0.00MB

# 참고 사이트

https://nirsa.tistory.com/154

 

[Kubernetes] 쿠버네티스 RBAC-롤바인딩(rolebinding) 개념 및 설정

쿠버네티스 RBAC 이란? 쿠버네티스의 RBAC(Role-Based Access Control)은 역할(Role) 기반으로 쿠버네티스 시스템의 권한을 관리 합니다. 특정 사용자(User)와 역할(Role) 두가지를 조합하여 사용자에게 특정

nirsa.tistory.com