いろいろ書いていく

やってみたなど

Docker daemon attack surfaceを読んだ

Dockerの公式ドキュメントにセキュリティ関連のページがある.
docs.docker.com

Dockerの仕様と,それに起因するセキュリティ上の注意事項がまとめてある感じ.
今回はそのなかのひとつ"Docker daemon attack surface"を読んでわかったことをまとめてみる.
(これから勉強しようという人が書いているので,かなり初歩的だし,ミスリードがあるかもしれない.間違ってたらごめんなさい.)

ここに書いてあることが常に正しいかどうかはわからない.
設定や使用環境によっては気にしないでよいこともあるかもしれない.
それでも基本的な考え方として知っておくことは無駄ではなさそう.

ポイント

とにもかくにも,信頼されたユーザだけがDocker daemonを操作できるようにすること
Docker daemonとはDockerの機能を実現するdaemonのことで,dockerコマンドの宛先といったところ.
操作コマンドの使用を制限するのは当たり前のことにも思えるが,なぜ大事なのか.

もう少し詳しく

Dockerコンテナはホストとディレクトリを制限なく共有する仕様となっている.
設定次第では,コンテナからホスト側のファイルシステムにアクセスすることも可能となりうる.

例えば外部から任意のコンテナを構築可能なサーバを立ててしまうと,悪意のあるユーザにコンテナの外のホストごとやられ放題となってしまう.
三者によってC2サーバに使われてしまったり,ボットネットに組み込まれてしまうかもしれない.

そのようなリスクを踏まえ,Docker CLIREST APIはバージョン0.5.2以降はUNIXソケットを使う仕様になっている.
Docker Engine release notes | Docker Documentation

0.5.2 (2013-08-08)

Builder: Forbid certain paths within docker build ADD
Runtime: Change network range to avoid conflict with EC2 DNS
API: Change daemon to listen on unix socket by default


それまでのTCPソケットによる待ち受けに比べ,従来のUNIX権限チェックを適用することでサーバを守れるため,リスクを減らせるという判断だ.

現在でも設定変更によってREST APIをHTTP経由で叩くことも可能だが,その場合はVPNを張ったり,HTTPSを使うなどでAPI向けの通信を保護したほうがよい.

これ以外にもDockerデーモンは,docker loadやdocker pullなどのイメージ読み込みに対しても脆弱である.
開発者が知らないうちに悪性なイメージを使っていて,それをリリースしてしまう,ということがあるかもしれない.
これに対してはまずバージョン1.3.2でサンドボックス上に展開するような仕様に変更され,さらに1.10.0(下記リンク)からはdocker imageをチェックサムで管理するようにすることで,正規のイメージを保護している.
blog.docker.com
使用しているイメージが意図したものであるかどうかは,IDを見ればよい.

最後に,Dockerを公開する場合は他のサービスと混在させないようにしつつ,必要なサービスはすべてコンテナでまかなうとよい.
(もちろんsshやログ保存系などの管理ツールは入れてもいい,と書いてある.)

終わりに

Dockerセキュリティのうち,docker daemonの攻撃ベクトルについて読んだ.
実運用では面倒だからTCPポートを晒してしまうこともあるだろうし,イメージのチェックサムをいちいち確認しないようなこともあるかもしれない.
それでも,それによって被るリスクを知っておくことは大事だと思う.
このドキュメントにはdaemon以外のセキュリティについても書かれているので,そのうち読んでみたい.
もちろん今はコンテナ管理を便利にするツールがたくさんあるはず(dockerコマンドだけで実運用する人は少なそう)なので,その辺も追々使ってみたい.