Seit dem Wochenende tüftle ich an der „Users DB“. Zwischenzeitlich habe ich mich dazu entschlossen hierfür einen LDAP Server einzurichten, denn die meißten Zugriffe sind lesender Natur. Des weiteren kommt mir die die objektorientierte Ablage der Daten entgegen. Was noch dafür spricht, ich kannte mich mit LDAP vor einiger Zeit noch recht gut damit aus und da hier das ein oder andere hängen blieb geht es sicherlich recht schnell. 🙂
LDAP Schema Definitionen
Leider gibt es kein LDAP Schema für RFID Tags (im speziellen die verwendete DESFire EV1), daher habe ich nun selber eines entwickelt was die bisher meißte Zeit in anspruch nahm. Zum glück hatte ich vor einigen Jahren eine eigene OID bei IANA beantragt (siehe: Cybcon Industries) und habe nun für die Michael Oberdorf IT-Consulting (unter diesem Label wird das System entwickelt) eine eigene unter Nummer definiert.
Zunächst habe ich das RFID DESFire Schema und das Schema für das System zusammen definiert, aber da das DESFire Schema sehr umfangreich wurde, habe ich dieses nun getrennt. Die verwendeten OID Räume sind wie folgt definiert:
1.3.6.1.4.1 15432 3 - Namensraum von Michael Oberdorf IT-Consulting
1.3.6.1.4.1 15432 3 1 OITC RFID Tag representation (DESFire EV1 specific):
Attribute: 1.3.6.1.4.1.15432.3.1.1.n
Objektklasse: 1.3.6.1.4.1.15432.3.1.2.n
1.3.6.1.4.1 15432 3 2 OITC Access Control System:
Attribute: 1.3.6.1.4.1.15432.3.2.1.n
Objektklasse: 1.3.6.1.4.1.15432.3.2.2.n
Der aktuelle Stand ist hier zu finden:
OpenLDAP Installation und Konfiguration
Hier war ich faul und habe die Debian Luxus Methode gewählt. Ist ja auch nicht ganz so zickig wie ein OpenBSD. 🙂
apt-get install ldap-client ldap-server ldap-utils libldap-2.4-2 libsasl2-modules libsasl2-modules-otp libsasl2-modules-ldap libsasl2-modules-gssapi-heimdal
Danach findet sich ein standard OpenLDAP auf dem System:
- Konfiguration: /etc/ldap
- OpenLDAP Backend Module: /usr/lib/ldap
- OpenLDAP Datenbank: /var/lib/ldap
- OpenLDAP schreibt sein Log im Standard via LOCAL4 ins Syslog: /var/log/syslog
Vorteil dieser Methode:
- Das configuration Backend (cn=config) wird bereits angelegt
- Das Root Objekt existiert
- Man kann sich nach der Installation sofort auf die Datenbank verbinden
Nachteil dieser Methode:
- Es fehlt die Datei „/etc/ldap/slapd.conf“
- der Zugriff auf „cn=config“ ist nicht möglich da die Berechtigung fehlt (geht nur über einen schmutzigen Workaround)
- Schema- und Konfigurationsänderungen sind recht mühselig (das ist wohl aber ein persönliches Empfinden)
Daher bin ich nun so vorgegangen dass ich das Konfigurations Backen auf Basis der aktuell eingestellten Werte in eine Standard slapd.conf Datei übertragen habe. Diese Datei wurde dann um das neu erstellte Schema erweitert. In dieser Datei sind zudem eine vernünftige Berechtigungsstruktur hinzugekommen, die notwendige Indizierung der Attribute (hier war im Standard tatsächlich nur die objectClass indiziert), das montoring Backend wurde konfiguration sowie die ein oder anderen Tuningparameter für die DBs hinterlegt.
Um das Ganze abzurunden, habe ich auch für die Sleepycat DB ein wenig die Konfiguration optimiert. Diese DB_CONFIG Datei muss im übrigen im Datenbankverzeichnis abgelegt werden. darin habe ich unter anderem das Transaktions Logging aktiviert.
Hier die OpenLDAP Konfiguration:
Die Daten für die Datenbank kann man im LDIF format vorbereiten.
Die Datenbank wird dann wie folgt initialisiert:
/etc/init.d/slapd stop
slapadd -f /etc/ldap/slapd.conf -l /etc/ldap/dit.ldif
chown -R openldap:openldap /var/lib/ldap/slapd-001
Wer möchte, kann dann das Konfigurationsbackend wieder wie folgt anlegen:
rm -rf /etc/ldap/slapd.d/*
slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d
chown -R openldap:openldap /etc/ldap/slapd.d
ich hab mir das gespart.
Am Ende den Server dann wieder starten:
/etc/init.d/slapd start
Nun muss sich noch herausstellen ob die Verbindung (vorallem der Verbindungsaufbau) schnell genug ist für die Benutzervalidierung. Aber hierzu muss ich das ACS noch um die LDAP Funktionalität erweitern. eine passende Java Lib habe ich mir jedenfalls noch nicht herausgesucht.