用户可以使用“sudo sudo su -”成为 root 用户

用户可以使用“sudo sudo su -”成为 root 用户

我已在 sudoers 文件中授予以下权限。

Cmnd_Alias      SUROOT=/bin/su "",\
                       /bin/su -,\
                       /bin/su - root,\
                       /bin/su root,\
                       /usr/bin/su "",\
                       /usr/bin/su -,\
                       /usr/bin/su - root,\
                       /usr/bin/su root
kj ALL = (ALL) ALL, !SUROOT

当我尝试访问sudo su -其被阻止时

kj@u1804-1:~$ sudo su -
[sudo] password for kj:
Sorry, user kj is not allowed to execute '/bin/su -' as root on u1804-1.

但是当我尝试访问时sudo sudo su -它允许。

kj@u1804-1:~$ sudo sudo su -
[sudo] password for kj:
root@u1804-1:~#

我需要阻止 root 用户的访问,如何阻止sudo sudo命令

答案1

您无法通过阻止单个命令来实现这一点。有几十个,甚至没有数百用户可以使用以下命令成为 root 用户sudo

sudo -s
sudo -i
sudo bash
sudo env su
sudo /bin/sh
sudo env sudo
sudo busybox sh
sudo unshare
sudo chroot /
sudo systemd-run --shell
sudo nvim -c ":terminal"
sudo perl -e 'exec("bash")'
sudo git -c protocol.ext.allow=always ls-remote ext::"bash -c sh<&2>&2"

他们可以重命名被阻止的命令:

sudo cp -a /sbin/su /sbin/really-not-su && sudo really-not-su

他们可以简单地改变你设置的规则:

sudo nano /etc/sudoers

希望你已经明白了这一点——如果你给了别人 root 权限,您正在授予他们 root 访问权限。唯一的选择是列出允许命令并阻止其他所有命令 - 即使这样,其中一半的命令仍然有办法获得完全的 root 访问权限。

(AppArmor 或 SELinux 可能在这里有帮助。)

答案2

我建议采取相反的做法:不要给予某些人无限的 root 权限,而是允许他们以sudo无需指定密码的方式执行某些命令。这样他们就可以执行他们需要执行的操作,但仅此而已。

sudoers文件甚至可以定义命令上允许的参数,还可以使用通配符来允许在命令中包含字符串。

Unix Stackexchange 帖子中的回答很好地描述了这种方法
如何远程执行 ssh 命令,无需密码即可执行 sudo 命令

您可以告诉 sudo 跳过某些命令的密码。

例如/etc/sudoers

archemar  ALL = (www-data) NOPASSWD: /bin/rm -rf /var/www/log/upload.*

这让我可以使用

sudo -u www-data /bin/rm -rf /var/www/log/upload.*

如同 archemar 一样,无需密码。

注意

sudo -u www-data rm -rf /var/www/log/upload.*

不起作用(会要求输入密码),因为rm与 不同/bin/rm

确保/etc/sudoers使用visudo命令进行编辑。

一旦您达到高级水平,您可能希望拥有自己的 sudo文件/etc/sudoers.d

相关内容