[CKA] RBAC

RBAC의 핵심 개념과 구성 방법, 실습 풀이를 정리합니다.

역할 개체를 통해 역할을 생성합니다.

각 규칙은 3가지 섹션으로 구성됩니다.

API 그룹, 리소스, 작업으로 구성되며 apiGroups는 비어둘 수 있습니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["list", "get", "create", "update", "delete"]
  - apiGroups: [""]
    resources: ["ConfigMap"]
    verbs: ["create"]

또한 Role을 생성했다면 유저에게 연결해야 합니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: devuser-developer-binding
subjects:
  - kind: User
    name: dev-user
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer
  apiGroup: rbac.authorization.k8s.io

View RBAC

  1. kubectl get roles
    • 설명: 현재 네임스페이스의 모든 Role을 나열합니다.
  2. kubectl get rolebindings
    • 설명: 현재 네임스페이스의 모든 RoleBinding을 나열합니다.
  3. kubectl describe role developer
    • 설명: ‘developer’ Role의 상세 정보를 보여줍니다. 여기서는 ConfigMap 생성과 pod 리소스에 대한 여러 권한을 확인할 수 있습니다.
  4. kubectl describe rolebinding devuser-developer-binding
    • 설명: ‘devuser-developer-binding’ RoleBinding의 상세 정보를 보여줍니다. 이 바인딩이 ‘dev-user’에게 ‘developer’ Role의 권한을 부여하는 것을 확인할 수 있습니다.

권한 확인.

권한 확인 명령어:

kubectl auth can-i create deployments
kubectl auth can-i delete nodes
kubectl auth can-i create deployments --as dev-user
kubectl auth can-i create pods --as dev-user
kubectl auth can-i create pods --as dev-user --namespace test

설명: 이 명령어들은 현재 사용자 또는 특정 사용자(dev-user)의 다양한 작업 수행 권한을 확인합니다

Role 정의 (developer-role.yaml):

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "create", "update"]
  resourceNames: ["blue", "orange"]
kubectl describe pod kube-apiserver-controlplane --namespace=kube-system

Kubernetes에서 네임스페이스를 지정하지 않으면 기본적으로 현재 컨텍스트의 네임스페이스에 있는 리소스를 대상으로 작업합니다.


어디에 할당되어있는지 확인하기 위해선 rolebinding을 사용합니다

kubectl describe rolebinding kube-proxy -n kube-system

Role 중 developer를 생성합니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["list", "get", "create", "update", "delete"]
  - apiGroups: [""]
    resources: ["ConfigMap"]
    verbs: ["create"]

또한 Role을 생성했다면 유저에게 연결해야 하며 하나의 Role을 여러 유저에게 할당 하거나 그룹으로 관리할 수 있습니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: devuser-developer-binding
subjects:
  - kind: User
    name: dev-user
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer
  apiGroup: rbac.authorization.k8s.io

기존의 Role을 재정의하는 방법

kubectl edit role developer -n blue
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: "2024-09-09T12:30:55Z"
  name: developer
  namespace: blue
  resourceVersion: "609"
  uid: 15749f27-53d0-40ce-982e-32da3591adb3
rules:
- apiGroups:
  - ""
  resourceNames:
  - blue-app
  resources:
  - pods
  verbs:
  - get
  - watch
  - create
  - delete

apiGroups 필드는 Kubernetes API 그룹을 지정하는 중요한 역할을 합니다. 이는 리소스가 속한 API 그룹을 정의하여 해당 리소스에 대한 접근 권한을 더 세밀하게 제어할 수 있게 해줍니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
  namespace: blue
rules:
- apiGroups:
  - apps
  resourceNames:
  - dark-blue-app
  resources:
  - pods
  verbs:
  - get
  - watch
  - create
  - delete
- apiGroups:
  - apps
  resources:
  - deployments
  verbs:
  - create

API Groups에 대한 이해

apiGroups는 사전 정의된 정책처럼 미리 만들어져있다.

  1. 미리 정의된 API 그룹:
    • Kubernetes에서 API 그룹은 이미 정의되어 있습니다.
    • 이는 Kubernetes 시스템의 일부로, 개발자나 관리자가 임의로 새로운 API 그룹을 만들 수 없습니다.
  2. 주요 API 그룹 예시:
    • "" (코어 그룹): pods, services, namespaces 등
    • “apps”: deployments, statefulsets, daemonsets 등
    • “batch”: jobs, cronjobs
    • “networking.k8s.io”: ingresses, networkpolicies
    • “rbac.authorization.k8s.io”: roles, rolebindings, clusterroles, clusterrolebindings
  3. API 그룹 사용:
    • RBAC 규칙을 정의할 때, 이미 존재하는 이 API 그룹들 중에서 선택하여 사용합니다.
    • 각 리소스는 특정 API 그룹에 속해 있으며, 해당 그룹을 통해 접근합니다.
  4. 버전 관리:
    • API 그룹은 또한 버전 관리를 위해 사용됩니다 (예: v1, v1beta1 등).
    • 이를 통해 Kubernetes는 API를 안정적으로 발전시킬 수 있습니다.
  5. 확인 방법:
    • 사용 가능한 API 그룹과 리소스를 확인하려면 다음 명령을 사용할 수 있습니다:

kubectl api-resources
```
- 이 명령은 사용 가능한 모든 리소스와 그들이 속한 API 그룹을 보여줍니다.
따라서, RBAC 규칙을 작성할 때는 이미 Kubernetes에서 정의한 API 그룹 중에서 필요한 것을 선택하여 사용하게 됩니다. 이는 Kubernetes의 구조화된 접근 방식을 반영하며, 리소스 관리와 권한 제어를 체계적으로 할 수 있게 해줍니다.