コンテナーに公開された Docker デーモンソケット

不要な Docker ソケットマウントを削除し、ホストランタイムへのアクセスを隔離してください。

説明

/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 へのホストアクセスは残るため、範囲、ファイル権限、読み取り専用にできるかを確認してください。

参考資料