我有一群值得信赖的开发人员,我在服务器上授予了 sudo 权限,但我希望能够排除一些使用 sudo 运行的程序。例如,我想禁止su
使用 sudo 运行命令,但让他们以用户身份运行它。
我怎样才能做到这一点?
答案1
您可以使用 sudoers 排除命令。例如:
Cmnd_Alias DEV_EXCEPTIONS=/bin/su, /usr/bin/vi
%devgrp ALL = ALL, !DEV_EXCEPTIONS
结果是
User XYZ may run the following commands on this host:
(root) ALL, (root) !/bin/su, !/usr/bin/vi
用户仍然可以运行 su 命令
答案2
你不能这样做,不安全。
虽然sudo
确实有一个配置语法,但它不会实现您所希望的。一旦您允许 root 访问系统,再多的黑名单特定操作也不会再次锁定它。 Linux 文件系统和进程权限模型根本不允许这样做。
吉尔斯的评论开始暗示原因:
请注意,虽然这是可能的,但它完全没有用。如果您禁止
sudo su
,它仍然允许sudo env su
,sudo sh -c su
,sudo /totally/not/su
where/totally/not/su
是到 的符号链接/bin/su
,sudo ~/bin/ls
where是运行, , , ,后跟, ...~/bin/ls
的 shell 脚本。su
sudo bash
sudo zsh
sudo python
sudo vi
:shell
但这仅仅触及了可能性的表面。
不要列入黑名单,白名单。
将您不希望发生的操作列入黑名单将要是一场必败的比赛。通过黑名单方法,您最多可以发现心不在焉的错误,并礼貌地向用户发出信号,提醒他们您想以其他方式完成某些操作,您绝对不能强迫他们不做该操作。
如果您想要一个受限制的系统,您唯一的祈祷是将非常特定类型的操作列入白名单。您可以在不打开系统以进行完全根访问的情况下将其列入白名单的操作是固定位置中的可执行文件,它们执行固定任务而不处理用户可控输入。换句话说,你不允许
对标记为可执行文件或 setuid 或以其他方式由 root 解析和操作的任何文件的写访问权限。
出乎意料的是,这可能包括许多程序的配置文件。即使看似无害的
*.ini
、*.yaml
、 或*.conf
基于格式通常也具有导致程序基于配置值运行其他进程的选项。按文件夹快速浏览一下/etc
,我发现很少有配置文件,如果我一开始只对配置进行写访问,那么我就无法利用这些文件来实现完全的 root 权限升级。运行根据用户输入生成其他进程的任何进程。
特别要注意授予对可通过环境变量、处理用户输入等控制的脚本的访问权限。实际上,没有多少是安全的。
简而言之,不要授予sudo
任何类型的访问权限,除非您 ⓐ 了解您正在完全控制每个人的一切,或者 ⓑ 彻底了解您列入白名单的精心控制的单一操作的影响。
1我意识到这自相矛盾其他 答案但在看到这个问题在其他地方被喜欢作为“解决方案”之后,我认为在答案中值得注意,以便问题访问者能够阅读它。吉尔斯的评论没有被足够重视。
答案3
看我的详细解决方案看这里。您的解决方案将大致相同。您需要做的不同的事情是使用多个Cmnd_Alias
来进行调试并更轻松地添加新命令。正如 DarkHeart 在他的回答中指出的那样,您可以将这些多个别名字符串与否定运算符结合使用。