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