[Ubuntu 20.04] Dovecot/Postfixの認証可能なIPを制限した

# 不正アクセス大杉

　2022年5月に入ったあたりから、メールアカウント乗っ取りチャレンジ（DDoSかも？）が増えてきたので対策した。
![不正アクセス001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248818/b5fc4521-e1ff-1744-55d6-c78276cddfb7.png)
　`/var/log/auth.log`に現れる大量の`authentication failure`。認証に失敗したら接続元の国に応じてiptablesに登録される仕組みとしているが、ログから判断する仕組みなので、最初の1回は認証チャレンジさせてしまう。

　ユーザーのパスワードはそれなりに強固なものにしているが、たまたま成功する可能性がゼロではない。接続元のIPは国外からが多く、また対象としているサーバーは国外から認証する機会は業務上ほぼ無いので、今回は海外からの認証を試みるIPに対して最初の1回目から認証を通さないようにdovecotを設定する。
 
# Dovecotの設定

　`/etc/dovecot/conf.d/auth-system.conf.ext`に許可するIPを記載する。

```:/etc/dovecot/conf.d/auth-system.conf.ext
passdb {
  driver = pam
  # [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
  # [cache_key=<key>] [<service name>]
  #args = dovecot

# 以下を追記
  override_fields = allow_nets=localhost,192.168.0.0/16,127.0.0.0/8,・・・・・

# 以下略
```

　実際の設定は国内全てのIPをコピペした。これで国外IPからのアクセスでは、例え正しいユーザーIDとパスワードを入力しても`failure`となる。定期的にIPリスト更新しないと不具合があるかもしれない。スクリプトはそのうち作るかぁ（来週くらいからやるかぁ位の気力）。
![不正アクセス002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248818/5a330907-e07c-7e72-0089-8c8678c1c128.png)
　記載後Dovecotを再起動して設定反映。

```bash
systemctl restart dovecot
```

　念のためstatusでエラーが起きていないか確認することを推奨。

```bash
systemctl status dovecot
```

# 記載を自動化する
　重い腰を上げてようやく自動化。

　まずは日本のIPアドレス一覧をダウンロード。ここでは`/root/COUNTRY_CODE`というディレクトリに`JP_LIST.txt`というファイルでダウンロードしている。fetus.jpさんからダウンロード。適当に名前をつけて`/etc/cron.monthly`あたりに入れておくか、必要に応じて手動実行でも良いかな。

```bash
#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

########################################################
# JP IP address (CIDR) file auto downloading scripts.  #
########################################################

rm -f /root/COUNTRY_CODE/JP_LIST.txt.old
mv /root/COUNTRY_CODE/JP_LIST.txt /root/COUNTRY_CODE/JP_LIST.txt.old
wget -q -O /root/COUNTRY_CODE/JP_LIST.txt https://ipv4.fetus.jp/jp.txt --user-agent='xxxxx@xxxxx.jp' --referer='Thanks from xxxxx.jp'

if [ $? -ne 0 ]; then
        echo "Couldn't download JP_list from fetus.jp" | mail -s 'JP_list downloading failed.' root
        mv /root/COUNTRY_CODE/JP_LIST.txt.old /root/COUNTRY_CODE/JP_LIST.txt
        exit
fi

if [ -s /root/COUNTRY_CODE/JP_LIST.txt ]; then
        rm -f /root/COUNTRY_CODE/JP_LIST.txt.old
else
        rm -f /root/COUNTRY_CODE/JP_LIST.txt
        mv /root/COUNTRY_CODE/JP_LIST.txt.old /root/COUNTRY_CODE/JP_LIST.txt
        exit
fi
```

　`auth-system.conf.ext`で`:set number`して、何行目を編集するのか確認する。
![cap002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248818/895a64c5-db85-1520-25f4-c3e2e614e7a3.jpeg)
　今回は19行目が編集対象の行。

　DLした一覧を元に`dovecot`の設定ファイルを直接編集。

```bash
vi dovecot_makeconf.sh
```

```bash:dovecot_makeconf.sh
#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin

###########################################################################################
# JP_LIST.txt のデータを元にdovecotのフィルタルールを作成します。
# /etc/dovecot/conf.d/auth-system.conf.extに認証を許可するIP（日本のIP）を記載します。
###########################################################################################

IP_LIST="/root/COUNTRY_CODE/JP_LIST.txt"
MYSTR=""
DOVEFILE="/etc/dovecot/conf.d/auth-system.conf.ext"

rm -f $MYSTR

echo -n "  override_fields = allow_nets=localhost,192.168.0.0/16,127.0.0.0/8" >> $MYSTR

for addr in `cat $IP_LIST | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.'`
do
    echo -n ",$addr" >> $MYSTR
done

# 確認した行番号で入力。今回は19行目が対象です。
sed -i '19d' $DOVEFILE
sed -i "19i $MYSTR" $DOVEFILE
```

　編集後は`dovecot`の再起動が必要。

```bash
systemctl restart dovecot
```

　一覧のダウンロードから再起動まですべて繋げて手動実行でもまぁ問題なさそう。

# 注意点
　これで海外からのアカウント乗っ取りアクセスが100%防げるわけではありません。実際にある手口として、日本のIPアドレスを取得（海外にそういうサービスを提供しているサイトがある）してアクセスしてくるもの、日本国内のレンタルサーバからアクセスしてくるものがあるので、一定時間内の認証回数制限（hashlimit）やリトライ回数に応じた動的ファイヤーウォール等の対策は必須です。

# 参考サイト

https://qiita.com/qiitamatumoto/items/030ba281066f2bea2829

https://doc.dovecot.org/configuration_manual/authentication/pam/#restrict-ip-addresses-allowed-to-connect-via-pam