Doppelt vergebene UIDs

german

#1

Hallo Forum, hallo Univention Team,

ich habe mir durch ein fehlerhaftes Migrations-Script doppelte UIDs eingehandelt. Das Script sollte aus einer CSV-Datei Benutzer mit UID > 2000 anlegen, hat aber bei 1 angefangen.

Leider wurde der Fehler zu spät bemerkt, so dass der Server nun schon im Produktionsbetrieb ist.

Jetzt suche ich nach einer Möglichkeit das nachträglich zu korrigieren.

Wenn ich die Benutzer Scriptgesteuert lösche und dann neu anlege, wäre das recht kompliziert und aufwändig.
Ich müsste die Kennworte rüberretten, verhindern dass die Dovecot Postfächer gelöscht werden uvm.

Gibt es einen Weg wie ich die UID ohne neuanlegen des Benutzers ändern könnte?

UCS in Version 4.1 mit Samba4.

Beste Grüße

Gerd Wilhelm


#2

Ich habe bei einem Testuser per LDAP die UID von 63 auf 2063 gesetzt.

Folgendes ist passiert:
[ul]
[li]Die Samba4 SID bleibt zum glück unverändert.[/li]
[li]Der Benutzer ist weiterhin Mitglied in seinen Gruppen und hat über Samba Zugriff auf die Dateien auf die seine Gruppe zugriff haben sollte[/li]
[li]ABER: Wenn er neue Dateien über Samba erstellt, gehören diese im Dateisystem seiner alten UID, hier 63[/li][/ul]

Ich müsste also entweder das User Mapping zwischen Samba4 und UCS korrigieren.
Oder kann ich den den S4-Connector vielleicht zwingen, den Samba4 Benutzer neu anzulegen? Würde er dabei die SID, die im UCS-LDAP steht verwenden? Dann wäre mein Problem gelöst.

Ich bin dankbar für jeden Tip.

LG
Gerd Wilhelm


#3

Ich habe ine Script geschrieben, was die Sache hoffentlich ausbügelt. Für einen einzelnen Testuser funktioniert es schon mal. Vielleicht kann es jemand brauchen der mal UIDNummern nachträglich ändern muss und Samba4 im Einsatz hat.

Sollte jemand einen Grund kennen, weshalb ich genau das nicht machen sollte, bin ich für Warnungen dankbar.

Das Script tut folgendes:
[ol][li]Schlägt alte und neu UIDNummer sowie SID und HomeDir nach[/li]
[li]ändert die UIDNummer im openldap[/li]
[li]passt die Zuordnung zwischen Samba SID und Unix UIDNummer in der idmap.ldb an[/li]
[li]Ändert die Eigentümerschaft des Home-Verzeichnisses auf die neue UIDNummer[/li]
[li]Optional: Sucht Dateien mit der alten UIDNummer-Eigentümerschaft und ändert diese[/li][/ol]

#!/bin/bash

# Dieses Script der nachträglichen Änderung der Posix UID auf einem UCS System
# Mit Samba4 AD-Master.
#
# Es addiert einen festen Wert zur alten UID und passt danach das ID-Mapping in
# Der SAMBA Datenbank idmap.ldb an.
#
# Als Eingangsdatei wird eine liste der zu ändernden DNs aus dem UCS openldap
# verwendet.
# Diese Datei muss folgede Form haben:
#
# uid=benutzer1,cn=users,dc=domain,dc=local
# uid=benutzer2,cn=users,dc=domain,dc=local

# Konstanten

IDMAPPFAD=/var/lib/samba/private/idmap.ldb    # real
#test# IDMAPPFAD=/tmp/idmap.ldb  #test
EINGABEDATEI=/root/korrektur/nutzer
LDAPBASIS=dc=juwe,dc=local


for i in `cat $EINGABEDATEI `; do
	echo $i
	#Daten aus openldap holen
	univention-ldapsearch -x -LLL -b $i > /tmp/ucsldaptemp
        OLDUID=$(cat /tmp/ucsldaptemp | grep uidNumber | cut -d " " -f 2)
	NEWUID=$(($OLDUID+2000))
	SID=$(cat /tmp/ucsldaptemp | grep sambaSID | cut -d " " -f 2)	
	HDIR=$(cat /tmp/ucsldaptemp  | grep homeDirectory | cut -d " " -f 2)	
	UNAME=$(cat /tmp/ucsldaptemp  | grep uid: | cut -d " " -f 2)
	
	echo $i
	echo "OLDUID = $OLDUID"
	echo "NEWUID = $NEWUID"
	echo "SID    = $SID"
	echo "HOMEDIR= $HDIR"
	echo "Username = $UNAME"
	 
	# Hier UID im UCS LDAP ändern

	echo"dn: $i
changetype: modify
replace: uidNumber
uidNumber: $NEWUID" > /tmp/$UNAME_UCS.ldif

        ldapmodify -D cn=admin,$LDAPBASIS -y /etc/ldap.secret -h localhost -p 7389 -f /tmp/$UNAME_UCS.ldif		
		
	# Hier mapping im S4 idmap ändern
	
	echo "dn: cn=$SID
changetype: modify
replace: xidNumber
xidNumber: $NEWUID" > /tmp/idmapchange$OLDUID_TO_$NEWUID.ldif
	ldbmodify --url=$IDMAPPFAD /tmp/idmapchange$OLDUID_TO_$NEWUID.ldif	
	if [ $? -eq 0 ] ; then 
		echo "$UNAME $OLDUID nach $NEWUID" >> /tmp/idmapchange_ok.log
		rm /tmp/idmapchange$OLDUID_TO_$NEWUID.ldif
	else
		echo $i >> /tmp/idmapchange_fehler.log
		cp /tmp/idmapchange$OLDUID_TO_$NEWUID.ldif /tmp/failed-idmapchange$OLDUID_TO_$NEWUID.ldif
	fi
		
	# Hier Dateieigentum ändern

	chown -R --from $OLDUID $NEWUID $HDIR 
	# Man könnte auch sowas wie "find /mnt/shares/firmendaten -uid $OLDUID -exec chown $NEWUID {} \;" machen.
			
done


Change user UID
#4

Hi,

ich habe ein ähnlich geartetes Problem, möchte ebenfalls die uidNumber anpassen, damit die Migration vom alten Fileserver einfacher vonstatten gehen kann.
Hast du dein Script erfolgreich auf die Produktivuser losgelassen - klappt das ohne Nebenwirkungen?

Vielen Dank für das Script. Dass man die idmap.ldb mit ldapmodify (oder ldbedit -H idmap.ldb) bearbeiten kann, war mir nicht bewußt - cool!
/thorsten


#5

Hallo Thorsten,

ja, ich habe das script erfolgreich auf dem Produktivsystem angewendet. Aber: ich habe das script bevor ich es im Forum gepostet habe “verallgemeinert” und dabei haben sich wohl Fehler eingeschlichen.

So hatte ich die LDAP-Basis in eine Variable ausgelagert, das klappt so aber aus Syntaxgründen nicht (Wegen der vielen Gleichheitszeichen?) Also lieber die LDAP Basis direkt in die Befehle schreiben. Und: nicht mich schimpfen wenn hinterher alles kaputt ist :wink:

Außerdem habe ich noch gemerkt, dass die Änderungen an der idmap erst nach langer zeit wirksam werden. D.H. neu angelegte Dateien haben dann immer noch die alte Unix-ID.

Man kann dass aber mit dem Befehl “net cache flush” abkürzen.

So long
Gerd


#6

Ich danke dir Gerd, habe das Script ein wenig angepasst und auf einem testweise installierten System laufen lassen - hat geklappt.
Super, den net cache flush kannte ich noch nicht, hatte die VM einfach durchgestartet…