最終更新日:2021年01月08日(金)04時05分20秒

メールサーバの不正利用対策その3

メールサーバの不正利用対策その3
(POP Before SMTPの導入−Postfix編)

前回のQmail編に引き続き,PostfixにおけるPOP Before SMTPの導入について解説する。Postfixについては,すでに前々回でSMTP Authenticationの導入方法について紹介しているが,POP Before SMTPを導入すれば,メールソフトがSMTP Authenticationに対応していないユーザーでも,メールアカウントさえ持っていれば利用できる。SMTP Authenticationと共に導入しておくとよいだろう

●PostfixでのPOP Before SMTPの導入

 PostfixでのPOP Before SMTPの導入にあたり,ここではDRAC(Dynamic Relay Authorization Control)というソフトウェアを利用した構築方法について解説する。DRACは,それ自体が認証を行うわけではなく,POPサーバへのアクセスがあったIPアドレスをデータベースとして登録し,一定の時間保持するものだ。MTA(ここではPostfix)はメール送信の依頼が来ると登録されたデータベースを参照し,登録されているIPアドレスからの接続であればメールの送信を許可し,登録されていない場合は送信を行わない(図1)。メールの送信が許可される時間はDRACで指定した時間内のみとなり,指定された時間がくるとデータベースに登録されたIPアドレスは自動的に消去され,それ以降はそのIPアドレスからのメール送信は拒否される。これにより,POPサーバへのアクセス認証で許可されたユーザー以外の,不正な第三者中継を防御することが可能になる。

図1■DRACを利用したPOP Before SMTPの導入
イメージ図
DRACはPOPサーバへのアクセスがあったIPアドレスをデータベースとして登録し,一定の時間保持する。Postfixは登録されたデータベースを参照し,登録されているIPアドレスからの接続であればメールの送信を許可し,登録されていない場合は送信を行わない

 今回はPOPサーバにQpopperを利用し,DRACを用いてPOP Before SMTPを構築する。利用したソフトウェアのバージョンはリスト1のようになっている。POP Before SMTP導入にあたり,Postfixの再コンパイルは必要ないが,QpopperはDRACを使用するために再度インストール作業を行う必要がある。

リスト1■インストールに利用した環境

RedHat Linux 7.2
Postfix-1.1.10(Official release)
DRAC version 1.11
Qpopper 4.04

●DRACのインストール

 DRACはmakeを行う前に,Linux用にMakefileを修正する必要がある。修正内容についてはDRACのWebサイトおよびソースファイル内にある「INSTALL」ファイルへ,プラットホーム別に記載されている。FreeBSDなど,Linux以外のOSにインストールする場合は,記載されている修正箇所を参照してMakefileの編集を行っておこう。  まずは,「drac」というディレクトリを作成してそこにダウンロードし,解凍する。

$ mkdir drac
$ cd drac
$ wget ftp://ftp.cc.umanitoba.ca/src/drac.tar.Z
$ gunzip drac.tar.Z
$ tar xvf drac.tar

●Makefileの修正

 引き続いて,Makefileの修正だ。

$ vi Makefile

としてMakefikeをエディタで開いたあと,下記の箇所を変更・修正し保存する。修正する箇所は,

INSTALL = install
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C
CFLAGS = $(DEFS) -g
LDLIBS = -ldb
RPCGENFLAGS = -C -I
MANADM = 8

の5か所だ(リスト2)。

リスト2■Makefileの内容

#### Makefile for drac

## Tuneables

# Paths

INSTALL = /usr/ucb/install  ←修正:INSTALL = install
EBIN = /usr/local/sbin
MAN = /usr/local/man/man

〜中略〜

# Settings for postfix and exim

# Do not set these for sendmail
# -DREQ_HASH # requires hash format
# -DCIDR_KEY # keys in CIDR format
# -DTERM_KD # keys and data nul-terminated

#DEFS = -DTI_RPC -DFCNTL_LOCK -DSYSINFO ←修正:DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C

# Compiler flags
CC = cc
RANLIB = :

#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-3.1.17/build_unix ←修正:CFLAGS = $(DEFS) -g

#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-2.4.14/Unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db.1.85/PORT/sunos.5.2/include

#LDLIBS = -L/usr/local/src/db/db-3.1.17/build_unix -lnsl -ldb ←修正:LDLIBS = -ldb

#LDLIBS = -L/usr/local/src/db/db-2.4.14/Unix -lnsl -ldb
#LDLIBS = -L/usr/local/src/db/db.1.85/PORT/sunos.5.2 -lnsl -ldb
TSTLIBS = -L. -ldrac -lnsl

#RPCGENFLAGS = ←修正:RPCGENFLAGS = -C -I

#RPCGENFLAGS = -C
# Man sections
MANLIB = 3

#MANADM = 1m ←修正:MANADM = 8

〜省略〜

○DRACのインストール

 Makefileの修正が終わったらインストール作業に移ろう。

$ make
$ su
password:
# make install
install -c -o bin -g bin -m 0755 rpc.dracd /usr/local/sbin
# cp libdrac.a /usr/local/lib/

 続けてマニュアルファイルのインストールを行うが,インストール時に下記のようなエラーが発生した場合は,ディレクトリを作成したあとに再度インストール作業を行えばよい。

# make install-man
install -c -m 0444 rpc.dracd.1m /usr/local/man/man8/rpc.dracd.8
install -c -m 0444 dracauth.3 /usr/local/man/man3/dracauth.3
install: cannot create regular file `/usr/local/man/man3/dracauth.3': そのような
ファイルやディレクトリはありません
make: *** [install-man] エラー 1
# mkdir /usr/local/man/man3/
# make install-man
install -c -m 0444 rpc.dracd.1m /usr/local/man/man8/rpc.dracd.8
install -c -m 0444 dracauth.3 /usr/local/man/man3/dracauth.3

 以上でDRACの基本的なインストールは完了する。「/usr/local/sbin/」以下に「rpc.dracd」が作成されているか確認しておこう。

$ which rpc.dracd
/usr/local/sbin/rpc.dracd

○起動スクリプトのコピー

 DRACを展開したディレクトリに起動スクリプトのサンプルファイル「dracd-setup.linux」があるので,修正する。

$ vi dracd-setup.linux

# See how we were called.
case "$1" in
start)
echo -n "Starting rpc.dracd daemon: "
daemon rpc.dracd&  ←修正:/usr/local/sbin/rpc.dracd
echo

touch /var/lock/subsys/rpc.dracd
;;
stop)
echo -n "Stopping rpc.dracd daemon: "
killproc rpc.dracd  ←修正:/usr/local/sbin/rpc.dracd
echo
rm -f /var/lock/subsys/rpc.dracd
;;
*)
echo "Usage: dracd {start|stop}"
exit 1
esac

exit 0

修正が完了したら起動スクリプトを「/etc/rc.d/init.d」へコピーする。

# cp ./dracd-setup.linux /etc/rc.d/init.d/dracd

○DRACの設定

 次に,DRACの許可するIPアドレスを「/etc/mail/」以下の「dracd.allow」というファイルへ,

255.255.255.255 メールサーバのIPアドレス(POP/IMAPサーバの稼動しているサーバのアドレス)
255.255.255.255 127.0.0.1

のように記述する必要がある。なお,DRACを展開したディレクトリに「dracd.allow-sample」というサンプルファイルがあるので,これに修正を加えて/etc/mailにコピーすればよい。基本的には上記のアドレスが記述されていればよいが,DRACとメールサーバが同じサーバ内のサービスとして稼動している場合は「255.255.255.255 127.0.0.1」のみでよいため,「255.255.255.255 192.168.16.8」をコメントアウトする。

# vi dracd.allow-sample


# dracd.allow: clients trusted by rpc.dracd
#
# The format of this file is one of more lines of
#
# netmask netaddr
# Both netmask and netaddr must be dotted quads.
#
255.255.255.255 192.168.16.8
255.255.255.255 127.0.0.1
####
# dracd.allow: clients trusted by rpc.dracd
#
# The format of this file is one of more lines of
#
# netmask netaddr
# Both netmask and netaddr must be dotted quads.
#
#255.255.255.255 192.168.16.8
255.255.255.255 127.0.0.1
####

修正を行ったら/etc/mailにコピーする。

# cp dracd.allow-sample /etc/mail/dracd.allow

○動作テスト

 DRACの動作テストは,DRACを展開したディレクトリに移動し,make時に作成された「testing」を利用して行う。DRACを起動したあとに,以下のように入力してテストを行ってみよう。

# /etc/rc.d/init.d/dracd start
# cd drac
# ./testing localhost 130.179.18.188(任意のIPアドレスでよい

 次に,上記でテストしたIPアドレスが,データベースに保存されているかを確認する。

# db_dump -p /etc/mail/dracd.db

VERSION=3
format=print
type=btree
HEADER=END
130.179.18.188 ←testingで使用したIPアドレスが記述されているかを確認
1021687559
DATA=END

 このようにテストしたIPアドレスが記述されているかを確認する。testingで使用したIPアドレスが記述されていれば正常に動作している。

 テストが完了したらデータベースからIPアドレスを消去しておこう。データベースの初期化は「-i」オプションで行う。

# rpc.dracd -i ←データベース初期化
# db_dump -p /etc/mail/dracd.db

VERSION=3
format=print
type=btree
HEADER=END
DATA=END
※IPアドレスが消去されているかを確認

(注)DRACを利用するには,portmapが起動している必要がある。事前にpsコマンドなどでportmapが起動しているか確認しておこう

◇rpc.dracd起動オプションについて

rpc.dracd [-i] [-e expire] [dbfile]

[-i] :データベースの初期化
[-e] :データベースからIPアドレスを消去する時間の指定(デフォルトでは30分)
[dbfile] :データベースファイル(/etc/mail/dracd.db)

●データーベースからIPアドレスを消去する時間を設定する

 DRACは初期設定のまま使用すると,IPアドレスは30分間保持される。この時間設定をユーザーの環境に合わせて変更しておく。さきほど/etc/rc.d/init.dへコピーした起動スクリプトを編集し,時間設定を行っておこう。たとえば5分間に設定するのであれば,「daemon /usr/local/sbin/rpc.dracd &」を「daemon /usr/local/sbin/rpc.dracd -i -e 5 &」と変更する。

$ vi /etc/rc.d/init.d/dracd


# See how we were called.
case "$1" in
start)
echo -n "Starting rpc.dracd daemon: "
daemon /usr/local/sbin/rpc.dracd & ←修正:/usr/local/sbin/rpc.dracd -i -e 5 &
echo
touch /var/lock/subsys/rpc.dracd
;;
stop)
echo -n "Stopping rpc.dracd daemon: "
killproc rpc.dracd
echo
rm -f /var/lock/subsys/rpc.dracd
;;
*)
echo "Usage: dracd {start|stop}"
exit 1
esac

exit 0

 修正したら

# /etc/rc.d/init.d/dracd stop
# /etc/rc.d/init.d/dracd start

で再起動させよう。

●POPサーバの設定

 QpopperでDRACを利用するのに特別な設定は必要なく,インストールすればPOP Before SMTPの利用ができるようになるはずだ。ただし,DRACを使用するためにはQpopperの再コンパイルが必要になる。QpopperでDRACを利用するためには,configure時のオプションで「--enable-drac」を指定しなければならないからだ(Qpopper3.1以上のバージョン)。ここでは,DRACの利用と同時に,APOP認証への移行も含めてインストールを行っておこう。

※Qpopperの現状のバージョンは4.04で,古いバージョンにはDoS攻撃などのセキュリティホールが発見されている。古いバージョンを利用している場合は必ずアップデートを行っておこう。また,現在のバージョン4.04にも「~/.qpopper-options」を利用するオプション設定を行っている場合,外部からではないものの,ローカルユーザーがバッファーオーバーフローを生じさせることができるセキュリティホールが発見されている。自宅であればローカルのユーザーは自分だけかもしれないが,「~/.qpopper-options」を利用しない(起動時に-uオプションを使用しない)ようにしておこう。

◇参考1:Qpopperのセキュリティホール関連リンク(バージョン4.0〜4.03)
Qualcomm qpopper Username Buffer Overflow Vulnerability
Qualcomm QPopper Remote Denial of Service Vulnerability

◇参考2:Qpopperのセキュリティホール関連リンク(バージョン4.03〜4.04)
Qualcomm QPopper Bulletin Name Buffer Overflow Vulnerability

○Qpopperのインストール

 はじめに,APOP認証用のアカウント「pop」の作成を行う

# groupadd pop
# useradd -g pop -d /dev/null -s /bin/false pop 

$ wget ftp://ftp.qualcomm.com/eudora/servers/unix
/popper/qpopper4.0.4.tar.gz
$ tar xzvf qpopper4.0.4.tar.gz
$ cd qpopper4.0.4
$ ./configure --enable-apop=/etc/pop.auth --with-popuid=pop --enable-drac
$ make
$ su
password:
# make install

以上で完了する。もしconfigure時に

Can't use DRAC: dracauth not found in -ldrac

というエラーが出る場合,さきほどのDRACインストール時に

# cp libdrac.a /usr/local/lib/

の作業を行っていない可能性がある。DRACの作業ディレクトリに戻り,「libdrac.a」をコピーしてから,再度インストールしよう。

○APOP認証用のパスワード設定

 次に,APOP用の認証設定もしておこう。APOPは通常のPOPアクセスと異なり,パスワードを暗号化してやりとりできる。今回のPOP before SMTPとは主題が異なるが,セキュリティ強化のためにも設定しておいたほうがよい。まず,popauthの所有権とsetuidの設定を行い,データベースファイル「/etc/pop.auth」のパーミッションを「600」に設定する。

# chown pop /usr/local/sbin/popauth
# chmod u+s /usr/local/sbin/popauth
# chmod 600 /etc/pop.auth

 続いて,データベースを初期化する。

# popauth -init
Really initialize POP authentication DB? ←「y」を入力

 初期化したら,ユーザーパスワードを設定して,データベースへユーザーを追加しよう。

# popauth -user ユーザー名
Adding only APOP password for ユーザー名.
New password: パスワードを入力
Retype new password: 再度パスワードを入力

※ユーザーが個別にパスワード設定するにはpopauthコマンドを利用する。

$ popauth
Changing only APOP password for hoge.
Old password: 古いパスワードを入力
New password: 新しいパスワードを入力
Retype new password: 再度新しいパスワードを入力

※ユーザーの削除は

# popauth -delete ユーザー名

とすれば,削除される。

○Qpopperの起動スクリプトの例

 下記のような起動スクリプトを「/etc/xinetd.d」にpopperなどの名前で作成する。

# vi /etc/xinetd.d/popper

service pop3
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/local/sbin/popper
server_args = -s
}

 作成したら,xinetdを再起動する。

# /etc/rc.d/init.d/xinetd restart

 設定が完了したら,受信に利用しているメールソフトの設定をAPOPに変更し,実際に動作,認証するかテストを行っておこう。

●Postfixの設定

 PostfixでのDRAC利用設定は,「/etc/postfix/main.cf」で行う。エディタで開き,送信時にDRACデータベースを参照するように設定を変更する(黄色の文字部分)。

# vi /etc/postfix/main.cf

(前略)
myhostname = mail.hogehoge.com
mydomain = hogehoge.com
mydestination = $myhostname, localhost.$mydomain, $mydomain, mail.$mydomain
relay_domains = $mydestination
smtpd_recipient_restrictions = permit_mynetworks, check_client_access btree:/etc/mail/dracd, check_relay_domains
(後略)

 編集できたらPostfixを再起動し,変更を反映させておく。

# postfix reload

●動作テスト

 すべての設定が完了し,再起動ができたら動作テストを行う。まず,メールソフトでPOPサーバへアクセスし,下記のようにデータベースが更新されているかを確認する。

# db_dump -p /etc/mail/dracd.db

VERSION=3
format=print
type=btree
HEADER=END
xxx.xxx.xxx.xxx ←POPアクセスを行ったクライアントのIPアドレス
1021778817
DATA=END

 次に

# rpc.dracd -i

としてデータベースを初期化して,Postfixでメールが送信できないかを確認するとともに,ふたたびPOPアクセスしたあとにはメールが送信できるかをテストする。実際のテスト時は知人などに頼んで,外部からテストしてもらうほうがよいだろう。また,IPアドレスが指定した時間で削除されているかの確認を忘れないように行っておこう。

メールソフトのPOP before SMTP設定
 POP before SMTPを利用する設定は各メールソフトによって異なるが,ここでは代表的なものとしてOutlook ExpressとBecky! Internet Mailの設定方法を解説しておこう。

・Outlook Express
写真1
写真1■メニューの「ツール」−「オプション」にある「接続」タブをクリックして「送受信が終了したら切断する」のチェックボックスを外す。このあと,メールを送信する場合は「ツール」−「送受信」−「すべて受信」を選んでから,画面の「送受信」ボタンを押そう。

・Becky! Internet Mail
写真2
写真2■POP before SMTPを利用するメールボックスを選んだら「ツール」−「メールボックスの設定」を選び,「詳細」タブにある「送信の前にPOP認証を行う」にチェックを入れておこう。


●IMAPおよびほかのPOPサーバでの設定について

 今回は解説していないが,IMAPサーバやほかのPOPサーバでDRACを利用する設定については,DRACのWebサイトにある「POP/IMAP Server Modifications」を参照してほしい。ここから各サーバのパッチ類がダウンロードができる。

 数回にわたり,SMTPサーバの不正利用対策ついて解説したが,サーバを外部に公開するのであれば,不正利用対策(メールサーバ以外にもプロキシサーバの不正利用などもある)とともに,運営しているサービスのセキュリティホール情報には常に気を配る必要がある。メールサーバやWebサーバは常に外部へ開かれているサービスであるため,重大なセキュリティホールが発見されれば,侵入や破壊などの攻撃だけでなく,踏み台として利用されて,ほかのサーバへ攻撃する手段となってしまう可能性がある。必要のないものは停止するか削除しておくことも重要だろう。