ceskaexpedice / kramerius

System Kramerius
GNU General Public License v3.0
45 stars 26 forks source link

K7 / EOSC Keycloak <-> IdP podporující SLO / nefunkční odhlášení #1095

Open mduda100871 opened 1 week ago

mduda100871 commented 1 week ago

Zdravím,

při nasazení K7 spolu s EOSC Keycloakem a připojením do federace eduID.cz se při pokusu o odhlašování vyskytuje následující chyba u některých IdP (jako příklad KNAV, i všechno níže - nemám možnost testovat jinde v jiné doméně):

k7-logout-err-00

Zkoumáním a testováním jsem dospěl ke zjištění, že problém nastává zřejmě u Shibboleth IdP, které ve svých metadatech propagují endpointy pro odhlašování (SLO), příklad:

k7-logout-err-01

Chyba při odhlašování je propagována uživateli (do prohlížeče, viz první screenshot) v případě, že je v konfiguraci Keycloaku u příslušného IdP nastaven přepínač [Backchannel logout] na off, příklad:

k7-logout-err-02

Pokud se přepínač nastaví na on, tak chyba uživateli není propagována, z jeho pohledu na popředí proběhne zdánlivě korektní odhlášení, a je vrácen zpět do K7 jako odhlášený.

Nicméně na pozadí problém samozřejmě přetrvává - hlavně ten, že není zneplatněna uživatelská session u jeho domovského IdP, takže pokud se uživatel vrátí v relativně krátké době zpět na K7 (ale ne jen K7 samozřejmě, ale i případně jinou aplikaci využívající SAML2 v rámci podporované federace), tak je do aplikace přihlášen bez vyžádání jména a hesla.

Myslím, že asi není potřeba sáhodlouze rozebírat, že to je problematické / riziko jak pro správce chráněné služby (SP), tak pro poskytovatele identity (IdP), zvláště v případě, že na daném uživatelském stroji se střídá více lidí a nezavírají po sobě okna v prohlížeči. Různé služby mohou poskytovat různé, třeba i hodně, citlivé informace, které by tak mohly uniknout kam nemají.

Na druhou stranu - namátkovou analýzou metadat federace eduID.cz, týkajících se IdP, jsem zjistil, že část z nich odhlašování vůbec nepodporuje (nepropaguje SLO endpointy). Evidentně výše zmíněné riziko asi dost organizací nevzrušuje, nevím.

Zpátky k optickému (ne)vyřešení problému s odhlášením - spočívá v tom, nastavit výše zmíněný přepínač u daného IdP na on.

Další komplikace bohužel spočívá v tom, že u EOSC klonu Keycloaku nelze toto uskutečnit globálně na úrovni konfigurace federace, ale opravdu až u konkrétního IdP, takže ručně lovit Shibboleth IdP (pokud se to týká jen jich, nemám možnost ověřit jinde, např. implementací pod php) které podporují SLO, a tam zapnout odhlašování na pozadí.

Aktuálně netuším, zda-li by šlo nějak naskriptovat aktivaci odhlašování na pozadí a pak to přes REST-API Keycloaku hromadně změnit. Ale dovedu si to představit.

Nicméně optimálním řešením by bylo rozchodit validní odhlášení spojené se zneplatněním uživatelské session u jeho domovského IdP.

Tady je ještě pro ilustraci chyba, kterou vyhazuje Shibboleth IdP, když mu přijde požadavek na odhlášení na SLO endpoint:

k7-logout-err-03

Dál jsem se zatím nedostal, navíc ta chybová hláška je dost stručná a ne zrovna navádějící k něčemu konkrétnímu (no je pravda, že nejsem totální expert na SAML2 a jeho konkrétní implementaci v podobě Shibboleth IdP).

MD

MichaelTran262 commented 1 week ago

Ahoj, dali byste mi prosím nějaký testovací účet, abych to vyzkoušel a popřípadě opravil?