Tipps für die Migration von bestehenden Linux-Servern
Irgendwann kommt immer einmal der Tag, an dem der bisherige c't-Debian-Server durch eine neue Hardware abgelöst werden soll. Auf dieser möchte ich ein paar Tipps geben, wie die Daten bzw. Einstellungen am einfachsten "umgezogen" werden können.
Größere Datenmengen über das Netzwerk kopieren
Beim Kopieren größerer Datenmengen ist es häufig günstiger, nicht nur über die (Samba-)Freigaben, sondern auf den gesamten Dateisystem arbeiten zu können. Außerdem ist das Samba-Protokoll bei sehr Datenmengen im Vergleich zu anderen Protokollen nicht besonders schnell.
Natürlich sollen beim Umkopieren alle Dateieigenschaften wie die Zugriffrechte, Änderungsdatum und letzte Zugriffszeit erhalten bleiben.
tar+netcat
Das folgende Beispiel zeigt, wie das Verzeichnis "/home/christian" von dem alten (192.168.0.3) auf den neuen Server (192.168.0.2) kopiert werden kann:
neu# cd /home neu# netcat -l -p 10000 | tar -xvf - --atime-preserve alt# cd /home alt# tar --atime-preserve -cf - christian | netcat -q1 192.168.0.2 10000
Hierbei wird zuerst auf dem neuen Server das Programm netcat im Listen-Modus gestartet (die Portnummer kann frei gewählt werden). Sobald Daten eintreffen, werden diese an das tar-Kommando übergeben, welches die Daten "entpackt".
Darauf wird auf dem alten Server das ensprechende Verzeichnis mit tar "gepackt" und die Ausgabe über eine Pipe an netcat übergeben. Dieses sendet die Daten dann an den neuen Server.
Auf nicht Debian-Systemen sind teilweise etwas andere Versionen von netcat installiert. Teilweise kennen diese die "-q1"-Option nicht. In diesem Fall kann diese Angabe einfach weggelassen werden.
rsync
LDAP-Datenbank von einem anderen Rechner migrieren
Falls eine bestehende LDAP-Datenbank von einem (alten) Server auf ein neues System umgezogen werden soll, kann dieses mit den Befehlen slapcat und slapadd durchgeführt werden:
alt# slapcat -l server.ldif neu# /etc/init.d/slapd stop neu# slapadd -l server.ldif neu# chown openldap:openldap /var/lib/ldap/* neu# /etc/init.d/slapd start
Damit die o.g. Befehle funktionieren, muss der LDAP-Server auf dem neuen System bereits konfiguriert sein (dpkg-reconfigure slapd und /etc/ldap/slapd.conf editieren). Da hierbei bereits zwei Einträge in der Datenbank angelegt werden, kommt es beim Aufruf von slapadd zu einem Fehler (Eintrag existiert bereits). Normalerweise reicht es einfach, die entsprechenden Datensätze vorher aus der LDIF-Datei zu entfernen.
Bei einer Migration ist das Problem aufgetreten, dass einige Samba-User kein "sambaPwdMustChange"-Attribut hatten. Diese User konnten sich dann nicht von Windows aus anmelden. Bei mir habe ich dieses Problem gelöst, indem ich bei den betreffenden Benutzern das Attribut mit Hilfe von ldapmodify (Paket "ldap-utils") angelegt habe:
dn: cn=Vorname Nachname,ou=users,dc=meinnetz,dc=xx changetype: modify add: sambaPwdLastSet sambaPwdLastSet: 2147483647
Benutzerdaten von passwd+tdbsam nach LDAP migrieren
Mit ein wenig manuellen Aufwand können Systeme, bei denen bisher die Benutzer über /etc/passwd (Unix-Accounts) und tdbsam (Samba-Passwörter) verwaltet wurden, auf LDAP umgestellt werden. Dazu sind in etwa folgende Schritte (bitte Reihenfolge beachten) notwendig. Wer auf Nummer sicher gehen möchte, kann zwischen den einzelnen Schritten den aktuellen Zustand der Datenbank mit Hilfe des slapcat-Befehls in eine Textdatei sichern.
- slapd einrichten
- Initiale LDAP-Objekte mit smbldap-tools anlegen
- Unix-Anteil der Benutzeraccounts nach LDAP migrieren
- Unix-Anteil der Rechneraccounts (Windows-PCs) nach LDAP migrieren
- Unix-Gruppen nach LDAP migrieren
- Die neu angelegten LDAP-Accounts um die Daten aus der tdbsam erweiteren
- Authentifizierung auf LDAP umstellen
In meinem Fall habe ich zuerst ein altes System "halb" von tdbsam nach ldap migriert (ohne am Ende die Authentifizierung wirklich auf LDAP umzustellen) und dann die dabei erzeugte Datenbank auf das neue System umgezogen.
slapd einrichten
Auf den Zielsystem muss slapd wie LDAP-Artikel beschrieben eingerichtet werden.
Initiale LDAP-Objekte mit smbldap-tools anlegen
Für diesen Schritt müssen die smbldap-tools ebenfalls wie im LDAP-Artikel beschrieben einrichtet werden. Durch den Aufruf von smbldap-populate werden alle initialen LDAP-Objekte in der Datenbank erstellt:
# smbldap-populate
Unix-Anteil der Benutzeraccounts nach LDAP migrieren
Mit Hilfe des Skripts smbldap-migrate-unix-accounts werden alle Unix-Benutzer und Passwörter nach LDAP migriert. Das Skript verwendet dabei die Konfigurationsdatei von smbldap-tools (/etc/smbldap-tools/smbldap.conf).
Normalerweise sollen nicht alle Benutzer aus der /etc/passwd nach LDAP übernommen werden. Insbesondere die Systembenutzer (root, sys, daemon, ...) belasse ich lokal (in der /etc/passwd), da diese Accounts nicht über LDAP an die anderen PCs im Netz exportiert werden sollen. Dazu erstelle zuerst eine Kopie der /etc/passwd und entferne alle System- und Rechneraccounts.
# cd /root # zcat /usr/share/doc/smbldap-tools/examples/migration_scripts/smbldap-migrate-unix-accounts.gz > smbldap-migrate-unix-accounts # chmod u+x smbldap-migrate-unix-accounts # cp /etc/passwd passwd.users # vi passwd.users ...
Das Skript "smbldap-migrate-unix-accounts" existiert auf älteren Systemen (z.B. Debian Sarge) noch nicht. Es kann aber auch eine neuere Version verwendet werden.
Jetzt können die verbliebenen Accounts in die LDAP-Datenbank übernommen werden:
# ./smbldap-migrate-unix-accounts -P passwd.users -S /etc/shadow -v
Die Datei /etc/shadow braucht nicht gekürzt werden, da hieraus nur die Zeilen mit entsprechendem Eintrag in der angegebenen passwd-Datei übernommen werden.
Unix-Anteil der Rechneraccounts (Windows-PCs) nach LDAP migrieren
Die Migration funktioniert ähnlich wie im vorherigen Schritt. Wieder lege ich eine Kopie der Datei /etc/passwd an, und entferne dieses mal alle Einträge bis auf die Windows-PCs (bei diesen endet der Benutzername mit einem Dollarzeichen):
# cp /etc/passwd passwd.computers # vi passwd.computers ...
Vor dem Aufruf von smbldap-migrate-unix-accounts sollte ggf. der Eintrag "usersdn" in der Datei "/etc/smbldap-tools/smbldap.conf" temporär von "ou=Users,${suffix}" nach "ou=Computers,${suffix}" geändert werden, damit die Computeraccounts getrennt von den Useraccounts in der LDAP-Datenbank gespeichert werden:
# vi /etc/smbldap-tools/smbldap.conf ... (usersdn temporär ändern) # ./smbldap-migrate-unix-accounts -P passwd.computers -S /etc/shadow -v # vi /etc/smbldap-tools/smbldap.conf ... (Änderung an usersdn wieder rückgängig machen)
Unix-Gruppen nach LDAP migrieren
Auch das Migrieren der Unix-Gruppen funktioniert im Prinzip wie bei den Usern. Es sollten nur die Gruppen in die Datenbank übertragen werden, welche weder Systemgruppen sind, noch welche bereits durch smbldap-populate angelegt wurden.
# zcat /usr/share/doc/smbldap-tools/examples/migration_scripts/smbldap-migrate-unix-groups.gz > smbldap-migrate-unix-groups # chmod u+x smbldap-migrate-unix-groups # cp /etc/group group.import # vi group.import ... (Gruppen entfernen, welche nicht importiert werden sollen) # ./smbldap-migrate-unix-groups -G group.import -v
Die neu angelegten LDAP-Accounts um die Daten aus der tdbsam erweiteren
Zum bisherigen Zeitpunkt wurden lediglich die Felder aus der Unix-Benutzerdatenbank nach LDAP migriert. Es fehlen noch die Informationen, die Samba über die einzelnen Benutzer, Gruppen und PCs benötigt. Bevor die Daten von tdbsam nach LDAP konvertiert werden können, müssen zuerst einige Einstellungen für die LDAP-Datenbank in die smb.conf eingetragen werden. Das bedeutet nicht, dass Samba ab diesen Zeitpunkt bereits LDAP verwendet, die Einstellungen beziehen sich erst einmal nur auf den Exportvorgang:
### /etc/samba/smb.conf ### [global] ... ldap admin dn = cn=admin,dc=meinnetz,dc=xx ldap suffix = dc=meinnetz,dc=xx ldap group suffix = ou=Groups ldap user suffix = ou=Users ldap machine suffix = ou=Computers ldap idmap suffix = ou=Idmap
Die Werte sollten mit den entsprechenden Einstellungen in der Date /etc/smbldap-tools/smbldap.conf übereinstimmen. Jetzt können die Daten der Benutzer- und Computeraccounts mit pdbedit nach LDAP übertragen werden:
# pdbedit -v -e ldapsam
Das Ergebnis kann mit slapcat betrachtet werden. Fall in der tdbsam Benutzer bzw. Computer enhalten sind, die nicht der ursprünglich importierten passwd-Datenbank vorkamen, dann haben diese einen abweichenden Objekttyp:
### User mit passwd-Eintragdn: dn: uid=user1,ou=Users,dc=meinnetz,dc=xx objectClass: posixAccount objectClass: inetOrgPerson objectClass: shadowAccount objectClass: sambaSamAccount ### User ohne passwd-Eintrag dn: uid=user2,ou=Users,dc=eggers,dc=xx objectClass: sambaSamAccount objectClass: account
Soweit ich das ganze verstanden habe, benötigt jeder Samba-User / Windows-PC einen Posix-Account. Daher werden Accounts ohne die entsprechende Objektklasse wahrscheinlich nicht funktionieren und müssen evtl. später neu angelegt werden. Außerdem benötigten der Gruppen evtl. noch ein Samba Group Mapping. Dieses kann entweder gleich von smbldap-migrate-unix-groups oder später mit net groupmap angelegt werden.