Dockerでホストを乗っ取られた

  • 1137
    いいね
  • 27
    コメント
この記事は最終更新日から1年以上が経過しています。

注意

本件記事ですが、私の不適切な行動(拾ったスクリプトを検証なく走らせる)が原因です。「dockerは(特に何もしなくとも)危険」との誤解を皆様に与えた点、ご迷惑をおかけいたしました。申し訳ございません。
拡散されている記事を削除するのはさらなる誤解を招きかねないと思いましたので、冒頭に注意を付記しております。以下の記事は、「自分が何してるかをきちんと検証できないとセキュリティホールを生み出す」という意味で参考にして頂ければ幸いです。

追記

Twitterやはてブで言及いただきました皆様、ありがとうございます。
本件はpullしてきたイメージが悪意ある開発者によるものかどうかにかぎらず、不適切な設定をしていると起こり得ます。
※コメント欄に質問への回答という形で、私がそのときに走らせていたイメージの一覧を挙げておりますが、どのイメージも評判あるものだと思います。
皆様におかれましては「あいつやらかしよったでー!」と言いつつ、そっとご自身の設定を見直して頂ければ幸いです。

環境:
ホストOS:Ubuntu 16.04 LTS
Docker:version 1.11.1

皆様お疲れ様です。

早速ですが、Docker使ってますか?
ホストの環境を変えずにポンポンとサービス立てて、要らなくなったらポイすればいいのだから、ホストの環境がぐっちゃぐちゃにならなくて嬉しいですよね。
使えるようになるまでちょっと時間がかかったのですが、今では個人サーバでもともと使っていたGitlabとかRedmineとかいろいろと立ててますよ。
便利ですよねー。

さて、そういう便利さを喜んでいたある日、ちょっと気づきました。
「あれ、勝手に知らんコンテナ立ってる……?」

何があったのか

どこかの誰かが、

  1. 何らかの手法で勝手にコンテナを立てて
  2. ホストにrootとしてSSHでアクセスしていた。

とりあえず気づいた時点でLANケーブル抜いて、後学のためにログだけ取ってクリーンインストールし直しました。

補足

後学のために取ったログとは

docker logs badguy
[root@151d6bf9fff2 /]# vi tmp/.ssh/authorized_keys
[root@151d6bf9fff2 /]#
[root@151d6bf9fff2 /]#

というあっさりしたものです。

何をどうされたのか。

Dockerコンテナ内からホストマシンのルートを取る具体的な方法(あるいは/var/run/docker.sockを晒すことへの注意喚起)
まんま、この手口です。
hub.docker.comからpullしたコンテナの一つに、docker.sockをマウントすることを要求するものがあったので、気軽に与えておりました。
恐らく、

  1. docker.sockをマウントしたコンテナA内のSSHサーバに外部からログイン
  2. コンテナAでdocker エンジンをインストールの上、別のコンテナBを立てる。この時、コンテナBでホストのルートディレクトリをコンテナB内の適当なディレクトリにマウントする。
  3. コンテナBでchrootを使い、2.の適当なディレクトリ(=ホストのルートディレクトリ)にアクセスする
  4. ホストのルートディレクトリ直下に.sshディレクトリを作成して自分のSSH公開鍵を残す
  5. SSHで直接ホストにrootでログイン、自由な遊び場!

ということでしょう。
私も(自分のサーバで)やってみたら、あっさりホストのrootになれました。

何をどうしておけばよかったのか。

ホストのSSHには公開鍵でのログインだけに限定してはいたのですが、rootでのログインを禁止できていませんでした。
あと、docker.sockを見知らぬコンテナに不用意に渡しちゃったのがまずかったですね。root権限のバトンを渡してるのと同じでした。

何をどうしたのか。

  1. ホストのクリーンインストール後、SSHの設定を見直して公開鍵のみ・rootログイン禁止......というより、自ユーザ以外はSSHでログインさせないように設定変更。
  2. fail2banを入れ直して、「root(その他のありがちなアカウントも)でのログインを試行する奴はみんな敵」として一度で永久banとしました。
  3. ホストの/直下に.sshフォルダが作られると気持ちわるいので定期的に削除させるようにcronを設定しています。
  4. 自分でコードを書いていないコンテナにはdocker.sockは渡さないことにしました。このあたりは今後の勉強を踏まえて「Officialのイメージをそのまま使うなら渡す」とかにするかもしれません。

みんなで気をつけること

サーバ立てておいて乗っ取られるとか、恥もいいところです。
これ書くときも「あー、こんなこと書いたら恥ずかしいよな、『おめえ、サーバ立てるの百年早いんだよ、引っ込んでろ』とか言われるのかな」と怯えつつ、ちょっとでもみなさんの役に立つと恥かく価値も少しあるかと思っております。
皆様におかれましては十分ご注意ください。

編集履歴

2016/06/06 10:48 後学のために取ったログを追加、「何をどうされたのか。」の一部がわかりにくい表現だったので、追記した。
2016/06/06 16:24 冒頭に「悪意のあるコンテナでなかったとしても、不適切な設定があれば起こりうる」旨追記。