PostfixによるSMTPサーバの構築(SuSE9.0編)


おやじは、SMTP サーバとして Postfix を使用していますが、SuSE9.0 のデフォルトも Postfix なので簡単に設定できました。標準版のままで AUTH+TLS に対していますので、バージョンが2.0.14と少し古いですがそのまま使用することにしました。
 携帯電話宛てメールの遅延、不達対策はこちらを参考にしてください。

いくつか気が付いた点がありますので、以下に示します。

  1. SuSE の Postfix は、chroot していない。YaST で chroot に対応できるようだが、今回はテストはしていない。
  2. AUTH 用の sasl は sasl2 のみの対応になっており、saslauthd で PAM 認証、即ち、UNIX パスワードでの認証が基本になっている。 もちろん、saslpasswd2での認証への変更も可能。

■サポート範囲の明確化

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

機 能 使 用 範 囲 備 考
SMTP AUTH TLS
× × 家庭内から、インターネットや家庭内アカウントにメールを送信するだけ。 送信先は任意
家庭内向けの受信は必須
× 上記に加え、外部環境(インターネット側)から自宅サーバを利用して他のインターネットアカウントにも送信できるようにする。但し、インターネット上を平文のパスワードが流れるので危険。
フルアクセスが可能。TLSによる暗号化によりパスワードをガードできるので、外部からの利用も安全。
以下に各機能の実現方法を示しますが、必要な部分のみ設定を行えば良いように記述してあります。

なお、外部環境から使用する場合は是非TLSまで対応してください。プロバイダのSMTPを使用するときは、そんなことはしていないと思われるかもしれませんが、自宅SMTPサーバ利用とプロバイダのSMTPサーバ利用ではパケットが流れているところが違います。プロバイダのSMTPを利用する場合は、ホールセーラの場合ですと、ホールセーラ <-> 専用線 <-> プロバイダ(SMTP)のため(ダイヤルアップもホールセーラ相当)、ホールセーラやプロバイダ内部に悪意をもった者がいない限りまず安心です。但し、自社のネットワーク(AP)以外からもアクセスを許容している場合は、プロバイダに乗り入れるまでの経路が特定できないため、暗号化しないで使用することは危険です。自宅SMTPサーバを外部から利用する場合も、これに該当します。自宅SMTPサーバはどこからでも利用できるので便利なのですが、盗聴される危険性は高くなるので、注意が必要です。

SuSE では、YaST を使って GUI である程度設定できますが、細かい設定ができるわけではないことと、Postfix の設定に関しては一部設定の反映がおかしいところもあるので使わないこととしました。但し、誤って YaST で設定を触ってしまうと意図しない設定になってしまう可能性があるので、Postfixに関しては設定できないように、YaST の設定ファイルが置いてあるディレクトリ ( /etc/sysconfig ) 内にある Postfix の設定ファイル ( postfix )をバックアップディレクトリに移動してしまいました。

# mkdir /usr/local/yast
# mv /etc/sysconfig/postfix /usr/local/yast/

■SMTP 関係の設定

まずは、メール送受信の基本的な設定を行うため、/etc/postfix 配下にある main.cf を編集します。なお、main.cf の最後の部分には YaST が付与した設定がズラズラと付いているので、これを削除して使用しました。削除したのは、「readme_directoy = /usr/share・・・」の次の行「mail_spool_directoy = /var/mail」以降です。一応、バックアップをとってから作業したほうが良いでしょう。というか、原本のバックアップは基本中の基本と思います。特に初めてのソフトの場合、思考錯誤で何がどうなっているのか分からなくなることが多いですから、バックアップさえとっておけばいつでもインストール時の状態に戻せますので。

◆基本的な設定(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が牽ける名前でないと、相手サーバで
# エラー発生時に返信するためチェックされており、その時点で蹴られてしまうので、注意が
# 必要である。
# ここでの設定は後述するsaslpasswd2の設定時のmydomainと同一でないとエラーとなるので
# 注意が必要。
#myorigin = $mydomain
myorigin = $myhostname

# メール受信の設定
# メールを受け取るネットワークインタフェースのアドレス範囲を指定する。
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
inet_interfaces = all

# メールの最終目的地とみなす範囲の指定
#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を合わせたものとlocalhost指定)
#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

# ローカル配送で使うアリアス関係の指定
#alias_maps = dbm:/etc/aliases
#alias_maps = hash:/etc/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases
alias_maps = hash:/etc/aliases

#alias_database = dbm:/etc/aliases
#alias_database = dbm:/etc/mail/aliases
#alias_database = hash:/etc/aliases
#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases
alias_database = hash:/etc/aliases

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


◆aliases の修正

SuSE インストール時の「新しいローカル・ユーザの追加」でユーザ情報設定時に「システム・メールを受け取る」にチェックを入れておけば、自動的に root 宛はこのユーザに配送されますのでここでの設定は不要です。もし設定していなかった場合は、以下で root 宛てのメッセージを受け取れる実在するユーザに配送先を変更する必要があります。ここでは、おやじ宛てに配送する変更例を示します。

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

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

# newaliases


■SMTP Authetication関係の設定

SMTP Authetication に関しては、main.cf の設定とパスワード関係の設定が必要です。認証に関しては、まずは SuSE のデフォルトである sasiauthd による PAM 認証、即ち UNIX パスワードによる認証を行うものとします。SASL パスワードによる認証は、下記 main.cf の設定とあわせてこちらを参考にしてください。なお、 SMTP AUTH がクライアントでうまくいかないときは、手動でテストしてみると状況がつかめるかもしれません。

◆main.cf の設定

SMTP Autheticationに関しては、/usr/share/doc/packages/postfix/samples ディレクトリ内に sample-auth.cf があるので、この内容を、/etc/postfix/main.cf に追加コピーして編集します。なお、一部、sample-smtpd.cf と sample-compatibility.cf の内容も含みます。
ここでは、sample-auth.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

# 認証時の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 関係の設定をします。と言いましたが、SuSE では saslauthd の基本的な設定はされており、saslauthd を起動すれば PAM による認証が行われるようになっています。具体的には、以下の設定です。

  1. /usr/lib/sasl2/smtpd.conf に以下の設定がされており、saslauthd によりPLAIN 認証と LOGIN 認証がなされる。

    pwcheck_method: saslauthd
    mech_list: plain login

  2. YaST の「システム」にある「/etc/sysconfigエディタ」を開き、「Sytem」->「Security」->「SASL」->「SASL_AUTHD_AUTHMECH」で、「pam」が指定されており、これにより saslauthd 起動スクリプトは pam による認証を行うオプションで起動する。

  3. YaST の「システム」にある「ランレベル・エディタ」を開き、「saslauthd」を選択し「有効にする」ボタンを押すと、サービスが起動した旨のメセージが出るので確認し、「完了」ボタンを押す。
ところが、Outlook Express で SMTP AUTH をすると「SASL LOGIN authentication failed」と認証エラーになってしまいます。そこで、手動でテストしてみたところ、PLAIN 認証が有効になっていませんでした。cyrus-sasl をコンパイルしなおしかと YaST で検索したところ、何のことはありませんでした。「cyrus-sasl-plain」 というモジュールが別になっていましたので、これを下記で追加インストールしておしまいでした。

  1. YaST の 「ソフトウェア」にある「ソフトウェアのインストール/削除」 を開き、「フィルタ」 を 「検索」 とし検索欄に 「sasl」 と入力し 「検索」 ボタンを押す。

  2. 右側に該当するパッケージが出てくるが、その中の「cyrus-sasl-plain」にチェックマークを入れて 「了解」 を押す。saslauthd の再起動を忘れずに。

sasl パスワードによる認証

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

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

    pwcheck_method: auxprop

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

    # saslpasswd2 -c -u mydomain ユーザ名

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

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

    # saslpasswd2 -d -u mydomain ユーザ名

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

    # sasldblistusers2
    oyaji@mail.aconus.com: userPassword

■TLS 関係の設定

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

◆main.cfの設定

TLS化に関しても、/usr/share/doc/packages/postfix/samples ディレクトリ内に sample-tls.cf があるので、この内容を、/etc/postfix/main.cf に追加コピーして編集できます。sample-tls.cf の後半には、クライアントの設定がありますがそのままにしておくとエラーが出るので、TLS 用乱数デバイスの指定のところまで削除してください。
ここでは、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

# 認証時の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_daemon_random_source = dev:/dev/urandom
#
tls_random_source = egd:/var/run/egd-pool
# tls_random_bytes = 32
# tls_random_reseed_period = 3600s

# tls_random_upd_period = 60s

# tls_daemon_random_source = dev:/dev/urandom
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) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
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
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
localhost:smtp-backdoor inet n - n - - smtpd -o content_filter=

■Postfix の起動・再起動

Postfix はデフォルトで組み込まれ、自動実行スクリプトも組み込まれますので、再起動だけしてください。
# /etc/init.d/postfix restart


■クライアントの設定

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


Topページへ