Rudolf's Radius Klassenbibliothek
Klassenbibliothek
Bibliothek für Radiusclients
Hier sind Unterprogramme zusammengefasst, die jeder Radiusclient so braucht:
- int opensocket(struct sockaddr_in& salocal);
- öffnet socket und schreibt lokale Adresse in salocal
- int genempfaddr(struct sockaddr_in &saremote,char *addrstr,char *dienst="radius");
- ermittelt Integeradresse aus Rechner name oder IP-dressstring und dienst, vobei derradius-Dinet Voreingestellt ist.
- struct in_addr myaddr();
- Ermittelt die eigene IP-Adresse
Klasse Server
Ein Radiusclient kann fehlertoerant mehrere Radiusserver ansprechen. Ein solcher Serveradresse wird in folgender Listenstruktur Server verwaltet:
- Server(char *sname,short port=0);
- Konstruktor zum einrichten
- const char *name();
- const short port();
- const sockaddr_in &addr();
- liefert die Internetadresse
- Server *nxt
- Verkettung
Klasse Clientconf
Diese Klasse verwaltet die gesamte Konfiguration eines Clients
- Clientconf::Clientconf(int erw)
- der Konstruktor liest die Konfiguration aus der in config.h
${RADHOME}/client.conf wobei RADHOME eine Umgebungsvariable ist. Wird diese Umgebungsvariable nicht gesetzt, wird die Datei aus der in config.h angegebenen Defininiton RADCLIENTCONF gelesen.
Funktion komuwithserver
Diese Funktion wickelt die Komunikation mit dem radiusserver ab:
int komuwithserver(int sock,Zusenden &frage,Empfangen &antw,Server *sliste,const Clientsecurityinfo &csi,const Clientconf &cc)
Sie fragt solange alle Server in der Liste durch, is einer anwortet.
Jeder Server wird entsprechend in der cc angegebenen Werten für
radius_timeout und radius_retries lange versucht.
Es werden hier auch die Pakete mit einer Sequenznummer versehen.
Rückgabewert: 1 falls erfolgreich, 0 sonst
Die Struktur Clientsecurityinfo übergibt die Sicherheitsrelevanten Daten zur Verkürzung der Parameterliste und hat folgenden Aufbau:
- u_char vector[]
- der Zufallsgenerierte Schlüsselteil
- Clientinfo *cli
- die Information des Rechners mit dem Secret
Die Idee, die Secret-Ermittlung auch in diese Prozedur zu integrieren, ist naheliegend. Ebenso die der Lokalisierung des UDP-Socket in dieser Prozedur. Da aber die Digestermittlung auch zur Passwortcodierung benötigt wird, soll sich diese Prozedur sich damit nicht beschäftigen.
Die anderen radiusimplementierungen übergeben in ihren dynamisch aufgebauten
intrenen Strukturen die Passwörter unverschlüsselt und kodieren diese an dieser Stelle beim einpacken. Dies wird abgelehnt, da diese Radiusimplementierung
auf die dymanisch allokierten internen Strukturen verzichtet.
Ein anderer Kompromiss wäre, die Passwörter unverschüsselt zu einzupacken und
die diese zu codieren.
Diese Aufblähung der Parameterliste it za ästätisch nicht so schön, scheint miraber als das kleinste Übel.
Rudolf Weber
Informatik- und Netzwerkverein Ravensburg e.V