Kubernetes コンテナーのルートファイルシステム書き込み権限の確認

必要な書き込み先を分離し、ルートファイルシステムを読み取り専用にしてください。

説明

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

ルートファイルシステムを読み取り専用にしています。別のボリュームの書き込み権限と既存ワークロードの置換は、別途管理する必要があります。

参考資料