
Docker のドキュメント ページでは、すべてのサンプル コマンドは なしで表示されますsudo
(次の例を参照)。
docker ps
Ubuntu では、バイナリは と呼ばれますdocker.io
。 もなければ動作しませんsudo
:
sudo docker.io ps
すべての Docker コマンドの前に を付ける必要がないように Docker を構成するにはどうすればよいでしょうかsudo
?
答え1
良いニュースです。新しい Docker バージョン 19.03 (現在は実験段階) は、ルートレスで実行できるため、ルート ユーザーの使用時に発生する可能性のある問題が解消されます。昇格された権限、ルート、および意図しないときにマシンを開く可能性のあるその他の操作を行う必要がなくなります。
これについてのビデオ[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 デーモンはデーモンの起動時に Unix ソケットの所有権を docker グループが読み取り/書き込みできるようにします。docker デーモンは常に root ユーザーとして実行する必要がありますが、docker グループのユーザーとして docker クライアントを実行する場合は、すべてのクライアント コマンドに sudo を追加する必要はありません。0.9.0 以降では、-G オプションを使用して、docker 以外のグループが Unix ソケットを所有するように指定できます。
警告: dockerグループ(または-Gで指定されたグループ)はルートと同等です。Dockerデーモンの攻撃対象領域の詳細そしてこのブログ投稿CentOS、Fedora、RHEL で非ルート ユーザーに Docker を実行させない理由(マイケル・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デーモンの攻撃対象領域の詳細)。
非ルートユーザーとしてDockerを管理する
docker デーモンは、TCP ポートではなく Unix ソケットにバインドします。デフォルトでは、その Unix ソケットはユーザー root によって所有され、他のユーザーは sudo を使用してのみアクセスできます。docker デーモンは常に root ユーザーとして実行されます。
docker コマンドを使用するときに sudo を使用したくない場合は、docker という Unix グループを作成し、そのグループにユーザーを追加します。docker デーモンが起動すると、Unix ソケットの所有権が docker グループによって読み取り/書き込み可能になります。
docker
グループがまだ存在しない場合は追加します。sudo groupadd docker
接続されたユーザー「$USER」を
docker
グループに追加します。現在のユーザーを使用しない場合は、ユーザー名を希望のユーザーに合わせて変更します。sudo gpasswd -a $USER docker
newgrp docker
グループへの変更を有効にするには、 を実行するか、ログアウト/ログインしてください。使用できます
docker run hello-world
なしで Docker を実行できるかどうかを確認します
sudo
。
答え2
なしで docker コマンドを実行するにはsudo
、ユーザー (ルート権限を持つ) を docker グループに追加する必要があります。そのためには、次のコマンドを実行します。
sudo usermod -aG docker $USER
次に、ユーザーをログアウトさせて再度ログインさせます。この解決策はよく説明されていますここ適切なインストールプロセスを実行します。
答え3
ユーザーをグループに追加して docker を実行する権限を付与するメカニズムは、docker
の docker のソケットにアクセスすることです/var/run/docker.sock
。 を含むファイルシステムが/var/run
ACL を有効にしてマウントされている場合は、ACL 経由でもこれを実現できます。
sudo setfacl -m user:$USER:rw /var/run/docker.sock
完全性のためだけにこれを含めています。
一般的に、グループに基づく適切な代替手段が利用できる場合は、ACL を避けることをお勧めします。システム内の権限は、グループ メンバーシップのみを見て理解できる方がよいでしょう。システム権限を理解するために ACL エントリのファイル システムをスキャンする必要があると、セキュリティ監査の負担が増します。
警告1: これはグループへのroot
追加と同じ効果があります。ホストのファイルシステムにアクセスできる方法でコンテナを起動することは可能です。$USER
docker
root
警告2: ACL は、グループベースのセキュリティよりもセキュリティ監査にとって非常に困難です。少なくとも監査関連の環境では、グループを使用できる場合は、可能であれば ACL を避けることをお勧めします。
答え4
Docker コンテナはスーパーユーザーによって実行される必要があります。自分自身をグループに追加することはできますがdocker
( を実行するなどsudo usermod -aG docker $USER
)、これにより、アカウントにアクセスできるすべてのユーザーがマシンへのルート アクセスを簡単に取得できるようになります$USER
(特権コンテナにルート ボリュームをマウントするなど)。
よりセキュリティに配慮したDockerコンテナを非ルートユーザーとして実行するには、ポッドマンウェブサイトより:
Podmanは、Linuxシステム上でOCIコンテナを開発、管理、実行するためのデーモンレスコンテナエンジンです。コンテナはrootとして実行することも、ルートレスモード。 簡単に言えば:
alias docker=podman
。
もう一つの選択肢は特異点これは、HPC 環境でより一般的に導入されています。