--- Postfix + pwcheck/saslauthd (Cyrus-SASL) で SMTP-AUTH を使う ---

setter AT i-red DOT info Last update 2005/1/15

BACK


pwcheck だと パスワードに PLAIN しか使えませんので他の安全対策が必要です。
私の場合、DeleGate で SSL(TLS) ラップしてます。
本来、TLS はオンデマンド SSL なので、SSL を使わない接続も許可しますが、
DeleGateでは、StartTLS を強制できますのでそのようにしてます "sslway -St" 。

saslauthd の場合、多分、CRAM-MD5が使えると思うのですが、やったことありません(^^;;

sasldb や、ldap/pam を使ったりして、システムユーザと分離するのが主流かな。


Postfix 2.0.0.2 アップグレードメモ
pwcheck が古いということで、saslauthd を使う
RedHat Linux 8.0 の場合
Vine Linux 3.1 の場合

--- Cyrus-SASL ライブラリをインストールする

-- Cyrus-SASL Library のソースを取り寄せる。
cyrus-sasl-1.5.24.tar.gz

$ gzip -dc cyrus-sasl-1.5.24.tar.gz | tar -xvf -
$ cd cyrus-sasl-1.5.24
$ ./configure --with-pwcheck --enable-login
$ make
$ su
# make install

(2001/3/27)追加
--enable-login は、Outlook Express から、SMTP-AUTH を使う際に必要みたい。

--- Postfix を インストールする

ここもみてください
(というか、ほとんどが、ここを参考にして構成しています!感謝!)

まず、先ほどインストールした SASL ライブラリを参照できるようにする。
ほかにもやり方があるようです。

# ln -s /usr/local/lib/sasl /usr/lib/sasl
# ln -s /usr/local/lib/libsasl.so.7.1.8 /usr/lib/libsasl.so.7

-- Postfixのソースを取り寄せる
release-20010228.tar.gz

$ gzip -dc release-20010228.tar.gz | tar -xvf -
$ cd release-20010228
$ make tidy # 初めてコンパイルするときはいらない。
$ make makefiles CCARGS=-DUSE_SASL_AUTH" -I/usr/local/include" \
		 AUXLIBS="-L/usr/local/lib -lsasl"
$ make

Postfix ユーザを作ります。
# vi /etc/passwd
  postfix:*:200:200:Postfix user:/nonexistent:/bin/badsh

ここの、200 は、適当に使ってない UID/GID を設定してください。
同じように、グループも作ります。
Postfix-1.1 から、setgid が強制になり、
また、postfix ユーザと同じ GID は使えません。

# vi /etc/group
  postfix-group:*:1000:

Postfix ユーザ宛てのメールを root に転送するようにします。
# vi /etc/aliases
  postfix:  root

--- すでに Postfix が動作している場合は、/usr/sbin/postfix stop を先に実行します。
# ./INSTALL.sh
postfix-1.1.x 以降、make upgrade または、make install を使います。
質問には、すべて [Enter] で答えてしまいます。
* Postfix-1.1.x から、setgid を no にするとインストールできませんので、
途中、上記でつくったグループを指定します。
setgid_group: [no] postfix_group

--- Postfix の設定を変更します。
ここらへんは、何をやっているか、必ず、サンプルを見て理解してください。
設定サンプルの日本語訳は、ここにあります。

Part of main.cf
---
# 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 = XXX.XXX.XXX.XXX/YY, 127.0.0.0/8
    smtpd_sasl_auth_enable = yes	# Use SASL Auth.
    # これ以下のは、補助的な設定です。
    #default_privs = username
    broken_sasl_auth_clients = yes   # Outlook 用の設定みたい。
    allow_mail_to_commands = alias,forward,include
    relayhost = mail.host.domain
    smtpd_recipient_restrictions =
	permit_mynetworks		# mynetworks からの接続を許可
	permit_sasl_authenticated	# SASL 認証を通過したものは、許可
	reject				# 上の2つに当てはまらないものは、すべて拒否。
#	check_relay_domains		# mydistination 宛てのメールは受け入れる

# メールリレーに SASL-AUTH のみを使いたい場合。
# SASLを使う・ローカルホスト上のリレーを許可・SASL 認証されたものは許可・自分宛てのものは許可 のように設定する。
#    mynetworks = 127.0.0.0/8
#    smtpd_sasl_auth_enable = yes
--- 以下、順番が重要(Postfix 付属サンプル設定ファイルの説明を見てください)
#    smtpd_recipient_restrictions =
#	permit_mynetworks
#	permit_sasl_authenticated
#	check_relay_domains

--- Postfix の smtpd が pwcheck を使えるように設定する。

# mkdir /var/pwcheck
# chmod 700 /var/pwcheck
# chown postfix /var/pwcheck

--- これ以下は、作業順序が重要
--- smtpd が SASL でパスワードをチェックする方法を定義
# vi /usr/lib/sasl/smtpd.conf
pwcheck_method: pwcheck

--- pwcheck デーモンを起動
# /usr/local/sbin/pwcheck &

--- Postfix を起動
# /usr/sbin/postfix start


---------------------------------------------------
ちなみに、今使っている main.cf の一部だったりするもの。
特殊なので、参考になるとは思えません。
---
mydestination = $mydomain, ...
mynetworks = 127.0.0.0/8, ...
biff = no
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtp_sasl_security_options = noanonymous
allow_mail_to_commands = alias,forward,include
relayhost = xxx.xxx.jp
header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
# check_relay_domains = yes
smtpd_recipient_restrictions = 
	permit_mynetworks, 
	permit_sasl_authenticated, 
	permit_auth_destination, 
	reject
---
contents of body_checks 一部全角に変更してあります。
---
/name=\".*\.com\"/ REJECT
/name=\".*\.vbs\"/ REJECT
/name=\".*\.vb\"/ REJECT
/name=\".*\.js\"/ REJECT
/name=\".*\.url\"/ REJECT
/name=\".*\.bat\"/ REJECT
/name=\".*\.hta\"/ REJECT
/name=\".*\.htt\"/ REJECT
/name=\".*\.inf\"/ REJECT
/name=\".*\.reg\"/ REJECT
/name=\".*\.dll\"/ REJECT
/name=\".*\.eml\"/ REJECT
/name=\".*\.lnk\"/ REJECT
/name=\".*\.pif\"/ REJECT
/name=\".*\.scr\"/ REJECT
/.name=.*\.scr/ REJECT
---
contents of header_checks 一部全角に変更してあります。
---
/^From: inet <inet@microsoft.com>/ REJECT Message content rejected: From address pattern matched: KLEZ.E virus !!!
/^Subject: new photos from my party!/ REJECT Message content rejected: Subject pattern matched: MyParty virus !!!
/^.*boundary="====_ABC1234567890DEF_===="/ REJECT Message content rejected: Pattern matched: NIMDA virus !!!
/^.*boundary="====_ABC123456j7890DEF_===="/ REJECT Message content rejected: Pattern matched: NIMDA.E virus !!!
/^.*_Outlook_Express_message_boundary/ REJECT Message content rejected: Pattern matched: SIRCAM virus !!!

--- おしまい...


Postfix-2.0.0.2 アップグレードメモ

まったく同じ環境で、Postfix-1.1.12 から、Postfix-2.0.0.2 にアップデートしようと思ったですが、
どうも、libdb.so や、がみつけられないとコンパイルできないようです。
真剣に追っかけてないのですが、実際、src/master ディレクトリでエラーが出てコンパイルできなかった。
しかたないので、とりあえず、Berkeley DB-4.1.x をインストールして、
Berkeley DB がインストールされた場所の lib ディレクトリ内のファイルを、
すべて /usr/local/lib 内にコピーした。

# OpenLDAP-2.1.x 以降のものを使うとき、
# 適当にDBライブラリをインストールしたがために引っかかったのかも...
# db3 がインストール済みの場合、
# ln -s /usr/lib/libdb.so /usr/local/lib/libdb.so
# とかでも良いと思ふ。

-rw-r--r--    1 root     root       873188 Oct  7 17:07 libdb-4.1.a
-rw-rw-r--    1 root     root          713 Oct  7 17:06 libdb-4.1.la
-rwxrwxr-x    1 root     root       709437 Oct  7 17:06 libdb-4.1.so
lrwxrwxrwx    1 root     root           12 Oct  7 17:07 libdb-4.so -> libdb-4.1.so
lrwxrwxrwx    1 root     root           11 Oct  7 17:07 libdb.a -> libdb-4.1.a
lrwxrwxrwx    1 root     root           12 Oct  7 17:07 libdb.so -> libdb-4.1.so

SASL Library は、1.x のままでも良いと思うのですが、
もしかしたら、2.x が必要かもしれません。

あとは、通常のインストール(アップグレード)と同じ。
最近は、こんな感じ。

$ gzip -dc postfix-x.x.x.tar.gz | tar -xvf -
$ cd postfix-x.x.x
$ make makefiles CCARGS=-DUSE_SASL_AUTH" -I/usr/local/include" AUXLIBS="-L/usr/local/lib -lsasl" OPT="-O6" DEBUG=""
$ make
# /etc/rc.d/init.d/postfix stop
# make upgrade

Postfix-2.0 を起動する前に、

・ /etc/postfix/*.db および、/etc/aliases.db ファイルを削除。
  (Berkerey DB のバージョンを上げたりしていない場合はやらなくても良いと思う。)

・ Postfix-1.1.x では、body_checks で添付ファイルの拡張子などを検査していたが、
  Postfix-2.0.x では、header_checks で行うようになったみたいなので、
  それぞれで使用するファイルを書き換える。

# /etc/rc.d/init.d/postfix start

*******************************************************************************
一般的な Postfix サーバで 2.x にアップグレードした場合のその他注意すべきこと。

・main.cf の check_relay_domains オプションは使われなくなっているので、
 reject_unauth_destination を使う。

・ Postfix が確認できないユーザ宛てのメールを扱うサーバ(リレーなど)場合、main.cf で、
 local_recipient_maps =
 を指定する。そうしないと、ことごとく Reject されてしまう。
 transport_maps や、luser_relay を指定していても、local_recipient_maps の制限の方が優先されるので、
 同じく Reject される。
 このことを逆に利用するのはよいことかも。全サーバでユーザ認識に、どこかにある、
 1台の LDAP サーバを使うとか。

現在は、Postfix-2.0.1 (^^)

pwcheck が古いというので、saslauthd を使う

cyrus-sasl-1.5.27 から、新しい認証デーモン saslauthd ができ、
pwcheck は、もう使わない方がよさそうなので、そのようにしてみた。

まず、 cyrus-sasl-1.5.28.tar.gz を手に入れ、

$ gzip -dc cyrus-sasl-1.5.28.tar.gz | tar -xvf -
$ cd cyrus-sasl-1.5.28
$ ./configure --with-pwcheck --with-saslauthd --enable-login --disable-krb4 --disable-otp --disable-gssapi --without-bdb
$ make 
# make install
# ln -s /usr/local/lib/libsasl.so.7.1.11 /usr/lib/libsasl.so.7

# vi /usr/lib/sasl/smtpd.conf
を編集。

pwcheck_method: pwcheck
を、
pwcheck_method: saslauthd
に変更。

# mkdir /var/state/saslauthd
# chmod 700 /var/state/saslauthd
# chown postfix /var/state/saslauthd

/usr/local/sbin/saslauthd -v
で使用可能なメソッドを確認。

# /usr/local/sbin/saslauthd -a shadow

Postfix も make しなおした方がよいかも(未確認)。

Postfix を再起動。


RedHat Linux 8.0 の場合

SGI-XFS 1.2 を入れたかったので...

RHL8 の場合、cyrus-sasl-2.1.x が入っています。
Postfix は、いつの間にか sasl2 に対応したようなのですね。

まず、postfix ユーザと、グループを作成

例のごとく。
# ln -s /usr/lib/sasl2 /usr/local/lib/sasl2

$ gzip -dc | tar -xvf postfix-2.0.4.tar.gz
$ cd postfix-2.0.4.tar.gz
$ make tidy
$ make makefiles CCARGS=-DUSE_SASL_AUTH" -I/usr/include/sasl" \
  AUXLIBS="-L/usr/local/lib -lsasl2" \
  OPT="-O6" DEBUG=""
$ make
# make install

# vi /usr/local/lib/sasl2/smtpd.conf
smtpd.conf の内容。

pwcheck_method: saslauthd

# /sbin/service saslauthd start
# /sbin/service postfix start

$ ps ax | grep saslauthd
/usr/sbin/saslauthd -m /var/run/saslauthd/mux -a shadow

これだけ。


Vine Linux 3.1 の場合


--- cyrus-sasl 関連をインストール。
# apt-get install cyrus-sasl \
		cyrus-sasl-devel \
		cyrus-sasl-md5 \
		cyrus-sasl-plain

--- postfix を、sasl が使えるようにビルドしなおす。
$ cd ~/rpm
$ apt-get source postfix
$ rpm -ivh postfix-2.0.20-0vl5.src.rpm
$ cd SPECS
$ vi postfix.spec   # spec ファイルの編集

postfix.spec の変更点。
diff postfix.spec.orig postfix.spec
117,118c117,119
<               -DHAS_PGSQL -I/usr/include/pgsql" \
< AUXLIBS=""
---
>               -DHAS_PGSQL -I/usr/include/pgsql \
>               -DUSE_SASL_AUTH -I/usr/include/sasl" \
> AUXLIBS="-lsasl2"

$ rpmbuild -ba postfix.spec   # 編集した spec ファイルを使用して、 rpm をビルド
# rpm -ivh --force ../RPMS/i386/postfix-2.0.20-0vl5.i386.rpm  # 作った postfix をインストール

--- sasl の設定
# echo "pwcheck_method: saslauthd" > /usr/lib/sasl2/smtpd.conf
# /sbin/chkconfig saslauthd on
# /etc/rc.d/init.d/saslauthd start

--- postfix の設定
# vi /etc/postfix/main.cf
少なくとも、このくらいは必要。この設定では、認証を受けない送信は全て拒否。

broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtp_sasl_security_options = noanonymous
smtpd_recipient_restrictions =permit_sasl_authenticated, reject

# /etc/rc.d/init.d/postfix restart

--- 接続確認

$ telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 setter ESMTP Postfix
ehlo locahlost
250-setter
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5 PLAIN LOGIN   #この2行が出ていれば多分大丈夫。
250-AUTH=DIGEST-MD5 CRAM-MD5 PLAIN LOGIN
250-XVERP
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.

あとは、Mozilla とかでチェックしましょう。
/var/log/maillog のチェックもお忘れ無く。

なお、postfix より前に、saslauthd を起動しておく必要があったと思うのですが、順番は適宜ということで(^^)