web-dev-qa-db-ja.com

接尾辞はローカルホストにローカルユーザーのみを許可します

少し問題があります。独自のスクリプトを実行するために、一部のクライアントにサーバーへのアクセスを提供しています(もちろん、独自のchroot環境などで)。今日発生した問題:一部の人々はポート25でローカルホストへのtelnetアクセスを取得し、ほぼオープンリレーである世界中に電子メールを送信しています:(

Postfixを使用していますが、認証も必要です。

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:/etc/postfix/mysql-virtual_recipient.cf, reject_unauth_destination

ただし、ローカルスクリプトは明らかにsasl認証を受ける必要はありません。 permit_mynetworksからローカルホストを削除すると、一部のスパム対策ルーチンが機能しなくなります...

では、ローカルホストが認証なしで外部にではなくローカルにメールを配信できるようにするために、postfixを構成するにはどうすればよいですか?

助言がありますか?

1
Bene

したがって、スパム対策ルーチンはlocalhostを使用しており、悪意のある人々はlocalhostを使用しており、postfixは違いを区別できません

悪意のあるユーザーを禁止するか、信頼できるネットワーク(permit_mynetworks)からローカルホストを削除し、他のものを使用するようにスパム対策を構成します。または、 smtpd_client_restrictionscheck_ccert_accessでスパム対策を許可します。

質問に戻ります。あなたはこのようなものを求めています:

/etc/postfix/main.cf:
    smtpd_recipient_restrictions =
        /* replace permit_mynetworks with the next line */ 
        check_client_access hash:/etc/postfix/client_access,
        /* your other stuff */
        permit_sasl_authenticated,
        check_recipient_access mysql:/etc/postfix/mysql-virtual_recipient.cf,
        reject_unauth_destination

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

/etc/postfix/client_access:
    localhost      local_only
    127.0.0.1      local_only
    /* check bash#postconf mynetworks for full list of your networks */

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

ただし、スパム対策は外部の受信者にメールを再挿入するため、おそらく機能しません。しかし、それは状況によって異なります。

スパム対策ツールに関する詳細情報をお知らせください。サポートできる場合があります。

UDP:

メールフローがこの設定をどのように通過しているかを説明してください。

制限クラスをよりよく説明することはできません 公式ドキュメント

接尾辞制限クラス

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

すべての受信者にアクセス制限のリストを指定する必要があると、すぐに面倒になります。接尾辞制限クラスを使用すると、UCE制限のグループ(「許容」、「制限」など)に覚えやすい名前を付けることができます。

Postfix制限クラスが存在する本当の理由は、もっとありふれたものです。Postfixアクセステーブルの右側にルックアップテーブルを指定することはできません。これは、Postfixが事前にルックアップテーブルを開く必要があるためですが、読者はおそらくこれらの低レベルの詳細を気にしないでしょう。

制限クラスlocal_onlysmtpd_restriction_classes = local_onlyで定義します。そして

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

「このクラスがチェックされるたびに、チェック check_recipient_access (指定された access(5) データベースで解決されたRCPT TOアドレス、ドメイン、親ドメイン、またはlocalpart @を検索し、実行します。対応するアクション。)最初にメールを拒否し、それ以外の場合はlocal_domainsファイルに「this.domainがチェックに合格した場合、that.domainがチェックに合格した場合」と表示されます。

ただし、この制限クラスをすべての電子メールに適用する必要はありません。送信ホストがlocalhostの場合に適用し、permit_mynetworksルールを削除します。これを行うには、 check_client_access hash:/ etc/postfix/client_access (指定されたアクセスデータベースで、クライアントのホスト名、親ドメイン、クライアントのIPアドレス、または最下位のオクテットを削除して取得したネットワークを検索します。を参照してください。 access(5) 詳細についてはマニュアルページ。)smtpd_recipient_restrictionsへ。 /etc/postfix/client_accessファイルをチェックし、そのlocalhostlocal_only制限を適用するかどうかを確認するように指示されています。それがまさに私たちがやりたいことです。

それが役に立てば幸い。

メールフローは次のとおりです。

  • メールが届きます
  • smtpd_recipient_restrictions をループします
    • check_client_access(送信ホストがlocalhost apply local_only制限クラスの場合)
      • 今すぐcheck_recipient_access(受信者のRCPT TOアドレス、ドメイン、親ドメイン、またはlocalpart @が "this.domain"または "that.domain"の場合、このメールを受け入れます)(さらにチェックをスキップします)
      • それ以外の場合は拒否します
    • それ以外の場合は、permit_sasl_authenticated、check_recipient_access mysql:/etc/postfix/mysql-virtual_recipient.cfなどを続行します

UPD2興味があるかもしれないsmtpd_recipient_restrictions(および他の自己定義クラス)の別のオプションを見つけました

permit_auth_destination

次のいずれかに該当する場合にリクエストを許可します。

  • Postfixはメールフォワーダーです。解決されたRCPTTOドメインは$ relay_domainsまたはそのサブドメインと一致し、アドレスには送信者指定のルーティング(user @ elsewhere @ domain)が含まれていません。
  • Postfixが最終的な宛先です。解決されたRCPTTOドメインは、$ mydestination、$ inet_interfaces、$ proxy_interfaces、$ virtual_alias_domains、または$ virtual_mailbox_domainsと一致し、アドレスには送信者指定のルーティング(user @ elsewhere @ domain)が含まれていません。
2
Darigaaz

1つのオプションは、iptablesを使用して、それらのユーザーがポート25でローカルホストに接続できないようにすることです。例:

iptables -A OUTPUT -p tcp -d 127.0.0.1 --dport 25 -m owner --uid-owner user1 -j REJECT
iptables -A OUTPUT -p tcp -d 127.0.0.1 --dport 25 -m owner --uid-owner user2 -j REJECT
[etc]
0
kartik_subbarao