対象読者
この記事はOpenShiftやPodといった用語を理解できている方向けに書いています。
SCCとは?
SCC(Security Context Constraints)とはPodのパーミッションを制御する機能です。
OpenShiftのデフォルト状態ではrestricted
というSCCが設定されています。
SCCはPodに対して付与するロールです。
どのSCCが付与されるか、はユーザーやグループに設定することができ、Podを起動したユーザー、もしくはグループに設定されているSCCを適用します。
デフォルトSCC
デフォルトでは以下のようなSCCが設定されています。
$ oc get scc
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP PRIORITY READONLYROOTFS VOLUMES
anyuid false [] MustRunAs RunAsAny RunAsAny RunAsAny 10 false [configMap downwardAPI emptyDir persistentVolumeClaim secret]
hostaccess false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir hostPath persistentVolumeClaim secret]
hostmount-anyuid false [] MustRunAs RunAsAny RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir hostPath nfs persistentVolumeClaim secret]
hostnetwork false [] MustRunAs MustRunAsRange MustRunAs MustRunAs <none> false [configMap downwardAPI emptyDir persistentVolumeClaim secret]
nonroot false [] MustRunAs MustRunAsNonRoot RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim secret]
privileged true [*] RunAsAny RunAsAny RunAsAny RunAsAny <none> false [*]
restricted false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim secret]
デフォルトSCCは変更すべきではないと公式ドキュメントには記載されています。
もし変更してしまうとインプレイスアップグレードの時等に問題になる可能性があるそうです。
SCCの簡単な見方
RUNASUSER
カラムだけ抜粋します。
restricted
SCCではMustRunAsRange
が設定されています。これはある一定の数値範囲の中にUIDが自動設定されるような動きになります。Rootグループで実行されるのでコンテナ内で権限設定する場合はグループに権限を付与しておく必要があります。
nonroot
SCCに設定されているMustRunAsNonRoot
というのはRoot以外であれば何のユーザーで実行してもよいという意味になります。
ただし、ユーザー指定は1000等UID指定でなければなりません。
ユーザー指定はDockerfileのUSERを設定するか、DeploymentConfigやStatefulSetのyamlにてrunAsUser: 1000
等と設定します。
anyuid
に設定されているRunAsAny
はrootも含めて「どのユーザーでも良い」を意味します。
デフォルト状態でrestricted
が付与される仕組み
OpenShiftにログインする全てのユーザーはsystem:authenticated
という特殊なシステムグループに所属します。OpenShiftではデフォルト状態でsystem:authenticated
グループにrestricted
SCCが付与されています。
もしログインしたすべてのユーザーがPodを起動するときにnonroot
SCCを使用したい場合はsystem:authenticated
グループにnonroot
SCCを追加します。
$ oc adm add-scc-to-group nonroot system:authenticated
特例として一部のPodがanyuidで動作するようにしたい
SCCは当然サービスアカウントにも追加できます。
$ oc adm add-scc-to-user anyuid -z default
logging機能のためのElasticSearchやモニタリングのためのPrometheusはRootユーザーで動作します。であるにも関わらずデフォルトSCCを変更してしまった場合、これらのPodが動作しなくなります。よってそれらのPodには適用されているサービスアカウントにanyuid
SCCを付与してRoot起動を許可します。