Enkrat ni nobenkrat - vse o dvostopenjskem preverjanju

Objavljeno: 12.6.2018 | Avtor: Matej Huš | Kategorija: Fokus | Revija: Posebna 2018

Čedalje več storitev nam omogoča, da nastavimo dvostopenjsko preverjanje pristnosti ob prijavi. Za vstop ne zadostujeta več zgolj uporabniško ime in geslo, temveč moramo posredovati tudi enkratno geslo, ki ga ustvari pametni telefon ali namenska naprava. Tak način prijave precej omeji možnosti za vdor. Kako telefon ustvari veljavno enkratno geslo, če nima povezave z internetom?

Shema delovanja TOTP, ki ga poznamo iz Google Authenticatorja.

V resnici je prav presenetljivo, kako dolgo se je obdržala prijava izključno z uporabniškim imenom in geslom, ter tudi to, da še vedno veliko ljudi uporablja zgolj tak način. Človeška lenoba in prikladnost take prijave nista edina in verjetno niti prevladujoča razloga, saj marsikdo sploh ne ve, kaj je in čemu služi dvostopenjsko preverjanje pristnosti (TFA oziroma two-factor authentication). Medtem pa skorajda vsi uporabljajo bankomate, kjer je TFA v rabi že od pamtiveka.

Kupite!

Članek je del posebne številke Monitorja, posvečene kripto valutam, ki jo lahko kupite tukaj.

Si lahko predstavljate, da bi zgolj stopili do bankomata in denar dvignili brez bančne kartice, zgolj z vnosom svojega imena in PIN? Tako nekako poslujemo na spletu, kadar uporabljamo samo uporabniško ime in geslo. Po drugi strani bi bilo enako neverjetno, če bi lahko denar dvignili le z bančno kartico brez poznavanja kode PIN. Za uporabo bankomata moramo nekaj imeti (kartico) in nekaj poznati (PIN).

V teoriji računalniške varnosti pravimo, da se pristnost preverjanja na podlagi tega, kar imamo, poznamo (gesla) in smo (biometrika). TFA pomeni, da za avtorizacijo uporabimo dve različni komponenti in je podpomenka večstopenjske avtentikacije (MFA). Svojčas so bili v e-bančništvu priljubljeni različni fizični kalkulatorji, pogosto pa se je kot TFA uporabljala tudi sekundarna koda, ki smo jo prejeli kot SMS. Ta način ima nekaj pomanjkljivosti, predvsem pa v oči bode ranljivost mobilnih protokolov. Raziskovalci so že večkrat pokazali, da ni prav težko prestrezati sporočil SMS. SS7 (Signalling System No. 7), s katerim komunicirajo telefoni in omrežja, ima vrsto lukenj, ki omogočajo zasledovanje, prisluškovanje, pretvarjanje in prestrezanje. Nič ne kaže, da bi SS7, ki je bil razvit leta 1975, v prihodnosti zakrpali. Treba bo drugače.

Kaj hočemo

Z uporabniškim imenom in geslom torej še vedno predstavimo svojo istovetnost, z enkratnim geslom pa jo bomo potrdili. Premislimo, kaj zahtevamo od enkratnega gesla. Biti mora enkratno, torej moramo dobiti za vsako prijavo novo. Zaželeno je, da ima omejen rok trajanja. Geslo mora biti tako varno, da četudi nam ga napadalec izmakne, si po preteku roka trajanja z njim ne more pomagati. Ne sme omogočati, da bi kdo napovedal naslednja, rekonstruiral predhodna ali uganil algoritem itd. Hkrati mora biti to geslo dovolj enostavno, da ga lahko vsakokrat hitro vpišemo ob prijavi, sposobni pa ga moramo biti tvoriti tudi, če sekundarna naprava (navadno telefon) nima dostopa do interneta.

Težave z merjenjem časa

Unixov čas neprekinjeno tiktaka od leta 1970 in bo 19. januarja 2038 ob 3:14:07 po univerzalnem koordiniranem času dosegel vrednost 4.294,967.296 ali 2^32. Na 32-bitnih sistemih pričakujemo nekaj težav, saj se bo tedaj ponovil (rollover) od ničle dalje. Google Authenticator in ostali ponudniki ne bi smeli imeti težav, saj RFC6238 izrecno zahteva, da je implementacija TOTP odporna proti temu.

Še ena potencialna zagata so prestopne sekunde, ki jih Unixov čas ne upošteva, univerzalni pa. Ker se vrtenje Zemlje zelo počasi ustavlja, se lahko konec junija ali decembra doda (ali teoretično odvzame) sekunda, da je čas v skladu s sončnim. Pogostost prestopnih sekund ni predvidljiva, nazadnje pa smo jo dodali konec leta 2016. Najenostavnejša rešitev je Unixov čas, ki jih ne upošteva.

Potrebujemo za TFA atomske ure? Za implementacijo, ki je namenjena običajnim uporabnikom, nikakor ne, saj je okno veliko 30 sekund. Sekundna natančnost povsem zadostuje, TFA pa bo deloval tudi, če ura prehiteva ali zaostaja nekaj sekund. Za povrhu ima TFA vračunan tudi čas, ki ga človek povprečno potrebuje za vnos gesla.

Sistem bi lahko zakomplicirali in naredili strožjega ter ga s tem teoretično okrepili, a na varnost to nima vedno pozitivnega vpliva. Kadar postanejo varnosti protokoli preveč zamudni, jih ljudje začnejo izklapljati ali iskati bližnjice, kar ima na varnost negativen vpliv. Saj veste – če od ljudi zahtevamo, da si zapomnijo 32 nelogičnih znakov dolgo geslo, ga bodo pač nekam zapisali. Enako velja tudi drugod.

Google Authenticator je ena izmed storitev, ki ponuja prav to, obstajajo pa še številne druge (Authy, Microsoft Authenticator, 1Password itd.). V tem članku jih ne bomo primerjali, temveč si bomo ogledali princip delovanja TFA. Vse te storitve v osnovni ponujajo isto, se pa seveda razlikujejo v izvedbi. Nekatere podpirajo mobilne in navadne naprave (Authy), druge le mobilne naprave (Google Authenticator), ponekod ob izgubi telefona in ponastavitvi sledi obilica težav, drugod je postopek obnovitve lažji.

Kako deluje Google Authenticator

Google Authenticator je programski žeton, ki omogoča uporabo TFA za dostop do Googlovih in drugih storitev. Ker podpira odprte standarde, ga je mogoče uporabiti tudi za zaščito dostopa do drugih storitev, denimo Dropboxa. Google Authenticator podpira dva algoritma: TOTP in HOTP.

TOTP. TOTP (Time-based One-time Password Algorithm) za delovanje potrebuje skupno skrivnost (shared secret), točen čas in zgoščevalno funkcijo. Opisan je v RFC 6238. Osnovna zamisel je preprosta – ponudnik storitve nam prvič posreduje določene podatke, ki jih Google Authenticator vsakokrat uporabi in na njih izvede matematične operacije, da nastane enkratno geslo. Enake operacije se vsakokrat izvedejo tudi pri ponudniku storitve, ki tako lahko preveri, ali smo vnesli pravilno enkratno geslo (žeton).

Ob prvi uporabi Google Authenticatorja na neki strani moramo prebrati skupno skrivnost, ki je v obliki kode QR.

Ob vzpostavitvi TFA nam ponudnik storitve posreduje skupno skrivnost, in sicer je to v Google Authenticatorju 256-bitni ključ. To je tudi edini trenutek, ko mora komunicirati s ponudnikom storitve. Ključ, ki ga dobimo, lahko s telefonom posnamemo kot QR-kodo ali pa ga ročno vtipkamo. Ta se ne bo nikoli več spremenil (razen če seveda zamenjamo telefon).

Drugi sestavni del enkratnega gesla je čas. Zaradi tega je pomembno, da je ura na telefonu točna. Ne zahtevamo ravno natančnosti atomskih ur, vseeno pa ne sme zaostajati pet minut. V praksi se uporablja Unixov čas (število sekund od 1. 1. 1970), zaokrožen na 30 sekund. V okolju Windows obstaja zelo podoben čas, ki sicer teče v nanosekundah in ima drugačno epoho (začetno vrednost), a ga je mogoče enostavno preračunati v Unixov čas. Telefoni se redno sinhronizirajo z omrežnim časom, naprave z dostopom do interneta pa s strežniki NTP, zato zagotavljanje točnega časa ni težava. Če telefon vsaj občasno uporabimo, smo lahko prepričani, da bo kazal točen čas.

Tretji sestavni del je zgoščevalna ali podpisovalna funkcija, ki je v Google Authenticatorju HMAC-SHA1 (Hash-based message authentication code, SHA1 pa je algoritem). Zgoščevalne funkcije imajo uporabno lastnost, da iz vhodnih podatkov izračunajo izhod, ki je vedno enako dolg, a se iz njega nikakor ne da strukturirati vhoda. Že malenkostno različni vhodni podatki povzročijo, da se izhod popolnoma razlikuje. S tem zagotovimo, da si tudi s prestreženim enkratnim geslom nihče ne more pomagati, saj iz njega ne more izluščiti skupne skrivnosti.

Tehnična izvedba poteka takole. Skupna skrivnost, ki je na začetku v človeku prijaznem formatu, se spremeni v zapis, ki bo razumljiv funkcijam v nadaljevanju. To pomeni, da se porežejo presledki, male črke spremenijo v velike, nato pa se obravnava kot podatek v base32 – zapisan s črkami angleške abecede in števkami 2–7. Trenutni Unixov čas se celoštevilsko deli s 30. Potem izvedemo SHA1 na obdelani skrivnosti in času, nato pa rezultatu dodamo skrivnost in še enkrat izvedemo SHA1.

Rezultat SHA1 je dolg 20 bajtov, torej 40 znakov v heksadecimalnem zapisu, kar je preveč. Nihče ne želi vsakokrat ob prijavi pretipkavati 40 znakov, zato se rezultat še malo »polepša«. Vzamemo zadnje štiri bite končne vrednosti SHA1 (ki imajo lahko vrednost med 0 in 15) in jih uporabimo kot indeks v SHA1, ki nam pove, od kod naprej preberemo štiri bajte (offset). Ti predstavljajo 32-bitno nepredznačeno celo število, ki ga delimo z 1,000.000. Ostanek pri tem deljenju je šestmestno enkratno geslo. Ker enak postopek izvedeta Google Authenticator na telefonu ali tablici ter ponudnik storitve na strežniku, lahko slednji enostavno preveri pravilnost vpisanega enkratnega gesla.

S tem smo opisali konkretno tehnično implementacijo ene izmed možnosti TOTP. V splošnem pa se moramo sporazumeti o naslednjih podrobnostih: kaj bo skupna skrivnost oziroma začetni ključ, kateri čas in s kolikšno natančnostjo se bo uporabljal, katera zgoščevalna funkcija se bo uporabljala na ključu in točnem času, kateri del rezultata bomo uporabili kot enkratno geslo.

HOTP. HOTP (HMAC-based One-time Password algorithm) je druga možnost, ki je nekoliko manj varna. Opisana je v RFC 4226. Glavna razlika je nepotrebnost poznavanja časa, saj HOTP namesto točnega časa kot vhodni parameter uporablja števec, ki se poveča ob vsakem zahtevku za geslo. Stranska posledica je, da tako geslo načelno nima omejenega roka trajanja. Sicer pa je postopek v principu enak, izvedba pa je malo drugačna.

U2F

TOTP ima nekaj pomanjkljivosti. Zahteva vsakokratni ročni vnos enkratnega gesla, lahko ga napademo z MITM, je precej zapleten za izdelavo varnostnih kopij, posreduje skupno skrivnost v besedilni obliki, ki jo imata shranjeno tako ponudnik kot uporabnik. Napadalec jo lahko prestreže pri prvi prijavi ali pa pridobi z vdorom k ponudniku.

U2F je standard, ki ga je razvil FIDO Alliance (v njem sta tudi Google in Microsoft) in odpravlja te pomanjkljivosti. U2F uporablja fizični žeton, ki je v obliki USB-ključka, in ne potrebuje dodatnega vpisovanja enkratnega gesla. Deluje s pari zasebnih in javnih ključev. Na napravi imamo glavni zasebni ključ (secret key), ki ga ne moremo prebrati ali prekopirati.

Registracija poteka takole. Zasebni ključ za posamezno storitev se ob registraciji tvori iz domene (s tem preprečimo phishing), naključnega števila (nonce) in glavnega zasebnega ključa. Hkrati se tvorita še javni ključ in kontrolna vsota (checksum), ki ju skupaj z naključnim številom pošljemo ponudniku.

Ob vsaki uporabi storitve moramo nato zgolj vstaviti USB-ključ, ki bo od ponudnika prejel novo naključno število (challenge). Tega bo podpisal z zasebnim ključem in poslal nazaj storitvi, ki ga bo lahko dešifrirala z javnim ključem uporabnika in s tem preverila, ali ima uporabnik res dostop do zasebnega ključa, s čimer bo potrjena njegova istovetnost. Ker pa je zasebni ključ odvisen tudi od domene, smo s tem onemogočili napade MITM.

Tak način je še varnejši, a zahteva fizično napravo in podporo v brskalniku, kjer še ni samoumevna. Za zdaj ga v celoti podpirata Chrome in Firefox. Glavni prednosti pa sta odpornost proti okužbam (namensko USB-naprave ne moremo okužiti) ali napadu MITM (zasebni ključ kot vhodni podatek vzame tudi domeno) ter enostavnost uporabe (ni vpisovanja gesel).

U2F je TFA nove generacije, ki ne zahteva vpisovanja gesel.

Kako varna je TFA

TFA je brez dvoma varnejša od uporabe zgolj uporabniškega imena in gesla, ni pa naš račun zaradi tega stoodstotno varen, ker vam take zanesljivosti pač nihče pri zdravi pameti nikjer ne bo jamčil. TFA je mogoče napasti na več načinov. Lahko nam ukradejo napravo, ki jo uporabljamo zanjo, ali pa nam jo okužijo in ukradejo podatke. Na TOTP je mogoč napad s posrednikom (MITM), kjer zlikovec prestreže enkratno geslo in ga takoj uporabi. Dokler to stori v 30-sekundnem oknu, bo avtorizacija uspela. Potem obstajajo še različne vrste socialnega inženiringa, kjer nas lahko zlikovci prepričajo o izklopu TFA, lahko se izdajajo za nas in prosijo za obnovitev dostopa do računa ipd. A kot rečeno – TFA je velik korak naprej v varnosti.

Kadar imamo opraviti z denarjem, še zlasti če transakcije niso izpodbojne in obrnljive, je TFA tako rekoč nuja. Menjalnice za kriptovalute rutinsko ponujajo TFA vsaj za potrjevanje transakcij, večinoma pa že za prijavo. Dandanes bi lahko TFA šteli med običajno skrbnost dobrega gospodarja in ne več za tehnično rešitev za najbolj paranoične.

Naroči se na redna tedenska ali mesečna obvestila o novih prispevkih na naši spletni strani!
Prijava

ph

Komentirajo lahko le prijavljeni uporabniki