WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING =============================================================== このコードは Wietse によって承認されていません。 わざわざ Postfix をインストールする人たちは、Postfix が 他のメーラよりもセキュアであると思っていることでしょう。 Postfix SMTP クライアントや SMTP サーバで SASL 認証を有効にしても、 Postfix は Cyrus SASL ライブラリを使う他のメールシステムと 同程度にしかセキュアになりません。 Cyrus SASL ライブラリは、ソフトウェアがどのように動くと想定されて いるかを記したドキュメントが少なすぎます; そして SMTP クライアントや サーバのように、セキュリティに注意を払う必要があるプログラムに 使われるにはコードが多すぎます。 しかし、Cyrus 配送エージェントの LMTP インターフェースを使おうと しているのであれば、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) のようにデータベースの 秘密を更新する必要がある認証メカニズムを使うのであれば、 Postfix は /etc/sasldb2 への書き込みが必要となるでしょう。 はじめに ======== Postfix SASL サポート (RFC 2554) は元々 SuSE Rhein/Main AG の Till Franke によって実装されました。現在のコードは必要な部分だけを 切り出したバージョンです。SASL バージョン 2 のサポートは Jason Hoos の貢献です。 メールを受信する際、Postfix はクライアントが提供したユーザ名、 認証方法、送信者アドレスをメールログファイルに記録し、 オプションで permit_sasl_authenticated UCE 制限を使って メールアクセスを許可します。 SASL 認証情報はメッセージヘッダや SMTP では渡されません。メールサーバに アクセスするために送信者がどのユーザ名や認証方法を使ったかは、 誰にも関係ありません。知る必要がある人はメールログファイルの情報から 見つけられます。 メール送信時に、Postfix はテーブルからサーバのホスト名や配送先の ドメイン (アドレスのリモート部分) を検索し、ユーザ名とパスワードが 見つかったら、サーバへの認証にこのユーザ名とパスワードを使います。 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 認証を有効にする =========================================== 例は conf/sample-auth.cf を参照してください。 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) で、 クライアントのパスワードをサーバが有効にする方法を指定する 必要があります。 重要: PAM (pluggable authentication modules) を使うように SASL を 設定すると、SASL パスワードファイルが存在しないため (デフォルト: バージョン 1.5.5 では /etc/sasldb、バージョン 2.1.1 では /etc/sasldb2)、 Postfix サーバは異常終了します。これを修正するには、SASL ライブラリの バージョンに応じて /usr/lib/sasl/libcrammd5.so または /usr/lib/sasl2/libcrammd5.so を削除して、CRAM-MD5 認証を無効にします。 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 pwcheck デーモンは cyrus-sasl ソース tarball に含まれます。 重要: postfix プロセスは /var/pwcheck ディレクトリにグループ 読み込み+実行権を必要とします。これがないと、認証の試行は失敗します。 代わりに、SASL 1.5.5 以降 (2.1.1 を含む) で以下を試します: (SASL version 1.5.5) /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 デーモンよりも自由度があります。 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 ファイルの読み込み権を 必要とします - グループアクセスパーミションで遊んでみる必要がある でしょう。RedHat 6.1 では、SASL 1.5.5 は /etc/sasldb への 書き込み権も要求します。 重要: sasldb を動かすには、SASL ドメイン (realm) に fully qualified domain name (FQDN) をセットしていることを確認してください。 例: saslpasswd -c -u `postconf -h myhostname` exampleuser 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 は www.cpan.org から得られます。 SASL 内部のトラブルシューティング ================================= [Liviu Daia の文章に基づいています] Cyrus SASL ソース内で、"sample" という名前のサブディレクトリが 見つかります。そこで make を実行し、結果として得られたサンプル サーバとクライアントを別々のターミナルで動かします。何が不幸せに しているかを見るためには、サーバに対して 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 に置いたままにできます。 Postfix SMTP クライアントは EHLO コマンドの応答に非標準 AUTH=stuff... 文法を返す SMTP サーバに対して後方互換性を持っています。