【Kubernetes】ロールを理解する

はじめに

Kubernetesでのリソースへのアクセス制御まわりをざっくりまとめて、実際に動かしてみます。

RBAC(Role Based Access Control)とは

RBAC(Role Based Access Control)とは、Kubernetesのリソースへのアクセスをロールにより制御するための方法です。

ユーザーにロールを付与することでリソースへのアクセスを許可させます。

RoleとClusterRole

RBACには下記2つのロールがあります。

リソース説明
Role特定のnamespaceでの権限を設定
ClusterRoleクラスタ全体での権限を設定

権限は追加方式であり、拒否する権限はありません。

RoleBindingとClusterRoleBinding

~Bindingがロールとの紐付けを行います。RoleとClusterRoleそれぞれ以下のようになります。

リソース説明
RoleBindingユーザー・グループ・ServiceAccountとRoleを紐づける
ClusterRoleBindingユーザー・グループ・ServiceAccountとClusterRoleを紐づける

Roleを付与してみる

まずはRoleのマニフェストrole.ymlを用意します。

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

次にRoleを紐づけるためのRoleBindingのマニフェストrolebinding.ymlを作成します。

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-role
  namespace: default # 付与するnamespace
subjects:
- kind: User # ユーザーかグループかServiceAccountか
  name: masa # ユーザー名
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader-role # Role名
  apiGroup: rbac.authorization.k8s.io

それぞれのマニフェストを反映させます。

❯ kubectl apply -f role.yml
role.rbac.authorization.k8s.io/pod-reader-role created

❯ kubectl apply -f rolebinding.yml
rolebinding.rbac.authorization.k8s.io/read-pods-role created

RoleBindingを確認すると紐づけられていることが確認できます。

❯ kubectl describe rolebinding read-pods-role
Name:         read-pods-role
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  Role
  Name:  pod-reader-role
Subjects:
  Kind  Name  Namespace
  ----  ----  ---------
  User  masa

ClusterRoleを付与してみる

ClusterRoleも実際に付与してみます。
基本的にやることはRoleと同じです。

まずはClusterRoleのマニフェストclusterrole.ymlを用意します。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader-clusterrole # ClusterRole名
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

次にClusterRoleを紐づけるためのClusterRoleBindingのマニフェストclusterrolebinding.ymlを作成します。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-secrets-global-clusterrole
subjects:
- kind: User # ユーザーかグループかServiceAccountか
  name: masa # ユーザー名
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader-clusterrole # ClusterRole名
  apiGroup: rbac.authorization.k8s.io

それぞれのマニフェストを反映させます。

❯ kubectl apply -f clusterrole.yml
clusterrole.rbac.authorization.k8s.io/secret-reader-clusterrole created

❯ kubectl apply -f clusterrolebinding.yml
clusterrolebinding.rbac.authorization.k8s.io/read-secrets-global-clusterrole created

ClusterRoleBindingを確認すると紐づけられていることが確認できます。

❯ kubectl describe clusterrolebinding read-secrets-global-clusterrole
Name:         read-secrets-global-clusterrole
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  secret-reader-clusterrole
Subjects:
  Kind  Name  Namespace
  ----  ----  ---------
  User  masa

まとめ

  • ロールはRoleとClusterRole
  • ロールの紐付けはRoleBindingとClusterRoleBinding

参考

タイトルとURLをコピーしました