openEuler 安装配置 Dovecot 邮件服务器排障

作者:Sender  来源:本站  发布日期:2023-10-05  最后修改日期:2023-10-05

我还真没有想到的是,这个 Dovecot 邮件服务器配置的话题,换一个发行版就能写一篇补充。

article banner

笔者:国际认证信息系统审计师、软考系统分析师

前情

起因是看到某公众号写了一篇关于某甲方从 CentOS 7 迁移到国产 Linux 发行版 openEuler ,发现 MongoDB 数据库运行不起来,原来是缺了依赖组件于是从别的地方直接移植的故事。

刚好最近确实在评估各种国产发行版的上车选择问题。所以就用 openEuler 来试一下配置 Dovecot。下载地址:

https://www.openeuler.org/zh/download/archive/

考虑到是初尝试,于是选择了 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居然是最长的,我确实看不懂......算了。

操作系统本身最小化安装,过程顺利。然后配置邮件服务器的过程就是我前面那篇文章对着做:

经典有效的日志监控邮件集中巡检 Linux 服务器

因为 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。

有问题先找源头。根据参考文档:

https://fedoraproject.org/wiki/Changes/CryptoPolicy

还有这份:

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/security_hardening/using-the-system-wide-cryptographic-policies_security-hardening

可知 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 服务器就主动断了连接:

1 dovecot rst connection

怪不得 openssl 握手测试都是NONE。

而具体地,TLS 握手的 HELLO 包指出,邮件客户端 Thunderbird 给出的是 TLS 1.2 版的握手请求,支持的加密组合算法17种、分组6种、哈希算法11种:

2-cipher-17

3-group-6

4-sign-13

熟悉加密算法体系的朋友都很清楚这些算法。

检查 openEuler 的默认策略具体是什么,方法是查看:

/etc/crypto-policies/state/CURRENT.pol

文件,内容是按生效的策略DUMP出具体的加密算法组合和设置清单。

5-openeuler-current-policy

其中,有几个关键项目:

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 发行版,莫要尝鲜。

本栏目相关
  •  2010-01-25 Linux 下的分区调整工具GParted实战
  •  2020-02-27 服务器热加硬盘、热转RAID模式,配合LINUX卷操作实现不重启服务器完成扩容
  •  2022-02-24 如何安装使用 Broadcom RAID卡命令行管理工具 StorCLI(或称PercCLI)?
  •  2022-02-25 Linux 软路由网络吞吐优化设置
  •  2022-12-12 Linux Kernel 日志排错分析和处置三例
  •  2023-02-01 安装MegaRAID存储管理器17.05.06版的好一番折腾(Linux篇)
  •  2023-02-08 Linux有什么工具能自动清理释放存储空间?
  •  2023-10-05 openEuler 安装配置 Dovecot 邮件服务器排障
  •  2023-06-25 Linux 单臂软路由设置及流量监控ntopng避坑
  • 微信订阅号二维码

    本页网址二维码:

    本栏目热门内容
  • Acrobat虚拟PDF打印机执行打印时挂起,解决办法竟然...
  • LINKSYS交换机登录WEB界面显示不正确的解决方法
  • 又一次RAID 5阵列故障记录
  • 解决VMware vSphere ESXi 5.0 Update 1 中虚机不能...
  • 修改CentOS发行信息以绕过Dell服务器BIOS更新和DSET...
  • 解决虚拟化运行的 Windows Server 2003 标准版出现...
  • Windows Server 2008 重命名域和域控制器
  • Intel Nehalem CPU Errata 导致 VMWare ESXi(vSpher...
  • 一次很精神的电脑组装过程记录(但不是自己的电脑)...
  • 解决MySQL Cluster 备份总是失败,提示文件已存在的...
  • MegaCli安装及使用杂记
  • 解决WSUS显示客户端不全的问题
  • 解决 VMWare vSphere 6 客户端无法修改用户密码
  • 解决Windows Server 2008 R2域控制器显示无法连接到...
  • 本站服务器RAID 5阵列双硬盘失效挽救记录
  • 网站数据库从MySQL 5.0升级到5.6的记录
  • 解决MariaDB使用Percona XtraBackup增量备份出错
  • DELL PowerEdge 820 报CPU3 INTERNAL ERROR 的解决...
  • Linux 下的分区调整工具GParted实战
  • 修改arpwatch使通知邮件主题显示IP地址
  • 程序员漫画:如何用8种不同的编程语言去解救公主
  • 解决很好用的多合一即时通信软件pidgin的崩溃问题
  • 解决Samba WINS服务的错误解释问题
  • 使用 GParted 进行虚拟机硬盘分区调整操作
  • 解决Squid代理HTTP时在浏览器出现Content Encoding ...
  • 用Delphi编写使用到ADO的DLL的一些问题
  • 网站简单改版
  • 索尼系列手提电脑备份失败,出现700错误的解决办法
  • Dell R900服务器 BMC firmware incompatible with C...
  • 更多...