ビュー:
プロファイル適用性: レベル1
コンテナをsecurityContext.privilegedフラグがtrueに設定された状態で実行することは一般的に許可しないでください。
特権コンテナは、すべてのLinuxカーネル機能およびデバイスにアクセスできます。完全な特権を持つコンテナは、ホストができるほとんどすべてのことを実行できます。このフラグは、ネットワークスタックの操作やデバイスへのアクセスなど、特別なユースケースを許可するために存在します。
少なくとも1つの特権コンテナを許可しないアドミッションコントロールポリシーを定義する必要があります。
特権コンテナを実行する必要がある場合は、これを別のポリシーで定義し、限られたサービスアカウントとユーザのみにそのポリシーを使用する権限が与えられていることを慎重に確認する必要があります。
注意
注意
デフォルトでは、特権コンテナの作成に制限はありません。

影響

spec.containers[].securityContext.privileged: truespec.initContainers[].securityContext.privileged: true、およびspec.ephemeralContainers[].securityContext.privileged: trueで定義されたPodは許可されません。

監査

クラスター内の各ネームスペースで使用されているポリシーを一覧表示し、各ポリシーが特権コンテナの許可を禁止していることを確認してください。
多くのポッドがある環境では、各ポッドの設定を手動で検索するのは面倒かもしれません。grepや他のコマンドラインツールを使用して、より自動化された方法を利用できます。
以下は、より自動化されたソリューションのためのkubectl、grep、およびシェルスクリプトの組み合わせの例です。
オプション1
kubectl get pods --all-namespaces -o json | jq -r '.items[] |
select(.spec.containers[].securityContext.privileged == true) |
.metadata.name'
オプション2
kubectl get pods --all-namespaces -o json | jq '.items[] |
select(.metadata.namespace != "kube-system" and
.spec.containers[]?.securityContext?.privileged == true) | {pod:
.metadata.name, namespace: .metadata.namespace, container:
.spec.containers[].name}'
PodSecurityPolicyを作成する際、["kube-system"]ネームスペースはデフォルトで除外されます。
このコマンドは、コマンドラインJSONプロセッサであるjqを使用して、kubectl get podsのJSON出力を解析し、任意のコンテナにsecurityContext.privilegedフラグがtrueに設定されているポッドをフィルタリングします。
注意
注意
特定の要件やポッド仕様の構造に応じて、コマンドを調整する必要があるかもしれません。

修復

ユーザのワークロードがあるクラスター内の各ネームスペースにポリシーを追加して、特権コンテナのアドミッションを制限します。
クラスター内の名前空間でPSAを有効にするには、pod-security.kubernetes.io/enforceラベルに適用したいポリシーの値を設定します。
kubectl label --overwrite ns NAMESPACE pod-
security.kubernetes.io/enforce=restricted
上記のコマンドは、NAMESPACE名前空間に対して制限付きポリシーを適用します。
すべてのネームスペースに対してPod Security Admissionを有効にすることもできます。例えば:
kubectl label --overwrite ns --all pod-
security.kubernetes.io/warn=baseline