3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-05-15

不正アクセス大杉

 2022年5月に入ったあたりから、メールアカウント乗っ取りチャレンジ(DDoSかも?)が増えてきたので対策した。
不正アクセス001.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
 記載後Dovecotを再起動して設定反映。

systemctl restart dovecot

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

systemctl status dovecot

記載を自動化する

 重い腰を上げてようやく自動化。

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

#!/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
 今回は19行目が編集対象の行。

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

vi dovecot_makeconf.sh
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の再起動が必要。

systemctl restart dovecot

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

注意点

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

参考サイト

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?