Edited at

OpenShiftのコンテナセキュリティ


対象読者

この記事は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カラムだけ抜粋します。

restrictedSCCではMustRunAsRangeが設定されています。これはある一定の数値範囲の中にUIDが自動設定されるような動きになります。Rootグループで実行されるのでコンテナ内で権限設定する場合はグループに権限を付与しておく必要があります。

nonrootSCCに設定されているMustRunAsNonRootというのはRoot以外であれば何のユーザーで実行してもよいという意味になります。


ただし、ユーザー指定は1000等UID指定でなければなりません。


ユーザー指定はDockerfileのUSERを設定するか、DeploymentConfigやStatefulSetのyamlにてrunAsUser: 1000等と設定します。

anyuidに設定されているRunAsAnyはrootも含めて「どのユーザーでも良い」を意味します。


デフォルト状態でrestrictedが付与される仕組み

OpenShiftにログインする全てのユーザーはsystem:authenticatedという特殊なシステムグループに所属します。OpenShiftではデフォルト状態でsystem:authenticatedグループにrestrictedSCCが付与されています。

もしログインしたすべてのユーザーがPodを起動するときにnonrootSCCを使用したい場合はsystem:authenticatedグループにnonrootSCCを追加します。

$ 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には適用されているサービスアカウントにanyuidSCCを付与してRoot起動を許可します。


参考履歴

公式ドキュメント(3.9)

nekop's blog