Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
netzwerke:ldap [2007/09/30 20:28] – st | netzwerke:ldap [2023/11/30 21:18] (aktuell) – [SASL] st | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== LDAP (Schwerpunkt OpenLDAP) ====== | ||
+ | Lightweight Directory Access Protocol (LDAP) ist ein Anwendungsprotokoll aus der Computertechnik. Es erlaubt die Abfrage und die Modifikation von Informationen eines Verzeichnisdienstes (eine im Netzwerk verteilte [[datenbanken: | ||
+ | |||
+ | Das LDAP-Protokoll wird in vielen bekannten Verzeichnisdiensten (und Servern) benutzt: | ||
+ | * Slapd (University of Michigan, Openldap) | ||
+ | * Netscape Directory Server | ||
+ | * Microsoft Active Directory (AD) | ||
+ | * Microsoft Exchange | ||
+ | * Novell Directory Services (NDS) | ||
+ | * Lotus Domino | ||
+ | * Sun Directory Services (SDS) | ||
+ | * Lucent’s Internet Directory Server (IDS). | ||
+ | |||
+ | LDAP ist für relativ einfache Lesezugriffe optimiert. Man kann zwar mit boolschen Ausdrücken arbeiten, es findet aber keine Sortierung durch den LDAP-Server statt. D.h. die Datensätze kommen in beliebiger Reihenfolge, | ||
+ | |||
+ | |||
+ | Der LDAP-Server hat ein sog. **[[wpde> | ||
+ | {{netzwerke: | ||
+ | |||
+ | Das **Schema** legt die Regeln für gespeicherten Daten fest (benötigte und erlaubte Attribute) und hilt so die Daten konsistent zu halten. Dabei sollte man sich aus Kompatibilitätsgründen möglichst an vordefinierte Schemata halten bzw. bei sog. **Schemaerweiterungen** möglichst ein vorhandenes erweitern. Vordefinierte Objektklassen stehen in der Datei ''/ | ||
+ | |||
+ | Ein **Datensatz (Entry)** hat eine oder mehrere Objektklassen (Objectclass) die zum gruppieren der Informationen benutzt werden und benötigte und erlaubte Attribute festlegt. | ||
+ | Der Datensatz ist ein **Knoten im Baum** (DIT: directory information unit). | ||
+ | {{netzwerke: | ||
+ | |||
+ | |||
+ | Zusätzlich können **Aliase** (Eintrag mit Objektklasse Alias, Attribut namens " | ||
+ | |||
+ | LDAP ist flexibler als das angegraute NIS: Dieses ist formatgebunden, | ||
+ | |||
+ | :!: LDAP-User-IDs (UIDs) mit gutem Abstand zu den System UIDs anlegen (falls man später noch lokale Benutzer anlegen will). | ||
+ | |||
+ | Authentifizierung kann auch von [[netzwerke: | ||
+ | |||
+ | |||
+ | ===== Einsatz ===== | ||
+ | LDAP kann sehr gut bei klassischen Einsatzzwecken eines Verzeichnisdienstes eingesetzt werden: | ||
+ | Bei verteilten Daten wie Adressbücher für Anwendungen und MUAs ([[software: | ||
+ | |||
+ | Die Integration in Programme erfolgt entweder über die Shell-Befehle (Änderungsanweisungen im LDIF-Format), | ||
+ | |||
+ | ===== LDIF-Format ===== | ||
+ | Das LDIF-Format | ||
+ | - repräsentiert LDAP-Einträge in (menschenlesbarer) Textform | ||
+ | - erlaubt eine einfache Datenänderung | ||
+ | - ist nützlich für Massenänderungen: | ||
+ | - kann Vorlagen benutzen | ||
+ | - dient zum Backup und zum Datentransfer zu anderen Systemen | ||
+ | < | ||
+ | dn: uid=user1, | ||
+ | | ||
+ | uid: user1 | ||
+ | cn: User One | ||
+ | objectclass: | ||
+ | objectclass: | ||
+ | objectclass: | ||
+ | loginshell: /bin/bash | ||
+ | uidnumber: 500 | ||
+ | gidnumber: 120 | ||
+ | homedirectory: | ||
+ | gecos: Brad Marshall,,,, | ||
+ | userpassword: | ||
+ | </ | ||
+ | |||
+ | Anmerkung zu " | ||
+ | |||
+ | ==== Datenbank zu LDIF und zurück ==== | ||
+ | * ldbmcat & slapcat: ldbm Datenbank zu LDIF | ||
+ | * ldif2ldbm & slapadd: LDIF zu ldbm Datenbabk | ||
+ | |||
+ | |||
+ | |||
+ | ===== Begriffe ===== | ||
+ | |||
+ | Beispiel: uid=bmarshal, | ||
+ | |||
+ | | DN | // | ||
+ | | RDN | //Relative Distinuished Name// der relative Name in Verhätlnis zu einem Objekt: '' | ||
+ | | Base DN | Der " | ||
+ | | DIT | Directory Information Tree | | ||
+ | | LDIF | LDAP Data Interchange Format: Format zum Datenaustausch, | ||
+ | |||
+ | |||
+ | ==== Objekte ==== | ||
+ | * **Containerobjekte** sind objekte die weitere enthalten, z.B. CN, OU, O und DC. | ||
+ | * **Blattobjekte** FIXME | ||
+ | |||
+ | |||
+ | |||
+ | ==== Attribute ==== | ||
+ | Der Datensatz setzt sich aus Attributen zusammen, die wiederum Werte eines bestimmten (Daten-) Typs enthalten. | ||
+ | **Attribute** haben | ||
+ | - einen Namen | ||
+ | - eine OID (siehe Tabelle) | ||
+ | - eine Syntax (Datentyp und wie die Wert verglichen können) | ||
+ | - eine Anweisung ein oder mehrere Werte zu enthalten | ||
+ | |||
+ | ^ Attributname ^ Bedeutung ^ | ||
+ | | C | //Country// (= Land) | | ||
+ | | CN | //Common Name// der Name des Objektes unter dem das Objekt gewöhnlich angesprochen wird | | ||
+ | | DC | Domain Component | | ||
+ | | DESC | // | ||
+ | | L | // | ||
+ | | OID | // | ||
+ | | SN | //Surname// (=Nachnahme) | | ||
+ | | O | // | ||
+ | | OU | // | ||
+ | | ST | //State// (=Bundesstaat) | | ||
+ | | UID | //user id// (=Benutzername) | | ||
+ | |||
+ | Siehe [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | ==== Regeln ==== | ||
+ | FIXME | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Verwaltungstools ===== | ||
+ | * Die mitgelieferten (kommandozeilenbasierten-) Such-/ | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ===== OpenLDAP ===== | ||
+ | [[wpde> | ||
+ | |||
+ | OpenLDAP arbeitet mit den Modulen | ||
+ | * nss_ldap (für weniger sensible Daten) | ||
+ | * pam_ldap (authentication und Passwortänderungen) | ||
+ | |||
+ | |||
+ | |||
+ | ==== nss_ldap ==== | ||
+ | nss_ldap eignet sich nur für wenig sensible Daten: user-id, shell, ... | ||
+ | |||
+ | Es wird in der Datei ''/ | ||
+ | < | ||
+ | passwd: files ldap | ||
+ | shadow: files ldap | ||
+ | hosts: files dns | ||
+ | </ | ||
+ | |||
+ | Eine Delegation von Unterbereichen ist möglich (man kann Teile mounten). Der Datenaustausch wird in den Formaten | ||
+ | * LDIF (Einträge der Form " | ||
+ | * ? | ||
+ | |||
+ | ==== pam_ldap ==== | ||
+ | Für sensible Daten wie Passwörter eignet sich eher '' | ||
+ | |||
+ | Die Abfragen beschränken sich meist auf: | ||
+ | - ldap_simple (zum Passwortüberprüfen; | ||
+ | - SASL external (beide Zertifikate: | ||
+ | |||
+ | ==== Lesezugriff über LDAP-URLs ==== | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | FIXME | ||
+ | |||
+ | Aufbau LDAP-URL, vereinfacht: | ||
+ | |||
+ | - Protokoll ldap / ldaps (verschlüsselt) | ||
+ | - Servername und Portnummer | ||
+ | - BASE-DN (Einsprungspunkt) | ||
+ | - auszulesende Attr. | ||
+ | - Suchbereich (scope) | ||
+ | - Boolscher Filterausdruck | ||
+ | - Erweiterungen | ||
+ | |||
+ | Also z.B.: ''< | ||
+ | |||
+ | Komplett aus [[http:// | ||
+ | < | ||
+ | | ||
+ | [dn ["?" | ||
+ | ["?" | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ==== Suchfilter und Suchbereich ==== | ||
+ | ^ Suchfilter^^ | ||
+ | ^ Operatoren ^ Wirkung ^ | ||
+ | | & | and (=und) | | ||
+ | | < | ||
+ | | ! | not (=nicht) | ||
+ | | ̃= | approx equal (=vorraussichtl. gleich) | | ||
+ | | >= | greater than or equal (=größer gleich) | | ||
+ | | <= | less than or equal (=kleiner gleich) | | ||
+ | | * | any (=alle) | | ||
+ | |||
+ | ^ Suchbereich^^ | ||
+ | | base | beschränkt auf den Basisbereich | | ||
+ | | onelevel | beschränkt auf den direkten Nachfolgelevel | | ||
+ | | sub | durchsucht den kompletten Unterbaum | | ||
+ | |||
+ | |||
+ | ==== Zugriffsrechte (ACLs) ==== | ||
+ | Zugriffsrechte lassen sich fein granular zuweisen. | ||
+ | |||
+ | < | ||
+ | access | ||
+ | to dn.sub=" | ||
+ | by self write | ||
+ | by * auth | ||
+ | </ | ||
+ | by * auth: nur fragen | ||
+ | FIXME | ||
+ | |||
+ | :!: Die erste zutreffende Regel gilt! | ||
+ | |||
+ | ==== beiligte " | ||
+ | |||
+ | * Datenbank-Backend (meist Berkeley DB = BDB, andere möglich: SQL etc., wenn man keinen guten Grund hat: beibehalten; | ||
+ | * Anwendung | ||
+ | * SASL | ||
+ | * TLS | ||
+ | * TCP/IP | ||
+ | |||
+ | |||
+ | ==== Replikation ==== | ||
+ | Durch ein Replication-Logfile (Übertragung mit slurpd) ist auch ein Backupserver (Slave) möglich, das delegieren einzelner Teile bleibt ebenfalls möglich. | ||
+ | |||
+ | Damit wird die | ||
+ | - **Verlässlichkeit** | ||
+ | - **Verfügbarkeit** (durch mehrere Server, master: | ||
+ | - **Geschwindigkeit**: | ||
+ | erhöht. | ||
+ | |||
+ | Temporäre Inkonsistenzen sind ok, geschrieben wird eh nicht allzu oft. | ||
+ | |||
+ | **Replikationsablauf: | ||
+ | - Client sendet Änderungen an den slave-Server | ||
+ | - slave-Server gibt den Verweis an den master zurück | ||
+ | - Client sendet Änderungen diesmal an den master-Server | ||
+ | - master-Server gibt das Änderungsergebnis an den Client zurück | ||
+ | - master-Server gibt die Änderungen an den slave-Server weiter | ||
+ | |||
+ | **Replikationsablauf: | ||
+ | - Client sendet Änderungen an den slave-Server | ||
+ | - slave-Server leitet den Änderungswunsch an den master weiter | ||
+ | - master-Server gibt das Änderungsergebnis an den slave-Server zurück | ||
+ | - slave-Server schickt Ergebnis an den Client weiter | ||
+ | - master-Server gibt die Änderungen an den slave-Server weiter | ||
+ | |||
+ | === Links === | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | ==== Hilfen / Anleitungen ==== | ||
+ | * [[http:// | ||
+ | Die mitgelieferten man-pages (Hileseiten) | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | ==== Probleme ==== | ||
+ | * nur ein master catalog server zu einer Zeit pro domain (noch aktuell? FIXME) | ||
+ | * [[http:// | ||
+ | * Da OpenLDAP (vor allem beim Server) sehr aktiv entwickelt wird, ist die Doku (vor allem die man-pages) oft hinterher (z.B. werden veraltete Funktionen beschrieben) wenn man aus dem Quellcode kompiliert. Deshalb sollte man nicht allzu oft upgraden. Wenn man eine vorkompilierte Version einer Distribution (z.B. aus [[debian: | ||
+ | * kryptische Fehlermeldungen | ||
+ | * ACL erst "nach und nach" machen (und testen!) | ||
+ | * NICHT für viele Schreibzugriffe geeignet! | ||
+ | * komplexe Abfrage und Strukturänderungen sind ein großes Problem | ||
+ | * keine Transaktionen (add / modify sind aber atomar) / kein Locking | ||
+ | |||
+ | |||
+ | |||
+ | ==== best-practises ==== | ||
+ | * Backups machen und/oder Daten replizieren | ||
+ | * man kann komplette Server migrieren/ | ||
+ | * Server mit persönlichen Daten vor Zugriff schützen (Slave-Server öffentlich (ro), Master-Server intern) | ||
+ | * DB-Strukturen sorgfältig planen, Attribute (z.B. " | ||
+ | * Keep it simple! | ||
+ | * keine Schreibzugriff durch Applikationen | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Links ===== | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | * [[ftp:// | ||
+ | |||
+ | ==== Installation ==== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== Authentifizierung an LDAP ==== | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== Administration ==== | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ==== Anwendungen ==== | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ==== Linux Journal LDAP-Serie ==== | ||
+ | - [[http:// | ||
+ | - [[http:// | ||
+ | - [[http:// | ||
+ | - [[http:// | ||
+ | |||
+ | ===== SSSD ===== | ||
+ | |||
+ | Firewalling: | ||
+ | * 53 (udp/tcp) dns -> AD | ||
+ | * 88 (udp+udp) kerberos | ||
+ | * 389 (tcp+udp) LDAP | ||
+ | * 445 tcp AD GPOs | ||
+ | * 464 (udp+udp) kpasswd | ||
+ | * 636 (tcp) LDAP TLS | ||
+ | * 3268 (tcp) Ad global catalog | ||
+ | * 3269 (tcp) | ||
+ | |||
+ | |||
+ | ===== SASL ===== | ||
+ | [[http:// | ||
+ | FIXME | ||
+ | |||
+ | |||
+ | ===== PHP-Code ===== | ||
+ | [[http:// | ||
+ | [[http:// | ||
+ | [[http:// | ||
+ | |||
+ | ==== Sonderwünsche ==== | ||
+ | * Overlays: zwischen dem Datenbank-backend und Anwendungsschicht kann man eigene Overlays einfügen die dann Anfragen modifizieren, | ||
+ | |||
+ | Beispiel: eigene eMail-Adresse mit Verfallsdatum und Signatur modifizieren: | ||
+ | |||
+ | bbmail: [[http:// | ||
+ | |||