質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

2161閲覧

Docker for Macで,dockerグループへの追加等を行なっていないにも関わらず,sudoなしでdockerコマンドが実行できてしまう

退会済みユーザー

退会済みユーザー

総合スコア0

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

1クリップ

投稿2019/05/11 16:41

はじめに

様々なサイトを参考にHomebrewでDocker for Macをインストールしました.
はじめは何も疑問を持たずに色々試していましたが,こちらの記事をきっかけに
セキュリティについて気にするようになりました.
そして,いろいろ調べるうちに気になる点が出てきたので質問させていただきます.

環境

$ sw_vers ProductName: Mac OS X ProductVersion: 10.14.4 BuildVersion: 18E226 $ docker --version Docker version 18.09.2, build 6247962

他に必要な情報があればコメントお願いします.

気になる点

1つ目

様々なサイトを見ていると例えば「sudoなしでdockerコマンドを実行する方法」のような記事を見かけます.
つまり通常dockerコマンドにはsudoをつける必要があるような書き方です.
さらに中身を見てみると,「sudoをつけるか,dockerグループに入れる」と書いてあります.
ここなんですが,Docker for Macをインストールした時から,すでにsudoをつけずにdockerコマンドを使えましたし,
cat /etc/group | grep dockerdscl . list /Groupsでグループの確認を行なってもdockerグループなるものは存在しません.

この状態は正しいのでしょうか?

2つ目

こちらの記事の最後の方に

これはdockerdの設定で変更可能ですが、--privilegedを付けて実行できなくなります。

とありますが,
dockerdとは何でしょうか?また,その設定はどこで行えるのか教えていただけると幸いです.

最後に

また,Dockerを使っていく上でセキュリティ上気をつけることがあれば,
余裕のある範囲で些細なことでも構わないので,コメントを是非お願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんばんは。3点あるうち、1、2についてコメントさせていただきます。
間違いもあるかと思いますが、ご容赦くださいませ。

Docker for Macは、実際はいろいろなツールが組み合わさって提供されています。
ちょっとわかりにくいかもしれませんが、公式サイトのこちらを読まれるといいと思います。

1. dockerコマンドの実行権限について

Docker for Macの場合は、dockerコマンドはMac上に直にインストールされています。

ls -lFでコマンドの情報をチェックすると、シンボリックリンクで/Applications/Docker.app/Contents/Resources/bin/以下に実際のコマンドが格納されているのがわかります。

また、実行権限は rwxr-xr-x 755で、本人は読み書き実行、グループは読み&実行、その他のユーザも読み&実行可能になっています。

source:bash

1% ls -lF /usr/local/bin/docker 2lrwxr-xr-x 1 ユーザ名 staff 54 9 6 2018 /usr/local/bin/docker@ -> /Applications/Docker.app/Contents/Resources/bin/docker 3% ls -la /Applications/Docker.app/Contents/Resources/bin/docker 4-rwxr-xr-x 1 ユーザ名 admin 60079680 5 8 00:31 /Applications/Docker.app/Contents/Resources/bin/docker

Docker for Macをインストールした時から,すでにsudoをつけずにdockerコマンドを使えました

とありますが、Docker for Macの場合はインストーラーがセットアップ時にこのように権限を設定しているので、結果的にrootにならずともコマンドが使えるようになっています。
これは、「Mac上で簡単にDocker環境を利用する」という利便性のためにそうなっているのだと思います。

一方で、CentOSやUbuntuといったLinuxマシンでは、yumやaptのようなパッケージでインストールしても、デフォルトではrootでしかdockerコマンドが実行できないようになっています。

sudoするか、dockerコマンドのパーミッションを確認し、グループに実行権限が付いていれば、そのグループにdockerコマンドを利用させたいユーザを所属させる...という作業を行います。

2. dockerdについて

少し理解が間違っている点あるかと思いますが、これも参照されているドキュメントが前提としている環境と、Docker for Macとでは少し違いますので、そのあたりについて書いてみます。

dockerdは、Dockerの機能を実現する一番大事な部分です。
イメージからコンテナを管理する、起動する、ボリュームを割り当てるといったコアの部分になります。

dockerdは、コマンドで指示があるまでは、待機状態になって起動しているプロセスです。(デーモンというものです)
dockerコマンドで司令を出す --> dockerd がコマンドを受け付けて処理を実施し結果を返す、という流れです。

さて、このdockerdですが、Docker for Macの場合は、Mac上に直に起動しているわけではありません

Docker for Macでは、HyperKitという軽量の仮装化ツールを使って、Docker用の仮想マシンを内部で起動させています。
この「仮想マシンの中」で、dockerdが起動しています。
結果的に、Macからのpsコマンドでは、直接dockerdを見つけることができません。

dockerコマンドでHyperKitの中のdockerdにAPI経由で司令を出す --> dockerdockerd がコマンドを受け付けて処理を実施し結果を返す

といった流れになります。

なお、Docker用の仮想マシンにアクセスする場合は、

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

とすると、中に入れます。
この仮想マシンの中では、dockerdがrootで起動されているのが分かります。

docker-desktop:~# ps -elf | grep dockerd 1677 root 0:18 /usr/local/bin/dockerd -H unix:///var/run/docker.sock --config-file /run/config/docker/daemon.json --swarm-default-advertise-addr=eth0 --userland-proxy-path /usr/bin/vpnkit-expose-port 2724 root 0:00 grep dockerd docker-desktop:~# uname -a Linux docker-desktop 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 Linux docker-desktop:~#

抜ける時は、 Ctrl-A k で。

追記:userns-remap の件

"userns-remap":"default"でユーザ名前空間というものを使えるようなのですが,Docker for Macでどう適用するか教えてもらえないでしょうか?

この機能、あまり詳しくないのですが、せっかくですので試してみました。
以下のようにDaemon -> Advanced からJSONでuserns-remapの設定を追加して、Apply & Restartしてみたところ、起動に失敗しました。

質問者様も失敗した、とのことですが、最終的には工場出荷状態に戻しましたでしょうか?

json

1{ 2 "debug" : true, 3 "experimental" : true, 4 "userns-remap" : "default" 5}

失敗の理由

以下は、回答というより確認してみた結果です。求めている答えとは違うかもしれませんが、これもやはり「Docker for Macがそのような設定になっている」ということのようです。

userns-remapの設定について、日本語のドキュメントを見てみました。
"userns-remap":"default" と設定すると、

Docker は dockermap というユーザ名とグループ名が存在しているかどうか確認し、無ければ作成します。

と書いてありますね。

上記に書いたとおり、実際の処理はMac上に直接ではなく仮想マシン内なので、screen ... で中に入って確認してみます。また、仮想マシン内で、ユーザの登録情報を見てみると、rootだけになっています。

bash

1docker-desktop:~# cat /etc/passwd 2root:x:0:0:root:/root:/bin/sh

dockermapというユーザやグループは存在しないので、では、「先に作っておこうかな」と考えて、adduserを実行してみると、こんなエラーになります。

bash

1docker-desktop:~# adduser dockermap 2adduser: /etc/passwd: Read-only file system

実のところ、このDocker for Mac (Docker Desktop for Mac)の利用する仮想マシンは、軽量Linuxマシンで、かつ、一部のファイルシステムはRead Onlyになって起動している状態です。

bash

1# mountコマンドを実行、Read Onlyのファイルシステムをgrepしてみる 2 3docker-desktop:~# mount | grep '(ro' 4/dev/sr0 on / type iso9660 (ro,relatime) 5/dev/sr2 on /containers/services/docker type iso9660 (ro,relatime)

/ (rootパーティション) がRead Onlyになっており、ユーザ情報やOSの設定情報が入った /etc 以下もRead Onlyなので、結局ユーザ追加のために/etc/passwdなどに書き込みしようとすると、エラーになってしまいます。

ちなみに、あまり意味はないかもしれませんが、"userns-remap":"default" ではなく、"userns-remap":"root" として、唯一存在しているuser: rootを指定してRestartすると、エラーにはなりません。

結局どうするのがいいの?使い分けは?

ここから先は個人の考えとか印象なので、参考までに。

Docker Desktop for Macは、GUIや便利ツールも含めて簡単にDocker環境を構築して検証するためのもの、と思ったほうがよさそうです。

また、Dockerホスト専用の軽量OSは、コンテナを格納する領域以外の大部分が読み込み専用となっているものが多いです。必要な機能はコンテナの起動で実現するため、ベースOS部分には変更を加える必要が無い、という前提でそうなっていると思います。

ある程度自由にパッケージを追加したり、ホストOS側でもDocker以外の何かを動かすことが前提の環境なら、複数ユーザがログインしたり複数サービスが起動したり、ファイルシステムへの書き込みが可能だったりということで、結果的に気をつけないといけない、ということは間違いないかと思っています。

もし、そういった点に注意して環境を作ってみたい、サーバを構築したいということであれば、Docker for Macではなく、実際のCentOSやUbuuntuなどのサーバを使うのがいいと思います。

また、Mac上にVMWareを入れて、そこでCentOSを立てて試す、というところまで実施すれば良いのかなと思います。

いろいろ分かっていない点もありますので、他の皆さんのコメントもあれば、ぜひ。

投稿2019/05/12 17:15

編集2019/05/14 11:48
suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/13 11:29

回答ありがとうございます!とても丁寧な説明で助かりました! もう一つ,追加で質問なのですが, `"userns-remap":"default"`でユーザ名前空間というものを使えるようなのですが, Docker for Macでどう適用するか教えてもらえないでしょうか? やったこととしては,メニューバーのDockerアイコンから「Daemon」の「Advanced」に`"userns-remap": "default"`を追加しても適用できずエラーとなっている状況です.
suama

2019/05/14 01:10

こんにちは。userns-remapの件はわたしは知りませんでしたが、なぜエラーになるのかというあたり、解答側にも追記させていただきますね!
suama

2019/05/14 11:49

こんばんは。追記をしてみましたので、よければ確認してみてください。 Docker Desktop for Macの制約的なところかな、という感じで書いています。
退会済みユーザー

退会済みユーザー

2019/05/14 13:52

詳しい解説ありがとうございます! エラーが出た後は工場出荷状態に戻したというより,Dockerの初期化で対応していました. 同じDockerでもOSによって,仕組みが違うんですね... とても参考に,そして勉強になりました!本当にありがとうございます! 他の方のコメントがあるかもしれないので,今週末の5月17日までベストアンサーは保留しておきます. (決定後も回答できるかわからないので...)
suama

2019/05/17 00:33

こんにちは。 ぜひぜひいろんなご意あるといいですね。 こちらこそ、つい興味で確認してみたのですが、意外に面白かったのが本音です。 そこまでわたしは実運用には取り入れていないのですが、その中で感じた上で気をつけたほうがいいなという点は、また追記してみますね。
guest

0

docker groupの話などは既に詳しく書かれているので、どうしてこうなっているかについて書いてみます。

docker daemonがroot権限を要求するのはセキュリティ上の懸念があるためです。公式の以下の記事で解説されています。

docker daemon attack surface

ここに書かれている1つ目の理由をかいつまむと、

  • dockerはホストとコンテナでディレクトリを共有することができる
  • なので、コンテナは制限なく共有されたディレクトリを変更することができる
  • というわけで、信頼されたユーザのみにdockerを操作する権限を制限するべき

ということになります。

一方でDocker for Mac、今は名前が変わってDocker Desktop for Macですが、は基本的には開発用途で個人PCにインストールして使うことを想定されているので、特権がなくても使えるようにしていいという判断だと思います。これに関しては根拠を見つけられていないですが、そういうことではないでしょうか。

Docker Desktopは仮想化のオーバーヘッドがあったりもするので、実運用でDockerのホストとしてWindowsやmacOSを使うメリットはほとんどないと思います。

追記:と思ったら最初にセキュリティの話 ( https://qiita.com/kubosuke/items/5291439ad25313a6ed18 ) は書かれていましたね、すみません。

投稿2019/05/21 13:37

編集2019/05/21 13:42
krtx

総合スコア121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問