Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung Nächste ÜberarbeitungBeide Seiten der Revision | ||
de:shibslohttpd:checkerscript [2015/12/08 15:13] – angelegt Schreiterer, Frank | de:shibslohttpd:checkerscript [2015/12/09 08:27] – Schreiterer, Frank | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Prüfscript ====== | ====== Prüfscript ====== | ||
+ | |||
+ | Es handelt sich um eine Implementierung auf Basis von [[https:// | ||
+ | |||
+ | <file php shibchecker.php> | ||
+ | <?php | ||
+ | /* | ||
+ | This program is free software: you can redistribute it and/or modify | ||
+ | it under the terms of the GNU General Public License as published by | ||
+ | the Free Software Foundation, either version 3 of the License, or | ||
+ | any later version. | ||
+ | |||
+ | This program is distributed in the hope that it will be useful, | ||
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
+ | GNU General Public License for more details. | ||
+ | |||
+ | You should have received a copy of the GNU General Public License | ||
+ | along with this program. | ||
+ | | ||
+ | Copyright 2015 Frank Schreiterer, | ||
+ | */ | ||
+ | |||
+ | #unbegrenzt ausführen | ||
+ | set_time_limit(0); | ||
+ | #set logging to true or false | ||
+ | $logging=true; | ||
+ | #Pfad zur Logfile | ||
+ | $logfile="/ | ||
+ | #apt-get install php5-memchache NICHT php5-memchached! | ||
+ | $mcsrv=" | ||
+ | $mcport=" | ||
+ | #Lebenzeit der Einträge in Sekunden -> Wert muss an die SessionLifeTime der Shibboleth-Session und der Anwendungs-Session angepasst sein | ||
+ | #hier 12 Stunden | ||
+ | $mcExpire=43200; | ||
+ | #Das Prüfmuster für die Session-ID der Anwendung | ||
+ | $regexappsessionid="/ | ||
+ | ### Ende User-Konfig ### | ||
+ | |||
+ | #es wird versucht, den Overhead für die Verbingung durch die ständige Verbindung zu minimieren, | ||
+ | #schlägt bei memcached die Verbindung fehl, so wird die Verbindung selbständig wieder aufgebaut | ||
+ | $mc=new Memcache; | ||
+ | $mc-> | ||
+ | |||
+ | $keyboard = fopen(" | ||
+ | $out = fopen(" | ||
+ | while (1) { | ||
+ | #Variablen initialisieren | ||
+ | $shibvalid=false; | ||
+ | $appvalid=false ; | ||
+ | $valid=true; | ||
+ | $return=""; | ||
+ | $returnmsg=""; | ||
+ | $logstr = ""; | ||
+ | $mixedlazy = false; | ||
+ | $checkappsessionid = false; | ||
+ | $appsessionid=""; | ||
+ | $shibcookiesessionid=""; | ||
+ | $appsessionidmatch=0; | ||
+ | $shibcookiesessionidmatch=0; | ||
+ | #Ende Variablen initialisieren | ||
+ | $input = trim(fgets($keyboard)); | ||
+ | $startts = microtime(true); | ||
+ | #input zerlegen | ||
+ | $tmp = explode(",", | ||
+ | #Context -> Parameter 1 bei Aufruf RewriteMap sessionHook wenn über den LoginHook des Shibd aufgerufen wird, lazy für ausschließlich Lazy Session und normal für normale Shib-Session | ||
+ | #Der Parameter 5 ist optional und wird verwendet, um dem shibcheker mitzuteilen, | ||
+ | # | ||
+ | $context = strtolower(trim($tmp[0])); | ||
+ | # | ||
+ | $shibsessionid = trim($tmp[1]); | ||
+ | #Name der Anwendungssession -> Parameter 3 bei Aufruf RewriteMap | ||
+ | $sesscookie = trim($tmp[2]); | ||
+ | #die gesetzen Cookies, aus denen der Wert der Anwendungssession extrahiert werden muss -> Parameter 4 bei Aufruf ReweriteMap | ||
+ | $cookies = $tmp[3]; | ||
+ | #Parameter 5 mixedLazy für Modus mixedLazy, falls die shibsessionid leer ist | ||
+ | if (isset($tmp[4]) && strtolower(trim($tmp[4])) == " | ||
+ | #Prüfung der übermittelten appsessionid auf Duplikate, wenn im Parameter 5 mixedLazy übergeben wurde | ||
+ | $checkappsessionid = true; | ||
+ | if ($shibsessionid == "" | ||
+ | $mixedlazy = true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | #aus den Cookies die ID der Anwendungssession extrahieren | ||
+ | $regexapp="/ | ||
+ | $regexshib="/ | ||
+ | $tmp = explode(";", | ||
+ | foreach ($tmp as $cookie) { | ||
+ | $cookie = trim($cookie); | ||
+ | if (preg_match($regexapp, | ||
+ | $appsessionid = trim(str_replace($sesscookie." | ||
+ | $appsessionidmatch++; | ||
+ | } | ||
+ | if (preg_match($regexshib, | ||
+ | $shibcookiesessionid = trim(preg_replace("/ | ||
+ | $shibcookiesessionidmatch++; | ||
+ | } | ||
+ | } | ||
+ | #Es wurde am Shib-Session-Cookie nichts verändert, Veränderung am Cookienamen werden von Shibd mit einer leeren Session-ID im Header quitiert, jedoch | ||
+ | #bleibt das Cookie ansich mit der Session-ID bestehen | ||
+ | #wird mehr als einmal versucht, ein Cookie mit der Anwendungssession bzw. Shibbolethsession zu übergeben, ist das auch verboten | ||
+ | if ($shibsessionid == $shibcookiesessionid && $appsessionidmatch < 2 && $shibcookiesessionidmatch < 2) { | ||
+ | #wenn mixedLazy, dann können wir uns alle weiteren Prüfungen sparen, da die Shibboleth-Checks nur ausgeführt werden können, | ||
+ | #wenn auch die Anmeldung über Shibboleth erfolgt. | ||
+ | # | ||
+ | if ($mixedlazy == false) { | ||
+ | # | ||
+ | # | ||
+ | if (preg_match("/ | ||
+ | $shibvalid=true; | ||
+ | } elseif ($shibsessionid != "" | ||
+ | #eine ungültige ID der Shibboleth-Session wurde übermittelt | ||
+ | $logstr = " | ||
+ | $valid = false; | ||
+ | } | ||
+ | # | ||
+ | if (preg_match($regexappsessionid, | ||
+ | $appvalid=true; | ||
+ | } elseif ($appsessionid != "" | ||
+ | #eine ungültige ID der Anwendungs-Session wurde übermittelt | ||
+ | $valid = false; | ||
+ | $logstr = " | ||
+ | } | ||
+ | #ist die Anwendungs-Session gesetzt und noch keine Shib-Session gesetzt ist das böse | ||
+ | if ($shibvalid == false && $appvalid == true) { | ||
+ | $valid = false; | ||
+ | $logstr = " | ||
+ | } | ||
+ | #wurde über den sessionHook aufgerufen, dann darf im Anwendungscookie nichts drin stehen | ||
+ | if ($context == " | ||
+ | $valid = false; | ||
+ | $logstr = " | ||
+ | } | ||
+ | # | ||
+ | if ($valid == true && $context != " | ||
+ | #nur weiter prüfen, wenn die Anwendungs-Session und die Shib-Session gültig sind | ||
+ | if ($shibvalid == true && $appvalid == true) { | ||
+ | # | ||
+ | $item = $mc-> | ||
+ | #bei memcached-Cluster hier noch aus den anderen lesen und ggf. Werte lokal schreiben | ||
+ | if ($item == false) { | ||
+ | $logstr = " | ||
+ | if ($checkappsessionid == true) { | ||
+ | # | ||
+ | $get = $mc-> | ||
+ | if ($get != false) { | ||
+ | $valid = false; | ||
+ | $logstr = " | ||
+ | } else { | ||
+ | $logstr = " | ||
+ | } | ||
+ | } | ||
+ | #nur weiter, wenn noch gültig | ||
+ | if ($valid == true) { | ||
+ | # | ||
+ | if ($appsessionid != "" | ||
+ | $mc-> | ||
+ | $logstr = " | ||
+ | # | ||
+ | if ($checkappsessionid == true ) { | ||
+ | # | ||
+ | $mc-> | ||
+ | $logstr = " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } elseif ($valid == true) { | ||
+ | # | ||
+ | if ($item != $appsessionid) { | ||
+ | $valid = false; | ||
+ | $logstr = " | ||
+ | } | ||
+ | } | ||
+ | } # | ||
+ | else { | ||
+ | $valid = false; | ||
+ | # | ||
+ | # | ||
+ | if ($shibsessionid == "" | ||
+ | $returnmsg = " | ||
+ | $valid = true; | ||
+ | } | ||
+ | # | ||
+ | #es muss zwingend die Anwendungssession initialisiert werden, sonst ist es möglich, eine falsche Session zu verwenden | ||
+ | if ($appsessionid == "" | ||
+ | $valid = true; | ||
+ | $returnmsg = " | ||
+ | $logstr = " | ||
+ | } | ||
+ | } | ||
+ | } #erweiterte Prüfung | ||
+ | } # nicht mixedLazy | ||
+ | else { | ||
+ | $valid = true; | ||
+ | $logstr = " | ||
+ | } | ||
+ | } # | ||
+ | else { | ||
+ | $shibvalid = false; | ||
+ | $valid = false; | ||
+ | if ($shibsessionid != $shibcookiesessionid) { | ||
+ | $logstr = " | ||
+ | } else { | ||
+ | $logstr = " | ||
+ | } | ||
+ | } | ||
+ | #die Rückgabewerte | ||
+ | if ($valid == false) { | ||
+ | $return = " | ||
+ | } else { | ||
+ | $return = " | ||
+ | if ($returnmsg != "" | ||
+ | $return = $returnmsg; | ||
+ | } | ||
+ | } | ||
+ | if ($logging == true) { | ||
+ | $log = fopen($logfile," | ||
+ | $now = date(" | ||
+ | $nowts = microtime(true); | ||
+ | $extime = ($nowts - $startts)*1000; | ||
+ | $logstr=" | ||
+ | fwrite($log, | ||
+ | fclose($log); | ||
+ | } | ||
+ | fwrite($out," | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||