mainvisual

Dockerを運用していると時々遭遇します。

$ docker run -d \
    -v /var/run/docker.sock:/var/run/docker.sock:ro \
    jrcs/letsencrypt-nginx-proxy-companion

みたいな…

-vの行の最後に付いている、:roってどういう意味か、その正体についてのお話です。

最後の:roや、:rwは、書き込みや読み込みの権限を表しています.

  • :rw(read write の略) 書き込み読み込み可
  • :ro(read only の略) 読み込み専用

これは、Dockerで-vを使ってマウントするときの権限の指定をするときに使われています。 デフォルトは、「read write」で読み書き可でマウントされます。

なぜ書き込みもできる:rwがデフォルトなのか

すみません、公式のサイトで探しましたが、わかりませんでした。

これは、個人的な予想ですが、最初から 読み込み専用(read only)にすると、プログラマの感覚に反するというのが最も大きいのかもしれません。ボリュームをマウントしたのに書き込みが出来ないのでは、困惑すると思います。 また、自分で公開する範囲を指定出来るので、そもそも読み込み専用にする理由が少ないのかもしれません。

絶対に書き込み可にしてはいけないファイル

Dockerには、絶対に書き込み出来るようにしてはならないファイルが存在します。

それは、

/var/run/docker.sockです。

Dockerはroot権限で動作しています。
そして、/var/run/docker.sockを操作することにより、 制限なくDockerを操作する事が出来てしまうのです。

つまり、/var/run/docker.sockに書き込みを行なう権限を与えると、実質的にホストのroot権限を与えていることと同じになるのです

これは、絶対にあってはなりません。

自分で作ったコンテナでさえも、書き込み権限を与えることはおすすめ出来ません。

仮に自分のコンテナを「コンテナ1」とします。 そして、そのコンテナとボリュームを共有、またはリンクを行っている別のコンテナを「コンテナ2」とします。 「コンテナ1」、/var/run/docker.sockに対して書き込み権限を持っており、 「コンテナ2」は書き込み権限を持ってはいません。

しかし、脆弱性により、「コンテナ2」から、「コンテナ1」に侵入された場合、 ホストのすべての権限を取られてしまいます。

絶対に、/var/run/docker.sockには書き込み権限を与えてはいけないのです。

/var/run/docker.sockに対する対処法

デフォルトでは、書き込み可ですので、 -vでマウントをする場合に、最後に:roをつけて下さい。

たったこれだけで防ぐ事が出来ます。

まとめ

  • :rw(read write の略) 書き込み読み込み可
  • :ro(read only の略) 読み込み専用

/var/run/docker.sockには、最後に:roをつけること