向非 sudo 用户授予无人值守升级命令安全吗?

向非 sudo 用户授予无人值守升级命令安全吗?

我发现我给了使用 sudo 权限让非 sudo 用户访问某些命令。然而,我的计划是让他们运行apt-get dist-upgrade系统并不安全因为他们可能能够以 root 身份访问 shell。然后我发现我可以手动调用无人值守升级通过跑步sudo unattended-upgrade -d

问题

给予非 root 用户访问 call 权限unattended-upgrade是否安全(例如无法进入 root shell)?除了只安装安全更新之外,是否还有其他后果(例如半安装的软件包等)。

答案1

解决方案

  1. 创建新组:groupadd -r updaters-r选项保留一个系统组,即0 - 100。
  2. 将用户添加到上述组:useradd -G updaters john, useradd -G updaters sally. 您还可以使用用户别名部分来实现此目的。看Sudoer 文件示例用于功能齐全的用户别名部分。在我看来,按照我的方式进行操作可以增加安全性,因为该组实际上存在于系统中。
  3. 为更新程序创建命令列表:注意:Apt-get 使用参数传递。请参阅问题部分 Cmnd_Alias UPDATE_CMDS = /usr/bin/aptitude, /usr/bin/dpkg, /usr/bin/apt-get up*, /usr/bin/apt-get install
    • 请注意,这dpkg是 所需要的apt-get。看AskUbuntu:将 apt-get 添加到 sudoers 文件
    • 请注意,apt-get updateapt-get upgrade都是必需的。使用 glob 模式可以实现这两个目的。
    • 请注意,如果上述行为是不需要的,则aptitude可以使用 来替换。如果您不希望组中的用户通过单击鼠标来离线安装​​...apt-getdpkgupdaters

现在我们必须将更新添加到 sudoers 文件中。问题:visudo,并且:

Ubuntu 中的默认 sudoers 文件(添加了上面的内容):

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults    env_reset

# Uncomment to allow members of group sudo to not need a password
# %sudo ALL=NOPASSWD: ALL

# Host alias specification

# User alias specification

# Cmnd alias specification
Cmnd_Alias UPDATE_CMDS = /usr/bin/aptitude, /usr/bin/dpkg, /usr/bin/apt-get up*, /usr/bin/apt-get install

# User privilege specification
root    ALL=(ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Members of the upgraders group may perform certain upgrade commands.
# If No Password is desired, comment the line below, and see the next option.
%upgraders ALL=UPDATE_CMDS

# Members of the upgraders group may perform certain upgrade commands, 
# WITHOUT A PASSWORD DANGEROUS (uncomment if desired):
#%upgraders ALL=NOPASSWD:UPDATE_CMDS

如果您决定添加unattended-upgrade,请阅读Debian 文档。并用于which unattended-upgrade确定将其添加到的路径UPDATE_CMDS。看问题部分


更新

经过更多研究后,我发现了一篇博客文章:关于 conffiles 你需要了解的一切:由 dpkg 管理的配置文件。问题不在于 apt 变体,问题在于底层dpkg实现。引用:

避免conffile提示

每次 dpkg 必须安装您修改过的新配置文件时(在 dpkg 看来,删除的文件只是修改文件的一种特殊情况),它将停止升级并等待您的答复。这对于重大升级来说尤其令人烦恼。这就是为什么您可以借助多个 --force-conf* 选项为 dpkg 提供预定义答案:

  • --强制合并:不修改当前配置文件,新版本安装时带有.dpkg-dist后缀。仅使用此选项,即使您未修改的配置文件也不会受到影响。您需要将其与 --force-confdef 结合使用,让 dpkg 覆盖您未修改的配置文件。
  • --强制配置新:始终安装新版本的配置文件,当前版本保存在带有 .dpkg-old 后缀的文件中。
  • --force-confdef:要求 dpkg 在可以的情况下单独决定,否则提示。这是 dpkg 的默认行为,此选项主要与 --force-confold 结合使用。
  • --强制承认:如果当前缺少配置文件(例如因为您错误地删除了该文件),请要求 dpkg 安装该配置文件。

知道了这一点,正如博客所指出的,我们可以创建/etc/apt/apt.conf.d/local并添加(示例):

Dpkg::Options {
   "--force-confdef";
   "--force-confold";
}

然后,这应该会一起绕过该Z选项。


问题

无人值守升级通常是一个坏主意,因为操作系统可能会安装意外的项目,例如新内核或会破坏正常运行的驱动程序的更新驱动程序,这增加了您向用户提供选项的想法。这里的另一个问题是,由于apt-get使用参数传递来决定执行哪个选项,因此必须传递创建的命令别名中的每个所需选项。通过单独添加每个参数,我们消除了使用该参数的能力dist-upgrade。和你一样,我认为人们无法在 sudoers 文件中传递参数,在研究过程中我也学到了一些新东西。


参考

nixCraft - Howto:Linux 将用户添加到组
Aptitude - Ubuntu 文档
Ubuntu 论坛 - 主题:HowTO:Sudoers 配置
Ubuntu 文档 - 安装软件
AskUbuntu - apt-get 更新和升级有什么区别?

相关内容