对于未永久连接到 Internet 的计算机,Ubuntu 似乎有一个持久的安全升级盲点。这些天肯定有很多,主要是笔记本电脑。
理论上的解决方案是unattended-upgrades
。在 Ubuntu 上,这默认使用每日systemd
计时器或 cron 作业运行。使用 cron,anacron
默认情况下也作为保护运行,并执行cron
因计算机关闭而错过的任何作业。到目前为止如此明智。
但!
默认unattended-upgrades
配置(/etc/apt/apt.conf.d/50unattended-upgrades
或类似配置)需要设置以下内容,否则升级可能会在漫游笔记本电脑上被跳过:
Unattended-Upgrade::OnlyOnACPower "false";
Unattended-Upgrade::Skip-Updates-On-Metered-Connections "false";
更糟糕的是anacron
,例如cron
,无论互联网连接是否可用,都会运行作业!这显然是非服务器 Ubuntu 的一个主要设计错误,因为个人计算机并不总是永久连接。
TLDR:使用默认配置,在漫游的笔记本电脑上,unattended-upgrades
大部分时间都不会工作。
(也许需要有一个单独的cron
作业或systemd
计时器类,它等待网络连接直到执行。或者cron.daily
可以切换失败的作业cron.hourly
直到它们成功执行。也许已经有一个了。)
一种实用的解决方案是在网络上线后作为用户脚本systemd
执行的单元文件unattended-upgrades
。但它每次启动只会运行一次。
最优解是什么?有谁知道是否有计划用新包或配置改进来解决这个问题?
如果使用network-manager
Ubuntu 上的当前默认设置连接到 Internet ,则创建一个调度程序脚本以在连接到网络后启动unattended-upgrade
(unattended-upgrades
是一个符号链接,也可以使用):
sudo touch /etc/NetworkManager/dispatcher.d/20-myconnectionscript
sudo chmod +x /etc/NetworkManager/dispatcher.d/20-myconnectionscript
在20-myconnectionscript
:
#!/bin/sh
if [ "$2" = "up" ];
# only proceed if unattended-upgrades was last run more than a day ago
ELAPSEDSINCEUU=$(($(date +%s) - $(date +%s -r /var/lib/apt/periodic/unattended-upgrades-stamp)))
if [ $ELAPSEDSINCEUU -gt 86400 ]; then
apt update --yes # replace, see below
/usr/bin/unattended-upgrade # replace, see below
fi
fi
编辑。事实证明unattended-upgrades
不会触发包列表的更新。因此,如果unattended-upgrades
一直失败,那么很有可能apt update
也失败了,在这种情况下,升级将继续不会发生!所以添加了手动更新脚本。令人失望的是,确保安全升级必须如此复杂。
编辑 2.如果您想绝对确保您的笔记本电脑是最新的,这就是您在非交互式脚本中所需要的。可以确认它可靠地工作。用它替换上面的 2 行。
DEBIAN_FRONTEND=noninteractive apt-get --yes update
DEBIAN_FRONTEND=noninteractive apt-get --yes --allow-downgrades --allow-remove-essential --allow-change-held-packages -- option Dpkg::Options::=--force-confold --option Dpkg::Options::=--force-confdef dist-upgrade
它是完整的dist-upgrade
,而不仅仅是安全升级。如果有人对仅安全版本有建议,该版本在非交互式运行时始终有效,并且不会涉及太多 repo 配置,请提出建议。
再一次:unattended-upgrades
不能期望为间歇性连接的计算机工作。Ubuntu 安全团队确实需要解决这种情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句