コンテナーの root 実行防止設定の確認

イメージとセキュリティコンテキストを併せて確認し、不要な root 実行を防いでください。

説明

root で動作すると、アプリケーションが侵害されたときにファイルやプロセスへ行使できる権限が大きくなる場合があります。非 root 実行を基本とし、実際の UID と付与した権限を確認してください。

runAsNonRoot が false であることだけでは root 実行は確定しません。実際のユーザーは runAsUser、Pod・コンテナー設定、イメージの既定ユーザーによって決まります。コンテナーの root が、直ちにホスト全体への権限を意味するわけでもありません。

想定される影響

侵害されたアプリケーションが、コンテナー内で不要なファイル変更や管理操作を行うおそれがあります。危険な capability、ホストマウント、他の隔離上の問題と組み合わさると、被害が広がる可能性があります。

対処方法

  • runAsNonRoot: true で root 実行を防ぎ、イメージが対応する非 root の runAsUser を指定してください。
  • Pod 設定だけでなく、各コンテナーと初期化コンテナーの上書き設定も確認し、必要なファイル・ボリューム権限を準備してください。
  • 不要な capability とホストアクセスを減らし、非 root ユーザーで正常に動作することを検証してください。

例

コンテナー設定が Pod の既定値より優先される例です。指定 UID でイメージとファイル権限が適合するか確認してください。

変更前

yaml
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-2
spec:
  securityContext:
    runAsUser: 1000
    runAsNonRoot: false
  containers:
    - name: sec-ctx-demo-2
      image: gcr.io/google-samples/node-hello:1.0
      securityContext:
        runAsUser: 0
        allowPrivilegeEscalation: false
        runAsNonRoot: false

Pod の既定 UID が 1000 でも、このコンテナーは UID 0 で動作します。allowPrivilegeEscalation: false は、すでに root のプロセスを非 root に変更しません。

変更後

yaml
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-2
spec:
  securityContext:
    runAsUser: 10000
    runAsNonRoot: true
  containers:
    - name: sec-ctx-demo-2
      image: gcr.io/google-samples/node-hello:1.0
      securityContext:
        runAsUser: 10100
        allowPrivilegeEscalation: false
        runAsNonRoot: true

コンテナーを UID 10100 で実行し、root 実行を防ぎます。アプリケーションが必要なパスだけにアクセスできるよう、ファイル権限も設定してください。

参考資料