Top > About > サーバー構築メモ > fail2banで不正アクセス対策

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失敗回数をカウントする時間
maxretryfindtime で指定した時間のホストから 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