Postfix SASL How


警告

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

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

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の実装

このドキュメントは以下のSASL実装付きのPostfixについて記述しています:

Postfixバージョン2.3は複数のSASL実装のサポートを提供するプラグインメカニズムを導入しています。Postfixに組み込まれた実装を知るには、以下のコマンドを使います:

% postconf -a (SMTPサーバでのSASLサポート)
% postconf -A (SMTP+LMTPクライアントでのSASLサポート)

言うまでもなく、これらのコマンドは以前のバージョンのPostfixでは使えません。

Dovecot 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" で処理します。

注意:

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

Cyrus SASLサポート付きでPostfixを構築する

以下はCyrus SASLインクルードファイルが /usr/local/include に、Cyrus SASLライブラリが /usr/local/lib にあると想定しています。

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

(for Cyrus SASL version 1.5.5):
% 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"
(for Cyrus SASL version 2.1.1):
% 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 シェアードライブラリを見つけません:

(for Cyrus SASL version 1.5.5):
% 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"
(for Cyrus SASL version 2.1.1):
% 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"

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 ...

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

Postfix SMTPサーバに対するDovecot SASLの設定

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のドキュメントを参照してください。

Postfix SMTPサーバに対するCyrus SASLの設定

/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 を探すものもあります。

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

同じ理由で、認証に使うプラグインのリストを制限したくなるかもしれません。

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

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

サーバ側をテストするには、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 エンコード形式から回復するのは取るに足らないということを気に留めておいてください。

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

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

% su postfix

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

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

クライアント側の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 クライアントを設定する必要はありません。

クレジット