不正アクセス対策～fail2ban～


# はじめに
とあるお客様から、「メールやsshで不正アクセスを試みているログが多く、本当に必要なログが見つけにくい。」
というお話があったそうです。
で、[「ログを抑制」](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-basic_configuration_of_rsyslog)するのもアリなのですが、もう少し踏み込んで、
不正アクセスを試みた相手のIPアドレスからの通信を一定期間ブロックするためのソフトウェアであるfail2banを導入しましょう。

# fail2ban 導入
## fail2banのインストール
```
yum install epel*
yum install fail2ban
```

## fail2banのサービス起動、自動起動有効化
```
systemctl start fail2ban.service
systemctl enable fail2ban.service
```
## fail2banの設定
設定ファイルのディレクトリはこちらになります。```
```
cd /etc/fail2ban
```
設定ファイルはjail.confなのですが、直接編集するのではなく、.localファイルを作成して設定をオーバーライドするのが推奨されていますので、そのようにします。

### jail.local(新規作成）
```
ignoreip = 127.0.0.1/8

# 24時間以内に3回不審なアクセスがあったら24時間BAN
bantime  = 86400
findtime  = 86400
maxretry = 3

#CentOS7なのでsystemd
backend = systemd

# メール通知時の設定(ご自分の環境に合わせて）
destemail = nisitand@host185.net2.localnet
sender = root@host185.net2.localnet
mta = postfix

# SSHのアクセスに対する設定
[sshd]
enabled = true
banaction = firewallcmd-ipset
　　　　　　 sendmail-whois[name=SSH, dest=nisitand@host185.net2.localnet, sender=fail2ban@host185.net2.localnet, sendername="Fail2Ban"]#メール通知(任意)

# Postfixのアクセスに対する設定
[postfix-sasl]
enabled = true
banaction = firewallcmd-ipset
            sendmail-whois[name=SMTP, dest=nisitand@host185.net2.localnet, sender=fail2ban@host185.net2.localnet, sendername="Fail2Ban"]#メール通知(任意)
```
※メールアドレスはローカル環境のものです。


### action.d/firewallcmd-common.conf（修正：54行目付近）
BANしたときの動作（Action）を定義する設定を一部変更します。デフォルトの動作ではBANした相手に拒否（Reject）していることを伝える設定となっていますが、そんなに親切にしてやる必要はないので破棄（DORP）に動作を変更します。
```
# Option:  blocktype (ipv4/ipv6)
# Notes    See iptables/firewalld man pages for jump targets. Common values are REJECT,
#          REJECT --reject-with icmp-port-unreachable, DROP
# Values:  STRING
#blocktype = REJECT --reject-with <rejecttype>★コメントアウト
blocktype = DROP★追加
```

# fail2banのテスト
## SMTPのテスト
自分の端末からtelnetコマンドで25に接続し、エラーになるSMTP認証コマンドをたたきます。
```
HELO host150.net2.local
AUTH LOGIN
AUTH LOGIN
quit
```

このような感じで応答が帰ってきます。
```
220 host185.net2.local ESMTP Postfix
250 host185.net2.local
334 ***********
535 5.7.8 Error: authentication failed: bad protocol / cancel
```
これを3回繰り返すと、BANされます。

/var/log/maillogにも、このようなログが記録されます。
```
Sep  8 11:16:34 host185 postfix/smtpd[2123]: warning: unknown[192.168.2.150]: SASL LOGIN authentication failed: bad protocol / cancel
```
仮に、このログの場合はBANする対象から外したい、などの要望があった場合は、
```filter.d/postfix.conf```
を修正すれば良さそうです。

## SSHのテスト
こちらはTeratermでssh接続（22/TCP）の時に、でたらめなユーザID、パスワードでログイン失敗すればよいですね。（ほかのパターンの失敗も考えられますが、とりあえず）
BANされるログの条件については、
```filter.d/sshd.conf```
を見ていただければと思います。

## BAN対象の確認
もちろん、パケットを捨てられるのでアクセスがすべてタイムアウトになるのですが、BANの対象を確認する方法を記載します。
```
# fail2ban-client status postfix-sasl
Status for the jail: postfix-sasl
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     16
|  `- Journal matches:  _SYSTEMD_UNIT=postfix.service
`- Actions
   |- Currently banned: 1
   |- Total banned:     2
   `- Banned IP list:   192.168.2.150
```
この場合はBanned IP list に192.168.2.150（テスト端末のIPアドレス）が入っていることがわかります。

sshの場合も同様です。
```
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     11
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned:     2
   `- Banned IP list:   192.168.2.150
```

# fail2banの運用
## banされているIPアドレス確認
上のテストの際にも実行しましたが、このようになります。
```
fail2ban-client status [Jail名]
```
Jail名については、今回のsshd（ssh）、postfix-sasl（smtp）が該当します。

## banの解除
```
fail2ban-client set [Jail名] unbanip [IPアドレス]
```
[Jail名]については、先の項目と同じでbanしてしまったJail名を入れます。
[IPアドレス]はbanされてしまったIPアドレスをxxx.xxx.xxx.xxxのに入れます。

### ためしに
先のテストでbanされたテスト端末をBan解除してみましょう。
```
# fail2ban-client set postfix-sasl unbanip 192.168.2.150
1
```

```
# fail2ban-client status postfix-sasl
Status for the jail: postfix-sasl
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     16
|  `- Journal matches:  _SYSTEMD_UNIT=postfix.service
`- Actions
   |- Currently banned: 0
   |- Total banned:     2
   `- Banned IP list:
```

これで間違ってbanしても大丈夫ですね。では