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

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

ただいまの
回答率

88.83%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,795
退会済みユーザー

退会済みユーザー

はじめに

様々なサイトを参考に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を使っていく上でセキュリティ上気をつけることがあれば,
余裕のある範囲で些細なことでも構わないので,コメントを是非お願いします.

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

こんばんは。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で、本人は読み書き実行、グループは読み&実行、その他のユーザも読み&実行可能になっています。

% ls -lF /usr/local/bin/docker
lrwxr-xr-x  1 ユーザ名  staff  54  9  6  2018 /usr/local/bin/docker@ -> /Applications/Docker.app/Contents/Resources/bin/docker
% ls -la /Applications/Docker.app/Contents/Resources/bin/docker
-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してみたところ、起動に失敗しました。

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

{
  "debug" : true,
  "experimental" : true,
  "userns-remap" : "default"
}

失敗の理由

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

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

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

と書いてありますね。

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

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

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

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

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

# mountコマンドを実行、Read Onlyのファイルシステムをgrepしてみる

docker-desktop:~# mount | grep '(ro'
/dev/sr0 on / type iso9660 (ro,relatime)
/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/14 20:49

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

    キャンセル

  • 2019/05/14 22:52

    詳しい解説ありがとうございます!
    エラーが出た後は工場出荷状態に戻したというより,Dockerの初期化で対応していました.
    同じDockerでもOSによって,仕組みが違うんですね...
    とても参考に,そして勉強になりました!本当にありがとうございます!

    他の方のコメントがあるかもしれないので,今週末の5月17日までベストアンサーは保留しておきます.
    (決定後も回答できるかわからないので...)

    キャンセル

  • 2019/05/17 09:33

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

    キャンセル

+1

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 ) は書かれていましたね、すみません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • MacOS(OSX)に関する質問
  • Docker for Macで,dockerグループへの追加等を行なっていないにも関わらず,sudoなしでdockerコマンドが実行できてしまう