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


Postfix制限クラス

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

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

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

例:

/etc/postfix/main.cf:
    smtpd_restriction_classes = restrictive, permissive
    # With Postfix < 2.3 specify reject_unknown_client.
    restrictive = reject_unknown_sender_domain reject_unknown_client_hostname ...
    permissive = permit

    smtpd_recipient_restrictions = 
	permit_mynetworks
	reject_unauth_destination
	check_recipient_access 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 =
        check_recipient_access 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 =
        check_recipient_access 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 コマンドを 使ってください。

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