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

メールサーバの不正利用対策その2
(POP Before SMTPの導入-Qmail編)

SMTPサーバの不正利用対策として,今回はQmailでのPOP Before SMTP導入について解説しよう。POP Before SMTPではSMTP Authenticationのように,メールクライアント側での特別な設定を必要としないため,メールアカウントを持つユーザーに,メールを送信する前にPOPサーバへアクセスしてもらうようにするだけで済むという利点がある

 POP Before SMTPは,前回のようにSMTPに認証機能を持たせる「SMTP Authentication」とは違い,POPサーバへアクセスのあったユーザーのIPアドレスを一定時間保持し,そのIPアドレスからのSMTPサーバ利用を許可するというものだ。これにより,サーバにメールアカウントを持つユーザーは,外部からもSMTPサーバの利用することができるようになり,また,メールアカウントを持たないユーザーからの不正利用を制限することが可能になる。

 POP Before SMTPではSMTP Authenticationのように,メールクライアント側での特別な設定を必要としないため,メールアカウントを持つユーザーに,メールを送信する前にPOPサーバへアクセスしてもらうようにするだけで済むという利点がある。しかし,SMTP Authenticationとは違い,一定時間保持されたIPアドレスさえ一致すれば,認証なしで送信できてしまうということも覚えておきたい。

●QmailでのPOP Before SMTPの導入

 QmailでPOP Before SMTPを実現するために利用できるソフトウェアはいくつかあるが,今回は「relay-ctrl」というソフトウェアを利用した,POP Before SMTPについて解説する。また,IMAPを併用している場合には,IMAP Before SMTPの設定も行っておくとよいだろう。なお,relay-ctrlを動作させるためには「daemontools」も必要になるため,あわせてインストールする。原稿執筆時のバージョンはそれぞれ,「relay-ctrl-3.1.1」,「daemontools-0.76」だ。

●daemontoolsのインストール

 daemontoolsをインストールするには,

$ wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
$ tar xzvf daemontools-0.76.tar.gz
$ cd admin/daemontools-0.76
$ su
password:
# package/install

とすればよい。以上でインストールが完了する。

●relay-ctrlのインストール

 次に,relay-ctrlのインストールを行う。relay-ctrlをダウンロードして展開したあと,作成されたディレクトリに移動して,confファイルでインストール先の編集を行う。relay-ctrlの初期設定では「/usr/local/bin」にインストールされるが,「/var/qmail」以下などにインストールしたい場合は,confファイルを編集しよう。ここでは,インストール時に「/usr/local/man」が存在しないというエラーが出るため,conf-manのみ編集し,ほかは初期の設定のままインストールを行っている。

$ wget http://untroubled.org/relay-ctrl/relay-ctrl-3.1.1.tar.gz
$ tar xvzf relay-ctrl-3.1.1.tar.gz
$ cd relay-ctrl-3.1.1
$ vi conf-man
/usr/local/man ←/var/local/share/manに変更
Man pages will be installed in subdirectories of this directory. An
unformatted man page foo.1 will go into .../man1/foo.1.

$ make
$ su
password:
# ./installer

インストールが完了したら,relay-ctrl用のスプールディレクトリと設定ファイル用のディレクトリを作成し,パーミッションの変更を行う。

# mkdir /var/spool/relay-ctrl
# mkdir /var/spool/relay-ctrl/allow
# mkdir /etc/relay-ctrl
# chmod 700 /var/spool/relay-ctrl
# chmod 777 /var/spool/relay-ctrl/allow

 次に,設定ファイル用のディレクトリ「/etc/relay-ctrl」に「RELAY_CTRL_DIR」というファイルを作成する。そののち作成したスプールディレクトリを記述し,relay-ctrl-allowをsetuidプログラムして動作させるために,パーミッションの変更を行う。

# echo "/var/spool/relay-ctrl/allow" > /etc/relay-ctrl/RELAY_CTRL_DIR
# chmod u+s /usr/local/bin/relay-ctrl-allow

●relay-ctrlの設定

 relay-ctrlは,現在のバージョンではPOPサーバへアクセスのあったIPアドレスファイル(「/var/spool/relay-ctrl/allow」以下に作成される)を自動的に削除しないため,cronを利用して自動的に消去するように設定する。

# vi /etc/cron.d/relay-ctrl

* * * * * root /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age

以上を記述して保存する。

 アクセスしてきたIPアドレスのデータを保持する時間(送信を許可する時間)は,設定ファイルのディレクトリ「/etc/relay-ctrl」に「RELAY_CTRL_EXPIRY」というファイルを作成し,指定することができる。たとえば10分に指定する場合は,

# echo "600" > /etc/relay-ctrl/RELAY_CTRL_EXPIRY

のように,ファイルに秒数を指定しておけばよい。

 また,事前にPOPサーバもしくはIMAPサーバへのアクセスを行わなくても送信を許可するIPアドレスは,同様に「/etc/relay-ctrl」以下に「RELAY_CTRL_RELAYCLIENT」というファイルを作成し,以下のように記述して設定する。

:allow,RELAYCLIENT='IPアドレス'

●起動スクリプトの編集

 最後に,QmailとCourier-IMAPの起動スクリプトにrelay-ctrlを利用する記述を行う。

○qmail-smtpd

/usr/local/bin/envdir /etc/relay-ctrl \ ←追加
 /usr/local/bin/relay-ctrl-chdir \ ←追加
 tcpserver -v -u 778 -g 777 \
 0 smtp /usr/local/bin/relay-ctrl-check
/usr/local/bin/relay-ctrl-check ←追加
/var/qmail/bin/qmail-smtpd
(…以下省略)

qmail-smtpdが記述されている前にrelay-ctrl-checkを挿入する。

○qmail-pop3d

/usr/local/bin/envdir /etc/relay-ctrl \ ←追加
  /usr/local/bin/relay-ctrl-chdir \ ←追加
  tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup zdnet.hoge.org /bin/
selectcheckpw \
  /usr/local/bin/relay-ctrl-allow \ ←追加
  /var/qmail/bin/qmail-pop3d Maildir
(…以下省略)

qmail-pop3dが記述されている前にrelay-ctrl-allowを挿入する。

○Counrier-IMAP

 Counrier-IMAPを利用している場合は,IMAP before SMTPの設定も行っておけば,どちらのアクセスでもSMTPサーバの利用が可能になる。

・「/usr/lib/courier-imap/libexec/authlib」に「/usr/local/bin/relay-ctrl-allow」のシンボリックリンクを張る。

# ln -s /usr/local/bin/relay-ctrl-allow /usr/lib/courier-imap/libexec/authlib

・「/usr/lib/courier-imap/etc/imapd」を編集する。「AUTHMODULES」にrelay-ctrl-allowを追加して保存する。

# vi /usr/lib/courier-imap/etc/imapd

viが起動したら,「/AUTHMODULES」などとして該当箇所をサーチし,AUTHMODULESに「"relay-ctrl-allow"」を追加して保存する。

#
#  authdaemon
#
# The default is set during the initial configuration.
#

AUTHMODULES="authdaemon" ←ここを編集
     ↓
AUTHMODULES="authdaemon relay-ctrl-allow"

最後にimapの起動スクリプトを編集する。

# vi /usr/lib/courier-imap/libexec/imapd.rc

「/usr/lib/courier-imap/libexec/couriertcpd -address=$ADDRESS \」の前に「/usr/local/bin/envdir /etc/relay-ctrl relay-ctrl-chdir \」を追加して保存する。

(…上記省略)
sed 's/=.*//;s/^/export /;s/$/;/'`
/usr/local/bin/envdir /etc/relay-ctrl \ ←追加
  /usr/local/bin/relay-ctrl-chdir \ ←追加
    /usr/lib/courier-imap/libexec/couriertcpd -address=$ADDRESS \
    -stderrlogger=/usr/lib/courier-imap/libexec/logger \
    -stderrloggername=imapd \
    -maxprocs=$MAXDAEMONS -maxperip=$MAXPERIP \
    -pid=$PIDFILE $TCPDOPTS \
    $PORT ${exec_prefix}/sbin/imaplogin $LIBAUTHMODULES \
      ${exec_prefix}/bin/imapd Maildir"
(…以下省略)

起動スクリプトが編集できたら再起動を行おう。以上で設定は完了だ。早速動作をチェックしてみよう。

●POP Before SMTPのテスト

 メールクライアントを起動し,POPもしくはIMAPで受信を行う。まずスプールディレクトリにIPアドレスファイルができているかを確認する。次に,スプールディレクトリにIPアドレスファイルがない場合には送信が拒否され,IPアドレスファイルがある場合には,記録されているIPアドレスから送信できるかをテストする。ローカル環境でテストを行ったあとは,ほかのメールサーバのアカウントを利用して,外部からの送信テストを行っておこう。

●POP Before SMTPとSMTP Authenticationの違い

 冒頭でも触れたが,POP Before SMTPにはSMTP Authenticationのような認証はなく,IPアドレスさえ一致すれば,同一IPアドレスからのリレーを許可してしまう。

 非常にまれな例をあげるならば,ダイヤルアップ接続時にプロバイダから割り振られたIPアドレスで接続し,切断後に同じプロバイダの他ユーザーが同一のIPアドレスを持った場合は送信可能だ。そのほかにも,NATを利用して1つのグローバルIPアドレスを複数のユーザー,たとえばA,B,Cのユーザーで利用している場合には,サーバにアカウントを持つAというユーザーがPOPサーバで受信を行えば,そのサーバにアカウントを持たないユーザーBやユーザーCは,SMTPサーバを認証なしで利用できてしまうことになる。SMTP Authenticationによる認証とは異なるということは覚えておいたほうがよいだろう。また,サーバを外部に公開するのであれば,これに加えて「Eメールの不正中継がされていないかチェックしたい」Tipsなどを参考にして,メールサーバの不正利用を事前に防ぐように対策を行っておこう。