Pocketstudio.jp :: Logbook :: Linux :: Fedora Core 3のメモ
 Contributed at:   2004/11/20 (Sat) 00:31

■ /linux/FedoraCore3/ FedoraCore3 標準の Cyrus-imapd,POP3,Postfix によるメールサーバ構築方法(POP3,POP3S,IMAP,SMTPS,SMTP AUTH)


 FedoraCore ではメールサーバとして Cyrus-imapd がセットアップされています。MTA(Mail Transfer Agent=メール配達プログラム) は Postfix もセットアップされている状態。従来の Linux では MTA に sendmail が採用されているのですが、せっかく入っているので使えるようにしてみました。以下検証手順です。

 従来の sendmail を中心としたメール・サーバ管理は linux アカウントを常に意識する必要がありました。メールしか使わないユーザが居ても、useradd コマンドで linux 用のアカウントを発行する必要があったのです(qmail+vpopmail の場合は別ですが……)。

 Cyrus-imap を使えばメールのみ単体のアカウントとして扱う事が出来、実際に useradd でユーザを追加する必要がありません。そのため、セキュリティ的にも不用意にアカウントを作る必要が無く、望ましい状態といえるでしょう。また、標準で POP3, POP3S のメール受信暗号化, IMAP, APOP など各種対応しているほか、Postfix との組み合わせで SMTP AUTH(SASL) や SMTPS による送信暗号化(STARTTLS)も実現できます。
 これは、従来一般的に利用されていた POP Before SMTP 方式(メール受信を行うことで、受信者の IP アドレスを正しい利用者として判断し、一定期間の SMTP 送信(Relay)を許可する方法)に変わりうる仕組みとして今後注目を受けるような気がします。SMTP AUTH により、送信前に必ず受信しなくてはいけないという手間が省けるようになりますね。
 逆にデメリットとして、/var/spool/mail/ 配下にはメールが配送されなくなるため、lv や cat で直接メールボックスを読んでいる場合には面倒な事になります。また、これまでの .forward や .procmailrc はどうなるんだ?という部分も検証が必要と思います(使える段階まで持っていきましたが、細かくは検証していません……)。

 とりあえず、Fedora Core 3 にて Cyrus-imap + Postfix メールサーバ構築した手順を整理しておきます。


Cyrus-imapd + saslauthd 編

 Cyrus-imapd を起動するだけで、POP3, POP3S, IMAP サーバをサポートします。また、認証には通常のパスワード認証の他、SASL を使う事で APOP による暗号化されたパスワード認証も可能となります。
 まず、2つのデーモンを起動するような設定が必要です。
 起動は以下の通りです。
# /etc/init.d/cyrus-imapd start
# /etc/init.d/saslauthd start

 ところで saslauthd が起動していないのと認証できなくなるので要注意です。

Nov 19 21:43:03 sion imap[4884]: cannot connect to saslauthd server: No such file or directory
Nov 19 21:44:46 sion pop3[7113]: cannot connect to saslauthd server: No such file or directory
 このようなエラーが出たら saslauthd が起動しているかどうか確認してみましょう。自分はここでハマッてしまいました。サーバ起動時も saslauthd が起動するようにコマンドを実行しておきます。
# /sbin/chkconfig saslauthd on
# /sbin/chkconfig --list saslauthd
saslauthd       0:off   1:off   2:on    3:on    4:on    5:on    6:off
 同様に cyrus-imapd もサーバブート時に自動起動出来るようにしておきます。
# /sbin/chkconfig cyrus-imapd on
# /sbin/chkconfig --list cyrus-imapd
cyrus-imapd     0:off   1:off   2:on    3:on    4:on    5:on    6:off

メールアカウント(メールボックス)の作成

 メールボックスの作成のためには cyrus ユーザ権限で操作を行います(/etc/imapd.conf で “admins: cyrus” の記述があるため。もちろん、他のユーザに割り当ててもいいとおもいます)。
 初期状態で cyrus にはパスワードが与えられていないので【 passwd 】コマンドで適当なパスワードを設定しておきます。そのあと、メールボックスの作成コマンドを実行します。実行しないと次のようなメールボックスが見つからないよ〜というエラーが出てしまいます。
Nov 19 13:09:49 sion pop3[4736]: login: dhcp102.internal [192.168.11.102] zem3 plaintext User loggedin
Nov 19 13:09:52 sion pop3[4736]: Unable to locate maildrop for zem3
 さて、cyrus パスワードは適当に決めます。
# passwd cyrus
Changing password for user cyrus.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
 次に cyrus-imapd の管理コマンド cyradm を使いメールボックスを作成します。
# /usr/lib/cyrus-imapd/cyradm --user cyrus localhost
IMAP Password:
	sion> cm user.ユーザ名
 ”sion” と出ているのは自分のホスト名です。各々のサーバで異なると思います。
 ホスト名> と入力する所(プロンプト)が出たら【 cm user.ユーザ名 】の書式でメールボックスを作成します。たとえば info というアカウントが欲しい場合は【 cm user.info 】です。

 この段階でメーラーでテストすると、通常のパスワード認証で POP3, POP3S, IMAP が利用出来るようになります。

 なお、メールボックスの場所は /var/spool/mail 配下や /home/アカウント名 配下ではなく【 /var/spool/imap/z/user/アカウント名 】となります(/etc/imapd.confの調整で他の場所にすることもできるようです。
 

Postfix 側で Cyrus-imap 向けの配送設定をする

 /var/spool/mail/ 配下のスプールされているメールは読むことが出来ません。Postfix は /var/spool/mail を水に /var/spool/imap (/etc/imapd.conf で定義された場所)を見るためです。
 また、Postfix も標準のままだと /var/spool/imap にメールを送ってくれません。
 そのため、postfix の設定ファイル【 /etc/postfix/master.cf】の書き換えをまず行います。120 行目を赤字部分に書き換えます。
user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}
 それから 【 /etc/postfix/main.cf 】では次の2行を追加します。
mailbox_transport = cyrus
fallback_transport = cyrus
 その他 inet_interfaces=all を追加したり mynetworks_style=subnet や mynetworks = 192.168.11.0/24 等といった基本的な postfix の設定は当然必要ですが、割愛させて頂きます……。  
 あとは設定を反映させるために postfix の再起動です。
# /etc/init.d/postfix restart
Shutting down postfix:                                     [  OK  ]
Starting postfix:                                          [  OK  ] 
 これでメール配送の準備は終わりました。

APOP 用のパスワードを設定するには

# /usr/sbin/saslpasswd2 ユーザ名
Password:
Again (for verification):
 saslpasswd2 コマンドを実行することで /etc/sasldb2 ファイルが作成されます。Cyrus-imapd や postfix の SASL 認証時には、このファイルを見に来ます。
 コマンド実行直後では、saslauthd から /etc/sasldb2 ファイルを読むことが出来ませんでした。/var/log/messages を見ると【 Permission denied 】(権限無し)の文字が。
Nov 19 12:25:13 sion pop3[4451]: unable to open Berkeley db /etc/sasldb2: Permission denied
Nov 19 12:25:13 sion pop3[4451]: could not find password
 よく見ると、ファイルのパーミッションや所有者情報が原因でした。
-rw-r-----  1 root root 12288 11月 19 12:24 /etc/sasldb2
 ls で見てみると、所有者が root でパーミッションが 640(rw-r——-)。このままでは root しか読み込めません。これはグループを mail に変える事が適切です(当初は chmod o+r /etc/sasldb2 などと実行してましたが、一般ユーザからもパスワード情報が見えてしまうおそれ=コマンド strings /etc/sasldb2 でパスワード情報が推測されてしまうのでボツでした。)
 imap サーバは UID 76 の cyrus というユーザ権限で実行します。所属グループは GID 12 の mail。ここには初期状態から postfix も含まれています。
[root@sion conf]# cat /etc/passwd| grep cyrus
cyrus:x:76:12:Cyrus IMAP Server:/var/lib/imap:/bin/bash
[root@sion conf]# cat /etc/group| grep 12
mail:x:12:mail,postfix
 なので、/etc/sasldb2 のグループは mail が適切です。
# chgrp mail /etc/sasldb2
# ls -al /etc/sasldb2
-rw-r-----  1 root mail 12288 11月 19 20:02 /etc/sasldb2

メール送信(SMTP AUTH)について

 master.cf の中で以下の記述を追加します。
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = ドメイン名
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
 「ドメイン名」には自分のドメイン名を指定します。設定が終わったら postfix 再起動で設定が有効になります。

 あとは、これまでの手順で SASL の設定が終わっていたら、SMTP AUTH 認証もそのまま使えます。
 Becky! を例にすると、『メールボックスの設定』から『詳細』を選び、画面右上の『 SMTP 認証』 と『 CRAM-MD5 』にチェックを入れ、ユーザ ID には自分の ID、パスワードには SASL で設定した APOP と同じものを指定することが出来ます。『 LOGIN 』だけにチェックを入れると、linux アカウントの ID とパスワードで認証できます(設定によっては LOGIN だけの方が楽ですが、ログイン用 ID とメール認証パスワードを分けることで、セキュリティ上は比較して安全になると思います。その分、煩雑になりますけどね……)。
 SMTP AUTH をつかわないと『 544 <アドレス>: Relay access denied 』とメールの不正な中継と判断されて、送信できなくなってしまいます。

 ところで、パスワードが適切に設定してあるはずなの認証が出来ない「no secret in databases」と出る場合があります。これは saslpasswd2 で -u ドメイン名(master.cf でsmtpd_sasl_local_domain で指定したドメイン名)の引数をつけてパスワードを設定しなおすと使えるようになりました。

Postfix 自動起動設定-sendmail と入れ替え

 初期状態では Sendmail が起動しています。Postfix へ入れ替える手順は以下の通りになります。
# /sbin/chkconfig --list postfix
サービスpostfixはchkconfigをサポートしますが実行レベルで参照されていません (run 'chkconfig --add postfix')
 ……のように、初期状態では無視されてますので、
# /sbin/chkconfig --add postfix
# /sbin/chkconfig postfix on
# /sbin/chkconfig sendmail off
# mv /usr/sbin/sendmail /usr/sbin/sendmail.org
# ln -s /usr/sbin/sendmail.postfix /usr/sbin/sendmail
 このようにして自動起動、sendmail 停止・差し替えを行います。

SMTPS(STARTTSL)による送信

 STARTTSL をポート 465 番経由で Becky! から送信できる事を確認しています。
 /etc/postfix/master.cf の smtpd のコメントを外します。
smtps     inet  n       -       n       -       -       smtpd
 /etc/postfix/main.cf には認証用の設定を追記します(Cyrus-imap 用のファイルを流用します)
smtpd_tls_cert_file = /usr/share/ssl/certs/cyrus-imapd.pem
smtpd_tls_key_file = /usr/share/ssl/certs/cyrus-imapd.pem
smtpd_use_tls = yes

 この3行を追加して postfix 再起動で有効になります。
 Becky 側では【 ツール 】→【 メールボックスの設定 】→【 基本設定 】で SMTPS にチェックを入れます。『ポート番号をSSL標準の 465 に変更しますか?』と尋ねますので、ここでは【 はい 】を選びます。
 次に【 詳細 】の見出しを選び、画面真ん中左の【 SSL/TLS 関連 】の『 層屎尿(T) 』の部分を【 STARTTLS 】にし、【 証明書を検証しない 】にチェックを入れます。

 以上のような手順を踏むことで、一応メールサーバとして使えると思います。
 不備な点や分かりにくい点がありましたらご指摘ください

 ……結構面倒なので、実際の運用には qmail+qmailadmin や、/var/spool/mail を参照する qpopper + dracd + sendmail による POP Before SMTP のほうがお手軽かもしれません……。


参考URL一覧
Sendmailによるセキュアメールサーバ構築
http://www.stackasterisk.jp/tech/systemConstruction/sendmailSec02_02.jsp

Courier-IMAPを使う
http://www.t12.jp/~ryuta/misclab/debian/tp365.html#label-7

PostfixでTLS
http://bluecoara.net/servers/postfix/tls.phtml

[分類 /linux/FedoraCore3 ] 固定リンク