web-dev-qa-db-ja.com

sudoなしでdockerを使用するにはどうすればよいですか?

Dockerのドキュメントページでは、次のように、すべてのサンプルコマンドがSudoなしで表示されます。

docker ps

Ubuntuでは、バイナリはdocker.ioと呼ばれます。また、Sudoなしでは機能しません。

Sudo docker.io ps

すべてのDockerコマンドの前にsudoを付ける必要がないように、Dockerを構成するにはどうすればよいですか?

757
Flimm

良いニュース:新しいdocker(バージョン19.03(現在実験中))は、rootユーザーを使用して発生する可能性のある問題を無効にしてrootlessを実行できるようになります。昇格されたアクセス許可、ルート、および望まないときにマシンを開く可能性のあるものをいじることはもうありません。

これに関するビデオ [DockerCon 2019] RootlessモードでDockerデーモンを強化する

ルートレスDockerモードに関するいくつかの注意事項

Dockerエンジニアは、ルートレスモードはDockerエンジン機能の完全なスイートの代替と見なすことはできないと言います。ルートレスモードには次の制限があります。

  • cgroupsリソース制御、apparmorセキュリティプロファイル、チェックポイント/復元、オーバーレイネットワークなどは、ルートレスモードでは機能しません。
  • 現在、コンテナからポートを公開するには、手動のsocatヘルパープロセスが必要です。
  • Ubuntuベースのディストリビューションのみが、ルートレスモードのオーバーレイファイルシステムをサポートしています。
  • 現在、ルートレスモードは、以前ほど安定していないナイトリービルドに対してのみ提供されています。

Docker 19.3の時点では、これは廃止されています(必要以上に危険です):

dockerマニュアル には、これについて言うことがあります:

非ルートアクセスの付与

Dockerデーモンは常にrootユーザーとして実行され、Dockerバージョン0.5.2以降、dockerデーモンはTCPポートではなくUnixソケットにバインドします。デフォルトでは、Unixソケットはユーザーrootが所有しているため、デフォルトではSudoを使用してアクセスできます。

バージョン0.5.3から、ユーザー(またはDockerインストーラー)がdockerというUnixグループを作成してユーザーを追加すると、Dockerデーモンは、デーモンの起動時に、DockerグループがUnixソケットの所有権を読み取り/書き込み可能にします。 Dockerデーモンは常にルートユーザーとして実行する必要がありますが、Dockerクライアントをdockerグループのユーザーとして実行する場合は、すべてのクライアントコマンドにSudoを追加する必要はありません。 0.9.0では、-Gオプションを使用して、docker以外のグループがUnixソケットを所有するように指定できます。

警告:Dockerグループ(または-Gで指定されたグループ)はルートと同等です。 Docker Daemon Attack Surfaceの詳細 およびこのブログ投稿を参照してください 非ルートユーザーがCentOS、Fedora、またはRHELでDockerを実行できないようにする理由(michael-nに感謝)。

GitHubの実験的ルートレスモード の最近のリリースでは、ルートレスモードでは、user_namespaces(7)、mount_namespaces(7)、network_namespaces(7)を使用して、特権のないユーザーとしてdockerdを実行できます。

ユーザーは、dockerdの代わりにdockerd-rootless.shを実行する必要があります。

$ dockerd-rootless.sh --experimental

Rootlessモードは実験的であるため、ユーザーは常に-experimentalを指定してdockerd-rootless.shを実行する必要があります。


読むことが重要: Linuxのインストール後の手順Docker Daemon Attack Surfaceの詳細 にもリンクしています)。

非ルートユーザーとしてDockerを管理する

Dockerデーモンは、TCPポートではなくUnixソケットにバインドします。デフォルトでは、Unixソケットはユーザーrootによって所有され、他のユーザーはSudoを使用してのみアクセスできます。 dockerデーモンは常にrootユーザーとして実行されます。

Dockerコマンドを使用するときにSudoを使用したくない場合は、dockerというUnixグループを作成し、それにユーザーを追加します。 dockerデーモンが起動すると、Unixソケットの所有権がdockerグループによって読み取り/書き込み可能になります。


  • まだ存在しない場合は、ドッカーグループを追加します。

    Sudo groupadd docker
    
  • 接続ユーザー「$ USER」をdockerグループに追加します。現在のユーザーを使用しない場合は、優先ユーザーに一致するようにユーザー名を変更します。

    Sudo gpasswd -a $USER docker
    
  • newgrp dockerを実行するか、ログアウト/ログインしてグループへの変更を有効にします。

  • 使用できます

    docker run hello-world
    

    sudoなしでdockerを実行できるかどうかを確認します。

1119
Rinzwind

Sudoなしでdockerコマンドを実行するには、ユーザー(root権限を持つ)をdockerグループに追加する必要があります。この実行では、次のコマンドを実行します。

 Sudo usermod -aG docker $USER

ここで、ユーザーをログアウトさせてから再度ログインしてください。このソリューションは、適切なインストールプロセスで here で説明されています。

195

ユーザーをグループdockerに追加してdockerを実行する許可を与えるメカニズムは、/var/run/docker.sockでdockerのソケットにアクセスすることです。 /var/runを含むファイルシステムがACLを有効にしてマウントされている場合、これはACLを介しても実現できます。

Sudo setfacl -m user:$USER:rw /var/run/docker.sock

完全を期すためにのみこれを含めています。

一般に、グループに基づいた適切な代替手段が利用可能な場合は常にACLを避けることをお勧めします。グループメンバシップのみを確認することでシステムの特権を理解できる場合はより良い方法です。システム権限を理解するためにACLエントリのファイルシステムをスキャンすることは、セキュリティ監査の追加の負担です。

警告1:これは、rootusernameグループに追加するのと同じdockerの同等性を持ちます。ホストファイルシステムにrootアクセスできる方法でコンテナを起動できます。

警告2:ACLは、グループベースのセキュリティよりもセキュリティ監査にとって非常に困難です。少なくとも監査関連の環境でグループを代わりに使用できる場合は、可能であればACLを避けてください。

52
Christian Hujer