fail2banで不正アクセスから保護

Server

Fail2ban(フェイル・トゥー・バン)とは、Linuxサーバーで広く使われている不正アクセス対策ツールです。
簡単に言うと、「不審なログイン試行が一定回数あったら、そのIPアドレスを一時的にブロックしてくれる」セキュリティソフトです


主な特徴:

  • SSHやメール、FTPなど様々なサービスに対応
  • ログファイルを監視して、不正なアクセス(例:パスワード総当たり攻撃)を検出
  • 条件に一致したIPをiptablesなどで自動的にBAN(遮断)
  • BANの期間は設定で変更可能

Fail2BanでSSH、Postfix、Dovecotを保護するには、各サービスごとに専用の「jail(監獄)」設定を行う必要があります

ちなみにそれぞれのログを確認するコマンドは以下の通りです

Ubuntu 20.04の場合:

#SSH接続のログ
sudo cat /var/log/auth.log | grep ssh

#postfixのログ
sudo grep postfix /var/log/mail.log

#dovecotのログ
sudo grep dovecot /var/log/mail.log

1. fail2ban をインストール

Ubuntu20.04の場合:

sudo apt update
sudo apt install fail2ban

2. 設定ファイルの編集

Fail2Banの設定は通常、/etc/fail2ban/jail.conf ではなく、カスタム設定を jail.local に記述します

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

以下のように設定を追記・編集します

ssh、postfix、dovecot、postfix-saslの接続設定の保護を定義します

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600

[postfix]
enabled  = true
port     = smtp,ssmtp,submission
filter   = postfix
logpath  = /var/log/mail.log
maxretry = 5
bantime  = 3600
findtime = 600
action   = iptables[name=postfix, port=smtp, protocol=tcp]

[dovecot]
enabled = true
port = imap,imap2,imaps,pop3,pop3s
filter = dovecot
logpath = /var/log/mail.log
maxretry = 3
bantime = 86400
findtime = 600
action = iptables[name=dovecot, port=imap, protocol=tcp]

[postfix-sasl]
enabled = true
port    = smtp,submission,465
filter  = postfix
logpath = /var/log/mail.log
maxretry = 3

【共通の設定項目と意味】

enabled = true

  • このjail(保護ルール)を有効にするかどうか
  • true にするとFail2Banがこのルールでログ監視を開始します

port = xxx

  • 対象サービスが使用するポート番号
  • 例:ssh, smtp, submission, imap, pop3 など
  • 複数ある場合はカンマ区切り
  • もしSSHのポートを22以外に変更していたら、port = ssh を実際の番号に変えてください

filter = xxx

  • /etc/fail2ban/filter.d/xxx.conf にある正規表現の定義ファイルを指定
  • このファイルで、ログから「悪意のあるアクセス」と判断する条件が定義されています
  • postfix-saslはpostfixと同じフィルターを使っています

logpath = /path/to/log

  • ログファイルのパス。Fail2Banがこのログファイルを監視して、不正アクセスの痕跡を探します

maxretry = n

  • 指定された回数(n)ログに失敗の痕跡が出たら、アクセス元IPをBAN(遮断)します

findtime = 600(省略可)

  • maxretry 回の失敗がこの秒数以内にあったらBANします(この例では600秒=10分)

bantime = 600(省略可)

  • BANされたIPアドレスを遮断し続ける秒数(この例も10分)

3. フィルター設定の確認(必要なら修正)

フィルター定義ファイルは /etc/fail2ban/filter.d/ にあります

  • SSH: sshd.conf(通常デフォルトでOK)
  • Postfix: postfix.conf(通常デフォルトでOK)
  • Dovecot: dovecot.conf(通常デフォルトでOK)
  • postfix-sasl:postfix.confを利用しますが、内容を少し変更しました

以下のコマンドでpostfixのフィルター設定ファイルを編集します

sudo nano /etc/fail2ban/filter.d/postfix.conf
[INCLUDES]
before = common.conf

[Definition]

_daemon = postfix(-\w+)?/\w+(?:/smtp[ds])?
_port = (?::\d+)?
_pref = [A-Z]{4}

prefregex = ^%(__prefix_line)s<mdpr-<mode>> <F-CONTENT>.+</F-CONTENT>$

exre-user = |[Uu](?:ser unknown|ndeliverable address)

mdpr-normal = (?:\w+: (?:milter-)?reject:|(?:improper command pipelining|too many errors) after \S+)
mdre-normal=^%(_pref)s from [^[]*\[<HOST>\]%(_port)s: [45][50][04] [45]\.\d\.\d+ (?:(?:<[^>]*>)?: )?(?:(?:Helo command|(?:Sender|Recipient) address) rejected: )?(?:Service unavailable|(?:Client host|Command|Data command) rejected|Relay access denied|(?:Host|Domain) not found|need fully-qualified hostname|match%(exre-user)s)\b
            ^from [^[]*\[<HOST>\]%(_port)s:?

mdpr-auth = warning:
mdre-auth = ^[^[]*\[<HOST>\]%(_port)s: SASL ((?i)LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed:(?! Connection lost to authentication server| Invalid authentication mechanism)
mdre-auth2= ^[^[]*\[<HOST>\]%(_port)s: SASL ((?i)LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed:(?! Connection lost to authentication server)

mdpr-rbl = %(mdpr-normal)s
mdre-rbl  = ^%(_pref)s from [^[]*\[<HOST>\]%(_port)s: [45]54 [45]\.7\.1 Service unavailable; Client host \[\S+\] blocked\b

# Mode "rbl" currently included in mode "normal" (within 1st rule)
mdpr-more = %(mdpr-normal)s
mdre-more = %(mdre-normal)s
mdpr-ddos = (?:lost connection after(?! DATA) [A-Z]+|disconnect(?= from \S+(?: \S+=\d+)* auth=0/(?:[1-9]|\d\d+))|(?:PREGREET \d+|HANGUP) after \S+|COMMAND (?:TIME|COUNT|LENGTH) LIMIT)
mdre-ddos = ^from [^[]*\[<HOST>\]%(_port)s:?

mdpr-extra = (?:%(mdpr-auth)s|%(mdpr-normal)s)
mdre-extra = %(mdre-auth)s
            %(mdre-normal)s

mdpr-aggressive = (?:%(mdpr-auth)s|%(mdpr-normal)s|%(mdpr-ddos)s)
mdre-aggressive = %(mdre-auth2)s
                  %(mdre-normal)s

mdpr-errors = too many errors after \S+
mdre-errors = ^from [^[]*\[<HOST>\]%(_port)s$

failregex = ^[^[]*\[<HOST>\]%(_port)s: SASL ((?i)LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed:(?! Connection lost to authentication server| Invalid authentication mechanism)

mode = auth

ignoreregex = 

[Init]

journalmatch = _SYSTEMD_UNIT=postfix.service

4. fail2ban を再起動

設定ファイルを変更したらシステムを再起動します

sudo systemctl restart fail2ban

5. ステータス確認

以下のコマンドでfail2banの各サービスへの状態を確認します

sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo fail2ban-client status postfix
sudo fail2ban-client status dovecot

正常に起動できれば以下のように表示されます

Status for the jail: postfix
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  - Journal matches:  _SYSTEMD_UNIT=postfix.service
- Actions
   |- Currently banned: 0
   |- Total banned:     0
   - Banned IP list:

アクセスログをチェックして不正アクセスがあれば、これでメールサーバー等を守ることができます

ブルートフォース攻撃などがあれば、ログインはされなくてもサーバーに負担はかかるのでこういった対策が有効です

コメント