熬夜排查服务器异常,最后发现是因为一个已知的系统漏洞未及时打补丁,被黑客趁机入侵;或者每天手动执行apt update && apt upgrade、dnf update,重复又繁琐,偶尔一忙就忘记,给系统留下安全隐患。
Linux系统的安全漏洞就像家里没关的窗户,随时可能被“小偷”(黑客)盯上。大量安全事件与未及时修复漏洞有关(具体比例因环境而异)——小到服务器被入侵、数据泄露,大到业务瘫痪、合规审计失败,损失不可估量。
手动更新补丁不仅耗时耗力,还容易遗漏;而自动更新安全补丁,能让系统自动修复已发布补丁覆盖的已知漏洞,在漏洞被利用前堵住缺口,成为Linux服务器安全防护的“第二道防线”。
今天这篇教程,就手把手教你实现Linux系统自动更新与安全补丁自动安装,覆盖Ubuntu和CentOS两大主流发行版,从配置到测试、从通知到风险规避,新手也能看完就会用,彻底解放双手,守住系统安全底线。
一、为什么必须自动安装安全补丁?
很多运维新手会有一个误区:“我的服务器在内网,不用打补丁;或者偶尔手动更一次,问题不大”。但事实是,一旦边界防护被突破或存在横向移动风险,未修复漏洞会迅速被利用,而一个未修复的高危漏洞,在公开后可能在较短时间内被利用。
1. 安全漏洞的致命风险
常见的漏洞风险主要有3类,每一种都可能带来毁灭性后果:
- 远程代码执行漏洞:黑客无需登录服务器,就能通过漏洞执行恶意代码,直接控制服务器(如ShellShock、Log4j漏洞);
- 权限提升漏洞:普通用户可利用漏洞提升至root权限,篡改系统配置、删除核心数据;
- 信息泄露漏洞:黑客通过漏洞窃取服务器中的敏感数据(如密码、数据库信息、业务数据)。
2. 手动更新的3大弊端
- 易遗漏:Linux系统漏洞更新频繁,每天可能有多个安全补丁发布,手动更新很难做到全覆盖;
- 效率低:如果管理多台服务器,逐台手动更新耗时耗力,不符合运维自动化的趋势;
- 不及时:漏洞修复的“黄金时间”是发布后的24小时内,手动更新往往会错过这个窗口,给黑客可乘之机。
综上,自动安装安全补丁不是“可选操作”,在生产环境中强烈建议启用——它能让系统在后台自动完成补丁检测、下载、安装,既节省时间,又能最大程度降低安全风险。
二、实操环节:Ubuntu 自动更新配置(unattended-upgrades)
Ubuntu系统默认提供了unattended-upgrades工具,专门用于自动安装安全更新和重要补丁,配置简单,无需复杂操作,新手可直接套用。
1. 安装 unattended-upgrades 工具
Ubuntu 18.04及以上版本默认已安装,若未安装,执行以下命令安装:
# 更新软件包列表
sudo apt update
# 安装 unattended-upgrades
sudo apt install -y unattended-upgrades apt-listchanges
说明:apt-listchanges 用于查看更新包的变更日志,方便后续了解补丁内容。
2. 核心配置:自动安装安全更新
通过编辑配置文件,设置自动更新的规则(如更新源、更新类型、是否自动重启等),配置文件路径:/etc/apt/apt.conf.d/50unattended-upgrades
# 编辑配置文件
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
将以下配置复制粘贴到文件中(替换原有内容,关键配置已标注说明):
// 允许自动更新的源(仅开启安全更新,避免非必要更新导致不兼容)
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security"; // 安全更新(必开)
// "${distro_id}:${distro_codename}-updates"; // 普通更新(生产环境建议注释,按需开启)
// "${distro_id}:${distro_codename}-proposed"; // 测试版更新(禁止开启)
// "${distro_id}:${distro_codename}-backports";// 回溯更新(禁止开启)
};
// 自动安装安全补丁(核心开关)
Unattended-Upgrade::Automatic-Reboot "false"; // 是否自动重启(默认关闭,生产环境谨慎开启)
Unattended-Upgrade::Automatic-Reboot-Time "03:00"; // 自动重启时间(若开启重启,建议设置凌晨低峰期)
// 排除不需要自动更新的软件包(重点!避免核心业务软件被误更)
Unattended-Upgrade::Package-Blacklist {
"nginx"; // 示例:禁止自动更新nginx(根据实际业务调整)
"mysql-server"; // 示例:禁止自动更新MySQL
// "php7.4"; // 按需添加,每行一个软件包名
};
// 保存更新日志(便于排查问题)
Unattended-Upgrade::SyslogEnable "true";
Unattended-Upgrade::SyslogFacility "daemon";
// 下载更新后立即安装,无需手动确认
Unattended-Upgrade::InstallOnShutdown "false";
// 清理过期的更新包,释放磁盘空间
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
3. 开启自动更新定时任务
配置完成后,需要开启对应的定时任务(unattended-upgrades并非常驻systemd服务,实际由apt-daily.timer和apt-daily-upgrade.timer两个systemd定时器触发),让系统定期检测并安装更新,执行以下命令:
# 开启自动更新相关定时器(核心触发机制)
sudo systemctl enable --now apt-daily.timer apt-daily-upgrade.timer
# 查看定时器状态(确认是否正常运行,替代查看unattended-upgrades服务)
sudo systemctl list-timers | grep apt
正常运行的状态会显示两个定时器的下次执行时间,若出现异常,可通过journalctl -u apt-daily-upgrade.timer查看日志排查问题。这里需要注意:unattended-upgrades并非长期运行的服务,无需查看其常驻状态,重点关注定时器是否正常即可。
4. 测试配置是否生效(必做步骤)
配置完成后,建议手动触发一次更新,测试是否能正常下载安装补丁:
# 手动触发自动更新(模拟系统定时检测)
sudo unattended-upgrade --dry-run # dry-run 表示模拟执行,不实际安装(推荐先执行)
sudo unattended-upgrade --debug # 调试模式,仅增加日志输出,不影响是否执行更新,可查看详细过程
若执行后无报错,且能正常检测到安全补丁,说明配置生效。
三、实操环节:CentOS Stream / Rocky Linux / AlmaLinux / RHEL 自动更新配置(dnf-automatic)
CentOS 8已于2021年底停止支持(EOL),继续使用存在严重安全风险,因此推荐在CentOS Stream、Rocky Linux、AlmaLinux、RHEL 8+版本中使用dnf-automatic工具(CentOS 7可用yum-cron,下文会补充),用于自动检测、下载、安装安全补丁,与Ubuntu的unattended-upgrades功能类似。
1. 安装 dnf-automatic 工具
# 安装 dnf-automatic
sudo dnf install -y dnf-automatic
# 查看工具版本(确认安装成功)
dnf-automatic --version
2. 核心配置:自动安装安全更新
配置文件路径:/etc/dnf/automatic.conf,编辑配置文件设置更新规则:
# 编辑配置文件
sudo nano /etc/dnf/automatic.conf
修改以下关键配置(其他配置保持默认即可,标注部分为必改项):
[main]
# 自动更新的类型(仅安全更新,生产环境首选)
upgrade_type = security # 可选值:security(仅安全更新)、default(所有更新)、minimal(最小更新)
# 下载并安装更新(核心开关)
download_updates = yes# 下载更新包
apply_updates = yes# 自动安装更新包
# 自动重启设置(谨慎开启)
reboot = no# 是否自动重启(默认关闭)
reboot_timeout = 300# 重启超时时间(秒),若开启重启,建议设置
# 排除不需要自动更新的软件包(与Ubuntu类似,保护核心业务软件)
exclude = nginx mysql-server php # 多个软件包用空格分隔
# 日志配置(便于排查问题)
debuglevel = 1
logfile = /var/log/dnf-automatic.log
email_from = root@localhost # 发送通知的邮箱
email_to = admin@example.com # 接收通知的邮箱(替换为你的邮箱)
email_host = localhost # 邮件服务器(本地默认即可)
3. 开启 dnf-automatic 服务并设置定时
# 开启服务并设置开机自启
sudo systemctl enable --now dnf-automatic.timer
# 查看定时任务状态(确认是否正常运行)
sudo systemctl list-timers dnf-automatic.timer
dnf-automatic的执行时间由dnf-automatic.timer控制,默认带有随机延迟(RandomizedDelaySec),并非固定“每天一次”,可通过以下命令查看具体定时规则:
systemctl cat dnf-automatic.timer
定时器会定期触发更新检测,若有安全补丁,会自动下载并安装。
补充:CentOS 7 配置(yum-cron)
CentOS 7 不支持dnf-automatic,需使用yum-cron工具,配置步骤如下(注意:yum的security插件依赖仓库提供的安全元数据,仅在支持security metadata的仓库中,“仅更新安全补丁”的配置才有效):
# 安装 yum-cron
sudo yum install -y yum-cron
# 编辑配置文件
sudo nano /etc/yum/yum-cron.conf
# 修改关键配置
update_cmd = security # 仅更新安全补丁
update_messages = yes # 发送更新通知
download_updates = yes # 下载更新
apply_updates = yes # 安装更新
exclude = nginx mysql-server # 排除不需要更新的软件包
# 开启服务并设置开机自启
sudo systemctl enable --now yum-cron
四、关键配置:排除不需要自动更新的软件包
在生产环境中,并非所有软件都适合自动更新——比如核心业务使用的nginx、MySQL、PHP等软件,一旦自动更新到不兼容版本,可能导致服务中断、业务异常。需要注意的是,完全排除这类软件会错过其安全补丁,建议仅排除大版本更新,保留安全补丁更新(可通过软件包版本锁定实现)。
因此,排除不需要自动更新的软件包,是自动更新配置中最关键的一步,以下是两大发行版的详细配置方法(前文已提及,此处汇总强调):
1. Ubuntu 排除软件包
编辑 /etc/apt/apt.conf.d/50unattended-upgrades,在Package-Blacklist中添加需要排除的软件包,每行一个:
Unattended-Upgrade::Package-Blacklist {
"nginx"; # 排除nginx
"mysql-server"; # 排除MySQL
"php*"; # 排除所有php相关包(用*通配符)
"docker-ce"; # 排除Docker
};
2. CentOS 排除软件包
编辑 /etc/dnf/automatic.conf(CentOS 8+),在exclude后添加软件包,用空格分隔:
# CentOS 8+
exclude = nginx mysql-server php docker-ce
# CentOS 7(yum-cron),编辑/etc/yum/yum-cron.conf
exclude = nginx mysql-server
💡 实用技巧:排除软件包时,可使用通配符(如php*)排除一类软件,但要谨慎使用,避免误排除必要的系统软件。
五、进阶配置:更新结果通知与自动重启
自动更新后,我们需要知道更新是否成功、安装了哪些补丁;若更新后需要重启(如内核更新),也需要合理配置重启策略,避免影响业务。
1. 更新结果通知(邮件通知,推荐)
通过邮件通知,可实时了解更新结果,若更新失败,能及时排查问题。以下是Ubuntu和CentOS的邮件配置方法:
(1)Ubuntu 邮件配置
# 安装邮件发送工具
sudo apt install -y postfix
# 编辑 unattended-upgrades 配置文件
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
# 添加以下配置(开启邮件通知)
Unattended-Upgrade::Mail "admin@example.com"; # 接收通知的邮箱
Unattended-Upgrade::MailOnlyOnError "true"; # 仅在更新失败时发送邮件(可选,推荐)
(2)CentOS 邮件配置
# 安装邮件发送工具
sudo dnf install -y postfix
sudo systemctl enable --now postfix
# 编辑 dnf-automatic 配置文件
sudo nano /etc/dnf/automatic.conf
# 修改邮件相关配置
email_from = root@localhost # 发送者邮箱
email_to = admin@example.com # 接收者邮箱
email_host = localhost # 本地邮件服务器(仅能发送本地邮件)
# 补充说明:若需要发送外部邮件(如QQ邮箱、企业邮箱),需额外配置SMTP relay及DNS、SPF相关设置
测试邮件通知:手动触发一次更新,查看是否能收到邮件(若未收到,检查postfix服务是否正常运行)。
2. 自动重启配置(生产环境谨慎开启)
部分更新(如内核更新、系统核心组件更新)后,需要重启服务器才能生效,但自动重启可能导致业务中断,因此需谨慎配置:
(1)Ubuntu 自动重启
# 编辑配置文件
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
# 修改以下配置
Unattended-Upgrade::Automatic-Reboot "true"; # 开启自动重启
Unattended-Upgrade::Automatic-Reboot-Time "03:00"; # 重启时间(凌晨3点,低峰期)
(2)CentOS 自动重启
# 编辑配置文件
sudo nano /etc/dnf/automatic.conf
# 修改以下配置
reboot = yes # 开启自动重启
reboot_timeout = 300 # 重启超时时间(5分钟)
⚠️ 重要提醒:生产环境建议关闭自动重启,改为手动重启——更新完成后,查看更新日志,确认无异常后,在业务低峰期手动重启服务器,避免意外中断。
六、生产环境注意事项:规避更新带来的不兼容性风险
自动更新虽好,但在生产环境中,若配置不当,可能导致软件不兼容、服务中断等问题(⚠️ 自动更新可能导致:内核升级、ABI变化、服务重启),以下是必须注意的5点,帮你规避风险:
- 仅开启安全更新,禁止普通更新:生产环境只需要安装安全补丁,无需更新非安全相关的软件包(如系统工具、普通应用),避免因版本更新导致不兼容;
- 必排除核心业务软件:将nginx、MySQL、PHP、Docker等核心业务软件加入排除列表,手动控制更新时间和版本,更新前先在测试环境验证;
- 开启更新日志和通知:实时监控更新过程,若更新失败或出现异常,能及时发现并处理,避免问题扩大;
- 避免业务高峰更新:调整自动更新的时间(如凌晨2-4点),避开业务高峰,即使出现意外,影响范围也最小;
- 定期备份系统和数据:更新前自动或手动备份系统配置和业务数据,云环境强烈建议启用快照策略;若更新导致系统异常,可快速回滚,减少损失。
💡 经验提示:建议先在测试环境配置自动更新,运行1-2周,确认无兼容性问题后,再推广到生产环境;对于核心业务服务器,可采用“灰度更新”(先更新1-2台测试,无异常再批量更新)。此外,部分企业会采用“自动检测 + 手动审批”的模式,既保证补丁及时检测,又避免自动安装带来的不可控风险。
七、常见问题与踩坑指南(新手必看)
配置自动更新时,新手容易遇到以下问题,整理了具体的解决方案,帮你避坑:
Q1:自动更新失败,提示“权限不足”?
A:核心原因是服务未以root权限运行,解决方案:
# 重启自动更新服务,确保以root权限运行
sudo systemctl restart unattended-upgrades # Ubuntu
sudo systemctl restart dnf-automatic.timer # CentOS 8+
sudo systemctl restart yum-cron # CentOS 7
Q2:排除软件包后,仍被自动更新?
A:检查排除配置是否正确,常见错误有2种:
- 软件包名错误:比如Ubuntu中MySQL的包名是
mysql-server,CentOS中是mariadb-server,需用dpkg -l | grep 软件名(Ubuntu)或rpm -qa | grep 软件名(CentOS)确认包名; - 配置文件语法错误:Ubuntu的配置文件中,软件包名需用双引号包裹,CentOS的exclude后用空格分隔,无引号。
Q3:更新后服务无法启动?
A:大概率是更新导致软件版本不兼容,解决方案:
# 1. 查看更新日志,确认更新的软件包
cat /var/log/unattended-upgrades/unattended-upgrades.log # Ubuntu
cat /var/log/dnf-automatic.log # CentOS Stream/Rocky Linux等
# 2. 回滚软件包到之前的版本(以nginx为例)
# 先查看仓库中可用的旧版本
apt-cache policy nginx # Ubuntu
# 再指定版本回滚(仅当仓库中存在该旧版本时可执行)
sudo apt install nginx=1.18.0-0ubuntu1 # Ubuntu,版本号需根据实际可用版本调整
sudo dnf downgrade nginx # CentOS Stream/Rocky Linux等,回滚到上一个版本
# 3. 将该软件包加入排除列表,避免再次自动更新
# 补充说明:若仓库中无对应旧版本,需借助系统快照或备份进行恢复
Q4:邮件通知收不到?
A:排查步骤:
- 检查postfix服务是否正常运行:
sudo systemctl status postfix; - 手动发送测试邮件:
echo "测试邮件" | mail -s "测试" admin@example.com,查看是否能收到。