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)
1Engineer / 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
Ingress Network(Ingress Load Balancer)
Routing Mesh
eth0 eth0 eth0
Bridge
Network
(Local)
Docker Engine “swarm mode”
Service Discovery
とある事例
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
http://docs.docker.jp/
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
事例:とあるクラウドのマニュアルサイトmanual.sakura.ad.jp
課題• 複数ページの同時更新が
できない(新機能リリース)• 変更履歴管理が雑• 階層構造が分かりづらい
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
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
セキュリティの落とし穴
10
コンテナはファイルシステムが分かれているのでパスワードなどを置いても問題ないですよね?
11
コンテナはファイルシステムが分かれているのでパスワードなどを置いても問題ないですよね?
コンテナ間では互いのファイルを見えませんが、ホスト側からは見えます。
12
$ docker run -it centosUnable to find image 'centos:latest' locallylatest: Pulling from library/centosDigest: sha256:26f74cefad82967f97f3eeeef88c1b6262f9b42bc96f2ad61d6f3fdf544759b8Status: 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/d04efbadefe24a7a2238d943fc18e6036e01234fde1da9b7363c56f121f6de77/upper/secret/password.txt/var/lib/docker/overlay/d04efbadefe24a7a2238d943fc18e6036e01234fde1da9b7363c56f121f6de77/merged/secret/password.txt[zem@docker ~]$ sudo cat /var/lib/docker/overlay/d04efbadefe24a7a2238d943fc18e6036e01234fde1da9b7363c56f121f6de77/merged/secret/password.txthimitsu
13
Docker Hub のリポジトリ上にあるイメージはどれを使っても安全ですよね?
14
Docker Hub のリポジトリ上にあるイメージはどれを使っても安全ですよね?
残念ながら悪意を持ったイメージが存在しうる可能性があります。公式イメージ(official)以外を信用すべきではありません。
16
“automated build”されたイメージなので、安心して利用できます
17
“automated build”されたイメージなので、安心して利用できます
残念ながら「automated build」に対応したリポジトリという意味でしかなく、自動ビルド後手動で push できてしまいます。
18
NO ONE
TRUST
19
ということは“automated build”イメージは、挙動を確認しようが無いということですか?
20
ということは“automated build”イメージは、挙動を確認しようが無いということですか?
通常 Dockerfile が公開されています。自分で内容を確認の上、ビルドするのが幸せです。
21
DockerHubとGitHubやBitBucket連携は面倒なので、使わなくてもいいですよね?
22
DockerHubとGitHubやBitBucket連携は面倒なので、使わなくてもいいですよね?
一般的に”automated build”でないイメージは、Dockerfileが公開されておらず、信頼してはいけない(実行してはいけない)認識です。多くの人に使って頂きたいなら、連携すべきです。
23
docker login後のdocker logout面倒です。残したままでもいいですよね?
24
docker login後のdocker logout面倒です。残したままでもいいですよね?
他人と共用している、あるいはローカル以外では非常に危険です。~/.docker/config.json にログイン時に発行された認証トークンが残っています。全ての権限を他人に委ねる危険性があります。
25
$ docker loginLogin 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"}
}}
26
Dockerfileの「ADD」はURLやZIPアーカイブも取得できるので、とても便利ですね!
27
Dockerfileの「ADD」はURLやZIPアーカイブも取得できるので、とても便利ですね!
安全な環境以外では推奨されていません。通常は「COPY」で確実にローカルからコピーする方法が安全でしょう。
28
ADD http://darkweb/akan.zip
COPY ./local/ /container/
29
Dockerfileの「ENTRYPOINT」を指定しておけば、ログインさせず、かつ、指定コマンドしか実行させないコンテナを作れますね
30
Dockerfileの「ENTRYPOINT」を指定しておけば、ログインさせず、かつ、指定コマンドしか実行させないコンテナを作れますね
いいえ、docker run 時に “--entrypoint” オプションで上書きできます。また、 “docker exec”コマンドでコンテナにプロセスをアタッチできます。
31
イメージやコンテナの変更内容は追えないのですか?不便ですね。
32
イメージやコンテナの変更内容は追えないのですか?不便ですね。
「docker history」や「docker diff」コマンドを活用しましょう。また、「docker inspect」で何のコマンドを実行するか、何番ポートを開こうとするのかも確認できます。
33
$ docker history simplepot:latestIMAGE CREATED CREATED BY SIZE COMMENT0b9e5d88390d 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 9bC /runC /run/utmpC /varC /var/logC /var/log/lastlogC /var/log/wtmpD /root
34
dockerグループのユーザであれば、誰でもdockerコマンドが操作できるので、便利ですね!
35
dockerグループのユーザであれば、誰でもdockerコマンドが操作できるので、便利ですね!
事実上のrootです(一般ユーザもrootとしてコンテナのプロセスを実行可能なため)。便利ですが、利用時には細心の注意と理解が必要です。
36
$ ls -al /var/run/docker.socksrw-rw---- 1 root docker 0 Aug 17 12:49 /var/run/docker.sock
37
docker run 時にホスト側の機能を使いたいので/var/run/docker.sock をボリュームとしてマウントしても大丈夫ですよね?
38
docker run 時にホスト側の機能を使いたいので/var/run/docker.sock をボリュームとしてマウントしても大丈夫ですよね?
コンテナ内でどのような処理を行うか確証が持てない限り、使うべきではありません。悪意が無くても、未知のバグが潜んでいる可能性があります。
39
dockerコンテナは隔離して起動しているので、当然ネットワークも繋がっていませんよね。
40
dockerコンテナは隔離して起動しているので、当然ネットワークも繋がっていませんよね。
デフォルトでは「docker0」ブリッジ・ネットワークに接続しています。ネットワークは動的な接続や接続解除が可能です。意図せずネットワークが繋がってしまい、名前解決上の問題が起こり得ます(負荷分散)
41
firewalldやiptablesで制限をかけていれば、アクセス制御できるので安全ですよね。
42
firewalldやiptablesで制限をかけていれば、アクセス制御できるので安全ですよね。
通常、特に制限なくホスト側とコンテナ側のポートがmappingされてしまいます。必要に応じて、ルールの追記が必要になる場合もあります。
43
docker engine(dockerd)をリモートから制御するため、ポートをあけました。便利ですね。
44
docker engine(dockerd)をリモートから制御するため、ポートをあけました。便利ですね。
特に何もしなければアクセス制御もかからなければ、暗号化もされず、認証もありません。確実に安全な環境である保証がなければ、サーバ/クライアント間でのTLS認証設定を有効化すべきです。
45
NO ONE
TRUST
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 認証を有効にすべき
47
振り返り
技術と仕様Technology Specification
コンテナ Docker
isolateされたコンテナ状態のプロセスを起動するだから実行や移動が速い
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 時の罠、見落としはありませんか?
NO ONE
TRUST
コンテナな間で見えないファイルも、ホスト側からは見える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 認証を有効にすべき
私からは以上です
ありがとうございました
References
Announcing Docker 17.06 Community Edition (CE) - Docker Bloghttps://blog.docker.com/2017/06/announcing-docker-17-06-community-edition-ce/
Docker CE release notes | Docker Documentationhttps://docs.docker.com/release-notes/docker-ce/
Docker Success Center ( Knowledge Base, Reference Architecture )https://success.docker.com/
何か気になる所がありますか?
ご参考:Docker 日本語ドキュメント
http://docs.docker.jp/
http://slideshare.net/zembutsutwitter: @zembutsu