Aufbau eines skalierbaren ISPs unter Verwendung von Open Source Software

ArticleCategory: [Choose a category for your article]

System Administration

AuthorImage:[Here we need a little image form you]

[Photo of the Author]

TranslationInfo:[Author and translation history]

original in en Atif Ghaffar
en to de Harald Radke

AboutTheAuthor:[A small biography about the author]

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.

Abstract:[Here you write a little summary]

Aufgrund zahlreicher Reaktionen auf den Linux LDAP Artikel und der Frage, wie man mittels LDAP, kombiniert mit weiterer erstklassiger Open Source Software, einen Mail- oder WWW Server aufsetzen könne, wird in diesem Artikel der Aufbau eines skalierbaren ISP, Internet Server Providers, basierend auf LDAP unter Linux, erläutert. Dabei werden viele angesprochene Aspekte und Fragen tangiert. Zusätzlich wird ISPMan zur Verwaltung eingesetzt.

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.

ArticleIllustration:[This is the title picture for your article]

ispman

ArticleBody:[The article body]

Warum LDAP?

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.

Was ist ISPMan?

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.

Dienste des ISP

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

Virtuelle Domänen

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.

Software unseres ISP

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.

Die Verzeichnisstruktur

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.

LDAP Authentifizierung (ohne Systemkonten)

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

LDAP zur DNS Verwaltung

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.
Die verwendeten Skripte kommen mit ISPMan mit. Ein Beispiel, wie ein NS Eintrag modifiziert wird, ist hier zu finden.

Einrichtung von ProFTPd

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.

Cyrus konfigurieren

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: admins                                                                      
ISPMan erstellt diese Einträge selbstständig während der Einrichtungsphase.

Postfix aufsetzen

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:

Benutzerverwaltung mit ISPMan

Die Verwaltung von Benutzern mit ISPMan ist recht einfach. Das Einrichten eines neuen Benutzers erfolgt in zwei Schritten:

  1. Erstellen eines Eintrages in der LDAP Datenbank
  2. Anlegen eines Mailkontos auf dem IMAP Server
Wird ein Benutzer gelöscht, werden automatisch diese beiden Einträge entfernt.

Mehrere Rechner verwenden

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.

Webmail

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:

So wird es jedem Kunden ermöglicht, auf Post einfach dadurch zuzugreifen, dass sie die Seite http://mail.their.domain besuchen.

Literaturverweise

PAM LDAP Modul
Das pam_ldap Modul ermöglicht es Solaris und Linux Rechnern, Authentifizierung über LDAP Verzeichnisse zu realisieren und Passworte im Verzeichnis zu verwaltetn.
openLDAP
Das OpenLDAP Projekt stellt einen gemeinschaftlichen Versuch dar, eine stabile, voll funktionale und mit kommerziellen Produkten vergleichbare Open Source LDAP Umgebung mit Applikationen und Entwicklungswerkzeugen zu schaffen. Eine über die ganze Welt verteilte Gruppe von Freiwilligen leitet das Projekt und kommuniziert, plant und entwickelt OpenLDAP und die dazugehörigen Dokumente via Internet.
Postfix
Ein ausgezeichneter SMTP Server
Cyrus SASL Bibliothek und imapd
Das Cyrus Electronic Mail Projekt ist ein professionelles, hochskalierbares Mailsystem, dessen Einsatzgebiet von kleinen Unternehmen bis hin zu großen Firmen reicht, unter Verwendung von Standardtechnologien. Sowohl in kleinen Abteilungen unabhängig von anderen, als auch als zentrales Verwaltungssystem einer Firma kann Cyrus verwendet werden.
ISPMan (der Exchange Killer)
Die ISP Verwaltungssoftware, die in diesem Artikel verwendet wurde
proftpd
Eine sichere FTP Serversoftware