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

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

また、ホスト上で root アクセス権を持つのではなく、コンテナを root として実行するのも明確にします。

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

標準のセットアップ手順では、 Docker Desktop for Mac のインストールに管理者権限を必要としません。ですが、始めての実行時、 root 権限の許可が必要です。Docker Desktop の初回起動時、特権ヘルパーサービスをインストールする権限を与えるよう、管理者としてログインするようユーザに求めます。以降の実行では、 root 権限は不要です。

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

Docker Desktop for Mac のバージョン 4.11 以上からは、 コマンドでのインストール--user フラグを使うと、バックグランドで特権ヘルパーサービスが実行するのを阻止します。この結果、 com.docker.vmnet はインストール中のみ利用されますが、実行時には無効化されます。そうすると、 Docker Desktop を始めて実行する時に、管理者としてのログインを求める画面が表示されません。具体的に、 --user フラグとは:

  • 以前の com.docker.vmnetd が存在する場合、アンインストール

  • ユーザに対する :ruby;`シンボリックリンク <symlinks>` のセットアップ

  • localhostkubernetes.docker.internal/etc/hosts に確実に現れるようにする

この手法には、以下の制限があります:

特権ヘルパー(privileged helper)

特権ヘルパーは launched によって起動され、前述の通り、無効化しなければ実行時にバックグラウンドで動き続けます。Docker Desktop バックエンドとは、 Unix ドメインソケット /var/run/com.docker.vmnetd.sock で通信します。次のような処理が行われます:

  • /usr/local/bin にシンボリックリンクをインストールまたはアンインストールする。これにより docker CLI がユーザのシェル上のパスになくても、ログアウトやログアウトせずに利用できる。

  • 特権ポートの 確保(bind) は 1024 以下。いわゆる「 特権ポート(privileged ports) 」は一般的にセキュリティ境界として使用していない。しかし、 OS では依然として特権のないプロセスによるポート確保を防ごうとするので、 docker run -p 80:80 nginx のようなコマンドは使えない。

  • localhostkubernetes.docker.internal` ``/etc/hosts で定義されるようにする。いくつかの古い macOS へのインストールでは、 /etc/hostslocalhost がないため、 Docker は起動失敗します。 DNS 名 kubernetes.docker.internal の定義により、Kubernetes のコンテキストにコンテナを共有できる。

  • 開発者には、読み込み専用のレジストリ アクセス管理ポリシーを、安全にキャッシュする。

  • 特権へルパをアンインストールする。

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

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

参考

Understand permission requirements for Mac

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