トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Postfixインストール

概要

Solaris 10デフォルトのMTAはsendmailですが、いまだにsendmailを使い続ける理由もあまりないのでPostfixに入れ替えてみます。

インストール

 sendmailのアンインストール

sendmailが残っているとパッケージのアップデート時などにPostfixに悪影響を及ぼす可能性があるので削除します。設定も削除されてしまいますので、必要に応じて/etc/mail以下のファイルをバックアップしてください。

# pkgrm SUNWsndmu
# pkgrm SUNWsndmr

 OpenSSLのインストール

Freeware for Solaris から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 から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を使って連携させてみます。
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

 オープンリレーチェック

インターネットに晒されるメールサーバの場合はオープンリレーのチェックを行っておきましょう。

リンク

最終更新時間:2007年05月18日 21時12分54秒