説明
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 実行を防ぎます。アプリケーションが必要なパスだけにアクセスできるよう、ファイル権限も設定してください。