為什麼 PAM 會阻止 root 使用 useradd?
我在具有 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
:好像少了一個欄位
未知的ruser和rhost是預期的,因為您不是遠端的。未知終端 可能令人驚訝,但可能不是您的麻煩之源。
大多數 PAM 模組都有一個調試參數,可能會為您提供更多資訊。例如,
auth required pam_unix.so debug
您是否為帳戶配置了諸如 LDAP 之類的東西,例如 in
/etc/nsswitch.conf
?“無法檢索身份驗證資訊”提醒了我在嘗試在具有 LDAP 帳戶的系統上添加本地使用者時看到的那種錯誤。Arch Linux 是否有類似 SELinux 或其他高級安全層的東西?