Postfixを安全に運用できるように設定します
いよいよ本丸、PostfixでSMTPサーバを構築します。
基本的なホスト名やメールログの管理などに加えて、今まで解説してきた通り、公開鍵証明書を利用したSSLによる暗号化。SASLライブラリを利用したSMTP認証。さらに不正中継対策。と、各種セキュリティに守られた安全なメールサーバを構築すべく、設定をしていきます。
迷った時の道標。公式ページや参考になるサイト
Postfixは数百のオプションが用意された、多機能なソフトです。
このページでは解説を加えながら設定をしていきますが、さらに高度な設定や、解説が必要な方は公式ページ参照してください。
以下に参考になる、おすすめのWebページを紹介します。
●Postfix公式ページ
●公式ページにある「標準的な設定の例」
●公式ページにある「各種パラメータの解説」
各設定ファイルの和訳と解説
●「main.cf.jp」についての解説
●「master.cf.jp」についての解説
設定ファイルの編集
Postfixには「/etc/postfix/main.cf」と「/etc/postfix/master.cf」という、2つの設定ファイルがあります。
まずは「/etc/postfix/main.cf」から編集していきます。
設定ファイル編集前の作法、オリジナルのバックアップをしてからviエディタで編集。
※コマンドラインの見方
「コマンド」「引数、その他」「コメント」「#(rootユーザ)」「$(一般ユーザ)」
# cd /etc/postfix/ # cp main.cf main.cf.org # vi main.cf
Webminで編集するには「サーバ > Postfixの設定 > 設定ファイルの編集」をクリックして編集します。
myhostnameの設定
「myhostname」は読んで字のごとく、ホスト名を設定する項目です。DNS設定時に「/etc/hosts」で設定したメール用のホスト名を設定しておきます。
70行目あたり「#myhostname = virtual.domain.tld」の後に追加
#myhostname = virtual.domain.tld myhostname = mail.example.com
mydomainの設定
ローカルなインターネットドメイン名を指定。こちらもドメイン名をそのまま指定します。
77行目あたり「#mydomain = domain.tld」の後に追加
#mydomain = domain.tld mydomain = example.com
myoriginの設定
ローカルで送信されたメールがどのドメインから来るように見えるかを指定。
95行目あたりに追記します。コメントアウトでも可。
#myorigin = $mydomain myorigin = $mydomain
inet_interfacesの設定
「inet_interfaces」はpostfixが待ち受けるインターフェイスを指定します。デフォルトだとlocalhostになっていて、サーバ内部でのメールしかやり取りできなくなっています。allを指定して外部のSMTPサーバとやり取りできるようにします。
110行目あたり「inet_interfaces = localhost」を変更
#inet_interfaces = localhost inet_interfaces = all
mydestinationの設定
「destination」つまり宛先の設定です。ここで設定した宛先に届けられたメールを、各ユーザーのディレクトリに保存します。
メールサーバには他のサーバから来たメールを、他のサーバへ中継する機能があります。そのため、自分宛のアドレスを設定しておかないと下のイラストのように「メールのループ」が起きてしまいます。
こうなるとサーバがダウンするか、容量が足りなくなるまでループしてしまいます。(実際にはエラーログに「loops back to myself」と書き出されてストップします)
そのためドメイン名で受信したメールを自分宛のものと認識するように、「$mydomain」を追加します。DNSで名前の解決ができるものなら、同じように追記することで、自分のメールアドレスとして運用することができます。
155行目あたり「mydestination = $myhostname, localhost.$mydomain, localhost」を変更
#mydestination = $myhostname, localhost.$mydomain, localhost mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
ちなみにDNSで複数のAレコードを持つ場合は追記する必要がある。
(例:example.comとftp.example.comが別のIPアドレスを持ち、どちらもAレコードに記述している場合)
mydestination = $myhostname, localhost.$mydomain, localhost, example.com, ftp.example.com
mynetworksの設定
「mynetworks」は信頼したネットワークを記述する項目です。この項目に指定したSMTPサーバからのメールは、リレーすることを許可します。つまりメールの送信を許可するIPのリストです。基本は自分のサーバ(ローカルホスト)を示す「192.168.0.0/24」と「127.0.0.0/8」を指定します。
この項目で不用意にIPを指定してしまうと、外部からのスパムメールを送信する「不正中継」に利用されてしまうので注意してください。
257行目あたり「#mynetworks = hash:/etc/postfix/network_table」の後に追加
#mynetworks = hash:/etc/postfix/network_table mynetworks = 192.168.0.0/24, 127.0.0.0/8
ちなみに「mynetworks」を設定することで「mynetworks_style」等の設定は無効になります。
プライベートネットワークについて補足
「192.168.0.0/24」は「プライベートネットワーク」と呼ばれサーバ内部での通信に使われます。「192.168.0.0~192.168.0.255」の範囲を示しています。
「127.0.0.0/8」は「localhost」を表すIPで、「127.0.0.0~127.255.255.255」の範囲を示しています。(実際には127.0.0.1=localhostだけの利用が多い)
relay_domainsの設定
「relay_domains」はリレーを許可するアドレスを指定します。上に出てきた「mydestination」で指定したアドレスをそのまま利用します。(こちらはリレーのみに関する指定)
287行目あたり「#relay_domains = $mydestination」のコメントアウトを削除。
#relay_domains = $mydestination relay_domains = $mydestination
home_mailboxの設定
「home_mailbox」はメールの保存形式と、保存場所を指定します。
「Mailbox」と指定すると、「/var/spool/mail/」というディレクトリに、ユーザー名ごとのメールを1つのファイルにまとめて、保存します。1つのファイルにまとめて保存するため多くのメールを管理しにくい面があります。
「Maildir/」とすると、「/home/user/Maildir」といった具合に各ユーザーのディレクトリにMaildirというディレクトリを作り、メールを1つづつ保存します。
特別理由が無ければ「Maildir形式」にしておきましょう。
410行目あたり「#home_mailbox = Maildir/」のコメントアウトを削除。
#home_mailbox = Maildir/ home_mailbox = Maildir/
注意点としては「Mailbox形式」を指定する場合「Mailbox/」とスラッシュをつけると「Maildir形式」で「/home/user/Mailbox」に配信されてしまうので注意してください。 「Mailbox形式」にするには、「home_mailbox = Mailbox」と指定します。
smtpd_bannerの設定
「smtpd_banner」はTelnet等でアクセスした際にpostfixのバージョン情報の表示を管理しています。セキュリティの観点から非表示を推奨します。外部の人間にpostfixを使っているか、バージョンがいくつかを知らせるメリットはないと思います。
コマンドで以下のように打つと表示されます。
# telnet localhost 25
220 mail.example.com ESMTP Postfix
561行目あたり「#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)」の後に追加
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) smtpd_banner = $myhostname ESMTP unknown
すると以下のように表示されるようになります。
# telnet localhost 25
220 mail.example.com ESMTP unknown
続いてPostfixをSSLによる暗号化に対応させる設定
SSLの設定は「main.cf」にあらかじめ書かれていません。ここからは「main.cf」の最後に追記してください。
smtpd_tls_security_levelの設定
暗号化技術TLS(SSL)を有効にするためのオプション。
postfix2.3以前は「smtpd_use_tls = yes」とされていたものです。
smtpd_tls_security_level = may
smtpd_tls_loglevelの設定
TLSのログファイルは「/var/log/maillog」に書きだされます。「0」がデフォルトで「5」が全て書き出す設定です。何かエラーのあるがログに書きだされていないという時は数字をあげてチェックしてみてください。通常は「1」で十分だと思います。
smtpd_tls_loglevel = 1
smtpd_tls_cert_fileの設定
OpenSSLで作成したメールサーバ用の「公開鍵証明書(公開鍵)」の指定
smtpd_tls_cert_file = /etc/pki/postfix/postfix.pem
smtpd_tls_key_fileの設定
こちらはメールサーバ用の秘密鍵を指定する (Postfixはパスワードによる暗号化した鍵に対応していないため、パスフレーズの削除をした秘密鍵を指定してください)
smtpd_tls_key_file = /etc/pki/postfix/postfix_noenc.key
smtpd_tls_session_cache_databaseの設定
「TLSセッションキャッシュデータベース」の指定。TLSセッションキャッシュとはTLSで暗号化通信をするのに必要なファイルを、毎回問い合わせたり、取り出したりするのではなく、キャッシとして保存して動作速度を上げる方法。
postfix2.2以前は「btree:」ではなく、「sdbm:」と指定していた。「sdbm:」の設定が生きていたらコメントアウトする。
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
smtpd_tls_CAfileとsmtpd_tls_CApathの設定
メールサーバ用の鍵を作成した「CAの証明書と、ディレクトリ」の指定。(リモートのSMTPサーバで検証するために提出するらしい。そのためプライベートCAの場合はあまり意味がないかも)
smtpd_tls_CAfile = /etc/pki/CA/cacert.pem smtpd_tls_CApath = /etc/pki/CA
SALSライブラリを利用したSMTP認証に関する設定
ユーザー認証にSALSライブラリを利用します。SALSで利用するユーザーデータベースはPAM認証経由でUNIX認証のものを利用します。
smtpd_sasl_auth_enableの設定
「smtpd_sasl_auth_enable」でSALSを有効にします。
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_optionsの設定
「smtpd_sasl_security_options」は認証メカニズムを制御します。
設定できるオプション
noplaintext | 平文パスワードを使う認証方法を許可しません。 |
---|---|
noactive | non-dictionary active 攻撃に脆弱な認証方法を許可しません。 |
nodictionary | passive dictionary 攻撃に脆弱な認証方法を許可しません。 |
noanonymous | 匿名ログインを許可しません。 |
mutual_auth | 相互認証を提供する方法のみを許可します (SASL バージョン 1 では 使えません)。 |
今回は匿名ユーザの認証を拒否するため以下のように設定しました。
smtpd_sasl_security_options = noanonymous
※今回は利用しませんがSASL独自データベース利用時には以下の指定も必要です
smtpd_sasl_local_domain = $myhostname
もしくは以下のようにホスト名を指定しても動作します。
smtpd_sasl_local_domain = mail.example.com
中継に関する設定
「smtpd_recipient_restrictions」で中継に関する設定をします。不正中継をされないために設定してください。
「PostFixのsmtpd_recipient_restrictionsの項目」を見てもらえばわかりますが、多くの制御が可能です。今回は以下の3点にしました。
permit_mynetworks | 「mynetwork」で指定したアドレスの許可。 |
---|---|
permit_sasl_authenticated | SASL認証が通れば許可。 |
reject_unauth_destination | 自分宛もしくは自分から送信されたものなら許可。 |
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
message_size_limitの設定
1回のメールで取り扱うことのできる最大のメールサイズ。「10485760」は「10MB」。
message_size_limit = 10485760
これでセキュリティーに関する設定の追記が終了しました。
以下のようになっているか確認してください。
#SSL用の設定 smtpd_tls_security_level = may smtpd_tls_cert_file = /etc/pki/postfix/postfix.pem smtpd_tls_key_file = /etc/pki/postfix/postfix_noenc.key smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache smtpd_tls_CAfile = /etc/pki/CA/cacert.pem smtpd_tls_CApath = /etc/pki/CA #SMTP認証用の設定 smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = $myhostname smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination #メールの最大サイズの設定 message_size_limit = 10485760
編集が終了したら「保存」ボタンをクリック。
以上でpostfixの基本的な設定を一旦終了します。
メール エイリアス データベースの作成
デフォルトのままだとメールエイリアス用のデータベースがありません。メールエイリアスとはメールを別名のユーザーに転送するシステムです。
正しく作成されていないと「/var/log/maillog」にて「fatal: open database /etc/aliases.db: No such file or directory」とエラーが出ます。
そこでwebminで「サーバ > postfix > メール エイリアス」をクリック。
「メール エイリアス」画面で「ローカル配信エージェントが使用するエイリアス データベース」に「hash:/etc/aliases」と入力して「保存して適用」ボタンをクリック。
コマンドでエイリアスファイルを作成する方法
コマンドで編集する場合は以下のコマンドで「aliases.db」という名前の空ファイルを作成します。Postfixを再起動すると空ファイルにエイリアスの設定が書き出されます。
$ cd /etc $ echo -n > aliases.db
ちなみにエイリアスの設定は「/etc/postfix/main.cf」の381行目あたりにあります。
alias_maps = hash:/etc/aliases
「/etc/postfix/master.cf」の設定
次は「master.cf」を設定していきます。先ほど「main.cf」を編集していたWebminの画面でプルダウンメニューから「master.cf」を選択して「編集」ボタンをクリックしてください。
viで編集する場合は以下のコマンド
オリジナルファイルをコピーして残し、編集します。
# cd /etc/postfix/ # cp master.cf master.cf.org # vi /etc/postfix/master.cf
このファイルのスペースやタブはそれぞれ意味があるので不用意に削除しないように注意してください。
SMTPsを有効
14行目あたりコメントアウトを外して「SMTPs」を有効に設定。
#smtps inet n - n - - smtpd smtps inet n - n - - smtpd
TLSとSASLを有効
15~16行目あたり、「TLS(SSL)とSASL(SMTP認証)」を有効にするべく、下の2行もコメントアウトを削除。
また、smtpd_reject_unlisted_senderで逆引きできないホストからの認証を拒否する。(これは名前解決できないホストからの接続が想定される場合は追加しない)
# -o smtpd_tls_wrappermode=yes # -o smtpd_sasl_auth_enable=yes -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_reject_unlisted_sender=yes
「tlsmgr(TLSセッションキャッシュ)」の設定
以下の設定がコメントアウトしてあった場合は、コメントアウト削除。(postfix2.3.3ではデフォルトで有効になっています)
#tlsmgr unix - - n 1000? 1 tlsmgr tlsmgr unix - - n 1000? 1 tlsmgr
バージョンによっては以下のようになってる場合もある。その場合もコメントアウトを削除。
tlsmgr fifo - - n 300 1 tlsmgr
編集が終了したら「保存」ボタンをクリック。
以上でPostfixの設定は完了です。
設定の変更を有効にするためPostfixを再起動
Webminで再起動する場合は「サーバ > Postfix の設定 > Postfixの停止」をクリックした後に、画面がリロードされて同じ場所に出る「Postfixを開始」ボタンをクリックしてください。
コマンドの場合はこちら
# /etc/init.d/postfix restart
自動起動を有効に設定
Webminで自動起動を確認
「システム > 起動およびシャットダウン」で「postfix」が「はい」になっていれば自動起動が有効になっています。
「いいえ」になっていた場合は、チェックボックスにチェックを入れてページ下部にある「選択したものをブート時に開始する」ボタンをクリックして自動起動を有効にしてください。
コマンドで自動起動が有効になっているかチェック
ルートユーザーでホームディレクトリに移動 # su - dovecotの自動起動を確認 # chkconfig --list dovecot 以下のように3番がonになっていれば自動起動は有効です。 httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
有効にするにはこちら
# chkconfig postfix on
メールサーバ構築の各種テスト
正しく設定できているかテストをします。
telnetでメールの送信テスト
「telnet(テルネット)」という通信プロトコルを利用してメールを送信してみましょう。詳しい解説は専門のサイトに任せて、メールを送る方法を解説します。
Tera Term等で以下のコマンドを打ちます。ユーザーネームや相手のアドレスを適宜変更したら一気にコピー・ペーストするとタイプミスも無く楽です。(もちろん1行1行書いても問題ありません。)
# telnet localhost 25 HELO localhost MAIL FROM:<hoge@localhost> ←ユーザーネームを置き換える RCPT TO:<huga@example.com> ←相手のメールアドレス DATA Subject:Send Test Mail From:hogehoge<hoge@localhost> ←ユーザー名とユーザーネームを置き換える To:hoge<hogehoge@gmail.com> ←相手のメールアドレス(実際に利用しているメールアドレス) This is test mail ←ここから本文 from telnet . ←このドットにも意味があるので注意
「250 2.0.0 Ok」と出れば正常に送信できているはずです。「quitもしくはq」と入力してEnterで「Telnet」を終了してください。
メールが届けばPostfixの設定は完了です。
エラーが出る場合は大抵設定ミスが原因です。メールログファイル「/var/log/maillog」に「fatal」や「warning」等のエラーメッセージが出ていないか確認して原因を究明してください。
不正中継のチェック
メールの送信送信ができたということは、不正中継にも利用される可能性があります。しっかりとチェックをしておきましょう。
不正中継のチェックには「こちらのサイト」が便利です。
チェックをして最終的に「第三者中継テストの結果 全てのテストが行われました, no relays accepted.」と出れば正しく設定されています。
これでSMTPサーバを構築することができました。
次は「Dovecot IMAP/POP3 Serverで受信用メールサーバを構築」です。