web-dev-qa-db-ja.com

Postfix 2.9またはsendmail、送信スパム防止(送信者が存在するかどうかを確認してください)

  • オペレーティングシステム:Linux Ubuntu 12.04 TLS
  • コンテキスト:Plesk 11.5
  • ユーティリティ:Postfix 2.9.6(更新はPlesk 11.5ディストリビューションによって制限されています)

Postfixですべての送信SMTPメールの「送信者」フィールドをチェックして(送信前)、送信者が任意の有効な作成済みアカウント(メールユーザー)のいずれかと一致するようにしますサーバーでホストされているドメインの数(送信を承認するための条件として)。

これは、1つのドメインがスパム送信者スクリプトに感染するたびに、通常 'random-name'@infected-domain.tldのようなパターンを使用するためです。したがって、sender-user-existフィルターを適用することで、サーバーの評判への影響を減らすことができ、現在のように迅速にブラックリストに登録されるのを防ぐことができます(ホストされているドメインは悪意のあるスクリプトに感染しています)。

したがって、ここでは、特定のドメイン制限を求めているのではなく、Postfixで送信する前に「MailFrom:」フィールドの特定のユーザー制限を求めています(受信メールの受信時ではありません)。

編集1

最後に、ここでの問題は、/ usr/sbin/sendmailが認証なしでPostfixを使用して送信できることだと思いましたね?それとも、私が知らないうちにどこか別の場所で構成されていますか?

少なくとも、sendmailの便利でわかりやすいドキュメントを手伝っていただけませんか。 Plesk 11.5のようなマルチユーザー環境では、それがどのように機能するかを理解するのに本当に役立つものは何も見つかりませんでした。

そのため、Postfixから直接フィルタリングしたいと思います。これは、メールを信頼または送信するための中心的なポイントだからです。

編集2

最後に検索して、Postfix 2.4 +authorized_submit_users=> http://www.postfix.org/postconf.5.html#authorized_submit_users のディレクティブを破棄しました

感染したドメインのユーザーである/ usr/sbin/sendmailプロセスのUIDのみをチェックします。

追加:

authorized_submit_users = !unknown, static:all

問題を解決しません。

編集3

一緒に働く

#/etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks

そして、 negative lookahead を使用した正規表現フィルタリングオプション:

#/etc/postfix/header_checks
/^From: ".*(?!user1|user2|user3).*@infected-domain.tld/ REJECT

何か案が?別のスレッドを開く必要がありますか?

解決しました!

以下に自分で答えることで、この特定のケースに合わせてカスタマイズされたソリューションを提供しました。皆様の情報、コラボレーション、サポートに感謝します!

2
rellampec

最後に、header_checksで送信スパムをフィルタリングするの解決策を見つけましたが、それがどれほど効果的で効率的かはわかりません。

警告

  • この緩和手法ソリューションは、感染をクリーンアップしません。
  • これは、攻撃が実際のドメイン名と偽のユーザー名または電子メールアカウントを送信者として使用してスパムを送信する場合にのみ役立ちます(From:)。
  • 感染が他のドメイン名を送信者として使用する場合(From:)、この正規表現は効果的ではありません。

/usr/sbin/sendmailは、送信者として実際のアカウント([email protected])ではなく、ランダムに存在しないメールアカウント([email protected])を使用する場合は常に、感染したスクリプトによってスパムに使用されます。 )、メールヘッダーは、次のように、接尾辞の組み込みコンテンツ検査を使用して確認できます header_checks

#/etc/postfix/main.cf
# add it for example before TLS paramaters
# Anti-SPAM options
header_checks = pcre:/etc/postfix/header_checks

Header_checksファイルの正規表現では、ドメインの実際のユーザー(つまり、user1、user2、...)を除外する必要があります。

#/etc/postfix/header_checks
/^From:((?![^@]*?user1|[^@]*?user2|[^@]*?user3|[^@]*?webmaster)[^@]*?)@my-domain\.tld/ REJECT invalid sender

正規表現の説明(どのような変更でも、これを使用できます regex tester ):

  • [^@]@以外の任意の文字
  • [^@]*?@を除く任意の文字、0回以上、怠惰な貪欲でない(*?)。
  • (?!user1|user2|etc)代替案を伴う否定的な先読み:ドメインの実際のユーザーを破棄します。
  • (?![^@]*?user1|[^@]*?user2|etc)各ユーザーのメールアドレスの前に文字を許可します。

変更を加える前に、次の方法でテストできます(最初のパス、2番目の拒否)。

$ postmap -q "From: [email protected]" pcre:/etc/postfix/header_checks
$ postmap -q "From: [email protected]" pcre:/etc/postfix/header_checks
REJECT invalid sender
$

または、感染中にキャプチャされたメッセージヘッダーを含むファイルを使用してテストすることもできます(注意:ここではダッシュが重要です)。

$ postmap -q - pcre:/etc/postfix/check_headers < captured_headers.txt
From: "[email protected]      REJECT invalid sender
From: "[email protected]      REJECT invalid sender
$

テスト後、目的の結果が得られたら、Postfixを再起動します。

# service postfix restart
 * Stopping Postfix Mail Transport Agent postfix                [ OK ]
 * Starting Postfix Mail Transport Agent postfix                [ OK ]

それがどのように起こっているかを確認するために、1つの可能なコマンド:

# tail -n 10000 /var/log/mail.log | grep reject
or
# tail -n 10000 /var/log/mail.log | grep 'invalid sender'

これが他の誰かに役立つことを願っています。

[〜#〜]編集[〜#〜]

正規表現のいくつかの修正:

#/etc/postfix/header_checks
/^From:(?![^@]*?user1@|[^@]*?user2@|[^@]*?user3@|[^@]*?webmaster@)([^@]*?@my-domain\.tld)/
REJECT invalid sender $1

Postmapチェックはうまく機能しますが、postfixはドメインの偽造された電子メールユーザーをフィルタリングしていません(最後の感染はフィルタリングしませんでした)。何故かはわからない。

2
rellampec

この図 を見てください。メールがpostfix、sendmail(ピックアップ経由)、smtpd、qmqpdを入力できる3つの独立した入り口があります。 ここでは最後の入り口はめったに使われませんでした。

電子メールがsmtpdを介して送信される場合、電子メールの送信元は外部から送信される可能性があります(127.0.0.1からの接続の場合を除く)。外部の電子メールは明らかに信頼できないと見なされていました。そのため、postfixには、RBLチェッカー、オープンリレーチェッカー、blaclisting/whitelistingなどのブロックする標準機能があります。 Postfix SMTPリレーとアクセス制御 を参照してください。

デフォルトでは、サーバーと127.0.0.1のIPアドレスは信頼できると見なされていました。これは、このホストから接続できる人は誰でも、スパム以外にさらに破壊を引き起こす可能性があるためです。たとえば、スクリプトがWebサーバーにアップロードされている場合、Webルートを削除したり、バックドアを仕掛けたりする可能性があります。

別のtrustedメールの入り口は、sendmail/mailプログラム経由でした。基本的に、phpがmail関数を呼び出すか、ターミナルからメールを呼び出すときは、sendmailにメールをpostfixキューに入れるように指示します。アップロードされたスクリプトなど、一部のユーザーがボックスにアクセスできない限り、Sendmailを呼び出すことはできません。


これで、あなたの主な質問に答える準備ができました:データベースに対して送信者を確認するにはどうすればよいですか?

Smtpd接続の場合、postfix機能 Postfix SMTPリレーとアクセス制御 check_sender_accessを使用して、ユーザーデータベースを再度チェックできます。 Pleskを使用したことがないため、詳細を説明することはできません。 sendmail/mailコマンドの場合、上記のフィルターは電子メールの送信元の影響を受けないため、postfix コンテンツ検査 (ミルターまたはキューコンテンツフィルターの後)が必要です。

2
masegaloeh

私はamavisd-newでこれを行います。どこから来たか(ローカルまたは外部)に関係なく、すべての電子メールをスキャンするようにamavisを設定しています。これらのタイプのスパムメッセージには大量の不正なヘッダーがあり、魔女は簡単にamavisdに捕まる可能性があります。多くのメールクライアント(Outlookなど)が正しく実行しないいくつかのヘッダーチェックを無効にする必要があります。

この投稿は、pleskの認証方法に適用される場合にも役立つ可能性があります。 接尾辞の認証された送信者のヘッダーを確認してください

この質問では、認証された送信者をチェックしますが、追加する必要があるのは、その認証されたユーザーヘッダーを送信者ヘッダーに一致させるルールだけです。

0
TriadicTech