Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add admin login with SAML + Andrvotr instead of Cosign #243

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

TomiBelan
Copy link
Member

Asi pre @mrshu, ledaže by @Adman.

PR upgraduje Votr-knižnicu na novú verziu a používa nové prihlasovanie typu saml_andrvotr.
Navyše Votr už sa dá inštalovať ako normálny python balík, netreba submodule ani meniť sys.path.

Z pohľadu eprihlášky to bude vyzerať takto: Namiesto mod_cosign tam bude nejaký iný modul, buď mod_auth_mellon alebo mod_shib. Bude nastavený že /admin/* vyžaduje prihlásenie od malej povolenej množiny userov, rovnako ako doteraz bol mod_cosign. Keď sa niekto prihlási, v request.environ dostaneme tzv. andrvotr authority token, ktorý v podstate nejako kóduje, kto a kedy sa prihlásil kam (do eprihlášky). Potom stačí inicializovať Votr client s parametrami type="saml_andrvotr", my_entity_id=(konštanta z configu), andrvotr_api_key=(konštanta z configu), andrvotr_authority_token=(hodnota z request.environ). Votr sa pomocou toho prihlási do aisu.

Nie je to úplne dokončené. Čo ešte treba, aby niekto spravil (radšej nie ja):

  • Nie je to absolútne vôbec otestované (ani syntax errors) lebo sa mi nepodarilo nainštalovať requirements.txt. Možno treba update: Modernize eprihlaska for 2024 #237. BTW vo Votri som vyskúšal uv a dosť sa mi páči, ale aj poetry je ok ak chceš.
  • Hlavný otvorený problém je že andrvotr authority token rýchlo vyprší (po 5 minútach). Ideálne by bolo zavolať create_context / create_client iba raz, vtedy keď užívateľ prvýkrát príde do /admin/, a uložiť ho vo Flask session. Ale neviem ako to v eprihláške funguje, lebo existuje aj normálne užívateľské prihlasovanie aj admin login. eprihlaska/views.py robí so session nejaké veci ktorým nerozumiem, moc som sa v tom nevŕtal.
  • Zatiaľ je tam votr commit hash z WIP commitu ktorý neskôr squashnem. Potom treba updatnuť.
  • V templates je hardcoded https://login.uniba.sk/logout.cgi, bude treba zmeniť, závisí od vybraného modulu.
  • Odporúčam upgradnuť svt5 Ubuntu. Neviem s akým starým pythonom to bude fungovať. Aj tak všeobecne už by sa patrilo.

@mrshu
Copy link
Contributor

mrshu commented Dec 19, 2024

Vdaka @TomiBelan!

Zacneme asi najprv s tou modernizaciou, nech sa to da aspon vyskusat. Ja dnes tiez dost preferujem uv, dufam, ze by to mohlo zafungovat :)

Hlavný otvorený problém je že andrvotr authority token rýchlo vyprší (po 5 minútach). Ideálne by bolo zavolať create_context / create_client iba raz, vtedy keď užívateľ prvýkrát príde do /admin/, a uložiť ho vo Flask session.

Len pre uplnost, co po tych 5 minutach? Treba re-validovat?

Ale neviem ako to v eprihláške funguje, lebo existuje aj normálne užívateľské prihlasovanie aj admin login.

V tomto je ta eprihlaska dost schizofrenicka. To administrativne rozhranie (teda /admin/*) bolo doteraz "autorizovane" len cosign-om v tom zmysle, ze sa ocakavalo, ze v requeste pride REMOTE_USER (vid

def require_remote_user(func):
). Vdaka tomu velmi nebola pre tuto cast treba cosi ako Flask session, ale myslim, ze to ju nemalo byt velky problem pridat.

Zatiaľ je tam votr commit hash z WIP commitu ktorý neskôr squashnem. Potom treba updatnuť.

Roger!

V templates je hardcoded https://login.uniba.sk/logout.cgi, bude treba zmeniť, závisí od vybraného modulu.

Ocakavam, ze nech to bude akykolvek z modulov, stale to asi bude moct byt hardcoded URL, ze?

Odporúčam upgradnuť svt5 Ubuntu. Neviem s akým starým pythonom to bude fungovať. Aj tak všeobecne už by sa patrilo

Na tomto panuje (aspon medzi tebou, mnou a @tvinar) naozaj vseobecny suhlas :)

@TomiBelan
Copy link
Member Author

Len pre uplnost, co po tych 5 minutach? Treba re-validovat?

Moj povodny umysel bol ze na dlzke timeoutu nezalezi lebo kazda predna sluzba okamzite zavola create_client() akonahle dostane SAML login response. Takze 5 minut som zvolil nahodne, len ako rezervu aj ked by malo staci par sekund.

Votr hned pri prihlaseni zavola create_client() a dostane Client / Context objekt ktory obsahuje JSESSIONID z ais2.uniba.sk, ktory vydrzi uz dlhsie (niekolko hodin myslim). Ten strci do sessionu. Ak si neskor vsimne, ze JSESSIONID expiroval a prestal fungovat, vyzve usera aby sa prihlasil znovu.

Anketa zavola create_client() pocas prihlasovania (teda na /app.php/login co je jedina "protected" url), a ani ho nikam nemusi ukladat, iba rovno z aisu vytiahne zoznam predmetov studenta atd.

V eprihlaske ma cele /admin/ nastavene CosignAllowPublicAccess Off.
Jedna moznost je cele to prerobit na votr/anketa styl, s jednou "/admin/login" urlkou nastavenou ze nema public access, a ostatni z /admin/... na nu budu redirectovat.
Druha moznost je nechat to takto nastavene, ale napr rovno vo funkcii require_remote_user preventivne vyrobit votr client+context a ulozit do session. Mozno dvoch, na ais2 aj ais2-beta.
Tretia moznost je nikam client+context neukladat. Obidva moduly maju nejaku "force login" urlku na ktoru ked pojdes tak dostanes novy SAML response a v nom cerstvy andrvotr authority token. Takze lenive riesenie je, ak create_client hodi chybu ze token je expired lebo preslo 5 minut, poslat usera tam. Ale vsimol som si ze /admin/...process je POST, pri tomto by sa tie POST data asi stratili.
Neviem co je pre eprihlasku najlepsie ani najjednoduchsie, preto to radsej delegujem, ale pomozem/vysvetlim keby nieco.

Ocakavam, ze nech to bude akykolvek z modulov, stale to asi bude moct byt hardcoded URL, ze?

Ano, /mellon/logout?ReturnTo=/ alebo /Shibboleth.sso/Logout?return=/. Vid dirty priklad na https://github.com/fmfi-svt/saml-shibboleth-guide/blob/master/var/www/sp/sp.py

Btw podla mna sa mod_auth_mellon o chlp lahsie konfiguruje nez mod_shib, a paci sa mi ze nepotrebuje beziaceho systemoveho daemona, ale oba su vlastne fajn. mod_shib ma meta vyhodu ze ho Zigi lepsie pozna takze sa pouziva na skoro celej unibe.

Btw return=/ je klamstvo, IdP ta nikam nazad neposle, zostanes na IdP stranke s napisom "odhlasili ste sa" takze na hodnote vlastne nezalezi.

@mrshu
Copy link
Contributor

mrshu commented Dec 19, 2024

Votr hned pri prihlaseni zavola create_client() a dostane Client / Context objekt ktory obsahuje JSESSIONID z ais2.uniba.sk, ktory vydrzi uz dlhsie (niekolko hodin myslim). Ten strci do sessionu. Ak si neskor vsimne, ze JSESSIONID expiroval a prestal fungovat, vyzve usera aby sa prihlasil znovu.

Z nejakeho dovodu sme tento pristup s JSESSIONID v eprihlaske pouzivali iba pre ais2-beta, ale tam to fungovalo celkom v pohode (v zmysle, ze si uzivatel sam nasiel na ais2-beta.uniba.sk hodnotu JSESSIONID cookie a to stacilo). Mozno by bolo schodnym riesenim aby aj eprihlaska len zavolala create_client() a vytiahla z vystupu ten JSESSIONID, ktory by sa na par hodin niekam ulozil.

Ten usecase totiz vyzera tak, ze administracne rozhranie sa pouziva hlavne na "administrovanie" roznych veci okolo prihlasok, ako napriklad ich fyzicke vytlacenie, vratenie na dopracovanie, a nakoniec na preklopenie prihlasky, co je jedina cast, kde sa "Votr API" pouziva. Clovek sa tam aj tak raz denne musi prihlasit, takze to vidim na prerobenie na votr styl s jednym /admin/login endpointom, ako si spominal.

Pevne verim, ze o chvilu dam dokopy nejaky proof-of-concept -- este sa ozvem, ak by som mal nejake dalsie otazky.

Vdaka!

@TomiBelan
Copy link
Member Author

Vlastne moment. Myslel som ze AIS2SubmitForm a AIS2CookieForm su nejake komplikovane formulare. Ale neobsahuju skoro nic.

To sa mi zacina pozdavat tretia moznost. Cize napr:
V admin menu bude linka "Preklopit" ktora ide na /admin/confirmprocess?id=...
Stranka /admin/confirmprocess bude iba GET, bude robit to co doteraz robil GET /admin/process, bude na nej button "Ano naozaj" ktory ide na GET /mellon/login?ReturnTo=/admin/naozajprocess?id=... co forcne novy login (alebo mod_shib ekvivalent)
Stranka /admin/naozajprocess bude iba GET, bude robit to co doteraz robil POST /admin/process, teda zavola create_client() a save_application_form().

Vyhoda je ze sa pripojime iba na AIS iba ak treba, co ak spravne rozumiem ani pre adminov nie je velmi casto. A ze netreba riesit session ani pridavat novu /admin/login URL. Ale ci je to dokopy cistejsie, tazko povedat. Necham rozhodnutie na teba.

Btw vobec nechapem AIS2CookieForm, obsahuje jediny vyskyt jsessionid v celom codebase, nevidim nikoho co to cita. Dead code?

Btw mam virtualku samltest kde sa tieto veci daju testovat relativne pohodlne. Dam ti pristup?

Btw som aj na google chate a inych chat platformach.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants