Igas suuremas ettevĂ”ttes, sealhulgas X5 Retail Groupis, suureneb projektide arv, kus on vajalik kasutajate autentimine. Aja jooksul on vajalik sujuv ĂŒleminek rakenduste vahel, millega kaasneb vajadus ĂŒhtse SSO-serveri jĂ€rele. Kuid kuidas toimida, kui sellised identiteedi pakkujad nagu AD vĂ”i muud, mis ei oma tĂ€iendavaid atribuute, on juba erinevates projektides kasutusel? Siin tulevad appi identiteedi vahendajate sĂŒsteemid. KĂ”ige funktsionaalsemad neist on viimaste esindajad, nagu Keycloak, Gravitee Access management jne. Kasutusskenaarid vĂ”ivad olla erinevad: masinavaheline suhtlemine, kasutajate osalemine jne. Lahendus peab toetama paindlikku ja skaleeritavat funktsionaalsust, mis suudab ĂŒhendada kĂ”ik nĂ”uded ĂŒhte, ning meie ettevĂ”ttes on selliseks lahenduseks praegu identiteedi vahendaja â Keycloak.

Keycloak â avatud lĂ€htekoodiga toode, mis on mĂ”eldud identiteedi ja juurdepÀÀsu kontrollimiseks ning mida toetab RedHat. See on aluseks ettevĂ”tte toodetele, mis kasutavad SSO â RH-SSO.
Peamised mÔisted
Enne lahenduste ja lÀhenemisviiside tÀpsustamist tuleb mÀÀratleda terminid ja protsesside jÀrjestus:

Identifitseerimine â see on isiku tuvastamise protseduur tema identifikaatori jĂ€rgi (lihtsalt öeldes, see on nime, kasutajanime vĂ”i numbri mÀÀramine).
Autentimine â see on autentimise kontrollimise protseduur (kasutaja tĂ”endatakse parooli, e-kirja digitaalse allkirja jms abil).
Autoriseerimine â see on juurdepÀÀsu andmine mingile ressursile (nĂ€iteks e-postile).
Identifitseerimisprokurör Keycloak
Keycloak â avatud lĂ€htekoodiga identiteedi ja juurdepÀÀsu haldamise lahendus, mĂ”eldud kasutamiseks teabe sĂŒsteemides, kus vĂ”ivad rakenduda mikroteenuste arhitektuuri mustrid.
Keycloak pakub funktsioone nagu ĂŒhekordne sisenemine (SSO), identiteedi vahendamine ja sotsiaalne sisenemine, kasutajate föderatsioon, kliendi adapterid, administraatori konsool ja konto haldamise konsool.
Keycloak toetab jÀrgmisi pÔhifunktsioone:
- Ăhekordne sisenemine ja ĂŒhekordne vĂ€ljumine brauserirakenduste jaoks.
- OpenID/OAuth 2.0/SAML toe pakkumine.
- Identiteedi vahendamine â autentimine vĂ€liste OpenID Connect vĂ”i SAML identiteedi pakkijate kaudu.
- Sotsiaalne sisenemine â tugi Google'i, GitHubi, Facebooki, Twitteri kaudu kasutajate tuvastamiseks.
- Kasutajate föderatsioon â kasutajate sĂŒnkroniseerimine LDAP ja Active Directory serveritest ja muudest identiteedi pakkijatest.
- Kerberose sild â Kerberose serveri kasutamine kasutajate automaatseks autentimiseks.
- Administraatori konsool â seadete ja lahenduse parameetrite haldamiseks veebis.
- Konto haldamise konsool â kasutajaprofiili iseseisvaks haldamiseks.
- Lahenduse kohandamine ettevÔtte brÀndi stiilist lÀhtuvalt.
- 2FA autentimine â TOTP/HOTP tugi Google Authenticatori vĂ”i FreeOTP abil.
- Sisselogimise vood â toetada on vĂ”imalik iseregistreerimist, parooli taastamist ja lĂ€htestamist ning muud.
- Seansihalduse haldamine â administraatorid saavad hallata kasutajate seansse ĂŒhest kohast.
- Tokeni kaardistajad â kasutajate, rollide ja teiste nĂ”utud atribuutide sidumine tokenitega.
- Paindlik poliitikahaldus realm'i, rakenduste ja kasutajate kaudu.
- CORSi tugi â kliendiadapteritel on sisseehitatud CORSi tugi.
- Teenusepakkuja liidesed (SPI) â suur hulk SPI-sid, mis vĂ”imaldavad kohandada serveri erinevaid aspekte: autentimistooted, identifitseerimisprotsessorid, protokollide kaardistamine ja palju muud.
- Kliendiadapterid JavaScripti rakenduste, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring jaoks.
- Toetab töö töötlemist erinevate rakendustega, mis toetavad OpenID Connect Relying Party library vÔi SAML 2.0 Service Provider Library.
- Laienemise vÔimalus pluginate kasutamise kaudu.
CI/CD protsesside ning Keycloak'i haldusprotsesside automatiseerimiseks vÔib kasutada REST API / JAVA API. Dokumentatsioon on elektrooniliselt saadaval:
REST API
JAVA API
EttevÔtte taseme identifitseerimisprotsessorid (On-Premise)
Kasutajate autentimise vÔimalus User Federation teenuste kaudu.

Samuti vĂ”ib kasutada ĂŒhtset autentimist â kui kasutajad logivad sisse tööstustes Kerberos (LDAP vĂ”i AD) kaudu, saavad nad automaatselt autentida Keycloak'is, ilma et peaksid uuesti sisestama oma kasutajanime ja parooli.
Kasutajate autentimiseks ja jÀrgnevaks autoriseerimiseks on vÔimalik kasutada relatsioonilist andmebaasi, mis on kÔige sobivam arenduskeskkondades, kuna see ei nÔua pikaajalisi seadistusi ja integreerimisi projekti varases etapis. Keycloak kasutab vaikimisi sisseehitatud andmebaasi seadete ja kasutajaandmete salvestamiseks.
Toetatud andmebaaside loetelu on ulatuslik ja sisaldab: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle ja teised. Praegu on kÔige enam testitud Oracle 12C Release1 RAC ja Galera 3.12 klaster MariaDB 10.1.19 jaoks.
Identiteedipakkujad â sotsiaalne sisselogimine
Sotsiaalmeedia sisselogimise kasutamine on vĂ”imalik. Kasutajate autentimise aktiveerimiseks kasutatakse Keycloak'i administreerimiskonsooli. Rakenduste koodis muudatusi ei kĂŒsita, ning see funktsionaalsus on saadaval "vĂ€lja pakutud" ja seda saab aktiveerida projekti igas etapis.

Kasutajate autentimiseks on vÔimalik kasutada OpenID/SAML identiteeditarnijaid.
TĂŒĂŒpilised autoriseerimisstsenaariumid OAuth2 kasutamisel Keycloak'is
AutoriseerimisvĂ”ti voog â kasutatakse serveripĂ”histes rakendustes (server-side applications). Ăks levinumaid vĂ”tmemeetodeid, kuna see sobib hĂ€sti serveripĂ”histele rakendustele, mille lĂ€htekood ja kliendiandmed ei ole kolmandatele isikutele kergesti kĂ€ttesaadavad. Protsess pĂ”hineb sel juhul ĂŒmbersuunamisel (redirection). Rakendus peab olema vĂ”imeline suhtlema kasutajaagendi (user-agent), nĂ€iteks veebibrauseriga â saama autoriseerimise koode, mis on ĂŒmbersuunatud lĂ€bi kasutajaagendi.
Implitsiitne voog â kasutatakse mobiilsete vĂ”i veebirakenduste (rakendused, mis töötavad kasutaja seadmes).
Kaudne autoriseerimise tĂŒĂŒp on mĂ”eldud mobiil- ja veebirakendustele, kus kliendi konfidentsiaalsust ei saa garantiida. Kaudne autoriseerimise tĂŒĂŒp kasutab ka kasutajaagendi ĂŒmber suunamist, mille kĂ€igus edastatakse juurdepÀÀsutoken kasutajaagendile rakenduses edasiseks kasutamiseks. See muudab tokeni kergesti kĂ€ttesaadavaks kasutajale ja teistele rakendustele tema seadmes. Selle autoriseerimise tĂŒĂŒbi puhul ei toimu rakenduse autentimise kontrollimist ning kogu protsess toetub ĂŒmber suunamise URL-ile (mis on eelnevalt teenuses registreeritud).
Kaudne voog ei toeta juurdepÀÀsutokeni vÀrskendustokenite (refresh tokens) kasutamist.
Kliendi mandaadi autoriseerimise voog â kasutatakse rakenduste juurdepÀÀsuks API-le. See autoriseerimise tĂŒĂŒp on tavaliselt mĂ”eldud server-server interaktsioonideks, mis peavad toimuma taustal ilma otsese kasutajaga suhtlemiseta. Klientide mandaadi voog vĂ”imaldab veebiteenustel (privaatsetel klientidel) kasutada oma mandaate ilma kasutaja autentimise vajaduseta, kui kutsutakse teist veebiteenust. KĂ”rgema turvalisuse tagamiseks vĂ”ib kutse teenus kasutada sertifikaati (ĂŒldise salajase asemel) mandaadina.
OAuth2 spetsifikatsioon on kirjeldatud
JWT token ja selle eelised
JWT (JSON Web Token) on avatud standard (), mis mÀÀratleb kompaktsed ja iseseisvad viisid teabe turvaliseks edastamiseks osapoolte vahel JSON-objekti kujul.
Standardi kohaselt koosneb token kolmest osast, mis on jagatud punktidega base-64 formaadis. Esimene osa on pealkiri (header), mis sisaldab tokeni tĂŒĂŒpi ja digitaalallkirja genereerimiseks kasutatava rĂ€si algoritmi nime. Teine osa sisaldab pĂ”hiteavet (kasutaja, atribuudid jne). Kolmas osa on digitaalallkiri.
..
Ărge salvestage tokenit oma andmebaasi. Kuna kehtiv token on ekvivalentne parooliga, on tokeni salvestamine sama, mis parooli avatud kujul salvestamine.
Access-token on token, mis annab oma omanikule juurdepÀÀsu serveri kaitstud ressurssidele. Tavaliselt on sellel lĂŒhike kehtivusaeg ja see vĂ”ib sisaldada tĂ€iendavat teavet, nĂ€iteks IP-aadressi, mis kĂŒsib antud tokenit.
Refresh-token on token, mis vÔimaldab klientidel taotleda uusi access-token'e nende kehtivuse lÔppemise jÀrel. Need tokenid vÀljastatakse tavaliselt pikemaks ajaks.
Mikroteenuste arhitektuuris rakendamise peamised eelised:
- VĂ”imalus pÀÀseda erinevatele rakendustele ja teenustele ĂŒhekordse autentimise kaudu.
- Kui kasutajaprofiilides puuduvad mitmed vajalikud atribuudid, on vĂ”imalik andmete tĂ€iendamine, sealhulgas automatiseeritult ja âreaalajasâ.
- Pole vajalik aktiveeritud sessioonide teabe sÀilitamine, serverirakendus peab lihtsalt kontrollima allkirja.
- Paindlikum juurdepÀÀsuhaldus lisatud atribuutide kaudu kannetes.
- Tokeni allkirja rakendamine pĂ€ises ja kasulikus koormuses suurendab lahenduse ĂŒldist turvalisust.
JWT token â koostis
PĂ€is â vaikimisi sisaldab pĂ€is vaid tokeni tĂŒĂŒpi ja algoritmi, mis on kasutusel krĂŒptimiseks.
Tokeni tĂŒĂŒp salvestatakse vĂ”tmes âtypâ. VĂ”tit âtypâ ignoreeritakse JWT-s. Kui vĂ”ti âtypâ on olemas, peab selle vÀÀrtus olema JWT, et nĂ€idata, et see objekt on JSON Web Token.
Teine vĂ”ti âalgâ mÀÀrab algoritmi, mis on kasutusel tokeni krĂŒptimiseks. Vaikimisi peab see olema seatud HS256. PĂ€is kodeeritakse base64.
{ "alg": "HS256", "typ": "JWT" }
Payload (sisu) â koormas hoitakse igasugust teavet, mida on vaja kontrollida. Iga vĂ”tme nimi koormas tuntakse kui âdeklaratsioonâ. NĂ€iteks saab rakendusse siseneda ainult kutsega (suletud kampaania). Kui soovime kedagi osalema kutsuda, saadame talle kutse. Oluline on kontrollida, et e-posti aadress kuulub kutset vastu vĂ”tvale isikule, seetĂ”ttu lisame selle aadressi koormasse, salvestades selle vĂ”tmesse âe-mailâ.
{ "email": "example@x5.ru" }
Koormas olevad vÔtmed vÔivad olla suvalised. Siiski on mÔned reserveeritud:
- iss (Issuer) â mÀÀratleb rakenduse, kust token saadetakse.
- sub (Subject) â mÀÀratleb tokeni teema.
- aud (Audience) â juhtumiga tundlikest stringidest vĂ”i URI-st koosnev massiiv, mis on lĂ”petajate nimekiri selle tokeni saamiseks. Kui vastuvĂ”tja saab antud vĂ”tmega JWT, peab ta kontrollima, kas ta on lĂ”petajate seas â muidu ignoreeritakse tokenit.
- exp (Aegumistumine) â nĂ€itab, millal mĂ€rgendi kehtivusaeg lĂ”ppeb. JWT standard nĂ”uab, et kĂ”ikide selle rakenduste kehtetuks muutunud mĂ€rgid tuleks tagasi lĂŒkata. Exp vĂ”ti peab olema ajatemperatuur unix-format.
- nbf (Ei Enne) â unix-formaadis aeg, mis mÀÀrab hetke, mil token muutub kehtivaks.
- iat (VĂ€lja Antud Aeg) â see vĂ”ti esindab aega, mil mĂ€rgend anti vĂ€lja ja seda saab kasutada JWT vanuse mÀÀramiseks. iat vĂ”ti peab olema ajatemperatuur unix-format.
- Jti (JWT ID) â string, mis mÀÀrab antud tokeni unikaalse identifikaatori, arvestades suur- ja vĂ€iketĂ€hti.
Oluline on mĂ”ista, et kasulikkoormus ei edastata krĂŒpteeritud kujul (kuigi, tokenid vĂ”ivad olla pesakestes ning siis on vĂ”imalik edastada krĂŒpteeritud andmeid). SeetĂ”ttu ei saa selle sees hoida mingeid salajasi andmeid. Nagu ka pealkiri, kodeeritakse kasulikkoormus base64.
Allkiri â kui meil on pealkiri ja kasulikkoormus, saame arvutada allkirja.
Base64-s varjatud: pĂ€is ja payload ĂŒhendatakse punktiga. SeejĂ€rel antakse see string ja salajane vĂ”ti ĆĄifreerimise algoritmi, mis on mÀÀratud pĂ€ises (vĂ”ti âalgâ). VĂ”tmena vĂ”ib kasutada mistahes stringi. Pikemad stringid on eelistatavad, kuna nende lahti harutamine nĂ”uab rohkem aega.
{"alg":"RSA1_5","payload":"A128CBC-HS256"}
KaheksateistkĂŒmnenda vĂ”tme jaoks ilma katkestusteta arhitektuuri loomine
Ăhe klastriga, mis pĂ€rast vĂ€ljatĂ”stmist alates tehtud projektidest tuleb SSO lahendust kasutada, on nĂ”uded suurenenud. Kui projektide arv on vĂ€ike, ei ole need nĂ”uded kĂ”ikide projektide jaoks kiivalt tajutavad, kuid kasutajate ja integratsioonide arvu suurenedes tĂ”usevad nĂ”uded kĂ€ttesaadavusele ja jĂ”udlusele.
Ăhtse SSO rikkumisriskide suurenemine tĂ”stab lahenduse arhitektuuri ja kasutatavate komponentide varukoopia meetodite nĂ”udmisi, tuues kaasa vĂ€ga range SLA. SeetĂ”ttu on tĂ”enĂ€olisem, et lahenduste arendamise vĂ”i varajases rakendamisfaasis on projektidel oma mitte-ei-rafika infrastruktuur. Arengu kĂ€igus tuleb sisse ehitada arendamise ja laiendamise vĂ”imalused. KĂ”ige paindlikum on ehitada katkestusteta klaster konteinerite virtualiseerimise vĂ”i hĂŒbriidse lĂ€henemise abil.
Active/Active ja Active/Passive klastereĆŸiimide tööks on vajalik tagada andmete jĂ€rjepidevus relatsioonilises andmebaasis â mĂ”lemad andmebaasi sĂ”lmed peavad olema erinevate geograafiliste andmekeskuste vahel sĂŒnkroonselt replitseeritud.
Lihtsaim katkestusteta installatsiooni nÀide.

Millised on ĂŒhtse klustru kasutamise eelised:
- KÔrge kÀttesaadavus ja jÔudlus.
- TööreĆŸiimide toetamine: Active/Active, Active/Passive.
- DĂŒnaamilise skaleerimise vĂ”imalus â konteinerite virtualiseerimise kasutamisel.
- Tsentraliseeritud halduse ja jÀlgimise vÔimalus.
- Ăksne lĂ€henemine kasutajate tuvastamiseks/autentimiseks/autoriseerimiseks projektides.
- Selgem koostöö erinevate projektide vahel ilma kasutajate osaluseta.
- VÔimalus jagada JWT tokenit erinevates projektides.
- Ăksne usalduspunkt.
- Kiirem projektide kĂ€ivitamine mikroteenuste/konteinervirtualiseerimise abil (ei ole vaja tĂ€iendavate komponentide ĂŒlesseadmist ja konfigureerimist).
- VÔimalik osta kaubanduslikku tuge tootjalt.
Millele tÀhelepanu pöörata klastrit planeerides
ANDMEBAASIDE haldamiseks.
Keycloak kasutab andmehalduse sĂŒsteemi realmide, klientide, kasutajate jms salvestamiseks.
Toetatakse suurt valikut andmebaasidĂŒsteeme: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak on varustatud oma sisseehitatud relatsioonilise andmebaasiga. Soovitatav kasutada madala koormusega keskkondades, nagu arenduskeskkonnad.
Active/Active ja Active/Passive klasstri tööks on vajalik andmete jĂ€rjepidevuse tagamine relatsioonilises andmebaasis ning mĂ”lemad andmebaasi klastriga sĂ”lmed replikatakse sĂŒnkroonselt andmekeskuste vahel.
Jaotatud vahemÀlu (Infinispan)
Klasteri nĂ”uetekohaseks toimimiseks on vajalik tĂ€iendav sĂŒnkroniseerimine jĂ€rgmiste vahemĂ€lu tĂŒĂŒpidega, kasutades JBoss Data Grid:
Autentimisistungid â kasutatakse konkreetse kasutaja autentimise andmete salvestamiseks. Selle vahemĂ€lu pĂ€ringud hĂ”lmavad tavaliselt ainult veebibrauserit ja Keycloak serverit, mitte rakendust.
Tegevusmargid â kasutatakse stsenaariumides, kus kasutaja peab toimingu kinnitama asĂŒnkroonselt (e-posti teel). NĂ€iteks parooli unustamise voos kasutatakse actionTokens vahemĂ€lu Infinispan, et jĂ€lgida seotud tegevusmĂ€rkide metaandmeid, mis on juba kasutatud, seetĂ”ttu ei saa neid uuesti kasutada.
PĂŒsiva andmete vahemĂ€lu ja tĂŒhistamine â kasutatakse pĂŒsivate andmete vahemĂ€llu salvestamiseks, et vĂ€ltida liigseid pĂ€ringuid andmebaasile. Kui mĂ”ni Keycloak server vĂ€rskendab andmeid, peavad kĂ”ik ĂŒlejÀÀnud Keycloak serverid kĂ”igis andmekeskustes sellest teadma.
Töö â kasutatakse ainult teate edastamiseks tĂŒhistamisest klastris sĂ”lmede ja andmekeskuste vahel.
Kasutaja seansid â kasutatakse selleks, et salvestada andmeid kasutaja seansist, mis on kehtivad kasutaja brauseri seansi jooksul. VahemĂ€lu peab töötlema lĂ”ppkasutaja ja rakenduse HTTP-pĂ€ringuid.
JĂ”hkrate rĂŒnnakute kaitse â kasutatakse, et jĂ€lgida andmeid ebaĂ”nnestunud sissetuleku katsetest.
Koormuse jaotamine
Koormuse jaotaja on keycloaki ainus sisenemispunkt ja see peab toetama liigseid seansse.
Rakenduste serverid
Kasutatakse komponentide omavahelise suhtluse kontrollimiseks ning need vĂ”ivad olla virtualiseeritud vĂ”i konteineriseeritud, kasutades olemasolevaid automatiseerimise vahendeid ja infrastruktuuri dĂŒnaamilist skaleerimist. KĂ”ige levinumad juurutusskeemid OpenShiftis, Kubernates, Rancheris.
Sellega on esimene osa â teoreetiline â lĂ”petatud. JĂ€rgmistes artiklite tsĂŒklites kĂ€sitletakse erinevate identiteedi pakkujatega integreerimise nĂ€iteid ja seadistuse nĂ€iteid.
Allikas: habr.com
