サーバへの攻撃を止める

Linuxサーバ(Alma Linux 9)が急に重くなった。/var/log/httpd/ssl_access_log を見れば、特定のIPアドレスから大量にアクセスがある。しかもアクセス内容がおかしい。攻撃か、暴走クローラか。

とりあえず Deny access to a site with an .htaccess file を参考にして .htaccess にアクセス禁止の呪文を書いた:

<RequireAll>
  Require all granted
  Require not ip XXX.XXX.XXX.XXX
</RequireAll>

これでアクセス要求には 403 Forbidden が返る。

それでも止まらないので、firewalld を使うことにした。

いきなり sudo systemctl start firewalld とするとssh接続まで切れて難儀する。

sudo systemctl start firewalld && sudo firewall-cmd --set-default-zone=public

ならsshは大丈夫である。でもこれでは http/https も止まる。

sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https

のようにしてサービスごとに許可する。ただ、これでは再起動すると元に戻るので、うまくいったならば

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent

のようにして永続化する。

サービス一覧は次のようにして確認できる:

sudo firewall-cmd --get-services

たくさんのサービスが現れるので、必要に応じて設定する:

sudo firewall-cmd --add-service=git
sudo firewall-cmd --add-service=git --permanent

現状および永続化された設定は次のコマンドで確認できる:

sudo firewall-cmd --list-all
sudo firewall-cmd --list-all --permanent

あと、sshのポートを変更しているなら、そのポートを開けておく必要がある:

sudo firewall-cmd --add-port=XXXXX/tcp
sudo firewall-cmd --add-port=XXXXX/tcp --permanent

さて、問題は例の XXX.XXX.XXX.XXX というホストである。ここからのアクセスをすべて拒否したい。それには

sudo firewall-cmd --add-rich-rule="rule family='ipv4' source address='XXX.XXX.XXX.XXX' reject"

とすればよい。必要に応じてこれも --permanent を付けたものも実行しておく。