ユーザーrestricted
がいて、ユーザーは自分のファイルにしかアクセスできません。これは非rootユーザーであるため、Dockerを使用できません(docker run foo
=> docker: Got permission denied while trying to connect to the Docker daemon socket...
)。
このユーザーが自分のファイルスペースからのみ独自のDockerイメージを作成できるようにし、自分が作成した自分のイメージのみを削除/ rmiできるようにしたいと考えています。さらに、自分のイメージを実行して、自分のイメージコンテナを停止することしかできません。
私が読んだ質問から、これが発生する唯一の方法は、root以外のユーザーがいるグループにrootユーザーを追加することであり、これにより大きな脆弱性のリスクが生じます。
Dockerでコンテナー(およびアプリケーション)を実行するということは、Dockerデーモンを実行することを意味します。ルートレスモードにオプトインしない限り、このデーモンにはルート権限が必要です(試験的)...
このモードの説明は、GitHubにあります。
https://github.com/docker/engine/blob/v19.03.0-rc3/docs/rootless.md
このユーザーが自分のファイルスペースからのみ独自のDockerイメージを作成できるようにし、自分が作成した自分のイメージのみを削除/ rmiできるようにしたいと考えています。
コンテナーをビルドするだけの場合は、 img
を使用してみてください。
スタンドアロン、デーモンレス、非特権のDockerfileおよびOCI互換のコンテナーイメージビルダー。
このツールはコンテナの構築に使用でき、デフォルトでは権限なしで実行されます。
さらに、自分のイメージを実行して、自分のイメージコンテナを停止することしかできません。
残念ながら、前述のように、img
はコンテナーを実行できず、コンテナーをビルドするだけです。
ここにある素晴らしい答えから:
朗報:新しいdocker(バージョン19.03(現在実験段階))はrootなしで実行でき、rootユーザーを使用して発生する可能性がある問題を無効にします。昇格されたアクセス許可、ルート、および必要のないときにマシンを開く可能性のあるものをいじる必要はもうありません。
これに関するビデオ [DockerCon 2019]ルートレスモードでのDockerデーモンの強化
ルートレスDockerモードの注意事項
Dockerエンジニアは、ルートレスモードをDockerエンジン機能の完全なスイートの代わりと見なすことはできないと述べています。ルートレスモードには、次のような制限があります。
- cgroupsリソース制御、apparmorセキュリティプロファイル、チェックポイント/復元、オーバーレイネットワークなどは、ルートレスモードでは機能しません。
- 現在、コンテナーからポートを公開するには、手動のsocatヘルパープロセスが必要です。
- Ubuntuベースのディストリビューションのみが、ルートレスモードのオーバーレイファイルシステムをサポートしています。
- ルートレスモードは現在、慣れているほど安定していない可能性があるナイトリービルドに対してのみ提供されています。
Docker 19.3以降、これは廃止されました(必要以上に危険です)。
docker manual はこれについて言っています:
ルート以外のアクセス権を付与しています
Dockerデーモンは常にrootユーザーとして実行され、Dockerバージョン0.5.2以降、dockerデーモンはTCPポートではなくUnixソケットにバインドします。デフォルトでは、Unixソケットはユーザーrootなので、デフォルトではSudoを使用してアクセスできます。
バージョン0.5.3から、あなた(またはDockerインストーラー)がdockerというUnixグループを作成し、それにユーザーを追加すると、Dockerデーモンは、デーモンの起動時に、DockerグループによるUnixソケットの所有権を読み取り/書き込み可能にします。 dockerデーモンは常にrootユーザーとして実行する必要がありますが、dockerクライアントをdockerグループのユーザーとして実行する場合、すべてのクライアントコマンドにSudoを追加する必要はありません。 0.9.0以降では、-Gオプションを使用して、docker以外のグループがUnixソケットを所有するように指定できます。
警告:Dockerグループ(または-Gで指定されたグループ)はrootと同等です。 Docker Daemon Attack Surface詳細 とこのブログ投稿 非rootユーザーに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
ルートレスモードは実験的なものであるため、ユーザーは常に-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グループによって読み取り/書き込み可能になります。
Dockerグループが存在しない場合は追加します。
Sudo groupadd docker
接続しているユーザー「$ USER」をdockerグループに追加します。現在のユーザーを使用したくない場合は、ユーザー名を希望のユーザーと一致するように変更します。
Sudo gpasswd -a $USER docker
newgrp docker
またはログアウト/ログインして、グループへの変更を有効にします。
使用できます
docker run hello-world
sudoなしでdockerを実行できるかどうかを確認します。
docker run foo => docker: Got permission denied while trying to connect to the Docker daemon socket...
docker
グループに対する十分な権限なしでソケットを作成するときのようです。エラーは何度も発生し、毎回コマンドを再実行します。これは、再起動するたびにchmod
のセキュリティホールを本当にハードにオープンします。
問題はSystemDによるもので、ソケットはroot:root
。これで確認できます:
ls -l /lib/systemd/system/docker.socket
これが良ければ、これを見るべきですroot:docker
ないroot:root
。
この問題 からのソリューション。あなたはこの仕事を試すことができます:
$Sudo chgrp docker /lib/systemd/system/docker.socket
$Sudo chmod g+w /lib/systemd/system/docker.socket
$Sudo chmod 666 /var/run/docker.sock
これは、グラフィック環境にあり、おそらくコンピュータ上の唯一のユーザーである場合に機能するはずです。この場合、再起動が必要です。
お役に立てれば。
Root以外のユーザーとしてのDockerの管理デフォルトでは、Unixソケットはユーザーrootが所有しており、他のユーザーはSudoを使用してのみアクセスできます。 dockerデーモンは常にrootユーザーとして実行されます。 dockerコマンドを使用するときにSudoを使用したくない場合は、dockerという名前のUnixグループを作成し、そこにユーザーを追加します。