passdb 中的用戶,但 getpwnam() 失敗!

passdb 中的用戶,但 getpwnam() 失敗!

我在 stackoverflow 上問了這個問題,並意識到在這裡我可能會得到更好的答案。

嘗試在 Linux 上使用 nss_ldap 設定 Samba + OpenLDAP。所有軟體都是我從原始碼編譯的,所以沒有 RPM、YUM 等...

使用我們自己的發行版 Pozix Linux - vanilla 登入系統意味著開箱即用的發行版依賴標準 /etc/passwd、/etc/group。

安裝了所有必要的軟體,將系統轉換為基於 LDAP 的系統,該系統似乎可以與除 SAMBA 之外的 SSH 等其他軟體一起使用。

能夠將 Windows7 加入 Samba 獨立 PDC,我無法使用網域帳戶登錄,除非該帳戶也新增至 /etc/passwd 檔案。

我得到:passdb 中的用戶,但 getpwnam() 失敗!

我讀到的所有內容都指向 NSS_LDAP 問題。這是我所做的事情的清單:

  1. getent passwd 向使用者顯示完美
  2. 我可以使用僅存在於 LDAP 資料庫中的使用者帳戶透過 ssh 登入同一台 Linux 主機。
  3. id test(test 是我僅在 LDAP 的測試帳戶)有效
  4. ./pdbedit -Lv 測試有效
  5. ./net rpc 權限清單帳號 -Uroot 有效,我看到 root 擁有所有必要的權限
  6. 根據 stackoverflow 的建議,我將 nsswitch.conf 檔案從 (files ldap) 更改為 (ldap files),這實際上改變了 getent passwd 的轉儲順序,並且沒有解決問題。
  7. 註解掉 rootbinddn 並新增帶有明文版本密碼的 bindpw,以消除 ldap.secret 的任何問題
  8. smb.conf 有 ldapsam:trusted = yes
  9. smb.conf 和 ldap.conf 都關閉了 ssl
  10. 未運行 nscd

samba.org 網站第 5 章中有關讓使用者滿意的所有內容都有效,除了:

./smbclient //tsrvr/test -Utest

這會在 log.smbd 中產生主題錯誤訊息,並且 ldap 偵錯日誌顯示測試查詢,沒有錯誤且成功傳回值。

如果我將“test”放入/etc/passwd,那麼它就可以工作!

就好像 nss_ldap 和 smbd 之間的關係被破壞了,我強調關係,因為 LDAP 看起來正常(slapcat、ldapsearch 等...所有工作)...似乎 nss_ldap 庫正在獲取一個返回值,當返回給 smbd 時,不知怎的,它不被理解。

我真的很感激任何建議。我經常看到這個問題被列出。通常與 PAM 相關,但我不使用 PAM。

此外,如果我破解 /etc/passwd 檔案並為相關使用者新增一行,我就可以登入。

我沒有使用 PAM。我新增了 Samba.org 網站所需的兩個 Windows7 註冊表更新。

軟體堆疊如下: Samba 3.5.3 OpenLDAP 2.4.21 nss_ldap 264

- - - - - - - - - - -[ 更新 ] - - - - - - - - - - - -

我開始查看 Samba 原始碼。

我在 samba3/auth/auth_util.c 中找到了這個函數(大約第 580 行)

auth_serversupplied_info *result; 
const char *username = pdb_get_username(sampass); 
pwd = getpwnam_alloc(result, username);

即使使用者名稱有效,pwd 也會計算為 NULL。 getpwnam_alloc 為結果結構分配記憶體並用 Unix UID、主 GID 等填充它...

我讀到的所有內容都表明此呼叫使用 NSS。我希望 Samba 團隊中比我更了解這方面知識的人能夠插話。

---------------------------------[更新]-------------- ------- 在這裡檢查samba 原始碼這是我發現的:

失敗發生在 auth/auth_util.c(第 580 行)中,呼叫 getpwnam_alloc

getpwnam_alloc 嘗試進行某種緩存,如果在最近的快取中找不到使用者名,則程式碼會失敗並呼叫:

sys_getpwnam 在 lib/system.c 中找到,它只是 getpwnam 的包裝器

記錄在這裡:http://opengroup.org/onlinepubs/007908775/xsh/getpwnam.html

Samba 檢查所描述的 errno 時不會出現;將添加一些調試並返回報告。

絕對是作業系統庫實作 getpwnam 的失敗,但還不確定是什麼。

答案1

解決了!

我有一個啟動 Samba(NMBD、SMBD)以及 OpenLDAP(SLAPD)的腳本。它是一個 RC 腳本,它從檔案中讀取配置數據,以確定哪些進程已經在運行,或者依賴的進程是否無法啟動等。最後一行將 nsswitch.conf 的版本複製到指定使用 LDAP 尋找的位置。

while [ $i -lt $MAXPROCS ];
  do
   PID=${PROC[$i]}
   StartProc $PID

   if test $? != 0; then
    echo "!!! Aborting Any Remaining Start-up Processes !!!"
    exit 1
   fi

  i=$(($i+1))
done

 cp /etc/rc.d/pozix/nsswitch.conf.ldap /etc/nsswitch.conf

關閉後我正在執行以下操作;請注意,我複製了一個 nsswitch.conf 文件,其中包含“noldap”條目。

while [ $i -lt $MAXPROCS ];
do
  PID=${PROC[$i]}
  StopProc $PID
  i=$(($i+1))
done

cp /etc/rc.d/pozix/nsswitch.conf.noldap /etc/nsswitch.conf

事實證明,在啟動場景中,samba 希望 nsswtich.conf 內容在呼叫之前包含 ldap 條目。以下是我為解決問題所做的操作:

cp /etc/rc.d/pozix/nsswitch.conf.ldap /etc/nsswitch.conf

while [ $i -lt $MAXPROCS ];
  do
   PID=${PROC[$i]}
   StartProc $PID

   if test $? != 0; then
    cp /etc/rc.d/pozix/nsswitch.conf.noldap /etc/nsswitch.conf
    echo "!!! Aborting Any Remaining Start-up Processes !!!"
    exit 1
   fi

  i=$(($i+1))
done

總之,如何啟動 SMBD 與啟動 SMBD 的時間同樣重要。如果在nsswitch.conf 沒有LDAP 項目時啟動SMBD,您會得到一個連結到nss_ldap.so 運行的smbd 版本,因此認為它應該只依賴/etc/passwd (如果這就是nsswitch.conf 檔案中的全部內容)且SMBD 運行後更改 nsswitch.conf 內容無效。

希望這對其他系統建構者有所幫助......

答案2

nss_ldap 將 Linux 登入系統設定為使用 LDAP 進行驗證,而不是 Samba。您仍然需要告訴 Samba 使用 ldap 進行身份驗證。例如:

ldap ssl = off
ldap admin dn = cn=Manager,dc=ldappdc,dc=mydomain,dc=com
ldap suffix = dc=ldappdc,dc=mydomain,dc=com
ldap user suffix = ou=People
ldap group suffix = ou=Group
ldap idmap suffix = ou=Idmap
ldap machine suffix = ou=Hosts

當然,Samba 必須具有 LDAP 支援。

現在得到smbldap 工具用於在 LDAP 資料庫中建立使用者/群組/等。 smbldap-tools 將建立具有正確密碼格式(一種用於 Linux,一種用於 Samba)和其他所需屬性的使用者帳戶。

完整的 LDAP 條目如下:

dn: uid=someuser,ou=People,dc=corp,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: sambaSamAccount
cn: someuser
displayName: someuser
gecos: System User
gidNumber: 513
givenName: someuser
homeDirectory: /home/someuser
loginShell: /bin/bash
sambaAcctFlags: [U]
sambaHomeDrive: H:
sambaHomePath: \\%L\someuser
sambaKickoffTime: 2147483647
sambaLMPassword: FBB7BAF5868B4CBAAAD3B435B51404EE
sambaLogoffTime: 2147483647
sambaLogonScript: logon.bat
sambaLogonTime: 0
sambaNTPassword: D4CB2D67B19490FB090A6EDEC60E3EAE
sambaPrimaryGroupSID: S-1-5-21-1603264347-769597993-3324459097-513
sambaProfilePath: \\%L\profiles\someuser
sambaPwdCanChange: 0
sambaPwdLastSet: 1277051243
sambaPwdMustChange: 1280939243
sambaSID: S-1-5-21-1603264347-769597993-3324459097-3006
shadowLastChange: 14780
shadowMax: 45
sn: someuser
uid: someuser
uidNumber: 1003
userPassword:: e1NTSEF9Z2RueUNBMnVDMWVrejZLZGg4OGNLUmRJRU9zdlJFdE8=

相關內容