因此,我购买了一台 VPS 和一个域名(my_domain.com
例如),现在我想建立自己的基于 exim4 的电子邮件基础设施,用于学习目的。为了不产生开放中继,我需要对身份验证的最佳实践有一些基本的了解。
我最初的理解是,MTA(exim4)在身份验证时应该扮演两个角色:
当我的 MUA(例如 MacBook 上的 Apple Mail)通过 SMTP 连接到它时,它必须坚持进行身份验证。如果发件人地址是
[email protected]
,则 VPS 上的(Debian)用户的用户名/密码me
应该可用。我的 ISP 分配了可变的 IP 地址,因此我无法将 MAU 固定为特定的地址,也不知道适用的范围。无论如何,经过这样的身份验证后,MTA 应该将消息发送(中继?)到相关的 MTA(例如mail.your-domain.com
,在),而无需进一步的身份验证。当另一个 MTA(
mail.your-domain.com
比如说,在)通过 SMTP 联系我的 MUA 时,它应该仅当目标域是my_domain.com
(即,允许将其作为本地域)时才保留它进行传送,否则将其转储(即,不充当开放中继)。
我的问题有两个方面:我的基本理解是否正确,以下一组答案是否可以dpkg-reconfigure exim4-config
实现此设置/目标?
mail name: my_domain.com
IP-addresses to listen on for incoming SNMP connection: (the VPS)
local domains: mail;my_domain.com
domains to relay mail for: (none)
machines to relay mail for: (none)
keep DNS-queries minimal: no
delivery method for local mail: mbox format in /var/mail
split configuration file into small files: no
root and postmaster mail recipient: root
我目前感到困惑,因为其中没有提到任何身份验证(或者 MTA 甚至可以基于什么理由区分来自 MUA 或其他 MTA 的 SMTP 连接)以及是否会“转储”发送到本地域以外的域的消息。在我看来,这似乎允许我的 MTA 从my-domain.com
任何地方接收消息,而不是开放中继,但也不允许我的 MUA 通过它发送任何消息。
答案1
exim
功能强大且足够灵活,可以扮演您想要的任何角色。但对于正常的 SMTP 操作,唯一需要身份验证的情况是“有人想通过我提交或转发消息”。提交和转发应受到严格限制,以防止被 DNSBL 驱逐。如果exim
服务于某个子网,s&r 通常仅限于该子网。但如果客户端主机在互联网上漫游,并且来自各个子网的 IP 动态变化,则限制客户端的唯一可能性就是身份验证。
首先,你必须启用 SSL/TLS 的 SMTP 加密
daemon_smtp_ports = 25 : 465 : 587
tls_on_connect_ports = 465
tls_certificate = /path/exim.crt
tls_privatekey = /path/exim.key
生成的自签名对openssl
就足够了。加密是端口 25 上的普通 SMTP 或 587 上的 MSA 的选项,并且是 465 上的 SMTPS 的必需选项。
仅对加密客户端可以进行身份验证,以防止通过未加密的连接传递登录密码:
auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}
$tls_cipher
建立 TLS 时生成的任何非空值都是开始身份验证的好兆头。
现在我们可以使用 ACL:
acl_smtp_connect = acl_conn
acl_smtp_rcpt = acl_rcpt
acl_smtp_data = acl_data
begin acl
.....
acl_rcpt:
accept authenticated = *
accept hosts = : +relay_from_hosts
require domains = +relay_to_domains : +local_domains
deny
这里我们在三种情况下接受 s&r 的消息:
- 如果客户端已经通过身份验证
- 如果客户端来自知名主机/子网列表
- 如果消息是发往我们某个域的传入消息。
- 最后一条规则
deny
不是必需的,因为第三条规则deny
隐含地规定了这一点,但是为了更好地理解,我喜欢在所有情况下都明确地给出最终的接受/拒绝。
其他 MTA 通常通过第三条规则传递,无论它们是否经过身份验证。我们不能要求其他 MTA 进行身份验证,因为 RFC 没有强制要求这样做。但我们严格限制所有外部 MTA 只向我们的域发送消息。在任何情况下,我们都不会将他们的消息转发到其他域。
答案2
Debian 配置提供的设置适用于普通本地使用。更复杂的设置(例如身份验证)将需要手动编辑配置。
重新配置拆分配置可能更容易。然后您可以在 /etc/exim4/conf.d/auth/ 中启用身份验证。文件 30_exim4-config_examples 包含许多注释掉的示例,这些示例应该足以帮助您完成操作。
该plain_server
代码片段使用passwd
/etc/exim4/ 中的一个文件,其中包含以冒号分隔的用户名和密码。默认情况下,exim 仅在连接加密时提供身份验证,这是一件好事。
我使用 dovecot 的身份验证服务来验证 exim 中的用户;这样,如果用户可以访问 dovecot(例如 IMAP),那么他们可以使用相同的凭据通过 exim 发送电子邮件。