SMTP AUTHで何処ででも安全にメール送信
いろいろなところで SMTP サーバーが必要になってきました。しかし、sendmail を不正使用されないような設定や SPAM 対策が必要となります。そこで、sendmail に認証のメカニズムを組み込み、認証が正常に行なわれたら SMTP サーバーとして利用できるようにします。それを実現する機能として、SMTP AUTH を利用します。しかし、OutLook Express, Netscape Messanger といったメジャーな MUA はセキュリティーレベルの低い認証方式を利用しているので SMTP over SSLを設定して暗号化しておく必要があります(ここでは SSL の設定は省略しています)。
認証の機構には、SASL(Simple Authentication and Security Layer)を利用します。SASLは、認証方式(メカニズム)と照合方法が数多くサポートされています。
【認証方式】
PLAIN | 「認可識別子<NULL>認証識別子<NULL>パスワード」形式の平文によるユーザー認証方式です。BASE64でエンコードする場合もあります。 |
LOGIN | LOGINも PLAIN同様、平文を用いた認証形式です。標準仕様が存在していないので、各社製品間の互換性もあまり考慮されていません。 |
CRAM-MD5 | クライアントは、接続先のMTAからあらかじめ示された任意の文字列(Challenge)にパスワードを含め MD5アルゴリズムで「メッセージダイジェスト」作成して MTAへ送信します。MTA側でも同様の方法で「メッセージダイジェスト」作成し、クライアントから送られてきたメッセージダイジェストと比較します。それで等しければログインを許可します。この方法では、パスワード自身がネットワークに流れることがないので PLAINや LOGIN より安全性が高くなります。(CRAM:Challenge-Response Authentication Mechanism) |
DIGEST-MD5 | CRAM-MD5の欠点である辞書攻撃や総当たり攻撃に対する対処、Realm(ドメイン名)やURLの指定、および HMAC(keyed-Hashing for Message Authentication Code)による暗号化をサポートしています。 |
その他 | Kerberos、GSSAPI、S/Key |
【照合方法】
これは、SASLの pwcheck_method オプションを変更することで実現できます。
passwd | 通常の UNIX の /etc/passwd を参照します。(getpwnam() が参照するファイル) |
shadow | /etc/shadow を参照します。(getspnam() が参照するファイル)SASL を組み込んだサーバーは、/etc/shadow ファイルを読むため root の権限が必要です。 |
sia | Security Integration Architecture は、 Digital Unix上でユーザを認証する方法です。 |
kerberos_v4 | プレーンテキストパスワードをチェックするために Kerberos を利用します。KERBEROS_V4 認証機構 ではない。 |
pam | the pluggable authentication module は、 Solaris や Linux ではデフォルトのユーザ認証方法です。Raduis、NIS、LADP、/etc/passwd を利用してパスワードをチェックできます。 |
sasldb | SASLのシークレットデータベース(/etc/sasldb)を参照します。 |
pwcheck | 個々に動作するヘルパーデーモンを使用してパスワードをチェックします。具体例がないのでどのように利用するのかわかりません。 |
自分で書く | 柔軟な認証メソッドが必要なら自分で作るのも良い。 |
必要モジュールの入手
MTAとして sendmail を利用し、認証には Cyrus SASL API を利用します。OS(Redhat Linux を例に説明します) や機能によって必要なモジュールが異なります。必要なモジュールをダウンロードしてください。最低でも、上の二つのモジュールをダウンロード/コンパイルする必要があります。Berkeley DB の利用を推奨するが、Linux には既にストールされているのでここではあえてインストールしません。(Kerberos 4/5 共にインストールしないので上記の二つのみを利用した説明になります)
sendmail 8.11.6 | http://www.sendmail.org/8.11.html |
cyrus-sasl | ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-1.5.24.tar.gz |
Kerberos | http://www.pdc.kth.se/kth-krb/ |
GSSAPI | http://www.pdc.kth.se/heimdal/ |
Berkeley DB | http://www.sleepycat.com/ |
コンパイル
SMTP-AUTH を実現するには、SASLパッケージをインストールし、それを利用するように sendmail をコンパイルします。
SASL パッケージをインストールする場合、必要な認証方式を選択する必要があります。デフォルトで、ほとんどの MUA が利用できるアルゴリズムは組み込まれます。しかし、OutLook Express ではデフォルトで組み込まれない LOGIN を利用するので configure 時に有効にします(使いたくないが仕方ない...)。また、ここの説明では KERBEROS_V4, GSSAPI のパッケージをインストールしていないので、configure 時に無効になります。
MUA |
認証方式 |
デフォルト |
Netscape Messanger | PLAIN | YES |
OutLook Express | LOGIN | NO |
Eudora Pro | CRAM-MD5, PLAIN, LOGIN | YES |
# gzip -dc cyrus-sasl-1.5.24.tar.gz | tar xvf - # gzip -dc sendmail.8.11.6.tar.gz | tar xvf - # cd cyrus-sasl-1.5.24 # ./configure --enable-login # make # make install ... * WARNING: * Plugins are being installed into /usr/local/lib/sasl, * but the library will look for them in /usr/lib/sasl. ... # ln -s /usr/local/lib/sasl /usr/lib/sasl # chmod 755 /usr/local/lib/sasl
sendmail をコンパイルするときに、SASL を組み込むように設定します。
# cd ../sendmail-8.11.6/devtools/Site # edit site.config.m4 APPENDDEF(`confENVDEF', `-DSASL') APPENDDEF(`conf_sendmail_LIBS', `-lsasl') APPENDDEF(`confINCDIRS', `-I/usr/local/include') APPENDDEF(`confLIBDIRS', `-L/usr/local/lib') # cd ../.. # ./Build # ./Build install 今まで、sendmail を使っていた場合、いきなりインストールせずに プロセスを終了させ必要なファイルをバックアップしてください。
sendmail は、メールの受信・転送を行う MTA とメールの送信を行う MSP としての機能があるが、sendmail 8.12 からはこの二つの機能が明確に分離されました。そして、MSP として動作する際は root の権限が必要ないので smmsp というグループ権限で実行されるようになりました。そこで、sendmail 8.12 をインストールする場合、smmsp というユーザーとグループをあらかじめ作成しておく必要があります。
sendmail.cf の設定とテスト
今まで使用していた sendmail.cf (すでに sendmail を導入していた場合)では、SMTP AUTH の定義がないので作り直します。cf を作成するもととなる m4 マクロファイルに以下の内容を追加します。このとき、利用したい認証のアルゴリズムを指定してください。これは、利用する MUA がサポートしているアルゴリズムを調べておく必要があります。
define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl define(`confDEF_AUTH_INFO', `/etc/mail/default-auth-info')dnl
利用可能な認証方式を confAUTH_MECHANISMS で指定し、中継を許可するメカニズムを TRUST_AUTH_MECH で指定します。confDEF_AUTH_INFO は、sendmail がクライアントとして機能するときに必要な認証情報を記述したファイルを指定します(これは必要がなければ指定しなくてよい)。ここで指定したファイルは、root または信頼のおけるユーザー以外はアクセスできないようにしておく。例: 認可識別子(ログインするための識別子)、認証識別子(そのパスワードが用いられるであろう識別子)、パスワード、realm(ドメイン名)を記述します。
/etc/mail/default-auth-info admin admin SecretPassword foobar.co.jp
sendmail は、MTA用として 25/TCPを MSA用として 587/TCPを 利用しているが、多くの メーラー(MUA) は 25/TCP をバインドして しまい 587/TCP を利用しません。しかし、587/TCP に対しても認証を必要とする設定が可能なので例を記述しておきます。
FEATURE(`no_default_msa')dnl DAEMON_OPTIONS(`Port=smtp,NAME=MTA')dnl DAEMON_OPTIONS(`Port=587,NAME=MSA,M=Ea')dnl define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
cf の作成は、sendmail のソースパッケージに含まれるテンプレートを利用して作成します。上記で説明した SMTP AUTH
の設定とそれぞれ必要な設定(SMTPサーバーとして動作させるための情報の追加やスパム対策など)を行います。access_db に関しては、sendmail
8.12 の場合 FEATURE(access_db,`hash -T<TMPF> -o /etc/mail/access')dnl
とすることで警告を回避できます。
# cd cf/cf # edit config.mc divert(-1)
# Smaple sample sample .....
divert(0)dnl
VERSIONID(`$Id: linux.mc, Rev. 1.0 2001/08/24 14:38:11 $')
OSTYPE(linux)dnl
DOMAIN(generic)dnl FEATURE(`always_add_domain')dnl MASQUERADE_AS(`foobar.co.jp')dnl MASQUERADE_DOMAIN(`foobar.co.jp')dnl FEATURE(`masquerade_entire_domain')dnl FEATURE(`masquerade_envelope')dnl FEATURE(`access_db',`hash -o /etc/mail/access')dnl FEATURE(`blacklist_recipients')dnl FEATURE(`nouucp',`reject')dnl undefine(`UUCP_RELAY')dnl undefine(`BITNET_RELAY')dnl
define(`confPRIVACY_FLAGS', `goaway')dnl
define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
MAILER(local)dnl
MAILER(smtp)dnl # ./Build config.cf # /usr/sbin/sendmail -C./config.cf -d0.1 -bv root Version 8.11.6 Compiled with: LOG MATCHGECOS MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETUNIX NEWDB QUEUE SASL SCANF SMTP USERDB XDEBUG ============ SYSTEM IDENTITY (after readcf) ============ (short domain name) $w = mail (canonical domain name) $j = mail.foobar.co.jp (subdomain name) $m = foobar.co.jp (node name) $k = mail.foobar.co.jp ======================================================== # cp config.cf /etc/mail/sendmail.cf
access_db を設定して、メールの中継やスパムに関するデーターベースを作成します。詳しい記述方法は cf/README ファイルを参照してください。
# edit /etc/mail/access spammer@aol.com REJECT spammer.com ERROR:"550 We don't accept mail from spammers" 192.168.200 DISCARD spam@ REJECT cyberspammer.com REJECT good.cyberspammer.com OK mydomain.co.jp RELAY # makemap hash /etc/mail/access < /etc/mail/access
sendmail.cf を作成した際に、DOMAIN の指定で generic.m4 ファイルを利用したので /etc/mail/local-host-names に FQDN 形式で利用するローカルドメインを記述しておく。
# edit /etc/mail/local-host-names foobar.co.jp
それぞれの設定が完了したら、sendmail を起動します。(通常は、システムの設定ファイルで起動される)telnet コマンドで sendmail にコネクトすると有効となる認証方式が確認できます。
# /usr/sbin/sendmail -bd -q30m # telnet localhost smtp Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.foobar.co.jp ESMTP Sendmail 8.11.6/8.11.6; Thu, 4 Oct 2001 00:06:12 - 0700 ehlo localhost 250-mail.foobar.co.jp Hello IDENT:root@localhost [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-SIZE 250-DSN 250-ONEX 250-ETRN 250-XUSR 250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5 250 HELP quit 221 2.0.0 mail.foobar.co.jp closing connection Connection closed by foreign host. #
sendmail 8.12 の場合、MSP のキューを処理するデーモンの起動も必要になります。(/usr/sbin/sendmail -Ac -q30m)
SASLの設定
照合方法は幾つかありますが、ここでは SASL のパスワードデータベース(/etc/sasldb)を利用する方法を記述します。設定ファイル /usr/lib/sasl/Sendmail.conf を以下のように編集(追加)します。
pwcheck_method: sasldb
SASL のパスワードデータベースの作成やパスワードの設定は、 saslpasswd コマンドを利用します。例えばあるユーザーのパスワードを設定するときは、必ずスーパーユーザーで
saslpasswd -u <ドメイン名> <ユーザ名>
として登録します。-u オプションを使用することで、ドメインをうまく利用した登録が行えます。セキュリティー上、作成された /etc/sasldb は root のみアクセスできるモード(chmod 600 /etc/sasldb)に変更しておく必要があります。
# /usr/local/sbin/saslpasswd -u baz.co.jp shin passwd:(パスワード)
Agein (for verification):(パスワード)
登録したアカウントは、sasldblistusers コマンドで確認することができます。
# /usr/local/sbin/sasldblistusers user: shin realm: baz.co.jp mech: PLAIN user: shin realm: baz.co.jp mech: CRAM-MD5 user: shin realm: baz.co.jp mech: DIGEST-MD5
saslpasswd コマンドは、スーパーユーザーでないと使えないので一般のユーザー向けになんらかのコマンドを用意した方が良い。もっとも、SASL データベースを利用せずに /etc/passwd を利用するように設定しても良い。(安全性を考慮するなら SMTP over SSL は必須)。
MUA側の設定
MUA側の設定は以下のようになります。これまでの設定から、SMTP サーバが mail.foobar.co.jp
で SASL 認証用のアカウントが shin@baz.co.jp
として MUA の設定をします。
【OutLook Express の場合】
OutLook Express の「ツール」メニューから「アカウント」を選択し、「メール」でサーバを選択してからプロパティーを開くと以下のようなウィンドウが表示されます。
ここで、「送信メール(SMTP)」に SMTP サーバーである mail.foobar.co.jp
を指定します。「送信メール サーバー」の「このサーバーは認証が必要」をチェックして「設定...」ボタンを押します。
ここで、「次のアカウントとパスワードでログオンする」を選び、SASL 認証用のアカウント shin@baz.co.jp
と saslpasswd コマンドで入力したパスワードを入力します。
これらの設定が終了したら、後は通常通りメールの送信が行えます。
【Netscape Messenger の場合】
Netscape Communicator の Preferences(設定)を開きメールサーバーを選択します。
ここで、Outgoing mail server(SMTPサーバー)に SMTP サーバーである mail.foobar.co.jp
を指定し、Outgoing mail server user name(SMTP サーバーのアカウント)に SASL 認証用のアカウント shin@baz.co.jp
を指定します。
これらの設定が終了したら、後は通常通りメールの送信が行えます。Netscape を起動して一番はじめのメールの送信時に以下のようなウィンドウが表示されます。
ここで、saslpasswd コマンドで入力したパスワードを入力します。2回目以降はパスワードを入力する必要はありません。
【Becky! の場合】
Becky! の「ツール」メニューから「メールボックスの設定」を選択し、表示されたウィンドウの「詳細」タブを選択します。「SMTP認証」の欄を以下のように設定して「OK」ボタンを押して設定が完了です。「SMTP認証」欄には、認証方式(ここでは、選択できる認証でもっとも安全な CRAM-MD5 を選択します)とSASL 認証用のアカウント shin@baz.co.jp
と saslpasswd コマンドで入力したパスワードを入力します。
これらの設定が終了したら、後は通常通りメールの送信が行えます。