sendmail で IPv6 + TLS + SMTP-AUTH + POP3S + IMAPS

Last Update: 2004/09/27 12:16:22

  1. めざすもの
  2. OS
  3. IPv6
  4. SMTP-AUTH
  5. TLS
  6. POP3とIMAP
  7. POP3SとIMAPS
  8. さいごに

めざすもの

sendmailを使って出来るだけ暗号化して覗きみられないように通信しようとする メールサーバを作る。IPv6にも当然対応。

間違いや、こうした方がいいぞなどあれば教えてください。

OS

OSは FreeBSD 4.7-RELEASE-p2。

IPv6

freebsd.mc を ホスト名.mc にして

-dnl DAEMON_OPTIONS(`Name=IPv4, Family=inet')
-dnl DAEMON_OPTIONS(`Name=IPv6, Family=inet6')
+DAEMON_OPTIONS(`Name=IPv4, Family=inet')
+DAEMON_OPTIONS(`Name=IPv6, Family=inet6')

で /etc/mail で make && make install する。

起動し直して telnet localhost smtp で ::1 にアクセスしてみます。 sockstat などでも確認してみます。

StackProtection のパッチを当ててると IPv6サポートがコメントアウト されているので、make world し直しなんてことあるかも(^^;

SMTP-AUTH

ホスト名.mc に

define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5')
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5')

を付けてみる。 /etc/mail で make && make install して再起動すると、

Warning: Option: AuthMechanisms requires SASL support (-DSASL)

とかいわれます。標準の sendmail では出来ないみたいです。

そこで、ports の mail/sendmail-sasl を make してみます。 security/cyrus-sasl2 がインストールされて、 SASL2 と TLS が有効になり、 make install して /etc/mail/mailer.conf を /usr/local/sbin/sendmail を 指すようにして再起動します。

telnet localhost smtp して、EHLO localhost すると 250-AUTH DIGEST-MD5 CRAM-MD5 が増えてます。 これで、SMTP-AUTH を利用できる sendmail は用意できました。

次に security/cyrus-sasl2 でインストールされた、saslauthd を動作させます。 /usr/local/etc/rc.d/saslauthd.sh があるので start させると、 -a pam 付きで起動します。

利用するユーザの登録がされていないのでユーザの登録をします。

# saslpasswd2 -c user

で、登録したユーザで smtp-auth を利用してみるとうまくいく筈です。

ここで、送信先のメールサーバが TLS に対応していれば、sendmail-sasl で TLS対応にはなっているので、TLS を使ってメールを転送します。 ただし、この時点ではまだ TLS でメールを受けることは出来ません。

TLS

送信先のサーバが TLS に対応していれば、送ることはすでに出来ます。 ここでは TLS で受信出来るようにしてみます。 sendmailにおけるTLS (FreeBSD PRESS No.6) が詳しいです。

証明書を作って、それを利用するように ホスト名.mc に書きます。

# openssl req -new -x509 -nodes -out cert.pem
define(`confCACERT_PATH', `MAIL_SETTINGS_DIR`'certs')
define(`confCACERT', `confCACERT_PATH/cert.pem')
define(`confSERVER_CERT', `confCACERT_PATH/cert.pem')
define(`confSERVER_KEY', `confCACERT_PATH/privkey.pem')

sendmail.cf を更新して再起動します。 telnet localhost smtp で EHLO localhost すると、 250-STARTTLS が現れます。これで TLS で受けることは出来ます。

クライアント認証等する場合は sendmailにおけるTLS (FreeBSD PRESS No.6) を参考に証明書を作って試してください。

POP3とIMAP

ここでは cyrus-imapd の 2.1.10 を利用します。 ports の mail/cyrus-imapd2 で make && make install します。 IPv6パッチは当たるようになってます。 インストールしたら、/usr/local/cyrus/bin/mkimap を動かします。 これで準備完了ですので、/usr/local/etc/rc.d/imapd.sh.sample を sh /usr/local/etc/rc.d/imapd.sh start として動かします。 /var/log/messages 等を見てエラーがないか確認します。

sasl のユーザは SMTP-AUTH で登録したので、 同じユーザを pop3 や imap で利用するために登録します。 登録するために cyradm で ログイン して作業します。 (この時に /usr/local/etc/imapd.conf の admins に 作業するユーザを書いておく必要がありそうなんだけど なんだか良く分からないうちに出来てしまったので要調査) <user> はログインしているユーザ。

% cyradm localhost
Password: ******
localhost> lm
localhost> cm user.<user>
localhost> lm
INBOX (\HasChildren)
localhost> 

他のユーザも作ってみます。

% cyradm localhost
Password: ******
localhost> lm
INBOX (\HasChildren)
localhost> cm user.hoge
localhost> lm
INBOX (\HasChildren)          user.hoge (\HasNoChildren)
localhost> 

hoge さんは sasl に登録していないので登録します。

# saslpasswd2 -c hoge
Password: ****
Again (for verification): ****

これで POP3 と IMAP でアクセス出来るようになります。 認証出来るか確かめてください。

POP3 と IMAP でアクセス出来るようになっても、 他のマシンからメールを受けられるようしないと メールは来ないのでメールを受信して cyrus-imap の配下に 配送されるようにします。

/usr/local/share/doc/cyrus-imapd2 に cyrusv2.mc というファイルが あるので、これの必要な部分を /etc/mail/ホスト名.mc に書きます。

@@ -97,5 +97,16 @@
 define(`confSERVER_CERT', `confCACERT_PATH/cert.pem')
 define(`confSERVER_KEY', `confCACERT_PATH/privkey.pem')
 
+define(`confLOCAL_MAILER', `cyrus')
+
 MAILER(local)
 MAILER(smtp)
+
+MAILER_DEFINITIONS
+Mcyrus,                P=[IPC], F=lsDFMnqA@/:|SmXz, E=\r\n,
+               S=EnvFromL, R=EnvToL/HdrToL, T=DNS/RFC822/X-Unix, 
+               A=FILE /var/imap/socket/lmtp
+
+LOCAL_RULE_0
+Rbb + $+ < @ $=w . >   $#cyrus $: + $1
+

/etc/mail で make && make install して sendmail を再起動します。 これでメールが受信出来るようになって、POP3、IMAP で見ることが出来ます。

副作用か、${HOME}/.forward が無視されるようになった、、、、

POP3SとIMAPS

次に POP3とIMAP を SSL化してみます。 cyrus-imapd2 は TLSにも対応しているようです。

/usr/local/etc/imapd.conf に tls_ で始まる項目がいくつかかります。 ここに証明書がある位置をしめしてやるとうまく行くようです。 sendmail を TLS に対応した時の証明書を使ってやってみます。

/etc/mail/certs/ に cert.pem と privkey.pem があるのでそれを書いてみます。 そうすると、/etc/mail/certs/ は root からしか見えなくしているので、 cyrus の権限で動いているものからは見えません。 ここでは、パーミッションをゴニョゴニョして どちらからも見えるようにしてみました。 ただし、どういう方法がいいのかは調査が必要です。

再起動すると、POP3S と IMAPS でアクセス出来るようになります。 STARTTLS でもうまくいくようになります。

さいごに

あまりよく分かっていないところがあるので、もう少し研究が必要ですが、 sendmail を利用して IPv6 + TLS + SMTP-AUTH + POP3S + IMAPS でのメール環境が出来るようです。 cyrus-imapd2 は APOPも使えてなかなかいいかな。

クライアントは途中で sylpheed の IMAP が CRAM-MD5 での認証に対応してない? のに気付いたのだけど TLS があるからいいのかな?