はじめに
docker+kubernetesでwebアプリケーションが動く環境がとりあえず構築したのはいいけれども、ネットワーク的に安全なのか不明だったので調査しました。
システム構成
1. IPアドレスとポート開放状況
外部から接続可能なIPアドレスとどのポートが解放されているか調べます。
1.1 結果
-
外部公開されているIPは4つでした。
- ingress : webサーバー手前の負荷分散
- kubernetes関連API : kubernetesを動作するのに必要なもの
- node A : node1つ目
- node B : node2つ目
-
外部公開されているTCPポートもおおむね期待値通りだが、ingressが不要なポートを開放しすぎています。(443だけでいいのに。)
-
serviceとpodはそれぞれ直接通信できないし、ingressへのhttp通信はどうやってpodにアクセスしているのかよくわかりませんでした。
-
nodeについてはsshの対策はする必要があるものの、直接は攻撃できなさそうです。
-
dockerやkubernetes経由で攻撃されるところを防ぐ必要が大いにありそうです。
1.2 調査方法
ping, route, ifconfig, nmapを駆使して調べました。
ping
$ ping 10.146.0.4
10.146.0.4 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。```
nmap
$ nmap -P0 34.85.112.**
Not shown: 998 filtered ports
PORT STATE SERVICE
22/tcp open ssh
3389/tcp closed ms-term-serv```
ifconfig
Node A ~ $ ifconfig
cbr0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1460
inet 10.52.1.1 netmask 255.255.255.0 broadcast 0.0.0.0
・・・
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 169.254.123.1 netmask 255.255.255.0 broadcast 0.0.0.0
・・・
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1460
inet 10.146.0.4 netmask 255.255.255.255 broadcast 10.146.0.4
・・・
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
・・・
2. 対策
思ったよりも外からアクセスできる状態になっていなかったので、特にありません。pod間通信を制御しようと思ったらNetwork Policyを使ってやるみたいだけど、今はやらないでおきます。
本当に本番環境作ろうと思ったら、手前にwafとかips・idsとか入れないとだめなんでしょうね。