我已经使用 Exim 和 Dovecot 设置了一个简单的邮件服务器。显然我不想拥有开放的中继服务器,所以我想限制来自外部的访问。我设计了以下配置:
- Dovecot 监听端口 587 和 993,并使用我的 LDAP 服务器执行身份验证/授权,运行良好。
- Exim 本身不执行任何用户身份验证,仅接收外部邮件并将其分发到用户的邮件目录中。到目前为止一切顺利。
- 这是我的问题 - 如果我想发送电子邮件,我的 MUA 会与 Dovecot 提交模块对话 -> 它对用户进行身份验证和授权 -> 并将电子邮件转发给 Exim。我在 Dovecot 中配置了:
submission_relay_host = 127.0.0.1
submission_relay_port = 25
并在 Exim 中添加了相关 ACL,允许仅从本地主机进行中继,因为 Dovecot 在同一台机器上运行。尽管我在配置中没有使用任何公共 IP 地址,但 Exim 仍然将连接解析为从我的服务器的公共 IP 建立的,并且只有当我将其添加到 Exim ACL 时才允许中继。
两个问题:
- 如果我允许这个公共 IP 进入 Exim ACL,会造成多大的安全问题?我可以想象 IP 欺骗攻击,但攻击者必须欺骗我服务器的 IP,我相信这会使两个相同 IP 之间的通信变得不可能……对吗?因此首选方案是:
- 我如何强制 Dovecot 使用环回而不是公共 IP 与 Exim 通信?是 Dovecot 决定使用公共 IP 与 Exim 通信,还是 Exim 将本地主机的 IP 地址解析为公共 IP?在 /etc/hosts 中,我只有 127.0.0.1(本地主机)的条目,甚至没有列出带有 FQDN 的公共 IP...
答案1
如果您让 Exim 而不是 dovecot 监听提交端口并传输邮件(使用 daemon_smtp_ports = 25 : 465 : 587),那么您遇到的问题就会少一些。您可以将 Exim 配置为使用 dovecot 进行用户身份验证(在我的系统上,在新文件 /etc/exim4/conf.d/auth/35_exim4-config_auth_server 中):
DOVECOT_AUTH_SOCKET = /var/run/dovecot/auth-client
plain:
driver = dovecot
public_name = PLAIN
server_socket = DOVECOT_AUTH_SOCKET
server_set_id = $auth1
server_advertise_condition = ${if eq{$tls_in_cipher}{}{no}{yes}}
[...]
我认为 $tls_in_cipher 在某些时候已被重命名,请查看文档。确保用户必须在提交端口上进行身份验证(在我的系统中为 /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt):
acl_check_rcpt:
# deny non-authenticated messages on submission port
deny
condition = ${if eq{$interface_port}{587}}
! hosts = <; ; 127.0.0.1 ; localhost ; ::1
! authenticated = *
message = Please authenticate on submission port (587)
#[... your checks ...]
# accept authenticated messages on submission port
accept
condition = ${if eq{$interface_port}{587}}
authenticated = *
#add_header = X-Submission: true
control = submission/sender_retain
然后,您需要在 Dovecot 中定义身份验证监听器(在我的系统上,位于 /etc/dovecot/conf.d/10-master.conf):
unix_listener auth-client {
mode = 0660
user = Debian-exim
}