SMTP Auth + TLSの導入(Postfix2.0編)

Mail System Postfix SMTP-Auth SMTP-Auth+TLS SMTP+Virtual Qpopper Qpopper/SSL Courier-IMAP FetchMail Procmail WebMail AntiVirus Relay Mail

Postfix 2.0 系は、1.0系と設定が少し変わっていることと、おやじの環境では、SMTP -> SMTP Auth -> SMTP Auth +TLS と SMTP サーバが成長してきたためコンテンツがバラバラになっているので、ここで整理しておくことにしました。Postfix 1.0 系については、こちらを参考にしてください。
なお、ウイルス対策については、AntiVirus や Amavisd-new+F-PROT を参考にしてください。
PostfixでTLS対応を行うと、クライアントのウイルス対策ソフトによっては(Norton AntiVirusで発生)、25番ポートのまま(STARTTLS)では送信できなくなることがあるので、こちら を参考にして対策を検討してください。
 携帯電話宛てメールの遅延、不達対策はこちらを参考にしてください。

■Postfixのインストール

今回とった方法はログイン時から TLS 化し、その後、SMTP AUTH で認証する方式ですので、LOGIN 認証しか対応できない Outlook Express でもセキュリティを確保できます。当初、ソースからパッチを当ててコンパイルしてみたのですがうまくいかず、いろいろ調べたところ Postfix のホームページからのリンクで Add-on Software にTLS化 を含めた RPM を作成できる方法がありましたので、これで行くことにしました。

  1. まずは、こちらのサービスの中にあるサポートのダウンロードから最新の Source RPM を /usr/src/redhat/SOURCES 配下にダウンロード(おやじがダウンロードしたのは、postfix-2.1.4-5.src.rpm)し、パッケージを展開する。このとき、user と group が違うと警告が出るが無視してよい。

    # cd /usr/src/redhat/SOURCES
    # wget ftp://ftp.sanguine.net/pub/postfix/official/2.1/SRPMS/postfix-2.1.4-5.src.rpm
    # rpm -Uvh postfix-2.1.4-5.src.rpm

  2. ビルドのオプションとしてSASL(今回はSASL2とした。)と TLS オプションを設定し、新しい postfix.spec ファイルを作成する。なお、デフォルトで LDAP オプションが有効になっているのでオフとした。

    # export POSTFIX_SASL=2
    # export POSTFIX_TLS=1
    # export POSTFIX_LDAP=0
    # sh make-postfix.spec

     
  3. バイナリ RPM を作成する。下記操作で、/usr/src/redhat/RPMS/i386 配下に postfix-2.1.4-5.sasl2.tls.rh9.i386.rpm という RPM が作成される。
     
    # cd /usr/src/redhat/SPECS
    # rpmbuild -ba postfix.spec

  4. 上記で作成されたバイナリRPM(postfix-2.1.4-5.sasl2.tls.rh9.i386.rpm)をインストールするが、新しい cf を作成するため、main.cf、master.cf を事前にリネームしておく。

    # mv /etc/postfix/main.cf /etc/postfix/main.cf.bak
    # mv /etc/postfix/master.cf /etc/postfix/master.cf.bak
    # rpm -Uvh /usr/src/redhat/RPMS/i386/postfix-2.1.4-5.sasl2.tls.rh9.i386.rpm


■Postfixの設定ファイルの編集

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

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

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

# ホスト名の設定
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
myhostname = mail.aconus.com

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

# メール送信の設定
# ローカルで配送されたメールがどこからくるように見えるか指定するもので、デフォルトの
# $myhostnameを指定すればいい。
# なお、ここでの設定は後述するsaslpasswdの設定時のrealmと同一でないとエラーとなるので注意が必要。
#myorigin = $myhostname
#myorigin = $mydomain
myorigin = $myhostname

# メール受信の設定
# メールを受け取るネットワークインタフェースのアドレス範囲を指定する。特別な用件が無ければ指定不要(default=all)。
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
 
# メールの最終目的地とみなす範囲の指定
#mydestination = $myhostname, localhost.$mydomain
#mydestination = $myhostname, localhost.$mydomain $mydomain
#mydestination = $myhostname, localhost.$mydomain, $mydomain,
#   mail.$mydomain, www.$mydomain, ftp.$mydomain
mydestination = $myhostname, localhost.$mydomain, $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との整合が取れないので修正する。
#sendmail_path = /usr/sbin/sendmail.postfix
sendmail_path = /usr/sbin/sendmail


◆aliases の修正

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

# vi /etc/aliases
postfix:       oyaji  # この行を追加

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

# newaliases

◆SMTP Authetication関係の設定(main.cf)

SMTP Authetication に関しては、main.cf の設定とパスワード関係の設定が必要です。認証に関しては、sasiauthd による PAM 認証、即ち UNIX パスワードによる認証を行う方法と、SASL パスワードによる認証方法があります。なお、 SMTP AUTH がクライアントでうまくいかないときは、手動でテストしてみると状況がつかめるかもしれません。
SMTP Authetication に関しては、/etc/postfix/samples ディレクトリ内にある sample-auth.cf の内容を、/etc/postfix/main.cf に追加コピーして編集します。
なお、一部は異なる sample-xxx.cf にあるものもあります。ここでは、修正した部分のみ記載しています。(青字は削除、赤字は追加、緑字は変更したものです。)
なお、一箇所だけ PAM 認証か sasl パスワード認証かで設定が異なるところがありますので注意してください。

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

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

# ローカル認証 realm の名前を設定
# Postfixのデフォルトはmyhostnameである。
# 実はここで大嵌りで、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 を起動し PAM による認証(UNIX パスワードによる認証)が行われるようにします。sasl パスワードで認証する場合は、ここの項目は設定しないこと。

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

    pwcheck_method: saslauthd
    mech_list: plain login

  2. /etc/sysconfig/saslauthdに下記のように設定する。これにより、 saslauthd 起動スクリプトは pam による認証を行うオプションで起動する。

    MECH=pam

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

    # chkconfig --level 345 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関係の設定(main.cf)

TLS 化に関しては、/etc/postfix/samples ディレクトリ内にある sample-tls.cf の内容を、/etc/postfix/main.cf に追加コピーして編集します。
なお、各種証明書や鍵については、サーバ証明書の作成を参考にしてください。青字は削除、赤字は追加、緑字は変更したものです。コメント等は省略しています。)

PostfixでTLS対応を行うと、クライアントのウイルス対策ソフトによっては(Norton AntiVirusで発生)、25番ポートのまま(STARTTLS)では送信できなくなることがあるので、こちら を参考にして対策を検討してください。

 # サーバ証明書/鍵関係の設定を変更(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

 # ログレベルの変更(最低レベル)
 # 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

 # 証明書は前述の方法で作成
 #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

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

 

◆master.cfの設定

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

 (snip)

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

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

messages に sendmail の path がおかしいと出ていたので調査したところ、/usr/sbin/sendmail が互換プログラムに置き換わっておらず、CGI からのメール利用ができなくなっていました。CGI を直すのが面倒なので、下記で修正しました。

# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# ln -s /usr/sbin/sendmail.postfix /usr/sbin/sendmail


■Postfix の起動

この RPM では、自動実行スクリプトが組み込まれますので、各ランレベルへのリンクが張り postfix を起動しましょう。

# chmod 755 /etc/rc.d/init.d/postfix
# chkconfig --add postfix
# chkconfig --list postfix
postfix 0:オフ 1:オフ 2:オン 3:オン 4:オン 5:オン 6:オフ
# service postfix start

起動後に、netstat -ln (netstat -an --tcp) で25番と465番ポートが Listen 状態になっているか確認しておきましょう。

■クライアントの起動

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


Mail System Postfix SMTP-Auth SMTP-Auth+TLS SMTP+Virtual Qpopper Qpopper/SSL Courier-IMAP FetchMail Procmail WebMail AntiVirus Relay Mail