Mittwoch, 19. September 2012

Freeradius: Account gültig ab?

Da hat es mich doch glatt in die tiefen von FreeRadius 2 verschlagen. Aufgabenstellung war, ein Account erst zum Zeitpunkt X als gültig zu erklären. Klingt eigentlich recht simple, hat aber viele Nerven gekostet.
Ausgangssituation; ein komplett durch konfigurierter FreeRadius inkl. verwendeten SQL-Modul, welches über den "authorize_check_query" uns alle zu überprüfenden Kriterien ausgibt. so habe ich für mein vorhaben ein neues Attribute geschaffen: "Activate-Account-At" dies ist ein Unix-Timestamp und soll den Zeitpunkt beschreiben ab wann der Account erst gültig ist.
Zuerst müssen wir FreeRadius dieses neue Attribute bekannt machen und so tragen wir es im "dictionary" ein:

ATTRIBUTE    Activate-Account-At        3080    integer

nun weiß FreeRadius dass es sich hier um ein "Integer" handelt und kann entsprechend mit umgehen. nun müssen wir dieses Attribute nur noch auswerten. Leider gibt es kein Modul was dies für uns erledigen könnte und so bedienen wir uns einfach der im FreeRadius verwendete "un-lang". In der Section "authorize" prüfen wir nun ob unser Attribute überhaupt gesetzt wurde und vergleichen es mit der build-in Variable von FreeRadius "%l" welche den aktuellen Unix-Timestamp enspricht.

authorize {
  ...
    if("%l" && "%{check:Activate-Account-At}") {
        if("%l" < "%{check:Activate-Account-At}") {
            reject
        }
    }
  ...
}

wie zu sehen ist, verwenden wir bei unserem neuen Attribute einen Präfix, der sagt FreeRadius, dass er das gewünschte Attribute aus unseren "check"-Attributen nehmen soll.
Und schon ist unsere neue Regel fertig, war gar nicht mal so wild ;)
Ich habe an dieser Stelle erstmal aufgehört weiter zu basteln, was mir an dieser stelle besser gefallen würde, wenn anstelle eines "Unix-Timestamp" ein "DateTime"-Object verwendet werden könnte. FreeRadius selbst hat auch eine "date" interpretation für Attribute, leider habe ich noch nicht das passende gegenstück gefunden was mir dann per "un-lang" ein gültigen Vergleich liefern könnte. Wer hier eine gute Idee hat, darf hier gerne ein Kommentar hinterlassen.
Alternativ könnte man den vergleich per SQL machen, ist aber meiner meinung nach auch nicht die feine englische Art hier den DB-Server mit zu nerven.

Keine Kommentare:

Kommentar veröffentlichen