- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!概要
Solaris 10デフォルトのMTAはsendmailですが、いまだにsendmailを使い続ける理由もあまりないのでPostfixに入れ替えてみます。
!!!インストール
!!sendmailのアンインストール
sendmailが残っているとパッケージのアップデート時などにPostfixに悪影響を及ぼす可能性があるので削除します。設定も削除されてしまいますので、必要に応じて/etc/mail以下のファイルをバックアップしてください。
# pkgrm SUNWsndmu
# pkgrm SUNWsndmr
!!OpenSSLのインストール
[Freeware for Solaris|http://www.sunfreeware.com/] からOpenSSLのパッケージをダウンロードしてインストールします。
$ gzip -d openssl-0.9.8e-sol10-x86-local.gz
# pkgadd -d openssl-0.9.8e-sol10-x86-local
!!Berkeley DBのインストール
[Freeware for Solaris|http://www.sunfreeware.com/] からBerkeley DBのパッケージをダウンロードしてインストールします。
$ gzip -d db-4.4.20.NC-sol10-x86-local.gz
# pkgadd -d db-4.4.20.NC-sol10-x86-local
!!ユーザ・グループの作成
postfixが使うユーザとグループを作成します。
# groupadd postfix
# groupadd postdrop
# useradd -g postfix -s /bin/false postfix
!!ダウンロード・展開
http://www.postfix.org/ からソースコードをダウンロードして適当なディレクトリに展開します。
$ tar zxvf postfix-2.4.0.tar.gz
$ cd postfix-2.4.0
!!コンパイル
コンパイルします。例ではSun StudioのCコンパイラを使用していますがgccでもよいです。
以下の機能を有効にするためにオプションを指定します。
*Dovecot SASL-Auth を使う。
*TLSを使う。
*Berkeley DB を組み込む。
$ make makefiles CC=/opt/SUNWspro/bin/cc \
CCARGS='-DUSE_SASL_AUTH -DDEF_SASL_SERVER=\"dovecot\" \
-DUSE_TLS -I/usr/local/ssl/include \
-DHAS_DB -I/usr/local/BerkeleyDB.4.4/include' \
AUXLIBS="-R/usr/local/ssl/lib -L/usr/local/ssl/lib -lssl -lcrypto \
-R/usr/local/BerkeleyDB.4.4/lib -L/usr/local/BerkeleyDB.4.4/lib -ldb"
$ make
!!インストール
インストールします。途中でいくつか設定を尋ねられますがデフォルトで問題ないと思います。必要に応じて変更してください。
# make install
問題なくインストールが進んでいるかと思ったら、以下のようなエラーが出て止まってしまいました。
postfix-install: nqmgr: not found
postfix-install: usr: not found
Updating ...
ln: Insufficient arguments (0)
Usage: ln [-f] [-n] [-s] f1 [f2]
ln [-f] [-n] [-s] f1 ... fn d1
ln [-f] [-n] -s d1 d2
*** Error code 1
make: Fatal error: Command failed for target `install'
エラーメッセージで検索してみると以下のページがヒットしました。
http://archives.neohapsis.com/archives/postfix/2007-04/0073.html
どうもSolaris 10の/bin/shが変な動きをするようです。Makefileの中の、SHELL=/bin/sh のところを SHELL=/usr/bin/bash に変えてみたところ正常にインストールできました。
!!!設定
!!SSL証明書
TLSで使うための秘密鍵と証明書を作成します。opensslで自己署名証明書を作成する手順を簡単に説明します。
CAの作成
# /usr/local/ssl/misc/CA.pl -newca
秘密鍵およびCSRの作成
# openssl req -new -nodes -keyout postfix-key.pem -out postfix-req.pem
サーバ証明書の作成
# openssl ca -out postfix-cert.pem -infiles postfix-req.pem
!!main.cf
/etc/postfix/main.cfに設定を追記します。
基本的な設定
# 自ホスト名をFQDNで指定する
myhostname = mail.shakemid.com
# ドメイン名を指定する
mydomain = shakemid.com
# ドメイン情報のないメールアドレスにドメイン名を付ける
myorigin = $mydomain
# すべてのネットワークインタフェースで接続を待ち受ける
inet_interfaces = all
# 自分宛とみなすドメインを指定する
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# リレーを許可する送信元のネットワークを指定する
mynetworks = 192.168.0.0/24 127.0.0.0/8
# エイリアスファイルを指定する
alias_maps = hash:/etc/postfix/aliases
# newaliasesコマンドで更新されるファイルを指定する
alias_maps = hash:/etc/postfix/aliases
# メールボックス形式としてMaildir形式を使う
home_mailbox = Maildir/
# バナーを指定する(ソフトウェア名は表示しない)
smtpd_banner = $myhostname ESMTP
# RCPT TO時に適用するアクセス制限
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
TLSを使用するための設定
# ルート証明書
smtpd_tls_CAfile = /etc/postfix/cacert.pem
# サーバ証明書
smtpd_tls_cert_file = /etc/postfix/postfix-cert.pem
# サーバの秘密鍵
smtpd_tls_key_file = /etc/postfix/postfix-key.pem
# ReceivedヘッダにTLSの情報を書き込む
smtpd_tls_received_header = yes
# TLSセッションキャッシュを使う
smtpd_tls_session_cache_database = btree:/var/spool/postfix/smtpd_tls_session_cache
# 乱数ファイル
tls_random_source = dev:/dev/urandom
# STARTTLSが指定されたときにTLSを使う
smtpd_tls_security_level = may
Dovecot SASL-Auth を使用するための設定
# SASL-Authを使用する
smtpd_sasl_auth_enable = yes
# 認証realmを指定する
smtpd_sasl_local_domain = $myhostname
# Outlookなどで認証を行うための設定
broken_sasl_auth_clients = yes
# Dovecot SASL-Authを使用する
smtpd_sasl_type = dovecot
# 認証用ソケット
smtpd_sasl_path = private/auth
!!SMTPSの設定
TCP 465ポートをTLS専用ポートとして設定します。 TCP 25ポートでSTARTTLSを使う場合は不要です。
master.cfに追記します。
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
/etc/servicesにサービスを追記します。
smtps 465/tcp # SMTP over SSL
!!エイリアスの設定
/etc/postfix/aliasesを開いてroot宛のメールを受け取るユーザを設定します。mailbox_commandを指定している場合はrootのメールボックスにメールが配送されなくなりますので必ず指定する必要があります。
root: you
編集後、newaliasesコマンドを実行します。
# newaliases
コマンドを実行すると/etc/postfix/aliases.dbファイルが作成されます。
aliasesの編集後はnewaliasesコマンドを実行するのを忘れないようにしてください。
!!Dovecotの設定
Dovecot側で認証デーモンソケットを有効にするために、/usr/local/etc/dovecot.confに以下の内容を追記します。
auth default {
...
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
...
}
!!SpamAssassinとの連携
PostfixとSpamAssassinを組み合わせる方法はいくつかありますが、ここではprocmailを使ってスパムチェックを行ってみます。
PostfixとSpamAssassinを組み合わせる方法はいくつかありますが、ここではprocmailを使って連携させてみます。
SpamAssassinのインストールについては、[[日本語対応SpamAssassinインストール]]を参考にしてください。
/etc/postfix/procmailrc として作成する
# configuration for procmail
PATH=/usr/local/bin:/usr/bin
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
#LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/procmail.lock
:0fw
|spamc
main.cfに追記する
# メールの配送にprocmailを使用する
mailbox_command = /opt/sfw/bin/procmail /etc/postfix/procmailrc
!!!起動
!!起動スクリプト
起動スクリプトの例です。/lib/svc/method/postfixとして作成します。
#!/sbin/sh
# rc script for postfix
PROG=/usr/sbin/postfix
SERVICE=`basename $PROG`
ECHO=/usr/ucb/echo
case "$1" in
start)
$ECHO -n "starting $SERVICE ... "
$PROG start && $ECHO "[ OK ]" || $ECHO "[ NG ]"
;;
stop)
$ECHO -n "stopping $SERVICE ... "
$PROG stop && $ECHO "[ OK ]" || $ECHO "[ NG ]"
;;
restart)
$0 stop
sleep 3
$0 start
;;
reload|refresh)
$ECHO -n "refreshing $SERVICE ... "
$PROG reload && $ECHO "[ OK ]" || $ECHO "[ NG ]"
;;
*)
echo "Usage: $0 { start | stop | restart | refresh }"
exit 1
;;
esac
exit 0
!!マニフェストファイル
マニフェストファイルの例です。デフォルトで付属しているsmtp-sendmail.xmlを改変しました。/var/svc/manifest/network/smtp-postfix.xmlとして作成します。
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<!--
Copyright 2004 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
-->
<service_bundle type='manifest' name='postfix'>
<service
name='network/smtp'
type='service'
version='1'>
<single_instance />
<dependency
name='fs-local'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/local' />
</dependency>
<dependency
name='network-service'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/network/service' />
</dependency>
<dependency
name='name-services'
grouping='require_all'
restart_on='refresh'
type='service'>
<service_fmri value='svc:/milestone/name-services' />
</dependency>
<dependency
name='identity'
grouping='optional_all'
restart_on='refresh'
type='service'>
<service_fmri value='svc:/system/identity:domain' />
</dependency>
<dependency
name='system-log'
grouping='optional_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/system-log' />
</dependency>
<instance name='postfix' enabled='false'>
<dependency
name='config-file'
grouping='require_all'
restart_on='refresh'
type='path'>
<service_fmri
value='file://localhost/etc/postfix/main.cf' />
</dependency>
<dependency
name='nsswitch'
grouping='require_all'
restart_on='refresh'
type='path'>
<service_fmri
value='file://localhost/etc/nsswitch.conf' />
</dependency>
<!--
If autofs is enabled, wait for it to get users' home
directories.
-->
<dependency
name='autofs'
grouping='optional_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/autofs' />
</dependency>
<dependent
name='smtp-sendmail_multi-user'
grouping='optional_all'
restart_on='none'>
<service_fmri
value='svc:/milestone/multi-user' />
</dependent>
<exec_method
type='method'
name='start'
exec='/lib/svc/method/postfix start'
timeout_seconds='120' />
<exec_method
type='method'
name='stop'
exec='/lib/svc/method/postfix stop'
timeout_seconds='60' />
<exec_method
type='method'
name='refresh'
exec='/lib/svc/method/postfix reload'
timeout_seconds='60' />
<property_group name='startd' type='framework'>
<propval name='ignore_error' type='astring'
value='core,signal' />
</property_group>
<property_group name='general' type='framework'>
<propval name='action_authorization' type='astring'
value='solaris.smf.manage.postfix' />
</property_group>
<template>
<common_name>
<loctext xml:lang='C'>
postfix SMTP mail transfer agent
</loctext>
</common_name>
<documentation>
<manpage title='postfix' section='1'
manpath='/usr/local/man' />
</documentation>
</template>
</instance>
<stability value='Unstable' />
</service>
</service_bundle>
マニフェストをインポートします。
# svccfg -v import smtp-postfix.xml
!!サービス起動
# svcadm enable postfix
!!!テスト
!!Telnetで接続してみる
TelnetでPostfixに接続して送信テストを行ってみます。
$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.shakemid.com ESMTP
EHLO localhost
250-mail.shakemid.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: user
250 2.1.0 Ok
RCPT TO: user
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: test
test
.
250 2.0.0 Ok: queued as 6CE5320512
quit
!!オープンリレーチェック
インターネットに晒されるメールサーバの場合はオープンリレーのチェックを行っておきましょう。
*[第三者中継チェック RBL.JP|http://www.rbl.jp/svcheck.php]
!!!リンク
*[The Postfix Home Page|http://www.postfix.org/] - 公式
*[Postfixのぺーじ|http://www.postfix-jp.info/] - 日本語ドキュメント