我有一个 SMTP 中继服务器,最近我用运行 Server.app 的 OS X 10.10 Yosemite 替换了它。它作为仅 SMTP 中继运行,只允许来自 LAN 的主机通过它中继出去。我们这样做是为了确保来自我们子网的所有邮件都能从经过验证的主机正确发送,以符合发件人策略框架 (SPF) 等要求。
配置中继输出非常简单。按照苹果的文档在 OS X Server 上禁用邮件服务,我做了以下事情:
sudo serveradmin settings mail:global:skip_enable_service_check = yes
sudo serveradmin settings mail:imap:enable_imap = no
sudo serveradmin settings mail:imap:enable_pop = no
sudo serveradmin settings mail:imap:enable_sieve = no
sudo serveradmin stop mail
sudo serveradmin start mail
这确保只有 SMTP 正在运行,并且在重新启动或重启邮件服务后仍然如此。由于 SMTP 中继服务器的主机名是其中继域中的子域,因此我还必须进行修改/Library/Server/Mail/Config/postfix/main.cf
以从“mydestination”中删除$myhostname
& $mydomain
,结果行如下:
mydestination = localhost.$mydomain, localhost
这也奏效了,Server.app 识别并保留了更改(通过运行 进行验证)。对行进行调整以限制接受来自哪些子网的中继也sudo serveradmin settings mail:postfix
同样如此。mynetworks
我遇到的问题是,对行的修改smtpd_pw_server_security_options
(特别是删除LOGIN
&PLAIN
身份验证类型)不会保留,并在启动邮件服务时恢复为默认值(其中包括不需要的纯文本身份验证类型)。Apple 的文档Mac OS X Server 中 Apple 特定的后缀选项暗示跳过LOGIN
&PLAIN
选项应该是有效的。
我努力了:
- 上述
smtpd_pw_server_security_options
修改/Library/Server/Mail/Config/postfix/main.cf
- 正如 Apple 特定的后缀选项文档中提到的那样,运行
sudo serveradmin settings mail:postfix:smtpd_use_pw_server = no
(mail:postfix:smtpd_use_pw_server
在 Yosemite 下似乎是一本空字典) - 运行
sudo serveradmin settings postfix:smtp_sasl_auth_enable = yes
(在 Yosemite 下默认为“否”,因此我认为 Apple 只是将此选项的功能与上面的mail:postfix:smtpd_use_pw_server
选项进行了互换) - 用于从数组中
serveradmin
删除login
&元素(例如),但正如 Charles Edge 在他的 kyrpted 博客文章中提到的那样plain
mail:postfix:smtpd_pw_server_security_options
sudo serveradmin settings mail:postfix:smtpd_pw_server_security_options:_array_index:2 = delete
删除 OS X Server 中的“serveradmin 设置”条目,该功能似乎已损坏。而且,这些设置未在/Library/Server/Mail/Config/MailServicesOther.plist
任何其他 .plist 中镜像,因此手动修改这些设置似乎不是一个选项。
我已经使用 Server.app 暂时禁用了纯文本身份验证,方法是将纯文本身份验证设置从部分选中的复选框(可能是因为 IMAP 被禁用)切换到完全取消选中的复选框,但它不一致并且在重新启动邮件服务后不会保留。
任何建议或解决方案都将不胜感激,但建议不要在 OS X 上使用 Server.app。这是一家全 Apple 商店,必须对 Apple 产品进行狗粮测试,原因我无法在此详述。当然,出于明显的安全和 PCI DSS 合规性原因,保持纯文本身份验证处于启用状态也不是一种选择。
答案1
我可以通过 Server.app 禁用 SMTP 纯文本身份验证(经过一些调整),但效果不是很好(在重新启动或重启邮件服务后肯定无法恢复,有时甚至在 Server.app 中搜索时会丢失)。我意识到,作为一种临时解决方法,我至少可以在“PLAIN”和“LOGIN”纯文本 SMTP 身份验证重新启用时自动通知。
我编写了以下快速 Bash 脚本来完成这项工作:
#!/bin/bash
#
# smtp_plaintext_auth_check - check to see if plaintext auth is supported by SMTP service and warn if it is
#
# v0.1 2015-03-12 - Morgan Aldridge <http://serverfault.com/users/13496/morgant>
# Initial version.
#
admin_emails="[email protected]"
debug=false
host=$(hostname)
date=$(date +%Y-%m-%d-%H%M)
plaintext_auth_enabled=false
# check via serveradmin to see if plaintext auth is allowed by the SMTP server
if $debug; then echo "Checking Mail service to see if SMTP plaintext auth is supported..."; fi
while IFS= read -r line; do
if [[ "$line" =~ (plain|login) ]]; then
if $debug; then echo " Found '${BASH_REMATCH[1]}' SMTP auth method which is plaintext!"; fi
plaintext_auth_enabled=true
fi
done <<< "$(serveradmin settings mail:postfix:smtpd_pw_server_security_options)"
# if plaintext auth is enabled, notify admins
if $plaintext_auth_enabled; then
if $debug; then echo "Notifying admins via email that SMTP plaintext auth IS supported. That's bad!"; fi
mail -s "Error on $host: SMTP plaintext auth is allowed! $date" $admin_emails <<-EOM
ERROR on $host: SMTP plaintext auth appears to be allowed by the Mail service! This is a security risk and against PCI DSS compliance!
Please resolve ASAP!
EOM
else
if $debug; then echo "Phew, SMTP plaintext auth doesn't appear to be supported. That's good."; fi
fi
再次强调,这是解决方法我更愿意以编程方式禁用 SMTP 纯文本身份验证。