RBAC

RBAC (Role-based Access Control) 는 쿠버네티스 환경에서 Node 또는 네트워크 리소스 등 여러가지 접근 권한에 대한 Role 관리하는 작업 요소 이다.

RBAC는 rbac.authorization.k8s.io API를 사용하며, K8s 1.8 이상부터 RBAC Mode가 Stable 한다.

또한, RBAC 활성화를 위한 --authorization-mode=RBAC 설정이 필요하다.


Role & ClusterRle

Role : Default 라는 Namespace 에  모든 Pod의 읽기권한(get, watch, list)을 설정하고 pod-read 라고 정의 함.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadate:
  namespaces: default
  name: pod-read
rules:
 - apiGroups: [""] // "" 는 Core API Group 을 나타냄.
   resources: ["pods"]
   verbs: ["get", "watch", "list"]

ClusterRole : Cluster 의 Secret 정보에 대한 읽기 권한을 설정하고 secret-read 라고 정의함. (Node, Endpoint, Namespace, Service 등 모든 권한 설정)

ClusterRole은 namespace 영역이 아니기 때문에 생략된다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-read
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]


Sample (admin-manager.yaml)

apiVersion: rbac.authorization.k8s.io/v1
kind: ServiceAccount
metadata:
  name: admin-manager
  namespace: kube-system

1

RoleBinding & ClusterRoleBinding

RoleBinding 은 User, Team 단위의 권한 부여 기능이며, ClusterRoleBinding은 클러스터 단위의 권한 부여 기능을 나타낸다.

RoleBinding : Reference 라는 User 에게 Pod-read 권한 설정. 즉, Reference 라는 User는 Namespace가 Default인 모든 Pod을 읽기가 가능함.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: reference
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role // Role & ClusterRole 적용.
  name: pod-reader // 바이드할 Role & ClusterRole 이름과 일치해야 함.
  apiGroup: rbac.authorization.k8s.io

ClusterRoleBinding : ManagerGroup 에게 Secret-Read 권한 설정. 즉, Manager-Group 의 모든 사용자가 모든 Namespace에서  Secret 을 읽을 수 있음.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager-group
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole // Role & ClusterRole 적용
  name: secret-read // 바이드할 Role & ClusterRole 이름과 일치해야 함.
  apiGroup: rbac.authorization.k8s.io


Sample (admin-rolebinding.yaml)

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-manager
subjects:
- kind: ServiceAccount
  name: admin-manager
  namespcae: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin


K8s API 호출 권한

K8s api 호출시 RBAC role 에 의한 접근 불가 오류 메세지 출력되면

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

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

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)에 대한 권한을 추가해야한다

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




ABAC

속성 기반 액세스 제어 (ABAC)는 속성을 함께 결합하는 정책을 사용하여 사용자에게 액세스 권한을 부여하는 액세스 제어 패러다임을 정의한다.


파일 정책 형식

ABAC 모드의 경우 --authorization-policy-file = SOME_FILENAME도 지정하며, 파일 형식은 한 줄에 하나의 JSON 객체이다.


  • No labels
Write a comment…