Note to Self

公開する緊張感で、読み返した時に??にならない自分用メモです

Alma Linux:nftables Fail2ban インストール

nftablesで運用しているAlma Linux release 8.4に、Fail2banをインストールしてみる

Fail2banとは

起動すると各種設定ファイルを読み込んだ上で、デーモンプロセスとして常駐し、 ログファイルを監視し続ける、Pythonで書かれたスクリプト。 ログを監視し、定義した条件のログが発生するとBAN、定義した時間がが過ぎるとUNBANを自動で実行する。 Fail2ban自体に遮断機能はないが、iptablesやfirewalldと連携し、自動で遮断と解除を行う。

Fail2ban インストール

epel-releaseパッケージをインストール

*Fail2banは、epelリポジトリにある

$ sudo dnf -y install epel-release

インストールしたバージョンの確認

$ fail2ban-server --version
$ fail2ban-client --version
$ fail2ban-regex --version
$ fail2ban-python --version

設定ファイル構成

/etc/fail2ban/
├── action.d
│ ├── dummy.conf
│ ├── hostsdeny.conf
│ ├── iptables.conf
│ ├── mail-whois.conf
│ ├── mail.conf
│ └── shorewall.conf
├── fail2ban.conf
├── fail2ban.local
├── filter.d
│ ├── apache-auth.conf
│ ├── apache-noscript.conf
│ ├── couriersmtp.conf
│ ├── postfix.conf
│ ├── proftpd.conf
│ ├── qmail.conf
│ ├── sasl.conf
│ ├── sshd.conf
│ └── vsftpd.conf
├── jail.conf
└── jail.local

バージョンアップ時に設定を上書きされないよう.localファイを作成 Fail2ban起動時に設定ファイル「.conf」をロードした後、作成したユーザ定義「*.local」ファイルをオーバーライドする。

$ sudo cp -p fail2ban.conf fail2ban.local
$ sudo cp -p jail.conf jail.local
ファイル名 説明
fail2ban.conf 全般設定 ログの格納場所やログレベルを指定
filter.d/*.conf 正規表現を使ってアクセス違反を定義(監視対象)
action.d/*.conf アクセス違反が発生したときの動作を定義
jail.conf 監視するサービスとログファイルの設定。どの程度
(時間、回数)アクセスがあったらブロックするかを定義
jail.local デフォルト設定値を書き換える
サイト毎の設定はこのファイルで指定

jail.localの編集

[INCLUDES]セクション

どのログパスを読むかを指定。 Alma Linuxの場合fedora

before = paths-fedora.conf

[DEFAULT]セクション

Fail2banの基本動作を定義 ここで定義した動作は、後述のMW毎のセクションでオーバライド可能

ignoreip

Fail2banが除外するホストを定義 IPアドレス、CIDRでのマスク、DNSホスト名で定義可能 複数ホストを指定する場合はスペース区切り

ignoreip = 127.0.0.1/8

bantime

BANする期間を定義

bantime = 1d

DEFALT.findtime / DEFAULT.maxretry

findtimeの期間中に、maxretryの回数ログイン試行が失敗した場合にBANする

findtime = 1h maxretry = 5

backend

ログを監視するバクエンドモジュールの指定 pythonモジュールpyintifyを利用したりsystemdのjounalctlを利用するなど様々な方法がある

backend = auto

usedns

各ログにホストネームにてアクセスログが記載されていた場合、IPアドレスを逆引きするかどうかを指定 firewalldやそのバックのiptablesは、ホスト名でのアクセス制御を行うことができないため、IPアドレウsの情報は必須 ログにホストネームしか記載がなかった場合、それをIPアドレスに解決しないといけないが、ホストネームは詐称可能なため、大量のアクセスがあった場合、名前解決を行うだけでDoSになってしまう。

設定コマント゛ 説明
yes 逆引きする
warm 逆引きするが警告をログに残す
no 逆引きを行わずBANも行わない。情報のみ残す
raw ホスト名が関係ない(ユーザ名のみを見るなど)フィルタ/アクションの際に指定

usedns = warm

noが一番性能が良いが、ホストネームでアクセスしてきた場合に全くBANできないので、 Fail2banを利用するサービスのログにはホスト名を記載しない設定にし、usednsをnoにする。

enabled

Fail2banを有効にするかどうか DEFAULTセクションでは無効にしておき、有効化するサービスのセクションで有効に上書きするのが良い

enabled = false

banaction / banaction_allports

BANを行う時のアクションの基本を定義 実際は、アクション定義ファイルにて「メールを発報しログに書いてBAN」など細かく書いてあり、ここで、この実際のBANをどうやるか指定 デフォルトでは、iptablesがBANを実施する設定になっている。

banaction = iptables-multiport banaction_allports = iptables-allports

CentOS7以降、iptablesをfirewalldがラッピングしており、iptablesは起動していないのでfirewalldがBANを行うよう設定する。その設定は、jail.d/00-firewalld.confに記載があり、ここでfirewalldに上書きされるので、jail.localでの設定変更は不要

$ sudo vi 00-firewalld.conf
# This file is part of the fail2ban-firewalld package to configure the use of # the firewalld actions as the default actions. You can remove this package # (along with the empty fail2ban meta-package) if you do not use firewalld [DEFAULT] banaction = firewallcmd-rich-rules[actiontype=] banaction_allports = firewallcmd-rich-rules[actiontype=]

*firewallcmd-rich-rulesは、/etc/fail2ban/actions.d/ 内にある

loglevel

ログレベルの設定 不要なログが多くなるため、初期値の"INFO"から"NOTICE"に変更

loglevel = NOTICE

NWの設定

[ sshd ]
enabled

サービスを利用するかどうか指定 enabled = true # enabled = False ※利用しない場合

filter ※必須

基本的にセクション名(今回はsshd)と同盟のフィルタが、filter.d/に存在していれば、それが使用される それ以外にフィルタを追加したい場合はこのディレクティブを使う

port

BANを行うポート番号 デフォルトでssh(22)が定義されている。 複数必要な場合は、カンマ区切りで列挙。転んで連番を指定。 UDPを指定したい場合は、portではなくprotocolというディレクティブで別に定義

port = ssh,2222
#port = 0:65535 #全ポート遮断したい場合

logpath

監視を行うshdのログのパス この変数はpaths-common.confで定義

banaction / actionの違い
banaction

BANのアクションを指定 /etc/fail2ban/action.d内の設定ファイルを指定

action

jail.localで定義したデフォルトのBANアクションをサービスにより異なるものにしたい場合指定 指定しない場合は jail.local で指定したアクションが実行される

Fail2ban 起動 / 設定変更後

Fail2ban起動

$ sudo systemctl start fial2ban

Fail2ban自動起動ON

$ sudo systemctl enable fail2ban

Fail2ban再起動 *設定変更後

$ sudo systemctl restart fail2ban

動作確認

コマンド 説明
fail2ban-client 動作確認
fail2ban-client status 監視しているサービスを確認
fail2ban-client status [サービス名 ] BAN状況を確認

BANの解除

fail2ban-client set [Jail名] unbanip [IPアドレス]
systemctl restart fail2ban
BAN解除後、再起動せずUNBAN可能だった

BAN結果通知 REGECT / DROP

デフォルト:REGECTのため通知されてしまうので、DROPに変更

$ sudo vi /etc/fail2ban/action.d/iptables-common.conf
blocktype = DROP