在CentOS服务器运维中,最让人头疼的事情之一就是安全补丁的及时更新。手动执行yum update不仅效率低,还容易遗忘,导致服务器长期暴露在已知漏洞之下。最直接有效的解决方案就是通过yum-cron配合crontab定时任务,实现安全补丁的自动下载和自动安装,让服务器在凌晨低峰期自动完成补丁更新,运维人员早上起来只需确认邮件通知即可。下面我会把整套配置流程、注意事项、常见坑点全部讲透。
一、为什么必须用yum-cron而不是手动yum update
很多运维新手觉得手动敲一条yum update -y就完事了,但实际生产环境中这么干有三个致命问题。第一,人会忘,尤其是服务器多了以后,不可能每天登录每台机器去更新。第二,手动更新没有记录,出了问题不知道什么时候更新了什么包。第三,手动更新无法做到精准控制,比如你只想更新安全相关的补丁,不想动其他包,手动操作很难筛选。yum-cron是CentOS官方提供的yum定时更新工具,它能解决以上所有问题,而且支持只下载安全补丁、只在指定时间执行、更新完成后发邮件通知等功能。
二、yum-cron的安装和基础配置
CentOS 7和CentOS 8/Stream在yum-cron的配置上有一些差异,但核心逻辑一样。先确认系统是否已经安装了yum-cron包。
yum list installed | grep yum-cron
如果没有安装,执行以下命令安装:
yum install yum-cron -y
安装完成后,启动yum-cron服务并设置开机自启:
systemctl start yum-cron systemctl enable yum-cron
接下来编辑yum-cron的主配置文件,路径是/etc/yum/yum-cron.conf。这个文件控制yum-cron的整体行为。
vi /etc/yum/yum-cron.conf
关键参数说明如下:
update_cmd = security——这个参数决定了更新策略。设置为security表示只更新安全相关的补丁,这是生产环境最推荐的设置。如果设置为default就是更新所有包,设置为security-severity:Critical就是只更新严重级别的安全补丁。根据自己的需求选择,一般建议用security。
update_messages = yes——更新完成后是否发送邮件通知,建议设为yes。
download_updates = yes——是否先下载补丁再安装,设为yes可以让你在安装前有机会检查下载了哪些包。
apply_updates = yes——下载后是否自动安装,设为yes实现全自动流程。如果你只想下载不自动安装,可以设为no,然后自己手动执行。
random_sleep = 360——随机延迟时间,单位秒。设为360表示在计划时间基础上随机延迟最多6分钟执行,避免所有服务器同时请求更新源造成源站压力。生产环境强烈建议开启。
三、通过crontab精确控制执行时间
yum-cron自身有一个内置的定时机制,但更灵活的做法是直接用crontab来调度。编辑root用户的crontab:
crontab -e
添加以下定时任务,设定在每天凌晨3点执行安全补丁更新:
0 3 * * * /usr/sbin/yum-cron
如果你想每周只在工作日更新,可以这样写:
0 3 * * 1-5 /usr/sbin/yum-cron
如果你想在每月1号和15号更新:
0 3 1,15 * * /usr/sbin/yum-cron
这里有个细节要注意,crontab里执行的是/usr/sbin/yum-cron这个命令,它会读取/etc/yum/yum-cron.conf里的配置来决定具体行为。所以crontab只管什么时候触发,具体更新什么、怎么更新由yum-cron.conf控制,两者配合才是完整方案。
四、配置邮件通知让你掌握更新动态
yum-cron更新完成后会发邮件到本地root用户,但本地邮件你不一定能及时看到。需要配置邮件转发或者安装一个邮件客户端。先确认系统是否安装了mailx或者sendmail:
yum install mailx -y
然后编辑/etc/mail.rc文件,添加邮件服务器配置。如果你公司有内部邮件服务器,配置SMTP信息:
set smtp=smtp://mail.yourcompany.com set smtp-auth=login set smtp-auth-user=yum-cron@yourcompany.com set smtp-auth-password=yourpassword set from="yum-cron@yourcompany.com"
如果没有邮件服务器,可以用一个简单的办法,把本地邮件转发到你的个人邮箱。编辑/etc/aliases文件:
root: your_email@example.com
然后执行newaliases命令让配置生效:
newaliases
这样每次yum-cron执行完毕,你都会收到一封邮件,里面列出了更新了哪些包、有没有失败的包,一目了然。
五、只更新安全补丁的进阶配置
前面提到update_cmd = security只更新安全补丁,但有时候你想更精细地控制,比如只更新CVE编号已知的严重漏洞。这时候需要用到yum的security插件。先确认插件是否启用:
yum list installed | grep yum-plugin-security
如果没有,安装它:
yum install yum-plugin-security -y
安装后可以用以下命令查看所有安全相关的可用更新:
yum --security check-update
查看特定严重级别的安全更新:
yum --security check-update --sec-severity=Critical
在yum-cron.conf中把update_cmd改为:
update_cmd = security --sec-severity=Critical
这样就只会自动更新严重级别的安全补丁,中等和低危的不会自动动,避免不必要的变更带来风险。这个策略在金融、电商等对稳定性要求极高的场景非常实用。
六、自动更新的风险控制和回滚方案
自动更新虽然方便,但也有风险。万一某个安全补丁和你的业务软件冲突,导致服务异常怎么办?所以必须做好以下几点防护。
第一,更新前自动备份关键配置。可以在crontab里加一条备份任务,在yum-cron执行之前先备份:
0 2 * * * tar -czf /backup/etc-$(date +\%Y\%m\%d).tar.gz /etc
第二,利用yum的history功能记录每次更新。yum会自动记录所有操作,你可以随时查看:
yum history
查看最近一次更新的详情:
yum history info 最新的ID号
如果更新出了问题,可以一键回滚到更新之前的状态:
yum history undo 最新的ID号
第三,建议在测试环境先验证补丁,再推送到生产环境。可以搭一台和生产配置一样的测试机,让它先跑yum-cron,观察24小时没问题再在生产机上启用。
七、CentOS 8及Stream版本的特殊处理
CentOS 8开始用dnf替代了yum,但yum命令仍然是dnf的软链接,所以yum-cron在CentOS 8上依然可用。不过有一个变化,CentOS 8的yum-cron配置文件路径变成了/etc/yum/yum-cron-hourly.conf,而且默认的更新策略可能不同。如果你用的是CentOS Stream 9,建议直接用dnf-automatic,它是yum-cron的升级版:
dnf install dnf-automatic -y systemctl enable --now dnf-automatic.timer
dnf-automatic的配置文件在/etc/dnf/automatic.conf,参数含义和yum-cron类似,update_command = security同样适用。
八、监控和日志查看
配置好自动更新后,你还需要定期检查日志确认任务正常运行。yum-cron的日志在:
/var/log/yum-cron.log
可以用tail命令实时查看:
tail -f /var/log/yum-cron.log
另外,/var/log/messages里也会记录yum相关的操作,可以配合grep过滤:
grep yum-cron /var/log/messages
建议写一个简单的监控脚本,每天早上检查日志里有没有报错,如果连续两天没有更新记录就发告警。
九、常见问题和排错指南
问题一:yum-cron执行了但没有更新任何包。检查网络连通性,确认服务器能访问yum源。可以手动执行yum makecache测试。
问题二:更新后服务启动失败。立即用yum history undo回滚,然后排查是哪个包导致的冲突,把它加入exclude列表:
echo "problematic-package-name" >> /etc/yum.conf
在/etc/yum.conf的exclude行里加上包名,以后就不会自动更新它了。
问题三:邮件收不到。检查/var/spool/mail/root里有没有邮件,如果有但没发出来,检查mail服务是否正常运行,检查防火墙是否放行了25端口。
十、总结和最佳实践建议
整套yum-cron自动更新安全补丁的方案,核心就是三步:安装配置yum-cron、用crontab设定执行时间、配置邮件通知和回滚机制。生产环境建议遵循以下原则:只更新安全补丁、设置随机延迟避免源站压力、更新前自动备份、保留回滚能力、定期检查日志。不要贪图省事把update_cmd设成default全量更新,那样风险太大。安全补丁自动更新是运维基本功,把这套流程标准化、脚本化,能省掉大量重复劳动,也能让服务器的安全水位始终保持在较高水平。
