postfix logo Postfixのぺーじ
− SMTP Auth 対応版 Postfix インストールの記録
更新: 2005年2月19日  


ホームオリジナルドキュメント >SMTP Auth 対応版 Postfix インストールの記録


はじめに

SMTP AuthはRFC2554で規定されているメール送信時に認証を求める方法です。 ここでは、PostfixのSMTPサーバにSMTP Authオプションをつけてみました。 なお、OSによってはSASL対応のパッケージが配布されていることも多いので、 そちらを利用する方がよいかもしれません。

(通常のインストール記録はこちらへ。)

/tmp/postfix にソースのtar ballがあるものとします。
また、# はスーパーユーザでの実行をあらわし、% は一般ユーザでの実行を あらわします。シェルはcsh系を仮定してるので、bsh系の方は読み替えて下さい。
以下の例では、設定ファイルは /etc/postfix に、実行ファイル類は /usr/postfix 以下にインストールしました。

この記録はバージョン2.1.5を使用しています。インストールはFreeBSD 5.3Rで 行ないました。インストールにあたっては SASL_READMEファイルも 参照して下さい。


Cyrus-SASL パッケージのコンパイル

PostfixのSMTP Authは現時点ではcyrus-SASLパッケージのライブラリを利用して 実装しています。このライブラリを先にインストールしておきます。 cyrus-SASLパッケージはProject CyrusFTPサイトから 取得できます。FTPサーバ上にあるPGPの署名ファイルと公開鍵を使ってファイルの 検証も可能です。検証方法は通常の インストール記録を参照してください。

% tar xvzf cyrus-sasl-2.1.19.tar.gz
% cd cyrus-sasl-2.1.19
% ./configure   # MS Outlook Express をサポートするには
                # --enable-login=yes オプションが必要
% make
% su
# make install
# ln -s /usr/local/lib/sasl /usr/lib/sasl

(MS Outlook ExpressはSMTP認証のうちLOGIN認証しかサポートしていないため、 configureに --enable-login=yes をつけないと認証できません。)

ここで SASL 認証ユーザ用のアカウントを作成します。

# /usr/local/sbin/saslpasswd2 username
# vi /usr/local/lib/sasl2/smtpd.conf  (利用したい方法にあわせてどれか1つを指定します)

(SASLチェック用デーモンを利用する場合)
  pwcheck_method: saslauthd
  mech_list: plain login
   (PAM,shadowではcram-md5等が使えないため、plainおよびlogin認証のみに限定します)

(SASL用パスワードファイルを利用する場合)
  pwcheck_method: auxprop
  auxprop_plugin: sasldb
  mech_list: cram-md5 digest-md5 plain login
   (これを指定しないと、CRAM-MD5が使えてもplainが優先されてしまうことがあります)

(Unixパスワードデータベースを利用する場合)
  pwcheck_method: pwcheck

saslauthdを使用すると、pamやLDAP、MySQLなどを利用した認証も 使えるようになります (configure時に指定が必要)。saslauthdを利用する場合、 Postfixを起動する前に以下のようにデーモンを起動しておく必要があります。

# /usr/local/sbin/saslauthd -a pam     (PAMを利用した認証を使う場合)
# /usr/local/sbin/saslauthd -a shadow  (/etc/shadowファイルを使う場合)

auxprop (CyrusSASL 1.xではsasldbという名前でした) を使用する場合、

# chmod 640 /etc/sasldb2.db
# chown cyrus:mail /etc/sasldb2.db
# vi /etc/group
  mail:*:6:postfix   (mailグループにpostfixユーザを追加)

のように/etc/groupファイルを編集してpostfixユーザをmailグループに 加えることで読み込み権を与える必要があるでしょう。


Postfix パッケージのコンパイル

お好みの場所でtar ballを展開して、コンパイルします。ほとんど普通の コンパイルと同じですが、SASL ライブラリを使用するためにオプションをつけた makefileを作成します。make tidy は以前にbuildしたものが 残っていた場合に実行します。

% setenv SRCDIR /tmp/postfix
% cd ${SRCDIR}
% tar xvzf postfix-2.1.5.tar.gz
% cd postfix-2.1.5
% 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"
% make

Postfix ユーザの追加

% su
# pw groupadd postfix
# pw groupadd postdrop
  (ユーザ `postfix' 用、およびmaildrop用のグループを作成)

# pw useradd postfix -d /nonexistent -g postfix -s /sbin/nologin
  (ユーザ `postfix' をパスワード・ホームディレクトリ・ログインシェルなしで追加)

# vi /etc/aliases
  postfix:  root
  (postfix 宛のメールを root に向ける)

お使いのシステムにあわせてpw, useradd, adduser, vipwなどでグループ・ ユーザを作成してください。


旧 sendmail の停止

/etc/inetd.conf でsendmailを叩いている場合には、その記述を コメントアウトして、kill -HUP を送ります。その場合は、 ここからpostfixを起動するまでの間メールの送受信はできません。

# mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF
# mv /usr/bin/newaliases /usr/bin/newaliases.OFF
# mv /usr/bin/mailq /usr/bin/mailq.OFF
# chmod 755 /usr/sbin/sendmail.OFF  /usr/bin/newaliases.OFF \
  /usr/bin/mailq.OFF

ただし、今回は新規にインストールしたFreeBSDマシンにインストールを 行なったため、上記の操作は行ないませんでした。最近のFreeBSDでは sendmailなどのコマンドがmailwrapperのリンクになっており、実際には /etc/mail/mailer.conf に記述したコマンドが実行されます。そこで、 Postfix sendmailなどのコマンドはFreeBSDに入っているsendmailにならって、 /usr/libexec/postfix 以下にインストール することにしました。 (FreeBSD 以外ではデフォルトのディレクトリにインストールする方が 良いでしょう。)


Postfix のインストール

# make install

質問には以下のように答えました。[]の後に何もないものはデフォルトを 指定しています。インストールスクリプトの質問内容については 通常のインストール記録も参照して ください。

install_root: [/]
tempdir: [/home/ike/src/mail/postfix/postfix-2.1.5]
config_directory: [/etc/postfix]
daemon_directory: [/usr/libexec/postfix]
command_directory: [/usr/sbin] /usr/local/sbin
queue_directory: [/var/spool/postfix]
sendmail_path: [/usr/sbin/sendmail] /usr/libexec/postfix/sendmail
newaliases_path: [/usr/bin/newaliases] /usr/libexec/postfix/newaliases
mailq_path: [/usr/bin/mailq] /usr/libexec/postfix/mailq
mail_owner: [postfix]
setgid_group: [postdrop]
html_directory: [no]
manpage_directory: [/usr/local/man]
readme_directory: [no]

Postfix の設定

以下はサーバ側PostfixをSMTP Auth対応にするための設定です。

# cd /etc/postfix
# cp main.cf main.cf.org
# vi main.cf
    #(必ず設定するのは以下の項目。値は適切なものに変えてください。)
    myorigin = $myhostname
    inet_interfaces = all
    mydestination = $myhostname, localhost.$mydomain
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    mail_spool_directory = /var/mail
    mynetworks_style = subnet
    #(これまで通りに mynetworks を記述することもできます。)
    # mynetworks = XXX.XXX.XXX.XXX/YY, 127.0.0.0/8  # ネットワークアドレスを書く。
    smtpd_sasl_auth_enable = yes        # SASL 認証をおこないます。
    #(設定によっては次の項目も必要です)
    default_privs = username
    allow_mail_to_commands = alias,forward,include
    relayhost = mail.host.domain
    smtpd_recipient_restrictions =
        permit_mynetworks
        permit_sasl_authenticated       # SASL 認証済アクセスを許可します。
        reject_unauth_destination

これ以外の設定は、以上の設定で問題なく動くことを確認してから1つずつ 変更してください。

SMTP Auth対応のサーバにメールを転送するなど、PostfixをSMTP Auth クライアントにする場合には、以下のような設定が必要です:

/etc/postfix/main.cf:
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    smtp_sasl_security_options =    (空値、サーバがLOGIN/PLAINといった平文の認証を必要とする場合)

/etc/postfix/sasl_passwd:
    example.com             username:password
    example.net             username

sendmail の停止と Postfix の起動

# kill -TERM 'sendmail-PID'
# postfix start

PostfixでSMTP Authが使えるようになったかチェックするには、SMTPサーバを 直接叩いて、

% telnet mail.example.com smtp
>>220 mail.example.com ESMTP Postfix
<<EHLO client.example.com
>>250-mail.example.com
>>250-PIPELINING
>>250-SIZE 10240000
>>250-ETRN
>>250-AUTH CRAM-MD5 DIGEST-MD5 PLAIN LOGIN
>>250 8BITMIME
<<AUTH PLAIN dGVzdAB0ZXN0AHRlc3RwYXNz
>>235 Authentication successful

(dGVzdAB0ZXN0AHRlc3RwYXNzはユーザtest、 パスワードtestpassusername\0username\0password (\0はヌル文字)のように並べたものをbase64エンコードしたものです。)

のように返せばうまくいっているはずです。

ユーザ名などをエンコードした情報は次のように生成させることができます。

% printf 'username\0username\0password' | mmencode

% perl -MMIME::Base64 -e \
    'print encode_base64("username\0username\0password");'

mmencodeはmetamail ソフトウェアの一部です (metamailの本家で配布しているものはセキュリティホールが あるようなので、各OS用パッケージで修正されているもの以外は使わない方が よいでしょう)。MIME::Base64は www.cpan.org から入手できます。



ike@kobitosan.net