KubernetesのRBACについて


RBACとは

RBAC(Role-based access control)とは、役割ベースのアクセス制御機能。

RBACリソースは4つのリソースがある。RoleリソースとClusterRoleリソースとRoleBindingリソースとClusterRoleBindingリソース。



  • RoleClusterRoleは、どのリソースにどんな操作を許可するかを定義するためのリソース


  • RoleBindingClusterRoleBindingはどのRole/ClusterRoleをどのUserServiceAcctountに紐付けるかを定義するためのリソース。




リソース、操作とは


  • リソースとは


    • Kubernetesのリソースを指す。例えばPod, Deployment, Service, Secret etc..



  • 操作とは


    • get, create, update, delete, list, watch, deletecollection などがある。




操作の一覧

種別
内容

*
全ての処理

create
作成

delete
削除

get
取得

list
一覧取得

update
更新

patch
一部変更

watch
変更の追従


RoleとClusterRoleの違い、そしてRoleBindingとClusterRoleBindingの違い

RoleとClusterRoleの違い、そしてRoleBindingとClusterRoleBindingの違いは、Role/RoleBindingは特定のnamespaceに属するが、ClusterRole/ClusterRoleBindingはnamespaceに属さない(cluster-level resource)

namespaceに属する
namespaceに属さない

Role

Cluster Role

RoleBinding

ClusterRoleBinding


デフォルトで用意されているClusterRole

ClusterRoleにはいくつかデフォルトClusterRoleが用意されている。そのためざっくりとした権限でいい場合は新規でRoleやClusterRoleを作成せずにデフォルトClusterRoleを使うことができる。(参考)

デフォルトClusterRole名
内容

cluster-admin
全てのリソースに対しどんなアクションでも可能。
ClusterRoleBindingを使うと、clusterの全てのリソースにたいしてどんなアクションでも可能になる。
RoleBindingを使うとそのnamespaceの全てのリソースにたいしてどんなアクションでも可能になる(namaspaceリソース含む)。

admin
RoleBindingを使ってbindingがされることを期待されているClusterRole。
namespace内のほとのどのリソースに対してread/writeができる。
またそのnamespace内のRole/RoleBindingリソースのwrite権限も有する。
しかしResourceQuotaとnamespace自身にはwriteできない。

edit
ほとんどのリソースのread writeができるが、Role/RoleBindingのreadやwriteはできない

view
ほとんどのリソースのread ができるが、Role/RoleBinding、そしてSecretのreadはできない


ClusterRole Aggregation

Kubernetes1.9以降、ClusterRoleに限り複数のClusterRoleの定義を読みこむAggregationの機能が使えます。

AggregationはClusterRoleに設定されているラベルを元に行われ、集約する側のClusterRoleに書かれているルールには反映されません。

詳しくはこちら


RoleとRoleBindingの作成例


Roleを作成

以下はServiceリソースをget, listできる権限を表したRole


my-reader-role.yaml

apiVersion: rbac.authorization.k8s.io/v1

kind: Role
metadata:
namespace: hoge-ns
name: service-reader-role
rules:
- apiGroups:
- apps
- extensions
resources:
- deployments
- services
verbs:
- "get"
- "list"

$ kubectl create -f my-reader-role.yaml でRoleを作成


RoleBindingを作成

Role: my-reader-roleをServiceAccount: my-app-saに紐付けるためのRoleBinding


my-reader-rolebinding.yaml

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding
metadata:
name: service-reader-rolebinding
namespace: hoge-ns
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: my-reader-role
subjects:
- kind: ServiceAccount
name: default
namespace: hoge-ns

$ kubectl create -f my-reader-rolebinding.yaml で RoleBinding を作成


ServiceAccountについて


  • ServiceAccount は Kubernetes 内で Pod の認証認可のために使用されるもの

  • podは作成時になにかしらのServiceAccountに紐付けられる

  • ServiceAccountに対してRoleを紐付ける(bindする)ことができる

  • ServiceAccountはどのnamespaceに属するかの情報、及びAPIへ接続するための認証情報をもっている。namespaceca.crttokenの3つ。


  • namespaceを1つ作るとdefaultという名前のServiceAccountが自動的に作成される。

  • Kubernetesクラスタを作るとdefaultというnamespaceが自動で作成されるが、そのnamespaceに属するdefaultという名前のServiceAccountも自動で作成される。podを作成すると紐付けるServiceAccountに指定がなければdefaultのServiceAccountが紐付けられる。


  • defaultのServiceAccount以外にも新しくServiceAccountを手動で作成することができ、podに紐付けることができる


    • たとえばWebアプリケーション用のServiceAccountを作成し、そのWebアプリケーション用Podに作成したServiceAccountを紐付け、そのServiceAccountにKubernetesリソースの参照のみを許可することができる。




その他Tips


  • どんな時にRole/RoleBindingとClusterRole/ClusterRoleBindingを使えばいいかは以下を参考にすればよい

アクセス制限対象
Role種類
Binding種類

Cluster-level resources (Nodes, PersistentVolumes, ...)
ClusterRole
ClusterRoleBinding

Non-resource URLs (/api, /healthz, ...)
ClusterRole
ClusterRoleBinding

いくつかのnamespace、もしくは全てのnamaespaceに存在するNamespaced resources
ClusterRole
ClusterRoleBinding

特定のnamaspaceに存在するNamespaced resources。(共通のRoleを使いたい場合)
ClusterRole
RoleBinding

特定のnamaspaceに存在するNamespaced resources。(namespaceごとにRoleを定義する場合)
Role
RoleBinding


  • kubectl auth can-iを使うと権限が設定されているか、操作が許可されているかを確認することができる。

    例えばhoge-nsというnamespaceにあるdefaultという名前のservice accountがserviceのcreateすることを許可されているかどうかは以下のコマンドで確認できる。

    $ kubectl auth can-i create services --as=system:serviceaccount:hoge-ns:default -n=hoge-ns


  • namespace: kube-systemのRole一覧

    $ kubectl get roles -n=kube-system


  • namespace: kube-systemのClusterRole一覧

    $ kubectl get clusterroles -n=kube-system


  • もしminikube上でRBACを有効にしたい場合は、minikube起動時に、--extra-config=apiserver.Authorization.Mode=RBACを指定する必要がある。


参考: