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


767

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

docker ps

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

sudo docker.io ps

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


1
ufwを有効にすることを忘れないでください;)
Rinzwind 14

2
Ubuntu 14.04 には、「docker」バイナリもあります。
アナトリーテクトニク14

@anatolytechtonik私はまた、14.04 LTSのUbuntuではなく「docker.io」の「ドッカ」を使用
Nabin

2
推奨されるインストールは 、デフォルトのUbuntuリポジトリのドッカーではありません。代わりに、こちらの手順(docs.docker.com/engine/installation/linux/ubuntulinux)、dockerリポジトリの使用をお勧めします。既存のdockerをすべて削除し、正しいソースから取得していることを確認します:apt-cache policy docker-engine(apt urlはdockerproject.orgからのものである必要があります)
マイケル

2
エイリアスはどうですか:?そのようにして、パスワード保護を使用してsudoを引き続き使用します。エイリアスdocker = "sudo
docker

回答:


1137

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

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

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

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

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

docker 19.3の時点では、これは時代遅れです(必要以上に危険です):

ドッキングウィンドウのマニュアルは、これはそれについて言いたいことがあります。

非ルートアクセスの付与

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で指定されたグループ)はルートと同等です。参照ドッカーデーモン攻撃面の詳細とで、このブログ投稿私たちは、root以外のユーザーは、CentOSの、Fedoraの、またはRHELにドッカーを実行させてはいけないのはなぜ(おかげでマイケル-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を実行できるかどうかを確認します。


3
ええ、しかし、すべての特権プロセスは悪用の可能性を開きます。Dockerは、そのレベルの特権を実際に強制するために、オペレーティングシステムに深く接続していますか?
マット

3
newgrp docker私のために働かなかった、私はログアウトしなければならなかった。
lolmaus-アンドレイミハイロフ

43
これにより、そのユーザーに無制限の、パスワードで保護されていないルートアクセスが与えられることに注意してください。詳細を参照してください。ここでの脆弱性を
クリス・フォスター

2
この変更を行うためにdockerデーモンを再起動する必要はありません!! 追加したばかりのユーザーがログアウトしてから再度ログインするようにします。
トミー

4
を使用するとdocker login.dockerホームフォルダーに作成されたフォルダーがに属してrootいることがわかります。したがって、dockerコマンドの実行時に次の警告が表示されますWARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied。次の.dockerように、sudoを使用せずにユーザーのフォルダーにアクセスできるようにしましたsudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.dockerchgrpしかし助けていないようでしたので、おそらく私だけのchownステップを勧告すべきです。
Birchlabs

202

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

 sudo usermod -aG docker $USER

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


14
グループにユーザーを追加した後、次のコマンドを実行します
。sg

4
この変更を行うためにOSを再起動する必要はありません!それは実行中のすべてのコンテナを爆撃します!追加したばかりのユーザーにログアウトしてからログインしてもらいます
トミー

5
そのコマンドは、他の回答の「sudo gpasswd -a $ {USER} docker」とどう違うのですか?すべてであれば...
アシュリーエイトケン

9
ドキュメントで与えられた警告を追加してもらえますか:「ドッカーグループ[...]はルートと同等です」ので、人々はそれについて考える機会があります
-Murmel

2
2歳以上の回答と同じ効果がありますが、セキュリティリスクに関する警告はありません
Gert van den Berg

57

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

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

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

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

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

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


5
これは、16.04で働いた
edib

これは私が必要としたものであり、他の答えは、ユーザーにルート権限が必要です。どうもありがとう!
Mrinal Saurabh

1
ずっと良い方法です。グループドッキングウィンドウはルートと同等であり、常に危険の兆候です。また、この1つのファイルの所有権を取得しても不利な点はありません。
ゼロス

5
私が正しく理解していれば@Xerus、誰もルート同等の権限を取得することができ、このソケットに書き込むことができます。したがって、ACLを介して誰かにこのソケットへのアクセスを許可すると、その人をdockerグループに追加するのと同じセキュリティ効果があります。
パウロEbermann

1
私のためにLinux Mint 19で働いた。ありがとう。
私たちはボルグです
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.