Postfix クライアント/サーバ/他ごとのアクセス制御


Postfix 制限クラス

Postfix SMTP サーバは SMTP サーバ access(5) テーブルの右側部分で reject_rbl_clientreject_unknown_client といったアクセス制限をサポートしています。これによりクライアントやユーザ ごとに異なるジャンクメール制限を実装することができるようになります。

全ての受信者にアクセス制限のリストを指定していると、すぐに退屈に なってしまいます。Postfix 制限クラスによって UCE 制限のグループに ("permissive" や "restrictive" などのような) 覚えやすい名前を付ける ことが出来るようになります。

Postfix 制限クラスが存在する本来の理由はもっと現実的なものです: Postfix access テーブルの右側部分には検索テーブルを指定することが 出来ません。これは Postfix が前もって検索テーブルを開く必要があるため ですが、読者はこのような低レベルな詳細はおそらく気にしません。

例:

/etc/postfix/main.cf:
    smtpd_restriction_classes = restrictive, permissive
    restrictive = reject_unknown_sender_domain reject_unknown_client ...
    permissive = permit

    smtpd_recipient_restrictions = 
	permit_mynetworks
	reject_unauth_destination
	hash:/etc/postfix/recipient_access

/etc/postfix/recipient_access:
    joe@my.domain	permissive
    jane@my.domain	restrictive

これを使うと、クライアントや helo、送信者、受信者ごとの SMTPD access テーブルの右側部分で "restrictive" や "permissive" が使えます。

このドキュメントの残りの部分では Postfix access 制限クラスの使われ方を 説明しています:

これらの質問は頻繁に上がっていますが、Postfix 制限クラスが本当に正しい 解ではないということを、この例によって明らかにすることを願っています。 これらは設計の意図通りに使われるべきであり、クライアントやユーザごとに 異なるジャンクメール制限を使うべきです。

内部Eメール配布リストを保護する

内部Eメール配布リストを実装しようと思います。all@our.domain.com のような もので、これは従業員全てに対するエイリアスです。最初は aliases マップを 使おうと思ったのですが、"all" が "外部" からアクセスできるようになって しまうので、これは望ましくありません... :-)

Postfix はアドレスごとの access 制御を実装しています。以下のものは SMTP クライアント IP アドレスを元にしており、そのため IP スプーフィングの 影響を受けます。

/etc/postfix/main.cf:
    smtpd_recipient_restrictions =
        hash:/etc/postfix/access
        ...the usual stuff...

/etc/postfix/access:
    all@my.domain   permit_mynetworks,reject
    all@my.hostname permit_mynetworks,reject

システムが db ファイルの代わりに dbm を使っているので あれば、hash の代わりに dbm を指定してください。Postfix が サポートしているマップの形式を知るには、postconf -m コマンドを 使ってください。

さて、あなたのマシンが全てのインターネットメールをインターネットから 直接受信する場合にはこれで十分です。ネットワークがオフィスよりも少し 大きければ不幸です。例えば、バックアップ MX ホストは外部からのメールの クライアント IP アドレスを "わからなく" してしまうので、メールは信頼された マシンから来ているように見えてしまいます。

一般的な場合、2つの検索テーブルを使う必要があります: 1つは保護が必要な 配送先をリストアップしたテーブルで、もう1つは保護された配送先への送信が 許されるドメインをリストアップしたテーブルです。

以下は送信者の SMTP エンベロープアドレスに基づくものなので、SMTP 送信者の なりすましの影響を受けます。

/etc/postfix/main.cf:
    smtpd_recipient_restrictions =
        hash:/etc/postfix/protected_destinations
        ...the usual stuff...

    smtpd_restriction_classes = insiders_only
    insiders_only = check_sender_access hash:/etc/postfix/insiders, reject

/etc/postfix/protected_destinations:
    all@my.domain   insiders_only
    all@my.hostname insiders_only

/etc/postfix/insiders:
    my.domain       OK  matches my.domain and subdomains
    another.domain  OK  matches another.domain and subdomains

SMTP 送信者アドレスをなりすませばよいだけなので、このスキームを回避 するのは比較的簡単です。

内部リストが小規模であれば、おそらくモデレートする方が意味が あるでしょう。

サイト外の配送先にメールを送信できるユーザを制限する

あるユーザはインターネットにメールを送信できて、それ以外は出来ない ようにするには、Postfix をどのように設定すればよいのでしょうか。 アクセスできないユーザは一般的なバウンスメッセージを受け取るように します。そのようなアクセス制限が必要かどうかは議論しないでください、 私の決定ではないので。

Postfix はユーザごとの制限をサポートしています。制限は SMTP サーバに よって実装されています。つまり、ポリシーを破ったユーザは SMTP サーバに よってメールを拒否されます。このように:

554 <user@remote>: Access denied

これを実装するには2つの検索テーブルを使います。1つはメールの送信先が 制限されたユーザを定義したテーブルで、もう1つはどの配送先がローカルかを 定義したテーブルです。これをあるユーザだけがサイト外の配送先にメールを 送信できて、ほとんどのユーザが制限されるというスキーマに変更するのは、 読者の宿題にします。

例では DB/DBM ファイルを想定していますが、LDAP や SQL でもできます。

/etc/postfix/main.cf:
    smtpd_recipient_restrictions =
        check_sender_access hash:/etc/postfix/restricted_senders
        ...other stuff...

    smtpd_restriction_classes = local_only
    local_only = 
        check_recipient_access hash:/etc/postfix/local_domains, reject

/etc/postfix/restricted_senders:
    foo@domain      local_only
    bar@domain      local_only

/etc/postfix/local_domains:
    this.domain     OK      matches this.domain and subdomains
    that.domain     OK      matches that.domain and subdomains

システムが db ファイルの代わりに dbm を使っているので あれば、hash の代わりに dbm を指定してください。Postfix が サポートしているマップの形式を知るには、postconf -m コマンドを 使ってください。

注意: このスキーマはユーザ認証をしないため、いくつかの方法で回避できて しまいます: