説明
readOnlyRootFilesystem が false の場合や既定値で書き込みが許可される場合、プロセスはファイル権限の範囲でルートファイルシステムを変更できます。侵害時には、コンテナーの書き込み可能なレイヤーにファイルを残したり、設定を変更したりする余地が増えます。root ユーザーでの実行とは別の設定であり、別途マウントしたボリュームまで読み取り専用になるわけではありません。
想定される影響
- 実行中にファイルが変更されたり、悪意あるファイルが残ったりする場合があります。
- 障害や侵害後の状態分析が難しくなるおそれがあります。
対処方法
- readOnlyRootFilesystem: true を適用し、書き込みが必要なログ・キャッシュ・一時ファイルのパスは、制限した別のボリュームに分離してください。実際のアプリケーション動作を試してください。
- ボリュームの書き込み権限、実行ユーザー、allowPrivilegeEscalation も別途確認してください。読み取り専用ルートファイルシステムだけで、すべての悪意ある動作を防げるとは考えないでください。
例
過去の goproxy イメージで設定だけを比較します。実際のデプロイには保守されている検証済みイメージを使ってください。Pod 名が異なるため、変更後の Pod を作成しても既存の Pod は変更されません。
変更前
yaml
apiVersion: v1
kind: Pod
metadata:
name: rootfalse
spec:
containers:
- name: app
image: k8s.gcr.io/goproxy:0.1
securityContext:
readOnlyRootFilesystem: false
ルートファイルシステムを読み取り専用に制限していません。実際の書き込み範囲にはファイル権限も適用されます。
変更後
yaml
apiVersion: v1
kind: Pod
metadata:
name: roottrue
spec:
containers:
- name: app
image: k8s.gcr.io/goproxy:0.1
securityContext:
readOnlyRootFilesystem: true
ルートファイルシステムを読み取り専用にしています。別のボリュームの書き込み権限と既存ワークロードの置換は、別途管理する必要があります。