AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 972064
Accepted
Philip Couling
Philip Couling
Asked: 2019-06-20 02:31:31 +0800 CST2019-06-20 02:31:31 +0800 CST 2019-06-20 02:31:31 +0800 CST

重写电子邮件 (RFC822) 发件人地址以匹配 MAIL FROM (RFC821) 信封地址后缀

  • 772

我正在采取措施强化我的传出 postfix SMTP 服务器。我想防止用户欺骗他们的发件人地址。

当使用 postfix SMTP 发送电子邮件时,发件人通过三种方式被识别:

  1. 在电子邮件本身中有一个From:标题 - 如RFC 822中所定义
  2. 使用 SMTP 发送时,有一个MAIL FROM地址 - 如RFC 821中所定义
  3. 登录到 postfix (SMTP) 时,客户端指定一个用户名,该用户名也可以解释为发件人

查看手册,我相信reject_sender_login_mismatch和reject_unlisted_sender将共同保证MAIL FROM电子邮件与postifx 登录相关联。那是上面的2和3匹配。

我被困在如何确保所有三个匹配。如果结果只是重写消息而不是拒绝,我很高兴,但两者都可以。但是我看不到这样做的方法。我可以看到清理会添加一个缺少的From:标头,但我看不到检查和重写的方法。


感谢那些指出另一个类似问题的人。不幸的是,这并没有帮助,因为这个问题有两个答案,一个非常模糊,另一个似乎是错误的。

postfix
  • 1 1 个回答
  • 872 Views

1 个回答

  • Voted
  1. Best Answer
    Philip Couling
    2019-06-27T04:17:24+08:002019-06-27T04:17:24+08:00

    我花了一些时间研究这个,我找不到一个纯粹的后缀方式。使用的一个建议header_checks似乎不起作用,因为您不能(AFAIK)将一个标头与另一个标头匹配。

    可以编写自己的程序/脚本来为您执行检查并将其用作content_filter。


    步骤1

    这是我用python编写的简化版本。这会从标准输入读取一封电子邮件,MAIL from并将RECPT to地址作为参数。它检查From:标题MAIL from是否匹配,如果它们不匹配则替换它。我将其另存为/usr/share/mail_filter/filter.py:

    #! /usr/bin/python3
    
    import sys
    import subprocess
    import email.parser
    import email.policy
    
    parser = email.parser.BytesParser(policy=email.policy.default)
    message = parser.parse(sys.stdin.buffer)
    
    envelope_from = sys.argv[1]
    envelope_to = sys.argv[2]
    # This if statement checks envelope from against message from
    if message['From'].addresses[0].addr_spec != envelope_from:
        print(f"Replacing sender {message['from']} with {envelope_from}", file=sys.stderr)
        message.replace_header('From', envelope_from)
    
    # sendmail -G -i -f sender@sender_domain.tld recipient@recipient_domain.tld
    sendmail = subprocess.Popen(["/usr/sbin/sendmail", "-Gif", envelope_from, envelope_to], stdin=subprocess.PIPE)
    with sendmail.stdin:
        sendmail.stdin.write(message.as_bytes())
    
    # If sendmail returns an error, cascade it back to postfix
    sys.exit(sendmail.wait())
    
    

    第2步

    更新/etc/postfix/master.cf:

    # added the -o content_filter...
    smtp inet n       -       y       -       -       smtpd
      -o content_filter=filter:dummy
    
    # Added this entire service
    filter    unix  -       n       n       -       10      pipe
      flags=Rq user=filter null_sender=
      argv=/usr/share/mail_filter/filter.py ${sender} ${recipient}
    

    请注意,这引用了步骤 1 中的脚本位置和步骤 3 中定义的用户

    第 3 步

    filter我在有权使用的组中添加了一个操作系统用户sendmail。

    useradd --system --gid postdrop filter
    

    注意事项

    根据说明,简单过滤器(使用 转发sendmail)只能应用于 SMTP 客户端,不能过滤通过 sendmail 发送的消息。如果这对您来说是个问题,那么您需要编写一个高级内容过滤器。

    • 1

相关问题

  • Postfix 在特定端口上接受邮件

  • 让 Postfix 以两种方式处理垃圾邮件

  • Postfix 或 exim:自动/程序化和转发电子邮件设置

  • 后缀电子邮件地址

  • 什么是最好的开源电子邮件解决方案包

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve