Yellow Pages

Inhalt


Yellow Pages

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.

Was ist YP

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...

Wozu braucht man 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...

Die YP Programme

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.

Inbetriebnahme von YP

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).

Vorbereitung und Planung

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

YP Server

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:

YP Master Server

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.

YP Slave Server

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.

YP Clienten

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.

Weitere Gedanken zur Inbetriebnahme von YP

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.

Wie funktioniert YP

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:

Viele Implemenationen halten weitere Daten bereit: 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.

Wie benutzt man YP

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".

YP und DNS

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.

Wie wird man YP wieder los

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.

YP Server hinzufügen oder entfernen

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.

Damit YP so richtig rund läuft

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.

Den richtigen YP Server auswählen

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.

Wie ändert man die IP Adresse eines YP Servers

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.

YP Sicherheit

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.

Betriebssystemspezifische Eigenheiten von YP

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.

SunOS 4

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.

Solaris 2

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.

BSD

YP stammt ursprünglich aus Berekley. Alle modernen BSD Unices wie NetBSD und FreeBSD haben die Features aus SunOS und Solaris vereinnahmt.

Linux

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.

Programe, die mit YP zusammenarbeiten

Neben den Programmen des Betriebssystems gibt es auch noch andere nette Programme, die sinnvoll die YP nutzen können:
Copyright 1999-2001