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