Podレベルのセキュリティコンテキスト設定

Podレベルとコンテナレベルのセキュリティコンテキスト設定を検証します。securityContext、capabilities、読み取り専用ファイルシステムのベストプラクティスを学びます。

Security

詳細な説明

Pod Security Contextの解説

Kubernetesのセキュリティコンテキストは、Podレベルとコンテナレベルの2つのレベルで権限とアクセス制御を定義します。Podレベルの設定はすべてのコンテナに適用され、コンテナレベルの設定はオーバーライドまたは追加できます。

適切なセキュリティコンテキストの例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: secure-app
  labels:
    app: secure
spec:
  replicas: 2
  selector:
    matchLabels:
      app: secure
  template:
    metadata:
      labels:
        app: secure
    spec:
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        runAsGroup: 3000
        fsGroup: 2000
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: app
          image: myapp:2.1.0
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            capabilities:
              drop:
                - ALL
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 500m
              memory: 256Mi
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080

セキュリティコンテキストフィールド

Podレベル(spec.securityContext):

フィールド 目的
runAsNonRoot コンテナのroot実行を防止
runAsUser / runAsGroup すべてのコンテナのUID/GIDを設定
fsGroup マウントされたボリュームのグループ所有権を設定
seccompProfile システムコールを制限

コンテナレベル(containers[].securityContext):

フィールド 目的
allowPrivilegeEscalation 子プロセスの権限取得を防止
readOnlyRootFilesystem コンテナファイルシステムを読み取り専用に
capabilities きめ細かいLinux capability制御
privileged 完全なホストアクセスを付与(避けるべき!)

推奨設定

ほとんどのワークロードでは、このベースラインを使用してください:

  • PodレベルでrunAsNonRoot: true
  • コンテナレベルでallowPrivilegeEscalation: false
  • 可能な場合はreadOnlyRootFilesystem: true
  • capabilities.drop: ["ALL"]で必要なものだけ追加

ユースケース

RestrictedレベルのPod Security Standardsを満たす必要がある本番ワークロードのセキュリティコンテキスト設定。マルチテナントクラスターや規制環境に不可欠。

試してみる — K8s Manifest Validator

フルツールを開く