Pam

為什麼 PAM 會阻止 root 使用 useradd?

  • June 19, 2015

我在具有 LXDE 和 lxde-session 自動登錄到普通使用者的單使用者工作站上使用 Arch Linux。然後我“su”或“sudo”以root權限,並嘗試執行“useradd”。

useradd 在我的系統上失敗。該系統在不到一年前從頭開始重新安裝,並定期執行“pacman -Syu”。我不做太多自定義系統管理;主要執行 LXDE 和 vim/gcc/make 作為我的正常使用者帳戶。當 pacman 嘗試執行它時,useradd 也會失敗。

我最近遇到了一個問題,安裝後 mariadb 和 percona-server 都無法在系統上啟動,並追踪到未正確創建 mysql 使用者。嘗試手動執行 useradd,我發現該實用程序已損壞。Google搜尋,人們認為這可能是 /etc/shadow 或 /etc/pam.d/ 中的 confg 文件有問題,所以我調查了一下。

我得到的錯誤是: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 的程式碼(AAAUUGH!護目鏡!他們什麼都不做!)我最終將 pam_warn.so 添加到“others”和“useradd”用於“account”操作,我得到了在 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>]

終端、ruser 和 rhost 未知是否重要?我怎麼會發現?

看第一行/etc/shadow:好像少了一個欄位

未知的ruserrhost是預期的,因為您不是遠端的。未知終端 可能令人驚訝,但可能不是您的麻煩之源。

大多數 PAM 模組都有一個調試參數,可能會為您提供更多資訊。例如,

auth        required    pam_unix.so debug

您是否為帳戶配置了諸如 LDAP 之類的東西,例如 in /etc/nsswitch.conf?“無法檢索身份驗證資訊”提醒了我在嘗試在具有 LDAP 帳戶的系統上添加本地使用者時看到的那種錯誤。

Arch Linux 是否有類似 SELinux 或其他高級安全層的東西?

引用自:https://unix.stackexchange.com/questions/130961