SAML - Označevalni jezik za varnostne trditve
Številni z dvermi opremljeni ponudniki storitev omogočajo "enkratno prijavo" (SSI, Single Sign-In). S SAML (Security Assertion Markup Language) gremo lahko korak naprej in omogočimo "enkratno prijavo" (SSO, Single Sign-On) na več spletnih mest.
SAML temelji na ogrodju XML, ki omogoča izmenjavo varnostnih informacij med domenami. Informacije so v obliki varnostnih trditev (security assertions) o entitetah (osebe in računalniki) v okviru posameznih varnostnih domen.
Gre za zamisel, da lahko eno spletno mesto jamči za identiteto in atribute (elektronski naslov, številka kreditne kartice) uporabnika enemu ali več drugim spletnim mestom. Temelj elementa sta tako ponudnik storitev istovetnosti (IdP - Identity Provider) in ponudnik storitev (SP - Service Provider). Pri tem je kritično, da potrdila o identiteti in atributih uporabnikov niso dostopna nepooblaščenim, zato vse kritične podatke šifriramo in elektronsko podpišemo. Varnostne trditve same po sebi ne zagotavljajo varne overitve, pač pa so kodirani stavki o dogodkih, ki so se že zgodili, kot so npr. overitve.
SAML uporabljamo predvsem za naslednji storitvi: enkratno prijavo (SSO - Single Sign-On) in povezovanje uporabniških računov (account linking). Motivi za uporabo SAML so štirje:
Sestavni deli SAML so:
SSO
SSO omogoča, da se nam po tem, ko smo se na enem spletnem mestu overili, ni treba overiti še na drugem, z njim povezanem. Pri tem predpostavljamo, da gre za obdelavo podatkov, ki jih nepooblaščeni lahko zlorabijo (npr. denarne transakcije), in morajo zato ostati tajne. Poleg tega je običajno, da do povezanega spletnega mesta v drugi domeni (in v lasti drugega podjetja) pridemo prek povezave (link) na spletnem mestu, v katerem smo se overili. Zato, da lahko na povezanih spletnih mestih izvajamo občutljive operacije brez vnovične overitve, morajo organizacije in lastniki skleniti ustrezne dogovore.
Pogosto naveden primer uporabe SSO je pogodba med letalsko družbo in podjetjem rent-a-car. Po tem, ko se overimo na spletni strani letalske družbe, izberemo let in vpišemo številko kreditne kartice (če je družba že nima v zbirki podatkov). Nato lahko sledimo povezavi na spletno stran podjetja rent-a-car in najamemo avtomobil, ne da bi se še enkrat overili in vpisali številko kreditne kartice. Tako uporabniku spletno poslovanje precej poenostavimo, ne da bi zmanjšali njegovo varnost.
Trditev SAML (Assertion)
Trditev SAML je temelj celotnega standarda. Vsebuje podatke o uporabnikovi overitvi in jamči, da se je določen uporabnik z določenim načinom overitve, ki morebiti ima določene atribute, v okviru določenega časovnega intervala dejansko overil pri določenem organu overitve (Authentication Authority). Zgled varnostne trditve je, da se je uporabnik Janez Novak, ki ima elektronski naslov janez.novak@siol.net, overil v tem sistemu z geslom.
Spodaj je definirana trditev SAML po standardu SAML 1.1 (niso navedene vse podrobnosti).
Temeljni element trditve je element <Assertion>. To je sestavljen element, ki je podlaga za vse trditve in vsebuje več atributov in podelementov:
In naslednje izbirne elemente:
Ter enega ali več naslednjih elementov:
Varnostne trditve lahko generirajo in izdajajo samo ustrezni organi SAML. To so npr.:
Protokol SAML
Kot smo že navedli, je varnostne trditve SAML mogoče tvoriti in izmenjevati z različnimi protokoli, vendar se večinoma uporablja protokol zahteva-odgovor (request-response protocol), ki je del specifikacij SAML in razvit posebej v ta namen. V tem, z XML podanem protokolu, sta dva glavna elementa. To sta element <Request>, ki ga tvori odvisna stran (oz. ciljno spletišče), in element <Response>, ki ga tvori izvirno spletišče oziroma stran, ki daje trditve kot odgovor na zahtevo odvisne strani.
Osnova za element <Request> je abstraktni tip "RequestAbstractType", ki vsebuje naslednje obvezne atribute:
In naslednja izbirna elementa:
Element <Request> določa zahtevo SAML in poleg elementov iz <RequestAbstractType> izbirno vsebuje še naslednje elemente:
Z elementom <Response> izvirno spletno mesto odgovori na zahtevo odvisne strani. Podlaga zanj je abstraktni tip "ResponseAbstractType", ki vsebuje naslednje obvezne atribute:
Naslednja izbirna atributa:
Ter izbirni element <ds:Signature> XML Signature, s katerim lahko elektronsko podpišemo odgovor in tako zagotovimo njegovo integriteto.
Element <Response> razširja "ResponseAbstractType" z referenco na element <Status> in nič, eno ali več referenc na element(e) <Assertion>, torej varnostne trditve. Z enim podaja stanje ustrezne zahteve SAML, z drugim pa varnostne trditve, ki so odgovor na zahtevo.
Pri odgovarjanju organa SAML na zahteve mora vsaka varnostna trditev v odgovoru vsebovati vsaj eno izjavo (Statement), v kateri uporabnik (Subject) popolnoma ustreza uporabniku, podanem v zahtevi. Dva uporabnika sta popolnoma enaka, če v primeru, da ima Uporabnik1 element <NameIdentifier>, tudi Uporabnik2 vsebuje enak element <NameIdentifier>, in če ima Uporabnik1 element <SubjectConfirmation>, tudi Uporabnik2 vsebuje enak element <SubjectConfirmation>.
Če nobena varnostna trditev pri organu overitve ne ustreza podani zahtevi, potem element <Response> ne sme vsebovati nobenega elementa <Assertion>, vsebovati pa mora element <StatusCode> (ki je del elementa <Status>) z vrednostjo "Success".
Izvedba protokola SAML
Temeljna izvedba (Binding) protokola SAML je izpeljana s pomočjo spletnih storitev, natančneje SOAP. Kot vemo, je SOAP (Simple Object Access Protocol) sestavljen iz ovojnice, podatkovne glave in telesa sporočila. Komunikacija SAML s pomočjo SOAP je izvedena kot preprost model zahtev (request) in odgovorov (response).
Zahteva. Entiteta SAML, ki zahteva varnostno izjavo, pošlje element SAML <Request> entiteti SAML, ki daje varnostne izjave, v telesu sporočila SOAP. V njem je lahko zgolj zahteva SAML in nič drugega.
POST /SamlService HTTP/1.1
Host: www.example.com
Content-Type: text/xml
Content-Length: nnn
SOAPAction: http://www.oasis-open.org/committees/security
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<samlp:Request xmlns:samlp:="..." xmlns:saml="..." xmlns:ds="...">
<ds:Signature> ... </ds:Signature>
<samlp:AuthenticationQuery>
...
</samlp:AuthenticationQuery>
</samlp:Request>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Primer 1: Zahteva SAML overitvenemu organu (Authentication Authority) po varnostni trditvi z izjavo o pristnosti (Authentication statement).
Odgovor. Entiteta SAML, ki daje izjave, odgovori ali z elementom <Response> znotraj telesa SOAP sporočila ali šifro napake. Znova je lahko v telesu sporočila zgolj element <Response>.
HTTP/1.1 200 OK
Content-Type: text/xml
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<samlp:Response xmlns:samlp="..." xmlns:saml="..." xmlns:ds="...">
<Status>
<StatusCodevalue="samlp:Success"/>
</Status>
<ds:Signature> ... </ds:Signature>
<saml:Assertion>
<saml:AuthenticationStatement>
...
</saml:AuthenticationStatement>
<saml:Assertion>
</samlp:Response>
</SOAP-Env:Body>
</SOAP-ENV:Envelope>
Primer 2: Odgovor organa overitve na zahtevo iz Primera 1.
Obe strani morata zagotoviti naslednje štiri vrste overitve pristnosti (authentication):
1. Brez overitve strežnika ali odjemalca.
2. Temeljna overitev odjemalca HTTP s SSL 3.0 ali TLS 1.0 ali brez.
3. Overitev strežnika HTTP SSL 3.0 ali TLS 1.0 z njegovim potrdilom (server-side certificate).
4. Vzajemna overitev strežnika in odjemalca HTTP SSL 3.0 ali TLS 1.0 s potrdiloma (server-side and client-side certificate).
Vedno, kadar zahtevamo tajnost ali integriteto sporočila, mora stran, ki daje izjave (responder), uporabiti šifriranje SSL 3.0 ali TLS 1.0 s strežnikovim potrdilom.
Prenos informacij med spletišči
Kot smo navedli že na začetku, je SAML definiran z namenom, da omogoči enkratno prijavo (SSO) uporabnikom internetnih storitev. V okviru SAML to vsebuje prijavo na izvirnem spletnem mestu (source site), to je na kakšnem skrbniku identitete (Identity Provider), nato pa uporabo storitev na ciljnih spletnih mestih (destination site) brez vnovičnih prijav. Informacije med dvema spletiščema pri enkratni prijavi prenašamo z običajnim brskalnikom:
1. SAML artefakt: je majhen niz, ki se prenese do ciljnega spletišča in v nadaljevanju s ciljnega spletišča neposredno nazaj na izvirno ter enolično referencira varnostno trditev (assertion).
2. Z obrazcem HTML, posredovanim s "POST": trditve SAML se po potrditvi naložijo v obrazec brskalnika (HTML form) in prenesejo do ciljnega spletišča kot del bremena HTTP POST.
Piškotki se v ta namen ne morejo uporabiti, ker bi v tem primeru obe spletišči morali pripadati isti domeni.
Enkratna prijava z artefaktom SAML
Denimo, da se je uporabnik s pomočjo varnega kanala overil na izvirnem spletišču. Za tem:
Vse te interakcije morajo potekati po varnem kanalu. Nadvse pomembno je, da nepooblaščeni ne pridobijo veljavnega artefakta, saj bi lahko z njegovo pomočjo izvajali storitve (npr. plačevali) na račun legalnega uporabnika.
Enkratna prijava z obrazcem
Vidimo, da sta pri tem postopku dva koraka manj in da izvirno in ciljno spletišče med seboj ne komunicirata neposredno. Če znova predpostavimo, da se je uporabnik že overil na izvirnem spletišču, sledi:
Tudi tu je zaželeno, da komunikacija poteka po varnem kanalu, posebej pomembno je, da nepooblaščeni ne pridobijo varnostne trditve, saj bi lahko z njeno pomočjo izvajali storitve v imenu legalnega uporabnika.
Ker je standard SAML načrtovan le za varno izmenjavo informacij za enkratno prijavo na ločena spletišča, ne opredeljuje, kako izvirna stran oziroma organ generiranja varnostnih trditev izvaja overitev uporabnikov. Uporablja lahko npr. PKI, sekljanje ali gesla.
Še en zgled rabe protokola SAML
<samlp:Request ...>
<samlp:AttributeQuery>
<saml:Subject>
<saml:NameIdentifier
SecurityDomain="sun.com"
Name="ivan"/>
</saml:Subject>
<saml:AttributeDesignator
AttributeName="Dohodek_Delavca"
AttributeNamespace="sun.com">
</saml:AttributeDesignator>
</samlp:AttributeQuery>
</samlp:Request>
Zahteva odvisne strani SAML izdajatelju varnostnih trditev za atribut "Dohodek_Delavca"
<samlp:Response
MajorVersion="1" MinorVersion="0"
RequestID="128.14.234.20.90123456"
InResponseTo="123.45.678.90.12345678"
StatusCode="/features/2004/05/Success">
<saml:Assertion
MajorVersion="1" MinorVersion="0"
AssertionID="123.45.678.90.12345678"
Issuer="Sun Microsystems, Inc."
IssueInstant="2004-01-14T10:00:23Z">
<saml:Conditions
NotBefore="2004-01-14T10:00:30Z"
NotAfter="2004-01-14T10:15:00Z" />
<saml:AuthenticationStatement
AuthenticationMethod="Password"
AuthenticationInstant="2004-01-14T10:00:20Z">
<saml:Subject>
<saml:NameIdentifier
SecurityDomain="sun.com"
Name="ivan" />
</saml:Subject>
</saml:AuthenticationStatement>
</saml:Assertion>
</samlp:Response>
Primer 2: Izdajatelj SAML v odgovoru izjavlja, da se je uporabnik pri njem overil z geslom 14. januarja 2004 ob deseti uri in dvajset sekund po univerzalnem času.
Vidimo, da odgovor ni povsem to, kar smo želeli, med drugim smo od izvirne strani želeli atribut "Dohodek_Delavca" za uporabnika z oznako "ivan", dobili pa smo le izjavo o overitvi. Dobimo namreč vse varnostne trditve, v katerih je uporabnik enak tistemu iz zahteve, ne glede na to, ali gre za overitev, atribut(e) ali odločitev o pravici izvedbe storitve oziroma uporabe vira. V našem primeru atributa morda ni.
Sklep
Označevalni jezik za varnostne trditve, ki temelji na XML, predstavlja infrastrukturo, potrebno za enkratno prijavo na več domensko različnih, čeprav poslovno povezanih spletnih mest. Osnova jezika so varnostne trditve (Security Assertion), ki jih tvorijo izvirne strani. Standard sestavlja še protokol zahteva-odgovor, ki določa, kako lahko odvisna stran preveri uporabnika, ki želi uporabljati njene storitve (ne da bi se tudi pri njej overil), pri izvirni strani. Protokol je v končni fazi izveden s pomočjo spletnih storitev in HTTP, na višji ravni pa izvirna stran, uporabnikov brskalnik in odvisna stran varno izvajajo enkratno prijavo z artefakti ali obrazci HTML/POST.
Več o SAML:
http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=security