27.18.2. SCC、デフォルト値および許可される範囲
SCC は、デフォルトのユーザー ID、fsGroup
ID、補助グループ ID、および SELinux ラベルが Pod に割り当てられるかどうかに影響します。また、Pod 定義 (またはイメージ) で指定される ID が許容可能な ID の範囲に対して検証されるかどうかにも影響します。検証が必要な場合で検証が失敗すると、Pod も失敗します。
SCC は、runAsUser
、supplementalGroups
、fsGroup
などのストラテジーを定義します。これらのストラテジーは Pod が承認されるかどうかを判断するのに役立ちます。RunAsAny に設定されるストラテジーの値は、Pod がそのストラテジーに関して必要なことを何でも実行できるということを実質的に宣言するものです。そのストラテジーに対する承認は省略され、そのストラテジーに基づいて生成される OpenShift Container Platform のデフォルト値はありません。したがって、生成されるコンテナーの ID と SELinux ラベルは、OpenShift Container Platform ポリシーではなく、コンテナーのデフォルトに基づいて割り当てられます。
以下に RunAsAny の簡単な概要を示します。
- Pod 定義 (またはイメージ) に定義されるすべての ID が許可されます。
- Pod 定義 (およびイメージ) に ID がない場合は、コンテナーによって ID が割り当てられます。 Docker の場合、この ID は root (0) です。
- SELinux ラベルは定義されないため、Docker によって一意のラベルが割り当てられます。
このような理由により、ID 関連のストラテジーについて RunAsAny が設定された SCC は、通常の開発者がアクセスできないように保護する必要があります。一方、MustRunAs または MustRunAsRange に設定された SCC ストラテジーは、(ID 関連のストラテジーについての) ID 検証をトリガーします。 その結果、Pod 定義またはイメージに値が直接指定されていない場合は、OpenShift Container Platform によってデフォルト値がコンテナーに割り当てられます。
RunAsAny FSGroup
ストラテジーが設定された SCC へのアクセスを許可すると、ユーザーがブロックデバイスにアクセスするのを防止することもできます。Pod では、ユーザーのブロックデバイスを引き継ぐために fsGroup
を指定する必要があります。通常、これを行うには、SCC FSGroup
ストラテジーを MustRunAs に設定します。ユーザーの Pod に RunAsAny FSGroup
ストラテジーが設定された SCC が割り当てられている場合、ユーザーが fsGroup
ストラテジーを各自で指定する必要があることに気づくまで、permission denied エラーが出される可能性があります。
SCC では、許可される ID (ユーザーまたはグループ) の範囲を定義できます。範囲チェックが必要な場合 (MustRunAs を使用する場合など) で、許容可能な範囲が SCC で定義されていない場合は、プロジェクトによって ID 範囲が決定されます。したがって、プロジェクトでは、許容可能な ID の範囲がサポートされます。ただし、SCC とは異なり、プロジェクトは runAsUser
などのストラテジーを定義しません。
許容可能な範囲を設定すると、コンテナー ID の境界を定義するだけでなく、範囲の最小値を対象の ID のデフォルト値にできるので役に立ちます。たとえば、SCC ID ストラテジーの値が MustRunAs で、ID 範囲の最小値が 100で、ID が Pod 定義に存在しない場合、100 がこの ID のデフォルト値になります。
Pod の受付プロセスの一環として、Pod で使用可能な SCC が (ほとんどの場合は優先順位の高い SCC から最も制限の厳しい SCC の順序で) 検査され、Pod の要求に最も一致する SCC が選択されます。SCC のストラテジータイプを RunAsAny に設定すると、制限が緩和されます。一方、MustRunAs タイプに設定すると、制限がより厳しくなります。これらすべてのストラテジーが評価されます。Pod に割り当てられた SCC を確認するには、oc get pod
コマンドを使用します。
# oc get pod <pod_name> -o yaml ... metadata: annotations: openshift.io/scc: nfs-scc 1 name: nfs-pod1 2 namespace: default 3 ...
- 1
- Pod が使用した SCC (この場合は、カスタム SCC) の名前。
- 2
- Pod の名前。
- 3
- プロジェクトの名前。OpenShift Container Platform では、namespace とプロジェクトは置き換え可能な用語として使用されています。詳細は、Projects and Users を参照してください。
Pod で一致した SCC をすぐに確認できない場合があります。 そのため、上記のコマンドは、ライブコンテナーの UID、補助グループ、および SELinux のラベル変更を理解するのに非常に役立ちます。
ストラテジーが RunAsAny に設定された SCC では、そのストラテジーの特定の値を Pod 定義 (またはイメージ) に定義できます。これがユーザー ID (runAsUser
) に適用される場合、コンテナーが root として実行されないように SCC へのアクセスを制限することが推奨されます。
Pod が 制限付き SCC に一致することが多くあるため、これに伴うセキュリティーについて理解しておくことが重要です。制限付き SCC には以下の特性があります。
-
runAsUser
ストラテジーが MustRunAsRange に設定されているため、ユーザー ID が制限されます。これにより、ユーザー ID の検証が強制的に実行されます。 -
許可できるユーザー ID の範囲が SCC で定義されないため (詳細については、oc get -o yaml --export scc restricted を参照してください)、プロジェクトの
openshift.io/sa.scc.uid-range
範囲が範囲のチェックとデフォルト ID に使用されます (必要な場合)。 -
デフォルトのユーザー ID は、ユーザー ID が Pod 定義で指定されておらず、一致する SCC の
runAsUser
が MustRunAsRange に設定されている場合に生成されます。 -
SELinux ラベルが必要です (
seLinuxContext
が MustRunAs に設定されているため)。 プロジェクトのデフォルトの MCS ラベルが使用されます。 -
FSGroup
ストラテジーが MustRunAs に設定され、指定される最初の範囲の最小値を値に使用するように指示されているため、fsGroup
ID が単一の値に制限されます。 -
許容可能な
fsGroup
ID の範囲が SCC で定義されないため、プロジェクトのopenshift.io/sa.scc.supplemental-groups
の範囲 (またはユーザー ID に使用されるものと同じ範囲) の最小値が検証とデフォルト ID に使用されます (必要な場合)。 -
デフォルトの
fsGroup
ID は、fsGroup
ID が Pod で指定されておらず、一致する SCC のFSGroup
が MustRunAs に設定されている場合に生成されます。 -
範囲チェックが必要でないため、任意の補助グループ ID が許可されます。これは
supplementalGroups
ストラテジーが RunAsAny に設定されているためです。 - 実行中の Pod に対してデフォルトの補助グループは生成されません。上記の 2 つのストラテジーについて RunAsAny が設定されているためです。したがって、グループが Pod 定義 (またはイメージ) に定義されていない場合は、コンテナーには補助グループが事前に定義されません。
以下に、SCC とプロジェクトの相互関係をまとめた default プロジェクトとカスタム SCC (my-custom-scc) の例を示します。
$ oc get project default -o yaml 1 ... metadata: annotations: 2 openshift.io/sa.scc.mcs: s0:c1,c0 3 openshift.io/sa.scc.supplemental-groups: 1000000000/10000 4 openshift.io/sa.scc.uid-range: 1000000000/10000 5 $ oc get scc my-custom-scc -o yaml ... fsGroup: type: MustRunAs 6 ranges: - min: 5000 max: 6000 runAsUser: type: MustRunAsRange 7 uidRangeMin: 1000100000 uidRangeMax: 1000100999 seLinuxContext: 8 type: MustRunAs SELinuxOptions: 9 user: <selinux-user-name> role: ... type: ... level: ... supplementalGroups: type: MustRunAs 10 ranges: - min: 5000 max: 6000
- 1
- default はプロジェクトの名前です。
- 2
- デフォルト値は、対応する SCC 戦略が RunAsAny でない場合にのみ生成されます。
- 3
- Pod 定義または SCC で定義されていない場合の SELinux のデフォルト値です。
- 4
- 許容可能なグループ ID の範囲です。ID の検証は、SCC ストラテジーが RunAsAny の場合にのみ実行されます。複数の範囲をコンマで区切って指定できます。サポートされている形式についてはこちら を参照してください。
- 5
- <4> と同じですが、ユーザー ID に使用されます。また、ユーザー ID の単一の範囲のみがサポートされます。
- 6 10
- MustRunAs は、グループ ID の範囲チェックを実施して、コンテナーのグループのデフォルトを指定します。この SCC の定義に基づく場合、デフォルトは 5000 になります (最小の ID 値)。範囲が SCC から省略される場合、デフォルトは 1000000000 になります (プロジェクトから派生します)。サポートされている別のタイプ RunAsAny では、範囲チェックを実行しないため、いずれのグループ ID も許可され、デフォルトグループは生成されません。
- 7
- MustRunAsRange は、ユーザー ID の範囲チェックを実施して、UID のデフォルトを指定します。この SCC の定義に基づく場合、デフォルトの UID は 1000100000 になります (最小値)。最小範囲と最大範囲が SCC から省略される場合、デフォルトのユーザー ID は 1000000000 になります (プロジェクトから派生します)。これ以外には MustRunAsNonRoot と RunAsAny のタイプがサポートされます。許可される ID の範囲は、ターゲットのストレージに必要ないずれのユーザー ID も含めるように定義することができます。
- 8
- MustRunAs に設定した場合は、コンテナーは SCC の SELinux オプション、またはプロジェクトに定義される MCS のデフォルトを使用して作成されます。RunAsAny というタイプは、SELinux コンテキストが不要であることや、Pod に定義されていない場合はコンテナーに設定されないことを示します。
- 9
- SELinux のユーザー名、ロール名、タイプ、およびラベルは、ここで定義できます。
2 つの形式が許可される範囲にサポートされています。
-
M/N
。M
は開始 ID でN
はカウントです。 したがって、範囲はM
からM+N-1
(これ自体を含む) までになります。 -
M-N
。M
は同じく開始 ID でN
は終了 ID です。デフォルトのグループ ID が最初の範囲の開始 ID になります (このプロジェクトでは1000000000
desu )。SCC で最小のグループ ID が定義されていない場合は、プロジェクトのデフォルトの ID が適用されます。