我正在尝试将我的 Ubuntu 19.10 安装上的 sudo 组限制为仅某些分类的 ouf 可执行文件。
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
.
正如您所发现的,一个 shell 别名使得您运行
sudo
的每个命令都通过env
而不是直接运行命令。在您编辑
/etc/sudoers
以限制sudo
组成员可以运行的命令后,所有sudo
命令都报告您不允许运行env
。因此,出于某种原因,每次运行时,它都会尝试使用. 此外,错误消息总是采用这种确切的形式:sudo command
env
以
env
这种方式使用是使用您的而不是其选项的价值的常用技术。一些用户定义了一个 shell 别名或 shell 函数调用来运行类似的东西。在 Bash 中,运行将显示命令可能意味着的所有内容,其中首先显示 shell 选择的含义。(只会显示那个。)sudo
$PATH
secure_path
sudo
sudo command
type -a sudo
sudo
type sudo
回忆起您定义的别名后,您可以通过将别名更改为不使用来解决问题
env
。当然,完全删除别名也可以。话虽如此,我鼓励您考虑不要使用此
sudoers
配置,因为与默认配置相比,它没有安全优势。实际上,它比默认配置更不安全。主要问题是,虽然您似乎打算使用这条线
为了限制
sudo
组成员可以运行的命令,访问这些命令足以执行任何操作。作为一个例子——这只是一个例子——该sudo
组的成员可以创建以下内容Makefile
:然后运行
sudo make
会给出一个 root shell,其效果与以 root 身份成功登录的效果相同。(或者su -
可以用另一个命令替换,例如visudo
方便编辑sudoers
文件。或者它们可以visudo
从 . 给出的根 shell运行su -
。)这不能通过限制传递的参数来解决。在这种情况下,
make
它本身不接收命令行参数。您允许
sudo
组成员运行的其他命令也足以获得对系统的完全访问权限。即使apt
单独也足以让用户安装他们想要的任何软件,包括不是来自任何已配置存储库的软件 ( )。制作自己的 .deb 包并不难,而且(在其他攻击路线中).deb 包可以包含在执行安装时以 root 身份运行的脚本。apt install ./package.deb
然后是 Polkit。如果这是一个桌面系统,Ubuntu 中的 Polkit 被配置为允许
sudo
组成员以 root 身份运行任意命令:即使默认配置为授予
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 身份执行任意操作的能力。