OXY NOTES

Postfixによる、セキュリティに配慮したメールサーバの構築方法

Postfixを安全に運用できるように設定します

いよいよ本丸、PostfixSMTPサーバを構築します。
基本的なホスト名やメールログの管理などに加えて、今まで解説してきた通り、公開鍵証明書を利用した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で受信用メールサーバを構築」です。