私のPostfix電子メールサーバーは、ようやくうまく機能しています。
ここで、ユーザーがヘッダーの「from」フィールドでクライアントプログラムの電子メールアドレスを偽造しないようにする必要があります。ユーザーはそれを使用して他のユーザーとして電子メールを送信でき、経験のないユーザーはそれを本物だと考えることができるからです。
ユーザーが経験を積んでいる場合、メールヘッダーを調べて何が起こっているかを知ることができますが、この動作をブロックする方法はありますか?
smtpd_sender_restrictions
とsmtpd_sender_login_maps
の設定をご覧ください。前者は不正なfrom
アドレスを防止でき、後者は送信者アドレスをログイン名と一致させることができます。
# Prevent malformed senders
smtpd_sender_restrictions =
reject_non_fqdn_sender # Ensure correct mail addresses
reject_unknown_sender_domain # Ensure sender address is from an existing domain
reject_authenticated_sender_login_mismatch # Check if the user is
# allowed to use this sender address
# Maps used to stop sender address forgeries.
smtpd_sender_login_maps = pcre:/etc/postfix/login_maps.pcre
login_maps.pcre
の内容は
# Use this regex if your users are local users, i.e. if the login name
# is just the username, not a full mail address.
# Note that literal dots have to be backslash escaped (`\.`) to avoid
# interpretation of these dots as regex wildcard.
/^([^@+]*)(\+[^@]*)?@example\.com$/ ${1}
# If one doesn't care about subaddresses, this could be simplified to
/^(.*)@example\.com/ ${1}
# This is appropriate if you have virtual users who login with their
# full mail address as their username. Local addresses won't work, though
/^(.*)$/ ${1}
上記の設定はpostfixがPCREのサポート付きでコンパイルされていることを前提としています。 Ubuntu/Debianでは、これにはpostfix-pcre
パッケージのインストールが必要です。
これは、認証されたユーザーだけがメールを送信できる場合にのみ機能することに注意してください。認証されていないユーザーからのメールを許可する場合、上記の方法は役に立たず失敗します。その場合は、Rui F Ribeiroの回答を必ずお読みください。
SMTP経由でメールを送信する場合、送信者のメールアドレスは、SMTP -_MAIL FROM
_リクエストとFrom
メールヘッダーフィールドの2つの異なる位置に表示されます。一部のMUAはFrom
メールヘッダーフィールドの値のみを表示します。
MAIL FROM
_アドレスの防止SMTPを介して認証されたユーザーが送信者アドレスを偽造しないようにするには、_reject_authenticated_sender_login_mismatch
_のオプション_/etc/postfix/main.cf
_を使用できます。次に、_smtpd_sender_login_maps
_も変更する必要があります。
_smtpd_sender_restrictions =
...
reject_authenticated_sender_login_mismatch,
...
smtpd_sender_login_maps = pcre:/etc/postfix/maps/smtpd_sender_login_map.pcre
_
その場合、_/etc/postfix/maps/smtpd_sender_login_map.pcre
_の内容は tarlebの回答 に従う必要があります。
ユーザーがローカルユーザーの場合、つまり、ログイン名が完全なメールアドレスではなくユーザー名だけの場合は、この正規表現を使用します。これらのドットが正規表現のワイルドカードとして解釈されないように、リテラルドットはバックスラッシュでエスケープする必要があります(_
\.
_)。
/^([^@+]*)(\+[^@]*)?@example\.com$/ ${1}
サブアドレスを気にしない場合、これは次のように簡略化できます。
/^(.*)@example\.com/ ${1}
これは、完全なメールアドレスをユーザー名としてログインする仮想ユーザーがいる場合に適しています。ただし、ローカルアドレスは機能しません。
/^(.*)$/ ${1}
上記の設定はpostfixがPCREのサポート付きでコンパイルされていることを前提としています。 Ubuntu/Debianでは、これには_
postfix-pcre
_パッケージがインストールされている必要があります。
sendmail
コマンドを使用しても、ローカルユーザーは送信時に任意の送信元アドレスを選択できます。これは、ハッキングされたユーザーアカウントでは問題になります。この問題の最も簡単な解決策は、おそらくPostfixの_main.cf
_でsendmailコマンドの使用を制限することです。例:
_authorized_submit_users = root
_
From
メールヘッダーアドレスを防止するPostfixだけではこれに対する簡単な解決策は提供されていないようです。ただし、 milter を使用して実行できます。
Rspamd の場合、次のコードで構成ファイル_/etc/rspamd.local.lua
_を作成/拡張できます。
_local logger = require 'rspamd_logger'
rspamd_config:register_symbol({
name = 'FROM_HEADER_MISMATCH',
callback = function(task)
local user = task:get_user()
if not user then
return 0
end
for index, smtp_sender in pairs(task:get_from(1)) do
if smtp_sender.addr ~= user then
logger.infox('invalid SMTP sender: %1', smtp_sender.addr)
return 1
end
end
for index, mime_sender in pairs(task:get_from(2)) do
if mime_sender.addr ~= user then
logger.infox('invalid MIME sender: %1', mime_sender.addr)
return 1
end
end
return 0
end,
score = 16,
description = 'sender address in at least one mail header ' ..
'differs from the sender address in the envelope'
})
_
これにより、複数の送信元アドレスを持つメールがスパムとしてマークされ、Postfixによるメッセージの拒否が発生します。エンベロープヘッダーを偽造できない場合にのみ、偽造されたFrom
ヘッダーを防止します(回答の最初の部分を参照)。
または、milter vrfydmn は、From
メールヘッダーのアドレスをSMTP _MAIL FROM
_アドレスで置き換えることもできます。
SMTPの偽造を防止することはできず、基になるプロトコルはセキュリティを考慮して設計されていませんが、内部ユーザーによる電子メールの偽造の影響をpostfixで最小限に抑えることができます。
認証を使用してポート587経由で電子メールを送信するために認証する必要があるように、postfixとクライアントを構成できます。
ただし、それによってメールの送信が妨げられることはありませんが、スパムマルウェアの存在がより困難になります(不可能ではありません)。
Gmailについては、コードのカスタマイズが多数あり、独自の独自の電子メールサーバーまであります。私がISPを管理していたときに、QMailの拡張機能を収集して作成し、ドメインからではないメールを転送できないようにしました。また、FROMフィールドで既存の認証済みユーザーのみを受け入れます(たとえば、認証)
Postfixで認証されたユーザーのみにメールをリレーするには、/etc/postfix/main.cf
ディレクティブの先頭にあるsmtpd_recipient_restrictions
ファイルに、次の2つのオプションがあることを確認してください。
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
詳細については、公式ドキュメントの Postfix SMTPリレーとアクセス制御 を確認してください。