为什么不能使用`su`切换到空密码用户?

为什么不能使用`su`切换到空密码用户?

创建一个新帐户,名为test

$ sudo useradd test

test目前没有密码。所以

$ su test

不起作用。如果您尝试,系统会要求test您输入 的密码。它没有一个。这与空密码不同,因此如果您按 Enter 键输入空密码,您会收到消息“su:身份验证失败”。

如果您切换到 tty 并尝试以以下身份登录,情况也是如此test:不接受空密码。

现在分配test一个空密码:

$ sudo passwd -d test

test您现在可以通过提供空字符串作为密码在 tty 上登录。但是,如果你尝试

$ su test

再次,您仍然收到消息“su:身份验证失败”会话不会切换到用户test

为什么是这样?

答案1

从 的输出来看ldd /bin/susu二进制文件是使用pam库 ( libpam*) 编译的,因此身份验证、帐户管理、会话启动等内容将由pam.

以下是典型的 Ubuntu 系统的su管理方式pam,如果您使用其他发行版,您应该会找到类似的方法。

pam 的规则在su文件中定义/etc/pam.d/su。该文件还包括与通用模板相同目录中的common-authcommon-passwdcommon-session文件,用于涵盖其名称所暗示的任务(并在其他pam启用的服务中使用)。

在我的系统上,我的底部/etc/pam.d/su有:

@include common-auth
@include common-account
@include common-session

前面几行不处理空密码检查,它主要是pam_unix模块的工作。

现在/etc/pam.d/common-auth有:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure

man pam_unix

努洛克

该模块的默认操作是如果用户的官方密码为空,则不允许用户访问服务。 nullok 参数会覆盖此默认值,并允许任何具有空白密码的用户访问该服务。

nullok_secure

该模块的默认操作是如果用户的官方密码为空,则不允许用户访问服务。 nullok_secure 参数会覆盖此默认值,并允许任何具有空白密码的用户访问该服务,只要将 PAM_TTY 的值设置为 /etc/securetty 中找到的值之一即可。

正如您所看到的,如果nullok_secure设置了该选项,除非以上述方式设置环境变量PAM_TTY,否则将不允许使用空密码的用户使用su.

因此,要允许任何具有空密码的用户执行此操作su,您需要nullokpam_unix模块提供参数:

auth    [success=1 default=ignore]      pam_unix.so nullok

这是不安全的,因为该common-auth文件被许多其他服务使用,即使只是su这样做也不应该这样做。 (为了测试,您可以设置一次,然后恢复到原始状态。尽管如果您想进行测试,最好将所有逻辑合并到/etc/pam.d/su文件中,然后修改任何更改,而不是弄乱任何common-*文件)

答案2

man useradd

-p, --password PASSWORD 
The encrypted password, as returned by crypt(3). The default is to disable the password.
Note: This option is not recommended because the password (or encrypted password) will be visible by users listing the processes. 

您没有使用--password,因此该用户 ID 被赋予了一个特殊的“禁用”密码。与空密码不同。

换句话说,这将是一个安全漏洞。

相关内容