Error rendering WebPanel: No renderer found for resource type: velocity Template contents: <meta name="ajs-keyboardshortcut-hash" content="$keyboardShortcutManager.shortcutsHash">
메타 데이터의 끝으로 건너뛰기
메타 데이터의 시작으로 이동

RBAC이란


역할 기반 접근 제어(role-based access control, RBAC)는 컴퓨터 시스템 보안에서 권한이 있는 사용자들에게 시스템 접근을 통제하는 한 방법이다. [출처:위키백과]

쿠버네티스에서 RBAC은 일반 사용자, 서비스 계정에 권한을 부여한 롤에 따라 리소스에 대한 권한을 제어하는 기능을 제공한다. RBAC을 적절히 사용해 쿠버네티스 리소스의 보안을 확보할 수 있다.

다른 액세스 제어 방법과 비교하여 다음과 같은 장점이 있습니다.

  • 클러스터에서 리소스 및 비리소스 권한을 모두 포함합니다.
  • 전체 RBAC은 여러 API 객체에 의해 수행되며 다른 API 객체와 마찬가지로 kubectl 또는 API로 조작 할 수 있습니다.
  • API Server를 다시 시작하지 않고도 런타임에 조정할 수 있습니다.

User & Role & RoleBinding

[출처 : wiki.shileizcc.com]


1. USER

사용자 개념.

  • User
  • Group
  • ServiceAccount

일반 사용자

  • 클러스터 외부에서 쿠버네티스를 조작하는 사용자
kubectl config view | grep current-context


서비스 계정

  • 쿠버네티스 내부적으로 관리되며 파드가 쿠버네티스 API를 다룰 때 사용하는 사용자


yaml format
apiVersion: v1
kind: ServiceAccount
metadata:
  name: myuser
  namespace: default


2. Role

특정 api나 리소스에 대한 권한들을 명시해둔 규칙들의 집합

Verb

Verb의미
create새로운 리소스 생성
get개별 리소스 조회
list여러건의 리소스 조회
update기존 리소스내용 전체 업데이트
patch기존 리소스중 일부 내용 변경
delete개별 리소스 삭제
deletecollection여러 리소스 삭제


Role

  • 속한 네임스페이스에 한 곳에만 적용

yaml format
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: read-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  resourceNames: [“mypod"]
  verbs: ["get", "list"]


ClusterRole

  • 클러스터 전체 네임스페이스에 적용

yaml format
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-clusterrole
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
  • Grouping 가능
yaml format
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: admin-aggregation
aggregationRule:
  clusterRoleSelectors:
  - matchLabels:
      kubernetes.io/bootstrapping: rbac-defaults
rules: []


3. RoleBinding

롤과 사용자를 묶어(binding)주는 역할

RoleBinding

  • 속한 네임스페이스에 한 곳에만 적용


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


ClusterRoleBinding

  • 클러스터 전체 네임스페이스에 적용


yaml format
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-clusterrolebinding
subjects:
- kind: ServiceAccount
  name: myuser
  namespace: default
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: read-clusterrole
  apiGroup: rbac.authorization.k8s.io


실습

일반 사용자

1. 사용자 생성

> kubectl create serviceaccount myuser


생성 확인

> kubectl get serviceaccount myuser -o yaml

토큰 얻기

시크릿 조회

> kubectl get secret myuser-token-kchkm -o yaml

Base64 디코딩

echo 'ZXlKaGJHY2lPaUpTVXpJ..' | base64 -D


토큰 얻기 2

kubectl -n default describe secret $(kubectl -n default get secret | grep myuser | awk '{print $1}')


2. Role 생성

ClusterRole


read-clusterrole.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-clusterrole
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
kubectl apply -f read-clusterrole.yaml


3. RoleBinding 생성

read-clusterrolebinding.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-clusterrolebinding
subjects:
- kind: ServiceAccount
  name: myuser
  namespace: default
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: read-clusterrole
  apiGroup: rbac.authorization.k8s.io
kubectl apply -f read-clusterrolebinding.yaml


4. 사용자 전환

사용자 인증 토큰 설정

kubectl config set-credentials myuser --token=eyJhbGciOiJSUzI1NiIsImt...

컨텍스트 생성

kubectl config set-context k8s-myuser --cluster=docker-desktop --user=myuser

컨텍스트 전환

kubectl config use-context k8s-myuser

확인

kubectl config get-contexts

5. 권한 테스트

myuser 가 가지고 있는 권한을 사용할 수 있다.

kubectl get pod --all-namespaces

myuser 가 가지고 있지 않은 권한에서는 아래 에러를 뱉어야 하는데

kubectl get deployment --all-namespaces

에러를 뱉지 않는다.


도커로 설치한 쿠버네티스에는 모든 serviceaccount에게 관리자 권한을 부여하는 docker-for-desktop-binding이라는 클러스터롤바인딩이 기본값으로 설정되어 있다.

kubectl describe clusterrolebinding docker-for-desktop-binding


그래서 cluster-admin 을 수정하여 테스트해본다.

admin 사용자로 전환

kubectl config use-context docker-desktop

cluster-admin 수정

kubectl edit clusterrole cluster-admin

myuser 사용자 전환

kubectl config use-context myuser

아래 다시 수행시 권한이 없기 때문에 에러를 뱉는다.

kubectl get deployment --all-namespaces

  • 레이블 없음