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
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 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
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 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"
}
}
}
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: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
34
dockerグループのユーザであれば、誰でも
dockerコマンドが操作できるので、便利ですね!
35
dockerグループのユーザであれば、誰でも
dockerコマンドが操作できるので、便利ですね!
事実上のrootです(一般ユーザもrootとしてコン
テナのプロセスを実行可能なため)。便利ですが、
利用時には細心の注意と理解が必要です。
36
$ ls -al /var/run/docker.sock
srw-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 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/
何か気になる所がありますか?
ご参考:Docker 日本語ドキュメント
http://docs.docker.jp/
http://slideshare.net/zembutsu
twitter: @zembutsu

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