본문 바로가기

DevOps/쿠버네티스

쿠버네티스 RBAC(Role-based Access Control) 상세 설명 및 예제


RBAC는 enterprise 쿠버네티스 환경에서 node 혹은 네트워크 리소스를 접근할때 role을 부여하는 작업이다.


특징

  • RBAC는 rbac.authorization.k8s.io API를 사용
  • k8s 1.8부터 RBAC mode가 stable함
  • RBAC 활성화를 위해 --authorization-mode=RBAC 설정 필요

API 살펴보기

Role and ClusterRole

Role은 쉽게말하면 권한 모음이다. 직관적으로 어떤어떤 권한을 부여 가능.

ClusterRole은 Role과 비슷하지만 cluster기반 권한 부여이므로, node, endpoint, 모든 namespace에 대한 권한 셋팅 가능


example : default라는 이름의 namespace에 pod 읽기권한(get, watch, list)을 부여하여 "pod-reader"라고 정의함

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]



example : cluster의 secret에 대한 읽기권한을 부여하고, "secret-reader"라고 정의함

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # "namespace" omitted since ClusterRoles are not namespaced
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

RoleBinding and ClusterRoleBinding

RoleBinding은 유저, 혹은 팀단위의 권한 부여기능을 담당한다. ClusterRoleBinding은 클러스터 단위의 권한부여.


example : jane이라는 user에게 "pod-reader" 권한을 부여함

# This role binding allows "jane" to read pods in the "default" namespace.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role #this must be Role or ClusterRole
  name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io


example : manager Group에게 "secret-reader" 권한을 부여함

# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io


k8s api 호출 권한

GET /api/v1/namespaces/{namespace}/pods/{name}/log


상기와 같은 k8s api를 호출시에 RBAC role에 의해서 접근이 불가할 때가 있다. 아래와 같이 오류가 나타나기 마련..


끔찍한 k8s api 호출 error example - jenkins에서 pod에 대한 정보를 요청할 때 RBAC role에 막혔다!


WARNING: Failed to count the # of live instances on Kubernetes
io.fabric8.kubernetes.client.KubernetesClientException: Failure executing: GET 
at: https://kubernetes.default/api/v1/namespaces/jenkins/pods. 
Message: Forbidden!Configured service account doesn't have access. 
Service account may have been revoked. pods is forbidden: 
User "system:serviceaccount:jenkins:default" cannot list pods in the namespace "jenkins": 
Unknown user "system:serviceaccount:jenkins:default".


아래와 같이 pod(resource), log(subresource of pods)에 대한 권한을 추가해야한다

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-and-pod-logs-reader
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list"]


End of Document