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」によってサブジェクトと関連付けることでアクセス制御を行います。
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を作成します。