Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:shibslohttpd:checkerscript [2015/12/08 15:18] – Schreiterer, Frank | de:shibslohttpd:checkerscript [2015/12/09 11:18] (aktuell) – Schreiterer, Frank | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== Prüfscript ====== | ====== Prüfscript ====== | ||
| - | Es handelt sich um eine Implementierung auf Basis von [[https:// | + | 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," | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | |||
| + | Weiter zu [[de: | ||