はじめに
サービスアカウントにSCC (SECURITY CONTEXT CONSTRAINTS)を付与し、そのサービスアカウントをPodに紐付けることでPodの権限を変えることができます。
具体的にはサービスアカウントを作成後、以下構文でSCCとServiceAccountを指定して紐付けますが
$ oc adm policy add-scc-to-user xx -z yy clusterrole.rbac.authorization.k8s.io/system:openshift:scc:xx added: "yy"
その中にClusterroleという文言が出てきます。本記事ではSCCとClusterroleの関係性について実機ベースで確認します。
環境情報
- OpenShift Container Platform 4
事前準備
OpenshiftではユーザやサービスアカウントがPodが作成/更新できるか否かを確認するためにoc adm policy scc-subject-review
があります。
例えば以下のようにPodの情報をパイプで渡すとそのリソースを作成するために必要なSCCが確認できます。
$ oc get pod test-648947b54f-72dr7 -o=yaml | oc adm policy scc-subject-review -f - RESOURCE ALLOWED BY Pod/test-648947b54f-72dr7 anyuid
anyuidというSCCの詳細は以下で
$ oc get scc anyuid NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP PRIORITY READONLYROOTFS VOLUMES anyuid false <no value> MustRunAs RunAsAny RunAsAny RunAsAny 10 false [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
RunAsAnyということで、コンテナのユーザー指定に制限がないことを意味します。
このSCCをPodに付与すべく、以下のようにサービスアカウントを作成して
$ oc create sa test-sa
以下でClusterRoleに変更を加えます。
$ oc adm policy add-scc-to-user anyuid -z test-sa clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid added: "test-sa"
oc adm policy add-scc-to-userの効果と裏側
新規作成したサービスアカウントをDeployment/Podに付与すると
$ oc set serviceaccount deployment/test test-sa
同コンテナがDockerfileでユーザを変更している場合もエラーとならずにPodが起動できるようになります。
これは何故かというと、ServiceAccountにSCCを付与するとClusterroleである「system:openshift:scc:anyuid」とServiceAccountが紐づくから。ちなみにClusterroleの中身は以下。
$ oc describe clusterrole system:openshift:scc:anyuid Name: system:openshift:scc:anyuid Labels: <none> Annotations: rbac.authorization.kubernetes.io/autoupdate: true PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- securitycontextconstraints.security.openshift.io [] [anyuid] [use]
そして紐付けの確認としてClusterroleBindingを見ると確かにServiceAccountが追記されています。
$ oc describe clusterrolebinding system:openshift:scc:anyuid Name: system:openshift:scc:anyuid Labels: <none> Annotations: <none> Role: Kind: ClusterRole Name: system:openshift:scc:anyuid Subjects: Kind Name Namespace ---- ---- --------- ServiceAccount test-sa xx
よってoc adm policyによってClusterRoleBindingに確かに変更が入っていることが確認できました。
終わりに
OpenshiftではSCCにてPod のパーミッションを制御しますが、実体はClusterRoleの紐付けであることが分かりました。
OpenShiftのログインユーザーはsystem:authenticatedというシステムグループに所属し、このグループはrestrictedというSCCで制御されます。
restrictedが原因でPod起動にエラーが出た際には確認がSCC関連の修正が必要なので、本記事が理解の一助になれば幸いです。