Ubuntu 自动更新:unattended-upgrades 配置
在 Ubuntu 上配置 unattended-upgrades,让您的 VPS 自行安装安全补丁。讲清楚哪些自动应用、如何处理重启、如何验证它确实在运行。
为什么值得设置自动安全更新
没有打补丁的服务器是互联网上最容易被攻破的目标。小型服务器被入侵大多不是靠什么高明手段,而是某个旧软件包里一个已知漏洞,而机主一直没有更新。Ubuntu 自带一个工具能自行填补这个缺口:unattended-upgrades 会按计划自动安装安全更新,无需您登录。它是 VPS 上成本最低的安全收益,在 Ubuntu 上只需几分钟就能配好。
这个工具在设计上很保守。默认情况下它只应用安全更新,而不是升级每一个软件包,因为安全补丁风险低、值得直接安装,而功能升级则可能改变您原本依赖的行为。对大多数服务器来说这个默认设置是对的,本文在保留它的同时,只说明几处值得改动的设置。
第 1 步:安装并启用
在 Ubuntu 24.04 上,这个软件包通常已经存在,但不一定已启用。请安装并开启它:
sudo apt update
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgradesdpkg-reconfigure 提示只会问一个是或否的问题,即是否自动下载并安装稳定版更新。请回答 yes。这会写入一个文件,从而开启每日任务:
cat /etc/apt/apt.conf.d/20auto-upgradesAPT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";第一行每天刷新软件包列表;第二行每天运行无人值守升级。两项都设为 1,意味着机器每天通过一个 systemd 定时器检查并应用安全更新,无需您再做任何操作。
第 2 步:决定哪些更新自动应用
策略位于 /etc/apt/apt.conf.d/50unattended-upgrades。打开它,查看顶部附近的 Allowed-Origins 区块:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};其中 -security 那几行才是关键,它们默认已启用。这就是那条保守的策略:安全更新自动进来,普通功能更新留给您在需要时手动应用。您可以加上 "${distro_id}:${distro_codename}-updates" 这一行来源,让所有更新都自动应用,但对于承载着您在意的服务的服务器来说,只自动获取安全补丁是更稳妥的默认做法。除非您有明确的理由,否则请保持出厂设置不变。
第 3 步:处理重启
某些更新,比如内核或某个核心库,只有在重启后才能完全生效。unattended-upgrades 不会自行重启您的服务器,除非您明确让它这么做,这意味着一个已打补丁的内核可能一直闲置,直到您碰巧重启为止。请决定您想如何处理,并在 50unattended-upgrades 中明确设置:
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";这会让服务器在凌晨四点重启,而且只在某个更新确实需要重启时才这么做。在一台没有集群可供故障切换的单机 VPS 上,一次清晨的短暂重启通常是换取内核修复保持最新的合理代价。如果您的服务器运行着绝不能意外重启的服务,请关闭自动重启,并养成在检查 /var/run/reboot-required 后自己重启的习惯。
第 4 步:验证它确实有效
不要等上一整天才弄清楚这个任务是否运行。触发一次试运行,它会准确显示将会应用哪些更新,而不做任何改动:
sudo unattended-upgrade --dry-run --debug输出会列出它考虑的软件包以及它们来自哪些来源,这样您就能看到策略的实际效果。真正的任务至少运行过一次之后,它的记录在这里:
cat /var/log/unattended-upgrades/unattended-upgrades.log这份日志就是“我的服务器是否真的在自我打补丁”这个问题的答案。如果它显示安全软件包在按计划安装,那么任务就在正常工作。
这一环节的位置
自动更新是加固服务器的其中一层,而不是全部。它们让已知漏洞不会久拖不补,但对谁能登录、什么被暴露在外则毫无作用。请把它与仅用密钥的 SSH 加固 搭配,让正门无法被暴力破解;与默认拒绝的 UFW 防火墙 搭配,让只有您选择开放的端口可达;再与 最小权限服务用户 搭配,让一个被攻破的应用无法拿下整台机器。打补丁堵住您已知的漏洞;其他各层则限制那些您尚不知道的漏洞所能造成的损害。
FAQ
unattended-upgrades 是应用每一个更新,还是只应用安全更新?
默认只应用安全更新。/etc/apt/apt.conf.d/50unattended-upgrades 中的 Allowed-Origins 区块启用了 -security 来源,把普通功能更新留给您手动应用。这是有意为之:安全补丁风险低、值得自动获取,而功能升级可能改变行为,因此大多数服务器都应保持这个保守的默认设置。
自动更新会重启我的服务器吗?
只有在您让它这么做时才会。在配置中设置 Unattended-Upgrade::Automatic-Reboot "true" 以及一个 Automatic-Reboot-Time,服务器就会在某个更新需要重启时(例如内核打补丁之后)在指定时间重启。若关闭该项,已打补丁的内核会一直等到您自己重启为止;查看 /var/run/reboot-required 就能知道是否有待处理的重启。
我怎么检查自动更新是否真的在运行?
运行 sudo unattended-upgrade --dry-run --debug 就能看到此刻会应用哪些更新,而不做任何改动;再查看 /var/log/unattended-upgrades/unattended-upgrades.log 了解过往运行的记录;每一次自动安装也都会记录在 /var/log/apt/history.log 中。如果日志显示安全软件包在按每日计划安装,那么定时器就在正常工作。如果试运行打印出 No packages found that can be upgraded unattended,那么要么一切都已经是最新的,要么您允许的来源太窄,无法匹配到安全仓库。
光靠 unattended-upgrades 足以保证服务器安全吗?
不够,但它是必不可少的一层。它让已知漏洞不会长期无人修补,从而挡住最常见的那类入侵,但它并不控制访问权限或暴露面。请把它与 SSH 加固、默认拒绝的防火墙以及最小权限服务用户结合起来,才能得到一台真正难以攻破的服务器。