説明
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 に保存する設定も別途必要です。