Nss

nss-pam-ldapd 密碼驗證僅在使用 su 時在 CentOS 7 上不起作用

  • August 25, 2021

語境

我這裡有 2 台不同的機器,它們的主要區別是一個執行 CentOS6,另一個執行 CentOS7。兩者都執行最新的可用分發版本的 lib:COS7 為 0.8.13,CentOS6 為 0.7.5 兩者都執行“正常”配置的 nss-pam-ldapd:

/etc/nslcd.conf

uid nslcd
gid ldap

uri ldap://ldap.example.org/
base dc=example,dc=org

ssl no
tls_cacertdir /etc/openldap/cacerts
idle_timelimit 240

base   group  ou=groups,dc=example,dc=org

binddn cn=Readonly,dc=example,dc=org
bindpw **************

伺服器權限:

olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=cube-net,dc=org" write by dn="cn=Readonly,dc=example,dc=org" none by anonymous auth by self write by * none
olcAccess: {1}to dn.base="cn=Readonly,dc=example,dc=org" by dn="cn=Manager,dc=example,dc=org" write by * none
olcAccess: {2}to dn.base="" by * read
olcAccess: {3}to * by dn="cn=Manager,dc=example,dc=org" write by dn="cn=Readonly,dc=example,dc=org" read by self write by * read

問題

我可以很好地查找使用者,但我無法以su在 CentOS 7 上使用的使用者身份登錄。我得到:

mveroone@vm:~$ passwd
Changing password for user mveroone.
(current) LDAP Password: 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
mveroone@vm:~$ su - mveroone
Password: 
su: Permission denied
mveroone@vm:~$ ssh localhost
Authorized uses only. All activity may be \ monitored and reported.
mveroone@localhost's password: 
Last login: Fri Aug 20 16:10:24 2021

Authorized uses only. All activity may be \ monitored and reported.
mveroone@vm:~$ 

所以是的,我可以使用 SSH 登錄,更改我的密碼,但不能使用 su。

我試過的

使用簡單的綁定方法在兩台伺服器上執行 aldapwhoami工作,但不是 SASL(無可用機制)

root@vm:~# ldapwhoami -D uid=user,ou=users,dc=example,dc=org -W -H ldap://ldap.example.org  
Enter LDAP Password: 
dn:uid=user,ou=users,dc=example,dc=org

nslcd -d在嘗試使用密碼驗證時執行su僅在 COS7 中顯示:

nslcd: DEBUG: accept() failed (ignored): Resource temporarily unavailable

儘管根據幾個郵件列表執行緒,這似乎是一個可以忽略的錯誤。

當使用附加調試()執行 nslcd 時nslcd -dd,我可以看到它首先嘗試與使用者綁定,這成功了,然後它搜尋'(objectClass=*)',過濾屬性:dn和 base = 本身有效:

ldap_free_request (origid 1, msgid 1)
ldap_parse_result
ldap_msgfree
ldap_search_ext
put_filter: "(objectClass=*)"
put_filter: simple
put_simple_filter: "objectClass=*"
ldap_build_search_req ATTRS: dn
ldap_send_initial_request
ldap_send_server_request
ldap_result ld 0x7f7a9800cf60 msgid 2
wait4msg ld 0x7f7a9800cf60 msgid 2 (timeout 10000000 usec)
wait4msg continue ld 0x7f7a9800cf60 msgid 2 all 0
** ld 0x7f7a9800cf60 Connections:
* host: ldap.example.org  port: 389  (default)
 refcnt: 2  status: Connected
 last used: Fri Aug 20 11:42:05 2021


** ld 0x7f7a9800cf60 Outstanding Requests:
* msgid 2,  origid 2, status InProgress
  outstanding referrals 0, parent count 0
 ld 0x7f7a9800cf60 request count 1 (abandoned 0)
** ld 0x7f7a9800cf60 Response Queue:
  Empty
 ld 0x7f7a9800cf60 response count 0
ldap_chkResponseList ld 0x7f7a9800cf60 msgid 2 all 0
ldap_chkResponseList returns ld 0x7f7a9800cf60 NULL
ldap_int_select
read1msg: ld 0x7f7a9800cf60 msgid 2 all 0
read1msg: ld 0x7f7a9800cf60 msgid 2 message type search-entry
ldap_get_dn
nslcd: [0e0f76] <authc="user"> DEBUG: ldap_result(): uid=user,ou=users,dc=example,dc=org
ldap_msgfree
ldap_abandon 2
ldap_abandon_ext 2
do_abandon origid 2, msgid 2
ldap_msgdelete ld=0x7f7a9800cf60 msgid=2
ldap_free_request (origid 2, msgid 2)
ldap_free_connection 0 1
ldap_free_connection: refcnt 1
ldap_msgfree
nslcd: [0e0f76] <authc="user"> DEBUG: ldap_unbind()
ldap_unbind

所以路徑是:

  • 綁定(確定)
  • 搜尋自己的DN(ok)
  • 放棄
  • 解綁

然後告訴我它無法驗證使用者。(“權限被拒絕”,所以它與“身份驗證失敗”不同)我執行了一個數據包擷取,它顯示了同樣的事情。

我嘗試過瀏覽 nslcd 的 0.8.x 版變更日誌,看看是否有變化,但有很多變化,沒有足夠的細節。

nslcd好的,所以它最終與PAM-LDAP完全無關……

/etc/pam.d/su最後有這一行(在他的“auth”塊之外)

auth    required    pam_wheel.so    use_uid

例如,其中沒有/etc/pam.d/sshd

評論它解決了這個問題

該行也存在於 CentOS 6 上,但include上面有一條語句跳過了任何進一步的行,而substack沒有。

引用自:https://serverfault.com/questions/1075146