禁用SSH用户的"su"命令

我想禁止所有通过ssh登录的用户获取root权限,包括使用"sudo su"命令,因为这几乎是一样的... 这个能做到吗?假设我不是通过ssh登录,并且可以物理访问机器,但希望防止其他用户在没有物理访问权限的情况下获得root权限。

1不提供 sudo 访问权限是一个好的开始。仅限于 SSH 密钥认证也是另一个不错的步骤。 - Thomas Ward
2个回答

我想不出一种通用的方法,让同一个用户能够在图形终端(即虚拟tty)上执行sudo命令,而在ssh连接上却不能执行sudo命令——因为从根本上来说,ssh连接只是另一种类型的虚拟tty。
我能想到的一个近似解决方案是:
1. 有一些可信任的用户可以执行sudo命令,将他们称为alpha和beta。 2. 有一些不能执行sudo命令的用户,将他们称为aleph和bet。
现在,在/etc/ssh/sshd.conf中使用DenyUsers指令禁止alpha和beta通过ssh登录:
DenyUsers alpha beta 

如果你希望用户alpha和aleph能够共享文件,你可以将他们设置为同一组或附加组的成员,并相应调整文件权限。

脚注:

(1)提醒一下:如果用户是sudo组或adm组(取决于Ubuntu版本)的成员,可以使用sudo。要取消用户的sudo权限:

gpasswd -d user sudo 
gpasswd -d user adm 

并且启用它:
gpasswd -a user sudo 
gpasswd -a user adm 

(一个或另一个 --- 请通过您系统中的“组”检查哪个是正确的组)。

谢谢,DenyUsers这个东西看起来应该足够好用了。 - user3475234

如果您不需要一个百分之百可靠的解决方案,您可以创建一个sudo的包装器,在运行真正的sudo之前检查是否通过SSH登录。只需创建一个/usr/local/bin/sudo脚本,标记为可执行(sudo chmod +x /usr/local/bin/sudo),并添加以下内容:
#!/bin/sh

if [ "$SSH_CLIENT" != "" ]; then
    echo "remote sudo access is disabled" 1>&2
    exit 1
fi

/usr/bin/sudo "$@"

缺点:
1. 虽然它对于sudo命令有效,但可以通过直接调用/usr/bin/sudo来绕过。 2. 它依赖于SSH_CLIENT环境变量的内容,因此用户可以通过清除该环境变量来绕过限制。
可能有方法来解决这些问题,但如果你只是需要阻止“典型”用户,那么这个方法应该有效。