Windows のアクセス権要求を理解

このページには、 Docker Desktop を Windows 上にインストールして実行するために必要な、アクセス権の要求についての情報が入っています。プロセス com.docker.service.exe に対する 特権ヘルパーサービス(privileged helper process) について、この手法の背景にある理由を扱います。

また、ホスト上、および、特権を持つ Windows Docker Engine と Windows コンテナーにおいて、 Administrator (管理者)アクセス権を持つのではなく、コンテナを root として実行するのも明確にします。

アクセス権の要求(permission requirements)

Windows の Docker Desktop は Administrator (管理者)特権がなくても実行できますが、インストール時には特権が必要です。ユーザがインストールしようとすると、インストールのために特権ヘルパーサービスに特権を許可するかどうか尋ねるユーザーアカウント制御(UAC)プロンプトが開きます。以降、ユーザは docker-users グループのメンバーとして指定があれば、 Docker Desktop を管理者権限がなくても実行できます。インストールをするユーザは自動的にこのグループに追加されますが、他のユーザは手動で追加する必要があります。これにより、管理者は誰が Docker Desktop にアクセスできるか制御できるようになります。

Docker Desktop が特権ヘルパープロセス com.docker.service.exe を使うようにしている理由は、限定的な一連の特権が必要な操作を処理するためです。この手法は、最小限の権限という原則に従い、間違いなく必要な処理のみ Administrator (管理者)にアクセスできるようにするため、Docker Desktop に特権を与えないまま利用できます。

特権ヘルパー(privileged helper)

特権ヘルパー com.docker.service.exe はバックグラウンドで動作する Windows サービスであり、 SYSTEM 特権を持ちます。名前付きパイプ //./pipe/dockerBackendV2 をリッスンします。開発者が Docker Desktop アプリケーションを実行するとき、名前付きパイプに接続して、サービスに対する命令を送信します。この名前付きパイプは保護されているため、 docker-users グループのユーザーのみが接続できます。

サービスは以下の機能を処理します:

  • kubernetes.docker.internal が Win32 hosts ファイルで定義されているのを確認します。DNS 名 kubernetes.docker.internal の定義により、Docker はコンテナと Kubernetes コンテクストとを共有できるようにします。

  • レジストリ アクセス マネジメント ポリシーは、開発者に対しては読み込み専用のため、安全にキャッシュします。

  • Hyper-V 仮想マシン "DockerDesktopVM" を作成し、仮想マシンの開始、停止、削除といったライフサイクルを管理します。仮想マシンの名前はサービスコードによってハードコード(固定)されているため、サービスは他の仮想マシンの作成や操作ができません。

  • VHDX ディスク容量を取得します。

  • VHDX ファイルやフォルダを移動します。

  • Windows Docker Engine を開始または停止し、実行中かどうかを確認します。

  • Windows コンテナーのデータファイルを削除します。

  • Hyper-V が有効化されているかどうかを確認します。

  • Hyper-V のブートローダーの有効化を確認します。

  • 必要な Windows 機能が、インストール済みで有効化されているのを確認します。

  • ヘルスチェックを実施し、サービス自身のバージョン情報を取得します。

Linux VM 内で root としてコンテナを実行

Linux Docker デーモンとコンテナは、Docker によって管理されている軽量な Linux VM 内で実行されます。これはつまり、コンテナはデフォルトでは root として実行しているとはいえ、Windows ホストマシンに対しての Administrator (管理者)アクセス許可ではありません。Linux VM サーバはセキュリティ境界であり、ホストからどのリソースにアクセスできるか制限があります。ホストから Docker コンテナ内にバインド マウントされる、ユーザースペースで作成されたファイルサーバーやあらゆるディレクトリは、元々のパーミッションを維持したままです。まだアクセスできないファイルに対しては、ユーザーに対してアクセス権を与えません。

Windows コンテナー

仮想マシン内で実行される Linux Docker Engine やコンテナとは異なり、Windows コンテナーはオペレーティングシステムとしての機能です。そのため、実行には Windows ホストで Administrator (管理者)特権が直接必要です。Windows コンテナーを開発者に対して実行させたくない組織の場合、 バージョン 4.11 から機能を無効かするために、インストーラで --no-windows-containers のフラグが利用できます。

ネットワーク機能

ネットワーク疎通のため、Docker Desktop はユーザー空間プロセス( vpnkit )を使います。これは、ユーザが Docker Desktop を起動する時、ファイアウォールのルールや、VPN、HTTP プロキシプロパティ等の制限を継承します。

参考

Understand permission requirements for Windows | Docker Documentation

https://docs.docker.com/desktop/windows/permission-requirements/