Inspiriert durch bestimmte Ideen, die
DJB in seinem Paper
"Some thoughts on security after ten years of qmail 1.0" formuliert hat, hab ich mich am Wochenende dran gemacht, ein neues Projekt zu starten, und zwar einen LDAP-Server. "Ja", werden sich manche denken, "der AK ist aber ein handfester Trottel, dabei gibt es ja schon
OpenLDAP,
Fedora Directory Server,
OpenDS,
tinyldap, und noch ein paar andere Implementierungen". Nun, ja, oberflächlich betrachtet stimmt das, mein Ziel ist allerdings ganz spezifisch, und zwar werde ich als Storage-Backend das Filesystem selbst verwenden. Dabei mache ich mir den Umstand zunutze, dass die Baumstruktur unter Unix (naja, eigentlich sind Verzeichnisstrukturen unter Unix ja
DAGs, aber egal) der hierarchischen Struktur von LDAP sehr ähnlich ist.
Die Idee ist, einen Distinguished Name (DN) durch ein Verzeichnis zu repräsentieren, und die dazugehörenden Attribute durch Dateien, wobei der Dateiname den Attributsnamen codiert, und der Dateiinhalt den Attributswert repräsentiert. Die Vorteile liegen auf der Hand: einerseits lassen sich damit quasi alle Operationen auf der Hierarchie von LDAP fast 1:1 auf Datei- bzw. Verzeichnisoperationen abbilden (was auch die Komplexität der Implementierung stark verringern sollte), andererseits schiebe ich etliche Probleme des parallelen Zugriffs und des Caching von der Applikation hin zum Betriebssystem. Und nachdem pro LDAP-Session ein Prozess verantwortlich ist (ein simpler forkender Server also), sollte die Performance meiner LDAP-Server-Implementierung quasi nur von der Performance der Prozesserzeugung und der Performance des eingesetzten Dateisystems abhängig sein. Gleiches gilt für die Skalierbarkeit. Im wesentlichen geht es vorerst einmal darum, ungefähre Performancewerte zu erhalten, und eventuelle Bottlenecks identifizieren zu können. Bis dahin muss ich allerdings einmal das LDAP-Protokoll völlständig ausimplementieren. Bisher geht nämlich nur der Use-Case BindRequest -> AddRequest(s) -> UnbindRequest.