pfSense – abgelaufene User automatisch entfernen

Aufgabenstellung war eine WLAN mit Captive-Portal einzurichten. Für diesen Zweck entschied ich mich pfSense (damals pfSense 2.1) zu verwenden. Einfach zu installieren, konfigurieren, gute Sicherheit und einfach zu warten.

Einziges Problem war, dass angelegte User nicht wieder automatisch entfernt werden. Hierzu habe ich per Scripts selbst Hand anlegen müssen. Interessant für diesen Zweck ist das Script /etc/inc/auth.inc – in diesem File sind diverse Funktionen für die Bearbeitung von User-Konten inkludiert. Doch ich hatte ein paar Probleme, da mir Standard-Funktionen keine richtigen Werte zurücklieferten (warum auch immer). Abhilfe schuf ich mir mit einem eigenen .inc-File unter /etc/inc

auth_addon.inc:

<?php
function & getUserEntryByName($name) {
        global $debug, $config;

        $userindex_ff = index_users();

        if (isset($userindex_ff[$name]))
                return $config['system']['user'][$userindex_ff[$name]];
}

function getUserExpirationDate($username) {
        $user = getUserEntryByName($username);
        if ($user['expires'])
                return $user['expires'];
}

function isAccountExpired($username) {
        $expirydate = getUserExpirationDate($username);
        if ($expirydate) {
                if (strtotime("-1 day") > strtotime(date("m/d/Y",strtotime($expirydate))))
                        return true;
        }

        return false;
}
?>

Mit den richtigen Funktionen konnte ich nun ein eigenes php-Script anlegen und unter /usr/local/bin mit ausführbaren Rechten erstellen.

delete_expired_users.php:

#!/usr/local/bin/php -f
<?php

require_once("auth.inc");
require_once("auth_addon.inc");

// How many users are there?
$id = count($config['system']['user']);

// We must begin our search for expired users with the last useable ID
// Else strange things happen to the config.xml :)
$check_id = $id - 1;

// Check all found users except ID 0 - it's the admin, no need to check him
while ($check_id != 0) {
 // Get the username
 $uname = $config['system']['user'][$check_id]['name'];
 
 // Get the user's expirydate
 $uexpirydate = $config['system']['user'][$check_id]['expires'];
 
 echo "USER: ".$uname."\n";
 echo "EXPIRES: ".$uexpirydate."\n";
 
 // Check if the user is expired - function of auth_addon.inc
 if ( isAccountExpired($uname) ) {
  echo "EXPIRED: YES \n";
  
  // Delete user locally - function of auth.inc
  local_user_del($config['system']['user'][$check_id]);
  
  // Delete user in config - function of auth.inc
  unset($config['system']['user'][$check_id]);
  echo "USER DELETED! \n";
 
 } else {
  // User isn't expired or has no expirydate set
  echo "EXPIRED: NO \n";
 }
 echo "### \n";
 
 // Next ID
 $check_id = $check_id - 1;
}

// Write the new config
write_config();

?>

Somit kann “/usr/local/bin/delete_expired_users.php” per cronjob täglich aufgerufen werden. Es wird nach abgelaufenen Benutzern gesucht und diese schließlich gelöscht.

Achtung: die User-ID ist automatisch fortlaufend und in der config.xml von pfSense wird die nächste mögliche UID gespeichert (wenn ich mich jetzt nicht vertu ;o). Also nachdem ca. 65534 User angelegt wurden, wird man vermutlich in ein Problem rauschen. Hierzu habe ich mir aber leider noch keine Gedanken gemacht :o)
Links

Mein damaliger Forum-Eintrag: https://forum.pfsense.org/index.php?topic=71338.0

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.