Postfix SASL Howto


警告

わざわざ Postfix をインストールする人たちは、Postfix が他のメーラ よりもセキュアであると思っていることでしょう。Cyrus SASL ライブラリは 大量のコードで成り立っています。Postfix SMTP クライアントや SMTP サーバで SASL 認証を有効にしても、 Postfix は Cyrus SASL ライブラリを使う他の メールシステムと同程度にしかセキュアになりません。

どのように Postfix が SASL 認証情報を使うか

Postfix SASL サポート (RFC 2554) は Postfix SMTP サーバに対してリモートの SMTP クライアントを認証する ためや、リモートの SMTP サーバに対して Postfix SMTP クライアントを認証 するために使われます。

メールを受信する際、Postfix はクライアントが提供したユーザ名、認証 方法、送信者アドレスをメールログファイルに記録し、オプションで permit_sasl_authenticated UCE 制限を使ってメールアクセスを許可します。

クライアントのユーザ名や認証方法を他人が知る必要はないため、 Postfix はクライアントの SASL 認証情報をメッセージヘッダには記録せず、 メールを転送するときに SMTP コマンドで渡すこともありません。その情報を 知る必要がある場合は、ローカルの Postfix メールログファイルで見つけられる でしょう。いつか Postfix メールヘッダが設定可能になったら、C コードを 書き換えずに SASL ユーザ名を記録できるようになるでしょう。

このドキュメントは以下の話題をカバーしています:

メール送信時に、Postfix はテーブルからサーバのホスト名や配送先の ドメイン (アドレスの右側部分) を検索し、ユーザ名とパスワードが見つかったら、 サーバへの認証にこのユーザ名とパスワードを使います。

サポートしている SASL バージョン

Postfix+SASL 1.5.5 は RedHat 6.1 (pwcheck_method は shadow または sasldb に設定)、Solaris 2.7 (pwcheck_method は shadow または sasldb に 設定)、FreeBSD 3.4 (pwcheck_method は sasldb に設定) で動いているようです。 RedHat 6.1 では、SASL 1.5.5 は/etc/sasldb への書き込みアクセスを要求 します。これは SASL の auto_transition スイッチに関係するように見えることに 注意してください。Cyrus SASL のドキュメントは、"pwcheck_method" に "sasldb" を使う場合に、それを有効にするのに要領を得ないことにも注意して ください。SASL 1.5.x シリーズの以降のバージョンでも動くでしょう。

Postfix+SASL 2.1.1 は Mandrake Linux 8.1 (pwcheck_method は saslauthd または auxprop に設定) で動いているようです。'auxprop' pwcheck_method は SASL 1.5.x の 'sasldb' method を置き換えたものであることに注意してください。 auto_transition 機能を使うか、OTP (one-time passwords) のように データベースの secrets を更新する必要がある認証メカニズムを使うのであれば、 Postfix は /etc/sasldb2 への書き込みアクセスが必要となるでしょう。

SASL ライブラリの構築

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'' を指定します。

SASL 認証サポート付きの Postfix の構築

Postfix を SASL 認証サポート付きでビルドするために、Cyrus SASL インクルードファイルが /usr/local/include に、そして Cyrus SASL ライブラリが /usr/local/lib にあると想定します。

あるシステムでは、こうすることで必要な Makefile 定義が生成されます:

(for SASL version 1.5.5):
% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include" \
    AUXLIBS="-L/usr/local/lib -lsasl"
(for SASL version 2.1.1):
% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl" \
    AUXLIBS="-L/usr/local/lib -lsasl2"

Solaris 2.x ではランタイムリンク情報を指定する必要があります。 そうしないと、ld.so が SASL シェアードライブラリを見つけません:

(for SASL version 1.5.5):
% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include" \
    AUXLIBS="-L/usr/local/lib -R/usr/local/lib -lsasl"
(for SASL version 2.1.1):
% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl" \
    AUXLIBS="-L/usr/local/lib -R/usr/local/lib -lsasl2"

Postfix SMTP サーバで SASL 認証を有効にする

SMTP サーバで SASL サポートを有効にするには:

/etc/postfix/main.cf:
    smtpd_sasl_auth_enable = yes

認証されたクライアントによるメールのリレーを許可するには:

/etc/postfix/main.cf:
    smtpd_recipient_restrictions = 
        permit_mynetworks permit_sasl_authenticated ...

/usr/local/lib/sasl/smtpd.conf (SASL バージョン 1.5.5) または /usr/local/lib/sasl2/smtpd.conf (SASL バージョン 2.1.1) で、クライアントの パスワードをサーバが有効にする方法を指定する必要があります。

UNIX パスワードデータベースに対しての認証を有効にするには、以下を 試してください:

(SASL version 1.5.5)
/usr/local/lib/sasl/smtpd.conf:
    pwcheck_method: pwcheck

(SASL version 2.1.1)
/usr/local/lib/sasl2/smtpd.conf:
    pwcheck_method: pwcheck

SASL ライブラリが使う、/usr/local/lib/sasl (SASL バージョン 1.5.5) または /usr/local/lib/sasl2 (SASL バージョン 2.1.1) 以下の設定ファイル名は 次のように設定できます:

/etc/postfix/main.cf:
    smtpd_sasl_application_name = smtpd

pwcheck デーモンは cyrus-sasl ソース tarball に含まれます。

重要: postfix プロセスは /var/pwcheck ディレクトリに読み込み+実行権を 持つ必要があります。これがないと認証の試行に失敗します。

これの代わりに、SASL 1.5.26 以降 (2.1.1.を含む) では、以下を試して ください:

(SASL version 1.5.26)
/usr/local/lib/sasl/smtpd.conf:
    pwcheck_method: saslauthd
(SASL version 2.1.1)
/usr/local/lib/sasl2/smtpd.conf:
    pwcheck_method: saslauthd

saslauthd デーモンも cyrus-sasl ソース tarball に含まれています。 これは PAM やその他のさまざまなソースに対する認証ができるという点で、 pwcheck デーモンよりも自由度があります。PAM を使うには、"-a pam" を 付けて saslauthd を起動してください。

SASL 自身のパスワードデータベースに対して認証をするには:

(SASL version 1.5.5)
/usr/local/lib/sasl/smtpd.conf:
    pwcheck_method:  sasldb
(SASL version 2.1.1)
/usr/local/lib/sasl2/smtpd.conf:
    pwcheck_method:  auxprop

これは (Cyrus SASL ソフトウェアの一部の) saslpasswd または saslpasswd2 コマンドによって管理される、SASL パスワードファイルを使います (デフォルト: バージョン 1.5.5 では /etc/sasldb、バージョン 2.1.1 では /etc/sasldb2)。 あまりサポートが良くないシステムでは、文句を言われなくなるまで何回も saslpasswd コマンドを実行する必要があるかもしれません。Postfix SMTP サーバは sasldb ファイルの読み込み権を必要とします - グループアクセス パーミションで遊んでみる必要があるでしょう。OTP 認証メカニズムを使う 場合には、SMTP サーバは /etc/sasldb2 または /etc/sasldb (もしくは、 使っているならバックエンド SQL データベース) に書き込み権も必要と なります。

重要: Postfix が通知する「全ての」認証メカニズムを使って全ての ユーザが認証できなければいけません。そうしないと、ネゴシエーションが サポートされていないメカニズムとなって認証に失敗することになるかも しれません。例えば、PAM (pluggable authentication modules) に対して 認証するのに saslauthd を使うように設定したら、PLAIN と LOGIN メカニズムだけがサポートされて成功する可能性がありますが、SASL ライブラリは DIGEST-MD5 のような他のメカニズムも宣伝します。これは そのようなメカニズムが他のプラグインによって使えるようになっていて、 SASL ライブラリは唯一利用可能な認証のソースが PAM だけであるという ことを知る方法がないためです。従って、Postfix が通知するメカニズムの リストを制限する必要があるかもしれません。これは SASL バージョン 2.1.1 以降でのみ可能です。

/usr/local/lib/sasl2/smtpd.conf:
    mech_list: plain login

同じ理由で、認証に使うプラグインのリストを制限したくなるかも しれません。SASL バージョン 1.5.5 での選択肢は対応するライブラリを /usr/local/lib/sasl から削除するだけです。SASL バージョン 2.1.1 では:

/usr/local/lib/sasl2/smtpd.conf:
    pwcheck_method:  auxprop
    auxprop_plugin:  sql

重要: sasldb を動かすには、SASL ドメイン (realm) に fully qualified domain name (FQDN) をセットしていることを確認してください。

例:

(SASL version 1.5.5)
% saslpasswd -c -u `postconf -h myhostname` exampleuser
(SASL version 2.1.1)
% saslpasswd2 -c -u `postconf -h myhostname` exampleuser

sasldb におけるユーザのレルムについての SASL の考え方は、 sasldblistusers (SASL バージョン 1.5.5) または sasldblistusers2 (SASL バージョン 2.1.1) でわかるでしょう。

Postfix 側では、smtpd インスタンスごとに1つのレルムだけを持つことが でき、そのレルムに属するユーザだけを認証することができます。Postfix 変数の smtpd_sasl_local_domain が smtpd によって使われるレルムを制御します:

/etc/postfix/main.cf:
    smtpd_sasl_local_domain = $myhostname

SASL サポート付きのソフトウェアを chroot して動かすのは興味ある 課題です。おそらく苦労する価値はありませんが。

古い Microsoft SMTP クライアントソフトウェアは非標準的なバージョンの AUTH プロトコルの文法を実装しており、EHLO に対するSMTP サーバの応答が "250 AUTH stuff" ではなく "250 AUTH=stuff" であることを期待します。 規格に適合するクライアントに加えてこのようなクライアントに対応する ためには、main.cf ファイルで "broken_sasl_auth_clients = yes" をセットします。

Postfix SMTP サーバで SASL 認証をテストする

サーバ側をテストするには、SMTP サーバに接続すると、次のように会話を できるようになります。クライアントが送る情報は太字で示されています。

220 server.host.tld ESMTP Postfix
EHLO client.host.tld
250-server.host.tld
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 エンコード形式から回復するのは取るに 足らないということを気に留めておいてください。

SASL 内部のトラブルシューティング

Cyrus SASL ソース内に "sample" という名前のサブディレクトリが あります。そこで make を実行し、ユーザpostfix (または mail_owner ディレクティブに 設定したもの) に "su" します:

% su postfix

そしてできあがったサンプルサーバおよびクライアントを別々のターミナルで 実行します。幸せではなくしているものを見つけるためにサーバを strace / ktrace / truss して、問題を修正してください。サンプルクライアントで 認証が成功するようになるまで前のステップを繰り返してください。Postfix に 戻るのはその後です。

Postfix SMTP クライアントで SASL 認証を有効にする

クライアント側の SASL 認証を有効にして、ホスト毎または配送先のユーザ名 毎のユーザ名やパスワード情報を持つテーブルを指定します。Postfix はまず サーバのホスト名を検索します; エントリが見つからないと、配送先のドメイン名 (通常はEメールアドレスの右側部分です) を検索します。

/etc/postfix/main.cf:
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

/etc/postfix/sasl_passwd:
    foo.com             username:password
    bar.com             username

注意: SMTP サーバの中には PLAIN や LOGIN 認証だけをサポートするものも あります。デフォルトでは、Postfix SMTP クライアントは平文パスワードを 送る認証方法を使わず、次のエラーメッセージを付けて配送を遅延します: "Authentication failed: cannot SASL authenticate to server" ("認証失敗: サーバへの SASL 認証ができません")。平文認証を有効にするには、例えば 次のように指定します:

/etc/postfix/main.cf:
    smtp_sasl_security_options = 

SASL クライアントパスワードファイルは、SMTP サーバが chroot 監獄に 入る前に開かれるので、ファイルを /etc/postfix に置いたままにできます。

注意: クライアントシステム側では利用可能でも、実際には動かなかったり サーバを認証する適切な証明書を持っていない認証メカニズムをサポートしている SMTPサーバもあります。サーバメカニズムのうち、smtp(8) クライアントが 使用を考慮するリストは、smtp_sasl_mechanism_filter パラメータを使えば さらに制限できます。

Postfix SMTP クライアントは EHLO コマンドの応答に標準ではない "AUTH=stuff..." 文法を返す SMTP サーバに対して後方互換性を持っています; これを回避するために Postfix クライアントを設定する必要はありません。

クレジット