2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

SASL2をソースから入れる!

RedHat系及びDebian系はバイナリが用意されてるので PostfixとSASL2 の連携はあまり苦労しないでセットアップできる。しかし、バイナリが用意されてない例えば、SlackwareとかNature’s Linuxなどは、くしくもソースから入れねばならない。まあ、俺はソースから入れるのが好きなので特に苦痛ではないが、このSASLをソースで入れてPostfixソースとの連携をするというのについてはかなり苦戦した。意外にはまったのは、PostfixをSASL対応にするためMakefileを新たに作り再コンパイルするところだった。Googleても正確な情報がないし、苦戦しながら試行錯誤して完成させた。
ここでは、その苦労した過程を細かく説明するのでみなさんに役立ててもらいたい。ここで、SASL2で使うSMTP-AUTHの認証の種類について説明する。
■ LOGIN認証
主に、Outlook系のメーラがサポートしている方式。これは、ユーザ名とパスワードをBase64エンコードする方式である。いわゆる可逆的なエンコードであるため、暗号化とは言えない。したがって、セキュリティ的に非常に弱いパケットを盗聴されてユーザ名、パスワードをデコードされる可能性は高い。

■ PLAIN認証
LOGIN認証とほぼ同じ方式。つまり、Base64エンコードする方式だ。LOGIN認証と違うのは、ユーザ名、パスワードを個々に送信するのではなく、一列の連結された文字列で送信するのが特徴だ。しかし、それだけであって、これもセキュリティ的に非常に弱い認証方式だ。盗聴可能である。

■ CRAM-MD5認証
Challenge Response Authentication Mechanism これは、 APOP [qpopperでAPOPを使う!]と同じチャレンジレスポンス方式だ。簡単に言うと、メーラがCRAM-MD5認証をサーバに要求すると、サーバはConnectする度に変化する文字列(チャレンジ)を表示する。それをデコードしてパスワード(鍵)としてMD5ハッシュ値をゲットする。サーバも同様に演算し最終的にMD5ハッシュ値が一致したら認証成功とする。

■ Digest-MD5認証
これも、CRAM-MD5同様チャレンジレスポンス方式だ。簡単に言うとCRAM-MD5をより安全にした方式である。チャレンジレスポンスのアルゴリズムを複雑にしてCRAM-MD5より以上のセキュリティを保つ。

インストール環境 )
OS : Nature’s Linux1.5
マシン : Celeron 600MHz マイクロATXマシン


1.DB-4とgdbm、ndbmをインストールする


SASLは、BerkeleyDBとgdbm、ndbmを使う。入ってない鯖は必ず入れる。入れる要領は以下を参照。
ライブラリを入れる場所とかをちゃんと確認しておかないと後でPATHが通ってないとかで悩むので注意すること。基本的には、/usr/libとか/usr/local/libとかに入れるのが普通。BerkeleyDBは、オプションスイッチを付けてMakefileを作らないと、何も指定しない状態では、ライブラリは/usr/local/BerkeleyDB.x.x/ 以下にヘッダーとかライブラリをインスコしてしまうのでそうなった場合はシンボルリンクを張るなどしてPATHが通る状態にしないと、BerkeleyDBを入れても参照されない事となる。したがって、Makefile作成時に必ず–prefix=/usrを指定すること。

1)BerkeleyDBのインスコ
DB-4を ここ からゲットする。

[VFS-root@sub ~]# cd /usr/local/src
[VFS-root@sub src]# wget ftp://ftp.sleepycat.com/releases/db-4.4.20.tar.gz
[VFS-root@sub src]# tar xvzf package/db-4.4.20.tar.gz
[VFS-root@sub build_unix]# cd db-4.4.20/build_unix

必ず、–prefix=/usrを指定すること。これによりライブラリは、/usr/libへインストールされる。
[VFS-root@sub build_unix]# ../dist/configure –prefix=/usr
[VFS-root@sub build_unix]# make
[VFS-root@sub build_unix]# make install

2)gdbm、ndbmのインスコ
gdbmやndbmは、 ここ からゲットする。

[VFS-root@sub build_unix]# cd ../../
[VFS-root@sub src]# wget ftp://tron.um.u-tokyo.ac.jp/pub/GNU/gdbm/gdbm-1.8.3.tar.gz
[VFS-root@sub src]# tar xvzf gdbm-1.8.3.tar.gz
[VFS-root@sub src]# cd gdbm-1.8.3
[VFS-root@sub gdbm-1.8.3]# ./configure –prefix=/usr
[VFS-root@sub gdbm-1.8.3]# make prefix=/usr
[VFS-root@sub gdbm-1.8.3]# make prefix=/usr install
[VFS-root@sub gdbm-1.8.3]# make prefix=/usr install-compat

db類がインスコできたら、ldconfigでライブラリを再構成してdbがちゃんと入ってるか確認する。

[VFS-root@sub gdbm-1.8.3]# /sbin/ldconfig
[VFS-root@sub gdbm-1.8.3]# /sbin/ldconfig -p | grep db

libthread_db.so.1 (libc6, hwcap: 0x8000000000000000, OS ABI: Linux 2.6.0) => /lib/
tls/libthread_db.so.1
libthread_db.so.1 (libc6, OS ABI: Linux 2.2.0) => /lib/libthread_db.so.1
libthread_db.so (libc6, OS ABI: Linux 2.2.0) => /usr/lib/libthread_db.so
libpwdb.so.0 (libc6) => /lib/libpwdb.so.0
libpwdb.so (libc6) => /lib/libpwdb.so
libgdbm_compat.so.3 (libc6) => /usr/lib/libgdbm_compat.so.3
libgdbm_compat.so (libc6) => /usr/lib/libgdbm_compat.so
libgdbm.so.3 (libc6) => /usr/lib/libgdbm.so.3
libgdbm.so (libc6) => /usr/lib/libgdbm.so
libdb_cxx-4.2.so (libc6) => /usr/lib/libdb_cxx-4.2.so
libdb-4.4.so (libc6) => /usr/lib/libdb-4.4.so
libdb-3.3.so (libc6) => /usr/lib/libdb-3.3.so

こんな具合にlibdb とかが出てくればOK!


2.SMTP-AUTHのインスコ


1)cyrous-sasl2のゲット
saslは、 ここ から、2006年9月現在最新の cyrus-sasl-2.1.22.tar.gz をゲットする。
[VFS-root@sub ~]# cd /usr/local/src
[VFS-root@sub src]# wget ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.22.tar.gz
[VFS-root@sub src]# chown -R root.root cyrus-sasl-2.1.22

2)コンパイル&リンク
[VFS-root@sub src]# cd cyrus-sasl-2.1.22
[VFS-root@sub cyrus-sasl-2.1.22]# ./configure –with-plugindir=/usr/local/lib/sasl2 \
–with-auxprop –with-saslauthd –enable-cram –enable-plain

[VFS-root@sub cyrus-sasl-2.1.22]# make
[VFS-root@sub cyrus-sasl-2.1.22]# make install

saslライブラリのシンボルリンクを張る。
[VFS-root@sub cyrus-sasl-2.1.22]# ln -s /usr/local/lib/libsasl2.so.2 /usr/lib
[VFS-root@sub cyrus-sasl-2.1.22]# ln -s /usr/local/lib/sasl2 /usr/lib/sasl2


3.Postfixの再構築


1)コンパイル&リンク

[VFS-root@sub cyrus-sasl-2.1.22]# cd /usr/local/src/postfix-2.3.3/
[VFS-root@sub postfix-2.3.3]# make tidy
[VFS-root@sub postfix-2.3.3]# make makefiles CCARGS=”-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl” AUXLIBS=”-L/usr/local/lib/sasl2 -lsasl2″

注:” DUSE_CYRUS_SASL ” ってのが重要で、これを忘れると Postfix がちゃんと動かないので注意すること。
これに気がつくのにかなりの時間がかかった。

[VFS-root@sub postfix-2.3.3]# make
[VFS-root@sub postfix-2.3.3]# make install


4.sasl2の設定


1)smtpd.confの内容の追記

[VFS-root@sub postfix-2.3.3]# mkdir -p /var/state/saslauthd
[VFS-root@sub postfix-2.3.3]# chmod 700 /var/state/saslauthd
[VFS-root@sub postfix-2.3.3]# chown postfix /var/state/saslauthd
[VFS-root@sub postfix-2.3.3]# vi /usr/local/lib/sasl2/smtpd.conf

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: cram-md5


5.ユーザデータベースの設定


1) アカウントの作成と削除

■ アカウント作成
[VFS-root@sub postfix-2.3.3]# saslpasswd2 -c -u `postconf -h myhostname` username
Password: ******
Again (for verification): ******

もしくは、
[VFS-root@sub postfix-2.3.3]# saslpasswd2 -c -u myhostname username

■ アカウント削除
[VFS-root@sub postfix-2.3.3]# saslpasswd2 -d -u `postconf -h myhostname` username

もしくは、
[VFS-root@sub postfix-2.3.3]# saslpasswd2 -d -u myhostname username

2) アカウントの登録確認
[VFS-root@sub postfix-2.3.3]# sasldblistusers2
username@ns.xxxxxxx.net: userPassword

尚、手前みそだが、SMTP password及びPOP passwordを作成するなら、 この Password Maker が便利だ。

3) Postfix側とのデータベースの関連付け
saslグループを作って、Postfixユーザをsaslグループへ追加する。
[VFS-root@sub postfix-2.3.3]# groupadd sasl
[VFS-root@sub postfix-2.3.3]# vi /etc/group

省略
sasl:x:2005:postfix
[VFS-root@sub postfix-2.3.3]# chgrp sasl /etc/sasldb2
[VFS-root@sub postfix-2.3.3]# chmod 640 /etc/sasldb2

以下1行の作業と2行目の注記は、必要ないと思うが念のため書いておく。
[VFS-root@sub postfix-2.3.3]# cp /etc/sasldb2 /var/spool/postfix/etc/
注:以降、ユーザ登録の度に上記のコピー作業を行うこと。


6.Postfix main.cfとmaster.cfの編集


1)main.cfの編集

[VFS-root@sub postfix-2.3.3]# vi /etc/postfix/main.cf
省略
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes

smtpd_recipient_restrictions = permit_mynetworks,
                   regexp:/etc/postfix/recipient_checks.reg,
                   check_sender_access hash:/etc/postfix/bad_sender,
                   reject_rbl_client relays.ordb.org,
                   reject_rbl_client spamcop.net,
                   reject_rbl_client dynablock.wirehub.net,
                   reject_rbl_client opm.blitzed.org,
                   reject_non_fqdn_recipient,
                   permit_auth_destination,
                   permit_sasl_authenticated,
                   reject_unauth_destination
省略

濃い青字の部分がsasl2独自の設定。

2)master.cfの編集

[VFS-root@sub postfix-2.3.3]# vi /etc/postfix/master.cf

省略
smtp-amavis unix – – n – 2 smtp
  -o smtp_data_done_timeout=1200
  -o disable_dns_lookups=yes
127.0.0.1:10025 inet n – n – – smtpd
  -o smtpd_sasl_auth_enable=yes
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o mynetworks=127.0.0.0/8
  -o strict_rfc821_envelopes=yes
  -o smtp_error_sleep_time=0
  -o smtp_soft_error_limit=1001
  -o smtp_hard_error_limit=1000

注:-oの前のスペースに意味があるので注意すること。


7.動作確認

1)saslがちゃんと機能しているか確認してみる

[VFS-root@sub postfix-2.3.3]# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 hiro.kozupon.com ESMTP
EHLO localhost
250-hiro.kozupon.com
250-PIPELINING
250-SIZE 51200000
250-ETRN
250-AUTH PLAIN OTP DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN OTP DIGEST-MD5 CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

赤字が入力文字で青字の表示が出たら成功。この状態で、PLAIN認証とCRAM-MD5スクランブル認証が使えることを意味している。
お疲れさまでした!

2)PLAIN LOGINでパスワード認証をちゃんと行ってるかどうか確認してみる
ユーザIDとパスワードを入れてBase64でエンコードしてみる。
[VFS-root@sub postfix-2.3.3]# perl -MMIME::Base64 -e ‘print encode_base64(“username\0username\0password”);’   ← 一行で
xxxxxxxxxxxxxxxxxxxxxx
telnetで25番につないで以下のようにコードを入力して、Authentication successfulが出たらOK!

[VFS-root@sub postfix-2.3.3]# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 hiro.kozupon.com ESMTP
EHLO localhost
250-hiro.kozupon.com
250-PIPELINING
250-SIZE 51200000
250-ETRN
250-AUTH PLAIN OTP DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN OTP DIGEST-MD5 CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN xxxxxxxxxxxxxxxxxxxxxx
235 2.0.0 Authentication successful
quit
221 2.0.0 Bye
Connection closed by foreign host.

8.その他


1)ここでは、使用していないが以下参考までに
TLSパッチの在処 ( ftp://mirrors.loonybin.net/pub/postfix_tls/ )

sdbmライブラリの在処 ( http://librep.sourceforge.net/ )

Courier authentication library CRAM-MD5 ( http://www.courier-mta.org/?download.php~authlib )

2)メールクライアントの設定間違いによるエラー
使用のメールクライアントがSMTP認証に対応していない場合、もしくは設定間違いの場合にメール鯖メールログへ出力されたエラーの例。xxx.xxx.xxx.xxx はIPアドレス。

Jan 5 11:19:07 ns postfix/smtpd[3039]: connect from unknown[xxx.xxx.xxx.xxx]
Jan 5 11:19:14 ns postfix/smtpd[3039]: warning: SASL authentication failure: incorrect digest response
Jan 5 11:19:14 ns postfix/smtpd[3039]: warning: unknown[xxx.xxx.xxx.xxx]: SASL CRAM-MD5 authentication failed
Jan 5 11:19:16 ns postfix/smtpd[3039]: warning: SASL authentication failure: incorrect digest response
Jan 5 11:19:16 ns postfix/smtpd[3039]: warning: unknown[xxx.xxx.xxx.xxx]: SASL CRAM-MD5 authentication failed
Jan 5 11:19:18 ns postfix/smtpd[3039]: warning: SASL authentication failure: incorrect digest response
Jan 5 11:19:18 ns postfix/smtpd[3039]: warning: unknown[xxx.xxx.xxx.xxx]: SASL CRAM-MD5 authentication failed
Jan 5 11:19:19 ns postfix/smtpd[3039]: warning: SASL authentication failure: incorrect digest response
Jan 5 11:19:19 ns postfix/smtpd[3039]: warning: unknown[xxx.xxx.xxx.xxx]: SASL CRAM-MD5 authentication failed
Jan 5 11:19:21 ns postfix/smtpd[3039]: warning: SASL authentication failure: incorrect digest response
Jan 5 11:19:21 ns postfix/smtpd[3039]: warning: unknown[xxx.xxx.xxx.xxx]: SASL CRAM-MD5 authentication failed
Jan 5 11:19:23 ns postfix/smtpd[3039]: warning: SASL authentication failure: incorrect digest response
Jan 5 11:19:23 ns postfix/smtpd[3039]: warning: unknown[xxx.xxx.xxx.xxx]: SASL CRAM-MD5 authentication failed
Jan 5 11:19:26 ns postfix/smtpd[3039]: warning: SASL authentication failure: incorrect digest response
Jan 5 11:19:26 ns postfix/smtpd[3039]: warning: unknown[xxx.xxx.xxx.xxx]: SASL CRAM-MD5 authentication failed

以上

コメント