第13章 SCC (Security Context Constraints) の管理

13.1. SCC (Security Context Constraints) について

RBAC リソースがユーザーアクセスを制御するのと同じ方法で、管理者は SCC (Security Context Constraints) を使用して Pod のパーミッションを制御できます。これらのパーミッションには、Pod が実行できるアクションおよびそれがアクセスできるリソース情報が含まれます。SCC を使用して、Pod がシステムに受け入れられるために必要な Pod の実行についての条件の一覧を定義することができます。

SCC(Security Context Constraints)により、管理者は以下を制御できます。

  • Pod が特権付きコンテナーを実行できるかどうか。
  • コンテナーが要求できる機能
  • ホストディレクトリーのボリュームとしての使用
  • コンテナーの SELinux コンテキスト
  • コンテナーのユーザー ID
  • ホストの namespace およびネットワークの使用
  • Pod ボリュームを所有する FSGroup の割り当て
  • 許可される補助グループの設定
  • コンテナーが root ファイルシステムへの書き込みアクセスを必要とするかどうか。
  • ボリュームタイプの使用
  • 許可される seccomp プロファイルの設定
重要

openshift.io/run-level ラベルは OpenShift Container Platform の任意の namespace に設定しないでください。このラベルは、Kubernetes API サーバーおよび OpenShift API サーバーなどの主要な API グループの起動を管理するために内部 OpenShift Container Platform コンポーネントによって使用されます。openshift.io/run-level ラベルが設定されている場合、SCC はその namespace の Pod に適用されず、その namespace で実行されているワークロードが非常に特権を持つようになりました。

13.1.1. デフォルトの SCC(Security Context Constraints)

クラスターには、以下の表で説明されているように、いくつかのデフォルトの SCC(Security Context Constraints)が含まれます。追加の SCC は、Operator や他のコンポーネントを OpenShift Container Platform にインストールする際にインストールされる可能性があります。

重要

デフォルトの SCC は変更しないでください。デフォルトの SCC をカスタマイズすると、プラットフォームの Pod をデプロイ時または OpenShift Container Platform のアップグレード時に問題が発生する可能性があります。OpenShift Container Platform の一部のバージョン間のアップグレード時に、デフォルトの SCC の値はデフォルト値にリセットされるので、カスタマイズされた値はすべて破棄され、これらの SCC 値に戻ります。代わりに、必要に応じて新規 SCC を作成します。

表13.1 デフォルトの SCC(Security Context Constraints)

SCC(Security Context Constraints)詳細

anyuid

制限付き SCC のすべての機能を提供しますが、UID と GID でユーザーが実行できます。

hostaccess

すべてのホスト namespace へのアクセスを許可しますが、引き続き Pod を namespace に割り当てられる UID および SELinux コンテキストで実行する必要があります。

警告

この SCC は、namespace、ファイルシステム、および PIDS へのホストのアクセスを許可します。これは信頼される Pod によってのみ使用する必要があります。注意して付与してください。

hostmount-anyuid

制限付き SCC のすべての機能を提供しますが、ホストのマウントとシステム上の UID および GID としての実行を許可します。

警告

この SCC は、UID 0 を含む任意の UID としてホストファイルシステムのアクセスを許可します。注意して付与してください。

hostnetwork

ホストネットワークおよびホストポートの使用を許可しますが、引き続き Pod を namespace に割り当てられる UID および SELinux コンテキストで実行する必要があります。

警告

追加のワークロードをコントロールプレーンホスト (別称マスターホスト) で実行する場合、hostnetwork へのアクセスを提供する際には注意して行ってください。コントロールプレーンホストで hostnetwork を実行するワークロードには クラスター上で root アクセスを持つユーザーと同じ機能があるため、適切に信頼される必要があります。

node-exporter

Prometheus ノードエクスポーターに使用されます。

警告

この SCC は、UID 0 を含む任意の UID としてホストファイルシステムのアクセスを許可します。注意して付与してください。

nonroot

制限付き SCC のすべての機能を提供しますが、root 以外の UID でユーザーが実行できます。ユーザーは UID を指定しているか、またはコンテナーランタイムのマニフェストに指定する必要がある。

privileged

すべての特権およびホスト機能へのアクセスを許可し、任意のユーザー、グループ、FSGroup、および SELinux コンテキストを使用して実行できます。

警告

これは最も緩和された SCC で、クラスター管理にのみ使用してください。注意して付与してください。

privileged SCC は以下を許可します。

  • ユーザーによる特権付き Pod の実行
  • Pod によるホストディレクトリーのボリュームとしてのマウント
  • Pod の任意ユーザーとしての実行
  • Pod の MCS ラベルの使用による実行
  • Pods によるホストの IPC namespace の使用
  • Pod によるホストの PID namespace の使用
  • Pod による FSGroup の使用
  • Pod による補助グループの使用
  • Pod による seccomp プロファイルの使用
  • Pod による機能の要求
注記

Pod 仕様で privileged: true を設定すると、特権付き SCC は選択されません。Pod 仕様で privileged: true を設定すると、SCC の allowPrivilegedContainer フィールドに一致します。

restricted

すべてのホスト機能へのアクセスを拒否し、Pod を UID および namespace に割り当てられる SELinux コンテキストで実行する必要があります。これは最も制限の厳しい SCC であり、これは認証ユーザー用にデフォルトで使用されます。

restricted SCC は以下を実行します。

  • Pod が特権付き Pod として実行できないようにする
  • Pod がホストディレクトリーのボリュームをマウントできないようにする
  • Pod が事前に割り当てられた UID の範囲でユーザーとして実行されることを要求します。
  • Pod が事前に割り当てられた MCS ラベルで実行されることを要求します。
  • Pod が FSGroup を使用することを許可します。
  • Pod が補助グループを使用することを許可します。

13.1.2. SCC(Security Context Constraints)の設定

SCC(Security Context Constraints)は、Pod がアクセスできるセキュリティー機能を制御する設定およびストラテジーで構成されています。これらの設定は以下のカテゴリーに分類されます。

カテゴリー説明

ブール値による制御

このタイプのフィールドはデフォルトで最も制限のある値に設定されます。たとえば、AllowPrivilegedContainer は指定されていない場合は、false に常に設定されます。

許可されるセットによる制御

このタイプのフィールドはセットに対してチェックされ、それらの値が許可されることを確認します。

ストラテジーによる制御

値を生成するストラテジーを持つ項目は以下を提供します。

  • 値を生成するメカニズム
  • 指定された値が許可される値のセットに属するようにするメカニズム

CRI-O には、Pod の各コンテナーについて許可されるデフォルトの機能一覧があります。

  • CHOWN
  • DAC_OVERRIDE
  • FSETID
  • FOWNER
  • SETGID
  • SETUID
  • SETPCAP
  • NET_BIND_SERVICE
  • KILL

コンテナーはこれらの機能をデフォルト一覧から使用しますが、Pod マニフェストの作成者は追加機能を要求したり、デフォルトからデフォルト動作の一部を削除してこの一覧を変更できます。allowedCapabilitiesdefaultAddCapabilities、および requiredDropCapabilities パラメーターは Pod からのこのような要求を制御し、要求できる機能を決定し、各コンテナーに追加するものや禁止する必要のあるものを決定するために使用されます。

13.1.3. SCC(Security Context Constraints)ストラテジー

RunAsUser

  • MustRunAs: runAsUser が設定されることを要求します。デフォルトで設定済みの runAsUser を使用します。設定済みの runAsUser に対して検証します。
  • MustRunAsRange: 事前に割り当てられた値を使用していない場合に、最小および最大値が定義されることを要求します。デフォルトでは最小値を使用します。許可される範囲全体に対して検証します。
  • MustRunAsNonRoot: Pod がゼロ以外の runAsUser で送信されること、または USER ディレクティブをイメージに定義することを要求します。デフォルトは指定されません。
  • RunAsAny: デフォルトは指定されません。runAsUser の指定を許可します。

SELinuxContext

  • MustRunAs: 事前に割り当てられた値を使用していない場合に seLinuxOptions が設定されることを要求します。デフォルトとして seLinuxOptions を使用します。seLinuxOptions に対して検証します。
  • RunAsAny: デフォルトは指定されません。seLinuxOptions の指定を許可します。

SupplementalGroups

  • MustRunAs: 事前に割り当てられた値を使用していない場合に、少なくとも 1 つの範囲が指定されることを要求します。デフォルトとして最初の範囲の最小値を使用します。すべての範囲に対して検証します。
  • RunAsAny: デフォルトは指定されません。supplementalGroups の指定を許可します。

FSGroup

  • MustRunAs: 事前に割り当てられた値を使用していない場合に、少なくとも 1 つの範囲が指定されることを要求します。デフォルトとして最初の範囲の最小値を使用します。最初の範囲の最初の ID に対して検証します。
  • RunAsAny: デフォルトは指定されません。fsGroup ID の指定を許可します。

13.1.4. ボリュームの制御

特定のボリュームタイプの使用は、SCC の volumes フィールドを設定して制御できます。このフィールドの許容値は、ボリュームの作成時に定義されるボリュームソースに対応します。

新規 SCC について許可されるボリュームの推奨される最小セットは、configMapdownwardAPIemptyDirpersistentVolumeClaim, secret、および projected です。

注記

許可されるボリュームタイプの一覧は、新規タイプが OpenShift Container Platform の各リリースと共に追加されるため、網羅的な一覧ではありません。

注記

後方互換性を確保するため、allowHostDirVolumePlugin の使用は volumes フィールドの設定をオーバーライドします。たとえば、allowHostDirVolumePlugin が false に設定されるが、volumes フィールドで許可される場合、hostPath 値は volumes から削除されます。

13.1.5. 受付制御

SCC が設定された 受付制御 により、ユーザーに付与された機能に基づいてリソースの作成に対する制御が可能になります。

SCC の観点では、これは受付コントローラーが、SCC の適切なセットを取得するためにコンテキストで利用可能なユーザー情報を検査できることを意味します。これにより、Pod はその運用環境についての要求を行ったり、Pod に適用する一連の制約を生成したりする権限が与えられます

受付が Pod を許可するために使用する SCC のセットはユーザーアイデンティティーおよびユーザーが属するグループによって決定されます。さらに、Pod がサービスアカウントを指定する場合、許可される SCC のセットには、サービスアカウントでアクセスできる制約が含まれます。

受付は以下の方法を使用して、Pod の最終的なセキュリティーコンテキストを作成します。

  1. 使用できるすべての SCC を取得します。
  2. 要求に指定されていないセキュリティーコンテキストの設定のフィールド値を生成します。
  3. 利用可能な制約に対する最終的な設定を検証します。

制約の一致するセットが検出される場合、Pod が受け入れられます。要求が SCC に一致しない場合、Pod は拒否されます。

Pod はすべてのフィールドを SCC に対して検証する必要があります。以下は、検証する必要のある 2 つのフィールドのみについての例になります。

注記

これらの例は、事前に割り当てられた値を使用するストラテジーに関連するものです。

MustRunAsの FSGroup SCC ストラテジー

Pod が fsGroup ID を定義する場合、その ID はデフォルトの fsGroup ID に等しくなければなりません。そうでない場合は、Pod は SCC で検証されず、次の SCC が評価されます。

SecurityContextConstraints.fsGroup フィールドに値 RunAsAny があり、Pod 仕様が Pod.spec.securityContext.fsGroup を省略する場合、このフィールドは有効とみなされます。検証時に、他の SCC 設定が他の Pod フィールドを拒否し、そのため Pod を失敗させる可能性があることに注意してください。

MustRunAsSupplementalGroups SCC ストラテジー

Pod 仕様が 1 つ以上の supplementalGroups ID を定義する場合、Pod の ID は namespace の openshift.io/sa.scc.supplemental-groups アノテーションの ID のいずれかに等しくなければなりません。そうでない場合は、Pod は SCC で検証されず、次の SCC が評価されます。

SecurityContextConstraints.supplementalGroups フィールドに値 RunAsAny があり、Pod 仕様が Pod.spec.securityContext.supplementalGroups を省略する場合、このフィールドは有効とみなされます。検証時に、他の SCC 設定が他の Pod フィールドを拒否し、そのため Pod を失敗させる可能性があることに注意してください。

13.1.6. SCC(Security Context Constraints)の優先度

SCC(Security Context Constraints)には、受付コントローラーによる要求の検証を試行する際の順序に影響を与える priority フィールドがあります。優先度の高い SCC は並び替える際にセットの先頭に移動します。利用可能な SCC の完全なセットが判別されると、それらは以下に戻づいて順序付けられます。

  1. 優先度が高い順。 nil は優先度 0 とみなされます。
  2. 優先度が等しい場合、SCC は最も制限の多いものから少ないものの順に並べ替えられます。
  3. 優先度と制限のどちらも等しい場合、SCC は名前順に並べ替えられます。

デフォルトで、クラスター管理者に付与される anyuid SCC には SCC セットの優先度が指定されます。これにより、クラスター管理者は Pod の SecurityContextRunAsUser を指定しなくても Pod を任意のユーザーとして実行できます。管理者は、希望する場合は依然として RunAsUser を指定できます。