为什么 PAM 阻止 root 使用 useradd?

为什么 PAM 阻止 root 使用 useradd?

我在单用户工作站上使用 Arch Linux,并为普通用户提供 LXDE 和 lxde-session 自动登录。然后我使用“su”或“sudo”获得 root 权限,并尝试运行“useradd”。

useradd 在我的系统上失败。该系统在不到一年前从头开始重新安装,并定期运行“pacman -Syu”。我不做太多自定义系统管理;主要运行 LXDE 和 vim/gcc/make 作为我的常规用户帐户。当 pacman 尝试运行 useradd 时,它也会失败。

我最近遇到了一个问题,mariadb 和 percona-server 安装后都无法在系统上启动,并跟踪到它是由于 mysql 用户没有正确创建。尝试手动运行 useradd 时,我发现该实用程序已损坏。谷歌搜索后,人们认为这可能是 /etc/shadow 或 /etc/pam.d/ 中的配置文件的问题,所以我对此进行了调查。

我收到的错误是: useradd: PAM: 身份验证服务无法检索身份验证信息

在 useradd 上运行 strace,它似乎能够打开 /etc/shadow 和 /etc/passwd,并且 getuid() 对“root”返回 0:

open("/etc/pam.d/other", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=127, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1a7c0eb000
read(3, "#%PAM-1.0\nauth\t\trequired\tpam_uni"..., 4096) = 127
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f1a7c0eb000, 4096)            = 0
getuid()                                = 0
getuid()                                = 0
open("/etc/login.defs", O_RDONLY)       = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5519, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1a7c0eb000
read(3, "#\n# /etc/login.defs - Configurat"..., 4096) = 4096
read(3, "gular users using chfn - use\n# a"..., 4096) = 1423
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f1a7c0eb000, 4096)            = 0
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=610, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1a7c0eb000
read(3, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 610
close(3)                                = 0
munmap(0x7f1a7c0eb000, 4096)            = 0
geteuid()                               = 0
open("/etc/shadow", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0600, st_size=413, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1a7c0eb000
read(3, "root:x::::::\nbin:x:14871::::::\nd"..., 4096) = 413
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f1a7c0eb000, 4096)            = 0
write(2, "useradd: PAM: Authentication ser"..., 73useradd: PAM: Authentication service cannot retrieve authentication info
) = 73

配置文件看起来不错:

[root@robot1 jwatte]# cat /etc/pam.d/useradd 
#%PAM-1.0
auth        sufficient  pam_rootok.so
auth        required    pam_unix.so
account     required    pam_unix.so
session     required    pam_unix.so
password    required    pam_permit.so

[root@robot1 jwatte]# cat /etc/pam.d/other 
#%PAM-1.0
auth        required    pam_unix.so
account     required    pam_unix.so
password    required    pam_unix.so
session     required    pam_unix.so
[root@robot1 jwatte]# 

我该如何采取下一步措施来解决和调试此问题?我可以在任何地方找到任何有关 PAM 决定失败的原因的调试吗?旧的 /var/log/auth.log 不再存在,并且journalctl -b 不是很有帮助:

May 17 09:52:15 robot1 sudo[676]: pam_unix(sudo:session): session opened for user root by jwatte(uid=0)
May 17 09:52:15 robot1 useradd[677]: Authentication service cannot retrieve authentication info
May 17 09:52:15 robot1 useradd[677]: failed adding user 'mysql', data deleted

我仍然无法从 PAM 中获取太多信息——具体来说,哪个模块在哪一步发生故障?我已经阅读了 useradd 的代码和 PAM 的代码(啊啊啊!护目镜!他们什么也没做!)我最终将 pam_warn.so 添加到“其他”和“useradd”中以执行“帐户”操作,然后我得到了在journalctl中再添加一(1)行:

May 17 11:04:54 robot1 useradd[29944]: pam_warn(useradd:account): function=[pam_sm_acct_mgmt] service=[useradd] terminal=[<unknown>] user=[root] ruser=[<unknown>] rhost=[<unknown>]

Terminal、ruser 和 rhost 未知有什么关系吗?我怎么知道呢?

答案1

看看第一行/etc/shadow:似乎缺少一个字段

答案2

未知鲁瑟主机是预期的,因为您并不遥远。未知终端 可能会令人惊讶,但可能不是您麻烦的根源。

大多数 PAM 模块采用调试参数可能会为您提供更多信息。例如,

auth        required    pam_unix.so debug

您是否为帐户配置了类似 LDAP 的内容,例如在 中/etc/nsswitch.conf? “无法检索身份验证信息”让我想起了我在尝试使用 LDAP 帐户在系统上添加本地用户时遇到的错误。

Arch Linux 是否有类似 SELinux 或其他高级安全层的东西?

相关内容