Kubernetes RBAC

Kubernetes で利用可能な認可方式はいくつか存在しますが、現在は主にRBACが利用されています。RBACとは、誰にどのリソースに対してどのような操作を許可するかを制御する方法です。Kubernetes におけるRBACは、以下の3つの要素をもとにアクセス制御を行います。

  • サブジェクト (subjects):User・Group・ServiceAccountといったアクセスの主体
  • 操作 (verbs):作成・取得・更新・削除といった操作の内容
  • リソース (resources):Pod・Deployments・Service等の操作対象となるリソース

Kubernetesでは、操作 (verbs) と リソース (resources) を「Role」というオブジェクトで管理し、サブジェクトに該当する UserやGroup、ServiceAccount との関連付けを「RoleBinding」というオブジェクトで管理します。

どのリソースにどのような操作を許可するのかを定めた「Role」を作成し、「RoleBinding」によってサブジェクトと関連付けることでアクセス制御を行います。

  • RBACの概要

namespaceに適用する場合は「Role」と「RoleBinding」、クラスタ全体に適用する場合は「CluserRole」と「ClusterRoleBinding」というオブジェクトを利用します。

RoleやClusterRoleを作成する際は、以下のような設定値を使用します。

設定値 内容
create 作成
get 取得
list 一覧取得
update 更新
patch 一部更新
watch 変更を監視
delete 削除
deletecollection 一括削除

なお、ClusterRoleにはデフォルトで以下のような汎用ロールが用意されており、これらを利用してRBACの設定を行うことも可能です。

汎用ロール 内容
cluster-admin クラスタの全リソースを操作可能
admin Namespace内にRoleとRoleBindingを作成する機能を含め、Namespaceのほとんどのリソースへの読み取り/書き込みが可能
edit Namespace内のほとんどのオブジェクトへの読み取り/書き込みが可能。RoleやRoleBindingの書き込みは不可
view Namespace内のほとんどのオブジェクトを表示するための読み取りが可能。RoleやRoleBinding、Secretの読み取りは不可

以下では、マニフェストを作成してRBACを設定する例を示します。

RoleとRoleBindingによる設定例

Roleの設定



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

RoleBindingの設定



apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: sample-rolebinding
  namespace: default
subjects:
- kind: User
  name: bob 
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: sample-role
  apiGroup: rbac.authorization.k8s.io

defaultのNamespaceにおいて、podsの取得 (get)、一覧取得 (list)、変更を監視 (watch) ができる「sample-role」というRoleを作成し、「sample-rolebinding」というRoleBindingで、ユーザー(bob)に対して「sample-role」 をひもづけています。これによって、bobがdefaultのNamespaceのPodに対して上記の操作ができるようになります。

以下で実際に設定を試してみます。最初、bobというユーザーで defaultのNamespaceに対してPodを取得しようとすると、権限がないためエラーとなります。


$ kubectl get pods --namespace=default
Error from server (Forbidden): pods is forbidden: User "bob" cannot list resource "pods" in API group "" in the namespace "default"

ここで、RoleやRoleBindingの作成権限を持つユーザーで、先ほどのRoleとRoleBindingを作成します。