创建一个新帐户,名为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/su
,su
二进制文件是使用pam
库 ( libpam*
) 编译的,因此身份验证、帐户管理、会话启动等内容将由pam
.
以下是典型的 Ubuntu 系统的su
管理方式pam
,如果您使用其他发行版,您应该会找到类似的方法。
pam
的规则在su
文件中定义/etc/pam.d/su
。该文件还包括与通用模板相同目录中的common-auth
、common-passwd
、common-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
,您需要nullok
向pam_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 被赋予了一个特殊的“禁用”密码。与空密码不同。
换句话说,这将是一个安全漏洞。