Container/Kubernetes

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

Nirsa 2020. 3. 5. 02:35
반응형

 

  • 쿠버네티스 RBAC 이란?

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

 

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

롤은 특정 API나 리소스(pod,deploy 등), 사용 권한(get, edit 등)을 매니페스트 파일에 명시해둔 규칙의 집합이 되며 특정 네임스페이스에 대한 권한을 관리 합니다.

롤바인딩은 위에 설명한 롤과 특정 사용자를 묶어주는 역할을 수행하고, 지정한 사용자들에 한해서 롤에 명시한 규칙들을 기준으로 권한을 사용할 수 있도록 권한을 관리 해줍니다.

예를들어 개발팀에게는 개발 전용 네임스페이스를 따로 만들어주고, 개발 전용 네임스페이스만을 컨트롤할 수 있는 계정을 부여하는 등의 일이 가능 해집니다. 또는 개발 전용 네임스페이스에서 get을 사용한 조회만이 가능한 계정을 부여할수도 있습니다.

 

  • 롤바인딩 구성

우선 롤바인딩을 구성하기 전에 원활한 테스트를 위해 간단한 디플로이먼트를 생성 하겠습니다. 없으신분들은 아래 코드를 복붙하여 kubectl apply -f [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

 

  • 1. 룰 생성

간단한 롤을 구성한 파일 이며 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"]
  • apiGroups → 사용할 api들을 명시 합니다. 쿠버네티스 특정 버전 이상부터는 각각의 resources 들을 사용하기 위한 api를 모두 지정해주어야 한다고 합니다. 위의 코드에서 deployments를 사용하기 위해선 apps api가 필요 합니다.
  • resources → pod, deployment과 같은 resources를 명시 합니다.
  • verbs → get, edit, list와 같은 verbs를 명시 합니다. list가 없으면 api와 resource를 읽어오지 못해 에러가 발생 합니다.

 

  • 2. 사용자 생성

우선 아래 코드를 이용하여 ServiceAccount를 생성 후 apply 합니다.

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

 

이후 아래 과정을 거쳐서 생성한 ServiceAccount의 secret token 값을 가져옵니다.

 

위 사진의 경우 token: 바로 앞인 eyJhb~~ 부분부터 복사 후 아래 명령어를 입력 합니다. 참고로 아래 명령어는 모두 $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명]

 

  • 3. 롤바인딩 생성

롤바인딩 구성 파일 이며 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.local

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

 

반응형