Netassist Blog

fail2banの導入

こんにちは、技術部のamiyataです。
今回はcentos6環境へfail2banを導入、動作確認までを行いたいと思います。

・インストール

そのままではパッケージが存在しないため、epelのリポジトリを利用します

# yum install fail2ban
読み込んだプラグイン:changelog, fastestmirror, ps
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * remi-safe: mirrors.mediatemple.net
 * updates: ftp.tsukuba.wide.ad.jp
パッケージ fail2ban は利用できません。
エラー: 何もしません
# yum install epel-release

必要に応じて、/etc/yum.repos.d/epel.repo 内の
enableを調整します。
普段は利用しない場合は0にしておくとよいです。

# grep enable /etc/yum.repos.d/epel.repo
enabled=0
enabled=0
enabled=0

上記対応を行った場合は、enablerepoでepelを指定してインストール

# yum --enablerepo=epel install fail2ban

etc配下に配置されます。

# ll /etc/fail2ban/
合計 68
drwxr-xr-x 2 root root  4096  4月  5 04:07 2017 action.d
-rw-r--r-- 1 root root  2313  2月 18 03:17 2017 fail2ban.conf
drwxr-xr-x 2 root root  4096  2月 18 03:17 2017 fail2ban.d
drwxr-xr-x 3 root root  4096  4月  5 04:07 2017 filter.d
-rw-r--r-- 1 root root 21280  2月 18 03:17 2017 jail.conf
drwxr-xr-x 2 root root  4096  2月 18 03:17 2017 jail.d
-rw-r--r-- 1 root root  2375 12月  9 23:36 2016 paths-common.conf
-rw-r--r-- 1 root root   642 12月  9 23:36 2016 paths-debian.conf
-rw-r--r-- 1 root root   769  2月 18 03:17 2017 paths-fedora.conf
-rw-r--r-- 1 root root  1174 12月  9 23:36 2016 paths-freebsd.conf
-rw-r--r-- 1 root root   975 12月  9 23:36 2016 paths-opensuse.conf
-rw-r--r-- 1 root root   290 12月  9 23:36 2016 paths-osx.conf

fail2ban.confとjail.confは設定ファイルになりますが、
設定は.localが優先されるためそれぞれの.localを作成してそこに必要なものを記述します。

# echo -e "[Definition]\nlogtarget = /var/log/fail2ban.log" > /etc/fail2ban/fail2ban.local

ログの出力先については環境の応じてpathは変更して下さい。

# vi /etc/fail2ban/jail.local

[DEFAULT]
ignoreip = 
backend = polling
bantime = 3600  ; 1hour
maxretry= 5
usedns = no

[ssh-iptables] 
enabled = true 
filter = sshd 
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/secure 
findtime = 1800 ; 30 min

設定の意味はjail.confを確認してください。

filterについては下記ディレクトリにデフォルトでいろいろあるので
必要なものを設定します。自分で作成することも可能です。

/etc/fail2ban/filter.d/

起動させましょう

/etc/init.d/fail2ban start

可能であれば動作確認を行いましょう。
外部サーバからアタックを行います

fail2ban導入サーバはログを流しておきます。

# tail -f /var/log/fail2ban.log

下記のようなログが出ていて実際に接続ができない状態になっていれば成功です。
2017-04-08 05:22:06,913 fail2ban.actions [21552]: NOTICE [ssh-iptables] Ban 61.195.167.218

また下記コマンドで今の状態が確認できます。

有効な設定一覧が出ます。

# fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   ssh-iptables

Jail listあるものを指定するとその設定でのブロック状況などがわかります。

# fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     6
|  `- File list:        /var/log/secure
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   61.195.167.218

せっかくなので独自フィルターを作ってみましょう

よくアタックのあるwordpressのxmlrpcへのPOSTで作ります

ログの出力内容を確認します。

61.195.167.218 - - [08/Apr/2017:05:44:33 +0900] "POST /xmlrpc.php HTTP/1.1" 302 - "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

わかりやすい命名をします

# vi /etc/fail2ban/filter.d/wp-xmlrpc.conf

# cat /etc/fail2ban/filter.d/wp-xmlrpc.conf
[Definition]

failregex = ^<HOST> - .*"POST /xmlrpc.php HTTP.*$
ignoreregex =

記述内容は他の設定及び、ログの内容を確認して記載します。

jail.local へ追加したフィルターを使う設定を追記します。

# vi jail.local

[wp-xmlrpc-iptables]
enabled = true
filter = wp-xmlrpc
action = iptables[name=WEB, port=http,https, protocol=tcp]
logpath = /var/log/httpd/access_log
findtime = 1800 ; 30 min

fail2banを再起動します

# /etc/init.d/fail2ban restart

読み込まれているか確認します

# fail2ban-client status
Status
|- Number of jail:      2
`- Jail list:   ssh-iptables, wp-xmlrpc-iptables

実際にテストします

# tail -f /var/log/fail2ban.log
2017-04-08 06:05:11,677 fail2ban.actions        [23298]: NOTICE  [wp-xmlrpc-iptables] Ban 61.195.167.218
# fail2ban-client status wp-xmlrpc-iptables
Status for the jail: wp-xmlrpc-iptables
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     5
|  `- File list:        /var/log/httpd/access_log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   61.195.167.218

できました。今回は一例としてxmlrpcへのフィルターを追加しましたが
自分で使うことはほとんどないのであれば.htaccess等で
アクセスできないようにしてしまいましょう。

fail2banはあくまでログから失敗や連続アクセスを判断しブロックするため、
始めからアクセス情報が漏れていたりする場合効果がありません。

メールは仕方ない部分もありますが、
webサイトの管理ページ等は可能であれば固定IPのみの
アクセスにしたほうがはるかによいです。

以上、になります。