(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【OpenShift】oc adm policy add-scc-to-userでの変更とClusterRoleBindingの関係

スポンサーリンク

はじめに

サービスアカウントに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関連の修正が必要なので、本記事が理解の一助になれば幸いです。