Linux上のOpenVPNサーバーへの不正アクセスをfail2banで防ぐ方法

Linux上のOpenVPNサーバーへの不正アクセスをfail2banで防ぐ方法

リモートアクセス環境のツールとして、Linux上にOpenVPNを構築して運用している場合、セキュリティ対策として、悪意のある第三者からの不正アクセスを防がなければなりません。

対策方法としては、ファイアウォールやIPSといったネットワーク機器などが思いつきますが、OpenVPNサーバー上でできる対策のひとつに、Fail2banを使った対策方法があります。

そこでここでは、OpenVPNサーバー(CentOS 7+OpenVPN)にFail2banをインストールして不正アクセス対策する方法を紹介します。

Fail2banとは

Fail2banは、ネットワークサービスを提供するソフトウェアのログを監視し、不正なログのパターンにマッチしたIPアドレスをfirewalldのルールに追加して、自動的にアクセスを遮断(BAN)することができるセキュリティ対策ツールです。

Fail2ban

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アドレス単位で不正アクセスを抑止するのに効果的なツールです。

ご活用あれ。