プロファイル適用性: レベル1
コンテナを
allowPrivilegeEscalationフラグがtrueに設定された状態で一般的に許可しないでください。この権限を許可すると、コンテナを実行しているプロセスが開始時よりも多くの権限を得る可能性があります。これらの権限は全体的なコンテナサンドボックスによって依然として制約されており、この設定は特権コンテナの使用とは関係ありません。
allowPrivilegeEscalationフラグがtrueに設定されているコンテナは、親よりも多くの権限を得ることができるプロセスを持つ可能性があります。コンテナが特権昇格を許可しないようにするために、少なくとも1つのアドミッションコントロールポリシーを定義する必要があります。
setuidバイナリの実行を許可するオプションが存在し (デフォルトではtrueに設定されています)。コンテナで
setuidバイナリを使用する必要がある場合や、特権昇格が必要な場合は、これを別のポリシーで定義し、そのポリシーを使用する権限が限られたサービスアカウントとユーザにのみ与えられていることを慎重に確認する必要があります。
注意デフォルトでは、コンテナ内のプロセスが権限を昇格させる能力に制限はありません。
|
影響
spec.allowPrivilegeEscalation: trueで定義されたポッドは、特定のポリシーの下で実行されない限り許可されません。監査
クラスター内の各ネームスペースで使用されているポリシーを一覧表示し、各ポリシーが特権の昇格を許可するコンテナの許可を禁止していることを確認してください。
このコマンドは、すべてのネームスペースにわたるすべてのポッドを取得し、その詳細をJSON形式で出力し、jqを使用して
allowPrivilegeEscalationがtrueに設定されているコンテナを解析およびフィルタリングします。kubectl get pods --all-namespaces -o json | jq -r '.items[] |
select(any(.spec.containers[];
.securityContext.allowPrivilegeEscalation == true)) |
"\(.metadata.namespace)/\(.metadata.name)"'
OR
kubectl get pods --all-namespaces -o json | jq -r '.items[] | select(any(.spec.containers[]; .securityContext.allowPrivilegeEscalation == true)) | select(.metadata.namespace != "kube-system" and .metadata.namespace != "gatekeeper-system" and .metadata.namespace != "azure-arc" and .metadata.namespace != "azure-extensions-usage-system") | "\(.metadata.name) \(.metadata.namespace)"'
PodSecurityPolicyを作成する際、
["kube-system", "gatekeeper-system", "azure-arc", "azure-extensions-usage-system"]ネームスペースはデフォルトで除外されます。このコマンドは、コマンドラインJSONプロセッサであるjqを使用して、
kubectl get podsのJSON出力を解析し、任意のコンテナでsecurityContext.privilegedフラグがtrueに設定されているポッドをフィルタリングします。
注意特定の要件やポッド仕様の構造に応じて、コマンドを調整する必要があるかもしれません。
|
修復
ユーザのワークロードがあるクラスター内の各ネームスペースにポリシーを追加し、
.spec.allowPrivilegeEscalationがtrueに設定されたコンテナの許可を制限します。Podセキュリティポリシーと割り当ては、Azureポータルでポリシーを検索することで見つけることができます。
詳細な手順ガイドはこちらで見つけることができます: https://learn.microsoft.com/en-us/azure/governance/policy/concepts/policy-for-kubernetes
