Exim - 限制用户可以从哪些地址发送

Exim - 限制用户可以从哪些地址发送

默认情况下,exim 允许任何用户使用他们想要的任何“发件人:”地址发送电子邮件,这可能导致用户互相欺骗。如何限制每个系统用户可以从哪些地址发送?例如,用户james应该能够从 james@localhost 发送,但也可以[电子邮件保护][电子邮件保护]

我希望所有系统用户都能够从他们的 SYSTEM_USER@HOSTNAME 发送电子邮件,但如果他们尝试从另一个地址发送,我想在文本文件中查找该地址以查看是否允许。

我目前有一个列表,但它是系统用户将从哪些地址接收的。但它仍然可以工作。给出示例,[email protected]数据存储在文件中/etc/exim4/virtual/my-domain.com,内容如下:

me : james@localhost

如果我们可以重复使用现有文件那就太好了。但任何建议都会有帮助。提前谢谢您。

答案1

Exim4已经对信封发件人From:Sender:本地提交的消息进行了一些标准检查(参见受信任的用户)。由于您想要扩展此验证,您应该:

  • sendmail对于通过(即)提交的消息exim4 -bm,添加到主配置部分:

    # allow untrusted users to set an envelope sender
    untrusted_set_sender = *
    # don't delete the Sender: header
    local_sender_retain = true
    # don't add Sender: header
    local_from_check = false
    
  • 对于通过 提交的消息,SMTP您需要添加control = submission/sender_retain修饰符。例如,Debian 在MAILacl 中有一条规则:

    accept
      authenticated = *
      control = submission/sender_retain
      control = dkim_disable_verify
    

要配置检查,您需要在邮件处理的不同阶段添加一些ACL规则。由于这些规则需要应用于不同的邮件提交方式,您可以创建一个新的命名ACL(我假设您的所有/etc/exim4/virtual/<domain>文件都返回username@localhost为值):

# Requires system user id in $acl_arg1
acl_check_sender:

  # Users with default domain
  accept
    condition = ${if eq{$sender_address}{$acl_arg1@$qualify_domain}}
    condition = ${if eq{${address:$h_from:}}{$acl_arg1@$qualify_domain}}
    condition = ${if match_address{${address:$h_sender:}}{:$acl_arg1@$qualify_domain}}

  deny
    ! condition = ${if and{\
        {exists{/etc/exim4/virtual/${domain:${address:$h_from:}}}}\
        {eq {${acl_arg1}@localhost}\
          {${lookup {${local_part:${address:$h_from:}}}\
            lsearch{/etc/exim4/virtual/${domain:${address:$h_from:}}}\
          }}\
        }\
      }}
    message = Spoofed From: header.

  # Most messages don't have a Sender: header, but if it is not empty, check it.
  deny
    ! condition = ${if or{\
        {eq {$h_sender:}{}}\
        {and{\
          {exists{/etc/exim4/virtual/${domain:${address:$h_sender:}}}}\
          {eq {${acl_arg1}@localhost}\
              {${lookup {${local_part:${address:$h_sender:}}}\
                lsearch{/etc/exim4/virtual/${domain:${address:$h_sender:}}}\
              }}\ 
          }\
        }}\
      }}
    message = Spoofed Sender: header.

  deny
    ! condition = ${if and{\
        {exists{/etc/exim4/virtual/$sender_address_domain}}\
        {eq {${acl_arg1}@localhost}\
          {${lookup {$sender_address_local_part}\
            lsearch{/etc/exim4/virtual/$sender_address_domain}\
          }}\
        }\
      }}
    message = Spoofed envelope sender.

  accept

对于字符串扩展的语法(相当多的括号),请检查第 11 章Exim 文档。您可以使用exim4 -bem <message> <expansion_string>它来测试它们(信封发件人像格式)。

您可以将其应用于不同的情况:

  • 对于通过 提交的消息exim4 -bm,向 ACL 添加acl_not_smtp以下规则:

    deny
      ! acl = acl_check_sender ${sender_ident}
    
  • 对于经过身份验证的用户提交的消息,通过向ACLSMTP添加acl_smtp_data类似以下内容:

    deny
      authenticated = *
      ! acl = acl_check_sender ${authenticated_id}
    
  • 有些程序使用- 经过身份验证的SMTP连接localhost(或exim -bs)。您可以向acl_smtp_dataACL 添加以下内容:

    deny
      hosts = : localhost
      ! acl = acl_check_sender ${sender_ident}
    

    并安装一些识别在服务器上。

相关内容