SSO mikroteenuste arhitektuuris. Kasutame Keycloak'i. Osa nr 1

Igasse suuremate ettevĂ”tete, sh X5 Retail Group, arenguga suureneb projektide arv, kus on vajalik kasutajate volitamine. Aja jooksul muutub oluline sujuv ĂŒleminek kasutajatelt ĂŒhelt rakenduselt teisele ning seetĂ”ttu tekib vajadus kasutada ĂŒhtset sisselogimisserverit Single-Sign-On (SSO). Kuid kuidas toimida, kui selliseid identifitseerimisteenuse pakkujaid nagu AD vĂ”i teised, kellel puuduvad tĂ€iendavad atribuudid, juba kasutatakse erinevates projektides? Siinkohal aitavad sĂŒsteemid, mida nimetatakse „identifitseerimisbroukeriteks“. KĂ”ige funktsionaalsemad esindajad on sellised nagu Keycloak, Gravitee Access management jpt. Kasutusskeemid vĂ”ivad olla erinevad: masinlik suhtlemine, kasutajate osalemine jne. Lahendus peab toetama paindlikku ja skaleeritavat funktsionaalsust, mis suudab kĂ”ik nĂ”uded ĂŒhte koondada, ja selliseks lahenduseks meie ettevĂ”ttes on praegu identifitseerimisbrouker – Keycloak.

SSO mikroteenuste arhitektuuris. Kasutame Keycloak'i. Osa nr 1

Keycloak on avatud lĂ€htekoodiga toode, mis on mĂ”eldud identifitseerimise ja juurdepÀÀsu kontrollimiseks ning mille toetab RedHat. See on aluseks tooted, mis kasutavad SSO – RH-SSO.

PÔhimÔisted

Enne lahenduste ja lÀhenemiste uurimist tuleks selgeks teha terminid ja protsesside jÀrjekord:

SSO mikroteenuste arhitektuuris. Kasutame Keycloak'i. Osa nr 1

Identifitseerimine — see on kĂ€itumise tuvastamise protseduur tema identifikaatori pĂ”hjal (lihtsalt öeldes, see on nime, sisselogimise vĂ”i numbri mÀÀramine).

Ahnikeerimine – see on autentimise protseduur (kasutajat kontrollitakse parooliga, kirja kontrollitakse digitaalse allkirjaga jne.)

Autoriseerimine – see on juurdepÀÀsu andmine mingile ressursile (nĂ€iteks e-posti jaoks).

Identifitseerimisbrouker Keycloak

Keycloak — see on avatud lĂ€htekoodiga identiteedi ja juurdepÀÀsu haldamise lahendus, mis on mĂ”eldud kasutamiseks infosĂŒsteemides, kus vĂ”ivad kasutada mikroteenuste arhitektuuri mustreid.

Keycloak pakub selliseid funktsioone nagu ĂŒhtne sisselogimine (SSO), identifitseerimise brokering ja sotsiaalne sisselogimine, kasutajate föderatsioon, kliendiadapterid, administraatori konsool ja konto haldamise konsool.

Keycloak'is toetatav pÔhifunktsionaalsus:

  • Single-Sign On ja Single-Sign Out brauserirakenduste jaoks.
  • OpenID/OAuth 2.0/SAML toe pakkumine.
  • Identiteed Curate – autentimine vĂ€liste OpenID Connect vĂ”i SAML identiteedi pakkujate kaudu.
  • Sotsiaalne sisselogimine – toe pakkumine Google'ilt, GitHubilt, Facebookilt, Twitterilt kasutajate tuvastamiseks.
  • Kasutajate föderatsioon – kasutajate sĂŒnkroniseerimine LDAP ja Active Directory serveritest ning teistest identiteedi pakkujatest.
  • Kerberos sild – Kerberos serveri kasutamine kasutajate automaatseks autentimiseks.
  • Administreerimise konsool — lahenduse seadete ja parameetrite ĂŒhtne haldamine veebis.
  • Kontohalduskonsool – iseseisev kasutajaprofiilide haldamine.
  • Lahenduse kohandamine ettevĂ”tte kaubamĂ€rgi stiili alusel.
  • 2FA autentimine – TOTP/HOTP toe pakkumine Google Authenticatori vĂ”i FreeOTP kaudu.
  • Sisselogimise protsessid – kasutajate iseregistreerimise, parooli taastamise ja lĂ€htestamise vĂ”imalused jne.
  • Seansi haldus – administraatorid saavad hallata kasutajate sessioone ĂŒhest kohast.
  • Token Mappers – kasutajate atribuutide, rollide ja muude vajalike atribuutide sidumine tokenitega.
  • Paindlik poliitika haldamine realm'i, rakenduse ja kasutajate kaudu.
  • CORS tugi – kliendiadapterid sisaldavad sisseehitatud CORS vaikeseadeid.
  • Teenuse pakkujate liidesed (SPI) – suur hulk SPI-sid, mis vĂ”imaldavad seadistada serveri erinevaid tööaspekte: autentimisvood, identiteedi pakkujad, protokollide sidumine ja palju muud.
  • Kliendiadapterid JavaScripti rakendustele, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • Toe pakkumine erinevatele rakendustele, mis toetavad OpenID Connecti sĂ”ltuvat teeki vĂ”i SAML 2.0 teenuse pakkujate teeki.
  • LaienemisvĂ”imalus plugin'ide abil.

CI/CD protsesside jaoks ning ka Keycloakis haldustegevuste automatiseerimiseks vÔib kasutada REST API / JAVA API. Dokumentatsioon on saadaval elektrooniliselt:

REST API https://www.keycloak.org/docs-api/8.0/rest-api/index.html
JAVA API https://www.keycloak.org/docs-api/8.0/javadocs/index.html

EttevÔtte taseme identiteedi pakkujad (On-Premise)

Kasutajate autentimise vÔimalus User Federation teenuste kaudu.

SSO mikroteenuste arhitektuuris. Kasutame Keycloak'i. Osa nr 1

Samuti vĂ”ib kasutada lĂ€bivat autentimist – kui kasutajad autentitakse töölauaarvutites Kerberos'ega (LDAP vĂ”i AD), saavad nad Keycloak'is automaatselt autentida ilma taas kasutajanime ja parooli sisestamiseta.

Kasutajate autentimiseks ja edasiseks autoriseerimiseks on vÔimalik kasutada relatsioonilist andmebaasi, mis on kÔige asjakohasem arenduskeskkondades, kuna see ei nÔua pikaajalisi seadistusi ja integreerimisi projektide algstaadiumis. Vaikimisi kasutab Keycloak seadeid ja kasutajaandmete salvestamiseks sisseehitatud andmebaasi.

Toetatud andmebaaside loetelu on ulatuslik ja sisaldab: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle ja teised. Praegu on kÔige rohkem testitud Oracle 12C Release1 RAC ja Galera 3.12 klaster MariaDB 10.1.19 jaoks.

Identifitseerimisproviderid — sotsiaalne sisselogimine

Sotsiaalmeedia sisselogimise kasutamine on vÔimalik. Kasutajate autentimise vÔimaluse aktiveerimiseks kasutatakse Keycloacki administraatori konsooli. Rakenduste koodis ei ole muudatusi vajalikud ja see funktsionaalsus on saadaval 'karbist vÀlja' ning vÔib olla aktiveeritud projekti igas staadiumis.

SSO mikroteenuste arhitektuuris. Kasutame Keycloak'i. Osa nr 1

Kasutajate autentimiseks on vÔimalik kasutada OpenID/SAML identiteedi proviidereid.

TĂŒĂŒpilised autoriseerimisstsenaariumid OAuth2 kasutamisel Keycloakis

Autoriseerimistunnuse voog — kasutatakse serveripoolsete rakenduste (server-side applications) puhul. Üks levinumaid autoriseerimistunnustamiseks kasutatavaid meetodeid, kuna see sobib hĂ€sti serveripoolsetele rakendustele, mille kood ja kliendiandmed ei ole kolmandatele isikutele ligipÀÀsetavad. Protsess tugineb selles juhul ĂŒmbersuunamisele (redirection). Rakendus peab olema vĂ”imeline suhtlema kasutajaagendiga, nagu veebibrauser — saama autoriseerimistunnuseid API kaudu, mis suunatakse ĂŒmber kasutajaagendi kaudu.

Kaudne voog — kasutatakse mobiilsete vĂ”i veebirakenduste jaoks (rakendused, mis töötavad kasutaja seadmes).

Implitsiitne volitus on kasutusel mobiil- ja veebirakendustes, kus kliendi privaatsust ei saa tagada. Implitsiitne volitus kasutab ka kasutaja agendi ĂŒmber suunamist, kus pÀÀsukood edastatakse kasutaja agendile rakenduses edasiseks kasutamiseks. See teeb koodi kergesti kĂ€ttesaadavaks kasutajale ja teistele rakendustele kasutaja seadmes. Sellise volituse korral ei toimu rakenduse autentimist ning protsess tugineb ĂŒmber suunamise URL-ile (eelnevalt teenuses registreeritud).

Implitsiitne voog ei toeta pÀÀsukoodide uuendamise tokenite (refresh tokens) kasutamist.

Kliendi mandaadi andmise voog — kasutatakse rakenduse juurdepÀÀsuks API-le. See volitus on tavaliselt mĂ”eldud server-server interaktsioonideks, mis toimuvad taustal ilma vahetu kasutaja sekkumiseta. Kliendi mandaadi voog vĂ”imaldab veebiteenusel (privaatne klient) kasutada oma mandaate, mitte kasutaja identiteeti, autentimiseks teise veebiteenuse kutsumisel. KĂ”rgema turvalisuse taseme saavutamiseks vĂ”ib kutse teenus kasutada mandaadiks sertifikaati (ĂŒldise salajase asemel).

OAuth2 spetsifikatsioon on kirjeldatud
RFC-6749
RFC-8252
RFC-6819

JWT token ja tema eelised

JWT (JSON Web Token) — avatud standard (https://tools.ietf.org/html/rfc7519), mis mÀÀrab kindlaks kompaktse ja autonoomse viisi teabe turvaliseks edastamiseks osaliste vahel JSON-objekti kujul.

Standardi kohaselt koosneb token kolmest osast base-64 formaadis, mida eraldavad punktid. Esimene osa on pealkiri (header), milles on tokeni tĂŒĂŒp ja hĂ€kkimise algoritmi nimi, et saada digitaalallkiri. Teine osa salvestab pĂ”hiteabe (kasutaja, atribuute jne). Kolmas osa on digitaalne allkiri.

<encoded header>.<encoded payload>.<signature>
Ärge kunagi salvestage tokenit oma andmebaasi. Sest kehtiv token on vĂ”rdne parooliga, tokeni salvestamine on nagu parooli salvestamine selgesĂ”naliselt.
PÀÀsutoken — see on token, mis annab selle omanikule juurdepÀÀsu serveri kaitstud ressurssidele. Tavaliselt on selle kehtivusaeg lĂŒhike ja see vĂ”ib sisaldada tĂ€iendavat teavet, nagu kliendi IP-aadress, kes seda tokenit kĂŒsib.

Refresh-token — see on token, mis vĂ”imaldab klientidel taotleda uusi access-token'e nende kehtivusaja lĂ”ppedes. Need tokenid antakse tavaliselt pika aja eest.

Peamised eelised mikroteenuste arhitektuuris:

  • Eri rakenduste ja teenuste juurde pÀÀsemine ĂŒhe autentimise kaudu.
  • Kui kasutajate profiilides puuduvad vajalikud atribuudid, vĂ”ib andmeid rikastada, sealhulgas automatiseeritult ja
  • Info aktiivsete sessioonide hoidmine pole vajalik, serveri rakendus peab vaid kontrollima allkirja.
  • Paindlikum juurdepÀÀsu haldamine tĂ€iendavate atribuutide abil kasulikus laadimises.
  • Tokeni allkirja rakendamine pĂ€ises ja kasulikes laadimistes suurendab lahenduse ĂŒldist turvalisust.

JWT token — koosseis

Pealkiri — vaikimisi sisaldab pĂ€is ainult tokeni tĂŒĂŒpi ja algoritmi, mis on kasutusel krĂŒpteerimiseks.

Tokeni tĂŒĂŒp hoitakse vĂ”tmes "typ". VĂ”tme "typ" ignoreerib JWT. 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 tokeni krĂŒpteerimiseks kasutatava algoritmi. Vaikimisi peaks see olema seadistatud HS256. PĂ€is kodeeritakse base64.

{ "alg": "HS256", "typ": "JWT"}
Payload (sisu) — kasulikes laadimistes hoitakse igasugust teavet, mida tuleb kontrollida. Iga vĂ”ti kasulikes laadimistes on tuntud kui "deklareering". NĂ€iteks, rakendusse saab sisse logida ainult kutse alusel (suletud kampaania). Kui me soovime kedagi kutsea, saadame talle kutse. Oluline on kontrollida, et e-posti aadress kuulub inimesele, kes kutset aktsepteerib, seega lisame selle aadressi kasuliku laadimise, selle jaoks salvestame selle vĂ”tmesse "e-mail".

{ "email": "example@x5.ru" }

Payloadi vÔtmed vÔivad olla suvalised. Siiski on mÔningaid reserveeritud:

  • iss (Issuer) — mÀÀrab rakenduse, millest token saadetakse.
  • sub (Subject) — mÀÀratleb tokeni teema.
  • aud (Audience) – suurtundlikest stringidest vĂ”i URI-dest koosnev massiiv, mis on selle tokeni saajate loetelu. Kui vastuvĂ”tja saab JWT koos selle vĂ”tmega, peab ta kontrollima, kas ta on saajate hulgas — muidu tuleb token ignoreerida.
  • exp (Expiration Time) — nĂ€itab, millal tokeni kehtivus lĂ”ppeb. JWT standard nĂ”uab, et kĂ”ikides oma rakendustes lĂŒkataks tagasi aegunud tokeneid. Exp vĂ”ti peab olema Unix vormingus ajatempring.
  • nbf (Not Before) — see on Unix vormingus aeg, mis mÀÀratleb, millal token hakkab kehtima.
  • iat (Issued At) — see vĂ”ti esindab aega, millal token anti vĂ€lja ja seda saab kasutada JWT vanuse mÀÀramiseks. iat vĂ”ti peab olema Unix vormingus ajatempring.
  • Jti (JWT ID) — string, mis mÀÀratleb selle tokeni unikaalse identifikaatori, arvestades suurtundlikkust.

Oluline on mĂ”ista, et koormust ei edastata krĂŒpteeritud kujul (kuigi tokenid vĂ”ivad olla pesakonnas ja siis on vĂ”imalik edastada krĂŒpteeritud andmeid). Seega ei saa selles salvestada mingeid salajasi andmeid. Nagu pealkiri, kodeeritakse koormus base64.
Allkiri — kui meil on pealkiri ja koormus, saame arvutada allkirja.

VĂ”etakse base64 kodeeritud pealkiri ja koormus, need ĂŒhendatakse punktiga stringiks. SeejĂ€rel antakse see string ja salajane vĂ”ti krĂŒpteerimise algoritmi, mis on mÀÀratud pealkirjas (vĂ”ti «alg»). VĂ”ti vĂ”ib olla mis tahes string. Pikemad stringid on eelistatavamad, kuna nende leidmiseks kulub rohkem aega.

{"alg":"RSA1_5", "payload":"A128CBC-HS256"}

Keycloaki talitlushÀiredeta klastrite arhitektuuri loomine

Kuna kasutatakse ĂŒhte klastrit kĂ”igi projektide jaoks, tĂ”usevad SSO lahenduse nĂ”udmised. Kui projektide arv on vĂ€ike, ei ole see vĂ€gagi tundlik, kuid kasutajate ja integratsioonide arvu suurenedes kasvavad nĂ”udmised kĂ€ttesaadavuse ja jĂ”udluse osas.

Üheainsa SSO tĂ”usvad riskid suurendavad lahenduse arhitektuuri ja kasutatavate komponentide varukoopiate nĂ”udeid, tuues kaasa vĂ€ga range SLA. SeetĂ”ttu on sageli lahenduste arendamise vĂ”i varases rakendamisfaasis projektidel oma mittetĂ€iendav infrastruktuur. Arengu kĂ€igus peab olema rajatud arenguvĂ”imalused ja skaleeritavus. KĂ”ige paindlikum on ehitada tĂ”rkeohutu klaster konteinerite virtualiseerimise vĂ”i hĂŒbriidlĂ€henemise abil.

Active/Active ja Active/Passive klastrireĆŸiimi töötamiseks tuleb tagada andmete jĂ€rjepidevus relatsioonilises andmebaasis — mĂ”lemad andmebaasi sĂ”lmed peavad olema geograafiliselt hajutatud andmekeskuste vahel sĂŒnkhÀÀlestatud.

Lihtsaim nÀide tÔrkeohutust paigaldusest.

SSO mikroteenuste arhitektuuris. Kasutame Keycloak'i. Osa nr 1

Millised on ĂŒhtse klastriga kasutamise eelised:

  • KĂ”rge kĂ€ttesaadavus ja jĂ”udlus.
  • Toetatakse tööreĆŸiime: Active/Active, Active/Passive.
  • DĂŒnaamilise skaleerimise vĂ”imalus — konteinerite virtualiseerimise kasutamisel.
  • Keskne haldamise ja jĂ€lgimise vĂ”imalus.
  • Ühtne lĂ€henemine kasutajate tuvastamiseks, autentimiseks ja autoriseerimiseks projektides.
  • Selgem koostöö erinevate projektide vahel ilma kasutajate sekkumiseta.
  • JWT tokeni uuesti kasutamise vĂ”imalus erinevates projektides.
  • Üksik usalduspunkt.
  • Projektide kiirem kĂ€ivitamine mikroteenuste vĂ”i konteinerite virtualiseerimise kasutamisega (lisakomponentide ĂŒlesehitamist ja seadistamist pole vajalik).
  • On vĂ”imalik hankida kaubanduslikku tuge tootjalt.

Millele tuleks klastrite planeerimisel tÀhelepanu pöörata

andmebaase

Keycloak kasutab andmebaasi haldussĂŒsteemi realmide, klientide, kasutajate jne salvestamiseks.
Toetatakse suurt hulka andmebaasisĂŒsteeme: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak on varustatud oma sisseehitatud relatsioonilise andmebaasiga. Soovitatav on kasutada vĂ€hem koormatud keskkondades — nĂ€iteks arenduskeskkondades.

Active/Active ja Active/Passive klastrireĆŸiimi töötamiseks tuleb tagada andmete jĂ€rjepidevus relatsioonilises andmebaasis ja mĂ”lemad andmebaasi klastrisĂ”lmed sĂŒnkhÀÀlestatakse andmekeskuste vahel.

Jaotatud vahemÀlu (Infinispan)

Klastri korrektseks on vajalik tĂ€iendav sĂŒnkroniseerimine jĂ€rgmiste vahemĂ€lu tĂŒĂŒpide vahel JBoss Data Grid kasutades:

Autentimise seansid — kasutatakse konkreetse kasutaja autentimise andmete salvestamiseks. Selles vahemĂ€lus olevad pĂ€ringud sisaldavad tavaliselt ainult veebibrauserit ja Keycloki serverit, mitte rakendust.

Tegevustokenid — kasutatakse stsenaariumides, kus kasutaja peab kinnitama toimingu asĂŒnkroonselt (e-posti teel). NĂ€iteks parooli taastamise protsessi kĂ€igus jĂ€lgib actionTokens Infinispan seotud tegevuste tokenite metadata, mis on juba kasutatud, seega ei saa neid uuesti kasutada.

PĂŒsivate andmete vahemĂ€lu ja kehtetuks tunnistamine – kasutatakse pĂŒsivate andmete vahemĂ€llu salvestamiseks, et vĂ€ltida liigseid pĂ€ringuid andmebaasile. Kui mĂ”ni Keycloki server uuendab andmeid, peavad kĂ”ik teised Keycloki serverid kĂ”igis andmekeskustes sellest teadlikud olema.

Töö — kasutatakse ainult sĂ”numite edastamiseks kehtetuks tunnistamise kohta klastrite sĂ”lmede ja andmekeskuste vahel.

Kasutaja seansid — kasutatakse kasutaja seansside andmete salvestamiseks, mis kehtivad kasutaja brauseri seansi jooksul. VahemĂ€lu peab töötlema lĂ”ppkasutaja ja rakenduse HTTP-pĂ€ringuid.

RĂŒnderessursside kaitse — kasutatakse ebaĂ”nnestunud sisenemiste andmete jĂ€lgimiseks.

Koormuse tasakaalustamine

Laadimise tasakaalustaja on ainus sisenepunkt Keycloki ja peab toetama sticky sessions.

Rakenduste serverid

Kasutatakse komponentide omavahelise suhtluse kontrollimiseks ning need vÔivad olla virtualiseeritud vÔi konteineriseeritud olemasolevate automatiseerimise ja dynaamilise infrastruktuuri skaleerimise vahendite abil. KÔige levinumad juurutamisstsenaariumid OpenShiftis, Kubernetesis, Rancheris.

Sellega on esimene osa – teoreetiline — lĂ”petatud. JĂ€rgmistes artiklites kĂ€sitletakse integratsioonide nĂ€iteid erinevate identiteediteenuse pakkujatega ja seadistuse nĂ€iteid.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster