fail2banで不正アクセス対策
About サーバー構築メモ fail2banで不正アクセス対策
外向けにサーバーを公開していると、どこからともなく海外のお友達が大量にやってきます。
fail2banで不正アクセスを対策する。
fail2banの動作確認
ConoHaのUbuntuには初期でfail2banが入っているので、まず設定状況を確認する。
sudo systemctl status fail2ban
有効なルールを確認する場合
sudo fail2ban-client status
Status |- Number of jail: 2 `- Jail list: nginx-suspicious, sshd
ルールの詳細を確認する場合
sudo fail2ban-client status sshd
Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
フィルタの追加
/etc/fail2ban/filter.d/
に設定ファイルに追加する。
cd /etc/fail2ban/filter.d sudo touch nginx-suspicious.conf sudo vim nginx-suspicious.conf
[Definition]
failregex = ^.*Host:(?!.*ikst\.net).*\tRemoteAddress:<HOST>\t.*$
^.*Uri:.*(\.php|\.env|cgi-bin).*\t.*\tRemoteAddress:<HOST>\t.*$
ignoreregex =
※直IP(ドメインを解さず)アクセスしたり、phpなど存在しないURLを指定しているものく
sudo touch nginx-badstatus.conf sudo vim nginx-badstatus.conf
[Definition]
failregex = ^.*\tRemoteAddress:<HOST>\t.*\tStatusCode:(4|5)\d\d\t.*$
ignoreregex =
※ステータスコードが400、500番台のエラー
<HOST>の部分にIPが来るように正規表現を記載する。
正規表現は複数行記載できる
フィルタの動作確認
作成したフィルタを fail2ban-regex で動作確認ができる。
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-suspicious.conf sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-badstatus.conf sudo fail2ban-regex /var/log/mysql/error.log /etc/fail2ban/filter.d/mysqld-auth.conf
フィルタに記載した正規表現がマッチすることが以下のように確認できる
Running tests ============= Use failregex filter file : nginx-suspicious, basedir: /etc/fail2ban Use log file : /var/log/nginx/access.log Use encoding : UTF-8 Results ======= Failregex: 5 total |- #) [# of hits] regular expression | 1) [5] ^.*\tRemoteAddress:<HOST>\t.*\tStatusCode:404\t.*$ `- Ignoreregex: 0 total Date template hits: |- [# of hits] date format | [23] ExYear(?P<_sep>[-/.])Month(?P=_sep)Day(?:T| ?)24hour:Minute:Second(?:[.,]Microseconds)?(?:\s*Zone offset)? `- Lines: 23 lines, 0 ignored, 5 matched, 18 missed [processed in 0.01 sec] |- Missed line(s):
設定
/etc/fail2ban/jail.local
に以下を追記する。
sudo vim /etc/fail2ban/jail.local
[sshd]
enabled = true
bantime = 86400
findtime = 600
maxretry = 5
[nginx-suspicious]
enabled = true
filter = nginx-suspicious
logpath = /var/log/nginx/access.log
backend = auto
maxretry = 3
findtime = 30
bantime = 180
[nginx-badstatus]
enabled = true
filter = nginx-badstatus
logpath = /var/log/nginx/access.log
backend = auto
maxretry = 10
findtime = 30
bantime = 180
[mysqld-auth]
enabled = true
filter = mysqld-auth
backend = auto
logpath = /var/log/mysql/error.log
maxretry = 3
findtime = 60
bantime = 180
ちなみにデフォルトの設定は以下に設定が記載されている。
/etc/fail2ban/jail.d/defaults-debian.conf
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd
パラメーター | 設定する値 |
bantime | ホストから BAN (接続禁止)される時間 |
findtime | 失敗回数をカウントする時間 |
maxretry | findtime で指定した時間のホストから BAN されるまで失敗回数 |
backend | ログファイルの変更を検出するバックエンド auto ・"polling "の前に "pyinotify", "gamin", "systemd "を試す polling ・外部ライブラリを必要としないポーリングアルゴリズムを使用する pyinotify ・pyinotify Python ライブラリを持つ Linux システムでのみ有効 ・pyinotify がインストールされていない場合は auto を使用する gamin ・gamin ライブラリが必要 ・gamin がインストールされていない場合は auto を使用する systemd ・systemd Python ライブラリを使用して systemd ジャーナルにアクセスする ・backendにこの値を指定した場合logpathパラメーターを無視する |
enabled | 設定を有効 / 無効にする TRUE 設定を有効にし、ログファイルを監視する FALSE 設定を無効にする |
再起動
設定を変更したら再起動で反映する
sudo systemctl restart fail2ban