Fail2Ban

Fail2Banはサーバに対するアクセス失敗ログや認証失敗ログを参照し、不要なアクセスを制限します。 Fail2Banを使用してそのような不要なアクセスをサーバに到達する前にファイアウォール等で遮断するのが一般的です。 しかし、このような遮断行為はある意味受け身的であり、やられっぱなしも癪です。 この記事は、遮断に加えて通報機能もFail2Banに持たせる事を目指します。

最近のクラウドサーバは、標準のサイバーレジリエンスでFail2Banがインストールされています。現在、syakesaba.comでは以下のサーバをFail2Ban対象としています。この設定は、sshd, postfix, dovecot, nginxの認証ログを参照し、一定期間、所定の回数の認証失敗ログの発生をトリガーにファイアウォールであるiptablesで認証失敗したホストを一定期間接続出来ないようにするものです。このファイル以外はOSのパッケージマネージャでインストールされた標準の設定ファイルを使用しています。

# /etc/fail2ban/jail.d/defaults-debian.conf
[DEFAULT]
banaction = iptables
banaction_allports = iptables[type=allports]
backend = systemd

[sshd]
enabled = true
backend = systemd

[postfix]
enabled = true
backend = systemd

[dovecot]
enabled = true
backend = systemd

[nginx-http-auth]
enabled = true
backend = systemd

今回は以下のサービスに対してBan対象のホストを通知するBanActionをsshdに追加します。

AbuseIPDB

AbuseIPDBはアカウントを持っている方なら誰でも悪意のあるIPアドレスを通報できるサービスです。

アカウント登録

AbuseIPDBホームページの右上のSign Upから登録を行います。FREEプランで登録します。

abuseipdb_plans.png

Warning

usernameはCommunityに公開されます。

abuseipdb_username.png

最後に、APIキーを取得しておきます。ログイン後のホームページの右上のMy APIメニューから取得が可能です。

abuseipdb_apikey.png

VirusTotal

VirusTotalもアカウントを持っている方なら誰でも悪意のあるIoCを通報できるサービスです。

アカウント登録

VirusTotalホームページの右上のSign Upから登録を行います。FREEプランで登録します。

Warning

First Name, Last Name, usernameすべてCommunityに公開されます。

virustotal_username.png

APIキーを取得しておきます。ログイン後のホームページの右上のAPI Keyメニューから取得が可能です。

Fail2Ban: sshdの構成

通常、Fail2Banは3つのコンポーネントで構成されます。

  • Jail: 監査対象を定義します。enabled = trueであれば監査が有効になります。
    • /etc/fail2ban/jail.d/*.conf
    • /etc/fail2ban/jail.local
  • Filter: 監査対象のメッセージ(ログ文字列など)から失敗ログを抽出する処理を定義します。主に構造化された正規表現です。
    • /etc/fail2ban/filter.d/*.conf
  • Action: 監査対象の失敗ログが観測された場合に実行する処理を定義します。
    • /etc/fail2ban/action.d/*.conf

私の環境ではsshdのFail2Banコンポーネントは以下で定義されてました。

  • Jail: /etc/fail2ban/jail.d/defaults-debian.conf
  • Filter: /etc/fail2ban/filter.d/sshd.conf
  • Action: /etc/fail2ban/action.d/iptables.conf