第13章 SCC (Security Context Constraints) の管理
13.1. 概要
Security context constraints allow administrators to control permissions for pods. To learn more about this API type, see the security context constraints (SCCs) architecture documentation. You can manage SCCs in your instance as normal API objects using the CLI.
You must have cluster-admin privileges to manage SCCs.
デフォルトの SCC を変更しないでください。デフォルトの SCC をカスタマイズすると、アップグレード時に問題が生じる可能性があります。代わりに 新規 SCC を作成してください。
13.2. SCC (Security Context Constraints) の一覧表示
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]
13.3. SCC (Security Context Constraints) オブジェクトの検査
To examine a particular SCC, use oc get
, oc describe
, oc export
, or oc edit
. For example, to examine the restricted SCC:
$ oc describe scc restricted Name: restricted Priority: <none> Access: Users: <none> Groups: system:authenticated Settings: Allow Privileged: false Default Add Capabilities: <none> Required Drop Capabilities: KILL,MKNOD,SYS_CHROOT,SETUID,SETGID Allowed Capabilities: <none> Allowed Seccomp Profiles: <none> Allowed Volume Types: configMap,downwardAPI,emptyDir,persistentVolumeClaim,projected,secret Allow Host Network: false Allow Host Ports: false Allow Host PID: false Allow Host IPC: false Read Only Root Filesystem: false Run As User Strategy: MustRunAsRange UID: <none> UID Range Min: <none> UID Range Max: <none> SELinux Context Strategy: MustRunAs User: <none> Role: <none> Type: <none> Level: <none> FSGroup Strategy: MustRunAs Ranges: <none> Supplemental Groups Strategy: RunAsAny Ranges: <none>
アップグレード時にカスタマイズされた SCC を保持するには、優先順位、ユーザー、グループ、ラベル、およびアノテーション以外にはデフォルトの SCC の設定を編集しないでください。
13.4. 新規 SCC (Security Context Constraints) の作成
新規 SCC を作成するには、以下を実行します。
JSON または YAML ファイルで SCC を定義します。
SCC (Security Context Constraints) オブジェクトの定義
kind: SecurityContextConstraints apiVersion: v1 metadata: name: scc-admin allowPrivilegedContainer: true runAsUser: type: RunAsAny seLinuxContext: type: RunAsAny fsGroup: type: RunAsAny supplementalGroups: type: RunAsAny users: - my-admin-user groups: - my-admin-group
オプションとして、
requiredDropCapabilities
フィールドに必要な値を設定してドロップ機能を SCC に追加することができます。指定された機能はコンテナーからドロップされることになります。たとえば、SCC をKILL
、MKNOD
、およびSYS_CHROOT
の必要なドロップ機能を使って作成するには、以下を SCC オブジェクトに追加します。requiredDropCapabilities: - KILL - MKNOD - SYS_CHROOT
使用できる値の一覧は、Docker ドキュメントで確認できます。
機能は Docker に渡されるため、特殊な ALL
値を使用してすべての機能をドロップすることができます。
次に、作成するファイルを渡して
oc create
を実行します。$ oc create -f scc_admin.yaml securitycontextconstraints "scc-admin" created
SCC が作成されていることを確認します。
$ oc get scc scc-admin NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP PRIORITY READONLYROOTFS VOLUMES scc-admin true [] RunAsAny RunAsAny RunAsAny RunAsAny <none> false [awsElasticBlockStore azureDisk azureFile cephFS cinder configMap downwardAPI emptyDir fc flexVolume flocker gcePersistentDisk gitRepo glusterfs iscsi nfs persistentVolumeClaim photonPersistentDisk quobyte rbd secret vsphere]
13.5. SCC (Security Context Constraints) の削除
SCC を削除するには、以下を実行します。
$ oc delete scc <scc_name>
デフォルトの SCC を削除する場合、これは再起動時に再生成されます。
13.6. SCC (Security Context Constraints) の更新
既存 SCC を更新するには、以下を実行します。
$ oc edit scc <scc_name>
アップグレード時にカスタマイズされた SCC を保持するには、優先順位、ユーザー、グループ以外にデフォルトの SCC の設定を編集しないでください。
13.6.1. SCC (Security Context Constraints) 設定のサンプル
明示的な runAsUser 設定がない場合
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext: 1
containers:
- name: sec-ctx-demo
image: gcr.io/google-samples/node-hello:1.0
- 1
- When a container or pod does not request a user ID under which it should be run, the effective UID depends on the SCC that emits this pod. Because restricted SCC is granted to all authenticated users by default, it will be available to all users and service accounts and used in most cases. The restricted SCC uses
MustRunAsRange
strategy for constraining and defaulting the possible values of thesecurityContext.runAsUser
field. The admission plug-in will look for theopenshift.io/sa.scc.uid-range
annotation on the current project to populate range fields, as it does not provide this range. In the end, a container will haverunAsUser
equal to the first value of the range that is hard to predict because every project has different ranges. See Understanding Pre-allocated Values and Security Context Constraints for more information.
明示的な runAsUser 設定がない場合
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000 1
containers:
- name: sec-ctx-demo
image: gcr.io/google-samples/node-hello:1.0
- 1
- 特定のユーザー ID を要求するコンテナーまたは Pod が OpenShift Container Platform によって受け入れられるのは、サービスアカウントまたはユーザーにそのユーザー ID を許可する SCC へのアクセスが付与されている場合のみです。SCC は、任意の ID や特定の範囲内にある ID、または要求に固有のユーザー ID を許可します。
This works with SELinux, fsGroup, and Supplemental Groups. See Volume Security for more information.
13.7. デフォルト SCC (Security Context Constraints) の更新
デフォルト SCC は、それらが見つからない場合にはマスターの起動時に作成されます。SCC をデフォルトにリセットするか、またはアップグレード後に既存の SCC を新規のデフォルト定義に更新するには、以下を実行します。
- リセットする SCC を削除し、マスターを再起動してその再作成を実行します。
-
oc adm policy reconcile-sccs
コマンドを使用します。
oc adm policy reconcile-sccs
コマンドは、すべての SCC ポリシーをデフォルト値に設定しますが、すでに設定した可能性のある追加ユーザー、グループ、ラベル、アノテーションおよび優先順位を保持します。変更される SCC を表示するには、オプションなしでコマンドを実行するか、または -o <format>
オプションで優先する出力を指定してコマンドを実行します。
確認後は、既存 SCC のバックアップを取ってから --confirm
オプションを使用してデータを永続化します。
優先順位や許可をリセットする場合は、--additive-only=false
オプションを使用します。
SCC に優先順位、ユーザー、グループ、ラベル、またはアノテーション以外のカスタマイズ設定がある場合、これらの設定は調整時に失われます。
13.8. 使用方法
以下では、SCC を使用する一般的なシナリオおよび手順について説明します。
13.8.1. 特権付き SCC のアクセス付与
管理者が管理者グループ外のユーザーまたはグループに対して 特権付き Pod を追加作成するためのアクセスを付与することが必要になることがあります。これを実行するには、以下を行います。
SCC へのアクセスを付与するユーザーまたはグループを決定します。
警告ユーザーへのアクセス付与は、ユーザーが Pod を直接作成する場合にのみ可能です。ほとんどの場合、システム自体がユーザーの代わりに作成する Pod については、関連するコントローラーの作動に使用される サービスアカウントにアクセスを付与する必要があります。ユーザーの代わりに Pod を作成するリソースの例として、Deployments、StatefulSets、DaemonSets などが含まれます。
以下を実行します。
$ oc adm policy add-scc-to-user <scc_name> <user_name> $ oc adm policy add-scc-to-group <scc_name> <group_name>
たとえば、e2e-user の 特権付き SCC へのアクセスを許可するには、以下を実行します。
$ oc adm policy add-scc-to-user privileged e2e-user
-
特権モードを要求するようにコンテナーの
SecurityContext
を変更します。
13.8.2. 特権付き SCC のサービスアカウントアクセスの付与
First, create a service account. For example, to create service account mysvcacct
in project myproject
:
$ oc create serviceaccount mysvcacct -n myproject
次に、サービスアカウントを特権付き
SCC に追加します。
$ oc adm policy add-scc-to-user privileged system:serviceaccount:myproject:mysvcacct
その後は、リソースがサービスアカウントの代わりに作成されていることを確認します。これを実行するには、spec.serviceAccountName
フィールドをサービスアカウント名に設定します。サービスアカウント名を空のままにすると、デフォルト
のサービスアカウントが使用されます。
次に、少なくとも 1 つの Pod のコンテナーがセキュリティーコンテキストで特権モードを要求していることを確認します。
13.8.3. Dokerfile の USER によるイメージ実行の有効化
特権付き SCC へのアクセスをすべての人に与えることなく、イメージが事前割り当て UID で強制的に実行されないようにクラスターのセキュリティーを緩和するには、以下を実行します。
すべての認証されたユーザーに anyuid SCC へのアクセスを付与します。
$ oc adm policy add-scc-to-group anyuid system:authenticated
これにより、USER が Dockerfile に指定されていない場合は、イメージをルート ID で実行することができます。
13.8.4. ルートを要求するコンテナーイメージの有効化
一部のコンテナーイメージ (例: postgres
および redis
) には root アクセスが必要であり、ボリュームの保有方法についてのいくつかの予測が設定されています。これらのイメージについては、サービスアカウントを anyuid
SCC に追加します。
$ oc adm policy add-scc-to-user anyuid system:serviceaccount:myproject:mysvcacct
13.8.5. レジストリーでの --mount-host の使用
It is recommended that persistent storage using PersistentVolume
and PersistentVolumeClaim
objects be used for registry deployments. If you are testing and would like to instead use the oc adm registry
command with the --mount-host
option, you must first create a new service account for the registry and add it to the privileged SCC. See the Administrator Guide for full instructions.
13.8.6. 追加機能の提供
場合によっては、Docker が追加設定なしの機能として提供していない機能がイメージで必要になることがあります。この場合、Pod 仕様で追加機能を要求することができ、これは SCC に対して検証されます。
これによりイメージを昇格された機能を使って実行できますが、これは必要な場合にのみ実行する必要があります。追加機能を有効にするためにデフォルトの restricted SCC を編集することはできません。
非 root ユーザーによって使用される場合、setcap
コマンドを使用して、追加機能を要求するファイルに該当する機能が付与されていることを確認する必要もあります。たとえば、イメージの Dockerfile では、以下のようになります。
setcap cap_net_raw,cap_net_admin+p /usr/bin/ping
さらに機能が Docker のデフォルトとして提供されている場合には、これを要求するために Pod 仕様を変更する必要はありません。たとえば、NET_RAW
がデフォルトで指定されており、機能がすでに ping
で設定されている場合、ping
を実行するのに特別な手順は必要ありません。
追加機能を提供するには、以下を実行します。
- 新規 SCC を作成します。
-
allowedCapabilities
フィールドを使用して許可された機能を追加します。 -
Pod の作成時に、
securityContext.capabilities.add
フィールドで機能を要求します。
13.8.7. クラスターのデフォルト動作の変更
To modify your cluster so that it does not pre-allocate UIDs, allows containers to run as any user, and prevents privileged containers:
アップグレード時にカスタマイズされた SCC を保持するには、優先順位、ユーザー、グループ、ラベル、およびアノテーション以外にはデフォルトの SCC の設定を編集しないでください。
Edit the restricted SCC:
$ oc edit scc restricted
-
Change
runAsUser.Type
to RunAsAny. -
Ensure
allowPrivilegedContainer
is set to false. - Save the changes.
To modify your cluster so that it does not pre-allocate UIDs and does not allow containers to run as root:
Edit the restricted SCC:
$ oc edit scc restricted
-
Change
runAsUser.Type
to MustRunAsNonRoot. - Save the changes.
13.8.8. hostPath ボリュームプラグインの使用
To relax the security in your cluster so that pods are allowed to use the hostPath
volume plug-in without granting everyone access to the privileged SCC:
Edit the restricted SCC:
$ oc edit scc restricted
-
Add
allowHostDirVolumePlugin: true
. - Save the changes.
13.8.9. 受付を使用した特定 SCC の初回使用
You may control the sort ordering of SCCs in admission by setting the Priority
field of the SCCs. See the SCC Prioritization section for more information on sorting.
13.8.10. SCC のユーザー、グループまたはプロジェクトへの追加
Before adding an SCC to a user or group, you can first use the scc-review
option to check if the user or group can create a pod. See the Authorization topic for more information.
SCC はプロジェクトに直接付与されません。代わりに、サービスアカウントを SCC に追加し、Pod にサービスアカウント名を指定するか、または指定されない場合は default
サービスアカウントを使用して実行します。
SCC をユーザーに追加するには、以下を実行します。
$ oc adm policy add-scc-to-user <scc_name> <user_name>
SCC をサービスアカウントに追加するには、以下を実行します。
$ oc adm policy add-scc-to-user <scc_name> \ system:serviceaccount:<serviceaccount_namespace>:<serviceaccount_name>
現在の場所がサービスアカウントが属するプロジェクトの場合、-z
フラグを使用し、<serviceaccount_name>
のみを指定することができます。
$ oc adm policy add-scc-to-user <scc_name> -z <serviceaccount_name>
上記の -z
フラグについては、誤字を防ぎ、アクセスが指定されたサービスアカウントのみに付与されるため、その使用をを強く推奨します。プロジェクトにいない場合は、-n
オプションを使用して、それが適用されるプロジェクトの namespace を指定します。
SCC をグループに追加するには、以下を実行します。
$ oc adm policy add-scc-to-group <scc_name> <group_name>
SCC を namespace のすべてのサービスアカウントに追加するには、以下を実行します。
$ oc adm policy add-scc-to-group <scc_name> \ system:serviceaccounts:<serviceaccount_namespace>