LDAP-Authentication

Aus OpenNewsNetwork

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Nutzerauthentifizierung ist erforderlich, um nur berechtigten Nutzern den Zugang zum Open News Network zu gestatten. Dazu verwendet das Netzwerk eine replizierte LDAP Nutzerdatenbank.

Es sind auch andere Anbindungen an auth.open-news-network.org vorstellbar, wenn zum Beispiel schon ein radius-Server vorhanden ist.

INN stellt für die Authentifizierung zwei Mechanismen zur Verfügung:

  • externes Programm, das über stdin/stdout kommuniziert, konfiguriert durch die Anweisung auth
  • Funktion in einer Skript-Sprache, konfiguriert durch die Anweisung perl_auth oder python_auth

inn-ldapcheck

Dieses Tutorial beschreibt die Installation und Einbindung des externen Programms inn-ldapcheck. Voraussetzung ist das Vorhandensein einer lokale LDAP-Installation, z.B. OpenLDAP (http://www.openldap.org). Benötigt werden unter anderem /usr/include/ldap.h und libldap.so.

Distribution Paket
Debian 4 libldap2-dev
Fedora 10 openldap-devel
Ubuntu 8.04 libldap2-dev

inn-ldapcheck herunterladen

Die Original-Version gibt es unter http://ftp.isc.org/isc/inn/contrib/

Allerdings sind zum Übersetzen auf zeitgenössischem Linux einige Änderungen notwendig. Eine angepasste Version gibt es hier:

cd /usr/src/
svn co svn://svn.open-news-network.org/onn/projects/inn-ldapcheck

README lesen und ggf. verstehen

cd inn-ldapcheck
less README

config.h anpassen

Dieser Schritt ist nur für die Original-Version des ISC notwendig. Dort stehen in config.h nämlich folgende Zeilen:

#define LDAPSEARCH_BINDDN "cn=Manager,dc=example,dc=com"
#define LDAPSEARCH_BIND_CRED "secret"
#define LDAPSEARCH_BASE "dc=example,dc=com"

BINDDN und CRED dienen dazu, zunächst einen Bind mit einem Administrator-Account durchzuführen. Diese muss man gegen die Zugangsdaten des LDAP-Newsmaster austauschen. Das könnte dann z.B. so aussehen:

#define LDAPSEARCH_BINDDN "cn=meine-kennung,dc=open-news-network,dc=org"
#define LDAPSEARCH_BIND_CRED "sehr-geheimes-passwort"
#define LDAPSEARCH_BASE "dc=open-news-network,dc=org"

meine-kennung und sehr-geheimes-passwort werden von einem der LDAP Administratoren auf Anfrage zugewiesen.

Wie gesagt, ist dieser Schritt für die angepasste Version aus dem Subversion-Repository nicht notwendig.

ldapchchek übersetzen

make

An dieser Stelle können einige Warnungen erscheinen. Zum einen ist das ein redefiniertes Makro und zum anderen die Inkludierung eines Systemverzeichnisses (/usr/include). Diese Warnungen können getrost ignoriert werden. Unter Umständen kommt es aber auch zu Fehlern, etwa wenn die OpenLDAP-Header-Files nicht installiert sind. Fehler können nicht ignoriert werden.

Ein Anhaltspunkt, wie die erfolgreiche Übersetzung mit harmlosen Warnungen aussieht:

$ nice make      
cc -g -I/usr/include -o ldapcheck main.c ldap_pwd_ok.c -L/usr/lib -lldap -llber -lpthread
In file included from ldap_pwd_ok.c:10:
config.h:14:1: warning: "LDAP_SUCCESS" redefined
In file included from ldap_pwd_ok.c:7:
/usr/include/ldap.h:348:1: warning: this is the location of the previous definition 

Oder, wer es perfekt machen will, der kann den überflüssigen Includepfad aus dem Makefile und das Makro aus config.h entfernen. Danach sollte die Kompilierung ohne Meldungen durchgehen.

Wie oben schon geschrieben ist, ist die Version aus dem Repository bereits geändert.

inn-ldapcheck testen

INN kommuniziert mit externen Authentifizierungsprogrammen über stdin/stdout. Um so ein Programm ohne INN zu testen muss man dessen Eingabe nachbauen. Ohne Debug-Ausgaben sieht ein erfolgreicher Test mit korrektem Login so aus:

$ cat eingabe
ClientAuthname: max.mustermann@gmx.de
ClientPassword: das.passwort
 
$ ./ldapcheck -s auth.open-news-network.org < eingabe
User:max.mustermann@gmx.de

Binary die richtigen Rechte/User verpassen

chmod +x ldapcheck
chown news:news ldapcheck 

Programm an die richtige Stelle kopieren

Distribution Verzeichnis
Debian 4 /usr/lib/news/bin/auth/passwd/
Fedora 10 /usr/lib/news/bin/auth/passwd/
Ubuntu 8.04 /usr/lib/news/bin/auth/passwd/

Bei anderen Distributionen/Unices kann der Pfad natürlich auch woanders liegen. Jedenfalls muss das Ding dorthin wo auch ckpasswd liegt.

cp ldapcheck /usr/lib/news/bin/auth/passwd/

readers.conf anpassen

Eine Beispiel-Readers.conf wird bereits mitgeliefert. Wer schonmal mit readers.conf gearbeitet hat, dürfte damit kein Problem haben. Wichtig ist nur, ldapcheck mit -s $hostname den richten Hostnamen des LDAP-Servers mitzugeben. Wenn kein eigener (replizierender) LDAP-Server läuft, kann man sich an den DNS-Round-Robin halten (wie im Beispiel angegeben). In LDAP ist das genauer beschrieben.

auth "opennewsldap" {
     hosts: "*"
     key: "opennewsldap"
     auth: "ldapcheck -s auth.open-news-network.org"
}

access "opennewsldap" {
         users: *
         key: "opennewsldap"
         newsgroups: "!control,!junk,news.*,at.*,oesterreich.*,ch.*,hamster.*,de.*,!de.alt.dateien,opennews.*,open-nntp.*,newbie-net.*,bwnet.test,hamburg.*"
         access: RPA
} 

INN übernimmt automatisch Änderungen an readers.conf, muss also deshalb nicht extra dafür reloaded werden. Wichtig ist an dieser Stelle noch, dass die Reihenfolge in readers.conf eine entscheidende Rolle spielt. Es wird immer von unten nach oben validiert. Dass bedeutet, man sollte die am meisten spezialisierten Logins/Authentifizierungen ans Ende der Datei verlegen. Also beispielsweise:

access "everyone"{
  ...
}


auth "localusers"{
  ...
  auth:...
}

access "localusers" {
  ...
}


auth "opennewsldap"{
  ...
  auth: "ldapcheck -s ldap1.open-news-network.org"
}

access "opennewsldap" {
  users: *
  ...
  access: RP
}


auth "Admin"{
  ...
  auth: "ckpasswd -f /usr/lib/news/etc/authentication/.htpasswd"
}

access "Administrator" {
  users: ...
  ...
  newsgroups: "*"
  access: RPALN
} 

Zusammengehörende auth und access Einträge können ohne Probleme direkt bei einander stehen.

Mit folgendem Patch entfällt der Auth-Bind, so daß keine LDAP-Admin Daten erforderlich sind. Als Nebeneffekt ergibt sich auch eine Beschleunigung des Authentifizierungsvorgangs: Patch

inn-ldapcheck.pl

inn-ldapcheck.pl ist Michaels Portierung von inn-ldapcheck nach Perl.

Notwendige Pakete
Distribution Paket
Debian 4 libnet-ldap-perl
Fedora 10 perl-LDAP
Ubuntu 8.04 libnet-ldap-perl


AuthLDAP.pm

Auf news.albasani.net läuft eine Authentisierungsfunktion für perl_auth:. Vorteil dieser Methode ist, dass man über globale Variablen Daten an perl_access: und filter_nnrpd.pl weiterreichen kann.

Persönliche Werkzeuge