SSO i mikrotjÀnstarkitektur. AnvÀnder Keycloak. Del 1

I vilken storföretag, och X5 Retail Group Ă€r inget undantag, ökar antalet projekt dĂ€r anvĂ€ndarautentisering krĂ€vs i takt med utvecklingen. Med tiden blir det nödvĂ€ndigt med en sömlös övergĂ„ng för anvĂ€ndare mellan olika applikationer, vilket leder till behovet av en enhetlig server för Single-Sign-On (SSO). Men hur ska man gĂ„ tillvĂ€ga nĂ€r identitetsleverantörer som AD eller andra, utan ytterligare attribuer, redan anvĂ€nds i olika projekt? HĂ€r kommer systemklassen som kallas "identitetsmĂ€klare" till hjĂ€lp. De mest funktionella representanterna Ă€r sĂ„dana som Keycloak, Gravitee Access management med flera. AnvĂ€ndningsscenarierna kan oftast variera: maskininteraktion, anvĂ€ndarengagemang med mera. Lösningen bör stödja en flexibel och skalbar funktionalitet som kan förena alla krav i ett, och den lösningen i vĂ„rt företag just nu Ă€r identitetsmĂ€klaren – Keycloak.

SSO i mikrotjÀnstarkitektur. AnvÀnder Keycloak. Del 1

Keycloak Ă€r en öppen kĂ€llkodsprodukt avsedd för identifikation och Ă„tkomstkontroll, och stöds av företaget RedHat. Det Ă€r grunden för företagets produkter som anvĂ€nder SSO – RH-SSO.

GrundlÀggande begrepp

Innan man börjar förstÄ sig pÄ lösningar och tillvÀgagÄngssÀtt bör man definiera termer och sekvenser av processer:

SSO i mikrotjÀnstarkitektur. AnvÀnder Keycloak. Del 1

Identifiering — detta Ă€r proceduren för att identifiera subjektet utifrĂ„n dess identifierare (enkelt uttryckt, att faststĂ€lla namn, login eller nummer).

Autentisering – detta Ă€r proceduren för autentisering (anvĂ€ndaren verifieras med hjĂ€lp av lösenord, brevet verifieras med elektronisk signatur etc.)

Behörighet – detta Ă€r tillhandahĂ„llandet av Ă„tkomst till nĂ„gon resurs (till exempel e-post).

IdentitetsmÀklaren Keycloak

Keycloak — Ă€r en lösning för hantering av identitet och Ă„tkomst med öppen kĂ€llkod, avsedd att anvĂ€ndas inom informationssystem dĂ€r mönster för mikrotjĂ€nstarkitektur kan förekomma.

Keycloak erbjuder funktioner som enhetlig inloggning (SSO), identifieringsmÀkling och social inloggning, anvÀndarfederation, klientadaptrar, administrationskonsol och anvÀndarkontrollkonsol.

GrundlÀggande funktionalitet som stöds i Keycloak:

  • Single-Sign On och Single-Sign Out för webbaserade applikationer.
  • Stöd för OpenID/OAuth 2.0/SAML.
  • Identitetsbrokering – autentisering med externa OpenID Connect eller SAML identitetsleverantörer.
  • Social inloggning – stöd för Google, GitHub, Facebook, Twitter för anvĂ€ndaridentifiering.
  • AnvĂ€ndarfederation – synkronisering av anvĂ€ndare frĂ„n LDAP och Active Directory-servrar samt andra identitetsleverantörer.
  • Kerberos-brygga – anvĂ€ndning av Kerberos-server för automatisk autentisering av anvĂ€ndare.
  • Admin Console – för central hantering av instĂ€llningar och parametrar via webben.
  • Konto förvaltningskonsol – för sjĂ€lvstĂ€ndig hantering av anvĂ€ndarprofiler.
  • Anpassning av lösningen baserat pĂ„ företagets varumĂ€rkesstil.
  • 2FA autentisering – stöd för TOTP/HOTP med Google Authenticator eller FreeOTP.
  • Inloggningsflöden – sjĂ€lvregistrering av anvĂ€ndare, Ă„terstĂ€llning och Ă„terstĂ€llning av lösenord och mer.
  • Sessionhantering – administratörer kan hantera anvĂ€ndarsessioner frĂ„n en och samma punkt.
  • Token-mappare – koppling av anvĂ€ndarattribut, roller och andra nödvĂ€ndiga attribut till tokens.
  • Flexibel hantering av policys via realm, applikation och anvĂ€ndare.
  • CORS-stöd – klientadapter har inbyggt stöd för CORS.
  • Service Provider Interfaces (SPI) – ett stort antal SPI för att konfigurera olika aspekter av serverns arbete: autentiseringsflöden, identitetsleverantörer, protokollmappning och mycket mer.
  • Klientadapter för JavaScript-applikationer, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • Stöd för arbete med olika applikationer som stöder OpenID Connect Relying Party-bibliotek eller SAML 2.0 Service Provider-bibliotek.
  • Möjlighet till utvidgning med hjĂ€lp av plugins.

För CI/CD-processer samt automatisering av hanteringsprocesser i Keycloak kan REST API/JAVA API anvÀndas. Dokumentation finns tillgÀnglig elektroniskt:

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

FöretagsnivÄ identitetsleverantörer (On-Premise)

Möjlighet till autentisering av anvÀndare via User Federation-tjÀnster.

SSO i mikrotjÀnstarkitektur. AnvÀnder Keycloak. Del 1

GenomgĂ„ende autentisering kan ocksĂ„ anvĂ€ndas – om anvĂ€ndare autentiseras pĂ„ arbetsstationer med Kerberos (LDAP eller AD), kan de automatiskt autentiseras pĂ„ Keycloak utan att behöva ange sitt anvĂ€ndarnamn och lösenord igen.

För autentisering och vidare auktorisering av anvÀndare kan en relationsdatabas anvÀndas, vilket Àr mest tillÀmpligt för utvecklingsmiljöer, eftersom det inte krÀver lÄnga instÀllningar och integrationer i de tidiga stadierna av projekten. Som standard anvÀnds en inbyggd databas i Keycloak för att lagra instÀllningar och anvÀndardata.

Listan över stödda databaser Àr omfattande och inkluderar: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle och andra. De mest testade hittills Àr Oracle 12C Release1 RAC och Galera 3.12-klustret för MariaDB 10.1.19.

Identifieringsleverantörer – social inloggning

Det Àr möjligt att anvÀnda inloggning frÄn sociala medier. För att aktivera möjligheten att autentisera anvÀndare anvÀnds administrationskonsolen i Keycloak. Ingen kodÀndring i applikationerna krÀvs och denna funktionalitet Àr tillgÀnglig 'ur lÄdan' och kan aktiveras i vilket skede av projektgenomförandet som helst.

SSO i mikrotjÀnstarkitektur. AnvÀnder Keycloak. Del 1

För anvÀndarautentisering kan OpenID/SAML-identitetsleverantörer anvÀndas.

Typiska auktoriseringsscenarier med anvÀndning av OAuth2 i Keycloak

Authorization Code Flow – anvĂ€nds med serverapplikationer (server-side applications). En av de mest utbredda typerna av auktorisation eftersom den passar bra för serverapplikationer dĂ€r applikationens kĂ€llkod och kunddata inte Ă€r tillgĂ€ngliga för utomstĂ„ende. Processen bygger hĂ€r pĂ„ omdirigering (redirection). Applikationen mĂ„ste kunna interagera med anvĂ€ndaragenten (user-agent), sĂ„som en webblĂ€sare – för att ta emot auktoriseringskoder via omdirigering genom anvĂ€ndaragenten.

Implicit Flow – anvĂ€nds av mobila eller webbapplikationer (applikationer som körs pĂ„ anvĂ€ndarens enhet).

Implicit auktorisation anvÀnds av mobila och webbapplikationer dÀr kundens integritet inte kan garanteras. Implicit auktorisation anvÀnder ocksÄ omdirigering av anvÀndaragenten, dÀr Ätkomsttokenen skickas till anvÀndaragenten för vidare anvÀndning i applikationen. Detta gör token tillgÀnglig för anvÀndaren och andra applikationer pÄ anvÀndarens enhet. Med denna typ av auktorisation genomförs ingen autentisering av applikationen, och processen förlitar sig pÄ omdirigerings-URL:en (registrerad tidigare i tjÀnsten).

Implicit Flow stödjer inte uppfriskningstokens (refresh tokens).

Client Credentials Grant Flow — anvĂ€nds nĂ€r applikationen fĂ„r tillgĂ„ng till API:er. Denna typ av auktorisation anvĂ€nds vanligtvis för "server-till-server"-interaktioner som ska utföras i bakgrunden utan omedelbar anvĂ€ndarinteraktion. Client Credentials Grant Flow gör det möjligt för en webbtjĂ€nst (hemlig klient) att anvĂ€nda sina egna referenser istĂ€llet för att autentisera en anvĂ€ndare nĂ€r den anropar en annan webbtjĂ€nst. För högre sĂ€kerhet kan den anropande tjĂ€nsten anvĂ€nda ett certifikat (istĂ€llet för en hemlig nyckel) som referens.

OAuth2-specifikationen beskrivs i
RFC-6749
RFC-8252
RFC-6819

JWT-token och dess fördelar

JWT (JSON Web Token) Àr en öppen standard (https://tools.ietf.org/html/rfc7519), som definierar ett kompakt och sjÀlvstÀndigt sÀtt att sÀkerstÀlla trygg överföring av information mellan parter i form av JSON-objekt.

Enligt standarden bestÄr token av tre delar i base-64-format, Ätskilda av punkter. Den första delen kallas header och innehÄller typ av token och namnet pÄ hash-algoritmen för att skapa digital signatur. Den andra delen lagrar huvudinformationen (anvÀndare, attribut, etc.). Den tredje delen Àr den digitala signaturen.

..
Spara aldrig token i din databas. En giltig token Àr motsvarande ett lösenord, att lagra token Àr som att lagra ett lösenord i klartext.
Åtkomsttoken — det Ă€r en token som ger dess Ă€gare tillgĂ„ng till skyddade serverresurser. Den har vanligtvis en kort livslĂ€ngd och kan innehĂ„lla ytterligare information, sĂ„som IP-adressen till den part som begĂ€r denna token.

Refresh-token — det Ă€r en token som gör det möjligt för kunder att begĂ€ra nya access-token efter att deras livstid har gĂ„tt ut. Dessa tokens utfĂ€rdas vanligtvis för en lĂ„ng period.

De viktigaste fördelarna med anvÀndning i mikroservicearkitektur:

  • Möjlighet att fĂ„ tillgĂ„ng till olika applikationer och tjĂ€nster genom en engĂ„ngsautentisering.
  • Om det saknas vissa nödvĂ€ndiga attribut i anvĂ€ndarprofiler kan data berikas med information som kan lĂ€ggas till i nyttolasten, Ă€ven automatiserat och "i farten".
  • Det finns inget behov av att lagra information om aktiva sessioner, serverapplikationen behöver bara verifiera signaturen.
  • Mer flexibel Ă„tkomsthantering genom ytterligare attribut i nyttolasten.
  • AnvĂ€ndningen av signatur för token för bĂ„de header och nyttolast ökar sĂ€kerheten för lösningen som helhet.

JWT-token — struktur

Rubrik — som standard innehĂ„ller headern endast typ av token och algoritm som anvĂ€nds för kryptering.

Typen av token lagras i nyckeln "typ". Nyckeln "typ" ignoreras i JWT. Om nyckeln "typ" finns, ska dess vÀrde vara JWT för att ange att detta objekt Àr en JSON Web Token.

Den andra nyckeln "alg" definierar algoritmen som anvÀnds för att kryptera token. Som standard bör den vara instÀlld pÄ HS256. Headern kodas i base64.

{ "alg": "HS256", "typ": "JWT"}
Payload (innehĂ„ll) — i nyttolasten lagras all information som behöver verifieras. Varje nyckel i nyttolasten kallas "pĂ„stĂ„ende". Till exempel kan man gĂ„ in i en applikation endast via inbjudan (sluten promo). NĂ€r vi vill bjuda in nĂ„gon att delta skickar vi henne ett e-postmeddelande med en inbjudan. Det Ă€r viktigt att verifiera att e-postadressen tillhör personen som accepterar inbjudan, sĂ„ vi inkluderar denna adress i nyttolasten, dĂ€rför sparar vi den i nyckeln "e-mail"

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

Nycklar i payload kan vara valfria. Det finns dock flera reserverade:

  • iss (UtfĂ€rdare) — definierar applikationen frĂ„n vilken token skickas.
  • sub (Ämne) — definierar tokenets Ă€mne.
  • aud (MĂ„lgrupp) – en array med skiftlĂ€geskĂ€nsliga strĂ€ngar eller URI:er som utgör listan över mottagare av detta token. NĂ€r mottagande part fĂ„r JWT med denna nyckel mĂ„ste de kontrollera att de finns bland mottagarna — annars ska token ignoreras.
  • exp (UtgĂ„ngstid) — anger nĂ€r tokenet löper ut. JWT-standarden krĂ€ver att alla implementationer av token med utgĂ„ngen tid avvisas. Exp-nyckeln ska vara en tidsstĂ€mpel i Unix-format.
  • nbf (Giltig inte före) — detta Ă€r tiden i Unix-format som definierar nĂ€r tokenet blir giltigt.
  • iat (UtfĂ€rdat vid) — denna nyckel representerar tiden nĂ€r tokenet utfĂ€rdades och kan anvĂ€ndas för att bestĂ€mma Ă„ldern pĂ„ JWT. iat-nyckeln ska vara en tidsstĂ€mpel i Unix-format.
  • Jti (JWT ID) — en strĂ€ng som definierar det unika identifieringsnumret för detta token, skiftlĂ€geskĂ€nsligt.

Det Àr viktigt att förstÄ att nyttolasten inte sÀnds i krypterad form (Àven om tokens kan vara inbÀddade och dÀrmed kan överföra krypterad data). DÀrför bör ingen kÀnslig information lagras i den. Precis som i rubriken kodas nyttolasten i base64.
Signatur — nĂ€r vi har rubriken och nyttolasten kan vi berĂ€kna signaturen.

De base64-kodade: rubriken och nyttolasten tas, de slĂ„s samman till en strĂ€ng via punkten. Denna strĂ€ng och hemliga nyckeln matas in i krypteringsalgoritmen som anges i rubriken (nyckeln „alg”). Nyckeln kan vara vilken strĂ€ng som helst. LĂ€ngre strĂ€ngar Ă€r att föredra, eftersom de tar lĂ€ngre tid att knĂ€cka.

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

Byggande av arkitekturen för ett felresistent Keycloak-kluster

NÀr man anvÀnder ett enda kluster för alla projekt ökar kraven pÄ lösningen för SSO. NÀr antalet projekt Àr litet kÀnns dessa krav inte sÄ starkt för alla projekt, men nÀr antalet anvÀndare och integrationer ökar ökar kraven pÄ tillgÀnglighet och prestanda.

Ökningen av riskerna för att det enhetliga SSO-systemet ska falla ökar kraven pĂ„ lösningens arkitektur och de metoder som anvĂ€nds för att sĂ€kra komponenterna, vilket leder till en mycket strikt SLA. DĂ€rför har projekt ofta en egen icke-felresistent infrastruktur under utvecklingen eller i de tidiga faserna av implementationen. Allteftersom utvecklingen fortskrider krĂ€vs det att möjligheter för vidareutveckling och skalbarhet lĂ€ggs in. Den mest flexibla lösningen för att bygga en felresistent klusterbildning Ă€r att anvĂ€nda containerbaserad virtualisering eller en hybridansats.

För att arbeta i ett Active/Active och Active/Passive-kluster krÀvs det att datakonsistens sÀkerstÀlls i den relationsdatabas - bÄda databasnoderna mÄste synkront replikeras mellan olika geodistribuerade datacenter.

Det enklaste exemplet pÄ en felresistent installation.

SSO i mikrotjÀnstarkitektur. AnvÀnder Keycloak. Del 1

Vilka fördelar ger anvÀndningen av ett enhetligt kluster:

  • Hög tillgĂ€nglighet och prestanda.
  • Stöd för driftslĂ€gen: Active/Active, Active/Passive.
  • Möjlighet till dynamisk skalning – vid anvĂ€ndning av containerbaserad virtualisering.
  • Möjlighet till centraliserad hantering och övervakning.
  • Enhetlig strategi för identifiering/autentisering/bemyndigande av anvĂ€ndare i projekten.
  • Mer transparent samarbete mellan olika projekt utan anvĂ€ndarengagemang.
  • Möjlighet att Ă„teranvĂ€nda JWT-token i olika projekt.
  • En enda förtroendepunkt.
  • Snabbare projektstart med anvĂ€ndning av mikrotjĂ€nster/containerbaserad virtualisering (inga ytterligare komponenter behöver sĂ€ttas upp och konfigureras).
  • Möjlighet till kommersiellt stöd frĂ„n leverantören.

Vad man bör tÀnka pÄ vid planering av klustret

DBMS

Keycloak anvÀnder ett databasadministrationssystem för att lagra: realms, clients, users och mer.
Stöder ett brett spektrum av databaslösningar: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak levereras med en egen inbyggd relationsdatabas. Det rekommenderas att anvĂ€nda den för icke-belastade miljöer – som utvecklingsmiljöer.

För att arbeta i ett Active/Active och Active/Passive-kluster krÀvs datakonsistens i den relationsdatabas och bÄda noderna i databasklustret replikerar synkront mellan datacenter.

Distributerad cache (Infinspan)

För korrekt drift av klustret krÀvs ytterligare synkronisering av följande typer av cache med hjÀlp av JBoss Data Grid:

Autentisering sessioner – anvĂ€nds för att spara data vid autentisering av en viss anvĂ€ndare. BegĂ€rningar frĂ„n denna cache innehĂ„ller vanligtvis endast webblĂ€saren och Keycloak-servern, men inte applikationen.

Action tokens – anvĂ€nds för scenarier dĂ€r anvĂ€ndaren behöver bekrĂ€fta en Ă„tgĂ€rd asynkront (via e-post). Till exempel, under flödet för glömt lösenord anvĂ€nds cachen actionTokens Infinispan för att spĂ„ra metadata om relaterade Ă„tgĂ€rdsmĂ€rken som redan har anvĂ€nts, sĂ„ att de inte kan Ă„teranvĂ€ndas.

Caching och ogiltigförklaring av bestĂ€ndig data – anvĂ€nds för att cacha bestĂ€ndig data för att undvika onödiga frĂ„gor mot databasen. NĂ€r en Keycloak-server uppdaterar data, mĂ„ste alla andra Keycloak-servrar i alla datacenter vara medvetna om detta.

Arbete – anvĂ€nds endast för att skicka meddelanden om ogiltigförklaring mellan klusternoder och datacenter.

AnvĂ€ndarsessioner – anvĂ€nds för att spara data om anvĂ€ndarsessioner som Ă€r giltiga under anvĂ€ndarens webblĂ€sarsession. Cachen mĂ„ste hantera HTTP-begĂ€rningar frĂ„n slutkunden och applikationen.

Skydd mot brute force – anvĂ€nds för att spĂ„ra data om misslyckade inloggningar.

Lastbalansering

Lastbalanseraren Àr en enda ingÄngspunkt till Keycloak och mÄste stödja sticky sessions.

Applikationsservrar

AnvÀnds för att kontrollera interaktionen mellan komponenterna och kan virtualiseras eller containeriseras med hjÀlp av befintliga automatiseringsverktyg och dynamisk skalning av infrastrukturautomatisering. De mest förekommande distributionscenarierna Àr i OpenShift, Kubernetes, Rancher.

Den första delen – den teoretiska – Ă€r nu avslutad. I följande artiklar kommer exempel pĂ„ integrationer med olika identifieringsleverantörer och exempel pĂ„ instĂ€llningar att diskuteras.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster