在 Ubuntu 上设置自动安全更新(无人值守升级)

本教程将向您展示如何在 Ubuntu 上设置自动安全更新,也就是无人值守升级。 如果你不是住在山洞里,那么你可能知道大规模的 Equifax 数据泄露。 2017 年 5 月至 7 月期间,1.43 亿 Equifax 客户的信息被盗,包括姓名、社会安全号码、出生日期、驾照、20 万个信用卡号码。

2017 年 3 月,一个严重的漏洞 Apache 结构被发现并且 Apache 基金会在宣布存在漏洞时发布了修复程序。 然而,Equifax 两个月没有修补漏洞,导致了大规模的数据泄露。 运行复杂应用程序的公司可能需要在安装更新之前进行大量测试,但如果您有一个简单的 Linux 服务器供个人使用,您可以打开自动安全更新以尽快修补漏洞。

在 Ubuntu 服务器上配置自动安全更新(无人值守升级)

首先,安装 unattended-upgrades 包裹。

sudo apt update

sudo apt install unattended-upgrades

您需要安装 update-notifier-common 包以设置自动重启。

sudo apt install update-notifier-common

然后编辑 50unattended-upgrades 文件。

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

在此文件中,您可以配置应自动更新哪些包。 默认情况下,只会自动安装安全更新,如以下几行所示。 因此无需更改此部分。

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        // Extended Security Maintenance; doesn't necessarily exist for
        // every release and this system may not have it installed, but if
        // available, the policy for updates is such that unattended-upgrades
        // should also install from here by default.
        "${distro_id}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
//      "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};

  • 第一个起源 "${distro_id}:${distro_codename}" 是必要的,因为安全更新可能会从非安全来源引入新的依赖项。 此来源不提供软件更新。
  • 第二个来源用于定期安全更新。
  • 第三个和第四个起源(ESMApps 和 ESM)用于扩展的安全维护,即那些运行 Ubuntu 版本已终止的用户。 你可以保持原样。

电子邮件通知

有时 Ubuntu 可能无法安装安全更新,因此需要手动更新。 如果您希望在每次安全更新后收到电子邮件通知,请找到以下行并取消注释。 (去掉开头的双斜线。)

Ubuntu 18.04

//Unattended-Upgrade::Mail "root";

Ubuntu 20.04

//Unattended-Upgrade::Mail "";

您可以指定一个电子邮件地址来接收如下通知。

Unattended-Upgrade::Mail "[email protected]";

如果您希望仅在安全更新期间出现错误时接收电子邮件通知,请取消注释以下行。

Ubuntu 18.04

//Unattended-Upgrade::MailOnlyOnError "true";

在 Ubuntu 20.04 上,您需要找到以下行

//Unattended-Upgrade::MailReport "on-change";

取消注释并更改为

Unattended-Upgrade::MailReport "only-on-error";

自动删除未使用的依赖项

你可能需要做 sudo apt autoremove 每次更新后,找到以下行:

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

取消注释此行并更改 falsetrue.

Unattended-Upgrade::Remove-Unused-Dependencies "true";

自动重启

安装 Linux 内核的安全更新后,您需要重新启动 Ubuntu 服务器才能应用内核更新。 如果服务器只供您或少数人使用,那么启用自动重启会很方便。 找到以下行。

//Unattended-Upgrade::Automatic-Reboot "false";

取消注释并更改 falsetrue 启用自动重启

Unattended-Upgrade::Automatic-Reboot "true";

您还可以指定执行重启的时间。 默认情况下,在安装内核更新后立即重新启动。 我将其设置为凌晨 4 点重新启动。 确保为服务器设置正确的时区。

Unattended-Upgrade::Automatic-Reboot-Time "04:00";

Save 和 close 文件。

如果服务器被很多用户使用或需要很长的正常运行时间(比如这个博客),那么你不应该启用自动重启。 相反,您可以使用 Canonical livepatch 来修补 Linux 内核而无需重新启动。

  • Canonical LivePatch 服务:无需重启即可在 Ubuntu 上修补 Linux 内核

启用自动安全更新

现在配置了自动安全更新,我们需要通过创建 20auto-upgrades 文件。

sudo nano /etc/apt/apt.conf.d/20auto-upgrades

将以下两行复制并粘贴到文件中。

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

  • 第一行使 apt 做 ”apt-get update”每天自动。 如果设置为 2,则每隔一天。 (0=禁用)
  • 第二行使 apt 自动安装安全更新。 (1=启用,0=禁用)

Save 和 close 文件。

在特定时间运行无人值守升级

无人值守升级在凌晨 12 点至早上 7 点之间随机运行,以防止由于每个人同时运行更新而导致镜像服务器负载激增。 您可以使用以下命令手动运行无人值守升级:

sudo unattended-upgrade -v

您还可以将此命令添加到您的 Cron 作业中。

sudo crontab -e

在您的 Crontab 文件底部添加以下行,以便无人值守升级将在每天凌晨 2 点运行。

0 2 * * * sudo /usr/bin/unattended-upgrade -v

设置 SMTP 中继

为了在每次安全更新后接收电子邮件通知,您的服务器需要能够发送电子邮件。 如果这是您的电子邮件服务器,那么唯一要做的就是安装 bsd-mailx 包裹。

sudo apt install bsd-mailx

如果这不是电子邮件服务器,则您需要设置 SMTP 中继。 我们可以安装 Postfix SMTP 服务器,然后通过电子邮件服务提供商中继电子邮件。

有几种 电子邮件服务提供商 (ESP) 可以充当中继主机。 有些收取一点费用,有些每月提供免费配额。 在本文中,我想向您展示如何使用 Sendinblue,它是一个电子邮件服务提供商,可让您每天免费发送 300 封电子邮件。

在 sendinblue.com 创建一个免费帐户。 完成用户配置文件后,单击 Transactional 选项卡,您将获得 SMTP 设置。 如果没有 SMTP 设置,您需要联系 Sendinblue 客户服务以激活交易电子邮件服务。

sendinblue SMTP 中继设置

现在您需要配置 Postfix SMTP 服务器以使用 Sendinblue SMTP 设置。

让我们使用以下命令在 Ubuntu 上安装 Postfix SMTP 服务器。

sudo apt install postfix libsasl2-modules

当您看到以下消息时,按 Tab 键并按 Enter.

后缀中继主机身份验证

然后选择第二个选项: Internet Site.

后缀中继主机配置

接下来,设置系统邮件名称。 例如,我输入我的域名 linuxbabe.com.

postfix 智能主机 ubuntu

安装 Postfix 后,使用 Nano 等命令行文本编辑器打开主配置文件。

sudo nano /etc/postfix/main.cf

找到以下行。

relayhost =

默认情况下,其值为空。 设置值 relayhost[smtp-relay.sendinblue.com]:587.

relayhost = [smtp-relay.sendinblue.com]:587

然后将以下行添加到此文件的末尾。

# outbound relay configurations
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may
header_size_limit = 4096000

Save 和 close 文件。 然后创建 /etc/postfix/sasl_passwd 文件。

sudo nano /etc/postfix/sasl_passwd

将 SMTP 中继主机和 SMTP 凭据添加到此文件中,如下所示。 代替 smtp_usernamesmtp_password 使用 SendinBlue 提供的您自己的用户名和密码。 请注意,用户名和密码之间有一个冒号。

[smtp-relay.sendinblue.com]:587      smtp_username:smtp_passowrd

Save 和 close 文件。 然后创建相应的哈希数据库文件 postmap.

sudo postmap /etc/postfix/sasl_passwd

现在你应该有一个文件 /etc/postfix/sasl_passwd.db. 重新启动 Postfix 以使更改生效。

sudo systemctl restart postfix

默认情况下, sasl_passwdsasl_passwd.db 服务器上的任何用户都可以读取文件。 将权限更改为 600,以便只有 root 可以读写这两个文件。

sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

从现在开始,Postfix 将通过 Sendinblue 发送电子邮件。

添加发件人地址

单击 Sendinblue 帐户仪表板右上角的下拉菜单,然后选择 发件人和 IP 选项卡以添加您的域和发件人地址。

sendinblue 添加发件人和域

发送测试邮件

现在我们可以发送一封测试电子邮件 mailx 命令如下。

sudo apt install bsd-mailx

echo "this is a test email." | mailx -r from-address -s hello to-address

如果 SMTP 配置正确,您将收到一封电子邮件。

电子邮件不发送?

您可以查看邮件日志(/var/log/mail.log) 来调试电子邮件未发送的原因。

如果你用括号包裹中继主机 /etc/postfix/main.cf 文件。

relayhost = [smtp-relay.sendinblue.com]:587

然后您还需要将主机名包装在 /etc/postfix/sasl_passwd 文件。

[smtp-relay.sendinblue.com]:587  [email protected]:YourGmailPassword

记得重新生成hash db 文件。

sudo postmap /etc/postfix/sasl_passwd

重新启动 Postfix 以使更改生效。

sudo systemctl restart postfix

禁用接收电子邮件

默认情况下,Postfix 被配置为接受传入邮件。 您可以将 Postfix 配置为仅发送电子邮件,但不接受任何传入电子邮件。 在中找到以下行 /etc/postfix/main.cf 文件。

inet_interfaces = all

将其更改为以下文本,以便 Postfix 仅在 localhost 上侦听。

inet_interfaces = loopback-only

电子邮件报告

无人值守升级可能会发送 3 封电子邮件:

  • 无人值守升级返回:True。 这意味着软件包已成功安装。
  • 无人值守升级返回:False。 这意味着安装更新时发生了一些错误。 通常需要人工干预。 如果您收到此电子邮件,则需要手动运行 sudo apt upgrade.
  • 返回无人值守升级:无。 有可用的更新,但系统拒绝安装它们。

日志

日志可以在 /var/log/unattended-upgrades/ 目录。

检查重启

checkrestart 命令可以帮助您找出升级后需要重新启动的进程。 它可以从 debian-goodies 包裹。

sudo apt install debian-goodies

sudo checkrestart

总结

我希望本教程可以帮助您在 Ubuntu 服务器上设置无人值守升级。 与往常一样,如果您觉得这篇文章有用,请订阅我们的免费时事通讯以获取更多提示和技巧?