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

メールサーバの不正利用対策
(SMTP Authenticationの導入-Postfix編)


メールサーバを運営している場合には,不正中継対策が不可欠だ。そのためには,SMTPサーバに「SMTP Authentication (RFC2554)」,「POP before SMTP」などの機能を追加して利用するという方法がある。今回はPostfixでのSMTP Authenticationの導入について解説しよう

メールサーバを運営する際に気をつけなければならないもののひとつとして,メールサーバの不正中継(Third Party Mail Relay,第三者中継)が挙げられる。これは他人の運営しているメールサーバを利用し,大量のスパムなどを送信する不正行為を指すが,もし自宅のメールサーバを不正利用された場合,サーバのリソースや回線などを枯渇させるだけでなく,スパムを受信したユーザーからの苦情までも受けなければならなくなる。

 インターネット上の一部のアンダーグラウンドサイトでは,不正中継を許可しているメールサーバをリスト化して公開しているサイトもあり,もしそういったリストに自宅サーバが登録された場合には,いたるところから不正利用を試みる接続が繰り返されることになる。

 自宅サーバを外部から利用しないのであれば,ローカルエリアからの接続以外はすべて拒否するように設定を行っておけばいいが,出張先や旅先など,出先から自宅メールサーバを利用してメールを送信したい場合には,すべての接続を拒否しておくと利用できなくなってしまう。

 Linux Tipsで解説した「Postfix(メールサーバ)でスパム拒否設定がしたい」Tipsのように,特定のドメインのみで利用可能にするのも効果的だが,メールサーバの不正利用対策として,RFC2554にもあるSMTPサーバに「SMTP Authentication」(※1),「POP before SMTP」(※2)などの機能を追加して利用してみてはいかがだろう。このうち今回は,SMTP Authenticationの導入について解説していく。

※1 SMTP Authentication
SMTPへのアクセス時にユーザー認証を行い,許可されたユーザーのみメールの送信を受け付ける。

図1■SMTP Authenticationの概念図
図1
SMTPサーバでもユーザー名,パスワードにて認証を行う

※2 POP before SMTP
 SMTPサーバを利用するユーザーが,POPサーバによりユーザー認証されることで,一定の時間内のみSMTPサーバを利用した送信が許可されること。

図2■POP before SMTPの概念図
図2
POPサーバへアクセス(ユーザー認証)し,認証されたアドレスを一時的に保持して,SMTPへのアクセスを許可する

●PostfixでのSMTP Authenticationの導入

 今回は,SMTPサーバとしてPostfixを利用している場合のSMTP Auth導入について紹介する。なお本執筆ではディストリビューションはRedhat Linux7.2,Postfixのバージョンはpostfix Version 1.1.7を利用している。

・Cyrus SASLのインストール
 PostfixでのSMTP Auth導入には,SASL(Simple Authentication and Security Laye-RFC2222)として「Cyrus SASL」ライブラリを利用する。なお,Redhat Linux7.2ではすでにCyrus SASLが組み込まれている。そのため新たにソースファイルからインストールを行うと正常に動作しなくなるので注意しよう。

 まずはCyrus SASLがインストールされているかを確認する。

$ rpm -q cyrus-sasl
cyrus-sasl-1.5.24-20

このように表示されていれば,Cyrus SASLはインストール済みだ。ただ執筆時点で,RedhatのアップデートサイトにCyrus SASLのアップデータが掲載されているので,「update.redhat.com」などからダウンロードして,事前にアップデートしておこう(リスト1)。

リスト1■アップデータ一覧

cyrus-sasl-1.5.24-23.i386.rpm
cyrus-sasl-devel-1.5.24-23.i386.rpm
cyrus-sasl-gssapi-1.5.24-23.i386.rpm
cyrus-sasl-md5-1.5.24-23.i386.rpm
cyrus-sasl-plain-1.5.24-23.i386.rpm

・Cyrus SASLをソースファイルからインストールする場合
Cyrus SASLがインストールされていない場合は,ソースファイルからインストールを行う。Cyrus SASLのインストールは,下記のように行えばよい。

$ wget ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-1.5.27.tar.gz
$ tar xzvf cyrus-sasl-1.5.27.tar.gz
$ cd cyrus-sasl-1.5.27
$ ./configure --enable-login ※注釈1
$ make
$ su
password:
# make install

インストールしたら,「/etc/ld.so.conf」に,「/usr/local/lib」を追加する。

# ln -s /usr/local/lib/sasl /usr/lib/sasl
# vi /etc/ld.so.conf

/usr/X11R6/lib
/usr/lib/gconv
/usr/lib/qt/lib
/usr/i386-linuxaout/lib
/usr/lib/libc5-compat
/usr/lib/sane
/usr/local/lib ←これを追加する

追加したら,以下のコマンドを実行する。

# /sbin/ldconfig


 Outlook Expressのログイン認証を利用する場合には「--enable-login」を,SMTP認証にUNIXパスワードファイルを利用して認証を行いたい場合は「--with-pwcheck」をつける。ただし,SMTP認証にUNIXパスワードファイルを利用するのはセキュリティ上あまり好ましくないだろう。そこで,ここではSASLのパスワードファイル(sasldb)を作成し利用する認証方法を紹介する。

●Postfixの再コンパイル・インストール

 PostfixでのSMTP Auth導入にはPostfixを再コンパイルして再インストールする必要がある。Postfixの基本的なインストールについては,Linux Tips「メールサーバを動かしたい〜Postfix編〜」を参照してほしい。

$ wget ftp://ftp.ayamura.org/pub/postfix/official/postfix-1.1.7.tar.gz
$ tar xzvf postfix-1.1.7.tar.gz
$ cd postfix-1.1.7.tar.gz
($ make tidy) ←※注1
$ make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/include" AUXLIBS="-L/usr/lib -lsasl" ←※注2
$ make
$ su
password:
# make install
(以下,環境を設定)

※1 以前にインストールを行ったソースディレクトリで作業を行う場合は,make makefilesの前にmake tidyを行ってからmake makefilesを実行する

※2 上記はRedhat Linux7.2ですでにCyrus-SASLがインストールされている場合だ。Cyrus-SASLをソースファイルからインストールしたときには,make makefiles以下のパス設定を下記のように変更する。Cyrus-SASLのconfigure時に特にパスを指定していなければ/usr/local/includeと/usr/local/libとすればよい。

$ wget ftp://ftp.ayamura.org/pub/postfix/official/postfix-1.1.7.tar.gz
$ tar xzvf postfix-1.1.7.tar.gz
$ cd postfix-1.1.7.tar.gz
($ make tidy)
$ make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include" AUXLIBS="-L/usr/local/lib -lsasl"
$ make
$ su
password:
# make install

●パスワードファイルの作成

 次にSMTP AUTHで利用するパスワードを作成する。ここではログインパスワードはsasldbを参照するように設定を行っている。作成したユーザーアカウント,パスワードは,メールアカウントを持つ各ユーザー別に作成して利用する方法のほかに,いくつかのユーザーアカウント,パスワードをSMTP AUTH専用に共有して利用することもできる。

○パスワードデータベースの指定

# vi /usr/lib/sasl/smtpd.conf

pwcheck_method:sasldb ←これを記述して保存

とする。

○パスワードの作成

 パスワードの作成は以下のようにして行う。

# saslpasswd -c -u `postconf -h myhostname` ユーザー名

なお,作成したパスワードを削除するためには

# saslpasswd -d -u `postconf -h myhostname` ユーザー名

とすればよい。作成されたパスワードを確認したい場合は以下のようにする。

# sasldblistusers

user: hoge realm: zdnet.hogehoge.org mech: DIGEST-MD5
user: hoge realm: zdnet.hogehoge.org mech: PLAIN
user: hoge realm: zdnet.hogehoge.org mech: CRAM-MD5

 ちなみに,以前のバージョンからPostfixを利用している場合は「/usr/postfix/bin/」にpostconfが存在することがある。ここへパスが通っていない場合は「/usr/postfix/bin/postconf」とフルパスで記述してほしい。


・Redhat Linuxで組み込まれたCyrus SASLを利用している場合のプログラムへのパス

/usr/sbin/saslpasswd
/usr/sbin/sasldblistusers

・ソースファイルからインストールした場合(パスを指定していない場合)のプログラムへのパス


/usr/local/sbin/saslpasswd
/usr/local/sbin/sasldblistusers

○パスワードファイルの設定

 続いて,sasldbをpostfixが利用できるようグループに登録し,パーミッションを変更する。

# chgrp postfix /etc/sasldb
# chmod 640 /etc/sasldb

●Postfixの設定ファイルの編集

 Postfixの設定ファイル「main.cf」を編集する。編集は# Other configurable parametersに以下のように追加し設定する。

# vi /etc/postfix/main.cf

としたら,「/Other configurable parameters」として「Other configurable parameters」をサーチし,以下のように追加する。

# Other configurable parameters.

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_relay_domains, reject
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes


設定項目について

smtpd_sasl_auth_enable=yes

 SMTP AUTHの利用を設定


smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated, check_relay_domains, reject

 リレーを許可するものを設定する。「permit_sasl_authenticated」はSMTP認証を通過したものを許可する設定なので必ず加える。「permit_mynetworks」は「mynetworks」で設定されたネットワークからの接続を許可する。「reject」はそれ以外は拒否することを設定している。


smtpd_sasl_security_options = noanonymous,noplaintext

セキュリティオプションの設定。noanonymousは匿名での接続を拒否する。上記のようにnoplaintextと記入するとPLAINでの認証を拒否する。


broken_sasl_auth_clients = yes ----

アウトルック,Outlook Expressのログイン認証を利用するための設定

 設定が完了したらPostfixを起動する。

# /usr/sbin/postfix start
postfix-script: starting the Postfix mail system

●SMTP AUTHのテスト

 Postfixを起動したら,SMTP AUTHのテストを行う。まずtelnetでローカルホスト,ポート25番に接続し,コマンドで「EHLO localhot」と入力し,「AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5」と表示されるかを確認する(smtpd_sasl_security_optionsでPLAINでの認証をしないように設定した場合は「250-AUTH DIGEST-MD5 CRAM-MD5」と表示される)。この段階で「250-AUTH PLAIN」だけが表示されているときには,再度インストール作業を確認する必要がある。

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 zdnet.hoge.org ESMTP Postfix
EHLO localhost ←「EHLO localhost」と入力
250-zdnet.hoge.org
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 ←これを確認
250 8BITMIME
QUIT

 なお,Outlook Expressで使用する設定を行っている場合には「AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5」の下に「250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5」も表示される。

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 zdnet.hoge.org ESMTP Postfix
EHLO localhost ←「EHLO localhost」と入力
250-zdnet.hoge.org
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 ←ログイン機能を利用する場合は表示される
250 8BITMIME
QUIT

確認ができたら一端「QUIT」で終了し,saslpasswdで設定したパスワードをエンコードし,正しく認証が行われるかをチェックしよう。

# printf 'ユーザー名\0ユーザー名\0パスワード' | mmencode

もしくは

# perl -MMIME::Base64 -e \
'print encode_base64("ユーザー名\0ユーザー名\0パスワード");'

 たとえば,テスト用に「ユーザー名:hoge」,「パスワード:hoge」でパスワードを作成してからテストする場合は,先ほど解説したように

# saslpasswd -c -u `postconf -h myhostname` hoge

とし,パスワードを作成する。そしてユーザー名とパスワードが生成されていることを確認しよう。

# sasldblistusers
user: hoge realm: zdnet.hoge.org mech: DIGEST-MD5
user: hoge realm: zdnet.hoge.org mech: PLAIN
user: hoge realm: zdnet.hoge.org mech: CRAM-MD5

 そのあとユーザー名パスワードをエンコードする

# printf 'hoge\0hoge\0hoge' | mmencode
aG9nZQBob2dlAGhvZ2U=

 Telnetでlocalhostのポート25番に接続し,EHLOのあとに「AUTH PLAIN エンコードしたユーザー名パスワード」を入力する。正しくないパスワードでのエンコードも行って正常に認証されるかテストする。

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 zdnet.hoge.org ESMTP Postfix
EHLO localhost ←「EHLO localhost」と入力
250-zdnet.homelinux.org
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
AUTH PLAIN aG9nZQBob2dlAGhvZ2U= ←エンコードしたパスワードを入力
235 Authentication successful ←認証が成功している
QUIT
221 Bye

○間違ったパスワードでテスト

 念のため,間違ったパスワードを入力してテストしてみよう。

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 zdnet.hoge.org ESMTP Postfix
EHLO localhost
250-zdnet.homelinux.org
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
AUTH PLAIN aG9nZQBob2dlAHRlc3Q= ←間違ったパスワードを入力
535 Error: authentication failed ←認証が失敗している
QUIT
221 Bye

テストが完了したらテスト用のアカウントを削除しておこう。

# saslpasswd -d -u `postconf -h myhostname` hoge