<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//DE"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="GENERATOR" CONTENT="lfparser_2.25"> <META NAME="LFCATEGORY" CONTENT="SystemAdministration"> <!-- this is used by a number of tools: =LF=AUTHOR: Atif Ghaffar =LF=CAT___: SystemAdministration =LF=TITLE_: Aufbau eines skalierbaren ISPs unter Verwendung von Open Source Software =LF=NUMBER: 173 =LF=ANAME_: article173.shtml --> <TITLE>lf173, SystemAdministration: Aufbau eines skalierbaren ISPs unter Verwendung von Open Source Software</TITLE> <!-- stylesheet added by lfparser: --> <style type="text/css"> <!-- td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 } pre { font-familiy:monospace,Courier } p.cl { color:#EE9500 } a.nodec { text-decoration:none } p.trans { font-size:8pt; text-align:right } p.clbox { width:50%; alignment:center; background-color:#FFD700; border-style:none; border-width:medium; border-color:#FFD700; padding:0.5cm ; text-align:center } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm ; text-align:left } p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; border-width:medium; border-color:#AAAAAA; padding:0.5cm ; margin-top:0.1cm; margin-right:1cm; margin-left:1cm; text-align:center } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://www.linuxfocus.org/~guido/dev/lfparser.html --> <!-- 2pdaIgnoreStart --> <!-- start navegation bar --> <!-- top navegation bar --> <TABLE summary="topbar_1" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#2e2292"> <TD class="top"><TABLE summary="topbar_1_logo" cellspacing="0" cellpadding="0" border="0" width= "100%"> <TR><TD width="319"><IMG src="../../common/images/logolftop_319x45.gif" alt="[LinuxFocus-icon]" width="319" height="45" align="left" border="0"></TD> <TD class="top"> <TABLE summary="topbar_1_links" width="100%"> <TR align="right"> <TD class="top"><A class="nodec" href="../index.shtml"><FONT color= "#DDDDDD" size="2">Home</FONT></A> | <A class= "nodec" href="../map.html"><FONT color= "#DDDDDD" size="2">Plan</FONT></A> | <A class= "nodec" href="../indice.html"><FONT color= "#DDDDDD" size="2">Index</FONT></A> | <A class="nodec" href="../Search/index.html"><FONT color= "#DDDDDD" size="2">Suchen</FONT></A> </TD> </TR> <TR align="right"> <TD class="top"> <HR width="100%" noshade size="1"> </TD> </TR> </TABLE> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end top navegation bar --> <!-- blue bar --> <TABLE summary="topbar_2" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#00ffff"> <TD><IMG src="../../common/images/transpix.gif" width="1" height= "2" alt=""></TD> </TR> </TABLE> <!-- end blue bar --> <!-- bottom navegation bar --> <TABLE summary="topbar_3" cellspacing="0" cellpadding="0" border="0" align="center" width="94%"> <TR bgcolor="#000000"> <TD> <TABLE summary="topbar_3_links" cellspacing="0" cellpadding="1" border="0" width= "100%"> <TR align="center"> <TD WIDTH="20%"><A class="nodec" href="../News/index.shtml"><FONT color= "#FFFFFF">Nachrichten</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color= "#FFFFFF">Archiv</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Links/index.shtml"><FONT color= "#FFFFFF">Links</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color= "#FFFFFF">Über uns</FONT></A> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end bottom navegation bar --> <!-- stop navegation bar --> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.1 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Dieser Artikel ist verfübar in: <A href="../../English/September2000/article173.shtml">English</a> <A href="../../Castellano/September2000/article173.shtml">Castellano</a> <A href="../../Deutsch/September2000/article173.shtml">Deutsch</a> <A href="../../Francais/September2000/article173.shtml">Francais</a> <A href="../../Nederlands/September2000/article173.shtml">Nederlands</a> <A href="../../Turkce/September2000/article173.shtml">Turkce</a> </FONT></TD></TR></TABLE><br> <!-- SSI_INFO STOP --> <!-- 2pdaIgnoreStop --> <!-- SHORT BIO ABOUT THE AUTHOR --> <TABLE ALIGN=LEFT BORDER=0 WIDTH="190" > <TR> <TD> <!-- 2pdaIgnoreStart --> <!-- PALM DOC --> <TABLE BORDER=0 hspace=4 vspace=4> <TR> <TD> <font size=1> <img src="../../common/images/2doc.gif" width=34 align=left border=0 height=22 alt="convert to palm"><a href="http://cgi.linuxfocus.org/cgi-bin/2ztxt">Convert to GutenPalm</a><br>or <a href="http://cgi.linuxfocus.org/cgi-bin/2pda">to PalmDoc</a></font> </TD> </TR> </TABLE> <!-- END PALM DOC --> <!-- 2pdaIgnoreStop --> <br> <IMG SRC="../../common/images/Atif-Ghaffar.jpg" ALT="[Photo of the Author]" HEIGHT=115 WIDTH=124> <BR>von Atif Ghaffar <br> <small><atif(at)developer.ch></small> <BR><BR> <I>Über den Autor:</I><BR> <p>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. <br>Zur Zeit arbeitet er als Manager der Internetentwicklung bei <a href="http://www.4unet.net">4unet</a> und ist <a href="http://www.4unet.net/careers/">auf der Suche nach talentierten Leuten</a>.<br> Mehr über ihn erfährt man auf seiner <a href="http://www.developer.ch/~aghaffar">Homepage</a>. </P> <!-- TRANSLATED TO de --> <BR><BR><I>Übersetzt ins Deutsche von:</I><BR> Harald Radke <small><harryrat(at)gmx.de></small> <br> <!-- TRANSLATED TO STOP --> <BR><i>Inhalt</i>: <UL> <LI><A HREF="#173lfindex0">Warum LDAP?</A></LI> <LI><A HREF="#173lfindex1">Was ist ISPMan?</A></LI> <LI><A HREF="#173lfindex2">Dienste des ISP</A></LI> <LI><A HREF="#173lfindex3">Virtuelle Domänen</A></LI> <LI><A HREF="#173lfindex4">Software unseres ISP</A></LI> <LI><A HREF="#173lfindex5">Die Verzeichnisstruktur</A></LI> <LI><A HREF="#173lfindex6">LDAP Authentifizierung (ohne Systemkonten)</A></LI> <LI><A HREF="#173lfindex7">LDAP zur DNS Verwaltung</A></LI> <LI><A HREF="#173lfindex8">Einrichtung von ProFTPd</A></LI> <LI><A HREF="#173lfindex9">Cyrus konfigurieren</A></LI> <LI><A HREF="#173lfindex10">Postfix aufsetzen</A></LI> <LI><A HREF="#173lfindex11">Benutzerverwaltung mit ISPMan</A></LI> <LI><A HREF="#173lfindex12">Mehrere Rechner verwenden</A></LI> <LI><A HREF="#173lfindex13">Webmail</A></LI> <LI><A HREF="#173lfindex14">Literaturverweise</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=173&lang=en">Talkback für diesen Artikel</A></LI> </UL> </TD></TR></TABLE> <!-- HEAD OF THE ARTICLE --> <br> <H2> Aufbau eines skalierbaren ISPs unter Verwendung von Open Source Software</H2> <IMG SRC="../../common/images/illustration173.gif" ALT="ispman" HSPACE=10 > <!-- ABSTRACT OF THE ARTICLE --> <P><i>Zusammenfassung</i>: <P> 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, <i>Internet Server Provider</i>s, basierend auf LDAP unter Linux, erläutert. Dabei werden viele angesprochene Aspekte und Fragen tangiert. Zusätzlich wird <i>ISPMan</i> zur Verwaltung eingesetzt. <p> 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 <tt>pre</tt> Tags in formatierten Text umwandeln. <br> Dieser Perl-Aufruf sollte dies bewerkstelligen: <br><i>perl -pi.bak -e 's!textarea.*?>!pre>!g' filename</i><p> 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. <br></P> <HR size="2" noshade align="right"><BR> <!-- BODY OF THE ARTICLE --> <A NAME="173lfindex0"> </A> <H2>Warum LDAP?</H2> <p> 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. </p> <A NAME="173lfindex1"> </A> <H2>Was ist ISPMan?</H2> <p> 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 <a href="http://www.ispman.org">http://www.ispman.org</a> bezogen werden. Allzusehr wird hier nicht auf ISPMan selbst eingegangen werden, wer mag, kann es ausprobieren und auch verbessern. </p> <A NAME="173lfindex2"> </A> <H2>Dienste des ISP</H2> <p> Unser ISP wird DNS, Mail, Webmail, WWW Seiten und mehr verwalten.<br> <br> Beispielhaft wird ein Kunde bertrachtet, dessen Domain <i>exampledomain.com</i> verwaltet werden soll. <br> Die Einrichtung der Domain geschieht durch einige wenige Mausklicke, viele Aktionen geschehen im Hintergrund, darunter DNS, das Einrichten von virtuellen Mail- und WWW-Servern. <br>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.<p> Ein weiterer Aspekt ist die Verwaltung von Internetzugängen. Da der Schwierigkeitsgrad hier aber von <tt>gering</tt> bis <tt>sehr hoch</tt> reicht, wird dieses Thema in diesem Artikel ausgeklammert. :) </p> <A NAME="173lfindex3"> </A> <H2>Virtuelle Domänen</H2> <p> 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. <br> Vielschichtige Probleme ergeben sich nämlich in dem Augenblick, wo Adressen wie <tt>user1@domain1.com</tt> und <tt>user1@domain2.ch</tt>, usw. verwaltet werden sollen.<br> 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. <br> Beispielsweise etwa <tt>Cyrus</tt>, ein großartiger IMAP Server, der statt Benutzer Mailkonten verwaltet. Es kann nur ein Konto namens <i>aghaffar</i> geben. Sollte es einen weiteren Kunden innerhalb der Domain <tt>linuxrus.com</tt> geben, der den Benutzernamen <i>aghaffer</i> 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 <i>aghaffer.linuxrus.com</i> anzulegen, da <tt>Cyrus</tt> "." als Begrenzungszeichen für Mailkonten verwendet. <p> Desweiteren gibt es ja auch ausserhalb der USA Menschen, die das Internet nutzen. Viele Beispiele, die in einigen Mailinglisten gebracht werden, schlagen <i>user1@domain1</i> und <i>user1@domain</i> vor. Diese erwarten, dass alle Domainnamen auf <i>.com</i> enden. Es müssen also <tt>username</tt>, <tt>domain</tt> und <tt>TLD</tt> (Top Level Domain) berücksichtigt werden. <p> Das hier vorgestellte System wird all dies berücksichtigen. <p> Statt einen Benutzer namens <i>aghaffar</i> zu kreieren, werden Benutzernamen die Form <tt>username_domain_tld</tt> haben. <br>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. </p> <A NAME="173lfindex4"> </A> <H2>Software unseres ISP</H2> <p> 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. <p> <ul> <li>openLDAP (der LDAP Server) <li>Postfix (ein LDAP fähiger und sehr schneller SMTP Server) <li>Cyrus imapd (ein ausgezeichneter IMAP/POP3 Server) <li>Cyrus SASL (Bibliothek, die vom Cyrus <tt>imapd</tt> Daemon zur Authentifizierung verwendet wird) <li>Apache (muss man wohl nichts weiter zu sagen) <li>Proftpd (ein sehr guter FTP Server, der LDAP unterstützt) <li>Perl (Hey, hat jemand ernsthaft geglaubt, ich würde das ohne <tt>Perl</tt> hinkriegen?) <li>ISPMan (Ein Programm zur Verwaltung des ISPs, abgestimmt auf das hier vorgestellte Design) <li>Bind (DNS) <li>pam_ldap (LDAP Modul für die Authentifizierung) <li>IMP 2.2 (PHP basierter Webmail Client) </ul> </p> <A NAME="173lfindex5"> </A> <H2>Die Verzeichnisstruktur</H2> <p> Das Verzeichnis verwendet die Domains als Basis. Es gibt Domains, Benutzer innerhalb der Domänen, Domaindienste, usw. <br>Beispielsweise kann es einen Benutzer innerhalb einer Domäne nur einmal geben (ausser einigen systemspezifischen Benutzern, wie dem LDAP, Cyrus,... Administrator). <br>Ein Zweig einer Domain beinhaltet Informationen der jeweiligen Benutzer, die DNS und WWW Daten der Domäne, usw. <br>Ein Beispiel<p> <form> <textarea cols=60 rows=10> o=ispman objectclass=top objectclass=organisation o=ispman domain=developer.ch, o=ispman domain=developer.ch objectclass=top objectclass=dnsdomain objectclass=posixAccount uid: developer.ch uidNumber: 2000 gidNumber: 1000 homeDirectory: /home/developer.ch userPassword: {crypt}XXffGGHH loginShell: /bin/bash ou=users, domain=developer.ch, o=ispman domain=developer.ch ou=users objectclass=top objectclass=domainusers ou=dnsdata, domain=developer.ch, o=ispman domain=developer.ch ou=dnsdata objectclass=top objectclass=domainrelatedobject ou=httpdata, domain=developer.ch, o=ispman ou=httpdata objectclass=top objectclass=httpdata serverroot=/home/httpd/virtual/developer.ch </textarea></form> <p> Hier wird ein Zweig der Domain <i>developer.ch</i> angelegt, welcher sich weiter verzweigt, für Benutzer, DNS Daten und HTTP Daten. <br> In diesem Beispiel werden <tt>uid</tt>, <tt>gid</tt>, <tt>homeDirectory</tt>, usw. dieser Domain definiert, da nur der Benutzer <tt>domain.tld</tt> Zugriff mittels FTP haben soll. Will also der Besitzer der Domain <i>developer.ch</i> Dateien in sein Verzeichnis hochladen, verwendet er der Benutzernamen <i>developer.ch</i> (und das entsprechende Passwort), um sich auf dem FTP Server einzuloggen. Dieser setzt dann (hoffentlich) als Wurzelverzeichnis <tt>homeDirectory</tt>, usw., mehr dazu später. <br><br> Alle anderen Benutzer erhalten keine <tt>uid</tt>,<tt>gid</tt>, usw., da sie sich nicht mittels FTP einloggen sollen. <br>Ein komplette LDIF Beispielsdatei ist <a href="../../common/src/article173/example.ldif.txt">hier</a> 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 <a href="http://www.ispman.org/ldapdata.php3">diesem Link</a> folgen, wieder ein wenig älter. </p> <A NAME="173lfindex6"> </A> <H2>LDAP Authentifizierung (ohne Systemkonten)</H2> <p> Ein sehr schöner Aspekt des hier vorgestellten Systemes ist, dass keine Konten, etwa in <tt>/etc/passwd</tt>, <tt>/etc/shadow</tt> angelegt, bzw. über NIS verwaltet werden müssen. <br> Alle Accounts werden über LDAP verwaltet, Authentifizierung wird von LDAP selbst erledigt. <br>Hierfür wird auf das PAM, das <i>Pluggable Authentification Module</i>, <tt>pam_ldap</tt> zurückgegriffen. PAM ermöglicht es zu spezifizieren, welches Modul für die Authentifizierung, Autorisierung, usw. zuständig ist. <p> Hier als Beispiel die Dateien <tt>/etc/pam.d/imp</tt>, <tt>/etc/pam.d/pop</tt> und <tt>/etc/pam.d/proftp</tt><br> <pre> #%PAM-1.0 auth sufficient /lib/security/pam_ldap.so account sufficient /lib/security/pam_ldap.so </pre> So wird also die Authentifizierung für <tt>imap</tt>/<tt>pop3</tt>/<tt>imap</tt> über den LDAP Server realisiert. Der Benutzer <tt>aghaffar_developer_ch</tt> wird authentifiziert, und kann seine Post abholen, obwohl er weder einen Passwort- noch einen NIS-Eintrag auf dem System hat. </p> <A NAME="173lfindex7"> </A> <H2>LDAP zur DNS Verwaltung</H2> <p> 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. <p> Die Einträge für DNS im LDAP System sehen etwa so aus: <table> <tr> <td bgcolor=antiquewhite> <pre> 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 </pre> </td> <td> Die Definition für den Zweig <tt>dnsdata</tt>. 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. </td> </tr> <tr> <td bgcolor=antiquewhite> <pre> 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 </pre> </td> <td> Hier werden die SOA Einträge für den DNS der Domain <tt>4unet.net</tt> definiert. Die Werte werden durch ein Skript extrahiert, und korrekt füt die Verwendung in der <tt>zone</tt> Datei formatiert. </td> </tr> <tr> <td bgcolor=antiquewhite> <pre> 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 </pre> </td> <td> Dies sind die NS Einträge. <br> Auch hier werden alle Attribute eines Eintrages von einem Skript ausgelesen, durch "," separiert und die Werte in die <tt>zone</tt> Datei eingetragen. </td> </tr> <tr> <td bgcolor=antiquewhite> <pre> 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 </pre> </td> <td> Wie oben, aber nun die MX Einträge. <br>Die Einträge besitzen desweiteren ein Feld für die Priorität, welches entsprechend den MX Einträge der <tt>zone</tt> Datei angepasst wird. </td> </tr> <tr> <td bgcolor=antiquewhite> <pre> 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 </pre></td> <td> Dies sind die A Einträge, Hostname, IP Adresszuordnung... </td> </tr> <tr> <td bgcolor=antiquewhite> <pre> 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 </pre> </td> <td> ...und die CNAMEs oder weitere Namen der Rechner. </td> </tr> </table> Die verwendeten Skripte kommen mit <tt>ISPMan</tt> mit. Ein Beispiel, wie ein NS Eintrag modifiziert wird, ist <a href="http://www.ispman.org/screenshots.php3?screenshot=ns"> hier</a> zu finden. </p> <A NAME="173lfindex8"> </A> <H2>Einrichtung von ProFTPd</H2> <p> 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 <tt>inetd</tt> aus, sondern eigenständig gestartet werden. <br> Dazu werden die Zeilen, die den FTP Dienst betreffen, in <tt>/etc/inetd.conf</tt> auskommentiert und <tt>inetd</tt> neu gestartet.<br> Danach legt man eine Gruppe namens <i>ftponly</i> an, <tt>gid</tt> 1000. Diese <tt>gid</tt> wird innerhalb aller Domainen bekannt sein. <p> Nun sollte <tt>/etc/pam.d/proftpd</tt> entsprechend dem obigen Abschnitt über die Authenifizierung mittels LDAP angepasst werden.<br> Die Date <tt>/etc/proftpd.conf</tt> sollte in etwa so aussehen: <br> <form> <textarea cols=60 rows=10> ServerName "developer connections" ServerType standalone ServerAdmin atif@developer.ch DeferWelcome off DefaultServer on Port 21 Umask 022 User nobody Group nogroup <Directory /*> AllowOverwrite on </Directory> PathAllowFilter ".*/[a-zA-Z0-9]+$" PathAllowFilter ".*/[a-zA-Z0-9_\.\-]+$" PathDenyFilter "(\.ftpaccess)|(\.htaccess)$" MaxInstances 30 UseReverseDNS off IdentLookups off TimeoutStalled 300 ScoreboardPath /var/run/proftpd TransferLog /var/log/proftpd.xfer_log DefaultRoot ~/ ftponly MaxLoginAttempts 3 LDAPServer "localhost" LDAPPrefix "o=ispman" </textarea> </form> <p> Gestartet wird <i>proftpd</i> mittels <tt>/usr/sbin/proftpd</tt>, beendet durch <tt>killall /usr/sbin/proftpd</tt>. </p> <A NAME="173lfindex9"> </A> <H2>Cyrus konfigurieren</H2> <p> Man übersetzt und installiert Cyrus SASL und <tt>imapd</tt>, sowie die C-SDK des UW-MAP Client. <tt>imap</tt> und die SDK sind möglicherweise schon auf dem jeweiligen System installiert. Dies kann man durch <Tt>rpm -aq | grep imap</tt> testen. Im Zweifelsfalle übersetzt und installiert man sich halt eine aktuellere Version. Es werden ein Benutzer <tt>cyrus</tt> und die Gruppe <tt>mail</tt> auf dem System eingerichtet. Man solllte den Installationsanweisungen folgen und später testen, ob der <tt>imap</tt> Server korrekt läuft. Sobald dies der Fall ist, wird die Datei <tt>/etc/pam.d/imap</tt> entsprechend des obigen Abschnittes über die Authentifizierung bearbeitet. <p> Nun muss noch ein LDAP Benutzer eingerichtet werden, zum Beispiel <i>cyrus</i> oder wie auch immer man den Administrator in <tt>/etc/imapd.conf</tt> genannt hat. <br> Ist der Cyrus Administrator etwa <tt>cyrus</tt>, sollte ein entsprechender Eintrag im LDAP Verzeichnis aufgenommen werden: <pre> dn: uid=cyrus, ou=admins, o=ispman cn: Cyrus Admin sn: Cyrus objectclass: top objectclass: systemadmins uid: cyrus userpassword: XXDDCCYY ou: admins </pre> ISPMan erstellt diese Einträge selbstständig während der Einrichtungsphase. </p> <A NAME="173lfindex10"> </A> <H2>Postfix aufsetzen</H2> <p> 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.<br> Trifft etwa eine Mail für die Domain <i>perl.ch</i> ein, so sollten alle Domänen durchsucht werden, ob eine von ihnen <i>perl.ch</i> ist. Ist dies der Fall, soll die Mail angenommen werden, anstatt etwa "Duh MX for perl.ch loops back to myself" zurückzuliefern. <p> Hier ein Beispiel für <tt>/etc/postfix/main.cf</tt>: <form><textarea cols=60 rows=10> queue_directory = /var/spool/postfix program_directory = /usr/lib/postfix command_directory = /usr/sbin daemon_directory = /usr/lib/postfix mail_owner = postfix default_privs = nobody myhostname = mozilla.developer.ch mydomain = developer.ch myorigin = $mydomain inet_interfaces = all default_transport = smtp # the following map gets domain from LDAP to see # if it shoud accept mails for this domain mydestination = /etc/postfix/destination, ldap:ldapdomain ldapdomain_server_host = localhost ldapdomain_server_port = 389 ldapdomain_bind_dn = o=ispman ldapdomain_search_base = o=ispman ldapdomain_query_filter = (&(objectclass=dnsdomain)(domain=%s)) ldapdomain_result_attribute = domain #these maps make a lookup to ldap to see if there is an # entry called mailacceptinggeneralid that matched the address. # for Example, mail comes in for atif@developer.ch, ldap server # searched for mailacceptinggeneralid=atif@developer.ch # If it finds it, then it requests the resulting attribute "maildrop" # this could return a local or remote address. # in my case it returns atif_developer_ch@mozilla, which means drop the # mail in the mailbox called "atif_developer_ch" on host "mozilla" virtual_maps = hash:/etc/postfix/virtual, ldap:ldapvirtual ldapvirtual_server_host = localhost ldapvirtual_server_port = 389 ldapvirtual_bind_dn = o=ispman ldapvirtual_bind = no ldapvirtual_timeout = 5 ldapvirtual_search_base = o=ispman ldapvirtual_query_filter = (mailacceptinggeneralid=%s) ldapvirtual_result_attribute = maildrop ldapvirtual_lookup_wildcards = no relocated_maps = hash:/etc/postfix/relocated smtpd_sender_restrictions = hash:/etc/postfix/access transport_maps = hash:/etc/postfix/transport mailbox_transport = cyrus best_mx_transport = local virtual_domains=/etc/postfix/virtual relay_domains = $mydestination, $virtual_domains smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) local_destination_concurrency_limit = 2 default_destination_concurrency_limit = 10 </textarea></form> <p> </p> <A NAME="173lfindex11"> </A> <H2>Benutzerverwaltung mit ISPMan</H2> <p> Die Verwaltung von Benutzern mit ISPMan ist recht einfach. Das Einrichten eines neuen Benutzers erfolgt in zwei Schritten: <ol> <li>Erstellen eines Eintrages in der LDAP Datenbank <li>Anlegen eines Mailkontos auf dem IMAP Server </ol> Wird ein Benutzer gelöscht, werden automatisch diese beiden Einträge entfernt. </p> <A NAME="173lfindex12"> </A> <H2>Mehrere Rechner verwenden</H2> <p> Auf jedem Rechner der Mailfarm kann mittels ISPMan das Mailkonto eines Benutzers angelegt werden. Hat man beispielsweise die Rechner <tt>mail1</tt>, <tt>mail2</tt>, <tt>mail3</tt>, usw., von denen jeder 10.000 Benutzer verwaltet, kann über die Kombination LDAP-Postfix-Cyrus Post an jede der internen Maschinen geliefert werden. <br>Angenommen, es kommt Post für <i>bob@developer.ch</i> an. <tt>Postfix</tt> stellt eine Anfrage an den LDAP Server nach der <tt>maildrop</tt> Adresse des Eintrages, der mit <tt>mailacceptinggeneralid=bob@developer.ch</tt> übereinstimmt. Der LDAP Server liefert als Antwort <i>bob@mail5.developer.ch</i> zurück, wodurch die Mail an den Rechner <tt>mail5</tt> der Mailfarm weitergeleitet wird. <p>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 <i>mail.developer.ch</i> oder <i>pop.developer.ch</i>, unter der er erreicht wird, statt nachzuhalten, auf welchem Mailserver das Mailkonto wirklich zu finden ist. </p> <A NAME="173lfindex13"> </A> <H2>Webmail</H2> <p> IMP ist eine großartige Software für den Webmail Dienst.<br> Es kann ein Alias <tt>mail.*</tt> in der Konfigurationsdatei von Apache, <tt>httpd.conf</tt>, eingetragen werden, der auf die zentrale IMP Installation verweist.<p> Hier ein Beispiel meiner eigenen Installation<br> <form><textarea cols=60 rows=10> <VirtualHost 195.61.45.153> ServerName mail.webcv.ch ServerAlias mail.* UseCanonicalName off DocumentRoot /www/virtual/mail.webcv.ch/htdocs/horde/imp Alias /horde /www/virtual/mail.webcv.ch/htdocs/horde Alias /imp /www/virtual/mail.webcv.ch/htdocs/horde/imp AddType application/x-httpd-php3 .php3 DirectoryIndex index.html index.php3 Options Indexes FollowSymLinks php3_include_path /www/virtual/mail.webcv.ch/htdocs/horde:/www/virtual/mail.webcv.ch/php php3_auto_prepend_file /www/virtual/mail.webcv.ch/php/prepend.php3 php3_magic_quotes_gpc Off php3_magic_quotes_runtime Off RewriteEngine on RewriteOptions inherit TransferLog /www/logs/mail.webcv.ch_access ErrorLog /www/logs/errors/mail.webcv.ch_error </VirtualHost> </textarea> </form> <p> Es wird eine leicht modifizierte Version von IMP verwendet, die die folgenden Fälle abdeckt: <ul> <li>kurze Benutzernamen (aghaffar statt aghaffar_developer_ch), aus denen dann die kompletten Namen zur Authentifizierung erstellt werden, abhängig von der URL, die der Benutzer angesprochen hat. Ruft etwa der Benutzer <i>aghaffar</i> die Adresse <tt>http://mail.developer.ch</tt> auf, so wird sein Name zu <i>aghaffar_developer_ch</i>, falls etwa der User <i>atif</i> <tt>http://mail.perl.ch</tt> besucht, ist sein Benutzername nun <i>atif_perl_ch</i> <li>Weiterleiten an interne Mailserver, in Abhängigkeit der Antwort des LDAP Dienstes <li>kleine Änderung in der Art, wie Benutzernamen im Adressbuch gespeichert werden, usw. zur Verwaltung mehrerer Hosts auf einem Rechner. </ul> So wird es jedem Kunden ermöglicht, auf Post einfach dadurch zuzugreifen, dass sie die Seite <tt>http://mail.their.domain</tt> besuchen. </ul> </p> <A NAME="173lfindex14"> </A> <H2>Literaturverweise</H2> <p> <DL> <Dt> <A HREF="http://www.padl.com/pam_ldap.html">PAM LDAP Modul</a> </dt> <Dd> Das <tt>pam_ldap</tt> Modul ermöglicht es Solaris und Linux Rechnern, Authentifizierung über LDAP Verzeichnisse zu realisieren und Passworte im Verzeichnis zu verwaltetn. </dd> <DT> <A HREF="http://www.openldap.org/">openLDAP</a> </dt> <DD> 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. </dd> <DT> <A HREF="http://www.postfix.org">Postfix</a> </dt> <dd> Ein ausgezeichneter SMTP Server </dd> <dt><a href="http://asg.web.cmu.edu/cyrus/">Cyrus SASL Bibliothek und <tt>imapd</tt></a></dt> <dd> Das <i>Cyrus Electronic Mail</i> 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.</dd> <dt><a href="http://www.ispman.org">ISPMan (der Exchange Killer)</a></dt> <dd>Die ISP Verwaltungssoftware, die in diesem Artikel verwendet wurde</dd> <dt><a href="http://www.proftpd.net">proftpd</a> </dt> <dd>Eine sichere FTP Serversoftware</dd> </DL> </p> <!-- vim: set sw=2 ts=2 et: --> <!-- 2pdaIgnoreStart --> <A NAME="talkback"> </a> <h2>Talkback für diesen Artikel</h2> Jeder Artikel hat seine eigene Seite für Kommentare und Rückmeldungen. Auf dieser Seite kann jeder eigene Kommentare abgeben und die Kommentare anderer Leser sehen: <center> <table border="0" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <table border="3" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=173&lang=en"><b> Talkback Seite </b></a> </td></tr></table> </td></tr></table> </center> <HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="98%"> <TR><TD ALIGN=CENTER BGCOLOR="#9999AA" WIDTH="50%"> <A HREF="../../common/lfteam.html">Der LinuxFocus Redaktion schreiben</A> <BR><FONT COLOR="#FFFFFF">© Atif Ghaffar, <a href="../../common/copy.html">FDL</a> <BR><a href="http://www.linuxfocus.org">LinuxFocus.org</a></FONT> <BR><a href="http://cgi.linuxfocus.org/cgi-bin/lfcomment?lang=de&article=article173.shtml" target="_TOP">Einen Fehler melden oder einen Kommentar an LinuxFocus schicken</A><BR></TD> <TD BGCOLOR="#9999AA"> <!-- TRANSLATION INFO --> <font size=2>Autoren und Übersetzer:</font> <TABLE> <tr><td><font size="2">en --> -- : Atif Ghaffar <small><atif(at)developer.ch></small></font></td></tr> <tr><td><font size="2">en --> de: Harald Radke <harryrat(at)gmx.de></font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2002-02-24, generated by lfparser version 2.25</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>