Fail2ban

提供: ArchWiki
2023年12月21日 (木) 06:51時点におけるKgx (トーク | 投稿記録)による版 (ヒントとテクニックを翻訳して追加)
ナビゲーションに移動 検索に移動

関連記事

Fail2ban は、ログファイル (例:/var/log/httpd/error_log) をスキャンし、認証の試行回数が多すぎる、脆弱性のスキャンなど、悪意のある兆候を示す IP を禁止します。一般に、Fail2ban は、次に、次の IP アドレスを拒否するように ファイアウォール ルールを更新するために使用されます。指定された時間だけですが、他の任意のアクション (電子メールの送信など) も設定できます。

警告:
  • IP を禁止するソフトウェアを使用することで、些細な攻撃は止めることができますが、追加のデーモンとロギングの成功に依存します。
  • fail2ban を sshd などと併用することは、公開鍵認証などが有効になっている場合 には、通常は意味がありません。
  • また、VPN の代わりにもなりません。必要な場合を除き、サービスをインターネットに公開しないでください。
  • さらに、攻撃者があなたの IP アドレスを知っている場合、送信元ヘッダーを偽装したパケットを送信し、あなたの IP アドレスを使用禁止にすることができます。必ず ignoreip で IP を指定してください。

インストール

次のパッケージのいずれかを インストール して下さい:

  • fail2ban - 最新の安定バージョン。
  • fail2ban-gitAUR - マスターからの最新のコミット。

使い方

Fail2ban を 設定fail2ban.service起動/有効化 します:

fail2ban-client

failed2ban-client を使用すると、jail (リロード、再起動、ステータスなど) を監視して、使用可能なすべてのコマンドを表示できます:

$ fail2ban-client

有効なジェイルをすべて表示するには:

# fail2ban-client status

たとえば sshd などの jail のステータスを確認するには:

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     9
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   0.0.0.0

禁止された IP を含むすべての jail のコンパクトバージョンの場合:

# fail2ban-client banned
[{'sshd': ['192.168.100.50']}, {'apache-auth': []}]

ハードニング

現在、fail2ban は root で実行する必要があり、systemd でプロセスをハードニングする余地があります。参照: systemd for Administrators, Part XII

ケイパビリティ

セキュリティを強化するために既存の fail2ban.serviceドロップイン設定ファイルCapabilityBoundingSet を指定することで fail2ban のケイパビリティを制限できます:

/etc/systemd/system/fail2ban.service.d/capabilities.conf
[Service]
CapabilityBoundingSet=CAP_DAC_READ_SEARCH CAP_NET_ADMIN CAP_NET_RAW

上の例では、CAP_DAC_READ_SEARCH で fail2ban に完全な読み取りアクセスを許可し、CAP_NET_ADMINCAP_NET_RAWiptables によるファイアウォールのルールの設定を許可しています。fail2ban の設定によっては、ケイパビリティを追加する必要があるでしょう。詳しくは capabilities(7) を見て下さい。

ファイルシステムのアクセス

ノート: 環境によっては以下の設定で fail2ban が使えなくなる可能性があります。最初は以下の設定を使わないで fail2ban を試してください。

[Service] セクションで、ReadOnlyDirectoriesReadWriteDirectories を使うことで、ファイルシステムの読み書きアクセスを制限することができます。例えば:

ReadOnlyDirectories=/
ReadWriteDirectories=/var/run/fail2ban /var/lib/fail2ban /var/spool/postfix/maildrop /tmp /var/log/fail2ban

上の例では、pid やソケットファイルの /var/run/fail2ban と、postfix sendmail の /var/spool/postfix/maildrop を除いて、ファイルシステムを読み取り専用に制限しています。ケイパビリティと同じく、システム設定や fail2ban の設定によって変える必要が出てきます。fail2ban の動作の中には /tmp ディレクトリが必要になるものもあります。fail2ban の行動記録を保存して欲しい場合は /var/log/fail2ban を追加してください。全てのディレクトリが存在していることを確認してください。存在しない場合、サービスの起動時にエラーコード 226 が表示されます。また、/etc/fail2ban/fail2ban.conf の logtarget を修正してください:

logtarget = /var/log/fail2ban/fail2ban.log

設定

ノート: ディストリビューションのアップデートで jail.conf ファイルは上書きされてしまう可能性があるので、jail.local ファイルや jail.d/ ディレクトリ下の .conf ファイル (例: jail.d/ssh-iptables.conf) に修正を加えるのが推奨されます。

デフォルト jail

多数のサービスに対応しているデフォルトの jail は /etc/fail2ban/jail.conf に存在していますが、デフォルトでは有効になっていません。セクションヘッダーを適当な .local ファイルにコピーすることで有効にできます。

パス

Arch Linux の基本設定を有効にするには、jail.local ファイルに以下のセクションを追加・変更:

[INCLUDES]
before = paths-arch.conf

fail2ban.service再起動して設定をテストしてください。fail2ban サービスが起動に失敗すると fail2ban-client から "file not found errors" が出力されます。paths-arch.confjail.local を必要に応じて調整してください。デフォルトの jail は設定を変更しないと動作しない場合があります。

カスタム SSH jail

/etc/fail2ban/jail.d/jail.conf を編集して、以下のセクションを追加して信頼する IP アドレスのリストを更新します。

使っているファイアウォールが iptables の場合:

[DEFAULT]
bantime = 1d
ignoreip = 127.0.0.1/8

[sshd]
enabled  = true
filter   = sshd
action   = iptables
backend  = systemd
maxretry = 5
findtime = 1d
bantime  = 2w

fail2ban はバージョン 0.10 から IPv6 をサポートしています。使用しているファイアウォールに応じて、ip6tables.service などを起動・有効化してください。

ノート: ファイアウォールとして shorewall を使っている場合、iptablesshorewall に置き換えてください。また、/etc/shorewall/shorewall.confBLACKLISTALL に設定することができます。この設定を行わないと IP アドレスを ban するルールは新しい接続にしか適用されません。

また、/etc/ssh/sshd_config に次を追加/変更してください:

LogLevel VERBOSE

そうしないとパスワード認証の失敗が正しく記録されません。

ヒントとテクニック

カスタム SSH jail

警告: 攻撃者があなたの IP アドレスを知っている場合、スプーフィングされたソースヘッダーを持つパケットを送信し、あなたの IP アドレスをサーバーからロックアウトすることができます。SSH 鍵 は、これらの問題を発生させずにブルートフォースの問題に対する洗練されたソリューションを提供します。

/etc/fail2ban/jail.d/sshd.local を編集し、このセクションを追加して、ignoreip の信頼できる IP アドレスのリストを更新します:

/etc/fail2ban/jail.d/sshd.local
[sshd]
enabled   = true
filter    = sshd
banaction = iptables
backend   = systemd
maxretry  = 5
findtime  = 1d
bantime   = 2w
ignoreip  = 127.0.0.1/8
ノート:
  • パスワードの失敗が正しく記録されないかもしれないので、fail2ban の完全な監視を許可するために、/etc/ssh/sshd_configLogLevel VERBOSE を設定する必要があるかもしれません。
  • Fail2ban はバージョン 0.10 から IPv6 をサポートしています。それに合わせて ファイアウォール を適応してください、例えば ip6tables.service起動/有効化 など。
  • (ユニットファイルに LogNamespace=something を追加することで) ジャーナルの名前空間を使用する場合、backend を次のように設定することで、fail2ban にそれらのログを読ませることができます:backend = systemd[journalfiles="/var/log/journal/*.something/system.journal"] のように設定します。
ヒント:
  • ufw のような iptables フロントエンドを使用する場合、iptables を使用する代わりに banaction = ufw を使用することができます。
  • また、/etc/shorewall/shorewall.confBLACKLISTALL に設定すると、IP アドレスを禁止するために追加されたルールは新しい接続だけに影響します。

Systemd バックエンド: ジャーナルフィルタリング

パフォーマンスを向上させるために systemd バックエンドを使用する場合は、journalmatch を使用してフィルターを設定します。たとえば、カーネルレベルのログメッセージのみを解析するには、次のようにします。

/etc/fail2ban/filter.d/fwdrop.local
[Definition]
failregex = ^.*DROP_.*SRC=<ADDR> DST=.*$
journalmatch = _TRANSPORT=kernel

こちらも参照 systemd.journal-fields(7)

サービスの強化

現在、Fail2ban は root として実行する必要があります。したがって、systemd を使用してプロセスを強化することを検討することをお勧めします。

fail2ban.serviceドロップイン 設定ファイルを 作成:

/etc/systemd/system/fail2ban.service.d/override.conf
[Service]
PrivateDevices=yes
PrivateTmp=yes
ProtectHome=read-only
ProtectSystem=strict
ReadWritePaths=-/var/run/fail2ban
ReadWritePaths=-/var/lib/fail2ban
ReadWritePaths=-/var/log/fail2ban
ReadWritePaths=-/var/spool/postfix/maildrop
ReadWritePaths=-/run/xtables.lock
CapabilityBoundingSet=CAP_AUDIT_READ CAP_DAC_READ_SEARCH CAP_NET_ADMIN CAP_NET_RAW

CapabilityBoundingSet パラメータ CAP_DAC_READ_SEARCH を使用すると、Fail2ban にすべてのディレクトリとファイルへの完全な読み取りアクセスが許可されます。CAP_NET_ADMINCAP_NET_RAW により、コマンドラインシェル インターフェイスを持つファイアウォール上で Fail2ban を動作させることができます。詳細については、capabilities(7) を参照してください。

ProtectSystem=strict を使用すると、ファイルシステム 階層は読み取り専用になり、ReadWritePaths は Fail2ban に必要なパスへの書き込みアクセスを許可します。

Create /etc/fail2ban/fail2ban.local with the correct logtarget path:

/etc/fail2ban/fail2ban.local
[Definition]
logtarget = /var/log/fail2ban/fail2ban.log

root として /var/log/fail2ban/ ディレクトリを作成します。

最後に、systemd デーモンを 再起動 して実行しユニットの変更を適用し、fail2ban.service を実行します。

参照