トップ 一覧 検索 ヘルプ RSS ログイン

Postfixインストールの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!概要
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/] - 日本語ドキュメント