我还真没有想到的是,这个 Dovecot 邮件服务器配置的话题,换一个发行版就能写一篇补充。
笔者:国际认证信息系统审计师、软考系统分析师
起因是看到某公众号写了一篇关于某甲方从 CentOS 7 迁移到国产 Linux 发行版 openEuler ,发现 MongoDB 数据库运行不起来,原来是缺了依赖组件于是从别的地方直接移植的故事。
刚好最近确实在评估各种国产发行版的上车选择问题。所以就用 openEuler 来试一下配置 Dovecot。下载地址:
考虑到是初尝试,于是选择了 openEuler 22.03 LTS SP2。发行时间是 2023年6月,计划的生命周期终结时间(EOL)是2024年3月,话说作为LTS这EOL是否太短了点?可能是为商业发行版让路?
版本 | 发行时间 | 计划EOL时间 |
---|---|---|
openEuler 22.03 LTS SP2 | 2023-06 | 2024-03 |
openEuler 22.03 LTS SP1 | 2022-12 | 2024-12 |
openEuler 22.03 LTS | 2022-03 | 2024-03 |
但再看22.03的原版和SP1版,SP1的EOL居然是最长的,我确实看不懂......算了。
操作系统本身最小化安装,过程顺利。然后配置邮件服务器的过程就是我前面那篇文章对着做:
因为 openEuler 是有提供 Dovecot 的预编译软件包,所以不需要从源代码编译安装的过程。
老司机了属于是,轻车熟路,一直正常,直到最后设置用邮件客户端软件 Thunderbird 收取 logwatch 邮件......
就不行了,囧。
Thunderbird 收邮件时完全没反馈,于是查看 openEuler 的系统日志:
tail -f /var/log/maillog
发现内容有类似如下的报错(为方便查看,我加了换行):
pop3-login:
Error:
Failed to initialize SSL server context:
Can't set cipher list to 'PROFILE=SYSTEM' (ssl_cipher_list setting):
error:1410D0B9:SSL routines:SSL_CTX_set_cipher_list:no cipher match:
user=<>, rip=192.168.121.1, lip=192.168.121.237, secured, session=
表面上看,原因是邮件客户端软件 Thunderbird 发起加密POP3连接时使用的加密算法在 openEuler 操作系统预设支持的加密算法策略配置中不存在。
错误信息中提及的:
ssl_cipher_list = PROFILE=SYSTEM
的定义在:
/etc/dovecot/conf.d/10-ssl.conf
配置文件中。
查看配置文件,可以看到关于该设置:ssl_cipher_list 的可选项说明。该设置可以直接给出允许使用和不允许使用的加密算法的清单,也可以直接按操作系统的设置,也就是 PROFILE=SYSTEM 这一项。
于是去比对其他厂商发行版的 Dovecot 配置即10-ssl.conf,发现全都是一样的写着 PROFILE=SYSTEM。
有问题先找源头。根据参考文档:
还有这份:
可知 CryptoPolicy 这个设置,是已经有相当年头的设计。
为了使操作系统、应用程序和加密算法三者之间有良好的过渡关系,fedora 设计了三种预定义的加密算法应用策略,分别是LEGACY(传统)、DEFAULT(默认)和FUTURE(未来),每种策略分别代表了由多种加密算法构成的一个集合。
后来再增加了FIPS这一种,以能符合FIPS 140标准要求。
系统管理员可以在修改 /etc/crypto-policies/config 配置文件后使用 update-crypto-profiles 命令应用,从而实现对老旧应用程序的兼容,又或者在合适时提早丢弃安全性落伍的加密算法。
openEuler 的配置文件中指出还增加了“NEXT”这一种配置策略,介乎于DEFAULT和FUTURE之间,是下一版本的操作系统所使用的加密算法集合。
兔子洞不深挖了。检查 openEuler 发现配置文件所设置的依然还是 DEFAULT 策略。这没理由不支持啊奇怪。
于是用 openssl 命令去观察,如下操作过程中,发起访问的是龙蜥 Anolis Linux 8,被访问的 192.168.121.237 是 openEuler:
[root@ANOLIS8 dovecot]# openssl s_client -servername 192.168.121.237 -connect 192.168.121.237:pop3s
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 313 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
[root@ANOLIS8 dovecot]#
各种 NO NOT NONE。好吧,一切都是空白。
为了搞清楚究竟屏蔽了什么加密算法,我用tcpdump抓包邮件客户端和Dovecot服务器之间的加密POP3流量,保存为抓包文件然后进行分析。抓包命令是:
tcpdump -i ens33 -w 抓包文件名 port 995
然后用 wireshark 这个抓包工具打开抓包文件进行分析。可以发现就在TLS 握手阶段,Dovecot 服务器就主动断了连接:
怪不得 openssl 握手测试都是NONE。
而具体地,TLS 握手的 HELLO 包指出,邮件客户端 Thunderbird 给出的是 TLS 1.2 版的握手请求,支持的加密组合算法17种、分组6种、哈希算法11种:
熟悉加密算法体系的朋友都很清楚这些算法。
检查 openEuler 的默认策略具体是什么,方法是查看:
/etc/crypto-policies/state/CURRENT.pol
文件,内容是按生效的策略DUMP出具体的加密算法组合和设置清单。
其中,有几个关键项目:
min_dh_size = 1023
在 Dovecot 10-ssl.conf 配置文件中提示需要生成4096位的dh.pem,网上也有些解决办法指出需要有符合最低位数要求的 dh.pem文件 POP3S 连接才能生效。但实际(经过测试确认) dh.pem 并不是必须的。所以问题不是在产生 dh.pem 时设置的位数不足上。
min_tls_version = TLS1.0
protocol = TLS1.3 TLS1.2 TLS1.1 TLS1.0 DTLS1.2 DTLS1.0
以上两项确定了加密连接基于 TLS 1.2 是受支持的。
于是再组合cipher、group和hash三项,比对邮件客户端给出的对应三项,结果发现两者是相容的。
具体比对过程太长忽略掉,只是需要为不熟悉加密算法的朋友提个醒,SHA256和SHA2-256是一回事。
确实觉得很奇怪,但总要解决问题。
干脆试试把 openEuler 的加密策略改为最宽容的 LEGACY ,也就是修改:
/etc/crypto-policies/config
文件,把DEFAULT改为LEGACY,保存然后执行 update-crypto-policies:
[root@OPENEULER crypto-policies]# update-crypto-policies
Setting system policy to LEGACY
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.
重启 Dovecot 服务(或者重启系统),然后测试POP3S连接,故障依旧。
看来问题是出在对 PROFILE=SYSTEM 的处理上。
不折腾了,决定绕过这个设置的问题。
解决办法是修改 Dovecot 10-ssl.conf 配置文件,不再设置 PROFILE=SYSTEM,而是按配置文件的提示,设置具体允许和禁止的加密算法清单,典型如配置文件中所给出的,禁止所有非EC的设置:
ssl_cipher_list = ALL:!DH:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@STRENGTH
保存配置文件,重启服务(包括系统加密算法策略恢复为DEFAULT),测试,邮件客户端 Thunderbird 就能正常通过POP3S连接收取系统日志邮件到本地了。
这个过程折腾完,暂时认为 openEuler 的开箱即用并没有做到家。具体原因还有待进一步研究,但作为用户来说,绕过问题能正常且保证安全地使用就行。
顺带一提,我又倒回去摆弄了一下 Anolis Linux 23 GA 的加密策略,结果再跌一次眼镜。运行 update-crypto-policies 命令直接就异常出错了,关键提示摘要如下:
ModuleNotFoundError: No module named 'tomllib'
ModuleNotFoundError: No module named 'toml'
原来最少化安装时缺了其实是必备但现在标记为过时的Python3 TOML(Tom's Obvious, Minimal Language)支持,执行:
dnf install python3-toml
后 update-crypto-policies 命令才正常。
还没完。接着还发现日志没有滚动。虽然 logrotate 包是安装了,但并没有在 cron.daily 里面配置每天运行的脚本......这GA质量居然连这么基本的事情都能缺。
从 Anolis 8 把脚本复制过来也就解决问题了。最后正常情况应该是这样的:
[root@anolis23 cron.daily]# ll -Z
total 8
-rwxr-xr-x. 1 root root system_u:object_r:bin_t:s0 486 Apr 15 11:18 0logwatch
-rwxr-xr-x. 1 root root system_u:object_r:bin_t:s0 190 Oct 4 17:24 logrotate
[root@anolis23 cron.daily]# cat logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit $EXITVALUE
[root@anolis23 cron.daily]#
结论:要用在生产上的 Linux 发行版,莫要尝鲜。
本站微信订阅号:
本页网址二维码: