macOSにFail2banをインストールして運用する。

[主題]
macOSでHomebrewを使わずに、Fail2banをインストール&運用する手順を説明したい。

[背景]
Fail2banは、不正アクセスからサーバーを守るツールである。サーバーのログを監視、設定した条件のアクセスがあった場合、そのIPアドレスをOSのファイアウォールに登録することで、アクセスを遮断する。(設定に基づいて、遮断解除もする)
インストールの難易度はとても低いが、macOSでの運用には、ちょっと工夫がいる。そこで、自身の作業記録を兼ねて、手順書を書くことにした。

[環境]
参考までに、筆者の環境を記載しておく
MacBook Pro 2018 15.4inch(インテルMac)
macOS 13.4 Ventura
Xcode 14.3
CommandLine Tools for Xcode 14.3.0.0.1

MacBook Pro 2016 13inch(インテルMac)
mmacOS 12.6.6 Monterey
CommandLine Tools for Xcode 14.2.0.0.1

[インストール手順]
python3を入れてしまえば、後は拍子抜けするほどに簡単である。

  1. python3のインストール
    Fail2banは,pythonで書かれているので、python3をインストールする。

    Python3ダウンロードリンク

    このpythonは、起動ディスク直下のライブラリにpython.frameworkとしてインストールされ、呼び出しはpython3となる。

    インストーラーパッケージの処理が終わった後、Finderで、/Applications/Python 3.11フォルダが開く。ここでフォルダ内のInstall Certificates.commandをダブルクリックして実行すること。

    なお、2023.08.24時点でのバージョンは3.11.4である。

  2. Fail2banのインストール

                    curl -LO https://github.com/fail2ban/fail2ban/archive/refs/tags/1.0.2.tar.gz
                    tar xf 1.0.2.tar.gz
                    cd fail2ban-1.0.2
                    ./fail2ban-2to3
                    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”.

[運用準備]
やや骨が折れるが、順番にこなして行く。

  1. 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行目)である。

  2. OS側のpf(Packet Filter、ファイアウォール)設定ファイル追記
    Fail2banがOS側のpfにアクセスできるようにする。

                    cd /etc/pf.conf
                    sudo vim pf.conf
                

    追記内容

                    #
                    # Fail2ban anchor point
                    #
                    anchor "f2b/*"
                
  3. 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>
                
  4. Fail2ban用ログファイルの準備

                    sudo touch /var/log/fail2ban.log
                
  5. 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
                
  6. 40*アクセス用フィルタ作成

                    cd /etc/fail2ban/filter.d
                
    1. 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
                          
    2. 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
                          
    3. 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
                          
  7. Fail2banの起動
    Fail2banは、ファイアウォール(macOSの場合はpf)とセットで動作する。

    1. 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
                          
    2. 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)
                          

参考サイト

以上。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL