Debian(lenny,squeeze)にpostfix,courier-popをインストールし、基本的なメールシステムを構築する。
1.基本方針
- SMTP AUTH対応
- Maildir使用
- POPS対応
- SMTPS対応
- Submission Port対応
- Submission PortでのSTARTTLS対応
- POPとSMTPの認証モジュールは同一のものを使用
2.courier-authdaemonのインストール設定
POPとSMTPの認証モジュールは同一のものを使用したかったのでcourier-authdaemonを使用する。これはcourier-pop,postfix両方で使用できる。
・courier-authdaemonのインストール
# aptitude install courier-authdaemon
・authdaemonrcの設定
# cat /etc/courier/authdaemonrc
# authuserdbを使えばシステムアカウントとメールアカウントを
# 分ける事ができる。今回はシステムアカウントを使用。
#authmodulelist="authuserdb"
authmodulelist="authpam"
・・・
# chrootしたpostfixからも見えるようにしようとしたがこのオプションは無効らしい。
# 本当はこうしたい↓
# authdaemonvar=/var/spool/postfix/var/run/courier/authdaemon
# 少々強引だが/var/spool/postfix/var/run/courierのシンボリックリンクを作成することで対応することに。。
authdaemonvar=/var/run/courier/authdaemon
・courier-authdaemonの再起動
# /etc/init.d/courier-authdaemon restart
3.アカウント追加
・maildirmakeを使えるようcourier-baseインストール
# aptitude install courier-base
・ユーザ作成時にMaildirできるようにしておく
# /usr/bin/maildirmake /etc/skel/Maildir
・ユーザ追加
# adduser --shell /bin/false hoge
参考:authmodulelist=”authuserdb”の場合
今回はauthdaemonrcでauthmodulelist=”authpam”を指定したので関係はないが、参考までにauthmodulelist=”authuserdb”を指定した場合のユーザ追加例を以下に記す。authuserdbを指定した場合は、システムアカウントとメールアカウントを分けることが可能。
・メール用アカウント追加
# adduser -u 1010 --disabled-password --disabled-login test
・userdb作成
# userdb test set home=/home/test mail=/home/test/Maildir uid=1010 gid=1010
※/etc/courier/userdbが作成される。
・パスワード設定
# userdbpw | userdb test set pop3pw
# userdbpw | userdb test set smtppw
※/etc/courier/userdbの該当箇所にパスワードが設定される。
・DB形式に変換
# makeuserdb
・アカウント削除
# userdb test del
3.courier-popインストール
# aptitude install courier-pop courier-pop-ssl
認証の設定は終わっているので、 courier-pop courier-pop-sslをインストールすればPOPとPOP-SSL(POPS)が使用できるようになる。
4.GUI設定
GUI設定もある模様。
# aptitude install courier-webadmin
一部使用できない機能がある?
また、ほとんど有用な機能がないので削除。。。
# aptitude purge courier-webadmin
5.Postfixインストール
・libsasl2のインストール。これがないとSMTP認証できない。
# aptitude install libsasl2-modules
・Postfixインストール
# aptitude install postfix
6.Postfix設定
・ローカルから送信時のFromで使用されるドメインを指定
# cat /etc/mailname
hogepage.net
・submission port有効
# cat /etc/postfix/master.cf
以下がコメントになっているのでコメント外す
submission inet n - - - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
smtpd_client_restrictionsは、SMTPサーバがクライアントからSMTP接続の要求を受けた際に適用するIPアドレスのアクセス制限(デフォルトはすべて許可)。
smtpd_delay_reject = yes(デフォルト)なので、smtpd_client_restrictionsはRCPT TO時に評価される。つまり、この場合だと認証を通ったクライアントのIPのみ、RCPT TO以降のSMTP接続を受け付ける。ここでの設定はサブミッションポートでの設定なので注意(通常の25番ポートの方は適用されない)。
・main.cf編集
# cat /etc/postfix/main.cf
・・・・略
# TLSの設定。証明書はデフォルトのものを使用。オレオレ証明書なので注意
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# 主要な設定
myhostname = mail.hogepage.net # HELO名などで使用される。
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname #ローカルからメール配信を行った場合のFromアドレスにつくドメイン名
mydestination = hogepage.net, localhost #宛先ドメイン。このドメインにきたメールがローカル配送される。
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 xxx.xxx.xxx.xxxx #Relayを許可するIPアドレス。認証無しでもリレーできる。
#mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
#inet_protocols = ipv4
home_mailbox = Maildir/ # mailboxをMaildir形式にする。
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_recipient_restrictions はPostfix SMTPサーバが RCPT TO コマンドの場面で適用するアクセス制限(デフォルト: permit_mynetworks, reject_unauth_destination)。 この設定はサブミッションポート(587)と通常ポート(25)両方に適用される。これがあれば、master.cfのsmtpd_client_restrictions設定はいらない気が。。まぁ、二重にチェックしてもいいか。
ちなみに*_restrictionsの評価の順序は以下になる。必須なのはsmtpd_recipient_restrictionsのみ。
- smtpd_client_restrictions
- smtpd_helo_restrictions
- smtpd_sender_restrictions
- smtpd_recipient_restrictions
上記でも述べたがsmtpd_delay_reject = yes(デフォルト)だと、RCPT TO時にこれらがすべて評価される。
また、条件にマッチした場合、それ以降のマッチングを行わない。
・SMTP認証設定
認証方式にauthdaemondを指定する。
# cat /etc/postfix/sasl/smtpd.conf
pwcheck_method: authdaemond
authdaemond_path: /var/run/courier/authdaemon/socket
mech_list: plain login
・TIPS:/etc/postfix/sasl/smtpd.confの秘密
pwcheck_methodはauxprop/saslauthd/authdaemondなどがある。
それぞれの設定例を記述する。
(1)auxpropの例
auxpropを使用するといろいろなプラグインが使用できる。pluginにはsqlなどもある。
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: cram-md5 digest-md5 plain login
auxprop_pluginを指定しない場合、デフォルトでsasldbが使用される。
(2)saslauthdの例
saslauthdデーモンを使用する場合。
pwcheck_method: saslauthd
mech_list: plain login
saslauthdの場合、cram-md5やdigest-md5が使用できないことに注意。しかし、mech_listにcram-md5やdigest-md5が指定できてしまうことが混乱を招いている。認証にcram-md5やdigest-md5が使われた場合、saslauthdではなく、auxprop(=sasldb or sasldb2)が使用されてしまうことに注意orz
個人的にはSSLと組み合わせればよい話なので、cram-md5やdigest-md5はいらないと思っている。さらにcram-md5やdigest-md5の場合はサーバ側にハッシュ値でないプレーンテキストでパスワードを保存しておく必要がある。こっちの方が問題だと思う。。
(3)authdaemondの例
これは今回の例。もう一度おさらい。
pwcheck_method: authdaemond
authdaemond_path: /var/run/courier/authdaemon/socket
mech_list: plain login
authdaemondもsaslauthdの場合と同様、cram-md5やdigest-md5が使用できないことに注意。認証にcram-md5やdigest-md5が使われた場合、authdaemondではなく、auxprop(=sasldb or sasldb2)が使用される。
・authdaemonのsocketをpostfixが読めるようにする
まずpostfixユーザをdaemonグループに追加する。
# usermod -G postfix,mail,daemon postfix
・ソケットのハードリンクを行う。
postfixがchrootするのでシンボリックリンクではダメ!
# mkdir -p /var/spool/postfix/var/run/courier/authdaemon
# ln -f /var/run/courier/authdaemon/socket /var/spool/postfix/var/run/courier/authdaemon/socket
※これはauthdaemondを再起動するたびに行わなければならないので起動スクリプトに追加。デーモン起動してからソケット作成まで時間がかかるので3sほどsleepする。
# cat /etc/init.d/courier-authdaemon
・・・
$daemonscript start
sleep 3
ln -f /var/run/courier/authdaemon/socket /var/spool/postfix/var/run/courier/authdaemon/socket
・authdaemonのソケットをauthdaemonとpostfix両方で使用できるようにする
authdaemonのソケットをauthdaemonとpostfix両方で使用できるようにする。
(postfixはchrootするのでこのような工夫が必要となる)
上記の取消線で消した情報のようにソケットのハードリンクを行うのはスマートでないのでこちらに変更した。
mkdir -p /var/spool/postfix/var/run/
mv /var/run/courier /var/spool/postfix/var/run/
ln -s /var/spool/postfix/var/run/courier /var/run/courier
・エイリアス設定
# cat /etc/aliases
mailer-daemon: root
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
7.Postfix設定
・courier-authdaemonの再起動
# /etc/init.d/courier-authdaemon restart
・Postfixの再起動
# /etc/init.d/postfix restart
これでSMTP認証も使用できるようになった。認証方式は「PLAIN」「LOGIN」方式、SSLを使用するようにして通信が暗号化されるようにする。ここで使用した証明書はいわゆる「オレオレ証明書」であることに注意。今回使用するSSLは暗号化が目的なのでサーバ証明は行わない。
8.Postfix + バーチャルドメイン
今回は必要がなかったので設定しなかったが MySQLやPostfix Adminと組み合わせるとバーチャルドメインにも対応できる。
参考:
Postfix バーチャルドメインホスティング Howto
Postfix+MySQL+Postfix AdminによるバーチャルSMTPサーバの構築
また他のバーチャルドメインに対応するための組み合わせについても調べてみた。
- postfix + courier + mysql + postfixadmin(上記の参考URL参照)
- postfix + dovecot + mysql + postfixadmin
- postfix + (qmail + vpopmail) + qmailadmin
- postfix + V.A.P.E.S <-これは使用例がほとんどない
3についてはローカル配送をqmail + vpopmailで行うようである。qmailから移行する人はこの選択肢もありかも知れない。
9.ついでにimap, squirrelmail
・courier-imapインストール
# aptitude install courier-imap courier-imap-ssl
squirrelmailのインストール
# aptitude install squirrelmail
# /usr/sbin/squirrelmail-configure
設定例は以下参照。
玄箱 Debian で WebMail[SquirrelMail編]