PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Samba+PDC+LDAP-Problem



ComSubVie
04.07.02, 17:20
Hi!

Ich habe Samba (2.2.5) mit LDAP-Unterstützung kompiliert (--with-ldapsam), so wies in der idealx-anleitung steht, funktioniert eigentlich problemlos.....

Nur wenn ich neue Rechner in die Domain einfügen will, gibt es ein Problem. Wenn ich die Machine-Accounts händisch anlege (smbldap-useradd.pl -m <machinname>) und diese dann (über die Systemsteuerung) in die Domain einfüge, so funktioniert das problemlos. Wenn ich die Accounts automatisch mittels
add user script = smbldap-useradd -m %u anlege, so legt samba (bzw. das Skript) zwar den Account richtig im LDAP an, und wenn es der erste ist, auch die richtigen Passwörter. Wenn das allerdings nicht der erste Computer ist, so gibt es Probleme. Dier LDAP-Eintrag wird zwar vom Skript richtig angelegt, wenn nun der Client aber seine Passwort-Hashes eintragen will, so schreibt samba diese in einen falschen LDAP-Eintrag (d.h. einen falschen Computer - somit funktionieren beide Accounts nicht mehr). Samba bezieht sich dabei auf die rid des Accounts, und die ist falsch (obwohl im LDAP richtig angegeben).

Irgendwelche Ideen? Angeblich soll das Problem im aktuellen CVS behoben sein, aber da funktioniert LDAP bei mir überhaupt nicht mehr :(

Myst
05.07.02, 17:10
Imho liegt es daran, das der Account auch aktiviert werden muss... muss aber nicht daran liegen...

smbldap-useradd.pl -m -a %u

Probiers mal, vielleicht hilfts...

mfg

ComSubVie
05.07.02, 20:50
ok, ich hab mich geirrt, von der shell funktioniert alles problemlos, aber wenn samba das skript startet, so werden die einträge im LDAP nicht richtig angelegt. Dies liegt daran, das das Skript als user administrator (d.h. uid != 0) ausgeführt wird. Da die nächste freie UID mittels getpwuid ermittlet wird, und diese funktion nur als root (uid=0) ausgeführt werden kann, wird jeder account mit der gleichen uid/rid angelegt, und daher aktualisiert samba die passwörter bei irgendeinem account mit der uid (vermutlich beim ersten angelegten), wodurch natürlich nichts geht.

ich habe mal ein kleines setuid-c-programm geschrieben, welches dieses problem vielleicht beheben könnte - kann das aber erst nach dem wochenende testen. wenn es wen interessieren sollte, hier das c-programm und die änderung an smbldap-passwd.pl:

Das C-Programm (ein wenig Fehlerkorrektur oder so würde nicht schaden):

#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <sys/types.h>

int main( int argc, char *argv[] )
{
int userid = 1000;

while ( getpwuid( userid ) != NULL )
{
userid++;
}

printf( "%d", userid );

return 0;
}

Die Änderungen an smbldap-useradd.pl (ein Aufruf von getpwuid ist noch übrig, könnte auch mit einem kleinen c-programm einer modifizierten version des oberen gelöst werden):

*** smbldap-useradd.pl Wed Jul 3 12:01:19 2002
--- smbldap-useradd.pl Fri Jul 5 19:34:55 2002
***************
*** 74,83 ****
my $userUidNumber = $Options{'u'};
if (!defined($userUidNumber)) {
# find first unused uid starting from $UID_START
! while (defined(getpwuid($UID_START))) {
! $UID_START++;
! }
! $userUidNumber = $UID_START;
} elsif (getpwuid($userUidNumber)) { die "Uid already exists.\n"; }

if ($nscd_status == 0) {
--- 74,82 ----
my $userUidNumber = $Options{'u'};
if (!defined($userUidNumber)) {
# find first unused uid starting from $UID_START
! open( FOO, "-|" ) || exec "/usr/local/sbin/getnextuid";
! $userUidNumber = <FOO>;
! close FOO;
} elsif (getpwuid($userUidNumber)) { die "Uid already exists.\n"; }

if ($nscd_status == 0) {

bin für alternativvorschläge natürlich jederzeit dankbar