リモートアクセス環境のツールとして、Linux上にOpenVPNを構築して運用している場合、セキュリティ対策として、悪意のある第三者からの不正アクセスを防がなければなりません。
対策方法としては、ファイアウォールやIPSといったネットワーク機器などが思いつきますが、OpenVPNサーバー上でできる対策のひとつに、Fail2banを使った対策方法があります。
そこでここでは、OpenVPNサーバー(CentOS 7+OpenVPN)にFail2banをインストールして不正アクセス対策する方法を紹介します。
目次
Fail2banとは
Fail2banは、ネットワークサービスを提供するソフトウェアのログを監視し、不正なログのパターンにマッチしたIPアドレスをfirewalldのルールに追加して、自動的にアクセスを遮断(BAN)することができるセキュリティ対策ツールです。
Fail2banのインストール
まずは、以下のコマンドを順に実行してFail2banをインストールします。
「jwhois」は、アクセスを遮断したIPアドレスの詳細を調べる時に利用するソフトウェアです。
# yum install epel-release
# yum install --enablerepo=epel fail2ban fail2ban-systemd gamin-python
# yum install jwhois
Fail2banの設定
次に、フィルター設定ファイルとジェイル設定ファイルを作成します。
フィルター設定
フィルター設定では、監視するログのパターンを定義します。
fail2banには、よく利用されているアプリケーション向けのフィルターがデフォルトで用意されていますが、OpenVPNのフィルター定義は自分で作成する必要があります。
ここでは、OpenVPNのログのうち認証に関するログを監視するよう、次のように定義します。
なお、OpenVPNサーバーの設定によっては、フィルターとして定義すべきログのパターンを調整する必要があると思うので、自分の環境でログ「/var/log/openvpn.log」の内容を確認しながら、フィルターを作成しましょう。
# vi /etc/fail2ban/filter.d/openvpn_filter.conf
[INCLUDES]
before = common.conf
[Definition]
failregex = ^%(__prefix_line)sTLS Error: .*\[AF_INET\]<HOST>:\d+$
^%(__prefix_line)s<HOST>:\d+ Connection reset, restarting
^%(__prefix_line)s<HOST>:\d+ TLS Auth Error
^%(__prefix_line)s<HOST>:\d+ VERIFY ERROR
ignoreregex =
フィルターを作成したら、監視するログ「/var/log/openvpn.log」に対して作成したフィルターが機能しているかを、以下のコマンドで確認します。
コマンドの出力結果の「Match lines」に、監視したいログが抽出されていればOKです。
# fail2ban-regex /var/log/openvpn.log /etc/fail2ban/filter.d/openvpn_filter.conf --print-all-matched
ジェイル設定
ジェイル設定では、フィルター設定で定義したパターンに一致するアクセスがあった場合の動作を定義します。
# vi /etc/fail2ban/jail.d/openvpn_jail.conf
[DEFAULT]
bantime = 21600
findtime = 3600
maxretry = 20
banaction = firewallcmd-ipset
backend = gamin
action = %(action_mwl)s
ignoreip = 127.0.0.1/8 192.168.1.0/24
[recidive]
enabled = true
banaction = firewallcmd-allports
bantime = 604800
findtime = 86400
maxretry = 2
[openvpn]
enabled = true
port = 1194
protocol = udp
filter = openvpn_filter
logpath = /var/log/openvpn.log
上の定義内容は、次のとおりです。(時間の指定は「秒」で指定しています。)
「DEFAULT」セクションの設定
- 1時間(findtime)に20回(maxretry)を超えてフィルターにマッチするログが記録されると、アクセスを試みたIPアドレスを、6時間(bantime)BAN
- BANする方法は、firewalldにipsetを使ってルール登録(banaction)
- ログの監視方法(backend)は「gamin」を使用
- IPアドレスをBANしたときは「BANしたIPアドレス」「IPアドレスのWHOIS情報」「そのときに記録されたログ」(action)を通知 ※既定の通知先はroot宛メールです。
- 自分自身と、192.168.1.0/24のネットワークからのアクセスは監視の対象外(ignoreip)
「recidive」セクションの設定
- この設定を有効化(enabled)
- 1日に2回(maxretry)を超えてBANされたIPアドレスを、1週間(bantime)BANする設定 ※bantimeに「-1」を設定すると永久BANできます。
- BANする方法は、firewalldを使ってすべてのポートを遮断するルールを登録(banaction)
「openvpn」セクションの設定
- この設定を有効化(enabled)
- 使用するネットワークプロトコルとしてUDP、ポート番号として1194を指定
- フィルター「openvpn_filter」を使用(filter)して、ログファイル「/var/log/openvpn.log」を監視(logpath)
recidiveを利用するときの追加設定
fail2banには、何回もBANされている悪質なIPアドレスに対して、長期間BANする設定として「recidive」を定義でき、上の設定でも有効化していますが、recidiveを利用するには、以下を追加設定する必要があります。
# vi /etc/fail2ban/fail2ban.conf
[Definition]
loglevel = INFO ←DEBUG以外である必要があります。
dbpurgeage = 648000 ←少なくとも[recidive]セクションで定義しているbantimeの時間+0.5日分(43200秒)を指定します。
Fail2banの起動と自動起動設定
以下のコマンドを順に実行して、Fail2banを自動起動設定して、Fail2banを起動します。
# systemctl enable fail2ban
# systemctl start fail2ban
# systemctl status fail2ban
なお、環境にもよると思いますが、あらかじめ空のログファイルを生成しておかないと、サービスを起動できないケースがあります。
そのような時は、以下のコマンドで空のログファイルを作成しておいてから、サービスを起動しましょう。
# touch /var/log/fail2ban.log
Fail2banの動作確認
最後に動作確認として、OpenVPNサーバーに誤った認証情報でアクセスして、正常にBANされるか確認しておきましょう。
ちなみに「/var/log/fail2ban.log」には、以下のようにフィルターにマッチするログが検出されるたびにIPアドレスなどが記録され、ジェイル設定で定義した回数を超えるとBANされたことが記録されます。
# tail -f /var/log/fail2ban.log
2021-10-14 02:02:06,036 fail2ban.filter [1552]: INFO [openvpn] Found XXX.XXX.XX.XXX - 2021-10-14 02:02:04
2021-10-14 02:02:07,242 fail2ban.filter [1552]: INFO [openvpn] Found XXX.XXX.XX.XXX - 2021-10-14 02:02:06
2021-10-14 02:02:12,453 fail2ban.filter [1552]: INFO [openvpn] Found XXX.XXX.XX.XXX - 2021-10-14 02:02:11
2021-10-14 02:02:12,486 fail2ban.actions [1552]: NOTICE [openvpn] Ban XXX.XXX.XX.XXX
おまけ
現在アクセスが遮断(BAN)されているIPアドレスを確認するときは、以下のコマンドを実行します。
# fail2ban-client status <jail名>
アクセスが遮断(BAN)されているIPアドレスを解除するときは、以下のコマンドを実行します。
# fail2ban-client set <jail名> unbanip ***.****.***.***
あとがき
Fail2banは、IPアドレス単位で不正アクセスを抑止するのに効果的なツールです。
ご活用あれ。