説明
/var/run/docker.sock をマウントし、コンテナーに接続権限を与えると、Docker デーモン API を直接使用できます。通常の root 権限で動くホストデーモンでは、他のコンテナーやホストファイルシステムを制御する経路になり得ます。
多くのアプリケーションにはこのアクセスは不要です。ソケットを読み取り専用でマウントしても、デーモン API の操作が読み取り専用になるわけではありません。
想定される影響
侵害されたコンテナーが、デーモンの権限で他のワークロードを作成・変更したり、ホストデータにアクセスしたりするおそれがあります。実際の範囲はデーモンの権限とソケットのアクセス制御に依存しますが、アプリケーションの隔離を大きく弱める可能性があります。
対処方法
- 不要な Docker ソケットのボリュームとマウントを削除してください。
- ビルドや運用の自動化には専用ビルダーや別の隔離環境を使い、必要な API アクセスだけを制限して許可してください。
- 削除後に必要な機能を確認し、通常のデータボリュームでもホストパスとファイル権限を最小限にしてください。
例
ホストに Docker ソケットとデータディレクトリが存在する場合のマウント比較です。イメージへのアクセスとアプリケーション設定は環境に合わせて準備してください。
変更前
yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /var/run/docker.sock
type: Socket
実際の Unix ソケットを Socket 型でマウントします。ファイル権限で接続が許可されれば、コンテナーは Docker API を使用できます。
変更後
yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /data
type: Directory
Docker ソケットの代わりにデータディレクトリをマウントしています。/data へのホストアクセスは残るため、範囲、ファイル権限、読み取り専用にできるかを確認してください。