Debian LDAP: Unterschied zwischen den Versionen
Erich (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Erich (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(6 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
In der LDAP Datenbank werden die Daten hierarchisch in Baumform angelegt (DIT Directory Information Tree). | In der LDAP Datenbank werden die Daten hierarchisch in Baumform angelegt (DIT Directory Information Tree). | ||
* Die Basis (dn: Distinguished Name) des LDAP Directories wird üblicherweise vom Domainnamen abgeleitet. Z.B. die Domain test. | * Die Basis (dn: Distinguished Name) des LDAP Directories wird üblicherweise vom Domainnamen abgeleitet. Z.B. die Domain test.lan wird in LDAP folgendermaßen abgebildet: '''LDAP_Base''': dc=test,dc=lan. Die Domain test.homelinux.local als dc=test,dc=homelinux,dc=local | ||
* Elemente darunter könnten z.B. User (People) und Gruppen (Groups) sein, in denen die jeweiligen Linux-User und Gruppen definiert werden. Diese sog. Organizational Units (ou) werden folgendermaßen in LDAP abgebildet: ou=People,dc=test,dc= | * Elemente darunter könnten z.B. User (People) und Gruppen (Groups) sein, in denen die jeweiligen Linux-User und Gruppen definiert werden. Diese sog. Organizational Units (ou) werden folgendermaßen in LDAP abgebildet: ou=People,dc=test,dc=lan. | ||
* Ein User Tux könnte dann z.B. folgendermaßen angesprochen werden: uid=tux,ou=People,dc=test,dc= | * Ein User Tux könnte dann z.B. folgendermaßen angesprochen werden: uid=tux,ou=People,dc=test,dc=lan. | ||
* Es können aber auch noch deutlich mehr Ebenen abgebildet werden. | * Es können aber auch noch deutlich mehr Ebenen abgebildet werden. | ||
Sogar die komplette Konfiguration von OpenLDAP wird in einem eigenen DIT namens cn=config abgelegt. Dadurch können Konfigurationsänderungen on the fly durch hinzufügen, ändern bzw. löschen von Attributen erfolgen, ohne OpenLDAP nach jeder Änderung neu starten zu müssen. | |||
Zeile 22: | Zeile 24: | ||
Folgende Einstellungen vornehmen: | Folgende Einstellungen vornehmen: | ||
URI ldap://'''IP_DES_SERVER''' | URI ldap://'''IP_DES_SERVER''' | ||
BASE '''LDAP_Base''' z.B. dc=test,dc= | BASE '''LDAP_Base''' z.B. dc=test,dc=lan | ||
Informationen werden mit Hilfe von .ldif Files in's LDAP Directory übertragen. Es ist empfehlenswert diese Files zentral in einem eigenen Unterverzeichnis zu verwalten, wobei die Files nach dem Import in die LDAP Datenbank eigentlich gar nicht mehr benötigt werden. | Informationen werden mit Hilfe von .ldif Files in's LDAP Directory übertragen. Es ist empfehlenswert diese Files zentral in einem eigenen Unterverzeichnis zu verwalten, wobei die Files nach dem Import in die LDAP Datenbank eigentlich gar nicht mehr benötigt werden. | ||
mkdir /root/ldap_ldif | mkdir /root/ldap_ldif | ||
===Admin Passwort für Konfigdatenbank=== | |||
Das bei der Installation angelegte Admin-Passwort gilt standardmäßig nur für die Daten, nicht für das Konfigurationsbackend cn=config. Für dieses ist in der Debian Installation gar kein Passwort vergeben, sodass sich kein Admin dort anmelden kann, um Ändereungen vorzunehmen. | |||
Passwort-Hast erstellen | |||
ldappasswd -h {SSHA} | |||
Zweimal das geünschte Passwort eingeben, z.B. 1234. Die Ausgabe könnte folgendermaßen aussehen: | |||
{SSHA}S+XGDyJeYuXkUn7ndqUdrmEf8jsMmUUI | |||
Diesen Hash kopieren. | |||
vi /root/ldap_ldif/add_cn-adm-pwd.ldif | |||
Folgende Zeilen einfügen (Den Passwort-Hash '''olcRootPW''' mit eben generiertem Hash ersetzen): | |||
dn: cn=config | |||
changetype: modify | |||
dn: olcDatabase={0}config,cn=config | |||
changetype: modify | |||
add: olcRootPW | |||
olcRootPW: {SSHA}S+XGDyJeYuXkUn7ndqUdrmEf8jsMmUUI | |||
Ins Directory übernehmen: | |||
ldapadd -Y EXTERNAL -H ldapi:/// -f /root/ldap_ldif/add_cn-adm-pwd.ldif | |||
===Inizes=== | |||
Mit Hilfe von Indizes kann die Suche im LDAP Directory beschleunigt werden. | Mit Hilfe von Indizes kann die Suche im LDAP Directory beschleunigt werden. | ||
vi /root/ldap_ldif/index.ldif | vi /root/ldap_ldif/index.ldif | ||
Zeile 54: | Zeile 79: | ||
Die Informationen ins LDAP Directory übernehmen: | Die Informationen ins LDAP Directory übernehmen: | ||
ldapmodify - | ldapmodify -cxWD cn=admin,cn=config -f /root/ldap_ldif/index.ldif | ||
===Organisational Units für User und Gruppen=== | |||
Üblicherweise werden User und Gruppen in Organisational Units (ou) innerhalb von LDAP verwaltet. Um die Units anzulegen, folgendermaßen vorgehen: | Üblicherweise werden User und Gruppen in Organisational Units (ou) innerhalb von LDAP verwaltet. Um die Units anzulegen, folgendermaßen vorgehen: | ||
vi /root/ldap_ldif/tree.ldif | vi /root/ldap_ldif/tree.ldif | ||
Folgende Zeilen einfügen (incl. Leezeile zwischen people und groups OU): | Folgende Zeilen einfügen (incl. Leezeile zwischen people und groups OU): | ||
dn: ou=people,dc=test,dc= | dn: ou=people,dc=test,dc=lan | ||
ou: people | ou: people | ||
objectClass: organizationalUnit | objectClass: organizationalUnit | ||
dn: ou=groups,dc=test,dc= | dn: ou=groups,dc=test,dc=lan | ||
ou: groups | ou: groups | ||
objectClass: organizationalUnit | objectClass: organizationalUnit | ||
Die Informationen ins LDAP Directory übernehmen: | Die Informationen ins LDAP Directory übernehmen: | ||
ldapadd -cxWD cn=admin,dc=test,dc= | ldapadd -cxWD cn=admin,dc=test,dc=lan -f /root/ldap_ldif/tree.ldif | ||
Zeile 93: | Zeile 120: | ||
Die Informationen ins LDAP Directory übernehmen: | Die Informationen ins LDAP Directory übernehmen: | ||
ldapmodify - | ldapmodify -cxWD cn=admin,cn=config -f /root/ldap_ldif/loglevel.ldif | ||
==Funktionstest Server== | |||
Mit dem Befehl slapcat werden zahlreiche Informationen des LDAP-Directories ausgegeben. | Mit dem Befehl slapcat werden zahlreiche Informationen des LDAP-Directories ausgegeben. | ||
slapcat | slapcat | ||
Die Ausgabe könnte folgendermaßen aussehen: | Die Ausgabe könnte folgendermaßen aussehen: | ||
dn: dc=test,dc= | dn: dc=test,dc=lan | ||
objectClass: top | objectClass: top | ||
objectClass: dcObject | objectClass: dcObject | ||
objectClass: organization | objectClass: organization | ||
o: test. | o: test.lan | ||
dc: test | dc: test | ||
structuralObjectClass: organization | structuralObjectClass: organization | ||
entryUUID: 95bcb4b4-9eab-1031-9b24-5d17a552c400 | entryUUID: 95bcb4b4-9eab-1031-9b24-5d17a552c400 | ||
creatorsName: cn=admin,dc=test,dc= | creatorsName: cn=admin,dc=test,dc=lan | ||
createTimestamp: 20120929180232Z | createTimestamp: 20120929180232Z | ||
entryCSN: 20120929180232.259042Z#000000#000#000000 | entryCSN: 20120929180232.259042Z#000000#000#000000 | ||
modifiersName: cn=admin,dc=test,dc= | modifiersName: cn=admin,dc=test,dc=lan | ||
... | ... | ||
Zeile 117: | Zeile 144: | ||
ldapsearch -xLLL | ldapsearch -xLLL | ||
Die Ausgabe könnte folgendermaßen aussehen: | Die Ausgabe könnte folgendermaßen aussehen: | ||
dn: dc=test,dc= | dn: dc=test,dc=lan | ||
objectClass: top | objectClass: top | ||
objectClass: dcObject | objectClass: dcObject | ||
objectClass: organization | objectClass: organization | ||
o: test. | o: test.lan | ||
dc: test | dc: test | ||
dn: cn=admin,dc=test,dc= | dn: cn=admin,dc=test,dc=lan | ||
objectClass: simpleSecurityObject | objectClass: simpleSecurityObject | ||
objectClass: organizationalRole | objectClass: organizationalRole | ||
Zeile 130: | Zeile 157: | ||
description: LDAP administrator | description: LDAP administrator | ||
dn: ou=people,dc=test,dc= | dn: ou=people,dc=test,dc=lan | ||
ou: people | ou: people | ||
objectClass: organizationalUnit | objectClass: organizationalUnit | ||
dn: ou=groups,dc=test,dc= | dn: ou=groups,dc=test,dc=lan | ||
ou: groups | ou: groups | ||
objectClass: organizationalUnit | objectClass: organizationalUnit | ||
Admin User Eintrag suchen: | |||
ldapsearch -xLLL cn=admin | |||
Die Ausgabe könnte folgendermaßen aussehen: | |||
dn: cn=admin,dc=schiele,dc=lan | |||
objectClass: simpleSecurityObject | |||
objectClass: organizationalRole | |||
cn: admin | |||
description: LDAP administrator | |||
Zeile 150: | Zeile 186: | ||
vi /root/ldap_ldif/group.ldif | vi /root/ldap_ldif/group.ldif | ||
Folgende Zeilen einfügen und anpassen: | Folgende Zeilen einfügen und anpassen: | ||
dn: cn='''GROUP''',ou=groups,dc=test,dc= | dn: cn='''GROUP''',ou=groups,dc=test,dc=lan | ||
cn: '''GROUP''' | cn: '''GROUP''' | ||
gidNumber: '''GID''' | gidNumber: '''GID''' | ||
Zeile 156: | Zeile 192: | ||
objectClass: posixGroup | objectClass: posixGroup | ||
ldapadd -cxWD cn=admin,dc=test,dc= | ldapadd -cxWD cn=admin,dc=test,dc=lan -f /root/ldap_ldif/group.ldif | ||
Zeile 164: | Zeile 200: | ||
vi /root/ldap_ldif/user.ldif | vi /root/ldap_ldif/user.ldif | ||
Folgende Zeilen einfügen und anpassen: | Folgende Zeilen einfügen und anpassen: | ||
dn: uid='''USER''',ou=people,dc=test,dc= | dn: uid='''USER''',ou=people,dc=test,dc=lan | ||
uid: | uid: '''USER''' | ||
uidNumber: '''UID''' | uidNumber: '''UID''' | ||
gidNumber: '''GID''' | gidNumber: '''GID''' | ||
objectClass: top | objectClass: top | ||
objectClass: inetOrgPerson | objectClass: inetOrgPerson | ||
Zeile 178: | Zeile 212: | ||
homeDirectory: /home/'''USER''' | homeDirectory: /home/'''USER''' | ||
ldapadd -cxWD cn=admin,dc=test,dc= | ldapadd -cxWD cn=admin,dc=test,dc=lan -f /root/ldap_ldif/ueser.ldif | ||
Passwort für den User '''USER''' vergeben: | Passwort für den User '''USER''' vergeben: | ||
ldappasswd -x -D cn=admin,dc=test,dc= | ldappasswd -x -D cn=admin,dc=test,dc=lan-W -S uid='''USER''',ou=people,dc=test,dc=lan | ||
Zeile 203: | Zeile 237: | ||
done | done | ||
fi | fi | ||
chk=`grep "${schema_name}" ${cfg}` | chk=`grep "${schema_name}" ${cfg}` | ||
if [ -z "${chk}" ] | if [ -z "${chk}" ] | ||
Zeile 256: | Zeile 290: | ||
Folgende Zeilen einfügen und den Eintrag '''cn'''anpassen (der cn muss auf den DNS-Namen des Servers bzw. die IP-Adresse gesetzt werden, die später im Connection String der Clients verwendet werden soll. Ansonsten funktioniert der Zugriff später nicht): | Folgende Zeilen einfügen und den Eintrag '''cn'''anpassen (der cn muss auf den DNS-Namen des Servers bzw. die IP-Adresse gesetzt werden, die später im Connection String der Clients verwendet werden soll. Ansonsten funktioniert der Zugriff später nicht): | ||
organization = Private | organization = Private | ||
cn = ldap1.test | cn = ldap1.test.lan | ||
tls_www_server | tls_www_server | ||
encryption_key | encryption_key | ||
Zeile 269: | Zeile 303: | ||
Issuer: CN=Test gnuTLS CA | Issuer: CN=Test gnuTLS CA | ||
Validity: 10 Jahre (3650 Tage) | Validity: 10 Jahre (3650 Tage) | ||
Subject: O=Private,CN=ldap1 | Subject: O=Private,CN=ldap1.lan | ||
Certificate Authority (CA): FALSE | Certificate Authority (CA): FALSE | ||
Key Purpose (not critical): TLS WWW Server. | Key Purpose (not critical): TLS WWW Server. | ||
Zeile 301: | Zeile 335: | ||
TLS-Konfiguration ins LDAP Directory einbinden: | TLS-Konfiguration ins LDAP Directory einbinden: | ||
ldapmodify - | ldapmodify -cxWD cn=admin,cn=config -f /root/ldap_ldif/tls.ldif | ||
SSL aktivieren (ldaps://): | SSL aktivieren (ldaps://): | ||
Zeile 314: | Zeile 348: | ||
Folgende Einstellungen vornehmen: | Folgende Einstellungen vornehmen: | ||
URI ldaps://'''IP_DES_SERVER''' | URI ldaps://'''IP_DES_SERVER''' | ||
BASE '''LDAP_Base''' z.B. dc=test,dc= | BASE '''LDAP_Base''' z.B. dc=test,dc=lan | ||
TLS_CACERT /etc/ldap/ssl/cacert.pem | TLS_CACERT /etc/ldap/ssl/cacert.pem | ||
TLS_REQCERT never | TLS_REQCERT never | ||
Zeile 373: | Zeile 407: | ||
** Server Adress: ldap://localhost:389 bzw. ldaps://localhost falls SSL-Verschlüsselung eingerichtet ist. Falls der LDAP-Server nicht auf dem selben Server läuft, entsprechend die IP-Adresse bzw. Hostname des LDAP-Servers eintragen. | ** Server Adress: ldap://localhost:389 bzw. ldaps://localhost falls SSL-Verschlüsselung eingerichtet ist. Falls der LDAP-Server nicht auf dem selben Server läuft, entsprechend die IP-Adresse bzw. Hostname des LDAP-Servers eintragen. | ||
** Activate TLS: Sollte nicht zusammen mit ldaps:// (Port 636) verwendet werden, da dieses Protokoll bereits SSL-verschlüsselt ist. TLS kann zusammen mit ldap:// (Port 389)verwendet werden, wenn die voraussetzungen für SSL gegeben sind. | ** Activate TLS: Sollte nicht zusammen mit ldaps:// (Port 636) verwendet werden, da dieses Protokoll bereits SSL-verschlüsselt ist. TLS kann zusammen mit ldap:// (Port 389)verwendet werden, wenn die voraussetzungen für SSL gegeben sind. | ||
** Tree suffis: '''LDAP_Base''' z.B. dc=test,dc= | ** Tree suffis: '''LDAP_Base''' z.B. dc=test,dc=lan | ||
** Default language: Hier kann die Sprache auf Deutsch umgestellt werden. Im folgenden werden trotzdem die englischen Begriffe verwendet. | ** Default language: Hier kann die Sprache auf Deutsch umgestellt werden. Im folgenden werden trotzdem die englischen Begriffe verwendet. | ||
** list of Valid Users: cn=admin,'''LDAP_Base''' z.B. cn=admin,dc=test,dc= | ** list of Valid Users: cn=admin,'''LDAP_Base''' z.B. cn=admin,dc=test,dc=lan | ||
* '''Account Types''' | * '''Account Types''' | ||
** Users LDAP suffix: ou=people,'''LDAP_Base''' z.B. ou=people,dc=test,dc= | ** Users LDAP suffix: ou=people,'''LDAP_Base''' z.B. ou=people,dc=test,dc=lan | ||
** Grups LDAP suffix: ou=groups,'''LDAP_Base''' z.B. ou=groups,dc=test,dc= | ** Grups LDAP suffix: ou=groups,'''LDAP_Base''' z.B. ou=groups,dc=test,dc=lan | ||
** Hosts LDAP suffix: ou=computers,'''LDAP_Base''' z.B. ou=computers,dc=test,dc= | ** Hosts LDAP suffix: ou=computers,'''LDAP_Base''' z.B. ou=computers,dc=test,dc=lan | ||
** Samba Domains LDAP suffix: '''LDAP_Base''' z.B. dc=test,dc= | ** Samba Domains LDAP suffix: '''LDAP_Base''' z.B. dc=test,dc=lan | ||
* '''Modules''' | * '''Modules''' | ||
Zeile 431: | Zeile 465: | ||
CA_TLS_CERT="/etc/ldap/ssl/cacert.pem" | CA_TLS_CERT="/etc/ldap/ssl/cacert.pem" | ||
DIT_CONFIG="cn=config" | DIT_CONFIG="cn=config" | ||
DIT_SUFFIX="dc=test,dc= | DIT_SUFFIX="dc=test,dc=lan" | ||
SLAPD_CONFIG_FILENAME="/etc/ldap/ldap.conf" | SLAPD_CONFIG_FILENAME="/etc/ldap/ldap.conf" |
Aktuelle Version vom 8. Juni 2013, 07:07 Uhr
Allgemein
Mittels LDAP (Lightweigh Directory Access Protocol) können User-Informationen, aber auch zahlreiche Informationen von Diensten, in einer zentralen, hierarchischen Datenbank abgelegt werden, die unter anderem netzwerkweit zur User-Authentifizierung verwendet werden kann. Dadurch müssen einzelne User nur einmalig angelegt und gepflegt werden und stehen auf allen mit dem LDAP-Server verbundenen Systemen zur Verfügung. Die Userinformationen können nicht nur zur Userauthentifizierung für die Linux-Shell, sondern auch für zahlreiche weitere Dienste wie Email, FTP, Webserver, Groupware, usw. verwendet werden. Aber nicht nur Userdaten, sondern auch Adressbuchdaten, IP-Adressen des DHCP-Servers, usw. können in einem LDAP Directory abgelegt werden.
In der LDAP Datenbank werden die Daten hierarchisch in Baumform angelegt (DIT Directory Information Tree).
- Die Basis (dn: Distinguished Name) des LDAP Directories wird üblicherweise vom Domainnamen abgeleitet. Z.B. die Domain test.lan wird in LDAP folgendermaßen abgebildet: LDAP_Base: dc=test,dc=lan. Die Domain test.homelinux.local als dc=test,dc=homelinux,dc=local
- Elemente darunter könnten z.B. User (People) und Gruppen (Groups) sein, in denen die jeweiligen Linux-User und Gruppen definiert werden. Diese sog. Organizational Units (ou) werden folgendermaßen in LDAP abgebildet: ou=People,dc=test,dc=lan.
- Ein User Tux könnte dann z.B. folgendermaßen angesprochen werden: uid=tux,ou=People,dc=test,dc=lan.
- Es können aber auch noch deutlich mehr Ebenen abgebildet werden.
Sogar die komplette Konfiguration von OpenLDAP wird in einem eigenen DIT namens cn=config abgelegt. Dadurch können Konfigurationsänderungen on the fly durch hinzufügen, ändern bzw. löschen von Attributen erfolgen, ohne OpenLDAP nach jeder Änderung neu starten zu müssen.
LDAP Server Installation
Installation der Pakete
apt-get install slapd ldap-utils
Folgende Informationen eingeben:
- Administrator password: LDAP_ADMIN_PWD
- Confirm password: LDAP_ADMIN_PWD
Konfiguration
vi /etc/ldap/ldap.conf
Folgende Einstellungen vornehmen:
URI ldap://IP_DES_SERVER BASE LDAP_Base z.B. dc=test,dc=lan
Informationen werden mit Hilfe von .ldif Files in's LDAP Directory übertragen. Es ist empfehlenswert diese Files zentral in einem eigenen Unterverzeichnis zu verwalten, wobei die Files nach dem Import in die LDAP Datenbank eigentlich gar nicht mehr benötigt werden.
mkdir /root/ldap_ldif
Admin Passwort für Konfigdatenbank
Das bei der Installation angelegte Admin-Passwort gilt standardmäßig nur für die Daten, nicht für das Konfigurationsbackend cn=config. Für dieses ist in der Debian Installation gar kein Passwort vergeben, sodass sich kein Admin dort anmelden kann, um Ändereungen vorzunehmen.
Passwort-Hast erstellen
ldappasswd -h {SSHA}
Zweimal das geünschte Passwort eingeben, z.B. 1234. Die Ausgabe könnte folgendermaßen aussehen:
{SSHA}S+XGDyJeYuXkUn7ndqUdrmEf8jsMmUUI
Diesen Hash kopieren.
vi /root/ldap_ldif/add_cn-adm-pwd.ldif
Folgende Zeilen einfügen (Den Passwort-Hash olcRootPW mit eben generiertem Hash ersetzen):
dn: cn=config changetype: modify dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}S+XGDyJeYuXkUn7ndqUdrmEf8jsMmUUI
Ins Directory übernehmen:
ldapadd -Y EXTERNAL -H ldapi:/// -f /root/ldap_ldif/add_cn-adm-pwd.ldif
Inizes
Mit Hilfe von Indizes kann die Suche im LDAP Directory beschleunigt werden.
vi /root/ldap_ldif/index.ldif
Folgende Zeilen einfügen (ohne zusätzliche Leerzeilen zwischen den Informationen):
dn: olcDatabase={1}hdb,cn=config changetype: modify add: olcDbIndex olcDbIndex: uid eq - add: olcDbIndex olcDbIndex: cn eq - add: olcDbIndex olcDbIndex: ou eq - add: olcDbIndex olcDbIndex: dc eq - add: olcDbIndex olcDbIndex: memberUid eq - add: olcDbIndex olcDbIndex: member eq - add: olcDbIndex olcDbIndex: gidNumber eq
Die Informationen ins LDAP Directory übernehmen:
ldapmodify -cxWD cn=admin,cn=config -f /root/ldap_ldif/index.ldif
Organisational Units für User und Gruppen
Üblicherweise werden User und Gruppen in Organisational Units (ou) innerhalb von LDAP verwaltet. Um die Units anzulegen, folgendermaßen vorgehen:
vi /root/ldap_ldif/tree.ldif
Folgende Zeilen einfügen (incl. Leezeile zwischen people und groups OU):
dn: ou=people,dc=test,dc=lan ou: people objectClass: organizationalUnit dn: ou=groups,dc=test,dc=lan ou: groups objectClass: organizationalUnit
Die Informationen ins LDAP Directory übernehmen:
ldapadd -cxWD cn=admin,dc=test,dc=lan -f /root/ldap_ldif/tree.ldif
Loglevel
Standardmäßig konfiguriert Debian LDAP, sodass keine Logausgaben erfolgen. Zur Fehlersuche sind aber Loginforamtionen meist sehr hilfreich. Evtl. Logausgaben werden im Syslog (/var/log/syslog) ausgegeben. Loginformationen können folgendermaßen ein- und ach wieder deaktiviert werden:
vi /root/ldap_ldif/loglevel.ldif
Logausgaben aktivieren:
Folgende Zeilen einfügen:
dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: stats
Logausgaben deaktivieren:
Folgende Zeilen einfügen:
dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: none
Die Informationen ins LDAP Directory übernehmen:
ldapmodify -cxWD cn=admin,cn=config -f /root/ldap_ldif/loglevel.ldif
Funktionstest Server
Mit dem Befehl slapcat werden zahlreiche Informationen des LDAP-Directories ausgegeben.
slapcat
Die Ausgabe könnte folgendermaßen aussehen:
dn: dc=test,dc=lan objectClass: top objectClass: dcObject objectClass: organization o: test.lan dc: test structuralObjectClass: organization entryUUID: 95bcb4b4-9eab-1031-9b24-5d17a552c400 creatorsName: cn=admin,dc=test,dc=lan createTimestamp: 20120929180232Z entryCSN: 20120929180232.259042Z#000000#000#000000 modifiersName: cn=admin,dc=test,dc=lan ...
Directory durchsuchen:
ldapsearch -xLLL
Die Ausgabe könnte folgendermaßen aussehen:
dn: dc=test,dc=lan objectClass: top objectClass: dcObject objectClass: organization o: test.lan dc: test dn: cn=admin,dc=test,dc=lan objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator dn: ou=people,dc=test,dc=lan ou: people objectClass: organizationalUnit dn: ou=groups,dc=test,dc=lan ou: groups objectClass: organizationalUnit
Admin User Eintrag suchen:
ldapsearch -xLLL cn=admin
Die Ausgabe könnte folgendermaßen aussehen:
dn: cn=admin,dc=schiele,dc=lan objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator
User und Gruppen anlegen
Gruppe
Um eine Gruppe GROUP mit der ID GID anzulegen folgendermaßen vorgehen (GROUP und ID müssen eindeutig sein):
vi /root/ldap_ldif/group.ldif
Folgende Zeilen einfügen und anpassen:
dn: cn=GROUP,ou=groups,dc=test,dc=lan cn: GROUP gidNumber: GID objectClass: top objectClass: posixGroup
ldapadd -cxWD cn=admin,dc=test,dc=lan -f /root/ldap_ldif/group.ldif
User
Um einen User USER mit der ID UID, der zur Gruppe mit ID GID gehört, folgendermaßen vorgehen (USER, GROUP und ID müssen eindeutig sein):
vi /root/ldap_ldif/user.ldif
Folgende Zeilen einfügen und anpassen:
dn: uid=USER,ou=people,dc=test,dc=lan uid: USER uidNumber: UID gidNumber: GID objectClass: top objectClass: inetOrgPerson objectClass: person objectClass: posixAccount objectClass: shadowAccount loginShell: /bin/bash homeDirectory: /home/USER
ldapadd -cxWD cn=admin,dc=test,dc=lan -f /root/ldap_ldif/ueser.ldif
Passwort für den User USER vergeben:
ldappasswd -x -D cn=admin,dc=test,dc=lan-W -S uid=USER,ou=people,dc=test,dc=lan
Schema Konvertscript
Schemata bestimmen die Organisation der Daten. Um den LDAP-Tree um weitere Daten- und Dienste zu erweitern, z.B. für Samba, müssen die Schema-Files in LDIF-Files konvertiert werden, damit diese in den LDAP-Tree importiert werden können. Zu diesem Zweck dient folgendes Script, um diesen Vorgang zu automatisieren.
vi /usr/local/bin/schema2ldif.sh
Folgende Zeilen einfügen:
#!/bin/bash cfg="/etc/schema_convert.conf" schema_name=$1 TEMPDIR=`mktemp -d` trap "rm -r $TEMPDIR" 0 1 2 3 if [ ! -f $cfg ] ;then touch $cfg for f in "core" "collective" "corba" "cosine" "duaconf" "dyngroup" "inetorgperson" "java" "misc" "nis" "openldap" "ppolicy"; do echo "include /etc/ldap/schema/${f}.schema" >> $cfg done fi chk=`grep "${schema_name}" ${cfg}` if [ -z "${chk}" ] then echo "include /etc/ldap/schema/${schema_name}.schema" >> $cfg fi index_num=$(slapcat -f $cfg -F $TEMPDIR -n 0 | grep ${schema_name}, | sed -e 's/^.*{/{/' -e 's/}.*$/}/' ) slapcat -f $cfg -F $TEMPDIR -n0 -s cn=${index_num}${schema_name},cn=schema,cn=config | sed -e "s/^dn: cn=${index_num}/dn: cn=/" -e "s/^cn: ${index_num}/cn: /" -e '/^structuralObjectClass: olcSchemaConfig/,$d' > /etc/ldap/schema/${schema_name}.ldif
Script ausführbar machen:
chmod +x /usr/local/bin/schema2ldif.sh
Optional: SSL Verschlüsselung serverseitig akzeptieren
Die Übertragung der LDAP-Daten (z.B. User und Passwort-Hashes) kann mittels SSL-Vershlüsselung abgesichert werden.
gnuTLS CA
apt-get install gnutls-bin mkdir /etc/ldap/ssl cd /etc/ldap/ssl mkdir key mkdir certs mkdir templates vi templates/ca.tmpl
Folgende Zeilen einfügen (evtl. cn und expiration_days Einträge anpassen):
cn = Test gnuTls CA ca cert_signing_key expiration_days = 3650
CA Keyfile generieren:
certtool --generate-privkey --outfile cakey.pem
CA Root Zertifikat erstellen:
certtool --generate-self-signed --load-privkey cakey.pem --template templates/ca.tmpl --outfile cacert.pem
CA Root Zertifikat prüfen:
certtool --infile cacert.pem --certificate-info
Es werden zahlreiche Informationen zum Zertifikat ausgegeben. Folgende Punkte sollten geprüft werden:
Issuer: CN=Test gnuTLS CA Subject: CN=Test gnuTLS CA Validity: (10 Jahre) Certificate Authority (CA): TRUE Key Usage (critical): Certificate signing.
Zertifakte generieren
Keyfile generieren:
certtool --generate-privkey --outfile key/ldap-server.key
Template:
vi /templates/ldap-server.tmpl
Folgende Zeilen einfügen und den Eintrag cnanpassen (der cn muss auf den DNS-Namen des Servers bzw. die IP-Adresse gesetzt werden, die später im Connection String der Clients verwendet werden soll. Ansonsten funktioniert der Zugriff später nicht):
organization = Private cn = ldap1.test.lan tls_www_server encryption_key signing_key expiration_days = 3650
Selbstsigniertes Zertifikat generieren:
certtool --generate-certificate --load-privkey key/ldap-server.key --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem --template templates/ldap-server.tmpl --outfile certs/ldap-server-cert.pem
Zertifikat prüfen:
certtool --infile certs/ldap-server-cert.pem --certificate-info
Es werden zahlreiche Informationen zum Zertifikat ausgegeben. Folgende Punkte sollten überprüft werden:
Issuer: CN=Test gnuTLS CA Validity: 10 Jahre (3650 Tage) Subject: O=Private,CN=ldap1.lan Certificate Authority (CA): FALSE Key Purpose (not critical): TLS WWW Server. Key Usage (critical): Digital signature. Key encipherment.
Zertifikate in LDAP Folder kopieren
cp cacert.pem /etc/ldap/ssl/ cp key/ldap-server.key /etc/ldap/ssl/ cp certs/ldap-server-cert.pem /etc/ldap/ssl/
Rechte anpassen:
chown -R root:openldap /etc/ldap/ssl chmod -R o-rwx /etc/ldap/ssl
Konfiguration
OpenLDAP ldif-File erstellen:
vi /root/ldap_ldif/tls.ldif
Folgende Zeilen einfügen:
dn: cn=config add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ldap/ssl/cacert.pem - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ldap/ssl/ldap-server-cert.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap-server.key
TLS-Konfiguration ins LDAP Directory einbinden:
ldapmodify -cxWD cn=admin,cn=config -f /root/ldap_ldif/tls.ldif
SSL aktivieren (ldaps://):
vi /etc/default/slapd
Die Zeile
SLAPD_SERVICES="ldap:/// ldapi:///"
folgendermaßen erweitern:
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"
LDAP-Konfig-File:
vi /etc/ldap/ldap.conf
Folgende Einstellungen vornehmen:
URI ldaps://IP_DES_SERVER BASE LDAP_Base z.B. dc=test,dc=lan TLS_CACERT /etc/ldap/ssl/cacert.pem TLS_REQCERT never
OpenLDAP neu starten:
/etc/init.d/slapd restart
Funktionstest Server SSL
ldapsearch -xLLL
Ausgaben analog zu LDAP Funktionscheck
Optional: Grafisches User Account Admin Tool
Im folgenden wird der LDAP Acccount Manager (LAM) näher beschrieben, mit dessen Hilfe Linux User/Gruppen, Samba User Details usw. auf relativ einfache Art-und Weise grafisch im Webbrowser administriert werden können. Dies ist erheblich einfacher und weniger fehleranfällig, als oben beschriebene Vorgehensweise mittels .lidif File.
Installation
Debian Repository
LDAP Account Manager ist in den Debian-Repositories enthalten. Die Version ist allerdings bereits etwas älter, sodass nicht alle Features zur Verfügung stehen.
apt-get install ldap-account-manager
Debian Paket Download und Installation
Neben obiger Version aus den Debian Repositories, kann die jeweils aktuelle stabile Version auch als Debian Paket heruntergeladen und installiert werden. Diese Vorgehensweise ist nur geringfügig aufwändiger als obiges Vorgehen.
cd /usr/local/src wget http://sourceforge.net/projects/lam/files/LAM/4.0.1/ldap-account-manager_4.0.1-1_all.deb apt-get install php5-ldap php-fpdf php5-gd dpkg -i ldap-account-manager_4.0.1-1_all.deb
Konfiguration
- Webbrowser öffnen und http://IP_DES_SERVER/lam eingeben
General Settings
- Links oben auf den Link LAM configuration" klicken
- Edit general settings anwählen
- Passwort eingeben (LAM_MASTER_PWD Standardmäßig nach der Installation: lam)
- Hier können je nach Bedarf eingie Einstellungen vorgenommen werden:
- Session Timeout: Nach längerer Inaktivität (Session Timeout in Minuten) muss das Passwort erneut eingegeben werden.
- Allowed Hosts: Zugriffsbeschränkung auf bestimmte IP-Adressen/Hosts
- Password Policy: Beschränkungen für Passwörter.
- Logging: Falls Probleme mit LAM auftauchen kann es evtl. hilfreich sein, den Loglevel zu erhöhen (z.B. auf Debug), um mehr Hinweise zu erhalten
- Es kann auch hilfreich sein, die Logausgaben in ein eigenes File (z.B. /var/log/lam.log) ausgeben zu lassen. Dieses muss mit touch /var/log/lam.log angelegt und die Zugriffsrechte mit chmod 777 /var/log/lam.log erhöht werden.
- Change master Password (LAM_MASTER_PWD): Setzt ein neues Masterpasswort, das den Zugriff auf die LAM-Settings schützt (nicht das Zugriffspasswort auf das LDAP Directory).
- Nachdem alle Einstellungen vorgenommen sind, den Button Ok anklicken
- Anschließend kehrt LAM zum Login-Bildschirm rurück
Server Profiles
- Links oben auf den Link LAM configuration" klicken
- Edit server profiles anwählen
- Passwort eingeben (LAM_MASTER_PWD)
- General Settings
- Server Adress: ldap://localhost:389 bzw. ldaps://localhost falls SSL-Verschlüsselung eingerichtet ist. Falls der LDAP-Server nicht auf dem selben Server läuft, entsprechend die IP-Adresse bzw. Hostname des LDAP-Servers eintragen.
- Activate TLS: Sollte nicht zusammen mit ldaps:// (Port 636) verwendet werden, da dieses Protokoll bereits SSL-verschlüsselt ist. TLS kann zusammen mit ldap:// (Port 389)verwendet werden, wenn die voraussetzungen für SSL gegeben sind.
- Tree suffis: LDAP_Base z.B. dc=test,dc=lan
- Default language: Hier kann die Sprache auf Deutsch umgestellt werden. Im folgenden werden trotzdem die englischen Begriffe verwendet.
- list of Valid Users: cn=admin,LDAP_Base z.B. cn=admin,dc=test,dc=lan
- Account Types
- Users LDAP suffix: ou=people,LDAP_Base z.B. ou=people,dc=test,dc=lan
- Grups LDAP suffix: ou=groups,LDAP_Base z.B. ou=groups,dc=test,dc=lan
- Hosts LDAP suffix: ou=computers,LDAP_Base z.B. ou=computers,dc=test,dc=lan
- Samba Domains LDAP suffix: LDAP_Base z.B. dc=test,dc=lan
- Modules
- Es sollten nur diejenigen Module aktiviert werden, die auch installiert und für LDAP eingerichtet sind (z.B. Samba), da es ansosten zu Fehlern beim Anlegen bzw. Ändern von Accounts kommt.
- Module Settings
- Minimale und maximale Grenzen für UID und GID Einträge evtl. anpassen.
- Mit Save sämtliche Änderungen übernehmen
LDAP Login
- Webbrowser öffnen und http://IP_DES_SERVER/lam eingeben
- Passwort des LDAP-Adimin Unsers (LDAP_ADMIN_PWD) eingeben.
- Button Login anklicken
Hinweis: | |
Falls eine Org-Einheit im LDAP fehlen sollte, erscheint ein Hinweis, um den entsprechenden ou-Eintrag zu erzeugen. |
Die weitere Bedienung sollte selbsterklärend sein.
Backup und Restore
Backup Script
Hier wird ein Backup-Script vorgestellt, das das komplette LDAP Directory incl. sämtlicher Konfig- und Zertifikate-Files sichert. Das Script stammt von folgender Seite: http://itdavid.blogspot.ca/2012/05/howto-openldap-24-backup-recovery-on.html.
vi /usr/local/bin/backup_ldap.sh
Folgende Zeilen einfügen (DIT_SUFFIX anpassen und mit LDAP_BASE ersetzen; evtl. Backup Verzeichnis BACKUP_DIR anpassen):
#!/bin/sh # Backup the OpenLDAP data and configuration as compressed LDIF files. # Also backup the entire OpenLDAP directory and daemon configuration. # # David Robillard, April 23rd, 2012. umask 022 PATH="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin" export PATH DATE=`date +%Y%m%d` BACKUP_DIR="/home/shares/backup/openldap" BACKUP_DATA_FILENAME="slapd.${DATE}.data.ldif" BACKUP_CONFIG_FILENAME="slapd.${DATE}.config.ldif" BACKUP_TAR_FILENAME="slapd.${DATE}.directory.tar.gz" CA_TLS_CERT="/etc/ldap/ssl/cacert.pem" DIT_CONFIG="cn=config" DIT_SUFFIX="dc=test,dc=lan" SLAPD_CONFIG_FILENAME="/etc/ldap/ldap.conf" SLAPD_DIR="/etc/ldap" SLAPD_LOG_ROTATION="" SLAPD_TLS_CERT="/etc/ldap/ssl/ldap-server-cert.pem" SLAPD_TLS_KEY="/etc/ldap/ssl/ldap-server.key" SLAPCAT_OPTIONS="-F /etc/ldap/slapd.d" LOGFILE="/var/log/slapd_backup.log" KEEP="30" # Make sure we have a log file. if [ ! -f ${LOGFILE} ]; then touch ${LOGFILE} if [ "$?" -ne "0" ]; then echo "ERROR: could not create the log file." exit 1 fi fi # Check if root is running this script. if [ `id -u` -ne "0" ]; then echo "ERROR: only root can run this script." | tee -a ${LOGFILE} exit 1 fi # Make sure we have a backup directory. if [ ! -d ${BACKUP_DIR} ]; then mkdir -p ${BACKUP_DIR} if [ "$?" -ne "0" ]; then echo "ERROR: could not create the backup directory." | tee -a ${LOGFILE} exit 1 fi fi # Make sure we don't have too much backup files piling up in our backup directory. FILES=`find ${BACKUP_DIR} -type f -name "slapd.*" -print | wc -l` if [ "${FILES}" -gt "${KEEP}" ]; then OVER=`echo ${FILES}-${KEEP} | bc` RMFILES=`find ${BACKUP_DIR} -type f -name "slapd.*" -print | sort -r | tail -${OVER}` echo "NOTE: removing ${RMFILES} from the backup directory." >> ${LOGFILE} rm ${RMFILES} fi # Backup the DIT data. slapcat ${SLAPCAT_OPTIONS} -b ${DIT_SUFFIX} -l ${BACKUP_DIR}/${BACKUP_DATA_FILENAME} >/dev/null 2>&1 if [ "$?" -eq "0" ]; then gzip -f ${BACKUP_DIR}/${BACKUP_DATA_FILENAME} 2>&1 >> ${LOGFILE} if [ "$?" -ne "0" ] ; then echo "ERROR: dump file compression problem." | tee -a ${LOGFILE} exit 1 fi else echo "ERROR: problem running slapcat(8C) for the DIT data backup." | tee -a ${LOGFILE} rm ${BACKUP_DIR}/${BACKUP_DATA_FILENAME} exit 1 fi # Backup the DIT config as an LDIF file. slapcat ${SLAPCAT_OPTIONS} -b ${DIT_CONFIG} -l ${BACKUP_DIR}/${BACKUP_CONFIG_FILENAME} >/dev/null 2>&1 if [ "$?" -eq "0" ]; then gzip -f ${BACKUP_DIR}/${BACKUP_CONFIG_FILENAME} 2>&1 >> ${LOGFILE} if [ "$?" -ne "0" ] ; then echo "ERROR: dump file compression problem." | tee -a ${LOGFILE} exit 1 fi else echo "ERROR: problem running slapcat(8C) for the DIT config backup." | tee -a ${LOGFILE} rm ${BACKUP_DIR}/${BACKUP_CONFIG_FILENAME} exit 1 fi # Backup the entire configuration directory. BACKUP_FILES_LIST="${CA_TLS_CERT} ${SLAPD_CONFIG_FILENAME} ${SLAPD_DIR} ${SLAPD_LOG_ROTATION} ${SLAPD_TLS_CERT} ${SLAPD_TLS_KEY}" tar zcf ${BACKUP_DIR}/${BACKUP_TAR_FILENAME} ${BACKUP_FILES_LIST} >/dev/null 2>&1 if [ "$?" -ne "0" ]; then echo "ERROR: problem running config directory tar." | tee -a ${LOGFILE} rm ${BACKUP_DIR}/${BACKUP_TAR_FILENAME} exit 1 fi
Das Script ausführbar machen:
chmod +x /usr/local/bin/backup_ldap.sh
Das Script ausführen:
/usr/local/bin/backup_ldap.sh
Das Script sollte fehlerfrei durchlaufen und folgende Dateien anlegen:
- slapd.config.Datum.ldif.gz
- slapd.data.Datum.ldif.gz
- slapd.directory.Datum.tar.gz
Logfile prüfen:
tail /var/log/slapd_backup.log
Eollten keine Fehler im Log auflaufen.
Das Script täglich automatisch ausführen:
vi /etc/cron.d/backup_ldap
Folgende Zeile einfügen:
0 1 * * * root /usr/local/bin/backup_ldap.sh
Recovery
LDAP Server stoppen:
/etc/init.d/slapd stop
mkdir /tmp/ldap cd /tmp/ldap
Wiederherzustellende LDAP-Backup-Files (z.B. slapd.20130525...) nach /tmp/ldap kopieren:
cp /home/shares/backup/openldap/slapd.20130525* /tmp/ldap
Files entpacken:
gunzip slapd.* tar xvf slapd.*.tar
Der Ordner /var/lib/ldap/ muss leer sein, damit die Daten des Backups übernommen werden. Entweder den Ordner umbenennen und neuen Ordner erstellen, oder sämliche Files darin löschen:
mv /var/lib/ldap /var/lib/ldap_old mkdir /var/lib/ldap chown openldap. /var/lib/ldap
Das selbe gilt für den Ordner /etc/ldap/slapd.d
mv /etc/ldap/slapd.d /etc/ldap/slapd.d_old mkdir /etc/ldap/slapd.d chown openldap. /etc/ldap/slapd.d
Nun kann der Bereich 'cn=config' des LDAP-Directories wiederhergestellt werden:
slapadd -F /etc/ldap/slapd.d/ -n 0 -l slapd*.config.ldif
Im nächsten Schritt werden die Daten des LDAP-Directories wiederhergestellt:
slapadd -F /etc/ldap/slapd.d/ -n 1 -l slapd*.data.ldif
Rechte anpassen:
chown -R openldap. /etc/ldap/slapd.d chown -R openldap. /var/lib/ldap/
Evtl. noch die Konfigfiles, Schemas und Zertifikate wiederherstellen:
cd etc/ldap cp ldap.conf /etc/ldap/ cp schema/* /etc/ldap/schema/ cp -rup ssl /etc/ldap/
LDAP Server starten:
/etc/init.d/slapd start
Backup-Files löschen:
rm -R /tmp/ldap