我想禁用使用 sudo 成为 root 用户,以便每个用户都将被迫运行以 sudo 为前缀的特权命令。这样,所有这些命令都将被记录,并保留访问和修改的历史记录。
有什么解决方案可以实现这一目标吗?
答案1
您可以列出用户可以在其中运行的命令sudoers
以及例外情况。
这sudoers
手册页甚至有一个几乎可以满足您要求的示例(此处针对 Debian 进行了一些调整):
Cmnd_Alias SHELLS = /bin/sh, /bin/bash, /bin/bash, /usr/bin/zsh Cmnd_Alias SU = /bin/su jill SERVERS = /usr/bin/, !SU, !SHELLS
对于 Host_Alias 中的任何机器
SERVERS
,jill 可以运行该目录中的任何命令,但属于 Host_Alias和Cmnd_Aliases/usr/bin/
的命令除外。虽然规则中没有具体提及,但 Cmnd_Alias 中的命令均驻留在并设置了 noexec 选项。SU
SHELLS
PAGERS
/usr/bin
同样适用于ALL
:
someuser ALL=(ALL:ALL) ALL, !SU, !SHELLS
尝试让你得到这个:
$ sudo -s
Sorry, user someuser is not allowed to execute '/bin/bash' as root on thishost.
$ sudo bash -c "echo please"
Sorry, user someuser is not allowed to execute '/bin/bash -c echo please' as root on thishost.
并sudo -l
显示您无法运行这些特定命令。
请注意,如果默认情况下它们可以运行任何内容,则需要显式列出所有 shell。例如,su
还运行一个外壳,因此如果允许,他们可以使用sudo su
(就像一般情况下一样无用)。因为我上面写错了,所以/bin/dash
仍然可用。
无论如何,列出这样的例外永远不会成为实际的限制。没有什么可以阻止用户使用另一个名称 ( ) 复制某个 shell sudo cp -a /bin/bash /bin/cash
,甚至只是运行sudo vi
并点击:shell
。当然,您可能可以配置编辑器等来防止泄露,但您需要找到并堵塞所有漏洞,并且可能仍然无法阻止泄漏。即便如此,显然有些人认为这是一个好主意,因为我以前曾经历过使用这样的系统的痛苦。
除了日志记录之外,我认为这样做的原因是为了减少事故,因为不让人们保持特权 shell 打开来运行每个命令。但必须sudo
在命令前面添加并不能真正降低命令出现拼写错误的可能性。您仍然可能sudo rm -rf *
在错误的目录中,或者误/dev/sdd
认为/dev/sdf
等等。
拒绝特权 shell 对于管理员来说也有一个实际问题。如果系统有管理员的常规帐户无法访问的目录,他们将需要运行特权 shell 才能进入该目录,查看文件列表,并使用制表符完成文件名。如果没有 shell,他们需要始终这样做sudo ls path/to/dir
(不仅仅是sudo ls
,因为他们无法到达那里),然后在使用它们执行某些操作时手动复制粘贴文件名。这非常烦人,但至少会通过减慢所有事情的速度来减少每个时间单位的错误。
答案2
友情提醒改掉坏sudo
习惯
所以,如果我理解正确的话,你“只是”想要一个友好的提醒来改掉坏习惯。换句话说,使用一个简单的工具就可以了,可以轻松地删除或解决它。
在这种情况下,真正的 PATH 目录中的简单 shell 脚本sudo
应该可以工作。我建议你
- 给它起个名字
sudo
- 放到目录下
/usr/local/bin
- 给它执行权限
这意味着当您或您的同事键入时,sudo something
系统会发现
/usr/local/bin/sudo # the shellscript
前
/usr/bin/sudo # the real sudo program
外壳脚本:
#!/bin/bash
if [ $# -eq 1 ] && ( [ "$1" == "-s" ] || [ "$1" == "-i" ] || [ "$1" == "bash" ] )
then
echo "Please do not use 'sudo $1'"
exit
else
/usr/bin/sudo "$@"
fi
如果您想要更难以删除或解决的问题,请告诉我。那样的话我就没有什么可提供的了,我会删除这个答案。
答案3
警告:sudo sudo su
只是有一个问题,如果 sudoers 用户做了一个
sudo sudo su
他可以访问root shell!
因此,Cmnd_Alias 中必须有 /usr/bin/sudo。
Cmnd_Alias SHELLS = /bin/sh, /bin/bash, /bin/bash, /usr/bin/zsh
Cmnd_Alias SU = /bin/su,/usr/bin/sudo
或者在脚本中
if [ $# -eq 1 ] && ( [ "$1" == "-s" ] || [ "$1" == "sudo" ] || [ "$1" == "-i" ] || [ "$1" == "bash" ] )
then
echo "Please do not use 'sudo $1'"
exit
else
/usr/bin/sudo "$@"
fi`