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