web-dev-qa-db-ja.com

Postfix:ユーザーが実際の電子メールアドレスを変更できないようにします

私のPostfix電子メールサーバーは、ようやくうまく機能しています。

ここで、ユーザーがヘッダーの「from」フィールドでクライアントプログラムの電子メールアドレスを偽造しないようにする必要があります。ユーザーはそれを使用して他のユーザーとして電子メールを送信でき、経験のないユーザーはそれを本物だと考えることができるからです。

ユーザーが経験を積んでいる場合、メールヘッダーを調べて何が起こっているかを知ることができますが、この動作をブロックする方法はありますか?

smtpd_sender_restrictionssmtpd_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の回答を必ずお読みください。

11
tarleb

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_アドレスで置き換えることもできます。

1
ominug

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リレーとアクセス制御 を確認してください。

1
Rui F Ribeiro