Yellow Pages
Inhalt
Ich liebe YP. Aber es war keine Liebe auf den ersten Blick, sondern
meine Liebe wuchs mit meinem Verständnis, ständiger Benutzung
und meinen Experimenten.
Yellow Pages sind eine verteilte Netzwerkdatenbank für die
wichtigen Dateien in /etc. Wenn man mehr als zwei Maschinen hat,
die über ein Netzwerk (Ethernet) miteinander verbunden sind,
dann braucht man möglicherweise sowas wie YP. Es vereinfacht
die Administration erheblich. Um einen neuen Benutzer einzutragen,
muß man nicht alle /etc/passwd auf allen Maschinen ändern,
sondern nur auf dem YP Master Server und dann die "Magischen Worte"
sagen und schon wird der Benutzer von allen Maschinen erkannt.
YP hat seinen Ursprung in Berekley (Es war Teil der Berekley
Software Distribution). Miterfinder Bill Joy brachte es später
zu Sun Microsystems. Die Leute bei Sun brachten viele Verbesserungen
an und gaben YP sein heutiges Erscheinungsbild. Sun mußte
auch den Namen ändern (in NIS: Network Information System),
weil British Telecom sie deswegen verklagen wollte. Später
bauten sie ein ganz neues System und nannten es NIS+.
In diesem Dokument vermeide ich den Begriff NIS, da er sonst
zu Konfusionen führen könnte. Außerdem
beginnen die meisten Programme sowieso mit den Buchstaben yp...
Solange man damit leben kann, die Dateien in /etc zu manipulieren,
gibt es keinen Grund, YP zu benutzen. Dies gilt auf jeden Fall
für eine einzelne Maschine, aber auch eventuell für
zwei oder drei, wenn nicht viele Benutzer da sind. Bei mehr
Maschinen und (noch viel wichtiger:) mehr Benutzern, die
eventuell auch mal selber ihr Passwort ändern wollen
(und was sie auch unbedingt regelmäßig machen sollten),
dann macht eine verteilte Netzwerkdatenbank wie YP Sinn.
Wenn aber die Zahl der Maschinen auf die 300 zu geht, die Zahl
der Benutzer auf die 10.000 und die Maschinen sich auf vielen
Netzwerksegmenten tummeln, dann beginnt die Performanz von YP
zu schwinden und es macht mehr und mehr Probleme. In diesem
Falle braucht man was Besseres (wie NIS+).
Bei einem heterogenen Cluster hat man oft gar keine andere
Wahl. Weil YP schon so alt ist und mit BSD-Unix verteilt wurde,
ist es bei vielen Herstellern von Unix-Workstations beim
Betriebssystem dabei. Aber es gibt subtile Unterschiede...
Damit YP seine Arbeit verrichten kann, braucht es einige Programme,
die ich im Folgenden beschreiben werde. Denn es ist bestimmt sehr
hilfreich für das Weiterlesen, wenn man schonmal von denen
gehört hat.
- ypbind: Dämon, stellt die Verbindung mit dem
YP Datenbankserver her, indem er sich an ihn bindet
- ypserv: Dämon auf dem YP Datenbankserver.
Hier wird die eigentliche Arbeit geleistet
- ypxfrd: Überträgt geänderte Daten
zu jedem YP Datenbankserver
- yppasswdd: Behandelt Shadow-Passwörter
- ypupdated: Wird benötigt, wenn ein Benutzer
sein Passwort geändert hat
- ypcat: Gibt eine Datenbankliste aus
- ypwhich: Findet heraus, welche Maschine eine
bestimtme Datenbank bereitstellt
- ypinit: Shellskript, um YP aufzusetzen
- ypmatch: Sucht einen passenden Eintrag in einer
Datenbank
- ypset: Leitet ypbind auf einen anderen YP
Server um
- domainname: Zum Abfragen und Setzen der YP Domäne
- makedbm: Wandelt eine "ndbm"-Datenbank in eine lesbare
Textdatei und umgekehrt
Als Beispiel benutze ich ein fiktives Netzwerk von sechs
Maschinen ((bilbo, frodo, pippin, merry, dick, sam).
Diese Maschinen sollten ohne YP laufen und sich gegenseitig
kennen (/etc/hosts).
Zuerst sollte man sich einen Namen für die YP Domäne
wählen. Mancher bevorzugt den selben Domänennamen
für DNS und YP, aber das ist nicht notwendig. Leider gibt
es aber einen subtilen Zusammenhang hier und es führt
oft zu Verwechslungen. Andererseits funktioniert es und es
kann die Sache vereinfachen, solange man sich über den
kleinen Unterschied im klaren ist.
Mir machen Namen wie ""Moria" oder "Gandalf" viel mehr Spaß
als sowas wie "beutelsend.hobbingen.au".
Man legt einfach eine Datei /etc/defaultdomain an, die den
Namen der YP Domäne enthält und verteilt diese
auf alle Maschinen, die der Domäne angehören sollen.
echo "Gollum" >/etc/defaultdomain
foreach host (bilbo frodo pippin merry dick sam)
rdist -c /etc/defaultdomain $host
end
Als nächstes sucht man sich Rechner aus, die YP Server sein
sollen. Das müssen zuverlässige und rund um die Uhr
laufende Maschinen sein. Ein großer Server in einem
abgeschlossenen Raum ist immer eine gute Wahl. Für eine
handvoll Rechner reicht ein Server, ansonsten sollte man
folgende Regeln beachten:
- Auf jedem Netzwerksegment Einen
- Jeder wichtige Fileserver (besonders, wenn er plattenlose
Clienten bedient)
- Jeder große Rechner mit vielen Benutzern
Einer der Server wird der YP Master Server werden. Dafür
nimmt man am Besten den wichtigsten und stabilsten Rechner.
Zur Vorbereitung legt man ein Verzeichnis /var/yp an (falls
es nicht schon da ist) und kopiert das YP Makefile da hinein.
Tip: SunOS 4.1.X hält eine Kopie des YP Makefile in
/usr/lib/NIS-Makefile vorrätig.
Auf dem erkorenen YP Master Server (im Beispiel: bilbo)
tippt man nun:
domainname `cat /etc/defaultdomain`
ypinit -m
bilbo
frodo
Ctrl-D
reboot
Neben ein paar unwichtigen und offensichtlichen Fragen will
das Skript auch die Namen des Master und der Slave Server
(bilbo und frodo) wissen. Nach dem Reboot kann man beobachten,
wie die neuen Dämonen starten: ypserv, ypbind,
ypxfrd, yppasswdd und ypupdated.
Auf jedem Slave Server (im Beispiel: frodo), tippt man:
domainname `cat /etc/defaultdomain`
ypinit -s bilbo
reboot
Auch hier kann man nach dem Reboot neue Dämonen sehen:
ypserv und ypbind.
Auf den Clienten (im Beispiel: pippin, merry, dick und sam) tippt man:
domainname `cat /etc/defaultdomain`
ypinit -c
reboot
Hier braucht man nicht zu warten und ausserdem bekommt man
als neuen Dämonen nur den ypbind zu sehen.
Natürlich ist der Reboot eigentlich unnötig und man
könnte ohne ihn auskommen. Bei BSD-basierten Maschinen ist
das aber schwierig und bei SysV-basierten langweilig.
Wenn man sich besser auskennt (oder ein HA-Cluster betreibt),
kann man sich durch die /etc/rc* Skripten quälen und
die notwenigen Schritte herausfinden.
Auf jeden Fall ist es ziemlich aufschlußreich, mal einen
Blick in die /etc/rc* Skripten zu werfen, um zu sehen, was
bei bestimmten Ereignissen passiert und wie die Dämonen
gestartet werden.
Zum Beispiel war ich gar nicht glücklich darüber,
wie SunOS entschied, wann der Rechner ein YP Master Server
war. Ich habe diese Zeile dann abgeändert:
if [ -f /var/yp/Makefile ]; then
Das macht Sinn und funktioniert bei mir seit Jahren prima.
Die C Laufzeitbibliothek (kurz: libc) enthät eine Reihe von
Funktionen, um diverse Dateien in /etc zu durchforsten. Für
den Programmierer ist das eine große Erleichterung und dies
macht YP eigentlich erst möglich. An dieser Stelle setzt YP
nämlich an und anstatt in der Datei herumzuwühlen fragt
es den YP Server über das Netz. Beispiele für diese
Funktionen sind: gethostbyname, getpwent, getservent und getnetbyaddr.
Die man-pages geben detailliert Auskunft darüber.
YP benutzt Remote Procedure Calls (RPC), um die Datenbank auf dem
Server abzufragen. Die Datenbanken werden mit "ndbm" aufgebaut
und liegen in /var/yp/`domainname`. Folgende /etc Dateien residieren
üblicherweise in der YP Datenbank:
- passwd: Benutzer
- group: Gruppen
- hosts: Maschinen
- ethers: Ethernetadressen
- networks: Netzwerke (wird kaum benuzt)
- rpc: RPC Datenbank
- protocols: Internetprotokolle
- netgroup: Netzgruppen
- netmasks: Netzmasken
- services: Serviceports von Internetdiensten
- bootparams: Boot-Parameter für plattenlose Clienten
- aliases: E-Mail Aliase
- timezone: Zeitzone
Viele Implemenationen halten weitere Daten bereit:
- publickey: für secure NFS, YP und NIS+
- shadow: Shadow-Passworte
- auto.master: Automountertabelle
- auto.home: Automountertabelle für Home-Filesysteme
- amd.home: Berkeley Automountertabelle für Home-Filesysteme
und mehr.
Einige Betriebssysteme haben dazu sogar einen generellen Mechanismus
implementiert. Solaris 2 tut das (über /etc/nsswitch.conf)
genau wie Linux mit der neuen GNU libc. Auf solchen Systemen
bereitet es keine Schwierigkeit, weitere Dateien aus /etc in
die YP einzubauen (/etc/printcap wäre da ein Kandidat).
Man kann aber auch einige Daten aus der YP herausnehmen.
Dazu muß man nur den Namen der /etc Datei aus der
"all:"-Zeile des YP Makefile herausnehmen und die zugehörige
Datenbankdatei aus /var/yp/`domainname` löschen.
Dies kann in einem heterogenen Cluster notwendig sein, wenn
die /etc Dateien der Betriebssysteme zuenander nicht passen
(/etc/services hat diese Krankheit sehr oft).
Manche der /etc Dateien ändern sich ja sogut wie nie
oder sind nur auf dem Server notwendig. Ich nehme normalerweise
die services, bootparams, aliases und timezone aus der YP raus.
Wenn YP erstmal läuft, ist die Benutzung ganz einfach.
Man macht Änderungen nur noch auf dem YP Master Server und
tippt dann die "Magischen Worte":
cd /var/yp
make
und voila! Die Äderung wird sogleich auf allen Maschinen
sichtbar.
Sind YP Slave Server da, sendet der Master Server eine Kopie der
geänderten Datenbank zu ihnen.
Will ein Benutzer sein Passwort ändern, sollte er nun
"yppasswd" benutzen. Es intoniert dann automatisch die
"Magischen Worte", um die Datenbank zu aktualisieren.
"yppasswd" ist oft nur ein Link zu "/bin/passwd".
SunOS 4.1.X macht normalerweise keine Anstalten, DNS zu benutzen,
wenn ein Rechnername gefragt wird. Aber DNS sollte die einzige
gesicherte Quelle für diese Art von Informationen sein,
wenn der Rechner mit dem Internet verbunden ist.
Dieses Verhalten kann man auf zwei Arten ändern. Einmal
kann man die DNS resolver Bibliothek (libresolv.a) in die
dynamische libc einbauen. Hat man jedoch YP, bietet sich der
zweite Weg an: Im YP Makefile gibt es eine Option "-b".
Ist sie aktiviert, macht der YP Server DNS-Abrufe, wenn der
Rechner in der YP nicht zu finden ist. Dazu braucht er nur
eine funktionierende /etc/resolv.conf.
Rechnernamen, die mit der YP Domäne enden, werden dabei
nur von der YP selber aufgelöst. Wenn man sicherstellen
kann, daß die /etc/hosts auf dem YP Master Server immer
mit der DNS-Domäne abgeglichen ist, dann kann man für
YP und DNS den selben Domänenname benutzen.
Andererseits sollte man (außer im obigen Fall) niemals
einen gültigen DNS Domänenname als YP Domänenname
benutzen. Sonst können merkwürdige Dinge passieren.
Wenn man eine alte Maschine irgendwo her bekommt, dann ist
sie vielleicht gewöhnt, YP zu haben. Oder wenn man eine
Maschine zu einer Konferenz oder Präsentation mitnimmt,
dann findet sie dort ihre YP nicht mehr. Solche Maschinen
fahren ganz einfach nicht in den Mehrbenutzermodus hoch.
Dann muß man YP deaktivieren und das ist auch sehr
einfach. Man startet die Maschine im Einzelbenutzermodus
und löscht (oder bennent um) /etc/defaultdomain und
/var/yp:
mv /etc/defaultdomain /etc/defaultdomain.off
mv /var/yp /var/yp.off
Bei der Gelegenheit wird man üblicherweise auch noch andere
Änderungen vornehmen (Rechnername, /etc/hosts, /etc/passwd,
/etc/fstab und so). Danach sollte die Maschine in den
Mehrbenutzermodus hochfahren können.
Die Liste der YP Server, die man ganz am Anfang (beim
"ypinit -m") eingetippt hat, wird ebenfalls über die
YP verteilt. Will man einen neuen YP Slave Server einrichten,
muß man diesen da eintragen. Leider sind die Daten nur
in Form einer "ndbm"-Datenbank vorhanden. Deshalb muß die
Datenbank in eine Textdatei konvertiert werden, so daß man
sie editieren kann und anschließend wird sie wieder zurück
gewandelt. Das Programm "makedbm" erledigt diese Aufgaben. Wir wollen
im Beispiel nun "pippin" als neuen YP Slave Server eintragen:
cd /var/yp/`domainname`
makedbm -u ypservers >ypservers
echo "pippin pippin" >>ypservers
makedbm ypservers ypservers
cd /var/yp
make
Danach fährt man wie oben beschrieben fort, den
YP Slave Server einzurichten.
Genau so kann man auch einen YP Slave Server entfernen.
Man editiert die Datei ypservers, löscht den
entsprechenden Eintrag, erzeugt die Datenbank und
intoniert die "Magic Words".
Anschließend muß man auf dem ehemaligen YP Server
noch das Verzeichnis /var/yp/`domainname` löschen und
rebooten.
Das funktioniert aber nicht mit dem YP Master Server.
YP funktioniert dann am besten, wenn alle YP Server prima
laufen und das Netzwerk in Ordnung ist. Leider passieren
unangenehme Dinge, wenn das nicht der Fall ist. Besonders
ältere YP Implementierungen (ala SunOS 4.1.X) können
nicht dynamisch sich einen anderen YP Server suchen.
Das Verhalten von "ypbind" ist folgendes: Es schreit beim Booten
nach einem YP Server und welcher zuerst antwortet, der bekommt
den Zuschlag und dabei bleibt es auch. Wenn dieser YP Server
keine Antworten mehr gibt, dann hängt auch der Client.
Um daraus resultierende Probleme zu minimieren, habe ich ein
paar nützliche Techniken entwickelt.
Wenn ein YP Server bootet, startet er den "ypserv" ziemlich früh.
Aber da der Server beim hochfahren ja ziemlich beschäftigt ist,
könnte ein anderer (gerade ziemlich arbeitsloser) YP Server
schneller auf "ypbind" antworten als der lokale "ypserv". Dies ist
natürlich doof, denn ein YP Server hat ja alle Datenbanken lokal
vorrätig. Es macht keinen Sinn, ständig übers Netz
einen anderen YP Server zu fragen.
Schlimmer noch: Zwei YP Server, die gleichzeitig rebooten (passiert
z.B. nach einem Stromausfall), können sich gegenseitig binden!
Das ist eine besonders krasse Situation, denn wenn eine der Maschinen
später stoppt (Crash, Reboot), dann hängen nicht nur
dessen Clienten, sondern der andere YP Server und alle seine
Clienten auch. Manchmal erholt sich dieser Server nicht, auch wenn
der andere YP Server wieder hochgefahren wird.
Ein plattenloser Client sollte seine YP auf seinem NFS-Server
finden. Der NFS-Server ist schon eine Fehlerquelle an sich.
Bindet sich der Client auch noch an einen anderen YP Server,
gibt es schon zwei disjunkte Fehlerquellen. Solche disjunkte
Fehlerquellen führen zu Fehlern, die sich nicht aufsummieren,
sondern exponentiell vervielfachen!
Es gibt eine einfache Lösung für dieses Problem:
"ypbind" kennt eine Option ("-ypsetme"), mit der man später
noch den YP Server ändern kann, an den sich 'ypbind" bindet.
Damit kann man sicherstellen, daß ein YP Server nur an sich
selber bindet und ein plattenloser Client nur an seinen NFS-Server
(um nicht eine weitere Fehlerquelle hinzuzufügen).
Hier ein Ausschnitt aus meinem /etc/rc.local. "ypbind" wird darin
mit der Option "-ypsetme" gestartet und später wird mit
"ypset" auf den richtigen YP Server umgeschaltet:
dname=`domainname`
if [ "$dname" -a -d /var/yp ]; then
ypbind -ypsetme; echo -n ' ypbind'
fi
if [ -d /var/yp/`dname` ]; then
sleep 5
/usr/etc/yp/ypset `hostname`
fi
server=`grep ":.*[ ][ ]*/[ ]" /etc/fstab |\
sed -e "/^#/d" -e "s/:.*//"`
if [ "$server" ]; then
intr -a rdate $server
if [ "$dname" -a -d /var/yp ]; then
/usr/etc/yp/ypset $server
fi
fi
Der Ausschnitt ist nur ein roher Extrakt und soll lediglich zeigen,
wie es gemacht wird.
Solange man nicht die IP-Adresse des YP Master Servers
ändern will, kann man die Clienten auf einen anderen
YP Server umlenken und die YP auf dem Slave Server abschalten.
Dann ändert man die IP-Adresse und macht "ypinit -s".
Muß man jedoch die IP-Adresse des Master Servers ändern,
bleibt einem nichts anderes übrig, als die YP komplett auf
allen Rechnern zu entfernen. Nachdem man die IP-Adresse geändert
hat, muß man die YP neu aufbauen. Nur so und nicht anders
funktioniert es.
Gibt's nicht. Pech!
Nagut, nagut, ich mache nur Spaß. Man kann schon was machen,
damit YP sicher wird. Wenn "ypserv" die Datei /var/yp/securenets
erkennt, dann sollte man diese auch unbedingt benutzen, weil das
schon sehr viel hilft.
Man kann aber auch andere Sicherheitswerkzeuge benutzen, um
YP sicherer zu machen. Als erstes braucht man unbedingt eine
aktuelle Version des "portmapper". Entweder man findet einen
Patch beim Hersteller oder man baut sich den "portmapper" von
Wietse Venema.
Paranoide Administratoren müssen die YP Dämonen unter
Kontroller der TCP-wrapper-libc laufen lassen.
Man kann Shadow-Passworte mit YP benutzen, aber der "ypserv"
sollte alle Anfragen auf die Shadow-Daten außer "ypmatch"
zurückweisen. Der "ypserv" von Sun erlaubt hingegen
Listanfragen, wenn diese von einem Port kleiner 1024 kommen.
Das ist ok, solange im Netzwerk nur vertrauenswürdige
Rechner sind, aber ein dummer PC reicht, um alle (immerhin noch
verschlüsselten) Passworte zu bekommen.
Es wäre eine gute Idee, die Shadow-Passwörter
verschlüsselt an die Slave Server zu übertragen,
wenn "ypxfrd" dies unterstützen würde.
YP unterscheidet sich ein wenig von einem Betriebssystem zum
anderen. Die nicht erwähnten Betriebssysteme haben in der
Regel kaum veränderte Nachkommen der YP von 4.3reno BSD.
Das RPC-4.0 und XDR Paket von Sun sind die Basis aller modernen
YP. Zusätzlich zu 4.3BSD's YP hat SunOS Shadow-Passwords
und einige wichtige Sicherheitsfeatures (basierend auf IP-Adressen:
/var/yp/securenets).
SunOS implementiert eine feste Zugriffsstrategie in der libc:
Ist YP nicht aktiv, durchsucht es die Dateien in /etc, ansonsten
fragt es die YP. Ausnahme: passwd und group (und die
dazugehörigen Shadow-Dateien). Diese werden immer aus /etc
gelesen und eine Zeile, die mit einem "+" startet, bedingt
spezielle Aktionen der YP. Normalerweise schreibt man einfach
eine Zeile nur mit einem "+" an das Ende der Dateien, aber
der "+"-Mechanismus kann viele weitere lustige Dinge.
Mit dem Erscheinen von Solaris 2.0 wurde YP eingestampft und durch
NIS+ ersetzt. Mit Solaris 2.3 erbarmte sich Sun endlich und brachte
wieder ein nutzbares YP in Form des NISkit-1.1 heraus. Seit 2.6
ist NISkit-1.2 sogar wieder Bestandteil des Betriebssystems.
Solaris hat einen allgemeinen Mechanismus zum Durchsuchen der
/etc Dateien (/etc/nsswitch.conf) um verschiedenste Quellen
anzubinden. Beispielsweise kann man folgende Zeile für
Rechnernamenanfragen finden:
hosts: files dns [NOTFOUND=return] nis
Das bedeutet: Schau erstmal in die /etc/hosts. Wenn da nix gefunden
wurde, frage DNS. Wenn DNS nix findet, dann war's das. Meldet
DNS einen Fehler, dann frage die YP.
YP stammt ursprünglich aus Berekley. Alle modernen BSD Unices
wie NetBSD und FreeBSD haben die Features aus SunOS und Solaris
vereinnahmt.
Linux benutzt frei verfügbare Implementationen von YP. Diese
bieten ähnliche Funktionalität wie Sun's YP und haben
viele Sicherheitsfeatures. Leider führte die Konzentration
auf zu viel Sicherheit dazu, daß kein Support für
Shadow-Passwörter über YP vorhanden ist, was YP
natürlich ziemlich nutz- und schutzlos macht, wenn man viele
Benutzer zu verwalten hat.
Neben den Programmen des Betriebssystems gibt es auch noch andere
nette Programme, die sinnvoll die YP nutzen können:
- amd: Der Berkeley Automounter (Die neueste Version
heißt nun am-tools)
- sendmail: Für sendmail V8 muß man beim
Übersetzen nur -DYP -DNDBM definieren
Copyright 1999-2007