SMTP認証とネット規制の両立

外部からの直接メール着信を規制するもっとも簡単な方法は、/etc/hosts.denyまたはallow で接続禁止してしまうことだろう。

だけど、この方法ではSMTP認証もできなくなってしまう場合がある。よって回避方法が必要になる。

以下、「外部からの着信を許すのは特別なひとつのサーバのみ、送信はSMTP認証のみ」という形態を考える。ちなみに587番ポートも使うがそれはまた別の話である。

Postfix

方法1

/etc/postfix/access での設定は甘い気がする。むしろ、mynetworksで規定した以外を全部捨てた方が楽だ。

また、/etc/hosts.allowで規制するとSMTP認証できなくなってしまうわけで、これに対処するには

ようにすればいいのだと思われる。

inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain
mynetworks_style = host

mynetworks = 127.0.0.0/8,接続元に許可したいサーバをカンマ区切りで並べる

smtpd_recipient_restrictions = permit_mynetworks,
        check_recipient_access hash:/etc/postfix/access,
                                permit_sasl_authenticated,
                                reject

こうすると、「指定したネットワークの中」「/etc/postfix/accessで許しているか」「SMTP認証を試みる」の順番にチェックし、全部に外れたり認証失敗すると配送されずエラーとなる。

追記(2008/09/24)

方法1の穴。

/etc/hosts.allowで規制しても通過可能にはできる。つまりpostfixに関してはこの解説は半分嘘である。たとえば以下を見る。

smtpd_recipient_restrictions =
  permit_mynetworks
  check_client_access hash:/etc/postfix/access
  permit_auth_destination
  permit_sasl_authenticated
  reject

postfixはこの記述順に確認していく。『つまりmynetworksの記述にある奴かどうか調べて』、次に『/etc/postfix/accessに確認しにいく』。次が『/etc/hosts.allowなどのチェック』で『最後にSMTP認証を確認』する。全てでこけたら拒否(リジェクト)

こんな感じである。慣れてしまうと便利です :D

ただし扱いを間違えると、SMTP認証に対応しているが外部からのメールがどうあっても着信しないとか 思わぬミスも出る 。注意してほしい。

方法2

基本的に1と同じなのだが、以下のようにする。mynetwork、SMTP認証、dracd(POP before SMTP)とチェックを続け、accessファイルのチェックを最後に回しているのが特徴である。

注意点としては、accessファイルがreject基本となっていること。ここまできたメールはOKまたはRELAY等と明記してない限り、ほとんどここで拒絶(REJECT)される事になってしまうようになっている。またPOP before SMTPが動いているのは古い顧客対応のためであるが、これは現在が移行期間であるからで、後にこの行は削除される。

smtpd_recipient_restrictions =
  permit_mynetworks
  permit_sasl_authenticated
  check_client_access btree:/var/lib/drac/dracd
  check_client_access hash:/etc/postfix/access reject
  check_relay_domains
  reject

/etc/postfix/access は以下の通り。

localhost       RELAY
127.0.0.1       RELAY
antivirus鯖    OK

Sendmail

hosts.allowとかでやってしまうと、SMTP認証もできなくなってしまう。かといってSMTP認証のために最低限の接続を認めると、今度はローカル着信が可能になってしまう。

対処方法はいくつかありうるが、たとえばローカル配送にprocmailを使うならば以下のような強引な手法もある。

 /etc/procmailrc

 :0 H:
 * ! ^Received:.*mxレコードに忠実な配送元1
 * ! ^Received:.*mxレコードに忠実な配送元2
 * ! authenticated\ bits=0.*自分自身
/var/tmp/filterd-mails

一行めと二行めは直接接続の抽出である。この中でSMTP認証を使った者を探しこれはスルーさせる。こうする事により、ローカルユーザの正しいローカル配送を目的地に到達させる。

どちらにも属さないもの、つまり直接接続かつ認証もしていないユーザは上の場合、ファイルに吐き出される。

注意するべきは、この場合maillogの方はローカルユーザに配送成功となっていることである。フィルタにかけているのはprocmailなので、sendmail的にはあくまで配送成功である。よって、これの記録を残すには全ての該当メールをpostmasterに届けるか、procmailのログに記録しておく必要がある。

テスト方法

設定はしたがやりっぱなしというのも何なので、テストの方法を考えてみる。

SMTP認証テスト

どこからでも認証できないとダメ。よって以下の方法をとってみる。

ローカルネットのどこかからSMTP認証

外部ネットのどこかからSMTP認証

ローカル配信テスト

他から許される接続元を通した送信

許される接続元を通さない送信

POP before SMTPテスト(有効なマシンのみ)

一部に存在するのでテストする。

POP before SMTP 無効状態

POP before SMTP 有効状態