Postfix で SMTP AUTH, SMTP over SSL

Misc 階層に戻る  |  ホームに戻る

1. 前置き

この文書では、Solaris 上で Postfix, OpenSSL, Cyrus SASL の組み合わせ を使って SMTP AUTH と SMTP over SSL 機能を使えるメールサーバを構築することを目的とする。 Cyrus SASL の認証データベースには OS の /etc/passwd (shadow) を利用し、 sasldb は使わない。

また、クライアントプログラムとしては PLAIN 認証のみを使える Outlook Express 5/6 を想定する。

2. 各プログラムの入手とコンパイル/インストール

環境は Solaris 8 10/01、コンパイラは gcc 2.95.3 を使用する。

1. openssl-0.9.7e

# 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

2. cyrus-sasl-2.1.10

# 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

3. postfix-2.1.5

最初に 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

3. SMTP AUTH の設定

1. Cyrus SASL 側の設定

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

2. Postfix 側の設定

# 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

3. クライアント側の設定

この文書では Windows XP SP2 付属の Outlook Express 6 (6.00.2900.2180) を例にとって説明する。

Outlook Express を起動したら、「ツール」メニューから「アカウント」を選び、 「インターネット アカウント」画面を開く。

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

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

このメールサーバでは SMTP 認証に OS アカウントを利用するため、 POP3 と同じユーザ名・パスワードを利用することになる。 (POP3 でも OS アカウントを利用していることが前提) このため、上の選択肢 (デフォルト) でよい。

設定が終了したら、OK ボタンですべての設定画面を閉じ、 「送受信」ボタンを押して、メールを送信できるかどうか試験する。 パケットキャプチャツール ethereal で SMTP セッションをダンプした結果は 以下のようになった。

赤矢印で示した箇所で、認証に成功していることがわかる。

4. SMTP over SSL の設定

1. SSL 鍵と証明書の作成

サーバで 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

2. Postfix の設定(1) STARTTLS

/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

3. クライアントの設定(1) STARTTLS

先ほどと同じように「ツール」メニューから「アカウント」を選択し、 アカウントのプロパティを開く。 「詳細設定」タブをクリックして以下の画面を出す。

「このサーバーはセキュリティで保護された接続 (SSL) が必要」 にチェックをつける。

これでクライアントの設定は完了。ただし、STARTTLS (TCP 25 番ポートを使う SMTP over SSL) を使う場合には、クライアントPCのアンチウィルスソフトに気をつけること。 AVG Antivirus の E-mail scanner を有効にしていると、 STARTTLS を使うことが出来ないので、無効化しておく。

この状態でメール送受信を行うと、 最初の1回だけ以下のようなダイアログが出る。

勝手に作成したサーバ証明書を利用しているため、このダイアログが出る。 ルート CA の署名を受けた証明書ならば出ないはず。 また、2回目以降は、 この証明書を認めたものとしてクライアントが動作するため、 このダイアログは出ない。

これでメールが送受信できれば、STARTTLS の設定は成功。 ethereal でセッションをダンプした結果は以下のようになる。

クライアントから STARTTLS コマンドが実行された後は セッションが暗号化され、読み取ることが出来ない。 前の章で設定した SMTP AUTH の認証も SSL 暗号化後に行われるため、 全く読み取れない。

4. Postfix の設定(2) TCP 465 番ポートを利用

/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

5. クライアントの設定(2) TCP 465 番ポートを利用

再びアカウントのプロパティを開き、送信メールのポート番号を 465 番に変更する。

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

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

Misc 階層に戻る  |  ホームに戻る

Copyright (C) 2005
Last modified: Wed Aug 16 16:51:17 JST 2006
You are the 140003 th visitor.