Fedora Core 4 付属の sendmail で SMTPS と SMTP AUTH(SMTP認証)に対応させる方法

 ここではよりセキュア(安全)なサーバ運用のために、SMTP AUTH(SMTP認証) によるユーザ認証&メール送信許可、SMTPS による安全な通信(STARTTLS)をとりあげます。なお、認証として SASL(Simple Authentication and Security Layer) を用います。

1. Fedora Core 4 の sendmail パッケージ

 Fedora Core 4 付属の sendmail パッケージでは、特に別のプログラムのセットアップをしたり複雑な設定を行う必要はありません(ただし openssl パッケージは必須です)。

 手順としては sendmail の設定(sendmail.mc)→認証鍵の作成→SASL認証の設定という流れで進みます。

2. sendmail 側の設定編

 まずは sendmail 側の設定です。初期状態では SMTP 認証(SMTP AUTH) に対応していません。sendmail.mc の編集を行い、CRAM-MD5 方式での暗号化された認証を行うことを目的とします。

2-1. sendmail.mc の編集

 sendmail の設定ファイル /etc/mail/sendmail.mc を開きます。

 ファイルを開いたら 48, 49 行目を確認します。初期状態では次のようにコメントされています。

dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

 sendmail.mc(正確には M4 マクロ)では dnl がコメント=無効にするという意味があります。つまり SMTP 認証(SMTP AUTH) の記述が無効になっています。有効にするにはコメントを消します。

TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

 引き続き、証明書(認証時に用います)に関する設定も有効にします。56 〜 59 行目にかけて次のような行があります。

dnl define(`confCACERT_PATH',`/etc/pki/tls/certs')
dnl define(`confCACERT',`/etc/pki/tls/certs/ca-bundle.crt')
dnl define(`confSERVER_CERT',`/etc/pki/tls/certs/sendmail.pem')
dnl define(`confSERVER_KEY',`/etc/pki/tls/certs/sendmail.pem')

 ここでも無効になっていますので、コメントアウト(コメント状態を解除すること)をします。

define(`confCACERT_PATH',`/etc/pki/tls/certs')
define(`confCACERT',`/etc/pki/tls/certs/ca-bundle.crt')
define(`confSERVER_CERT',`/etc/pki/tls/certs/sendmail.pem')
define(`confSERVER_KEY',`/etc/pki/tls/certs/sendmail.pem')

(補足:sendmail.mc では認証鍵の作成を /usr/share/ssl/ 配下で〜と記述されていますが、誤りです。Fedora Core 4 からは /usr/sha/ssl は /etc/pki/tls ディレクトリに置き換えられました)

 引き続き 130 行目尾を確認します。

dnl DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl

 初期状態では、このようにコメントされている状態ですが、こちらもコメントアウトして、有効になるようにします。

DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl

 ちなみに Port=smtps とは SMTPS 通信用の専用ポート TCP 465 番ポートの意味です。

2-2. sendmail.cf の作成

 sendmail.mc で下準備が終わったあとは、新しい sendmail.cf (sendmailの設定ファイルです)を作成しなおします。

 作業前には念のため sendmail.cf のバックアップをとっておいた方が良いでしょう。もしトラブルが起こっても、元の sendmail.cf に戻して sendmail を再起動することで復旧できるからです。

# cp -p /etc/mail/senndmail.cf /etc/mail/sendmail.cf.org

 バックアップなど準備が整ったら、次のコマンドで sendmail.cf を構築します。

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

以上で sendmail 側の設定は終わりました。

3. SSL 証明書の設定編

 SMTP 認証 (SMTP AUTH) では「正しい利用者から通信がなされているか」「通信を暗号化する」この2点を確実なものとするために、OpenSSL のライブラリを用いた SSL 認証機能を利用します。

3-1. sendmail.pem の作成

 sendmail が SMTP 認証(SMTP AUTH)に用いるための専用の公開鍵・秘密鍵の組み合わせを作成します(鍵ってなに?という場合、とりあえず認証に必要となる"鍵"そのもの、と考えても OK です。詳しくは OpenSSL の解説サイトや書籍をご覧下さい)。

 ディレクトリを移動します。

# cd /etc/pki/tls/certs

 もしディレクトリがない場合は oepnssl パッケージのセットアップが必要です(yum install openssl でパッケージのインストールが可能です)。  次に、実際に鍵の作成を行います。

# make sendmail.pem

 コマンドを実行すると、自動で暗号ファイルの作成などの処理が行われます。

umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:1024 -keyout $PEM1 -nodes -x509 -days  365 -out $PEM2 -set_serial 0 ; \
cat $PEM1 >  sendmail.pem ; \
echo ""    >> sendmail.pem ; \
cat $PEM2 >> sendmail.pem ; \
rm -f $PEM1 $PEM2
Generating a 1024 bit RSA private key
....++++++
......................................++++++
writing new private key to '/tmp/openssl.hg9938'
-----
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) [GB]:

 ここからは会社・個人に応じた情報を入力していくことになります。1つ1つ順を追って入力していきます。

Country Name (2 letter code) [GB]:

 まずは国名です。日本在住なので【 JP 】(Japan)と入力します。

Country Name (2 letter code) [GB]:JP

 次は州名・都道府県名の入力です。

State or Province Name (full name) [Berkshire]:

 私の場合は富山県在住なので【 Toyama-Ken 】と入力します。あなたの住所にあわせて記入してください。なお記入はアルファベット(ローマ字)です。

State or Province Name (full name) [Berkshire]:Toyama-Ken

 この次は市区町村名です。

Locality Name (eg, city) [Newbury]:

 私の場合、滑川市という所に住んでいるので【 Namerikawa-Shi 】と入力します。こちらも自分の環境に合わせて適当に書いてください。

Locality Name (eg, city) [Newbury]:Namerikawa-Shi

 次は組織名の入力です。

Organization Name (eg, company) [My Company Ltd]:

 普通は会社名の入力で良いとおもうのですが、私のような個人は適当に名前を付けることにします。というわけで【 Pocketstudio.jp 】と入力します。

Organization Name (eg, company) [My Company Ltd]:Pocketstudio.jp

 次は部署名です。

Organizational Unit Name (eg, section) []:

 特に部署名が無い場合は空白でも構いません。私は適当に【 Development Section 】と書いてみました。

Organizational Unit Name (eg, section) []:Development Section

 さて、次はちょっと重要です。メールサーバのホスト名を入力します。

Common Name (eg, your name or your server's hostname) []:

 私が運用しているメールサーバは【 sion.pocketstudio.jp 】なので、そのように入力します。ここでは正しくホスト名を入力します。一般的な所では mail.xxxx.jp の様な感じでしょうか。

Common Name (eg, your name or your server's hostname) []:sion.pocketstudio.jp

 最後にメールアドレスです。

Email Address []:

 ここには私のアドレス【 zem@pocketstudio.jp 】を入力します。空白でも構いません。

Email Address []:zem@pocketstudio.jp

 以上の流れで証明書の作成は終わりました。

3-2. sendmail.pem の確認

 ls コマンドで certs ディレクトリ内に sendmail.pem というファイルが新規作成されている事が分かります。

$ ls -l sendmail.pem
-rw-------  1 root root 2332  7月  1 18:50 sendmail.pem

 この sendmail.pam の中に先ほど入力した所在地・ホスト名などの情報が暗号化されて入っているもの、と考えて頂いて差し支えありません。

cat sendmail.pem を実行すると【RSA PRIVATE KEY】と【CERTIFICATE】2つの項目が作成されている事が確認できます。

 なお、この作業で用いた他にも make のオプションがあります。

 詳しく確認したい場合は次のコマンドでどうぞ。

# make -C /etc/pki/tls/certs usage

3-3. sendmail デーモンの再起動

 さて、これで証明書の準備が終わりました。次に sendmail を再起動して、SMTP 認証(SMTP AUTH)やこれら証明書を有効にします。

# /sbin/service sendmail restart
sendmail を停止中:                                         [  OK  ]
sm-client を停止中:                                        [  OK  ]
sendmail を起動中:                                         [  OK  ]
sm-client を起動中:                                        [  OK  ]

 通常であれば問題なく再起動できるのですが、もしエラーがでるようであれば /etc/mail/sendmail.mc の記述が適切かどうか疑ってみるほうが確実です。

 さて、まだこの段階では SMTP 認証(SMTP AUTH)の設定は完了していません。試しにメールソフトで SMTP 認証をテストしてみても、次のようなエラーがでて弾かれます。つまり、送信は拒否されます。

reject=550 5.7.1 <zem@pocketstudio.jp>... Relaying denied. Proper authentication required.

 これはエラー 5.7.1 メール中継を拒否しました。適切な認証が必要です、という意味です。

4.SASL(Simple Authentication and Security Layer)認証の設定

 安全に SMTP 認証を行うため、ここでは SASL を用います。SASL は Simple Authentication and Security Layer の略で単純認証とセキュリティ層、という仕組みを用います。簡単に言えば SASL という認証用のデータベースがあって、Linux ユーザの認証とは別に SASL 独自の仕組みでユーザ認証を行うためのものです。

4-1. SASL 用パスワードの設定

 設定には saslpasswd2 コマンドを用います。

 コマンドは【 /usr/sbin/saslpasswd2 -u ホスト名 -c ID名 】の形式で記述します。-u の後のホスト名は sendmail が認識している自分自身のホスト名でなくてはいけません。

 以下は sion.pocketstudio.jp のサーバで zem というユーザに対してパスワードを設定する例です。

# /usr/sbin/saslpasswd2 -u sion.pocketstudio.jp zem
Password:
Again (for verification):

 コマンドを入力すると、パスワードを2回入力して設定は終わりです。

 以上で設定は完了です。ユーザ事に個別に SASL ID とパスワードを発行しても構いませんし、サーバの利用者で共通の ID とパスワードを用いても良いとおもいます(ただし、その場合は定期的にパスワードを変更するなど、安全面での注意が必要なので怠りなく……)

5. Linux ログイン ID とパスワードによる SMTP 認証

 セキュリティ的にあまりおすすめは出来ませんが、Linux のログイン ID とパスワードを用いた SMTP 認証を行うことも可能です。Becky! では SMTP 認証の LOGIN にチェックを入れた場合に該当します。Becky! 上では linux ユーザの ID とパスワードをそのまま入力します。

 また saslauthd も起動が必要になります。

# /sbin/service saslauthd start
saslauthd を起動中:                                        [  OK  ]

 サーバ再起動後も自動起動するように、chkconfig で起動の設定をさせておきます。

# /sbin/chkconfig saslauthd on

 --list オプションをつけると、ただしく on になっている事が確認できます。

# /sbin/chkconfig --list saslauthd
saslauthd       0:off   1:off   2:on    3:on    4:on    5:on    6:off

※個人的にはあまり平文での認証はおすすめ出来ません。せっかく暗号化して送信できるように設定しているのですから、SASL を使った CRAM-MD5 認証を利用すべきだと思うのです……。

6. 送信テスト

6-1. Becky! を用いた SMTP 認証(CRAM-MD5)

 Becky! のメニューにある【 ツール(T) 】→【 メールボックスの設定(M)… 】で設定画面を開きます。

 『 基本設定 』のタブ(見出し)では【 SMTPS 】にチェックを入れます。『ポート番号をSSL標準の 465 に変更しますか?』と聞いてきますので【 はい(Y) 】を選びます。

 『 詳細 』のタブ(見出し) では、まず、『 SSL/TLS 関連』の項目の【 証明書を検証しない(S) 】のチェックを入れます。認証方法は【 デフォルト 】にします。

 【 SMTP 認証 】にチェックを入れると、送信時に SMTP 認証を行います。

(【 LOGIN 】にチェックを入れた場合は Linux サーバのログイン ID とパスワードで認証します。平文での認証です。せっかく使えるので、暗号化できる CRAM-MD5 認証を使いましょう。ここでのユーザ ID とパスワードは先ほど saslpasswd2 コマンドによって指定した ID とパスワードです。ログイン用とは違うので混同しないようにしておく必要があります。 )

 送信に成功すると次のようなログが /var/log/maillog に残ります。

sion sendmail[10384]: AUTH=server, relay=dhcp102 [192.168.11.102], authid=zem, mech=CRAM-MD5, bits=0

 また SMTPS で暗号化されている事は、同じくログが daemon=MTA から daemon=TLSMTA と変わっている事からも確認できます。

6-2. Outlook Express を用いた SMTP 認証(PLAIN)

 Outlook Express を使うと MD5 を用いた暗号化はうまく動作しないようです(現在色々検証中です……)。ただ、送信(SMTPS)は対応しています。この点については、APOP を用いた POP Before SMTP 認証を可能にすることで、SMTP Authを行わないことで安全な通信を実現させると思います。

 ひとまず、Outlook Express で使うには……前項「Linux ログイン ID とパスワードによる SMTP 認証」の設定が必要です。

 メニューの【ツール(T)】→【アカウント(A)】を選びます。メールサーバを選択して【プロパティ(P)】を押します。

 『 サーバー 』のタブ(見出し)を押し、画面下のほうにある【 このサーバーは認証が必要(V) 】にチェックを入れます。それから横の方にある【 設定(E)... 】ボタンを押します。

 『 送信メール サーバー 』という画面が開きます。【 次のアカウントとパスワードでログオンする(O) 】を選びます。アカウント名・パスワードは Linux サーバのアカウント情報です。  再びプロパティに戻り【 詳細設定 】のタブ(見出し)をクリックします。

 『送信メール(SMTP)』の項目は 25 ですが【 465 】に変更します。あわせて【 このサーバーはセキュリティで保護された接続(SSL)が必要(Q) 】にもチェックを入れます。

 これでメールの送信テストを行います。初回送信時には『暗号化した電子メール接続を検出しました。』という画面が開きます。【 今後この警告を表示しない(D) 】にチェックを入れ、【 OK 】を押します。

7. エラー対策一覧

【reject=550 5.7.1 … Relaying denied. Proper authentication required.】このメッセージがメールソフト(MUA)に表示された場合、何らかの方法で認証が失敗しています。失敗を確認するには /var/log/maillog もしくは /var/log/messages を確認します。

  • 「sion sendmail[4688]: incorrect digest response」

    この場合は純粋にログイン認証に失敗しています。saslpasswd2 コマンドで指定された パスワードが間違いないかどうか、確認することをおすすめします。

  • 「sion sendmail[4299]: no secret in database」

    /etc/sasldb2 ファイル内に指定されている ID 情報が無いときに出ます。saslpasswd2 コマンドの引数 -u で指定されたドメインが適切かどうか、再確認する必要があります。


 一般的なプロバイダでは POP Before SMTP 認証(メール受信による認証を行うことで、サーバの正しい利用者かどうか判別し、一時的に送信を許可する方法)がとられていると思いますが、今後は SMTP AUTH 認証も比較的設定が簡単な事から普及していくのではないかと思います。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: Fri, 01 Jul 2005 20:04:17 JST (6873d)