機密性の高い OS ディレクトリをマウントする Kubernetes ワークロード

機密性の高いホストディレクトリを hostPath でマウントすると、ノードの情報やファイルへのアクセスが広がります。

説明

hostPath で /proc、/etc、/var、/root、/ などの重要なホストディレクトリをマウントすると、コンテナーからノードの設定、プロセス情報、システムファイルにアクセスできます。一部のシステムエージェントでは必要ですが、通常のアプリケーションでは不要なホストアクセスを避けてください。

実際の影響は、マウントしたパスとファイル権限によって異なります。読み取り専用マウントは書き込みを制限しますが、情報の開示までは防ぎません。

想定される影響

  • ノードの設定、ログ、認証情報などの機密情報が漏えいする可能性があります。
  • 書き込みが許可されている場合、ホストファイルの改ざんやサービス障害につながるおそれがあります。
  • コンテナーの侵害がノードや他のワークロードに及ぼす影響が大きくなる可能性があります。

対処方法

  • 重要なディレクトリへの不要なマウントを削除してください。設定には ConfigMap、機密情報には Secret、永続データには適切なストレージの PVC を検討してください。
  • 必須の例外は承認したワークロードと最小限のパスに絞り、書き込みが不要なら読み取り専用でマウントしてください。
  • ストレージの変更時には必要なデータと権限を移行し、アプリケーションが実際に新しいパスを使うことを確認してください。

例

次の二つの例は、異なるワークロードのストレージ構成です。二つ目は、一つ目のアプリケーションをそのまま移行する手順ではありません。

変更前

yaml
apiVersion: v1
kind: Pod
metadata:
  name: web-server-pod
spec:
  volumes:
    - name: nginx-host-config
      hostPath:
        path: /etc/nginx
  containers:
    - name: nginx-container
      image: nginx
      volumeMounts:
        - mountPath: /etc/nginx
          name: nginx-host-config

ノードの /etc/nginx をコンテナーに直接接続しています。ファイル権限が許せば、コンテナーからホストの設定を読み取ったり変更したりできます。

変更後

yaml
apiVersion: v1
kind: Pod
metadata:
  name: redis-empty-dir
spec:
  containers:
    - name: redis
      image: redis
      volumeMounts:
        - name: redis-storage
          mountPath: /data/redis
  volumes:
    - name: redis-storage
      emptyDir: {}

emptyDir は指定した重要なホストディレクトリを直接公開しません。ただし、Pod がノードから削除されるとデータも失われるため、永続ストレージの代わりにはなりません。アプリケーションが /data/redis に保存する設定も別途必要です。

参考資料