<?xml version="1.0"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.de.xsl"?>
<modulesynopsis metafile="mod_auth_ldap.xml.meta">

<name>mod_auth_ldap</name>
<description>Erlaubt die Speicherung der Datenbank f&uuml;r die HTTP
Basic-Authentifizierung in einem LDAP-Verzeichnis.</description>
<status>Experimentell</status>
<sourcefile>mod_auth_ldap.c</sourcefile>
<identifier>auth_ldap_module</identifier>
<compatibility>Verf&uuml;gbar ab Version 2.0.41</compatibility>

<summary>
    <p><module>mod_auth_ldap</module> bietet folgende Eigenschaften:</p>

    <ul>
      <li>Support f&uuml;r das <a
	  href="http://www.openldap.org/">OpenLDAP SDK</a> (1.x und 2.x), das <a
	  href="http://developer.novell.com/ndk/cldap.htm">Novell LDAP SDK</a> und das
	  <a href="http://www.iplanet.com/downloads/developer/">iPlanet SDK
      (Netscape)</a>.</li>

      <li>Komplexe Authorisierungsrichtlinien mit LDAP-Filtern.</li>

      <li>Zugriffskontrolle f&uuml;r Microsoft FrontPage-Nutzer auf ihre
	  Web-Sites unter Beibehaltung von LDAP f&uuml;r die
	  Benutzerauthentifizierung.</li>

      <li>Extensives Caching von LDAP-Operationen &uuml;ber <a
      href="mod_ldap.html">mod_ldap</a>.</li>

      <li>LDAP-Support f&uuml;r SSL (setzt das Netscape-SDK voraus ) oder
      TLS (setzt das OpenLDAP 2.x- oder das Novell LDAP-SDK voraus).</li>
    </ul>
</summary>

<seealso><module>mod_ldap</module></seealso>

<section id="contents"><title>Inhalte</title>

    <ul>
      <li>
        <a href="#operation">Ablauf</a> 

        <ul>
          <li><a href="#authenphase">Die Authentifizierungsphase</a></li>

          <li><a href="#authorphase">Die Autorisierungsphase</a></li>
        </ul>
      </li>

      <li>
        <a href="#requiredirectives">Die require-Direktiven</a> 

        <ul>
          <li><a href="#reqvaliduser">require valid-user</a></li>
          <li><a href="#requser">require user</a></li>
          <li><a href="#reqgroup">require group</a></li>
          <li><a href="#reqdn">require dn</a></li>
        </ul>
      </li>

      <li><a href="#examples">Beispiele</a></li>
      <li><a href="#usingtls">TLS</a></li>
      <li><a href="#usingssl">SSL</a></li>

      <li>
        <a href="#frontpage">Microsoft FrontPage mit 
        <module>mod_auth_ldap</module></a> 

        <ul>
          <li><a href="#howitworks">Funktionsweise</a></li>
          <li><a href="#fpcaveats">Einschr&auml;nkungen</a></li>
        </ul>
      </li>
    </ul>
</section>

<section id="operation"><title>Ablauf</title>

    <p>Der Benutzerzugriff wird in zwei Phasen gew&auml;hrt. Die erste
    Phase ist die Authentifizierung, in der <module>mod_auth_ldap</module>
    die G&uuml;ltigkeit der Benutzerangaben pr&uuml;ft. Sie kann auch als
    <em>Such- oder Binde</em>-Phase bezeichnet werden. Die zweite Phase ist
    die Autorisierung, in der <module>mod_auth_ldap</module> feststellt,
    ob der zu authentifizierende Benutzer Zugriff auf die fragliche Ressource
	hat. Sie kann auch als <em>Vergleichsphase</em> bezeichnet werden.</p>

<section id="authenphase"><title>Die Authentifizierungsphase</title>

    <p>W&auml;hrend der Authentifizierungsphase sucht das Modul
    <module>mod_auth_ldap</module> nach einem Eintrag im Verzeichnis,
    der mit dem vom HTTP-Client &uuml;bermittelten Benutzernamen
	&uuml;bereinstimmt. Wird eine eindeutige &Uuml;bereinstimmung gefunden,
	versucht das Modul, mit dem DN (Distinguished Name) und dem Passwort des
    HTTP-Client eine Bindung an den Verzeichnisserver herzustellen. Weil
	zuerst gesucht und dann eine Bindung hergestellt wird, kann auch von der
	Such- und Bindephase gesprochen werden. In der Bindephase werden folgende
	Schritte durchgef&uuml;hrt:</p>

    <ol>
      <li>Durch Kombination der Attribute und Filter der 
      <directive module="mod_auth_ldap"
      >AuthLDAPURL</directive>-Direktive mit dem 
      vom HTTP-Client &uuml;bergebenen Benutzernamen wird ein Suchfilter
      erzeugt.</li>

      <li>Mit dem erzeugten Filter wird im Verzeichnis gesucht. Liefert die
      Suche keinen &uuml;bereinstimmenden Eintrag, wird der Zugriff verweigert
	  oder abgelehnt.</li>

      <li>Mit dem DN des Suchergebnisses und dem vom HTTP-Client
	  &uuml;bergebenen DN sowie dem Passwort wird versucht, eine Bindung zum
	  LDAP-Server herzustellen. Kommt die Bindung nicht zustande, wird der
	  Zugriff verweigert oder abgelehnt.</li>
    </ol>

    <p>Die folgenden Direktiven werden in dieser Phase benutzt:</p>

    <table>
      <tr>
        <td><directive module="mod_auth_ldap">AuthLDAPURL</directive></td>

        <td>Gibt den LDAP-Server, den Ausgangs-DN, das Attribut f&uuml;r
        die Suche sowie weitere Filter an.</td>
      </tr>

      <tr>
        <td><directive module="mod_auth_ldap">AuthLDAPBindDN</directive></td>

        <td>Ein optionaler DN f&uuml;r die Bindung w&auml;hrend der
		Suchphase.</td>
      </tr>

      <tr>
        <td><directive
        module="mod_auth_ldap">AuthLDAPBindPassword</directive></td>

        <td>Ein optionales Passwort f&uuml;r die Bindung w&auml;hrend der
		Suchphase.</td>
      </tr>
    </table>
</section>

<section id="authorphase"><title>Die Autorisierungsphase</title>

    <p>W&auml;hrend der Autorisierungsphase versucht das Modul
    <module>mod_auth_ldap</module> festzustellen, ob der Benutzer berechtigt
	ist, auf die Ressource zuzugreifen. Bei vielen dieser
	&Uuml;berpr&uuml;fungen muss das <module>mod_auth_ldap</module>-Modul eine
	Vergleichsoperation auf dem LDAP-Server durchf&uuml;hren. Deshalb wird diese
	Phase auch Vergleichsphase bezeichnet. <module>mod_auth_ldap</module>
	akzeptiert folgende <directive module="core">Require</directive>-Anweisungen,
    um festzustellen, ob die Benutzerangaben korrekt sind:</p>

    <ul>
      <li>Bei einer <a href="#requser"><code>require
      valid-user</code></a>-Anweisung wird Zugriff gew&auml;hrt.</li>

      <li>Bei einer <a
      href="#reqgroup"><code>require user</code></a>-Anweisung und 
      &Uuml;bereinstimmung des Benutzernames aus der Anweisung mit dem 
      vom Client &uuml;bergebenen Benutzernamen wird Zugriff gew&auml;hrt.</li>

      <li>Bei einer <a href="#reqdn"><code>require
      dn</code></a>-Anweisung  und &Uuml;bereinstimmung des DN aus der
	  Anweisung mit dem DN aus dem LDAP-Verzeichnis wird Zugriff
	  gew&auml;hrt.</li>

      <li>Bei einer <a
      href="#reqgroup"><code>require group</code></a>-Anweisung und
      Vorhandensein des aus dem LDAP-Verzeichnis entnommen DN 
      (oder des vom Client &uuml;bergebenen Benutzernamens) in der LDAP-Gruppe
      wird Zugriff gew&auml;hrt.</li>

      <li>Andernfalls wird der Zugriff abgelehnt oder verweigert.</li>
    </ul>

    <p>In der Vergleichsphase benutzt <module>mod_auth_ldap</module> 
    folgende Anweisungen:</p>

    <table>
      <tr>
        <td><directive module="mod_auth_ldap">AuthLDAPURL</directive></td>

        <td>Das in der URL angegebene Attribut wird f&uuml;r
		Vergleichsoperationen der <code>require user</code>-Operation benutzt.</td>
      </tr>

      <tr>
        <td><directive
        module="mod_auth_ldap">AuthLDAPCompareDNOnServer</directive></td>

        <td>Legt das Verhalten der <code>require dn</code>-Direktive fest.</td>
      </tr>

      <tr>
        <td><directive
        module="mod_auth_ldap">AuthLDAPGroupAttribute</directive></td>

        <td>Legt das Attribut f&uuml;r Vergleiche der <code>require
		group</code>-Direktive fest.</td>
      </tr>

      <tr>
        <td><directive
        module="mod_auth_ldap">AuthLDAPGroupAttributeIsDN</directive></td>

        <td>Gibt an, ob der Benutzer-DN oder der Benutzername bei Vergleichen
		f&uuml;r die <code>require group</code>-Anweisung benutzt werden
		soll.</td>
      </tr>
    </table>
</section>
</section>

<section id="requiredirectives"><title>Die require-Direktiven</title>

    <p>Mit den <directive module="core">Require</directive>-Direktiven 
    wird w&auml;hrend der Autorisierungsphase sichergestellt, dass der 
    Benutzer auf eine Ressource zugreifen darf.</p>

<section id="reqvaliduser"><title>require valid-user</title>

    <p>Ist die Anweisung vorhanden, gew&auml;hrt <module>mod_auth_ldap</module>
    jedem Benutzer Zugriff, der sich in der Bindungsphase erfolgreich
    authentifiziert hat.</p>
</section>

<section id="requser"><title>require user</title>

    <p>Die <code>require user</code>-Direktive gibt an, welche
    Benutzernamen auf die Ressource zurgreifen k&ouml;nnen. Hat
    <module>mod_auth_ldap</module> einen eindeutigen DN im Verzeichnis
    gefunden, wird eine LDAP-Vergleichsoperation mit dem von
     <code>require user</code> angegebenen Benutzernamen durchgef&uuml;hrt,
    um festzustellen, ob dieser Benutzername Teil des gerade ermittelten
    LDAP-Eintrags ist. Werden mehrere Benutzernamen getrennt durch
    Leerzeichen angegeben, kann mehreren Benutzern der Zugriff gew&auml;hrt
	werden. Enth&auml;lt ein Benutzername ein Leerzeichen, dann muss dieser in
	doppelte Anf&uuml;hrungszeichen gesetzt werden. Mehreren Benutzern kann auch
    Zugriff gew&auml;hrt werden, wenn mehrere <code>require
	user</code>-Anweisungen mit einem Benutzer pro Zeile kodiert werden. Mit der
	<directive module="mod_auth_ldap">AuthLDAPURL</directive>-Anweisung f&uuml;r
    <code>ldap://ldap/o=Airius?cn</code> (d.h., <code>cn</code> wird f&uuml;r
	die Suche benutzt) k&ouml;nnen beispielsweise folgende require-Direktiven
    den Zugriff regeln:</p>
<example>
require user "Barbara Jenson"<br />
require user "Fred User"<br />
require user "Joe Manager"<br />
</example>

    <p>Aufgrund der Art und Weise, in der <module>mod_auth_ldap</module> 
    diese Direktive behandelt, kann Barbara Jenson sich als <em>Barbara
    Jenson</em>, <em>Babs Jenson</em> oder mit jedem anderen 
    <code>cn</code> aus ihrem LDAP-Eintrag anmelden. Nur diese 
    einzige <code>require user</code>-Zeile ist erforderlich, um alle Werte
    des Attributs aus dem Benutzereintrag zu erm&ouml;glichen.</p>

    <p>W&uuml;rde das Attribut <code>uid</code> an Stelle des Attributs
    <code>cn</code> in dieser URL verwendet, w&uuml;rden sich die drei oben
    aufgef&uuml;hrten Zeilen auf </p> <example>require user bjenson fuser
	jmanager</example> reduzieren.
    </section>

<section id="reqgroup"><title>require group</title>

    <p>Diese Direktive gibt eine LDAP-Gruppe an, deren Mitglieder Zugriff
    haben. Sie benutzt den DN der LDAP-Gruppe. Angenommen, das LDAP-Verzeichnis
	enth&auml;lt folgenden Eintrag:</p>
	
<example>
dn: cn=Administrators, o=Airius<br />
objectClass: groupOfUniqueNames<br />
uniqueMember: cn=Barbara Jenson, o=Airius<br />
uniqueMember: cn=Fred User, o=Airius<br />
</example>

    <p>Mit der folgenden Direktive erhalten dann sowohl Fred als auch 
    Barbara Zugriff:</p>
	
<example>require group "cn=Administrators, o=Airius"</example>

    <p>Das Verhalten dieser Direktive kann mit den Direktiven <directive
    module="mod_auth_ldap">AuthLDAPGroupAttribute</directive> und
    <directive
    module="mod_auth_ldap">AuthLDAPGroupAttributeIsDN</directive>
    modifiziert werden.</p>
</section>

<section id="reqdn"><title>require dn</title>

    <p>Mit der <code>require dn</code>-Direktive kann der Administrator
    Zugriff &uuml;ber die Distinguished Names gew&auml;hren. Sie gibt einen
	DN an, der &uuml;bereinstimmen muss, damit Zugriff gew&auml;hrt wird.
	Stimmt der im Verzeichnisserver gefundene DN mit dem DN in <code>require
	dn</code> &uuml;berein, wird der Zugriff gew&auml;hrt.</p>

    <p>Mit der folgenden Anweisung wird einem bestimmten DN
    Zugriff gew&auml;hrt:</p>
	
<example>require dn "cn=Barbara Jenson, o=Airius"</example>

    <p>Das Verhalten dieser Direktive wird von der Direktive <directive
    module="mod_auth_ldap">AuthLDAPCompareDNOnServer</directive>
    modifiziert.</p>
</section>
</section>

<section id="examples"><title>Beispiele</title>

    <ul>
      <li>
        Jedem aus dem LDAP-Verzeichnis Zugriff gew&auml;hren und die UID
        f&uuml;r die Suche benutzen:

<example>AuthLDAPURL "ldap://ldap1.airius.com:389/ou=People, 
o=Airius?uid?sub?(objectClass=*)"<br />
require valid-user
</example>

      </li>

      <li>
        Das folgende Beispiel stimmt mit dem letzten &uuml;berein,
        allerdings wurden Felder mit sinnvollen Voreinstellungen
        weglassen. Beachten Sie au&szlig;erdem die Verwendung eines
		redundanten LDAP-Servers. 
		
<example>AuthLDAPURL "ldap://ldap1.airius.com ldap2.airius.com/ou=People, 
o=Airius"<br />
require valid-user
</example>

      </li>

      <li>
        Auch das n&auml;chste Beispiel gleicht den vorangegangenen,
        verwendet aber den CN (Common Name) an Stelle der UID. Das kann
        problematisch sein, wenn mehrere Personen des Verzeichnisses den
        gleichen <code>cn</code> besitzen, weil eine Suche nach dem
		<code>cn</code> genau einen Eintrag zur&uuml;ckliefern <strong>muss</strong>.
		Daher ist diese Vorgehensweise nicht empfehlenswert: Es ist sinnvoller, 
        ein Attribut zu w&auml;hlen, das garantiert einmalig im Verzeichnis
		ist, beispielsweise das Attribut <code>uid</code>.
		
<example>
AuthLDAPURL "ldap://ldap.airius.com/ou=People, o=Airius?cn"<br />
require valid-user
</example>

      </li>

      <li>
        Jedes Mitglied der Gruppe <code>Administrators</code> erh&auml;lt
		Zugriff. Der Benutzer muss sich mit der UID authentifizieren. 
		
<example>
AuthLDAPURL "ldap://ldap.airius.com/o=Airius?uid"<br />
require group cn=Administrators, o=Airius
</example>

      </li>

      <li>
        Im n&auml;chsten Beispiel wird davon ausgegangen, dass jedes 
        Airius-Mitglied mit einem alphanumerischen Pager ein LDAP-Attribut
        <code>qpagePagerID</code> besitzt. Es erhalten nur diejenigen
        &uuml;ber ihre UID Zugriff, die alphanumerische Pager besitzen:
		
<example>
AuthLDAPURL "ldap://ldap.airius.com/o=Airius?uid??(qpagePagerID=*)"<br />
require valid-user
</example>

      </li>

      <li>
        <p>Das folgende Beispiel zeigt die Leistungsf&auml;higkeit von Filtern
        bei komplizierten administrativen Aufgaben. Ohne Filter w&auml;re es
		notwendig, eine neue LDAP-Gruppe einzurichten und sicherzustellen, dass die
		Gruppenmitglieder mit den Pager-Benutzern synchronisiert sind. Mit Filtern
		ist diese Aufgabe leicht zu l&ouml;sen. Es soll jeder mit einem Filter sowie
		Joe Manager, der keinen Pager besitzt, aber die gleiche Ressource
		ben&ouml;tigt, Zugriff erhalten:</p>
		
<example>
AuthLDAPURL
"ldap://ldap.airius.com/o=Airius?uid??(|(qpagePagerID=*)(uid=jmanager))"<br />
require valid-user
</example>

        <p>Das letzte Beispiel mag auf den ersten Blick verwirrend erscheinen,
        daher kann es hilfreich sein, auszuwerten, wie der Suchfilter wie unten
        auf zwei Verbindungen basierend aussieht. Der blau gesetzte Text
        ist der Teil, der &uuml;ber das in der URL angegebene Attribut
		eingesetzt wird. Der rote Text wurde nach Anwendung des in der URL
        angegebenen Filters eingesetzt. Der gr&uuml;ne Text wurde mit Hilfe der
        vom HTTP-Client ermittelten Informationen erg&auml;nzt. Stellt
        <code>Fred User</code> die Verbindung als <code>fuser</code> her,
        dann sieht der Filter wie folgt aus:</p>

        <example>(&amp;(|(qpagePagerID=*)(uid=jmanager))(uid=fuser))</example>

        <p>Die Suche ist nur erfolgreich, wenn <em>fuser</em> einen
        Pager besitzt. Stellt Joe Manager die Verbindung als <em>jmanager</em>
		her, sieht der Filter so aus:</p>

        <example>(&amp;(|(qpagePagerID=*)(uid=jmanager))(uid=jmanager))
		</example>

        <p>Die Suche ist erfolgreich, unabh&auml;ngig davon, ob
		<em>jmanager</em> einen Pager besitzt oder nicht.</p>
      </li>
    </ul>
</section>

<section id="usingtls"><title>TLS</title>

    <p>Mehr zur Verwendung des Protokolls TLS finden Sie
    unter den <module>mod_ldap</module>-Direktiven <directive
    module="mod_ldap">LDAPTrustedCA</directive> und <directive
    module="mod_ldap">LDAPTrustedCAType</directive>.</p>
</section>

<section id="usingssl"><title>SSL</title>

    <p>Mehr zur Verwendung des Protokolls SSL finden Sie unter den
    <module>mod_ldap</module>-Direktiven <directive
    module="mod_ldap">LDAPTrustedCA</directive> und <directive
    module="mod_ldap">LDAPTrustedCAType</directive>.</p>

    <p>Ein sicherer LDAP-Server wird in der
    <directive module="mod_auth_ldap">AuthLDAPURL</directive>
    -Direktive mit <em>ldaps://</em> und nicht mit <em>ldap://</em>
    angegeben.</p>
</section>

<section id="frontpage"><title>Microsoft und mod_auth_ldap</title>

    <p>Normalerweise verwendet FrontPage (bzw. das
	<module>mod_auth</module>-Modul) eigene Benutzer- und Gruppendateien
	f&uuml;r die Authentifizierung. Es reicht leider nicht aus, die korrekten
    Direktiven hinzuzuf&uuml;gen, um zur LDAP-Authentifizierung zu wechseln,
    weil das gegen die <em>Permissions</em>-Formulare des FrontPage-Client
	verst&ouml;&szlig;t, der versucht, die Textdateien f&uuml;r die 
    Authentifizierung zu modifizieren.</p>

    <p>Wurde ein FrontPage-Server eingerichtet, kann die
    LDAP-Authentifizierung nach Einf&uuml;gen der folgenden Direktiven
    in <em>alle</em> <code>.htaccess</code>-Dateien verwendet werden:</p>
<example><pre>
AuthLDAPURL            "die URL"
AuthLDAPAuthoritative  off
AuthLDAPFrontPageHack  on
</pre></example>

    <p><directive
    module="mod_auth_ldap">AuthLDAPAuthoritative</directive> muss auf
    <code>off</code> gesetzt werden, damit <module>mod_auth_ldap</module>
	die Gruppenauthentifizierung ablehnt und der Apache auf die
	Dateiauthentifizierung zur &Uuml;berpr&uuml;fung der
	Gruppenmitgliedschaft zur&uuml;ckf&auml;llt. Auf diese Weise k&ouml;nnen
	von FrontPage verwaltete Gruppendateien benutzt werden.</p>

<section id="howitworks"><title>Funktionsweise</title>

    <p>FrontPage kontrolliert den Web-Zugriff &uuml;ber die zus&auml;tzliche
    <code>require valid-user</code>-Direktive in den
    <code>.htaccess</code>-Dateien. Wird <directive
    module="mod_auth_ldap">AuthLDAPFrontPageHack</directive> nicht
    aktiviert, ist die <code>require valid-user</code>-Direktive
    f&uuml;r jeden Benutzer erfolgreich, der <em>gem&auml;&szlig; LDAP
	zul&auml;ssig ist</em>. Daraus folgt, dass jeder, der einen Eintrag im
    LDAP-Verzeichnis besitzt, als zul&auml;ssiger Benutzer gilt,
    w&auml;hrend FrontPage davon ausgeht, dass nur Benutzer aus der lokalen
    Benutzerdatei zul&auml;ssig sind. Der Hack soll den Apache zwingen, die
    lokale Benutzerdatei (die von FrontPage verwaltet wird) und nicht LDAP
    zu Rate zu ziehen, wenn die <code>require valid-user</code>-Anweisung
    ausgef&uuml;hrt wird.</p>

    <p>Wurden die Direktiven wie oben beschrieben hinzugef&uuml;gt,
    sind FrontPage-Benutzer in der Lage, alle Management-Operationen
    f&uuml;r den FrontPage-Client durchzuf&uuml;hren.</p>
</section>

<section id="fpcaveats"><title>Einschr&auml;nkungen</title>

    <ul>
      <li>Wird die LDAP URL gew&auml;hlt, dann sollte sich das Attribut
      f&uuml;r die Authentifizierung auch f&uuml;r eine
	  <module>mod_auth</module>-Benutzerdatei eignen, was beispielsweise f&uuml;r
	  die UID gilt.</li>

      <li>Werden Benutzer &uuml;ber FrontPage hinzugef&uuml;gt, sollten die
      FrontPage-Administratoren aus nahe liegenden Gr&uuml;nde
      Benutzernamen w&auml;hlen, die bereits im LDAP-Verzeichnis vorhanden
      sind. Das vom Adminstrator in das Formular eingegebene Passwort
      wird ignoriert, da der Apache die Authentifizierung mit dem Passwort
      aus der LDAP-Datenbank und nicht mit dem Passwort aus der
      lokalen Benutzerdatei durchf&uuml;hrt. Dies kann zu Irritationen
      beim Web-Administrator f&uuml;hren.</li>

      <!-- XXX is that true? was mod_auth before the aaa change -->
      <li>Der Apache muss mit dem <module>mod_auth</module>-Modul
      kompiliert werden, damit FrontPage unterst&uuml;tzt wird. Ursache
      hierf&uuml;r ist die Tatsache, dass der Apache weiterhin die
      <module>mod_auth</module>-Gruppendatei f&uuml;r die Ermittlung
      der Zugangsberechtigung eines Benutzers f&uuml;r die
      FrontPage-Website benutzt.</li>

      <li>Die Direktiven m&uuml;ssen in die <code>.htaccess</code>-Dateien
      eingef&uuml;gt werden. Der Versuch, sie in die Direktiven
      <directive module="core"
      type="section">Location</directive> oder <directive module="core"
      type="section">Directory</directive> aufzunehmen, schl&auml;gt fehl,
	  weil das Modul <module>mod_auth_ldap</module> auf die
      <directive module="mod_auth">AuthUserFile</directive>-Anweisung
      in den <code>.htaccess</code>-Dateien von FrontPage
      zugreifen muss, um die Liste der g&uuml;ltigen Benutzer finden zu
	  k&ouml;nnen. Befinden sich die
	  <module>mod_auth_ldap</module>-Anweisungen nicht in der gleichen
      <code>.htaccess</code>-Datei wie die FrontPage-Direktiven, funktioniert
      der Hack nicht, weil <module>mod_auth_ldap</module> keine
      M&ouml;glichkeit hat, die <code>.htaccess</code>-Datei zu verarbeiten
      und die von FrontPage verwaltete Benutzerdatei nicht finden kann.</li>
    </ul>
</section>
</section>

<directivesynopsis>
<name>AuthLDAPAuthoritative</name>
<description>Anderen Authentifizierungsmodulen die
Benutzer&uuml;berpr&uuml;fung verbieten, wenn diese Direktive
fehlschl&auml;gt.</description>
<syntax>AuthLDAPAuthoritative on|off</syntax>
<default>AuthLDAPAuthoritative on</default>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Wird der Wert <code>off</code> gesetzt, k&ouml;nnen andere
    Authentifizierungsmodule eine Benutzerauthentifizierung durchf&uuml;hren,
	falls dieses Modul fehlschl&auml;gt. Dies ist nur m&ouml;glich, wenn kein DN
	oder keine Regel mit dem vom Client &uuml;bergebenen Benutzernamen
	&uuml;bereinstimmt.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPBindDN</name>
<description>Optionaler DN f&uuml;r die Bindung an den LDAP-Server
</description>
<syntax>AuthLDAPBindDN <em>Distinguished-Name</em></syntax>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Ein optionaler DN der bei der Suche nach Eintr&auml;gen die Bindung an
    den Server herstellt. Wird er nicht angegeben,verwendet 
    <module>mod_auth_ldap</module> eine anonyme Bindung.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPBindPassword</name>
<description>Ein Passwort, das f&uuml;r den bindenden DN benutzt
wird.</description>
<syntax>AuthLDAPBindPassword <em>Passwort</em></syntax>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Das Passwort, das f&uuml;r den bindenden DN benutzt wird.
    Da es sich bei diesem Passwort um vertrauliche Daten handeln
    kann, sollte es gut gesch&uuml;tzt sein. Die Direktiven <directive
    module="mod_auth_ldap">AuthLDAPBindDN</directive> und 
    <directive module="mod_auth_ldap">AuthLDAPBindPassword</directive>
    sollten nur verwendet werden, wenn sie f&uuml;r die Suche im Verzeichnis
    unbedingt erforderlich sind.</p> 
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPCharsetConfig</name>
<description>Datei mit Zuweisungen von Zeichens&auml;tzen zu
Sprachcodes</description>
<syntax>AuthLDAPCharsetConfig <em>Dateipfad</em></syntax>
<contextlist><context>server config</context>
</contextlist>

<usage>
    <p>Die <directive>AuthLDAPCharsetConfig</directive>-Direktive
     gibt den Standort der Datei mit den Zuweisungen von Zeichens&auml;tzen zu
     Sprachcodes an. Der <var>Dateipfad</var> wird relativ zu
    <directive module="core">ServerRoot</directive> angegeben. Diese Datei
    enth&auml;lt eine Liste mit Zeichensatzdefinitionen. Meist reicht die
	mitgelieferte Datei <code>charset.conv</code> mit den &uuml;blichen
	Zuordnungen f&uuml;r Zeichens&auml;tze zu Sprachcodes aus.</p>

    <p>Diese Datei enth&auml;lt Zeilen im Format:</p>

    <example>
      <var>Sprachcode </var> <var>Zeichensatz</var> [<var>Sprache</var>] ...
    </example>

    <p>Beim Sprachcode werden Gro&szlig;- und Kleinbuchstaben nicht
	 unterschieden. Leere Zeilen sowie Zeilen, die mit einem Hash
	 (<code>#</code>) beginnen, werden ignoriert.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPCompareDNOnServer</name>
<description>Vergleiche zwischen DNs erfolgen auf dem LDAP-Server.
</description>
<syntax>AuthLDAPCompareDNOnServer on|off</syntax>
<default>AuthLDAPCompareDNOnServer on</default>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Wird dieses Attribut auf <code>on</code> gesetzt, 
    benutzt das <module>mod_auth_ldap</module>-Modul den
    LDAP-Server f&uuml;r Vergleiche zwischen DNs. Dies ist die einzige
    sichere Vergleichsmethode. Das Modul sucht in dem mit
    der Direktive <a href="#reqdn"><code>require dn</code></a> angegebenen
    Verzeichnis nach dem DN und vergleicht diesen mit dem DN aus dem
    Benutzereintrag. Wird die Voreinstellung zur&uuml;ckgesetzt, f&uuml;hrt
	das Modul <module>mod_auth_ldap</module> einen einfachen String-Vergleich
	durch. Dieses Verfahren kann zu falschen Ergebnissen f&uuml;hren, es ist aber
    wesentlich schneller. Der <module>mod_ldap</module>-Cache kann den
    DN-Vergleich in den meisten Situationen beschleunigen.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPDereferenceAliases</name>
<description>Zeitpunkt der Dereferenzierung von Aliasen</description>
<syntax>AuthLDAPDereferenceAliases never|searching|finding|always</syntax>
<default>AuthLDAPDereferenceAliases Always</default>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>&Uuml;ber diese Direktive wird definiert, wann das Modul 
    <module>mod_auth_ldap</module> bei der Bearbeitung von
    LDAP-Operationen Aliase dereferenziert. Bei der Voreinstellunng
    <code>always</code> geschieht dies immer umgehend.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPEnabled</name>
<description>Deaktivierung der LDAP-Authentifizierung in einem
Unterverzeichnis</description>
<syntax> AuthLDAPEnabled on|off</syntax>
<default>AuthLDAPEnabled on</default>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Wird diese Direktive auf <code>off</code> gesetzt, ist das Modul
    <module>mod_auth_ldap</module> in bestimmten Verzeichnis deaktiviert.
    Das kann sinnvoll sein, wenn <module>mod_auth_ldap</module>
    im oberen Bereich des Verzeichnisbaumes aktiviert ist, aber f&uuml;r
	bestimmte Bereiche vollst&auml;ndig deaktiviert werden soll.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPFrontPageHack</name>
<description>LDAP-Authentifizierung in Verbindung mit MS FrontPage
</description>
<syntax>AuthLDAPFrontPageHack on|off</syntax>
<default>AuthLDAPFrontPageHack off</default>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Weitere Informationen finden Sie unter 
    <a href="#frontpage">Microsoft FrontPage</a> und
	<module>mod_auth_ldap</module>.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPGroupAttribute</name>
<description>LDAP-Attribute zur &Uuml;berpr&uuml;fung der
Gruppenmitgliedschaft</description>
<syntax>AuthLDAPGroupAttribute <em>Attribut</em></syntax>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Diese Anweisung gibt an, welche LDAP-Attribute f&uuml;r die
    &Uuml;berpr&uuml;fung der Gruppenmitgliedschaft benutzt werden.
    Mit mehreren Anweisungen kann das Attribut mehrfach gesetzt werden. 
    Wird es nicht angegeben, verwendet das Modul
    <module>mod_auth_ldap</module> die Attribute 
    <code>member</code> und <code>uniquemember</code>.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPGroupAttributeIsDN</name>
<description>Verwendung des Client-DN f&uuml;r die &Uuml;berpr&uuml;fung der
Gruppenmitgliedschaft</description>
<syntax>AuthLDAPGroupAttributeIsDN on|off</syntax>
<default>AuthLDAPGroupAttributeIsDN on</default>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Wenn <code>on</code> gesetzt wird, verlangt diese Direktive
    die Verwendung des DN des Client-Benutzernamens f&uuml;r die
	&Uuml;berpr&uuml;fung der Gruppenmitgliedschaft. Andernfalls wird der
	Benutzername benutzt. Hat der Client beispielsweise den Benutzernamen
	<code>bjenson</code> gesendet, der dem LDAP-DN <code>cn=Babs Jenson,
    o=Airius</code> entspricht, dann &uuml;berpr&uuml;ft das Modul
    <module>mod_auth_ldap</module>, ob <code>cn=Babs Jenson, o=Airius</code>
	Gruppenmitglied ist. Wird diese Direktive nicht angegeben,
	&uuml;berpr&uuml;ft das Modul <module>mod_auth_ldap</module>, ob
	<code>bjenson</code> Gruppenmitglied ist.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPRemoteUserIsDN</name>
<description>Die Umgebungsvariable REMOTE_USER erh&auml;lt den DN des
Client-Benutzernamens als Wert.</description>
<syntax>AuthLDAPRemoteUserIsDN on|off</syntax>
<default>AuthLDAPRemoteUserIsDN off</default>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Wird diese Direktive auf <code>on</code> gesetzt, entspricht
    die Umgebungsvariable <code>REMOTE_USER</code> dem vollst&auml;ndigen
	DN des authentifizierten Benutzers und nicht nur dem vom Client
	&uuml;bergebenen Benutzernamen. Standardm&auml;&szlig;ig ist <code>off</code>
    vorgegeben.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>AuthLDAPUrl</name>
<description>Die URL mit den LDAP-Suchparametern</description>
<syntax>AuthLDAPUrl <em>url</em></syntax>
<contextlist><context>directory</context><context>.htaccess</context>
</contextlist>
<override>AuthConfig</override>

<usage>
    <p>Eine URL nach RFC 2255, die die LDAP-Suchparameter angibt. Die
    Syntax lautet:</p>
	
<example>ldap://Host:Port/BasisDN?Attribut?Bereich?Filter</example>

<dl>
<dt>ldap</dt>

        <dd>F&uuml;r regul&auml;res LDAP wird die Zeichenfolge
        <code>ldap</code> angegeben, f&uuml;r gesichertes LDAP 
        <code>ldaps</code>. Gesichertes LDAP steht nur zur Verf&uuml;gung,
        wenn der Apache mit einer LDAP-Bibliothek mit 
        SSL-Unterst&uuml;tzung gebunden wurde.</dd>

<dt>Host:Port</dt>

        <dd>
          <p>Name/Port des LDAP-Servers (Voreinstellung: 
          <code>localhost:389</code> f&uuml;r <code>ldap</code> und
          <code>localhost:636</code> f&uuml;r <code>ldaps</code>). Um
          mehrere redundante LDAP-Server anzugeben, werden alle 
          Server getrennt durch Leerzeichen angegeben. 
          Das Modul <module>mod_auth_ldap</module> versucht der Reihe nach 
          eine Verbindung zu jedem Server herzustellen, bis eine Verbindung 
          zustandekommt.</p>

          <p>Konnte eine Serververbindung eingerichtet werden, 
          bleibt diese f&uuml;r die Lebensdauer des
		  <code>httpd</code>-Prozesses oder so lange g&uuml;ltig, bis der
		  LDAP-Server heruntergefahren wird.</p>

          <p>Wird der LDAP-Server heruntergefahren oder eine 
          bestehende Verbindung unterbrochen, versucht das Modul 
          <module>mod_auth_ldap</module> die Verbindung wiederherzustellen,
          wof&uuml;r der prim&auml;re Server gestartet und ein
		  Verbindungsaufbau zu jedem redundanten Server versucht wird,
          was sich von einem echten Rundruf unterscheidet.</p>
        </dd>

<dt>BasisDN</dt>

        <dd>Der DN des Verzeichniszweiges, in welchem alle Suchen
        beginnen sollen. Im &auml;u&szlig;ersten Fall muss dies die Spitze des
        Verzeichnisbaumes sein, es kann aber auch ein Unterzweig
        angegeben werden.</dd>

<dt>Attribut</dt>

        <dd>Das zu suchende Attribut. Das RFC 2255 erlaubt zwar
        eine durch Komata getrennte Attributliste, es wird aber nur das erste
        Attribut benutzt, unabh&auml;ngig davon, wie viele angegeben werden.
		Werden keine Attribute angegeben, wird standardm&auml;&szlig;ig
		<code>uid</code> verwendet. Es ist sinnvoll, ein Attribut zu w&auml;hlen,
		das f&uuml;r alle Eintr&auml;ge im Unterzweig eindeutig ist.</dd>

<dt>Bereich</dt>

        <dd>Der Suchbereich. Angegeben werden kann <code>one</code> oder
        <code>sub</code>. Gem&auml;&szlig; RFC 2255 wird zwar auch der Bereich
        <code>base</code> unterst&uuml;tzt, was jedoch nicht f&uuml;r dieses
		Modul gilt. Wird kein Bereich oder der Bereich <code>base</code>
		angegeben, gilt die Voreinstellung <code>sub</code>.</dd>

<dt>Filter</dt>

        <dd>Ein zul&auml;ssiger LDAP-Suchfilter. Ohne Angabe gilt die
		Voreinstellung <code>(objectClass=*)</code>, bei der nach allen Objekten
		gesucht wird. Die L&auml;nge der gesamten Filterangabe darf 8192 Zeichen
		nicht &uuml;berschreiten (gem&auml;&szlig; der
		<code>MAX_STRING_LEN</code>-Definition im Apache-Quellcode), was generell
		ausreichen sollte.</dd>
</dl>

    <p>Bei der Durchf&uuml;hrung von Suchanfragen werden das Suchattribut,
    die Filterangabe und der vom HTTP-Client &uuml;bermittelte Benutzername
    kombiniert und ein Suchfilter der folgenden Form erzeugt:
    <code>(&amp;(<em>Filter</em>)(<em>Attribut</em>=<em>Benutzername</em
	>))</code>.</p>

    <p>Versucht bespielsweise ein Client f&uuml;r die URL
    <code>ldap://ldap.airius.com/o=Airius?cn?sub?(posixid=*)</code> eine
    Verbindung mit dem Benutzernamen <code>Babs Jenson</code> herzustellen,
	dann ergibt sich folgende Filterangabe: 
    <code>(&amp;(posixid=*)(cn=Babs Jenson))</code>.</p>

    <p>Beispiele zu <directive 
    module="mod_auth_ldap">AuthLDAPURL</directive>-URLs 
    finden Sie weiter oben.</p>
</usage>
</directivesynopsis>

</modulesynopsis>
