アクセスの多いIPアドレスはどいつだ！？

# アクセス数の多いIPアドレスを解析してアタッカーを遮断

fail2banやAWSのWAFなど攻撃者を遮断できるツールはあるが学習がてら手動で行う方法を試してみた。

## 環境
・Docker version 24.0.2
・CentOS Linux release 7.9.2009 (Core)
・Apache/2.4.6

## 参考
[sad servers](https://sadservers.com/scenarios)
[awkガナス 第3回 同じ行がいくつあるかカウントする(awk+sort+uniq)](https://www.soum.co.jp/misc/awk/3/)

## 下準備
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](https://sadservers.com/scenarios)の
"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の使いかた](https://qiita.com/hnishi/items/4ee60ed515470e796f41)
```
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コマンド](https://qiita.com/takasianpride/items/c5a250bc3a1096188cb1)
```
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 コマンドのオプション](https://qiita.com/higadev/items/1d1783f730d57cf05591)
```
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
```
ブラウザでアクセスすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598309/3a803c17-2869-af8c-bce3-1551071b1140.png)

元に戻す場合は
```
firewall-cmd --zone=drop --remove-source=172.19.0.1 --permanent
firewall-cmd --reload
firewall-cmd --get-active-zones
```
再びアクセスできるようになっています。

以上

※今回はDockerコンテナにてテストしましたが、実際のサーバーで行う際は自身のIPアドレスをfirewallに設定してターミナルを閉じてしまうと２度とアクセスできなくなる可能性がありますので注意！