わざわざ Postfix をインストールする人たちは、Postfix が他のメーラよりもセキュアであると思っていることでしょう。Cyrus SASL ライブラリは大量のコードで成り立っています。Postfix SMTP クライアントや SMTP サーバで SASL 認証を有効にしても、 Postfix は Cyrus SASL ライブラリを使う他のメールシステムと同程度にしかセキュアになりません。Dovecotは検討に値するかもしれない代替策を提供しています。
Postfix SASL サポート (RFC 2554) は Postfix SMTP サーバに対してリモートの SMTP クライアントを認証するためや、リモートの SMTP サーバに対して Postfix SMTP クライアントを認証するために使われます。
メールを受信する際、Postfix はクライアントが提供したユーザ名、認証方法、送信者アドレスをメールログファイルに記録し、オプションで permit_sasl_authenticated UCE 制限を使ってメールアクセスを許可します。
メール送信時、Postfixはサーバホスト名や配送先ドメイン (アドレスの右側部分) をPostfix SASLパスワードテーブルで検索することができ、ユーザ名/パスワードが見つかるとサーバへの認証にそのユーザ名とパスワードを使います。Postfix 2.3では、 Postfixは送信者eメールアドレスによって異なるSASLパスワードテーブルを検索するように設定することができます。
このドキュメントは以下の話題をカバーしています:
このドキュメントは以下のSASL実装付きのPostfixについて記述しています:
Cyrus SASLバージョン1 (クライアントおよびサーバ)。
Cyrus SASLバージョン2 (クライアントおよびサーバ)。
Dovecotプロトコルバージョン1 (サーバのみ、Postfixバージョン2.3以降)
Postfixバージョン2.3は複数のSASL実装のサポートを提供するプラグインメカニズムを導入しています。Postfixに組み込まれた実装を知るには、以下のコマンドを使います:
% postconf -a (SMTPサーバでのSASLサポート) % postconf -A (SMTP+LMTPクライアントでのSASLサポート)
言うまでもなく、これらのコマンドは以前のバージョンのPostfixでは使えません。
Dovecotバージョン1SASLプロトコルのサポートはPostfix 2.3以降で使えます。これを書いている時点ではサーバサイドのSASLサポートしか使えないので、ネットワークプロバイダのサーバを認証するのに使うことはできません。Dovecotは認証に専用のデーモンプロセスを使います。これはPostfixに外部ライブラリをリンクする必要がないため、Postfixの構築プロセスがシンプルになります。
必要な Makefile 群を生成するには、Postfixトップレベルディレクトリで次のコマンドを実行します:
% make makefiles CCARGS='-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\"'
この後、INSTALL ドキュメントに書かれているように "make" で処理します。
注意:
"-DDEF_SERVER_SASL_TYPE" の部分は必要なものではありません; これは単に、Postfix main.cf ファイルでSASLプラグインタイプを 指定する必要がなくなり、Postfixの設定を若干便利にするだけです。
LDAPやTLSのサポートもいるのであれば、上のコマンドラインでそれらの CCARGS や AUXLIBS をマージする必要があります。
Postfix は以下の場所から取得できる cyrus-sasl-1.5.5 または cyrus-sasl-2.1.1 とともに動くようです:
ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
重要: デフォルトのように Cyrus SASL ライブラリをインストールするのであれば、バージョン 1.5.5 に対しては /usr/lib/sasl-> /usr/local/lib/sasl、バージョン 2.1.1 に対しては /usr/lib/sasl2 -> /usr/local/lib/sasl2 のように symlink を張る必要があるでしょう。
報告によると、Microsoft Internet Explorer バージョン 5 は非標準の SASL LOGIN 認証方法を必要とします。この認証方法を有効にするには、 ``./configure --enable-login'' を指定します。
以下はCyrus SASLインクルードファイルが /usr/local/include に、Cyrus SASLライブラリが /usr/local/lib にあると想定しています。
あるシステムでは、こうすることで必要な Makefile 定義が生成されます:
% make tidy # if you have left-over files from a previous build % make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \ -I/usr/local/include" AUXLIBS="-L/usr/local/lib -lsasl"
% make tidy # if you have left-over files from a previous build % make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \ -I/usr/local/include/sasl" AUXLIBS="-L/usr/local/lib -lsasl2"
Solaris 2.x ではランタイムリンク情報を指定する必要があります。そうしないと、ld.so が SASL シェアードライブラリを見つけません:
% make tidy # if you have left-over files from a previous build % make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \ -I/usr/local/include" AUXLIBS="-L/usr/local/lib \ -R/usr/local/lib -lsasl"
% make tidy # if you have left-over files from a previous build % make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \ -I/usr/local/include/sasl" AUXLIBS="-L/usr/local/lib \ -R/usr/local/lib -lsasl2"
SMTP サーバで SASL サポートを有効にするには:
/etc/postfix/main.cf: smtpd_sasl_auth_enable = yes
認証されたクライアントによるメールのリレーを許可するには:
/etc/postfix/main.cf: smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated ...
Received: メッセージヘッダでSASLログイン名を報告するには (Postfixバージョン2.3以降):
/etc/postfix/main.cf: smtpd_sasl_authenticated_header = yes
注意: SASLログイン名は世界中で共有されます。
古い Microsoft SMTP クライアントソフトウェアは非標準的なバージョンの AUTH プロトコルの文法を実装しており、EHLO に対するSMTP サーバの応答が "250 AUTH stuff" ではなく "250 AUTH=stuff" であることを期待します。(規格に適合するクライアントに加えて) このようなクライアントに対応するには、以下のものを使います:
/etc/postfix/main.cf: broken_sasl_auth_clients = yes
Dovecot SASLサポートはPostfix 2.3以降で使えます。Postfix側では、Dovecot認証デーモンソケットの場所を指定する必要があります。Postfixがchrootされているかいないかによらず動くようにするため、Postfixキューディレクトリからの相対パス名を使います:
/etc/postfix/main.cf: smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth
Dovecot側でもDovecot認証デーモンソケットを指定する必要があります。この場合は絶対パス名を指定します。この例ではPostfixキューが /var/spool/postfix/ 以下にあることを想定しています。
/some/where/dovecot.conf: auth default { mechanisms = plain login passdb pam { } userdb passwd { } socket listen { $client path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } }
Dovecot認証サーバの設定や操作方法はDovecotのドキュメントを参照してください。
/usr/local/lib/sasl/smtpd.conf (Cyrus SASL バージョン 1.5.5) または /usr/local/lib/sasl2/smtpd.conf (Cyrus SASL バージョン 2.1.1) で、クライアントのパスワードをサーバが有効にする方法を指定する必要があります。
注意: Postfix配布物の中には、/etc/postfix にある smtpd.conf を探すように改変されたものもあります。
注意: Cyrus SASL配布物の中には /etc/sasl2 にある smtpd.conf を探すものもあります。
UNIXパスワードデータベースに対して認証するには、次を試してください:
/usr/local/lib/sasl/smtpd.conf: pwcheck_method: pwcheck
/usr/local/lib/sasl2/smtpd.conf: pwcheck_method: pwcheck
SASLライブラリが設定で使う /usr/local/lib/sasl (Cyrus SASLバージョン1.5.5) または /usr/local/lib/sasl2 (Cyrus SASLバージョン2.1.1) 以下のファイル名は次のように設定できます:
/etc/postfix/main.cf: smtpd_sasl_application_name = smtpd (Postfix < 2.3) smtpd_sasl_path = smtpd (Postfix 2.3 and later)
pwcheck デーモンは cyrus-sasl ソース tarball に含まれます。
重要: postfix プロセスは /var/pwcheck ディレクトリに読み込み+実行権を持つ必要があります。これがないと認証の試行に失敗します。
これの代わりに、Cyrus SASL 1.5.26 以降 (2.1.1.を含む) では、以下を試してください:
/usr/local/lib/sasl/smtpd.conf: pwcheck_method: saslauthd
/usr/local/lib/sasl2/smtpd.conf: pwcheck_method: saslauthd
saslauthd デーモンも cyrus-sasl ソース tarball に含まれています。これは PAM やその他のさまざまなソースに対する認証ができるという点で、 pwcheck デーモンよりも自由度があります。PAM を使うには、"-a pam" を付けて saslauthd を起動してください。
Cyrus SASL自身のパスワードデータベースに対して認証をするには:
/usr/local/lib/sasl/smtpd.conf: pwcheck_method: sasldb
/usr/local/lib/sasl2/smtpd.conf: pwcheck_method: auxprop
これは (Cyrus SASLソフトウェアの一部の) saslpasswd または saslpasswd2 コマンドによって管理される、Cyrus SASLパスワードファイルを使います (デフォルト: バージョン1.5.5では /etc/sasldb、バージョン2.1.1では /etc/sasldb2)。あまりサポートが良くないシステムでは、文句を言われなくなるまで何回も saslpasswd コマンドを実行する必要があるかもしれません。Postfix SMTP サーバは sasldb ファイルの読み込み権を必要とします - グループアクセスパーミションで遊んでみる必要があるでしょう。OTP 認証メカニズムを使う場合には、SMTP サーバは /etc/sasldb2 または /etc/sasldb (もしくは、使っているならバックエンド SQL データベース) にも書き込み権が必要となります。
重要: sasldb を動かすには、SASL ドメイン (realm) に fully qualified domain name (FQDN) をセットしていることを確認してください。
例:
% saslpasswd -c -u `postconf -h myhostname` exampleuser
% saslpasswd2 -c -u `postconf -h myhostname` exampleuser
sasldb におけるユーザのレルムについてのSASLの考え方は、sasldblistusers (Cyrus SASLバージョン1.5.5) または sasldblistusers2 (Cyrus SASLバージョン2.1.1) でわかるでしょう。
Postfix 側では、smtpd インスタンスごとに1つのレルムだけを持つことができ、そのレルムに属するユーザだけを認証することができます。Postfix 変数の smtpd_sasl_local_domain が smtpd によって使われるレルムを制御します:
/etc/postfix/main.cf: smtpd_sasl_local_domain = $myhostname
重要: Postfix が通知する「全ての」認証メカニズムを使って全てのユーザが認証できなければいけません。そうしないと、ネゴシエーションがサポートされていないメカニズムとなって認証に失敗することになるかもしれません。例えば、PAM (pluggable authentication modules) に対して認証するのに saslauthd を使うように設定したら、PLAIN と LOGIN メカニズムだけがサポートされて成功する可能性がありますが、SASL ライブラリは DIGEST-MD5 のような他のメカニズムも宣伝します。これはそのようなメカニズムが他のプラグインによって使えるようになっていて、SASLライブラリは唯一利用可能な認証のソースがPAMだけであるということを知る方法がないためです。従って、Postfixが通知するメカニズムのリストを制限する必要があるかもしれません。
古いバージョンのCyrus SASLがある場合、SASLプラグインディレクトリから対応するライブラリファイルを削除します (システムアップデート時に毎回繰り返します)。
Cyrus SASLバージョン2.1.1以降では:
/usr/local/lib/sasl2/smtpd.conf: mech_list: plain login
同じ理由で、認証に使うプラグインのリストを制限したくなるかもしれません。
Cyrus SASL 1.5.5では、SASLプラグインディレクトリから対応するライブラリファイルを削除するしかありません。
SASL バージョン 2.1.1 では:
/usr/local/lib/sasl2/smtpd.conf: pwcheck_method: auxprop auxprop_plugin: sql
SASL サポート付きのソフトウェアを chroot して動かすのは興味ある課題です。おそらく苦労する価値はありませんが。
サーバ側をテストするには、SMTPサーバに接続すると、次のように会話できるようになります。クライアントによって送られる情報は太字で示されます。
220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-AUTH DIGEST-MD5 PLAIN CRAM-MD5 250 8BITMIME AUTH PLAIN dGVzdAB0ZXN0AHRlc3RwYXNz 235 Authentication successful
dGVzdAB0ZXN0AHRlc3RwYXNzの代わりに、username\0username\0password (\0 は null バイト) の base64 エンコード形式を指定してください。上の例はユーザ名が `test'、パスワードが `testpass' の場合です。
base64 でエンコードされた認証情報を生成するには、次のコマンドのいずれかが使えます:
% printf 'username\0username\0password' | mmencode
% perl -MMIME::Base64 -e \ 'print encode_base64("username\0username\0password");'
mmencode は metamail ソフトウェアの一部です。MIME::Base64 は http://www.cpan.org/ から得られます。
注意: 公開リストに SASL ネゴシエーションのログを投稿するときは、ユーザ名/パスワード情報を base64 エンコード形式から回復するのは取るに足らないということを気に留めておいてください。
Cyrus SASL ソース内に "sample" という名前のサブディレクトリがあります。そこで make を実行し、ユーザ postfix (または mail_owner ディレクティブに設定したもの) に "su" します:
% su postfix
そしてできあがったサンプルサーバおよびクライアントを別々のターミナルで実行します。幸せではなくしているものを見つけるためにサーバを strace / ktrace / truss して、問題を修正してください。サンプルクライアントで認証が成功するようになるまで前のステップを繰り返してください。Postfix に戻るのはその後です。
クライアント側のSASL認証を有効にして、ホスト毎または配送先のユーザ名毎のユーザ名やパスワード情報を持つテーブルを指定します。Postfixはまずサーバホスト名を持つエントリをテーブルから検索します; エントリが見つからないと、次にPostfixはnext-hop配送先のエントリをテーブルから検索します。通常これはeメールアドレスの右側部分ですが、relayhost パラメータや transport(5) テーブルで指定される情報であることもあります。
/etc/postfix/main.cf: smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_type = cyrus /etc/postfix/sasl_passwd: foo.com username:password bar.com username [mail.myisp.net] username:password [mail.myisp.net]:submission username:password
Postfixバージョン2.3は送信者ごとのSASLパスワード情報をサポートしています。配送先で検索する前に送信者でPostfix SASLパスワードを検索するには、次のように指定します:
/etc/postfix/main.cf: smtp_sender_dependent_authentication = yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd /etc/postfix/sasl_passwd: user@example.com username:password bar.com username [mail.myisp.net] username:password [mail.myisp.net]:submission username:password
注意: SMTPサーバの中には PLAIN や LOGIN 認証だけをサポートするものもあります。デフォルトでは、Postfix SMTP クライアントは平文パスワードを送る認証方法を使わず、次のエラーメッセージを付けて配送を遅延します: "Authentication failed: cannot SASL authenticate to server" ("認証失敗: サーバへの SASL 認証ができません")。平文認証を有効にするには、例えば次のように指定します:
/etc/postfix/main.cf: smtp_sasl_security_options = noanonymous
Postfix SASLクライアントパスワードファイルは、SMTPサーバがchroot監獄に入る前に開かれるので、ファイルを /etc/postfix に置いたままにできます。
注意: クライアントシステム側では利用可能でも、実際には動かなかったりサーバを認証する適切な証明書を持っていない認証メカニズムをサポートしている SMTPサーバもあります。サーバメカニズムのうち、smtp(8) クライアントが使用を考慮するリストは、smtp_sasl_mechanism_filter パラメータを使えばさらに制限できます:
/etc/postfix/main.cf: smtp_sasl_mechanism_filter = !gssapi, !external, static:all
上の例では、PostfixはKerberosのような特別なインフラストラクチャを必要とするメカニズムの使用を拒否します。
Postfix SMTP クライアントは EHLO コマンドの応答に標準ではない "AUTH=stuff..." 文法を返す SMTP サーバに対して後方互換性を持っています; これを回避するために Postfix クライアントを設定する必要はありません。