Kubernetes RBAC

Kubernetes RBAC(Role-Based Access Control)은 Kubernetes 클러스터 내의 사용자, 그룹, 서비스 계정, 그리고 그들이 수행할 수 있는 작업을 제어하는 접근 제어 메커니즘입니다. RBAC은 Kubernetes에서 자원을 보호하고 각 사용자가 자신의 역할에 맞는 권한만을 갖도록 하여 보안을 강화합니다. 이를 위해 RBAC는 권한을 세밀하게 나누고, 사용자 또는 서비스가 클러스터에서 할 수 있는 작업을 정의합니다.

Kubernetes RBAC은 주로 ClusterRole/Role을 구성하고 ClusterRoleBinding/RoleBinding 통해 사용자나 그룹, 서비스 계정을 특정 Role이나 ClusterRole에 바인딩하여 권한을 할당합니다. ClusterRole/Role은 여러 Rule로 구성을 할 수 있고, 각 Rule은 apiGroups, resources, verbs로 구성됩니다. ClusterRoleBinding/RoleBinding은 여러 Subjects와 ClusterRole/Role을 참조하는 RoleRef로 구성됩니다. 각각에 대해 자세히 알아보도록 하겠습니다.

1. ClusterRole/Role

ClusterRole

  • ClusterRole은 네임스페이스에 관계없이 클러스터 전역에서 적용되는 권한을 정의합니다. ClusterRole은 네임스페이스 리소스뿐만 아니라 클러스터 전역 리소스(nodes, persistentvolumes 등)에 대한 권한을 설정하는 데도 사용됩니다.

  • 클러스터 수준에서의 작업이나 네임스페이스 간 접근이 필요할 때 ClusterRole을 사용할 수 있습니다.

apiVersion: rbac.authorization.k8s.io/
kind: ClusterRole
metadata:
  name: node-reader
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "list"]

Role

  • Role은 특정 네임스페이스 내에서 어떤 리소스에 대해 어떤 동작을 수행할 수 있는지를 정의합니다. 네임스페이스 단위로 권한을 관리하며, 특정 네임스페이스의 리소스에만 접근할 수 있습니다.

  • Role은 주로 pods, services, configmaps 같은 네임스페이스 내의 리소스에 대한 권한을 설정하는 데 사용됩니다.

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

2. ClusterRoleBinding/RoleBinding

ClusterRoleBinding

  • ClusterRoleBindingClusterRole을 특정 사용자나 그룹, 서비스 계정에 바인딩하여 클러스터 전역에서 그들에게 역할을 부여합니다. 네임스페이스 간에 일관된 권한이 필요하거나, 클러스터 수준에서 리소스 접근을 제어할 때 사용됩니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-nodes
subjects:
- kind: User
  name: admin
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: node-reader
  apiGroup: rbac.authorization.k8s.io

RoleBinding

  • RoleBindingRole을 특정 사용자, 그룹, 서비스 계정에 바인딩(할당)하여 그들에게 역할을 부여합니다. 이것은 특정 네임스페이스 내에서만 유효합니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

3. Subjects/Rules/Verbs

Subjects (주체)

Subjects는 RBAC에서 권한을 할당받는 대상입니다. 주체는 세 가지 종류가 있습니다:

  1. User: 실제 클러스터 외부에서 인증된 사용자.

  2. Group: 사용자들이 포함된 그룹.

  3. ServiceAccount: 네임스페이스 안에 있는 서비스 계정으로, 주로 애플리케이션이나 파드가 클러스터 리소스에 접근할 때 사용됩니다.

subjects:
- kind: User          # 실제 사용자
  name: alice         # 사용자 이름
- kind: Group         # 그룹
  name: system:admins # 그룹 이름
- kind: ServiceAccount
  name: my-app        # 서비스 계정 이름
  namespace: default  # 서비스 계정이 속한 네임스페이스

Rules (규칙)

Rules는 어떤 apiGroups에서 어떤 resource Object에 대해 어떤 동작을 할 수 있는지를 정의하게 됩니다.

  • apiGroups: 대상 리소스가 속한 API 그룹을 정의합니다. core API 그룹의 리소스(pods, services 등)은 빈 문자열 ""로 표기합니다.

  • resources: 리소스의 종류를 정의합니다. 예를 들어 pods, services, configmaps 등이 있습니다.

  • verbs: 리소스에 대해 수행할 수 있는 동작을 정의합니다. get, list, create, update, delete 등이 있습니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: node-reader
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "list"]

Verbs (동작)

  • verbs는 리소스에 대해 수행할 수 있는 동작을 지정합니다.

    • get: 특정 리소스의 세부 정보를 조회.

    • list: 여러 리소스 목록을 조회.

    • watch: 리소스의 상태 변화를 감시.

    • create: 새로운 리소스를 생성.

    • update: 기존 리소스를 수정.

    • patch: 기존 리소스의 일부를 수정.

    • delete: 리소스를 삭제.

    • bind: 클러스터 수준에서 사용하는 동작으로, PersistentVolumeClaim에 대해 볼륨을 바인딩하는 권한.

Inheritance of authority(권한의 상속)

Kubernetes RBAC에서는 권한 상속이 존재하지 않습니다. 예를 들어, create 권한이 있다고 해서 자동으로 update 권한을 갖게 되는 것이 아닙니다. 각각의 verb에 대해 명시적으로 권한을 부여해야 합니다.

이렇게 구성한 의도는 보안 사고를 예방하고, 세밀하게 권한을 관리하기 위해서 입니다.

Last updated