概要
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
オープンリレーチェック
インターネットに晒されるメールサーバの場合はオープンリレーのチェックを行っておきましょう。
リンク
- The Postfix Home Page - 公式
- Postfixのぺーじ - 日本語ドキュメント
最終更新時間:2007年05月18日 21時12分54秒