この文書では、Solaris 上で Postfix, OpenSSL, Cyrus SASL の組み合わせ を使って SMTP AUTH と SMTP over SSL 機能を使えるメールサーバを構築することを目的とする。 Cyrus SASL の認証データベースには OS の /etc/passwd (shadow) を利用し、 sasldb は使わない。
また、クライアントプログラムとしては PLAIN 認証のみを使える Outlook Express 5/6 を想定する。
環境は Solaris 8 10/01、コンパイラは gcc 2.95.3 を使用する。
# LD_RUN_PATH=/usr/local/lib; export LD_RUN_PATH # gzip -cd openssl-0.9.7e.tar.gz | tar xf - # cd openssl-0.9.7e # gpatch -p1 < ../openssl-0.9.7e.diff # ./Configure --prefix=/usr/local --openssldir=/usr/local/etc/ssl shared solaris-sparcv9-gcc # make # make install
# gzip -cd cyrus-sasl-2.1.10.tar.gz | tar xf - # cd cyrus-sasl-2.1.10 # LDFLAGS="-L/usr/local/lib -R/usr/local/lib" ./configure --disable-gssapi # mv saslauthd/Makefile saslauthd/Makefile.orig # sed 's/-mdoc//' saslauthd/Makefile.orig > saslauthd/Makefile # make # make install # cd /usr/lib; ln -s /usr/local/lib/sasl2 . # mkdir -p /var/state/saslauthd
SMTP 認証に saslauthd を使うため (Postfix の smtpd は root 権限で動かないので、 直接 shadow ファイルを読めない。このため、root 権限で動く saslauthd に認証を任せ、結果を受け渡してもらう必要がある)、 saslauthd を起動するためのスクリプトを作成する。
# vi /etc/init.d/saslauthd
内容は以下のようにする。
#!/sbin/sh
case "$1" in
'start')
if [ ! -d /var/state/saslauthd ]; then
mkdir -p /var/state/saslauthd
fi
if [ -x /usr/local/sbin/saslauthd ]; then
/usr/local/sbin/saslauthd -a shadow
fi
;;
'stop')
kill `cat /var/state/saslauthd/mux.pid`
;;
'restart')
$0 stop; $0 start
;;
*)
echo "Usage: $0 { start | stop | restart }"
exit 1
;;
esac
exit 0
実行権限を付け、各ランレベルにリンクする。
# cd /etc # chmod 744 init.d/saslauthd # ln init.d/saslauthd rc0.d/K37saslauthd # ln init.d/saslauthd rc1.d/K37saslauthd # ln init.d/saslauthd rcS.d/K37saslauthd # ln init.d/saslauthd rc2.d/S87saslauthd
最初に postfix で利用するユーザアカウント・グループを作成する。
# groupadd postfix # groupadd postdrop # useradd -g postfix -d /var/spool/postfix -s /bin/false postfix
次に本体のコンパイルを行う。OpenSSL と Cyrus SASL を利用するため、 make makefiles に必要なオプションを与える。
# gzip -cd postfix-2.1.5.tar.gz | tar xf - # gzip -cd pfixtls-0.8.18-2.1.3-0.9.7d.tar.gz | tar xf - # cd postfix-2.1.5 # gpatch -p1 < ../pfixtls-0.8.18-2.1.3-0.9.7d/pfixtls.diff # make makefiles \ > CCARGS="-DUSE_SSL -DUSE_SASL_AUTH -I/usr/local/include -I/usr/local/include/sasl" \ > AUXLIBS="-L/usr/local/lib -R/usr/local/lib -lssl -lcrypto -lsasl2" # make # make install
ここでインストール先などを質問されるが、すべてデフォルトで答える。
次に、Postfix を起動するためのスクリプトを作成する。
# vi /etc/init.d/postfix
内容は以下の通り。
#!/sbin/sh
case "$1" in
'start')
if [ -x /usr/sbin/postfix -a -f /etc/postfix/main.cf ]; then
/usr/sbin/postfix start
fi
;;
'stop')
if [ -x /usr/sbin/postfix ]; then
/usr/sbin/postfix stop
fi
;;
'restart')
$0 stop; $0 start
;;
*)
echo "Usage: $0 { start | stop | restart }"
exit 1
;;
esac
exit 0
実行権をつけてリンクを作成し、さらに sendmail が起動しないようにしておく。
# cd /etc # chmod 744 init.d/postfix # ln init.d/postfix rc0.d/K36postfix # ln init.d/postfix rc1.d/K36postfix # ln init.d/postfix rcS.d/K36postfix # ln init.d/postfix rc2.d/S88postfix # cd rc2.d # ./S88sendmail stop # mv S88sendmail _S88sendmail
Postfix の smtpd が Cyrus SASL 認証を利用する際の設定ファイル smtpd.conf を作成する。
# vi /usr/local/lib/sasl2/smtpd.conf
ここでは、Postfix が saslauthd に問い合わせるように設定を書いておく。 また、Outlook Express では PLAIN 認証しか行えないため、 ここで認証方式を限定する。
pwcheck_method: saslauthd mech_list: plain login
# vi /etc/postfix/main.cf
まず、基本的なメールサーバとしての設定を行う。このメールサーバの ホスト名は misaki.home、ドメイン名は home、IP アドレスは 192.168.0.x/24 である。
# 自ホストの FQDN myhostname = misaki.home # 自ドメイン名 mydomain = home # @以降の補完を行うときのドメイン名 myorigin = $myhostname # 自分宛として扱う To: のドメイン名。sendmail の local-host-names に相当 mydestination = $myhostname, localhost.$mydomain, $mydomain # 自分のネットワーク mynetworks = 192.168.0.0/24, 127.0.0.0/8 # 無条件にリレーを許可するサイトのリスト。sendmail の relay-domains に相当 relay_domains = $mydestination
次に、SMTP AUTH のための設定を施す。
# SASL 認証を有効化する。
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_mynetworks, permit_sasl_authenticated,
permit_auth_destination, reject
# 古い Outlook Express への互換性を持たせる
broken_sasl_auth_clients = yes
ここまで設定したら、saslauthd と postfix を起動する。
# /etc/init.d/saslauthd start # /etc/init.d/postfix start
この文書では Windows XP SP2 付属の Outlook Express 6 (6.00.2900.2180) を例にとって説明する。
Outlook Express を起動したら、「ツール」メニューから「アカウント」を選び、 「インターネット アカウント」画面を開く。

必要なアカウントが未作成ならば、右の「追加」ボタンから「メール」を選び、 作成する。アカウントが作成済みならば、「プロパティ」ボタンを押して アカウントのプロパティを開く。

アカウントのプロパティが開いたら、「サーバー」タブをクリックすると 上の画面になる。一番下の「このサーバーは認証が必要」にチェックを付け、 「設定」をクリックする。

このメールサーバでは SMTP 認証に OS アカウントを利用するため、 POP3 と同じユーザ名・パスワードを利用することになる。 (POP3 でも OS アカウントを利用していることが前提) このため、上の選択肢 (デフォルト) でよい。
設定が終了したら、OK ボタンですべての設定画面を閉じ、 「送受信」ボタンを押して、メールを送信できるかどうか試験する。 パケットキャプチャツール ethereal で SMTP セッションをダンプした結果は 以下のようになった。

赤矢印で示した箇所で、認証に成功していることがわかる。
サーバで openssl コマンドを利用して、秘密鍵を作成する。
# cd /usr/local/etc/ssl/certs # openssl genrsa -out server.key 1024 Generating RSA private key, 1024 bit long modulus ....++++++ ........++++++ e is 65537 (0x10001)
さらに、鍵と対になる証明書を作成する。
# openssl req -new -x509 -key server.key -out server.crt You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Aichi Locality Name (eg, city) []:Nagoya Organization Name (eg, company) [Internet Widgits Pty Ltd]:Oreno Kaisha Organizational Unit Name (eg, section) []:Oreno Busho Common Name (eg, YOUR name) []:Oresama Email Address []:ore@no.ie
証明書と秘密鍵を root 以外で読めないようにしておく。
# chmod 400 server.crt server.key
/etc/postfix/main.cf に SMTP over SSL 用の設定を追加する。
# サーバ証明書ファイルの指定 smtpd_tls_cert_file = /usr/local/etc/ssl/certs/server.crt # サーバ秘密鍵ファイルの指定 smtpd_tls_key_file = /usr/local/etc/ssl/certs/server.key # STARTTLS の有効化。465番ポートでの通信のみなら必要ない。 smtpd_use_tls = yes
Postfix を再起動し、クライアントから試験を行う。
# /etc/init.d/postfix restart
先ほどと同じように「ツール」メニューから「アカウント」を選択し、 アカウントのプロパティを開く。 「詳細設定」タブをクリックして以下の画面を出す。

「このサーバーはセキュリティで保護された接続 (SSL) が必要」 にチェックをつける。
これでクライアントの設定は完了。ただし、STARTTLS (TCP 25 番ポートを使う SMTP over SSL) を使う場合には、クライアントPCのアンチウィルスソフトに気をつけること。 AVG Antivirus の E-mail scanner を有効にしていると、 STARTTLS を使うことが出来ないので、無効化しておく。
この状態でメール送受信を行うと、 最初の1回だけ以下のようなダイアログが出る。

勝手に作成したサーバ証明書を利用しているため、このダイアログが出る。 ルート CA の署名を受けた証明書ならば出ないはず。 また、2回目以降は、 この証明書を認めたものとしてクライアントが動作するため、 このダイアログは出ない。
これでメールが送受信できれば、STARTTLS の設定は成功。 ethereal でセッションをダンプした結果は以下のようになる。

クライアントから STARTTLS コマンドが実行された後は セッションが暗号化され、読み取ることが出来ない。 前の章で設定した SMTP AUTH の認証も SSL 暗号化後に行われるため、 全く読み取れない。
/etc/postfix/master.cf の中に、465 番で待ち受けるための設定が コメントとして入っているので、先頭の # をはずす。
smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
2行目のほうも忘れずに # をはずすこと。
また、Solaris では /etc/services に smtps というサービスが 登録されていないので、編集して登録しておく。
# vi /etc/services smtps 465/tcp ←この行を追加
Postfix を再起動し、クライアントから試験を行う。
# /etc/init.d/postfix restart
再びアカウントのプロパティを開き、送信メールのポート番号を 465 番に変更する。

この状態でメールを送受信すると、 セッションの最初から暗号化された状態になる。 ethereal でセッションをダンプした結果は以下の通り。

完全に暗号化されている。