メールサーバの不正利用対策その1
メールサーバの不正利用対策メールサーバを運営する際に気をつけなければならないもののひとつとして,メールサーバの不正中継(Third Party Mail Relay,第三者中継)が挙げられる。これは他人の運営しているメールサーバを利用し,大量のスパムなどを送信する不正行為を指すが,もし自宅のメールサーバを不正利用された場合,サーバのリソースや回線などを枯渇させるだけでなく,スパムを受信したユーザーからの苦情までも受けなければならなくなる。
インターネット上の一部のアンダーグラウンドサイトでは,不正中継を許可しているメールサーバをリスト化して公開しているサイトもあり,もしそういったリストに自宅サーバが登録された場合には,いたるところから不正利用を試みる接続が繰り返されることになる。
自宅サーバを外部から利用しないのであれば,ローカルエリアからの接続以外はすべて拒否するように設定を行っておけばいいが,出張先や旅先など,出先から自宅メールサーバを利用してメールを送信したい場合には,すべての接続を拒否しておくと利用できなくなってしまう。
Linux Tipsで解説した「Postfix(メールサーバ)でスパム拒否設定がしたい」Tipsのように,特定のドメインのみで利用可能にするのも効果的だが,メールサーバの不正利用対策として,RFC2554にもあるSMTPサーバに「SMTP Authentication」(※1),「POP before SMTP」(※2)などの機能を追加して利用してみてはいかがだろう。このうち今回は,SMTP Authenticationの導入について解説していく。
|
図1■SMTP Authenticationの概念図![]() SMTPサーバでもユーザー名,パスワードにて認証を行う |
|
図2■POP before SMTPの概念図![]() 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をソースファイルからインストールする場合
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 |
|
●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 (以下,環境を設定) |
|
●パスワードファイルの作成 |
次に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」とフルパスで記述してほしい。
|
○パスワードファイルの設定
続いて,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 |
|
設定が完了したら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 |