禁用 sudo -s 和 sudo -i

禁用 sudo -s 和 sudo -i

我想禁用使用 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 选项。SUSHELLSPAGERS/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`

相关内容