默认情况下,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 在MAIL
acl 中有一条规则: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}
对于经过身份验证的用户提交的消息,通过向ACL
SMTP
添加acl_smtp_data
类似以下内容:deny authenticated = * ! acl = acl_check_sender ${authenticated_id}
有些程序使用非- 经过身份验证的
SMTP
连接localhost
(或exim -bs
)。您可以向acl_smtp_data
ACL 添加以下内容:deny hosts = : localhost ! acl = acl_check_sender ${sender_ident}
并安装一些识别在服务器上。