Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Docker最新動向2017秋+セキュリティの落とし穴

10,329 views

Published on

Developers Summit 2017 KYUSYU
2017年9月22日(金)アクロス福岡
http://event.shoeisha.jp/devsumi/20170922
発表資料

【A-1】Docker最新動向2017秋+セキュリティの落とし穴

Published in: Technology
  • Be the first to comment

Docker最新動向2017秋+セキュリティの落とし穴

  1. 1. 1 Engineer / Technology Evangelist, SAKURA Internet, Inc. @zembutsu 前佛 雅人 ZEMBUTSU Masahito 2017年9月22日(金) Developers Summit 2017 KYUSYU Docker CEの最新動向等What’s new in Docker for Developers (2017 Fall version)
  2. 2. 2 Ingress Network (Ingress Load Balancer) Routing Mesh eth0 eth0 eth0 Bridge Network (Local) Docker Engine “swarm mode” Service Discovery
  3. 3. とある事例 Docker Engine "swarm mode" (SwarmKit)≠ Docker Swarm ・「簡単にアプリケーションを実行できる環境を提供」する目的 ・swarm mode はクラスタを簡単に組める、manager と worker の role ・swarm モードではIngress Network と Routing mesh、サービスディスカバリ機能を持つ ・swarm mode は docker stack / docker-compose に対応、その使い分けは用途に準じる ・docker secret コマンドで、swarm mode でのシークレット管理 ・v3 format では、--linkやcompose fileの :links はレガシー(OWACON)→networks:の活用を ・constraint: (条件)でデプロイ先サーバの制限 セキュリティは基本的だけれど、見落としている所がおおいかも ・docker build 時の罠、見落としはありませんか? 今日の内容
  4. 4. 4 http://docs.docker.jp/
  5. 5. 5 Docker概要およびComposeについては、過去資料と重複のため、 各URLをご確認願います • Docker 17.06 Updates 最近何が変わったの? https://www.slideshare.net/zembutsu/whats-new-in-docker-2017-06-distribution-ver • Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで https://www.slideshare.net/zembutsu/docker-compose-and-swarm-mode-orchestration
  6. 6. 6 事例:とあるクラウドのマニュアルサイト manual.sakura.ad.jp 課題 • 複数ページの同時更新が できない(新機能リリース) • 変更履歴管理が雑 • 階層構造が分かりづらい
  7. 7. 7 manual.sakura.ad.jp 更新の流れ(PR) cloud マニュアル用リポジトリ クラウド チーム CSさん チーム ❷ドキュメント変更のPull Request作成 ❶ git clone または GitHub 上で編集 bot お客さま manual.sakura.ad.jp (GSLB) manual-staging /home/web/manual.sakura.ad.jp #cloud-doument ❸push検出 ❹Sphinx build ❺結果通知 ❻確認 Jenkins
  8. 8. 8 manual.sakura.ad.jp 本番反映の流れ(Merge) クラウド チーム CSさん チーム ❶masterへのMerge bot お客さま manual.sakura.ad.jp (GSLB) manual-staging /home/web/manual.sakura.ad.jp #cloud-doument nginx環境 (社内環境のみ閲覧可) Jenkins ❷push検出 ❸Sphinx build ❺結果通知 ❻確認 ❹同期
  9. 9. 9 セキュリティの落とし穴
  10. 10. 10 コンテナはファイルシステムが分かれているので パスワードなどを置いても問題ないですよね?
  11. 11. 11 コンテナはファイルシステムが分かれているので パスワードなどを置いても問題ないですよね? コンテナ間では互いのファイルを見えませんが、 ホスト側からは見えます。
  12. 12. 12 $ docker run -it centos Unable to find image 'centos:latest' locally latest: Pulling from library/centos Digest: sha256:26f74cefad82967f97f3eeeef88c1b6262f9b42bc96f2ad61d6f3fdf544759b8 Status: Downloaded newer image for centos:latest [root@085d5f02743d /]# mkdir secret [root@085d5f02743d /]# echo 'himitsu' > secret/password.txt [zem@docker ~]$ sudo find /var/lib/docker -name password.txt /var/lib/docker/overlay/d04efbadefe24a7a2238d943fc18e6036e01234fde1da9b7363c56f 121f6de77/upper/secret/password.txt /var/lib/docker/overlay/d04efbadefe24a7a2238d943fc18e6036e01234fde1da9b7363c56f 121f6de77/merged/secret/password.txt [zem@docker ~]$ sudo cat /var/lib/docker/overlay/d04efbadefe24a7a2238d943fc18e6036e01234fde1da9b7363c56f 121f6de77/merged/secret/password.txt himitsu
  13. 13. 13 Docker Hub のリポジトリ上にあるイメージは どれを使っても安全ですよね?
  14. 14. 14 Docker Hub のリポジトリ上にあるイメージは どれを使っても安全ですよね? 残念ながら悪意を持ったイメージが存在しうる 可能性があります。公式イメージ(official)以外 を信用すべきではありません。
  15. 15. 16 “automated build”されたイメージなので、 安心して利用できます
  16. 16. 17 “automated build”されたイメージなので、 安心して利用できます 残念ながら「automated build」に対応した リポジトリという意味でしかなく、自動ビルド後 手動で push できてしまいます。
  17. 17. 18 NO ONE TRUST
  18. 18. 19 ということは“automated build”イメージは、 挙動を確認しようが無いということですか?
  19. 19. 20 ということは“automated build”イメージは、 挙動を確認しようが無いということですか? 通常 Dockerfile が公開されています。 自分で内容を確認の上、ビルドするのが幸せです。
  20. 20. 21 DockerHubとGitHubやBitBucket連携は面倒 なので、使わなくてもいいですよね?
  21. 21. 22 DockerHubとGitHubやBitBucket連携は面倒 なので、使わなくてもいいですよね? 一般的に”automated build”でないイメージは、 Dockerfileが公開されておらず、信頼してはいけ ない(実行してはいけない)認識です。 多くの人に使って頂きたいなら、連携すべきです。
  22. 22. 23 docker login後のdocker logout面倒です。 残したままでもいいですよね?
  23. 23. 24 docker login後のdocker logout面倒です。 残したままでもいいですよね? 他人と共用している、あるいはローカル以外では 非常に危険です。~/.docker/config.json にログ イン時に発行された認証トークンが残っています。 全ての権限を他人に委ねる危険性があります。
  24. 24. 25 $ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: <username> Password: Login Succeeded $ cat ~/.docker/config.json { "auths": { "https://index.docker.io/v1/": { "auth": "emVtYnV1c3U6a2F0YW5hMjkyOSNS" } } }
  25. 25. 26 Dockerfileの「ADD」はURLやZIPアーカイブも 取得できるので、とても便利ですね!
  26. 26. 27 Dockerfileの「ADD」はURLやZIPアーカイブも 取得できるので、とても便利ですね! 安全な環境以外では推奨されていません。 通常は「COPY」で確実にローカルからコピーする 方法が安全でしょう。
  27. 27. 28 ADD http://darkweb/akan.zip COPY ./local/ /container/
  28. 28. 29 Dockerfileの「ENTRYPOINT」を指定しておけば、 ログインさせず、かつ、指定コマンドしか実行させ ないコンテナを作れますね
  29. 29. 30 Dockerfileの「ENTRYPOINT」を指定しておけば、 ログインさせず、かつ、指定コマンドしか実行させ ないコンテナを作れますね いいえ、docker run 時に “--entrypoint” オプ ションで上書きできます。また、 “docker exec” コマンドでコンテナにプロセスをアタッチできます。
  30. 30. 31 イメージやコンテナの変更内容は追えないの ですか?不便ですね。
  31. 31. 32 イメージやコンテナの変更内容は追えないの ですか?不便ですね。 「docker history」や「docker diff」コマンドを 活用しましょう。また、「docker inspect」で何の コマンドを実行するか、何番ポートを開こうとする のかも確認できます。
  32. 32. 33 $ docker history simplepot:latest IMAGE CREATED CREATED BY SIZE COMMENT 0b9e5d88390d About an hour ago /bin/sh -c #(nop) CMD ["/usr/sbin/sshd" "... 0B 99d01bb57aa0 About an hour ago /bin/sh -c #(nop) EXPOSE 22/tcp 0B 8431c888c464 About an hour ago /bin/sh -c /usr/bin/ssh-keygen -q -t rsa -... 2.06kB d17fb17a5f1e About an hour ago /bin/sh -c echo "root:admin" | chpasswd 1kB fae9166d1392 About an hour ago /bin/sh -c yum -y install openssh-server 109MB 328edcd84f1b 13 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 13 days ago /bin/sh -c #(nop) LABEL name=CentOS Base ... 0B <missing> 13 days ago /bin/sh -c #(nop) ADD file:63492ba809361c5... 193MB $ docker diff 9b C /run C /run/utmp C /var C /var/log C /var/log/lastlog C /var/log/wtmp D /root
  33. 33. 34 dockerグループのユーザであれば、誰でも dockerコマンドが操作できるので、便利ですね!
  34. 34. 35 dockerグループのユーザであれば、誰でも dockerコマンドが操作できるので、便利ですね! 事実上のrootです(一般ユーザもrootとしてコン テナのプロセスを実行可能なため)。便利ですが、 利用時には細心の注意と理解が必要です。
  35. 35. 36 $ ls -al /var/run/docker.sock srw-rw---- 1 root docker 0 Aug 17 12:49 /var/run/docker.sock
  36. 36. 37 docker run 時にホスト側の機能を使いたいので /var/run/docker.sock をボリュームとしてマウ ントしても大丈夫ですよね?
  37. 37. 38 docker run 時にホスト側の機能を使いたいので /var/run/docker.sock をボリュームとしてマウ ントしても大丈夫ですよね? コンテナ内でどのような処理を行うか確証が持て ない限り、使うべきではありません。悪意が無くても、 未知のバグが潜んでいる可能性があります。
  38. 38. 39 dockerコンテナは隔離して起動しているので、 当然ネットワークも繋がっていませんよね。
  39. 39. 40 dockerコンテナは隔離して起動しているので、 当然ネットワークも繋がっていませんよね。 デフォルトでは「docker0」ブリッジ・ネットワーク に接続しています。ネットワークは動的な接続や 接続解除が可能です。 意図せずネットワークが繋がってしまい、名前解決 上の問題が起こり得ます(負荷分散)
  40. 40. 41 firewalldやiptablesで制限をかけていれば、 アクセス制御できるので安全ですよね。
  41. 41. 42 firewalldやiptablesで制限をかけていれば、 アクセス制御できるので安全ですよね。 通常、特に制限なくホスト側とコンテナ側のポート がmappingされてしまいます。必要に応じて、ルー ルの追記が必要になる場合もあります。
  42. 42. 43 docker engine(dockerd)をリモートから制御す るため、ポートをあけました。便利ですね。
  43. 43. 44 docker engine(dockerd)をリモートから制御す るため、ポートをあけました。便利ですね。 特に何もしなければアクセス制御もかからなけれ ば、暗号化もされず、認証もありません。確実に安 全な環境である保証がなければ、サーバ/クライ アント間でのTLS認証設定を有効化すべきです。
  44. 44. 45 NO ONE TRUST
  45. 45. 46 コンテナな間で見えないファイルも、ホスト側からは見える Docker Hub 上のリポジトリは安全ではない可能性がある 残念ながら「automated build」も信頼すべきではない Dockerfileを常に確認すべし 共用環境ではdocker login、logoutをセットで忘れずに Dockrfileで「ADD」は使うべきではない Dockerfileの「ENTRYPOINT」は上書き可能 docker history や docker diff 、docker inspectで詳細確認 dockerグループに所属するユーザは、事実上のroot /var/run/docker.sockをマウントさせてはいけない docker ネットワークは動的に接続・接続解除できる docker はホスト側のfirewalld/iptablesの設定に関係なく、 ポートをマッピングできる dockerd のリモート制御時は TLS 認証を有効にすべき
  46. 46. 47 振り返り
  47. 47. 技術と仕様 Technology Specification コンテナ Docker isolateされたコンテナ状態のプロセスを起動する だから実行や移動が速い
  48. 48. Docker CE (Community Edition) のバージョン変更 ・CentOS 系のパッケージはは「docker-engine」→「docker-ce」に変更(17.06移行) ・Moby Project の誕生と、役割毎に各パーツが分散(○○Kit) Docker Engine "swarm mode" (SwarmKit)≠ Docker Swarm ・「簡単にアプリケーションを実行できる環境を提供」する目的 ・swarm mode はクラスタを簡単に組める、manager と worker の role ・swarm モードではIngress Network と Routing mesh、サービスディスカバリ機能を持つ ・swarm mode は docker stack / docker-compose に対応、その使い分けは用途に準じる ・docker secret コマンドで、swarm mode でのシークレット管理 ・v3 format では、--linkやcompose fileの :links はレガシー(OWACON)→networks:の活用を ・constraint: (条件)でデプロイ先サーバの制限 セキュリティは基本的だけれど、見落としている所がおおいかも ・docker build 時の罠、見落としはありませんか?
  49. 49. NO ONE TRUST
  50. 50. コンテナな間で見えないファイルも、ホスト側からは見える Docker Hub 上のリポジトリは安全ではない可能性がある 残念ながら「automated build」も信頼すべきではない Dockerfileを常に確認すべし 共用環境ではdocker login、logoutをセットで忘れずに Dockrfileで「ADD」は使うべきではない Dockerfileの「ENTRYPOINT」は上書き可能 docker history や docker diff 、docker inspectで詳細確認 dockerグループに所属するユーザは、事実上のroot /var/run/docker.sockをマウントさせてはいけない docker ネットワークは動的に接続・接続解除できる docker はホスト側のfirewalld/iptablesの設定に関係なく、 ポートをマッピングできる dockerd のリモート制御時は TLS 認証を有効にすべき
  51. 51. 私からは以上です ありがとうございました
  52. 52. References Announcing Docker 17.06 Community Edition (CE) - Docker Blog https://blog.docker.com/2017/06/announcing-docker-17-06-community-edition-ce/ Docker CE release notes | Docker Documentation https://docs.docker.com/release-notes/docker-ce/ Docker Success Center ( Knowledge Base, Reference Architecture ) https://success.docker.com/
  53. 53. 何か気になる所がありますか? ご参考:Docker 日本語ドキュメント http://docs.docker.jp/ http://slideshare.net/zembutsu twitter: @zembutsu

×