アクセス数の多いIPアドレスを解析してアタッカーを遮断
fail2banやAWSのWAFなど攻撃者を遮断できるツールはあるが学習がてら手動で行う方法を試してみた。
環境
・Docker version 24.0.2
・CentOS Linux release 7.9.2009 (Core)
・Apache/2.4.6
参考
sad servers
awkガナス 第3回 同じ行がいくつあるかカウントする(awk+sort+uniq)
下準備
Apache
yum -y install httpd
systemctl start httpd
systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-09-06 14:32:18 UTC; 6min ago
###省略###
firewall
yum install firewalld
firewall-cmd --state
running
httpのポートに穴を開けておく
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
実践
sad serversの
"Saskatoon": counting IPs.のアクセスログを参考にlocal環境で解析する。
Apacheであれば
/var/log/httpd/access_log
にアクセスログが溜まっている。
cat /var/log/httpd/access_log
###省略###
172.19.0.1 - - [26/Jul/2023:07:50:03 +0000] "GET /favicon.ico HTTP/1.1" 304 - "http://localhost:10000/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
172.19.0.1 - - [26/Jul/2023:07:50:09 +0000] "POST /login HTTP/1.1" 302 354 "http://localhost:10000/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
172.19.0.1 - - [26/Jul/2023:07:50:09 +0000] "GET /book HTTP/1.1" 200 53407 "http://localhost:10000/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
172.19.0.1 - - [26/Jul/2023:07:50:13 +0000] "GET /book/bulk/ HTTP/1.1" 301 240 "http://localhost:10000/book" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
172.19.0.1 - - [26/Jul/2023:07:50:13 +0000] "GET /book/bulk HTTP/1.1" 200 4470 "http://localhost:10000/book" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
172.19.0.1 - - [26/Jul/2023:07:50:26 +0000] "GET /book HTTP/1.1" 200 53407 "http://localhost:10000/book/bulk" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
172.19.0.1 - - [26/Jul/2023:07:50:33 +0000] "GET /book/create HTTP/1.1" 200 5455 "http://localhost:10000/book" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
172.19.0.1 - - [26/Jul/2023:07:51:25 +0000] "-" 408 - "-" "-"
local環境でしか動かしていないので単一のIPアドレスしか記録されていないが、実際に動いているサイトでは様々なIPアドレスからアクセスがされている。
・IPアドレスだけ抜き出す
awkの使いかた
awk '{print $1}' /var/log/httpd/access_log
172.19.0.2
172.19.0.2
172.19.0.3
172.19.0.3
172.19.0.3
172.19.0.3
172.19.0.1
172.19.0.1
172.19.0.1
###省略###
※今回は検証のためにIPアドレスを編集してあります
・ソートする
sortコマンド
awk '{print $1}' /var/log/httpd/access_log | sort
###省略###
172.19.0.1
172.19.0.1
172.19.0.1
172.19.0.1
172.19.0.2
172.19.0.2
172.19.0.3
172.19.0.3
172.19.0.3
172.19.0.3
昇順に並び変わりました。
・重複をまとめてカウントする
uniq コマンドのオプション
awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c
19 172.19.0.1
2 172.19.0.2
4 172.19.0.3
172.19.0.1が19回アクセスで最も多いことがわかりました。
ただ行数が多いと一番多いIPアドレスを探すのが大変なので、もう一度ソートして見やすくします。
・昇順で並び替え
awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c | sort -n
2 172.19.0.2
4 172.19.0.3
19 172.19.0.1
これで一番多くアクセスしたIPアドレスがわかりやすくなりました。
もし数値が現実的な数値ではない場合、アタックに使われているIPアドレスだと判断します。
firewallに設定し、通信を遮断する
現時点でブラウザからアクセスできることを確認したのち
firewall-cmd --zone=drop --add-source=172.19.0.1 --permanent
firewall-cmd --reload
firewall-cmd --get-active-zones
drop
sources: 172.19.0.1
元に戻す場合は
firewall-cmd --zone=drop --remove-source=172.19.0.1 --permanent
firewall-cmd --reload
firewall-cmd --get-active-zones
再びアクセスできるようになっています。
以上
※今回はDockerコンテナにてテストしましたが、実際のサーバーで行う際は自身のIPアドレスをfirewallに設定してターミナルを閉じてしまうと2度とアクセスできなくなる可能性がありますので注意!