我发现我给了使用 sudo 权限让非 sudo 用户访问某些命令。然而,我的计划是让他们运行apt-get dist-upgrade
系统并不安全因为他们可能能够以 root 身份访问 shell。然后我发现我可以手动调用无人值守升级通过跑步sudo unattended-upgrade -d
。
问题
给予非 root 用户访问 call 权限unattended-upgrade
是否安全(例如无法进入 root shell)?除了只安装安全更新之外,是否还有其他后果(例如半安装的软件包等)。
答案1
解决方案
- 创建新组:
groupadd -r updaters
该-r
选项保留一个系统组,即0 - 100。 - 将用户添加到上述组:
useradd -G updaters john
,useradd -G updaters sally
. 您还可以使用用户别名部分来实现此目的。看Sudoer 文件示例用于功能齐全的用户别名部分。在我看来,按照我的方式进行操作可以增加安全性,因为该组实际上存在于系统中。 - 为更新程序创建命令列表:注意: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 update
和apt-get upgrade
都是必需的。使用 glob 模式可以实现这两个目的。 - 请注意,如果上述行为是不需要的,则
aptitude
可以使用 来替换。如果您不希望组中的用户通过单击鼠标来离线安装...apt-get
dpkg
updaters
- 请注意,这
现在我们必须将更新添加到 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 更新和升级有什么区别?