完全安全的 Postfix MTA (SMTP) 配置

信息安全 加密 tls smtp 惊吓
2021-09-04 03:06:46

我想通过服务来保护我的根服务器(进一步)服务,从最繁忙的 SMTP 服务(Postfix MTA)开始。在设置所有内容的过程中,我阅读了很多关于安全和加密的内容,并尽我所能收集最有价值的信息。但是,一些问题似乎仍然存在,我找不到其他任何东西来使配置完美。

期望的行为

我希望服务尽可能严格,即尽可能使用安全加密。STARTTLS只有在(提交)安全加密后才允许进行身份验证。

  • 服务器到服务器通信:高度加密,仅在必要时不加密
  • 客户端到服务器的通信:仅高度加密
  • 仅在端口 587 进行客户端身份验证(可选?)

差异化

主要关注的是 Postfix MTA 的安全性、加密和安全相关设置。我不寻求反垃圾邮件或反病毒解决方案的建议——这完全是另一回事。电子邮件加密不是选项,因为关注的是隐私而不是真实性,这最终不能证明客户端需要付出不合理的高昂努力是合理的。

当前配置

  • 服务器:Debian 7 (Wheezy)
  • MTA:后缀 2.9.6
  • CaCert 证书:4096 位 / sha512-RSA

文件/etc/postfix/main.cf摘录:

tls_random_source=dev:/dev/urandom

# Incoming
smtpd_tls_cert_file=/etc/ssl/cacert/certs/example.com.crt
smtpd_tls_key_file=/etc/ssl/cacert/private/example.com.key
smtpd_use_tls=yes
smtpd_tls_auth_only=yes
smtpd_tls_security_level=may
smtpd_tls_mandatory_ciphers=high
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# Outgoing
smtp_tls_cert_file=/etc/ssl/cacert/certs/example.com.crt
smtp_tls_key_file=/etc/ssl/cacert/private/example.com.key
smtp_use_tls=yes
smtp_tls_security_level=may
smtp_tls_mandatory_ciphers=high
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# SASL Authentication (dovecot)
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = no

smtpd_recipient_restrictions =
   permit_sasl_authenticated,
   permit_mynetworks,
   reject_unauth_destination

# prevent leaking valid e-mail addresses
disable_vrfy_command = yes

文件/etc/postfix/master.cf摘录:

smtp      inet  n       -       -       -       -       smtpd
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

开放式问题

  • starttls.info状态:

    信任链中有一个自签名证书 [...] 证书存在有效性问题。很少为 SMTP 服务器验证证书,因此这并不意味着不会使用 STARTTLS。一般来说,没有有效证书是一种不好的做法,不验证它们是一种更糟糕的做法。任何尝试的加密通信都几乎容易受到中间人攻击。

    这是关于服务器到服务器通信的问题吗?如果是这样,我可以做些什么来改善这一点而无需支付证书(我只有我个人认识的客户)

  • 同一网站指出:

    接受匿名 Diffie-Hellman。这对于中间人攻击是可疑的。

    需要什么设置来禁用这些?(另见下一个列表项)

  • testssl.sh显示端口 587 的问题:

    --> Testing standard cipher lists
    ...
     Anonymous NULL Cipher    offered (NOT ok) 
     Anonymous DH Cipher      offered (NOT ok) 
    ...
    

    这可能与上一个项目相同。

  • testssl.sh显示端口 25 的问题:

    --> Testing Protocols
     SSLv3      offered (NOT ok)
    ...
    --> Testing standard cipher lists
    ...
     Anonymous NULL Cipher    offered (NOT ok) 
     Anonymous DH Cipher      offered (NOT ok) 
     40 Bit encryption        offered (NOT ok) 
     56 Bit encryption        Local problem: No 56 Bit encryption configured in /usr/bin/openssl 
     Export Cipher (general)  offered (NOT ok) 
     Low (<=64 Bit)           offered (NOT ok) 
     DES Cipher               offered (NOT ok)
     Triple DES Cipher        offered
     Medium grade encryption  offered
    ...
    RC4 seems generally available. Now testing specific ciphers...
    ...
    

    这仅适用于服务器到服务器的通信吗?如果不是,这怎么可能?至少应根据main.cf文件禁用 SSLv3。如何解决这些问题?

  • ssl-tools.net状态:

    *.example.com - 证书与主机名不匹配

    本身可能不是安全问题,但与上面的第一项结合起来很有趣。如果通配符证书不正确,我应该选择什么主机名?example.comhost.example.com

  • 我还能做些什么来使配置完全安全?

2个回答

小切线 - SMTP 不安全,您只是在谈论 MTA。TLS 证书验证模式(主题验证)只是一小部分,如果解决了其他问题,则无关紧要。例如,如果您使用 SMIME 或 PGP,则 TLS 可能无关紧要。这取决于你的威胁是什么。

你说 TLS 是首选,必要时未加密。这被称为机会加密。大多数现代 MTA 都这样做。

是的,自签名的私有 TLS 证书很常见并且经常使用。您不必验证证书。但是,由于多租户和其他问题,无法将域名与证书本身绑定。

请注意,如果您坚持从给定域入站的 TLS 连接,您将错过由 SPF 记录授权的群发邮件发送的广播电子邮件。我知道有几家银行通过不使用 TLS 来实现可扩展性的广播服务发送安全警报。

您缺少 AV/AS、内容/链接扫描、MUA 安全、白名单、DKIM、SPF、DMARC、SMIME、PGP、BATV、目录收集攻击,......这个列表还在继续,等等。

重要的是要注意公共 SMTP 发件人(可以使用端口 25 并发送未加密内容)与用于身份验证和安全客户端-服务器内容传输的客户端提交之间存在很大差异。

我不喜欢依赖公共发件人的偏执和安全级别,而是始终考虑域用户的安全性和用户对用户的机密级别。

首先,我建议使用此根证书或中间证书创建您自己的 CA 和 sigh 服务器证书,在用户之间分发此证书并以受信任的方式安装。这将避免任何中间人攻击并保护客户端到服务器的数据交换。第二 - 请排除 SSLv2 和更低的协议。我什至排除了 SSLv3。分配可接受的密码列表也更好。下面是 postfix 的配置示例。

smtpd_tls_protocols = !SSLv2,!SSLv3,TLSv1,TLSv1.1,TLSv1.2
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtpd_tls_mandatory_ciphers =HIGH 
smtpd_tls_exclude_ciphers=aNULL:eNULL:LOW:3DES:MD5:MEDIUM:EXP:PSK:DSS:RC4:SEED:ECDSA:CAMELLIA256-SHA
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

对于不安全的发件人,我关闭收件人列表并将 spf 记录添加到 DNS 以避免任何中继。您可以通过从“mynetworks”中删除本地服务器或添加发件人限制来手动限制本地服务器,默认情况下本地发件人地址将被拒绝。

smtp  inet  n  - - - -  smtpd -o content_filter=spamassassin
   -o smtpd_sender_restrictions=permit
   -o smtpd_recipient_restrictions=permit_mynetworks,mysql:/etc/postfix/mysql-receiver.cf,reject

至于提交部分(仅适用于域用户),最好请求加密,以避免通过公共不安全网络发送明文密码。

submission inet n   -   n   -   -   smtpd
  -o smtpd_enforce_tls=yes
  -o smtpd_tls_security_level=may # (! possible to force, but limits mail clients list and not recommended at all - non standard) -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=/var/spool/postfix/private/dovecot-auth
  -o smtpd_sasl_security_options=noplaintext # or (!!! - use according to your paranoid level)  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_recipient_restrictions=mysql:/etc/postfix/mysql-receiver.cf,permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_recipient,reject
  -o smtpd_sasl_authenticated_header=yes

通过呈现的配置,我们得到:

  • 客户端到服务器加密和端口 587 sasl 身份验证义务
  • 启用服务器到服务器 tls(但我建议无论如何都使用 vpn 隧道进行基础设施通信)。