服务器最常见的安全事故不是 0day,而是已经有补丁但没装。
unattended-upgrades 让 Debian 家族的服务器自动应用安全更新,
代价只是十分钟的配置。
适用:单机 / 小集群。集群规模上去后用 Ansible / Salt 统一管。
安装
sudo apt update
sudo apt install -y unattended-upgrades apt-listchanges
sudo dpkg-reconfigure --priority=low unattended-upgrades
# 这一步会写一个最小的 /etc/apt/apt.conf.d/20auto-upgrades
配置——只装安全更新
/etc/apt/apt.conf.d/50unattended-upgrades 是核心配置。
最小工作版:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Package-Blacklist {
"linux-image-*"; // 自己挑时间重启更稳
"linux-headers-*";
};
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
// 如果允许自动重启,把上面改为 true,再设:
// Unattended-Upgrade::Automatic-Reboot-Time "04:00";
Unattended-Upgrade::Mail "[email protected]";
Unattended-Upgrade::MailReport "on-change";
只放 *-security 源,不会把 -updates(功能更新)也拉进来,
风险最小。
调度
/etc/apt/apt.conf.d/20auto-upgrades:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
四个数字单位是 "天"。上面这套是:每天 update + 下载 + 跑 unattended,
每周 autoclean 一次缓存。
实际触发由 systemd timer 接管:
systemctl list-timers apt-daily.timer apt-daily-upgrade.timer
演练 + 校验
# 不实际安装,只显示会做什么
sudo unattended-upgrade --dry-run --debug | tail -30
# 看上次实际运行的日志
sudo tail -50 /var/log/unattended-upgrades/unattended-upgrades.log
# 看是否需要重启(更新内核 / glibc / 某些库后会显示)
ls /var/run/reboot-required 2>/dev/null && \
cat /var/run/reboot-required.pkgs
邮件通知(可选)
要收 MailReport 邮件,本机需要能寄信。最轻量是 msmtp + cron-aliases:
sudo apt install -y msmtp msmtp-mta bsd-mailx
# /etc/msmtprc
account default
host smtp.example.com
port 587
auth on
user notifier
password ...
from [email protected]
tls on
tls_starttls on
sudo chmod 600 /etc/msmtprc,然后 echo test | mail -s 'hi' [email protected]
能收到就 OK。
踩过的坑
Automatic-Reboot "true"在跑数据库或长任务的机器上是灾难。
默认关掉,自己写个监控脚本看到/var/run/reboot-required就告警。- 某些第三方 PPA 的源 origin 字符串不是
Ubuntu:jammy-security,需要
把它显式加进Allowed-Origins,否则永远装不上更新。可以用
apt-cache policy <package>看具体的 origin。 - 关闭 SSH 期间不要触发自动重启 —— 可能升级了 openssh-server 后 sshd 没起来。
我们的做法是把Automatic-Reboot-Time设在白天有人值班的时段。
登录后参与评论。