PostfixによるSMTPサーバの構築(CentOS標準版編)


CentoOSのデフォルトのSMTPサーバはsendmailですが、おやじは従来どおりPostfixを使用することにしました。基本的に他デストリと設定等は何も変わりはありません。
なお、ウイルス対策も従前どおり、AntiVirusで行いました。
PostfixでTLS対応を行うと、クライアントのウイルス対策ソフトによっては(Norton AntiVirusで発生)、25番ポートのまま(STARTTLS)では送信できなくなることがあるので、こちら を参考にして対策を検討してください。
 携帯電話宛てメールの遅延、不達対策はこちらを参考にしてください。

■サポート範囲の明確化

SMTPをどのように使用するかで、対応しなければならない範囲が変わってきます。おやじなりの整理をすると、以下のようになると考えています。

機 能 使用範囲 備 考
SMTP AUTH TLS
× × 家庭内から、インターネットや家庭内アカウントにメールを送信するだけ。 送信先は任意
家庭内向けの受信は必須
× 上記に加え、外部環境(インターネット側)から自宅サーバを利用して他のインターネットアカウントにも送信できるようにする。但し、インターネット上を平文のパスワードが流れるので危険。
フルアクセスが可能。TLSによる暗号化によりパスワードをガードできるので、外部からの利用も安全。
SMTPサーバをどのように使用するかで、サポートしなければならない範囲が変ってきます。以下に各機能の実現方法を示しますが、必要な部分のみ設定を行えばよいように記述してあります。
なお、外部環境から使用する場合は、是非TLSまで対応してください。プロバイダのSMTPを使用するときは、そんなことはしていないと思われるかもしれませんが、自宅SMTPサーバ利用とプロバイダのSMTPサーバ利用ではパケットが流れているところが違います。プロバイダのSMTPを利用する場合は、ホールセーラの場合ですと、ホールセーラ <-> 専用線 <-> プロバイダ(SMTP)のため(ダイヤルアップもホールセーラ相当)、内部に悪意をもった者がいない限り、まず安心です。但し、自社のネットワーク(AP)以外からもアクセスを許容している場合は、プロバイダに乗り入れるまでの経路が特定できないため、暗号化しないで使用することは危険です。自宅SMTPサーバを外部から利用する場合も、これに該当します。自宅SMTPサーバはどこからでも利用できるので便利なのですが、盗聴される危険性は高くなるので注意が必要です。

■Postfixのインストール

まずはさておき、Postfixをインストールしないことには始まりません。
CentoOSではデフォルトでsndmailがインストールされていますが、システム停止するだけでアンインストールする必要はなく、依存関係でおかしくなると煩わしいので、そのままPostfixをインストールしました。

◆sendmailの停止

sendmailが動作している場合は、下記により停止し、システム起動時に起動されないようにします。
 # /etc/rc.d/init.d/sendmail stop
 # chkconfig --del sendmail

◆Postfixのインストール

Postfixがインストールされていなければ、下記によりyumで最新版をインストールします。
 # yum install postfix

■SMTP関係の設定

まずは、/etc/postfix配下にあるmain.cfを編集します。

◆基本的な設定(main.cf)

Postfixの設定は、/etc/postfix/main.cf を編集します。SMTPを動かすための基本的な設定を下記により行います。ここでは、修正した部分のみ記載しています。(青字は削除、赤字は追加、緑字は変更したものです。)

# ホスト名の設定
# myhostnameでは、通常サーバのホスト名を指定する。しかし、ここで設定するホスト名は
# myoriginの設定と関係しており、myoriginをmyhostnameとした場合は、このホスト名は
# インターネット上でDNSで名前解決できるホスト名でなければならない。
# zive.orgのように、MXを使うとホスト名が使えない場合は、サブドメインをそのまま指定すればよい。
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
myhostname = mail.aconus.com

# ドメイン名の設定
#mydomain = domain.tld
mydomain = aconus.com

# メール送信の設定
# ローカルで配送されたメールがどこからくるように見えるか指定するもので、デフォルトの
# $myhostnameを指定すればいい。分かりにくい表現であるが、ここの値は、localhostが
# 送信する場合のホスト名として@以下に設定されるもので、例えば、デーモンが吐くメール
# やCGIでメールを送信したり、procmailで転送する場合の送信元に設定される。従って、
# ここで指定されたホスト名は、インターネット上でDNSが牽ける名前でないと、相手サーバで
# エラー発生時に返信するためチェックされており、その時点で蹴られてしまうので、注意が
# 必要である。
# ここでの設定は後述するsaslpasswd2の設定時のmydomainと同一でないとエラーとなるので
# 注意が必要。
#myorigin = $myhostname
#myorigin = $mydomain
myorigin = $myhostname

# メール受信の設定
# メールを受け取るネットワークインタフェースのアドレス範囲を指定する。特別な用件が無ければ指定不要(default=all)。
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
inet_interfaces = all

# メールの最終目的地とみなす範囲の指定
#mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
#          mail.$mydomain, www.$mydomain, ftp.$mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 信頼できるクライアントのネットワークを指定(192.168.0.0/24と192.168.1.0/24を合わせて指定)
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
mynetworks =  192.168.0.0/23, 127.0.0.0/8

# リレーを許可するドメインを指定
#relay_domains = $mydestination
relay_domains = $mydestination

# メールBOXの形式を指定
# Courier-imapを使うため、Maildir形式とする。
#home_mailbox = Mailbox
#home_mailbox = Maildir/
home_mailbox = Maildir/

# sendmail互換プログラムの修正
# sendmail互換プログラムがsendmail.postfixとなっており、CGIとの整合が取れないので修正する。
# CGI側を修正する場合は、下記を含めて修正は不要です。
#sendmail_path = /usr/sbin/sendmail.postfix
sendmail_path = /usr/sbin/sendmail


◆sendmail互換プログラムの修正

messagesにsendmailのpathがおかしいと出ていたので調査したところ、/usr/sbin/sendmailが互換プログラムに置き換わっておらず、CGIからのメール利用ができなくなっていました。下記で修正が必要です。
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# ln -s /usr/sbin/sendmail.postfix /usr/sbin/sendmail

◆aliasesの修正

RPMからインストールするとroot宛てのメッセージがpostfix宛てに配送されるようになっています。postfixユーザを追加するか、メールを受け取れる実在するユーザに配送先を変更する必要があります。ここでは、おやじ宛てに配送する変更例を示します。
# vi /etc/postfix/aliases
postfix:   oyaji  # この行を追加

[Esc]、[:]、[w]、[q]で保存し、newaliasesを実行。

# newaliases

■SMTP Authetication関係の設定

SMTP Autheticationに関しては、main.cfの設定とパスワード関係の設定が必要です。

◆main.cfの設定

SMTP Autheticationに関しては、ソースからインストールすると/etc/postfix/samplesディレクトリ内にsample-auth.cfがあるので、この内容を、/etc/postfix/main.cf に追加コピーして編集できますが、CentOS標準では /usr/share/doc/postfix-2.1.x/README-Postfix-SASL-RedHat.txtを参考にして設定します。下記を参考に設定してください。コメントアウトしていない部分のみを記述すれば大丈夫です。
ここでは、sample-auth.cfから修正したイメージで記載しています。(青字は削除、赤字は追加、緑字は変更したものです。)

# SMTP サーバ制御の設定
# SASLによるSMTP認証を使用
#smtpd_sasl_auth_enable = yes
#smtpd_sasl_auth_enable = no
smtpd_sasl_auth_enable = yes

# 使用可能な認証メカニズムの設定
# noanonymous : 匿名での接続を拒否。
# noplaintext : PLAIN認証を拒否(Outlook ExpressはPLAIN認証のみ対応のためおやじは未記述)
#smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_security_options = noanonymous

# 認証時のTLSの強制設定
# パスワードが流れるので、認証はTLS使用のみ許可する場合はyesに変更
# TLSのsample.cfとダブるので、こちらはコメントアウトしたほうが良い。
#smtpd_tls_auth_only = yes
#smtpd_tls_auth_only = no

# ローカル認証 realm の名前を設定
# Postfixのデフォルトはmyhostnameであるが、SuSEのデフォルトは設定なしである。
# 実はここで大嵌りで、PAM 認証の場合はここは設定なしのままでないと認証できないので注意が必要。
# 但し、これはsaslauthdによるPAM 認証の場合で、sasl パスワード認証の場合は、myorigin で設定した
# ドメイン(ホスト)名と同一の値を設定しないと、認証に失敗する。
#smtpd_sasl_local_domain = $mydomain
#smtpd_sasl_local_domain = $myhostname

# リレーを許可するものを設定(sample-smtpd.cf)
# ・permit_mynetworks : mynetworksで指定されたネットワークからのリレーを許可。
# ・permit_sasl_authenticated : SMTP認証を通過したものは許可。
# ・reject_unauth_destination : 目的地が $inet_interfaces、$mydestination $virtual_alias_domains
#  または $virtual_mailbox_domains にマッチするアドレス宛のメール、及び$relay_domains にマッチする
#  目的地へのメール以外を拒否。
#  (本設定で不正な外部からのメールをrejectする。check_relay_domainsは2.0では使用
#  されなくなった。)
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

# AUTHコマンドのサポートを認識できないクライアントへの対応(sample-compatibility.cf)
# Outlook Express 4 および Exchange 5等はAUTH コマンドをサポートしていることを認識できないので、
# 使用時は下記のような設定を追加する。おやじはOE 6.0なのでnoのまま。
broken_sasl_auth_clients=yes


◆saslauthd 関係の設定

ここでは、SMTP AUTHで使用する saslauthd 関係の設定をします。具体的には、saslauthd を起動し UNIX パスワードによる認証が行われるようにします。とは言っても、デフォルトのままです。saslパスワードで認証する場合は、ここの項目は設定しないこと。

  1. /usr/lib/sasl2/smtpd.conf に以下の設定がされているか確認し、異なる場合は下記のように設定する。これにより、saslauthd でDIGEST-MD5、 CRAM-MD5、LOGIN、PLAIN認証に対応できる。

    pwcheck_method: saslauthd

  2. /etc/sysconfig/saslauthdに下記のようにshadowパスワードで認証するように設定されており、通常はそのままでもよい。これにより、 saslauthd 起動スクリプトは shadowパスワード による認証を行うオプションで起動する。ここを「MECH=pam」とすれば、pamで認証される。

    MECH=shadow

  3. saslauthd の起動スクリプトを有効にし起動する。

    # chkconfig saslauthd on
    # service saslauthd start


sasl パスワードによる認証

ここでは、SMTP AUTH で使用するパスワードを sasl パスワード(/etc/sasldb2)で行う方法を示します。こちらの方法なら UNIX パスワードとは別のパスワードを使用することができますので、セキュリテイ上はベターと思います。saslauthd は起動しないように。

  1. /usr/lib/sasl2/smtpd.conf の pwcheck_method を sasldb2 で行うように以下のように変更します。「sasldb2」ではありませんので注意が必要です。

    pwcheck_method: auxprop

  2. 続いて、パスワードデータベースを作成します。パスワードの作成は、以下のように行います。realm には main.cf で設定した $myorigin と同一のドメイン(ホスト)名を指定してください。合わせないと認証に失敗します。入力すると、設定するパスワードを聞いてくるので、確認を含めて2回入力します。

    # saslpasswd2 -c -u realm ユーザ名

    例: saslpasswd2 -c -u mail.aconus.com oyaji  

    設定したパスワードを削除する場合は、以下のようにします。

    # saslpasswd2 -d -u realm ユーザ名

  3. 作成されたパスワードの確認は、以下のように sasldblistusers2 と入力すると、登録されてるユーザ名と realm が表示されます。

    # sasldblistusers2
    oyaji@mail.aconus.com: userPassword

  4. Postfix が sasldb を利用できるようにグループに登録し、パーミッションを変更します。

    # chgrp postfix /etc/sasldb2
    # chmod 640 /etc/sasldb2


■TLS関係の設定

TLS化に関しては、main.cfとmaster.cfの設定が必要になります。なお、各種証明書や鍵については、サーバ証明書の作成を参考にしてください。
PostfixでTLS対応を行うと、クライアントのウイルス対策ソフトによっては(Norton AntiVirusで発生)、25番ポートのまま(STARTTLS)では送信できなくなることがあるので、こちら を参考にして対策を検討してください。

◆main.cfの設定

TLS化に関しては、/usr/share/doc/postfix-2.1.x/samplesディレクトリ内にsample-tls.cfがあるので、この内容を、/etc/postfix/main.cf に追加コピーして編集できます。下記を参考に設定してください。コメントアウトしていない部分のみを記述すれば大丈夫です。
ここでは、sample-tls.cfから修正したイメージで記載しています。(青字は削除、赤字は追加、緑字は変更したものです。)

# サーバ証明書/鍵関係の設定を自分で作成した物に変更(RSAのみ対応)
#smtpd_tls_cert_file = /etc/postfix/server.pem
#smtpd_tls_key_file = $smtpd_tls_cert_file
smtpd_tls_cert_file = /usr/local/certs/server.crt
smtpd_tls_key_file = /usr/local/certs/server.key

#
# Its DSA counterparts:
#smtpd_tls_dcert_file = /etc/postfix/server-dsa.pem
#smtpd_tls_dkey_file = $smtpd_tls_dcert_file

# CA関係の設定を変更
#smtpd_tls_CApath = /etc/postfix/certs
smtpd_tls_CApath = /usr/local/certs

# ログレベルの変更(最低レベル)
# smtpd_tls_loglevel = 0
smtpd_tls_loglevel = 1

# TLS使用(そのまま)
smtpd_use_tls = yes

# Outlook/Outlook Express用のモード設定 ( * :下記参照 )
# smtpd_tls_wrappermode = no
smtpd_tls_wrappermode = yes

# 認証はTLS使用のみ(TLSのみの場合はコメントアウトを外しyesに変更)
# smtpd_tls_auth_only = no  

# セッションキャッシュの設定(そのまま)
smtpd_tls_session_cache_database = sdbm:/etc/postfix/smtpd_scache
# postfix-2.2系以降はsdbmからbtreeに変わっているので、2.2系以降の場合は
# 上記をコメントアウトして下記に変更すること。
# smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache

# 証明書は前述の方法で作成
#smtpd_tls_dh1024_param_file = /etc/postfix/dh_1024.pem
#smtpd_tls_dh512_param_file = /etc/postfix/dh_512.pem

# TLS用乱数デバイスの指定
tls_random_source = dev:/dev/urandom
# tls_random_source = egd:/var/run/egd-pool
# tls_random_bytes = 32
# tls_random_reseed_period = 3600s

tls_daemon_random_source = dev:/dev/urandom
# tls_daemon_random_source = egd:/var/run/egd-pool
# tls_daemon_random_bytes = 32

*: この設定は、OEがrfcと違うインプリをしているということで設定しましたが、クライアントがOEならいいのですが、全てのクライアントに特殊な手順で相手してしまうので、local(AntiVir)からlocalへの配送時にpostfix自身が止まってしまう(正確にはそのメールを中継できなくなるだけ)という問題が発覚しました。このOEの問題は、5.0の問題とのことなので、おやじは6.0を使用しており設定を外しました。但し、アクセスはあくまで465番ポートです。これでわかるとおり、OE5.0の環境では、AntiVirとTLS対応の併用はできません。

◆master.cfの設定

Outlook/Outlook Expressを使用する場合の専用の設定とTLSセッションキャッシュマネージャの設定をmaster.cfで行います。RPMをインストールすると、master.cfができますので、smtps(2行にまたがっているので注意)とtlsmgrのコメントアウトを外すだけです。
なお、AntiVirを使用している場合は設定(localhost:smtp-backdoor・・・)を忘れないようにしてください。
# ==========================================================================
# service type  private unpriv chroot wakeup maxproc command + args
#               (yes)    (yes)  (yes)   (never) (50)
# ==========================================================================
smtp      inet  n       -      n      -      -       smtpd
#smtps    inet  n       -      n      -      -       smtpd
# -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
smtps     inet  n       -      n      -      -       smtpd
 -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

#submission inet n      -      n      -      -       smtpd
# -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
#628      inet  n       -      n      -      -       qmqpd
pickup    fifo  n       -      n      60     1       pickup
cleanup   unix  n       -      n      -      0       cleanup
qmgr      fifo  n       -      n      300    1       qmgr
#qmgr     fifo  n       -      n      300    1       nqmgr
#tlsmgr   fifo  -       -      n      300    1       tlsmgr
tlsmgr    fifo  -       -      n      300    1       tlsmgr
# tlsmgrはpostfix-2.2系以降、typeがunixに変更になっているので2.2系以降の場合は
# 上記ではなく、下記のデフォルトのままコメントを外すこと。
#tlsmgr    unix  -      -      n      1000?  1       tlsmgr

localhost:smtp-backdoor inet n - n - - smtpd -o content_filter=

■Postfix の起動

RPMからインストールすると、自動実行スクリプトが組み込まれますが、各ランレベルへのリンクが張られないようなので、下記で設定し起動します。
# chmod 755 /etc/rc.d/init.d/postfix
# chkconfig --add postfix
# chkconfig --list postfix
postfix      0:off  1:off   2:on   3:on   4:on   5:on   6:off
# /etc/rc.d/init.d/postfix start


■クライアントの設定

次に、Outlook Expressの設定を変更します。
  1. メイン画面から、「ツール」、「アカウント」で使用するアカウントのプロパティを開き、「サーバー」タブを開く。
  2. 送信メールサーバーの、「このサーバーは認証が必要」にチェックマークを入れる。
    設定ボタンを押すと、ログオン情報の設定ができるが、通常は「受信メールサーバーと同じ設定を使用する」で問題はない。
  3. 詳細設定タブで、「サーバーのポート番号」の「送信メール(SMTP)」を465に、その下の、「このサーバーは認証が必要セキュリティで保護された接続(SSL)が必要」にチェックマークを入れる。
     
SMTPのポート番号が追加になったので、外部から使用するならルータの設定も変更する必要があり、フィルタリングとスタティックNATの設定を追加する必要があります。あくまで外部からクライアントでのSMTP利用時の対策ですので、間違っても25番は閉じたりしないでください。外部からのメールが受信できなくなってしまいます。


Top Pageへ