Benutzer in Passdb, aber getpwnam() schlägt fehl!

Benutzer in Passdb, aber getpwnam() schlägt fehl!

Ich habe diese Frage auf Stackoverflow gestellt und festgestellt, dass ich hier möglicherweise bessere Antworten bekomme.

Versuch, Samba + OpenLDAP mit nss_ldap unter Linux einzurichten. Die gesamte Software wird von mir aus dem Quellcode kompiliert, also keine RPMs, YUM usw.

Wir verwenden Pozix Linux, unsere eigene Distribution – das Vanilla-Anmeldesystem bedeutet, dass die Distribution standardmäßig auf den Standarddateien /etc/passwd und /etc/group basiert.

Die gesamte erforderliche Software wurde installiert, um das System in ein LDAP-basiertes System umzuwandeln, das mit anderer Software wie SSH außer SAMBA zu funktionieren scheint.

Konnte Windows 7 mit dem eigenständigen Samba-PDC verbinden, kann mich jedoch nicht mit einem Domänenkonto anmelden, es sei denn, dieses Konto wird auch zur Datei /etc/passwd hinzugefügt.

Ich erhalte: Benutzer in Passdb, aber getpwnam() schlägt fehl!

Alles, was ich gelesen habe, deutet auf ein NSS_LDAP-Problem hin. Hier ist eine Liste der Dinge, die ich getan habe:

  1. getent passwd zeigt Benutzer einwandfrei an
  2. Ich kann mit einem Benutzerkonto, das sich nur in der LDAP-Datenbank befindet, per SSH auf denselben Linux-Host zugreifen.
  3. id test (test ist mein Testkonto nur in LDAP), das funktioniert
  4. ./pdbedit -Lv Test funktioniert
  5. ./net rpc rights list accounts -Uroot funktioniert, ich sehe, root hat alle nötigen Rechte
  6. Gemäß dem Vorschlag von Stackoverflow habe ich meine Datei nsswitch.conf von (LDAP-Dateien) in (LDAP-Dateien) geändert, wodurch die Dump-Reihenfolge des Getent-Passworts im Wesentlichen geändert wurde, das Problem jedoch nicht behoben wurde.
  7. rootbinddn auskommentiert und bindpw mit Klartext-Version des Passworts hinzugefügt, um Fragen mit ldap.secret auszuschließen
  8. smb.conf hat ldapsam:trusted = yes
  9. smb.conf und ldap.conf haben beide SSL deaktiviert.
  10. Nscd wird nicht ausgeführt

Alles auf der Website samba.org in Kapitel 5 zum Thema „Benutzer zufriedenstellen“ funktioniert, außer:

./smbclient //tsrvr/test -Utest

Dies erzeugt eine entsprechende Fehlermeldung in log.smbd und das LDAP-Debugprotokoll zeigt eine Testabfrage ohne Fehler und mit einem erfolgreichen Rückgabewert.

Wenn ich 'test' in /etc/passwd einfüge, funktioniert es!

Es ist, als ob die Beziehung zwischen nss_ldap und smbd unterbrochen wäre, und ich betone „Beziehung“, weil LDAP in Ordnung zu sein scheint (slapcat, ldapsearch usw. ... funktioniert alles) … Es scheint, dass die nss_ldap-Bibliothek einen Rückgabewert erhält, der bei der Rückgabe an smbd irgendwie nicht verstanden wird.

Ich würde mich über jeden Vorschlag sehr freuen. Ich sehe dieses Problem oft aufgelistet. Oft im Zusammenhang mit PAM, aber ich verwende PAM nicht.

Wenn ich außerdem die Datei /etc/passwd öffne und eine Zeile für den betreffenden Benutzer hinzufüge, kann ich mich anmelden.

Ich verwende kein PAM. Ich habe die beiden gemäß der Samba.org-Site erforderlichen Windows 7-Registrierungsupdates hinzugefügt.

Der Software-Stack ist wie folgt: Samba 3.5.3 OpenLDAP 2.4.21 nss_ldap 264

---------------------[ aktualisieren ]---------------------

Ich begann, mir den Samba-Quellcode anzusehen.

Ich habe diese Funktion in samba3/auth/auth_util.c gefunden (ungefähr Zeile 580)

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

pwd wird als NULL ausgewertet, obwohl der Benutzername gültig ist. getpwnam_alloc reserviert Speicher für die Ergebnisstruktur und füllt ihn mit der Unix-UID, der primären GID usw.

Alles, was ich gelesen habe, besagt, dass dieser Aufruf NSS verwendet. Ich hoffe, dass jemand aus dem Samba-Team, der sich damit auskennt, mehr als ich, etwas dazu sagen kann.

---------------------[ Update ]--------------------- Beim Untersuchen des Samba-Quellcodes habe ich Folgendes entdeckt:

Der Fehler tritt in auth/auth_util.c (Zeile 580) bei einem Aufruf von getpwnam_alloc auf.

getpwnam_alloc versucht, eine Art Zwischenspeicherung durchzuführen. Wenn der Benutzername nicht im aktuellen Zwischenspeicher gefunden wird, schlägt der Code mit einem Aufruf von folgendem fehl:

sys_getpwnam gefunden in lib/system.c, das nur ein Wrapper für getpwnam ist

Hier dokumentiert:http://opengroup.org/onlinepubs/007908775/xsh/getpwnam.html

Erscheint nicht, da Samba den beschriebenen Fehlercode überprüft. Ich werde einige Debug-Informationen hinzufügen und mich wieder melden.

Es liegt eindeutig an der Betriebssystembibliothek, die getpwnam implementiert, aber ich bin noch nicht sicher, was.

Antwort1

GELÖST!!!!!!!!!!!

Ich habe ein Skript, das Samba (NMBD, SMBD) sowie OpenLDAP (SLAPD) startet. Es ist ein RC-Skript, das Konfigurationsdaten aus einer Datei liest, um unter anderem festzustellen, welche Prozesse bereits ausgeführt werden oder ob ein abhängiger Prozess nicht gestartet werden kann usw. Hier ist ein Ausschnitt des relevanten Teils des Skripts. Die letzte Zeile kopiert eine Version von nsswitch.conf an die Stelle, die die Verwendung von LDAP-Lookups angibt.

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

Und beim Herunterfahren habe ich Folgendes getan: Beachten Sie, dass ich eine nsswitch.conf-Datei kopiere, die „noldap“-Einträge enthält.

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

Es stellt sich heraus, dass Samba im Startszenario möchte, dass der Inhalt von nsswtich.conf die LDAP-Einträge vor dem Aufruf enthält. So habe ich meine Probleme behoben:

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

Zusammenfassend scheint es genauso wichtig zu sein, wie Sie SMBD starten, wie wann Sie es starten. Wenn Sie SMBD starten, während nsswitch.conf keine LDAP-Einträge hat, wird eine Version von smbd ausgeführt, die mit nss_ldap.so verknüpft ist. Sie gehen davon aus, dass sie nur auf /etc/passwd angewiesen sein sollte (wenn das alles ist, was in der Datei nsswitch.conf steht) und dass eine Änderung des Inhalts von nsswitch.conf nach der Ausführung von SMBD keine Auswirkungen hat.

Hoffe, das hilft anderen Systembauern …

Antwort2

nss_ldap konfiguriert das Linux-Anmeldesystem so, dass LDAP und nicht Samba zur Authentifizierung verwendet wird. Sie müssen Samba dennoch anweisen, LDAP zur Authentifizierung zu verwenden. Beispiel:

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

Natürlich muss Samba mit LDAP-Unterstützung erstellt worden sein.

Jetzt holsmbldap-Werkzeugezum Erstellen von Benutzern/Gruppen/usw. in Ihrer LDAP-Datenbank. smbldap-tools erstellt die Benutzerkonten mit den richtigen Kennwortformaten (eines für Linux, eines für Samba) und anderen erforderlichen Attributen.

So würde ein vollständiger LDAP-Eintrag aussehen:

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=

verwandte Informationen