我正在尝试将 Ubuntu 19.10 安装上的 sudo 组限制为仅限特定类型的可执行文件。
sudoers 文件现在具有以下形式:
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
#%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL) NOPASSWD: /usr/bin/apt,/usr/bin/apt-key,/usr/bin/apt-add-repository,/usr/bin/make
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
遗憾的是,程序仍然无法执行,并出现错误消息,例如apt update
:
Sorry, user ubuntuuser is not allowed to execute '/usr/bin/env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin apt update' as root on Ubuntumachine.
如果我添加/usr/bin/env
到可执行列表我可以再次执行每一个和不仅使用 限制的命令列表sudo
。
答案1
正如你所发现的,shell 别名使得您运行的每个命令都sudo
通过 运行env
,而不是直接运行。
在您编辑/etc/sudoers
以限制组成员sudo
可以运行的命令后,所有sudo
命令都报告您无权运行env
。因此,出于某种原因,每次您运行时,它都会尝试使用运行命令。此外,错误消息始终采用这种确切形式:sudo command
env
Sorry, user ubuntuuser is not allowed to execute '/usr/bin/env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin command' as root on Ubuntumachine.
env
以这种方式使用是一种常见的技术使用sudo
你的$PATH
而不是其选项的值secure_path
。一些用户定义了一个 shell 别名或 shell 函数,称为sudo
make run 类似的东西。在 Bash 中,运行将显示命令可能意味着的所有内容,并首先显示 shell 选择的含义。(将只显示那一个。)sudo command
type -a sudo
sudo
type sudo
回想起来您定义的别名,您可以通过将别名更改为不使用来解决问题env
。当然,完全删除别名也可以。
照这样说,我鼓励你考虑不是使用此sudoers
配置,因为与默认配置相比,它没有任何安全优势。实际上,它比默认配置的安全性略差。
主要问题是,虽然你似乎有意
%sudo ALL=(ALL) NOPASSWD: /usr/bin/apt,/usr/bin/apt-key,/usr/bin/apt-add-repository,/usr/bin/make
限制组成员sudo
可以运行的命令,访问这些命令就足以执行任何操作。作为一个例子——这只是一个例子——小组成员sudo
可以创建以下内容Makefile
:
.PHONY: elevate
elevate:
su -
然后运行sudo make
将给出一个 root shell,其效果与成功以 root 身份登录相同。(或者su -
可以用另一个命令替换,例如,visudo
以便于重新编辑文件。或者它们可以从给出的 root shellsudoers
运行。)visudo
su -
这无法通过限制传递的参数来解决。在这种情况下,make
它本身不接收任何命令行参数。
您允许组成员运行的其他命令sudo
也足以获得对系统的完全访问权限。即使apt
仅凭这些命令也足以让用户安装他们想要的任何软件,包括不来自任何已配置存储库 ( ) 的软件。制作自己的 .deb 包并不难,并且(除其他攻击方式外).deb 包可以包含在执行安装时以 root 身份运行的脚本。apt install ./package.deb
还有 Polkit。如果这是一个桌面系统,Ubuntu 中的 Polkit 配置为允许组成员sudo
以 root 身份运行任意命令:
pkexec command
尽管它默认配置为授予组成员能力sudo
,pkexec
但不受文件内容的影响sudoers
。
这不是什么大问题,至少理论上是这样,因为你可以重新配置 Polkit。
我之所以说你的配置是较少的比默认安全就是您正在使用NOPASSWD
。这意味着以组成员身份运行的任何程序都sudo
可以以 root 身份执行任何操作,而无需任何用户交互。
的安全隐患NOPASSWD
虽然很大,但有时被夸大了。毕竟,获得该sudo
组成员运行的程序的控制权的攻击者已经可以设置一个假sudo
实用程序(例如,借助别名或 shell 函数)并捕获用户的密码。这很可能会成功。但这很麻烦,而且不是即时的。NOPASSWD
消除了这种麻烦。您可能决定要这样做,但我建议您仔细考虑风险,特别是如果这是一个多用户系统(听起来就是这样)。
sudo
从你想允许组成员运行的命令中,听起来这些用户确实在管理系统中发挥着作用。这很有道理——毕竟,如果他们不这样做,他们可能就不是该sudo
组织的成员。即使在您的sudoers
配置的“精神”范围内,他们也可以启用任意存储库,在系统范围内安装任意软件,我猜想让他们make
以 root 身份运行,这样他们就可以使用以下命令对从源代码编译的软件执行相同操作sudo make install
。
如果您完全信任该组的成员sudo
(或者可能只是您),但只是想让他们更难意外做错事,那么一种方法可能是为他们提供不属于该sudo
组的单独帐户,以执行不需要他们sudo
root 权限的任务。
如果你不信任他们,那么就不太可能有技术解决方案。即使你进一步锁定他们的能力,也还不够。控制整个系统上存在哪些软件供所有用户使用的能力始终等同于以 root 身份执行任意操作的能力。