我已在 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
。