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:
アクセスログをチェックして不正アクセスがあれば、これでメールサーバー等を守ることができます
ブルートフォース攻撃などがあれば、ログインはされなくてもサーバーに負担はかかるのでこういった対策が有効です
コメント