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

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

おやじは、SMTPサーバとしてPostfixを使用していますが、今までいろいろやりたいのでソースからコンパイル/RPM作成してやってきました。少なくともRedHat7.3まではPostfixをサポートしていなかったので、その延長でやってきたのですが、灯台下暗しでRedHat8.0/9.0標準のPostfixでおやじが今までやってきていたことが全てできることが判明しましたので、ここに整理しておくことにしました。基本的には、インストールを除けば、元のコンテンツのとおりに作業すれば大丈夫です。但し、2003.06.18現在、RedHat8.0/9.0の標準版は1.1系です。
なお、ウイルス対策については、AntiVirusを参考にしてください。
PostfixでTLS対応を行うと、クライアントのウイルス対策ソフトによっては(Norton AntiVirusで発生)、25番ポートのまま(STARTTLS)では送信できなくなることがあるので、こちら を参考にして対策を検討してください。
 携帯電話宛てメールの遅延、不達対策はこちらを参考にしてください。

■サポート範囲の明確化

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

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

■Postfixのインストール

まずはさておき、Postfixをインストールしないことに始まりません。
RedHat8.0/9.0では、SMTPとしてはsendmailとPostfixがサポートされています。システムインストール時にメールのインストールを指定すると、特に指定しなければデフォルトではsendmailだけがインストールされます。新規ならサブメニューでPostfixをインストールしますが、既にシステムが稼動していてPostfixがインストールされていないのならば、CDからPostfixをインストールしてください。sendmailはアンインスト−ルせず、放置しておいてかまいません。

◆sendmailの停止

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

◆Postfixのインストール

Postfixがインストールされていなければ、下記によりCD(DISC2)からインストールします。
# mount /etc/mnt/cdrom
# rpm -ivh /etc/mnt/cdrom/RedHat/RPMS/postfix-1.1.11-5.i386.rpm

■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 = mail.aconus.com

# メール送信の設定
# ローカルで配送されたメールがどこからくるように見えるか指定するもので、デフォルトの
# $myhostnameを指定すればいい。分かりにくい表現であるが、ここの値は、localhostが
# 送信する場合のホスト名として@以下に設定されるもので、例えば、デーモンが吐くメール
# やCGIでメールを送信したり、procmailで転送する場合の送信元に設定される。従って、
# ここで指定されたホスト名は、インターネット上でDNSが牽ける名前でないと、相手サーバで
# エラー発生時に返信するためチェックされており、その時点で蹴られてしまうので、注意が
# 必要である。
# なお、ここでの設定は後述するsaslpasswdの設定時のmydomainと同一でないとエラーとなるので注意が必要。
#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との整合が取れないので修正する。
# 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 に追加コピーして編集できますが、RedHat標準ではないので、下記を参考に設定してください。コメントアウトしていない部分のみを記述すれば大丈夫です。
ここでは、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はLOGIN認証のみ対応のためおやじは未記述)
#smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_security_options = noanonymous

# ローカル認証 realm の名前を設定
# デフォルトはmyhostnameであるが、1台しかサーバがないのでここではmydomainを指定。
# なお、ここでの設定は、myoriginの設定と後述するsaslpasswdの設定時のmydomainの設定の3個所が
# 同一でないとエラーとなるので注意が必要。
#smtpd_sasl_local_domain = $mydomain
#smtpd_sasl_local_domain = $myhostname
smtpd_sasl_local_domain = $mydomain

# リレーを許可するものを設定(sample-smtpd.cf)
# ・permit_mynetworks : mynetworksで指定されたネットワークからのリレーを許可。
# ・permit_sasl_authenticated : SMTP認証を通過したものは許可。
# ・check_relay_domains : relay_domainsで指定されたドメインへはリレーを許可。
#  (本設定をしないと外部からのメールが全てrejectされてしまう。)
#  ・reject :上記以外拒否。 
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,check_relay_domains,reject

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


◆パスワードデータベースの指定

ここでは、SMTP AUTHで使用するパスワードを作成します。セキュリテイのことを考え、UNIXパスワードとは別のパスワードを使用することとし、パスワードはsasldbを参照するようにしてあります。
# vi /usr/lib/sasl/smtpd.conf
pwcheck_method:sasldb
上記を記述後、「Esc」、「:」、「wq」で設定を保存してください。

◆パスワードの作成

パスワードの作成は、以下のように行います。mydomainにはmain.cfで設定したドメイン(ホスト)名を指定し入力すると、設定するパスワードを聞いてくるので、確認を含めて2回入力します。何故か、二人目以降は大丈夫なのですが、一人目の登録は何回かインストールしましたが必ず失敗しますので、再登録しましょう。更に、先頭ユーザはPLAIN認証用のデータだけが登録できないことがあるので、後述のsasldblistusersで登録できているか必ず確認してください。再登録すれば、登録されます。つまり先頭ユーザだけですが、3回登録操作が必要な場合があります。
# saslpasswd -c -u mydomain ユーザ名

例: saslpasswd -c -u mail.aconus.com oyaji  
設定したパスワードを削除する場合は、以下のようにします。
# saslpasswd -d -u mydomain ユーザ名
作成されたパスワードの確認は、以下のようにします。
# sasldblistusers
user.oyaji realm: mail.aconus.com mech: DIGEST-MD5
user.oyaji realm: mail.aconus.com mech: PLAIN
user.oyaji realm: mail.aconus.com mech: CRAM-MD5 

◆パスワードファイルの設定

Postfixがsasldbを利用できるようにグループに登録し、パーミッションを変更します。
# chgrp postfix /etc/sasldb
# chmod 640 /etc/sasldb

■TLS関係の設定

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

◆main.cfの設定

TLS化に関しても、ソースからインストールすると/etc/postfix/samplesディレクトリ内にsample-tls.cfがあるので、この内容を、/etc/postfix/main.cf に追加コピーして編集できますが、RedHat標準ではないので、下記を参考に設定してください。コメントアウトしていない部分のみを記述すれば大丈夫です。
ここでは、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

# ログレベルの変更(最低レベル)
# 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の環境では、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       -      y      -      -       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       -      y      60     1       pickup
cleanup   unix  n       -      y      -      0       cleanup
qmgr      fifo  n       -      y      300    1       qmgr
#qmgr     fifo  n       -      n      300    1       nqmgr
#tlsmgr   fifo  -       -      n      300    1       tlsmgr
tlsmgr    fifo  -       -      n      300    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:オフ 1:オフ 2:オン 3:オン 4:オン 5:オン 6:オフ
# /etc/rc.d/init.d/postfix start


■クライアントの設定

次に、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