Root コンテナーの許可

PodSecurityPolicy が root 実行と権限昇格を許可すると、コンテナー侵害時の影響が大きくなるおそれがあります。

説明

PodSecurityPolicy の runAsUser.rule: RunAsAny は UID 0 での実行を制限しません。privileged: true は特権コンテナーを、allowPrivilegeEscalation: true はプロセスの権限昇格を許可する別々の設定です。不要な権限を許可すると、脆弱性が悪用された際の影響が大きくなるおそれがあります。

非 root 実行、権限昇格の禁止、読み取り専用ルートファイルシステムなどの防御を、ワークロードに合わせて併用してください。

PodSecurityPolicy は Kubernetes v1.21 で非推奨となり、v1.25 で削除されました。この文書は PSP を使う旧クラスターや、PSP リソースが残る環境を対象とします。現在のクラスターでは Pod Security Admission、Gatekeeper、Kyverno などで同等の制限を適用してください。

想定される影響

  • 侵害されたコンテナーが、より強い権限で悪用されるおそれがあります。
  • ホストや機密ファイルへの影響が大きくなる場合があります。
  • ワークロードの分離が弱まるおそれがあります。

対処方法

  • PSP に privileged: false と allowPrivilegeEscalation: false を設定してください。
  • runAsUser.rule を MustRunAsNonRoot に制限してください。
  • ワークロードに合わせて readOnlyRootFilesystem: true を適用し、root グループを許可しないようにしてください。

例

従来の PSP の関連フィールドだけを抜粋しています。ほかの必須フィールドとポリシーを使用する権限は省略しています。読み取り専用ルートファイルシステムは、非 root 実行とは別の制御です。

変更前

yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted
spec:
  privileged: true
  allowPrivilegeEscalation: true
  runAsUser:
    rule: "RunAsAny"
  supplementalGroups:
    rule: "RunAsAny"
  fsGroup:
    rule: "MustRunAs"
    ranges:
      - min: 0
        max: 65535

変更後

yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  runAsUser:
    rule: "MustRunAsNonRoot"
  supplementalGroups:
    rule: "MustRunAs"
    ranges:
      - min: 1
        max: 65535
  fsGroup:
    rule: "MustRunAs"
    ranges:
      - min: 1
        max: 65535
  readOnlyRootFilesystem: true

補足:

  • 変更前: root 実行と権限昇格を許可し、コンテナー侵害時の影響を大きくするおそれがあります。
  • 変更後: 非 root 実行を必須にし、権限昇格を防いで分離を強化します。

参考資料