让 Debian / Ubuntu 自动打安全补丁(unattended-upgrades 实战配置)

服务器最常见的安全事故不是 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 设在白天有人值班的时段。
精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。