macOSにFail2banをインストールして運用する。
[主題]
macOSでHomebrewを使わずに、Fail2banをインストール&運用する手順を説明したい。
[背景]
Fail2banは、不正アクセスからサーバーを守るツールである。サーバーのログを監視、設定した条件のアクセスがあった場合、そのIPアドレスをOSのファイアウォールに登録することで、アクセスを遮断する。(設定に基づいて、遮断解除もする)
インストールの難易度はとても低いが、macOSでの運用には、ちょっと工夫がいる。そこで、自身の作業記録を兼ねて、手順書を書くことにした。
[環境]
参考までに、筆者の環境を記載しておく
MacBook Pro 2018 15.4inch(インテルMac)
macOS 14.7.1 Sonoma
Xcode 16.1
CommandLine Tools for Xcode 16.1.0.0.1
[インストール手順]
python3を入れてしまえば、後は拍子抜けするほどに簡単である。
-
python3のインストール
Fail2banは,pythonで書かれているので、python3をインストールする。このpythonは、起動ディスク直下のライブラリにpython.frameworkとしてインストールされ、呼び出しはpython3となる。
インストーラーパッケージの処理が終わった後、Finderで、
/Applications/Python 3.11
フォルダが開く。ここでフォルダ内のInstall Certificates.command
をダブルクリックして実行すること。なお、2024.11.17時点でのバージョンは3.13.0である。
-
Fail2banのインストール
curl -LO https://github.com/fail2ban/fail2ban/archive/refs/tags/1.1.0.tar.gz tar xf 1.1.0.tar.gz cd fail2ban-1.1.0 sudo python3 setup.py install
インストール終了時に出るメッセージ
以下のメッセージが出ればインストールは成功である。Please do not forget to update your configuration files.
They are in “/etc/fail2ban/”.You can also install systemd service-unit file from “build/fail2ban.service”
resp. corresponding init script from “files/*-initd”.
[運用準備]
やや骨が折れるが、順番にこなして行く。
-
Fail2banの自動起動設定
sudo cp files/macosx-initd /Library/LaunchDaemons/jp.yourName.fail2ban.plist
cd /Library/LaunchDaemons sudo vim jp.yourName.fail2ban.plist
編集内容をdiff形式で示す。
--- files/macosx-initd 2023-05-21 11:57:48.000000000 +0900 +++ /Library/LaunchDaemons/jp.yourName.fail2ban.plist 2023-05-21 00:17:37.000000000 +0900 @@ -1,5 +1,3 @@ -/Library/LaunchDaemonsm/org.fail2ban.plist -=================================== <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> @@ -7,13 +5,13 @@ <key>Disabled</key> <false/> <key>Label</key> - <string>fail2ban</string> + <string>jp.yourName.fail2ban</string> <key>ProgramArguments</key> <array> - <string>/usr/local/bin/fail2ban-client</string> + <string>/Library/Frameworks/Python.framework/Versions/3.11/bin/fail2ban-client</string> <string>start</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
やっていることは、ファイル冒頭の2行の削除(4, 5行目)、ラベルの変更(13, 14行目)、それにProgramArgumentsに書かれたfail2ban-clientのパス変更(17, 18行目)である。
-
OS側のpf(Packet Filter、ファイアウォール)設定ファイル追記
Fail2banがOS側のpfにアクセスできるようにする。cd /etc/pf.conf sudo vim pf.conf
追記内容
# # Fail2ban anchor point # anchor "f2b/*"
-
OS側のpf(Packet Filter、ファイアウォール)自動起動設定
cd /Library/LaunchDaemons sudo vim jp.yourName.enable_pf.plist
記述する内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Disabled</key> <false/> <key>Label</key> <string>jp.yourName.enable_pf</string> <key>Program</key> <string>/sbin/pfctl</string> <key>ProgramArguments</key> <array> <string>pfctl</string> <string>-e</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
-
Fail2ban用ログファイルの準備
sudo touch /var/log/fail2ban.log
-
jail.local(カスタムな設定ファイル)の準備
筆者の場合、Apache Webサーバーに来る400,403,404のアクセスを遮断したかったので、この記事を参考に作成した。また、macOSの場合、banactionにpfを用いることは、ここから学んだ。sudo vim /etc/fail2ban/jail.local
記述する内容
[DEFAULT] # bantime: findtime = 30 bantime = 7200 maxretry = 1 # port: port = 80,443 # logpath: logpath = /usr/local/apache2/logs/access_log* backend = polling # default banning actions: banaction = pf[actiontype="<multiport>"] banaction_allports = pf[actiontype="<allports>"] [apache-400] enabled = true filter = apache-400 [apache-403] enabled = true filter = apache-403 [apache-404] enabled = true filter = apache-404 [recidive] enabled = 1 filter = recidive logpath = /var/log/fail2ban.log bantime = 604800 ; 1 week findtime = 86400 ; 1 day maxretry = 2
-
40*アクセス用フィルタ作成
cd /etc/fail2ban/filter.d
-
apache-400.confフィルタ
sudo vim apache-400.conf
記述する内容
[Definition] failregex = ^<ADDR> \S+ \S+(?: \[\])? "(?:[^"]*|(?:[^"\\]*|\\.)*)" 400\s ignoreregex = 127.0.0.0/8 192.168.1.0/16
-
apache-403.confフィルタ
sudo vim apache-403.conf
記述する内容
[Definition] failregex = ^<HOST>.*"(GET|POST).*" 403 .*$ ignoreregex = 127.0.0.0/8 192.168.1.0/16
-
apache-404.confフィルタ
sudo vim apache-404.conf
記述する内容
[Definition] failregex = ^<HOST>.*"(GET|POST).*" 404 .*$ ignoreregex = 127.0.0.0/8 192.168.1.0/16
-
-
Fail2banの起動
Fail2banは、ファイアウォール(macOSの場合はpf)とセットで動作する。-
pfの起動
cd /Library/LaunchDaemons/ sudo launchctl load -w jp.yourName.enable_pf.plist
pfの確認
sudo pfctl -si | head -n 1
正常に起動すると、以下のような表示が出る。
No ALTQ support in kernel ALTQ related functions disabled Status: Enabled for 0 days 00:00:55 Debug: Urgent
-
Fail2banの起動
cd /Library/LaunchDaemons/ sudo launchctl load -w jp.miyamura.fail2ban.plist
正常に起動すると、/var/log/fail2ban.logに次のようなログが出力される。
2023-05-23 02:41:17,853 fail2ban.server [411]: INFO -------------------------------------------------- 2023-05-23 02:41:17,856 fail2ban.server [411]: INFO Starting Fail2ban v1.0.3.dev1 2023-05-23 02:41:17,857 fail2ban.server [411]: INFO Daemon started 2023-05-23 02:41:17,859 fail2ban.observer [411]: INFO Observer start... 2023-05-23 02:41:17,951 fail2ban.database [411]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3' 2023-05-23 02:41:17,982 fail2ban.jail [411]: INFO Creating new jail 'recidive' 2023-05-23 02:41:17,984 fail2ban.jail [411]: INFO Jail 'recidive' uses poller {} 2023-05-23 02:41:17,984 fail2ban.jail [411]: INFO Initiated 'polling' backend 2023-05-23 02:41:17,995 fail2ban.filter [411]: INFO maxRetry: 2 2023-05-23 02:41:17,995 fail2ban.filter [411]: INFO findtime: 86400 2023-05-23 02:41:17,996 fail2ban.actions [411]: INFO banTime: 604800 2023-05-23 02:41:17,996 fail2ban.filter [411]: INFO encoding: UTF-8 2023-05-23 02:41:17,997 fail2ban.filter [411]: INFO Added logfile: '/var/log/fail2ban.log' (pos = 86732, hash = edca017c899e59fd07d0e77f714aebe7495e77b5) 2023-05-23 02:41:17,998 fail2ban.jail [411]: INFO Creating new jail 'apache-400' 2023-05-23 02:41:17,999 fail2ban.jail [411]: INFO Jail 'apache-400' uses poller {} 2023-05-23 02:41:17,999 fail2ban.jail [411]: INFO Initiated 'polling' backend 2023-05-23 02:41:18,000 fail2ban.filter [411]: INFO maxRetry: 1 2023-05-23 02:41:18,001 fail2ban.filter [411]: INFO findtime: 30 2023-05-23 02:41:18,001 fail2ban.actions [411]: INFO banTime: 7200 2023-05-23 02:41:18,002 fail2ban.filter [411]: INFO encoding: UTF-8 2023-05-23 02:41:18,003 fail2ban.filter [411]: INFO Added logfile: '/usr/local/apache2/logs/access_log' (pos = 10262, hash = a1f376d31d94531c4a4fb6b609ee1bf14c424a1c) 2023-05-23 02:41:18,006 fail2ban.filter [411]: INFO Added logfile: '/usr/local/apache2/logs/access_log.1' (pos = 391, hash = 936473a283e8fbd1050c5fcce9689f48b6461e4f) 2023-05-23 02:41:18,007 fail2ban.filter [411]: INFO Added logfile: '/usr/local/apache2/logs/access_log.2' (pos = 9740, hash = 261f608ddd56f372cf9ece8c292ff778bec011a3) 2023-05-23 02:41:18,008 fail2ban.filter [411]: INFO Added logfile: '/usr/local/apache2/logs/access_log.3' (pos = 4213, hash = 725734de70c5fe3d112fd15f49cff40a156023dd)
-
参考サイト
- Fail2ban
- Fail2ban on MacOS Mojave (10.14.6) · Issue #2930 · fail2ban/fail2ban · GitHub
- Fail2Banを使って不正なアクセスを遮断する(全自動) | ピロリロール
- macOS Catalina のファイアウォールを pf (packet filter)で強化する – What I Know ~ワッタイナ
- Fail2ban filter for error 400 on nginx – Server Fault
- HOWTO Mac OS X Server (10.5) – Fail2ban
- Apache向けfail2banの簡易構築手順 – Qiita
以上。
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント