OpenShift 全部俺 Advent Calendar 2017
よくわかりにくいと言われがちなOpenShift / KubernetesのRBACについて書いてみましょう。RBACは元々OpenShiftで実装され、それを元にKubernetes側へ実装された経緯があり、OpenShiftのclusterrole
というリソースオブジェクトとKubernetesのclusterrole
リソースの短縮名が衝突してしまっています。そのため、OpenShift側ではclusterrole.rbac
という名前でリソースを指定する必要があります。ちなみに省略しないリソース名はそれぞれclusterrole.authorization.openshift.io
とclusterrole.rbac.authorization.k8s.io
です。
さて本題。事前に定義されているロールの一覧はoc get clusterrole.rbac
で取得できます。
$ oc get clusterrole.rbac NAME AGE admin 12d asb-access 12d asb-auth 12d basic-user 12d cluster-admin 12d cluster-debugger 12d cluster-reader 12d cluster-status 12d edit 12d hawkular-metrics-admin 12d management-infra-admin 12d namespace-viewer 12d registry-admin 12d registry-editor 12d registry-viewer 12d sar-creator 12d self-access-reviewer 12d self-provisioner 12d service-catalog-controller 12d servicecatalog-serviceclass-viewer 12d storage-admin 12d sudoer 12d system:auth-delegator 12d system:basic-user 12d system:build-controller 12d system:build-strategy-custom 12d system:build-strategy-docker 12d system:build-strategy-jenkinspipeline 12d system:build-strategy-source 12d system:certificate-signing-controller 12d system:controller:attachdetach-controller 12d system:controller:certificate-controller 12d system:controller:cronjob-controller 12d system:controller:daemon-set-controller 12d system:controller:deployment-controller 12d system:controller:disruption-controller 12d system:controller:endpoint-controller 12d system:controller:generic-garbage-collector 12d system:controller:horizontal-pod-autoscaler 12d system:controller:job-controller 12d system:controller:namespace-controller 12d system:controller:node-controller 12d system:controller:persistent-volume-binder 12d system:controller:pod-garbage-collector 12d system:controller:replicaset-controller 12d system:controller:replication-controller 12d system:controller:resourcequota-controller 12d system:controller:route-controller 12d system:controller:service-account-controller 12d system:controller:service-controller 12d system:controller:statefulset-controller 12d system:controller:ttl-controller 12d system:daemonset-controller 12d system:deployer 12d system:deployment-controller 12d system:deploymentconfig-controller 12d system:discovery 12d system:disruption-controller 12d system:endpoint-controller 12d system:garbage-collector-controller 12d system:gc-controller 12d system:heapster 12d system:hpa-controller 12d system:image-auditor 12d system:image-builder 12d system:image-pruner 12d system:image-puller 12d system:image-pusher 12d system:image-signer 12d system:job-controller 12d system:kube-aggregator 12d system:kube-controller-manager 12d system:kube-dns 12d system:kube-scheduler 12d system:master 12d system:namespace-controller 12d system:node 12d system:node-admin 12d system:node-bootstrapper 12d system:node-problem-detector 12d system:node-proxier 12d system:node-reader 12d system:oauth-token-deleter 12d system:openshift:controller:build-config-change-controller 12d system:openshift:controller:build-controller 12d system:openshift:controller:cluster-quota-reconciliation-controller 12d system:openshift:controller:deployer-controller 12d system:openshift:controller:deploymentconfig-controller 12d system:openshift:controller:horizontal-pod-autoscaler 12d system:openshift:controller:image-import-controller 12d system:openshift:controller:image-trigger-controller 12d system:openshift:controller:origin-namespace-controller 12d system:openshift:controller:pv-recycler-controller 12d system:openshift:controller:resourcequota-controller 12d system:openshift:controller:sdn-controller 12d system:openshift:controller:service-ingress-ip-controller 12d system:openshift:controller:service-serving-cert-controller 12d system:openshift:controller:serviceaccount-controller 12d system:openshift:controller:serviceaccount-pull-secrets-controller 12d system:openshift:controller:template-instance-controller 12d system:openshift:controller:template-service-broker 12d system:openshift:controller:unidling-controller 12d system:openshift:templateservicebroker-client 12d system:persistent-volume-provisioner 12d system:registry 12d system:replicaset-controller 12d system:replication-controller 12d system:router 12d system:scope-impersonation 12d system:sdn-manager 12d system:sdn-reader 12d system:statefulset-controller 12d system:webhook 12d view 12d
なんだかすごくいっぱい出てきましたが、system:
とついているものはシステムコンポーネントで利用されているロールで利用者視点では真っ先に無視して構わないものです。除外してみます。
$ oc get clusterrole.rbac | grep -v system: NAME AGE admin 12d asb-access 12d asb-auth 12d basic-user 12d cluster-admin 12d cluster-debugger 12d cluster-reader 12d cluster-status 12d edit 12d hawkular-metrics-admin 12d management-infra-admin 12d namespace-viewer 12d registry-admin 12d registry-editor 12d registry-viewer 12d sar-creator 12d self-access-reviewer 12d self-provisioner 12d service-catalog-controller 12d servicecatalog-serviceclass-viewer 12d storage-admin 12d sudoer 12d view 12d
いくつかまだOpenShiftが利用する目的のロールであり利用者には無関係なロールがあるものの、だいぶすっきりしました。
各ロールが実際に何ができるかはdescribeすればわかります。たとえばnamespace-viewer
はnamespace
オブジェクトのget list watch
が許可されているロールです。
$ oc describe clusterrole.rbac namespace-viewer Name: namespace-viewer Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- namespaces [] [] [get list watch]
カスタムのロールを作るときにResourcesやVerbsに何が指定できるかはoc describe clusterrole.rbac
などで全出力を見ればわかるでしょう。カスタムロールはプロジェクト(namespace)固有のものはrole.rbac
として、クラスタ全体で利用したいロールは管理者権限でclusterrole.rbac
として作成します。
ロールの割り当て状況はoc get clusterrolebinding.rbac -o wide
を確認するとわかります。割り当てられていないロールは非表示となるので注意しましょう。以下system:
を除外した結果です。
$ oc get clusterrolebinding.rbac -o wide | grep -v system: NAME AGE ROLE USERS GROUPS SERVICEACCOUNTS admin 12d admin openshift-infra/template-instance-controller, kube-service-catalog/default, openshift-ansible-service-broker/asb asb-access 12d asb-access openshift-ansible-service-broker/asb-client asb-auth 12d asb-auth openshift-ansible-service-broker/asb hawkular-metrics-admin 12d hawkular-metrics-admin management-infra/management-admin management-infra-admin 12d management-infra-admin management-infra/management-admin service-catalog-controller-binding 12d service-catalog-controller kube-service-catalog/service-catalog-controller service-catalog-controller-namespace-viewer-binding 12d namespace-viewer kube-service-catalog/service-catalog-controller service-catalog-namespace-viewer-binding 12d namespace-viewer kube-service-catalog/service-catalog-apiserver service-catalog-sar-creator-binding 12d sar-creator kube-service-catalog/service-catalog-apiserver
User, Group, Service Accountというのが出てきました。ユーザは一般的なユーザ、およびシステムユーザが含まれます。グループは一般的なグループ、システムグループ、特殊なシステムグループであるバーチャルグループがあります。
system:admin
などのシステムユーザやシステムグループのドキュメントや一覧は用意されていませんが、なんとなく名前で役割はわかると思います。これらはソースコード中にハードコードされているので、oc get user
, oc get group
では表示されず、上記のclusterrolebinding.rbac
の出力が唯一の手掛かりとなります。
system:authenticated
やsystem:unauthenticated
は名前の通り、認証済みユーザ、認証していないユーザを表すバーチャルシステムグループです。これを利用して、例えばsystem:unauthenticated
にregistry-viewer
を付与すると、そのプロジェクトのコンテナイメージは認証なしでpullできる状態となります。
Userは人間が操作するユーザに割り当てるのに対し、Service Account (SA)は、Podに割り当てるユーザです。権限設定が必要なPodや、tokenを抜き出して外部から操作したりといった各種自動化などに利用されます。たとえば各プロジェクトにはdefault
, builder
, deployer
というSAが自動的に作成され、deployer
にはプロジェクトのロールとしてsystem:deployer
が設定されます。これはoc get rolebinding.rbac -o wide
で確認できます。確認するとわかりますが、Podがデフォルトで利用するSAであるdefault
は初期状態ではロールが割り当てられていない一般ユーザとなり、Kubernetes APIへのアクセスは一切できません。
一般的に利用されるロールを軽く説明します。
cluster-admin
- クラスタ管理者権限。一般ユーザに付与するには
oc adm policy add-cluster-role-to-user cluster-admin USERNAME
。
- クラスタ管理者権限。一般ユーザに付与するには
cluster-reader
view
,edit
,admin
registry-viewer
,registry-editor
- プロジェクト内のコンテナイメージのpullおよびpull/push権限。別プロジェクトのSAに付与して利用する。
というわけで、以下の4つさえ押さえておけばRBAC完璧です。