original in en Atif Ghaffar
en to de Harald Radke
Atif arbeitet in den verschiedensten Bereichen. Mal ist er als System Administrator, mal als Programmierer, Lehrer oder
Projektmanager tätig, abhängig davon, was für die Erfüllung der jeweiligen Aufgabe notwendig ist.
Zur Zeit arbeitet er als Manager der Internetentwicklung bei 4unet und ist
auf der Suche nach talentierten Leuten.
Mehr über ihn erfährt man auf seiner Homepage.
Um zu vermeiden, dass der Artikel durch Beispiele im Text unnötig lang wird,
wurden diese in Textboxen untergebracht.
Wer diese Seiten wirklich ausdrucken will, sollte sie auf seinem Rechner speichern und
dann die Textboxen durch Verwendung von pre Tags in formatierten Text umwandeln.
Dieser Perl-Aufruf sollte dies bewerkstelligen:
perl -pi.bak -e 's!textarea.*?>!pre>!g' filename
Einen ISP aufzubauen und zu verwalten ist ein wenig komplexer, vorallem, wenn es sich um ein hochgradig verfügbares,
skalierbares und automatisiertes System handeln soll. Der Betrieb eines ISPs verlangt ein Team von Administratoren, deren Aufgabe es ist,
die Rechner am laufen zu halten, Accounts einzurichten, WWW Seiten zu pflegen, sowie Probleme zu lösen und Kundenservice zu leisten.
Meistens haben die Mitarbeiter im Kundenservice (oder Helpdesk) keinen Zugriff auf etwaige Einstellungen. Die meisten Helpdesks,
mit denen ich zu tun hatte, brauchten selbst Hilfe.
LDAP ist ein ausgezeichneter Verzeichnisdienst. Durch diesen können nicht nur die Usernamen und Passwörter der Benutzer, sondern noch weitere Informationen über sie und ggfs. von ihnen verwaltet werden. Im Verlauf dieses Artikels wird deutlich werden, wie mittels LDAP eine Menge an Verwaltungsaufgaben zentral erledigt werden kann.
ISPMan ist ein Programm, welche von mir geschrieben wurde, damit ich Ruhe vor der IT Abteilung hatte, wollte sie eine neue Domain, einen neuen WWW Server einrichten oder DNS Einträge ändern. ISPMan ist Open Source und kann unter http://www.ispman.org bezogen werden. Allzusehr wird hier nicht auf ISPMan selbst eingegangen werden, wer mag, kann es ausprobieren und auch verbessern.
Unser ISP wird DNS, Mail, Webmail, WWW Seiten und mehr verwalten.
Beispielhaft wird ein Kunde bertrachtet, dessen Domain exampledomain.com verwaltet werden soll.
Die Einrichtung der Domain geschieht durch einige wenige Mausklicke, viele Aktionen geschehen im Hintergrund, darunter DNS,
das Einrichten von virtuellen Mail- und WWW-Servern.
Der Kunde erhält einen Benutzernamen, um mittels FTP auf seinen WWW/FTP Server zugreifen zu können.
Innerhalb der Domain kann eine beliebige Zahl von E-Mailkonten eingerichtet werden. Benutzer dieser Domain können bei Bedarf
auch Platz füt ihre WWW Seiten erhalten.
Ein weiterer Aspekt ist die Verwaltung von Internetzugängen. Da der Schwierigkeitsgrad hier aber von gering bis sehr hoch reicht, wird dieses Thema in diesem Artikel ausgeklammert. :)
Heutzutage will jeder eine WWW Seite und seine eigene Domain für die Email Adresse.
Mailserver allerdings sind bei der Zustellung von Post eng mit den Benutzerkonten des jeweiligen Systems
verzahnt, keine allzuglückliche Kombination.
Vielschichtige Probleme ergeben sich nämlich in dem Augenblick, wo Adressen wie user1@domain1.com
und user1@domain2.ch, usw. verwaltet werden sollen.
Als Folge müssen eine Menge unnötiger Querverweise realisiert werden.
Man kann nur hoffen, dass in Zukunft die Entwicklung von Software im Hinblick auf diese Problematik
gestaltet wird.
Beispielsweise etwa Cyrus, ein großartiger IMAP Server,
der statt Benutzer Mailkonten verwaltet.
Es kann nur ein Konto namens aghaffar geben.
Sollte es einen weiteren Kunden innerhalb der Domain linuxrus.com geben, der den Benutzernamen aghaffer
verwenden will, hat man Pech gehabt. Es müsste dann ein Konto unter einem anderen Namen eingerichtet und dann auf dieses
Konto verwiesen werden. Es ist nicht möglich, etwa einen Benutzer mit Namen aghaffer.linuxrus.com anzulegen,
da Cyrus "." als Begrenzungszeichen für Mailkonten verwendet.
Desweiteren gibt es ja auch ausserhalb der USA Menschen, die das Internet nutzen. Viele Beispiele, die in einigen Mailinglisten gebracht werden, schlagen user1@domain1 und user1@domain vor. Diese erwarten, dass alle Domainnamen auf .com enden. Es müssen also username, domain und TLD (Top Level Domain) berücksichtigt werden.
Das hier vorgestellte System wird all dies berücksichtigen.
Statt einen Benutzer namens aghaffar zu kreieren, werden Benutzernamen die Form username_domain_tld haben.
Warum nun gerade "_" als Trennzeichenn verwendet wird, habe ich vergessen, "." geht auf jeden Fall nicht,
da Cyrus Schwierigkeiten machen würde und ein paar andere Begrenzer ebenfalls ausscheiden, etwa "&", welcher in Verbindung
mit Shells und URLs Probleme bereiten kann.
Hier eine Liste der Programme, die sehr schön zusammenarbeiten. Natürlich kann auch andere Software verwendet werden, wenn es dem Leser beliebt und das Zusammenspiel klappt.
Das Verzeichnis verwendet die Domains als Basis. Es gibt Domains, Benutzer innerhalb der Domänen, Domaindienste, usw.
Beispielsweise kann es einen Benutzer innerhalb einer Domäne nur einmal geben (ausser einigen systemspezifischen Benutzern,
wie dem LDAP, Cyrus,... Administrator).
Ein Zweig einer Domain beinhaltet Informationen der jeweiligen Benutzer, die DNS und WWW Daten der Domäne, usw.
Ein Beispiel
Hier wird ein Zweig der Domain developer.ch angelegt, welcher sich weiter verzweigt, für Benutzer,
DNS Daten und HTTP Daten.
In diesem Beispiel werden uid, gid, homeDirectory, usw. dieser Domain definiert,
da nur der Benutzer domain.tld Zugriff mittels FTP haben soll. Will also der Besitzer der Domain developer.ch
Dateien in sein Verzeichnis hochladen, verwendet er der Benutzernamen developer.ch (und das entsprechende Passwort),
um sich auf dem FTP Server einzuloggen. Dieser setzt dann (hoffentlich) als Wurzelverzeichnis homeDirectory, usw.,
mehr dazu später.
Alle anderen Benutzer erhalten keine uid,gid, usw., da sie sich nicht mittels FTP einloggen sollen.
Ein komplette LDIF Beispielsdatei ist hier zu finden
(diese mag ein wenig veraltet sein, das sie von einem Arbeitsrechner kommt und ich mittlerweile weitere Features in das
neue Design integriert habe). Wer das Beispiel seinem Chef vorführen will, kann diesem Link
folgen, wieder ein wenig älter.
Ein sehr schöner Aspekt des hier vorgestellten Systemes ist, dass keine Konten, etwa in /etc/passwd, /etc/shadow
angelegt, bzw. über NIS verwaltet werden müssen.
Alle Accounts werden über LDAP verwaltet, Authentifizierung wird von LDAP selbst erledigt.
Hierfür wird auf das PAM, das Pluggable Authentification Module, pam_ldap zurückgegriffen.
PAM ermöglicht es zu spezifizieren, welches Modul für die Authentifizierung, Autorisierung, usw. zuständig
ist.
Hier als Beispiel die Dateien /etc/pam.d/imp, /etc/pam.d/pop und /etc/pam.d/proftp
#%PAM-1.0 auth sufficient /lib/security/pam_ldap.so account sufficient /lib/security/pam_ldap.soSo wird also die Authentifizierung für imap/pop3/imap über den LDAP Server realisiert. Der Benutzer aghaffar_developer_ch wird authentifiziert, und kann seine Post abholen, obwohl er weder einen Passwort- noch einen NIS-Eintrag auf dem System hat.
Für DNS gibt es zur Zeit noch kein LDAP Backend, und vielleicht wäre solch ein Backend auch gar keine so gute Idee, ausser vielleicht für den Einsatz dynamischen DNS in Verbindung mit DHCP. Wie dem auch sei, hier wird LDAP für die Verwaltung der DNS Informationen verwendet. Aus diesen werden dann die DNS Dateien extrahiert. Dadurch können alle Bereiche zentral von einem sicheren Rechner aus verwaltet werden, gleichzeitig werden keine Änderungen am DNS System notwendig.
Die Einträge für DNS im LDAP System sehen etwa so aus:
dn: ou=dnsdata, domain=4unet.net, o=ispman domain: 4unet.net ou: dnsdata objectclass: top objectclass: domainrelatedobject objectclass: posixAccount uid: 4unet.net uidNumber: 2000 gidNumber: 1000 homeDirectory: /home/4unet.net userPassword: {crypt}XXffGGHH loginShell: /bin/true |
Die Definition für den Zweig dnsdata. Es wird ein posixAccount (ein Benutzer) angelegt, der als Namen den der Domain trägt. Dieser Benutzer stellt quasi den WWW Admin dar, der sich über FTP einloggen und Dateien in die jeweiligen Bereich hochladen kann, usw. |
dn: cn=soarecords, ou=dnsdata, domain=4unet.net, o=ispman cn: soarecords primary: ns1.4unet.net ou: dnsdata retry: 1800 rootmail: dnsmaster.4unet.net domain: 4unet.net minimum: 432000 objectclass: top objectclass: domainRelatedObject expire: 1209600 refresh: 21600 |
Hier werden die SOA Einträge für den DNS der Domain 4unet.net definiert. Die Werte werden durch ein Skript extrahiert, und korrekt füt die Verwendung in der zone Datei formatiert. |
dn: cn=nsrecords, ou=dnsdata, domain=4unet.net, o=ispman domain: 4unet.net cn: nsrecords ou: dnsdata objectclass: top objectclass: domainRelatedObject record: @,ns1.4unet.net record: @,ns2.4unet.net |
Dies sind die NS Einträge.
Auch hier werden alle Attribute eines Eintrages von einem Skript ausgelesen, durch "," separiert und die Werte in die zone Datei eingetragen. |
dn: cn=mxrecords, ou=dnsdata, domain=4unet.net, o=ispman domain: 4unet.net cn: mxrecords ou: dnsdata objectclass: top objectclass: domainRelatedObject record: @,10, mx1.4unet.net record: @,100, mx2.4unet.net |
Wie oben, aber nun die MX Einträge.
Die Einträge besitzen desweiteren ein Feld für die Priorität, welches entsprechend den MX Einträge der zone Datei angepasst wird. |
dn: cn=arecords, ou=dnsdata, domain=4unet.net, o=ispman objectclass: top objectclass: domainRelatedObject domain: 4unet.net cn: arecords ou: dnsdata record: ns1, 193.247.80.43 record: ns2, 193.247.80.44 record: @,193.247.80.43 record: @,193.247.80.44 |
Dies sind die A Einträge, Hostname, IP Adresszuordnung... |
dn: cn=cnames, ou=dnsdata, domain=4unet.net, o=ispman objectclass: top objectclass: domainRelatedObject domain: 4unet.net cn: cnames ou: dnsdata record: ftp, www record: mail, www record: *, www |
...und die CNAMEs oder weitere Namen der Rechner. |
Hierzu muss proftpd mit dem LDAP Modul installiert werden.
Soll FTP auch für virtuelle Server eingerichtet werden, und man meint,
es werde recht viel Verkehr geben, sollte der Daemon nicht von inetd aus, sondern
eigenständig gestartet werden.
Dazu werden die Zeilen, die den FTP Dienst betreffen, in /etc/inetd.conf auskommentiert
und inetd neu gestartet.
Danach legt man eine Gruppe namens ftponly an, gid 1000. Diese gid wird innerhalb
aller Domainen bekannt sein.
Nun sollte /etc/pam.d/proftpd entsprechend dem obigen Abschnitt über die Authenifizierung
mittels LDAP angepasst werden.
Die Date /etc/proftpd.conf sollte in etwa so aussehen:
Gestartet wird proftpd mittels /usr/sbin/proftpd, beendet durch killall /usr/sbin/proftpd.
Man übersetzt und installiert Cyrus SASL und imapd, sowie die C-SDK des UW-MAP Client. imap und die SDK sind möglicherweise schon auf dem jeweiligen System installiert. Dies kann man durch rpm -aq | grep imap testen. Im Zweifelsfalle übersetzt und installiert man sich halt eine aktuellere Version. Es werden ein Benutzer cyrus und die Gruppe mail auf dem System eingerichtet. Man solllte den Installationsanweisungen folgen und später testen, ob der imap Server korrekt läuft. Sobald dies der Fall ist, wird die Datei /etc/pam.d/imap entsprechend des obigen Abschnittes über die Authentifizierung bearbeitet.
Nun muss noch ein LDAP Benutzer eingerichtet werden, zum Beispiel cyrus oder wie auch immer man den Administrator in
/etc/imapd.conf genannt hat.
Ist der Cyrus Administrator etwa cyrus, sollte ein entsprechender Eintrag im LDAP Verzeichnis aufgenommen werden:
dn: uid=cyrus, ou=admins, o=ispman cn: Cyrus Admin sn: Cyrus objectclass: top objectclass: systemadmins uid: cyrus userpassword: XXDDCCYY ou: adminsISPMan erstellt diese Einträge selbstständig während der Einrichtungsphase.
Postfix arbeitet sehr gut mit LDAP zusammen. Anfragen über virtuelle Domänen oder Benutzer
können direkt über LDAP realisiert werden, sodass nicht extra angegeben werden muss, für
welche Domains Post empfangen werden soll.
Trifft etwa eine Mail für die Domain perl.ch ein, so sollten alle Domänen durchsucht werden,
ob eine von ihnen perl.ch ist. Ist dies der Fall, soll die Mail angenommen werden, anstatt
etwa "Duh MX for perl.ch loops back to myself" zurückzuliefern.
Hier ein Beispiel für /etc/postfix/main.cf:
Die Verwaltung von Benutzern mit ISPMan ist recht einfach. Das Einrichten eines neuen Benutzers erfolgt in zwei Schritten:
Auf jedem Rechner der Mailfarm kann mittels ISPMan das Mailkonto eines Benutzers angelegt werden.
Hat man beispielsweise die Rechner mail1, mail2, mail3, usw., von denen
jeder 10.000 Benutzer verwaltet, kann über die Kombination LDAP-Postfix-Cyrus Post an jede der
internen Maschinen geliefert werden.
Angenommen, es kommt Post für bob@developer.ch an.
Postfix stellt eine Anfrage an den LDAP Server nach der maildrop Adresse des Eintrages, der mit
mailacceptinggeneralid=bob@developer.ch übereinstimmt. Der LDAP Server liefert als Antwort bob@mail5.developer.ch
zurück, wodurch die Mail an den Rechner mail5 der Mailfarm weitergeleitet wird.
Zur Zeit arbeite ich mit einigen guten Entwicklern an einem IMAP/POP3 Proxy, der auf den jeweiligen Ports der nach aussen sichtbaren Mailservern läuft und die Anfragen transparent an die jeweiligen Server innerhalb des Netzes weiterleitet. Dadurch ist jedem Benutzer nur eine Adresse zugeordnet, beispielsweise mail.developer.ch oder pop.developer.ch, unter der er erreicht wird, statt nachzuhalten, auf welchem Mailserver das Mailkonto wirklich zu finden ist.
IMP ist eine großartige Software für den Webmail Dienst.
Es kann ein Alias mail.* in der Konfigurationsdatei von Apache, httpd.conf, eingetragen
werden, der auf die zentrale IMP Installation verweist.
Hier ein Beispiel meiner eigenen Installation
Es wird eine leicht modifizierte Version von IMP verwendet, die die folgenden Fälle abdeckt: