{"id":40865,"date":"2020-02-05T10:07:04","date_gmt":"2020-02-05T07:07:04","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961"},"modified":"2020-02-05T10:07:04","modified_gmt":"2020-02-05T07:07:04","slug":"sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","title":{"rendered":"SSO i mikrotj\u00e4nstarkitektur. Anv\u00e4nder Keycloak. Del 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I vilken storf\u00f6retag, och X5 Retail Group \u00e4r inget undantag, \u00f6kar antalet projekt d\u00e4r anv\u00e4ndarautentisering kr\u00e4vs i takt med utvecklingen. Med tiden blir det n\u00f6dv\u00e4ndigt med en s\u00f6ml\u00f6s \u00f6verg\u00e5ng f\u00f6r anv\u00e4ndare mellan olika applikationer, vilket leder till behovet av en enhetlig server f\u00f6r Single-Sign-On (SSO). Men hur ska man g\u00e5 tillv\u00e4ga n\u00e4r identitetsleverant\u00f6rer som AD eller andra, utan ytterligare attribuer, redan anv\u00e4nds i olika projekt? H\u00e4r kommer systemklassen som kallas \"identitetsm\u00e4klare\" till hj\u00e4lp. De mest funktionella representanterna \u00e4r s\u00e5dana som Keycloak, Gravitee Access management med flera. Anv\u00e4ndningsscenarierna kan oftast variera: maskininteraktion, anv\u00e4ndarengagemang med mera. L\u00f6sningen b\u00f6r st\u00f6dja en flexibel och skalbar funktionalitet som kan f\u00f6rena alla krav i ett, och den l\u00f6sningen i v\u00e5rt f\u00f6retag just nu \u00e4r identitetsm\u00e4klaren \u2013 Keycloak. <\/p>\n<p><img decoding=\"async\" alt=\"SSO i mikrotj\u00e4nstarkitektur. Anv\u00e4nder Keycloak. Del 1\" src=\"\/wp-content\/uploads\/2020\/02\/3a7f1d5f68fa5d07fc30f2804dc62bef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKeycloak \u00e4r en \u00f6ppen k\u00e4llkodsprodukt avsedd f\u00f6r identifikation och \u00e5tkomstkontroll, och st\u00f6ds av f\u00f6retaget RedHat. Det \u00e4r grunden f\u00f6r f\u00f6retagets produkter som anv\u00e4nder SSO \u2013 RH-SSO.<\/p>\n<h3>Grundl\u00e4ggande begrepp <\/h3>\n<p>\nInnan man b\u00f6rjar f\u00f6rst\u00e5 sig p\u00e5 l\u00f6sningar och tillv\u00e4gag\u00e5ngss\u00e4tt b\u00f6r man definiera termer och sekvenser av processer:<\/p>\n<p><img decoding=\"async\" alt=\"SSO i mikrotj\u00e4nstarkitektur. Anv\u00e4nder Keycloak. Del 1\" src=\"\/wp-content\/uploads\/2020\/02\/3a83d4364425aeed1019662fd1d5f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Identifiering<\/b> \u2014 detta \u00e4r proceduren f\u00f6r att identifiera subjektet utifr\u00e5n dess identifierare (enkelt uttryckt, att fastst\u00e4lla namn, login eller nummer).<\/p>\n<p><b>Autentisering<\/b> \u2013 detta \u00e4r proceduren f\u00f6r autentisering (anv\u00e4ndaren verifieras med hj\u00e4lp av l\u00f6senord, brevet verifieras med elektronisk signatur etc.)<\/p>\n<p><b>Beh\u00f6righet<\/b> \u2013 detta \u00e4r tillhandah\u00e5llandet av \u00e5tkomst till n\u00e5gon resurs (till exempel e-post).<\/p>\n<h4>Identitetsm\u00e4klaren Keycloak<\/h4>\n<p>\n<b>Keycloak<\/b> \u2014 \u00e4r en l\u00f6sning f\u00f6r hantering av identitet och \u00e5tkomst med \u00f6ppen k\u00e4llkod, avsedd att anv\u00e4ndas inom informationssystem d\u00e4r m\u00f6nster f\u00f6r mikrotj\u00e4nstarkitektur kan f\u00f6rekomma.<\/p>\n<p>Keycloak erbjuder funktioner som enhetlig inloggning (SSO), identifieringsm\u00e4kling och social inloggning, anv\u00e4ndarfederation, klientadaptrar, administrationskonsol och anv\u00e4ndarkontrollkonsol.<\/p>\n<p>Grundl\u00e4ggande funktionalitet som st\u00f6ds i Keycloak:<\/p>\n<ul>\n<li>Single-Sign On och Single-Sign Out f\u00f6r webbaserade applikationer.<\/li>\n<li>St\u00f6d f\u00f6r OpenID\/OAuth 2.0\/SAML.<\/li>\n<li>Identitetsbrokering \u2013 autentisering med externa OpenID Connect eller SAML identitetsleverant\u00f6rer.<\/li>\n<li>Social inloggning \u2013 st\u00f6d f\u00f6r Google, GitHub, Facebook, Twitter f\u00f6r anv\u00e4ndaridentifiering.<\/li>\n<li>Anv\u00e4ndarfederation \u2013 synkronisering av anv\u00e4ndare fr\u00e5n LDAP och Active Directory-servrar samt andra identitetsleverant\u00f6rer.<\/li>\n<li>Kerberos-brygga \u2013 anv\u00e4ndning av Kerberos-server f\u00f6r automatisk autentisering av anv\u00e4ndare.<\/li>\n<li>Admin Console \u2013 f\u00f6r central hantering av inst\u00e4llningar och parametrar via webben.<\/li>\n<li>Konto f\u00f6rvaltningskonsol \u2013 f\u00f6r sj\u00e4lvst\u00e4ndig hantering av anv\u00e4ndarprofiler.<\/li>\n<li>Anpassning av l\u00f6sningen baserat p\u00e5 f\u00f6retagets varum\u00e4rkesstil.<\/li>\n<li>2FA autentisering \u2013 st\u00f6d f\u00f6r TOTP\/HOTP med Google Authenticator eller FreeOTP.<\/li>\n<li>Inloggningsfl\u00f6den \u2013 sj\u00e4lvregistrering av anv\u00e4ndare, \u00e5terst\u00e4llning och \u00e5terst\u00e4llning av l\u00f6senord och mer.<\/li>\n<li>Sessionhantering \u2013 administrat\u00f6rer kan hantera anv\u00e4ndarsessioner fr\u00e5n en och samma punkt.<\/li>\n<li>Token-mappare \u2013 koppling av anv\u00e4ndarattribut, roller och andra n\u00f6dv\u00e4ndiga attribut till tokens.<\/li>\n<li>Flexibel hantering av policys via realm, applikation och anv\u00e4ndare.<\/li>\n<li>CORS-st\u00f6d \u2013 klientadapter har inbyggt st\u00f6d f\u00f6r CORS.<\/li>\n<li>Service Provider Interfaces (SPI) \u2013 ett stort antal SPI f\u00f6r att konfigurera olika aspekter av serverns arbete: autentiseringsfl\u00f6den, identitetsleverant\u00f6rer, protokollmappning och mycket mer.<\/li>\n<li>Klientadapter f\u00f6r JavaScript-applikationer, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.<\/li>\n<li>St\u00f6d f\u00f6r arbete med olika applikationer som st\u00f6der OpenID Connect Relying Party-bibliotek eller SAML 2.0 Service Provider-bibliotek.<\/li>\n<li>M\u00f6jlighet till utvidgning med hj\u00e4lp av plugins.<\/li>\n<\/ul>\n<p>\nF\u00f6r CI\/CD-processer samt automatisering av hanteringsprocesser i Keycloak kan REST API\/JAVA API anv\u00e4ndas. Dokumentation finns tillg\u00e4nglig elektroniskt: <\/p>\n<p>REST API <noindex><a rel=\"nofollow\" href=\"https:\/\/www.keycloak.org\/docs-api\/8.0\/rest-api\/index.html\">https:\/\/www.keycloak.org\/docs-api\/8.0\/rest-api\/index.html<\/a><\/noindex><br \/>\nJAVA API <noindex><a rel=\"nofollow\" href=\"https:\/\/www.keycloak.org\/docs-api\/8.0\/javadocs\/index.html\">https:\/\/www.keycloak.org\/docs-api\/8.0\/javadocs\/index.html<\/a><\/noindex><\/p>\n<h4>F\u00f6retagsniv\u00e5 identitetsleverant\u00f6rer (On-Premise)<\/h4>\n<p>\nM\u00f6jlighet till autentisering av anv\u00e4ndare via User Federation-tj\u00e4nster.<\/p>\n<p><img decoding=\"async\" alt=\"SSO i mikrotj\u00e4nstarkitektur. Anv\u00e4nder Keycloak. Del 1\" src=\"\/wp-content\/uploads\/2020\/02\/59bbeaf4630855467ddb003d52b0c1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGenomg\u00e5ende autentisering kan ocks\u00e5 anv\u00e4ndas \u2013 om anv\u00e4ndare autentiseras p\u00e5 arbetsstationer med Kerberos (LDAP eller AD), kan de automatiskt autentiseras p\u00e5 Keycloak utan att beh\u00f6va ange sitt anv\u00e4ndarnamn och l\u00f6senord igen. <\/p>\n<p>F\u00f6r autentisering och vidare auktorisering av anv\u00e4ndare kan en relationsdatabas anv\u00e4ndas, vilket \u00e4r mest till\u00e4mpligt f\u00f6r utvecklingsmilj\u00f6er, eftersom det inte kr\u00e4ver l\u00e5nga inst\u00e4llningar och integrationer i de tidiga stadierna av projekten. Som standard anv\u00e4nds en inbyggd databas i Keycloak f\u00f6r att lagra inst\u00e4llningar och anv\u00e4ndardata.<\/p>\n<p>Listan \u00f6ver st\u00f6dda databaser \u00e4r omfattande och inkluderar: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle och andra. De mest testade hittills \u00e4r Oracle 12C Release1 RAC och Galera 3.12-klustret f\u00f6r MariaDB 10.1.19. <\/p>\n<h4>Identifieringsleverant\u00f6rer \u2013 social inloggning <\/h4>\n<p>\nDet \u00e4r m\u00f6jligt att anv\u00e4nda inloggning fr\u00e5n sociala medier. F\u00f6r att aktivera m\u00f6jligheten att autentisera anv\u00e4ndare anv\u00e4nds administrationskonsolen i Keycloak. Ingen kod\u00e4ndring i applikationerna kr\u00e4vs och denna funktionalitet \u00e4r tillg\u00e4nglig 'ur l\u00e5dan' och kan aktiveras i vilket skede av projektgenomf\u00f6randet som helst.<\/p>\n<p><img decoding=\"async\" alt=\"SSO i mikrotj\u00e4nstarkitektur. Anv\u00e4nder Keycloak. Del 1\" src=\"\/wp-content\/uploads\/2020\/02\/546ddea10c79662ca37a448d3dfc1fd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00f6r anv\u00e4ndarautentisering kan OpenID\/SAML-identitetsleverant\u00f6rer anv\u00e4ndas.<\/p>\n<h3>Typiska auktoriseringsscenarier med anv\u00e4ndning av OAuth2 i Keycloak<\/h3>\n<p>\n<b>Authorization Code Flow <\/b> \u2013 anv\u00e4nds med serverapplikationer (server-side applications). En av de mest utbredda typerna av auktorisation eftersom den passar bra f\u00f6r serverapplikationer d\u00e4r applikationens k\u00e4llkod och kunddata inte \u00e4r tillg\u00e4ngliga f\u00f6r utomst\u00e5ende. Processen bygger h\u00e4r p\u00e5 omdirigering (redirection). Applikationen m\u00e5ste kunna interagera med anv\u00e4ndaragenten (user-agent), s\u00e5som en webbl\u00e4sare \u2013 f\u00f6r att ta emot auktoriseringskoder via omdirigering genom anv\u00e4ndaragenten.<\/p>\n<p><b>Implicit Flow<\/b> \u2013 anv\u00e4nds av mobila eller webbapplikationer (applikationer som k\u00f6rs p\u00e5 anv\u00e4ndarens enhet).<\/p>\n<p>Implicit auktorisation anv\u00e4nds av mobila och webbapplikationer d\u00e4r kundens integritet inte kan garanteras. Implicit auktorisation anv\u00e4nder ocks\u00e5 omdirigering av anv\u00e4ndaragenten, d\u00e4r \u00e5tkomsttokenen skickas till anv\u00e4ndaragenten f\u00f6r vidare anv\u00e4ndning i applikationen. Detta g\u00f6r token tillg\u00e4nglig f\u00f6r anv\u00e4ndaren och andra applikationer p\u00e5 anv\u00e4ndarens enhet. Med denna typ av auktorisation genomf\u00f6rs ingen autentisering av applikationen, och processen f\u00f6rlitar sig p\u00e5 omdirigerings-URL:en (registrerad tidigare i tj\u00e4nsten).<\/p>\n<p>Implicit Flow st\u00f6djer inte uppfriskningstokens (refresh tokens).<br \/>\n<br \/>\n<b>Client Credentials Grant Flow<\/b> \u2014 anv\u00e4nds n\u00e4r applikationen f\u00e5r tillg\u00e5ng till API:er. Denna typ av auktorisation anv\u00e4nds vanligtvis f\u00f6r \"server-till-server\"-interaktioner som ska utf\u00f6ras i bakgrunden utan omedelbar anv\u00e4ndarinteraktion. Client Credentials Grant Flow g\u00f6r det m\u00f6jligt f\u00f6r en webbtj\u00e4nst (hemlig klient) att anv\u00e4nda sina egna referenser ist\u00e4llet f\u00f6r att autentisera en anv\u00e4ndare n\u00e4r den anropar en annan webbtj\u00e4nst. F\u00f6r h\u00f6gre s\u00e4kerhet kan den anropande tj\u00e4nsten anv\u00e4nda ett certifikat (ist\u00e4llet f\u00f6r en hemlig nyckel) som referens.<\/p>\n<p>OAuth2-specifikationen beskrivs i <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc6749\">RFC-6749<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc8259\">RFC-8252<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc6819\">RFC-6819<\/a><\/noindex><\/p>\n<h3>JWT-token och dess f\u00f6rdelar<\/h3>\n<p>\nJWT (JSON Web Token) \u00e4r en \u00f6ppen standard (<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc7519\">https:\/\/tools.ietf.org\/html\/rfc7519<\/a><\/noindex>), som definierar ett kompakt och sj\u00e4lvst\u00e4ndigt s\u00e4tt att s\u00e4kerst\u00e4lla trygg \u00f6verf\u00f6ring av information mellan parter i form av JSON-objekt.<\/p>\n<p>Enligt standarden best\u00e5r token av tre delar i base-64-format, \u00e5tskilda av punkter. Den f\u00f6rsta delen kallas header och inneh\u00e5ller typ av token och namnet p\u00e5 hash-algoritmen f\u00f6r att skapa digital signatur. Den andra delen lagrar huvudinformationen (anv\u00e4ndare, attribut, etc.). Den tredje delen \u00e4r den digitala signaturen.<\/p>\n<p>..<br \/>\nSpara aldrig token i din databas. En giltig token \u00e4r motsvarande ett l\u00f6senord, att lagra token \u00e4r som att lagra ett l\u00f6senord i klartext.<br \/>\n<b>\u00c5tkomsttoken <\/b>\u2014 det \u00e4r en token som ger dess \u00e4gare tillg\u00e5ng till skyddade serverresurser. Den har vanligtvis en kort livsl\u00e4ngd och kan inneh\u00e5lla ytterligare information, s\u00e5som IP-adressen till den part som beg\u00e4r denna token.<\/p>\n<p><b>Refresh-token <\/b>\u2014 det \u00e4r en token som g\u00f6r det m\u00f6jligt f\u00f6r kunder att beg\u00e4ra nya access-token efter att deras livstid har g\u00e5tt ut. Dessa tokens utf\u00e4rdas vanligtvis f\u00f6r en l\u00e5ng period.<\/p>\n<p>De viktigaste f\u00f6rdelarna med anv\u00e4ndning i mikroservicearkitektur:<\/p>\n<ul>\n<li>M\u00f6jlighet att f\u00e5 tillg\u00e5ng till olika applikationer och tj\u00e4nster genom en eng\u00e5ngsautentisering.<\/li>\n<li>Om det saknas vissa n\u00f6dv\u00e4ndiga attribut i anv\u00e4ndarprofiler kan data berikas med information som kan l\u00e4ggas till i nyttolasten, \u00e4ven automatiserat och \"i farten\".<\/li>\n<li>Det finns inget behov av att lagra information om aktiva sessioner, serverapplikationen beh\u00f6ver bara verifiera signaturen.<\/li>\n<li>Mer flexibel \u00e5tkomsthantering genom ytterligare attribut i nyttolasten.<\/li>\n<li>Anv\u00e4ndningen av signatur f\u00f6r token f\u00f6r b\u00e5de header och nyttolast \u00f6kar s\u00e4kerheten f\u00f6r l\u00f6sningen som helhet.<\/li>\n<\/ul>\n<p><\/p>\n<h3>JWT-token \u2014 struktur<\/h3>\n<p>\n<b>Rubrik<\/b> \u2014 som standard inneh\u00e5ller headern endast typ av token och algoritm som anv\u00e4nds f\u00f6r kryptering.<\/p>\n<p>Typen av token lagras i nyckeln \"typ\". Nyckeln \"typ\" ignoreras i JWT. Om nyckeln \"typ\" finns, ska dess v\u00e4rde vara JWT f\u00f6r att ange att detta objekt \u00e4r en JSON Web Token.<\/p>\n<p>Den andra nyckeln \"alg\" definierar algoritmen som anv\u00e4nds f\u00f6r att kryptera token. Som standard b\u00f6r den vara inst\u00e4lld p\u00e5 HS256. Headern kodas i base64.<\/p>\n<p>{ \"alg\": \"HS256\", \"typ\": \"JWT\"}<br \/>\n<b>Payload (inneh\u00e5ll)<\/b> \u2014 i nyttolasten lagras all information som beh\u00f6ver verifieras. Varje nyckel i nyttolasten kallas \"p\u00e5st\u00e5ende\". Till exempel kan man g\u00e5 in i en applikation endast via inbjudan (sluten promo). N\u00e4r vi vill bjuda in n\u00e5gon att delta skickar vi henne ett e-postmeddelande med en inbjudan. Det \u00e4r viktigt att verifiera att e-postadressen tillh\u00f6r personen som accepterar inbjudan, s\u00e5 vi inkluderar denna adress i nyttolasten, d\u00e4rf\u00f6r sparar vi den i nyckeln \"e-mail\"<\/p>\n<p>{ \"email\": \"example@x5.ru\" }<br \/>\n<br \/>\nNycklar i payload kan vara valfria. Det finns dock flera reserverade:<\/p>\n<ul>\n<li>iss (Utf\u00e4rdare) \u2014 definierar applikationen fr\u00e5n vilken token skickas.<\/li>\n<li>sub (\u00c4mne) \u2014 definierar tokenets \u00e4mne.<\/li>\n<li>aud (M\u00e5lgrupp) \u2013 en array med skiftl\u00e4gesk\u00e4nsliga str\u00e4ngar eller URI:er som utg\u00f6r listan \u00f6ver mottagare av detta token. N\u00e4r mottagande part f\u00e5r JWT med denna nyckel m\u00e5ste de kontrollera att de finns bland mottagarna \u2014 annars ska token ignoreras.<\/li>\n<li>exp (Utg\u00e5ngstid) \u2014 anger n\u00e4r tokenet l\u00f6per ut. JWT-standarden kr\u00e4ver att alla implementationer av token med utg\u00e5ngen tid avvisas. Exp-nyckeln ska vara en tidsst\u00e4mpel i Unix-format.<\/li>\n<li>nbf (Giltig inte f\u00f6re) \u2014 detta \u00e4r tiden i Unix-format som definierar n\u00e4r tokenet blir giltigt.<\/li>\n<li>iat (Utf\u00e4rdat vid) \u2014 denna nyckel representerar tiden n\u00e4r tokenet utf\u00e4rdades och kan anv\u00e4ndas f\u00f6r att best\u00e4mma \u00e5ldern p\u00e5 JWT. iat-nyckeln ska vara en tidsst\u00e4mpel i Unix-format.<\/li>\n<li>Jti (JWT ID) \u2014 en str\u00e4ng som definierar det unika identifieringsnumret f\u00f6r detta token, skiftl\u00e4gesk\u00e4nsligt.<\/li>\n<\/ul>\n<p>\nDet \u00e4r viktigt att f\u00f6rst\u00e5 att nyttolasten inte s\u00e4nds i krypterad form (\u00e4ven om tokens kan vara inb\u00e4ddade och d\u00e4rmed kan \u00f6verf\u00f6ra krypterad data). D\u00e4rf\u00f6r b\u00f6r ingen k\u00e4nslig information lagras i den. Precis som i rubriken kodas nyttolasten i base64.<br \/>\n<b>Signatur<\/b> \u2014 n\u00e4r vi har rubriken och nyttolasten kan vi ber\u00e4kna signaturen.<\/p>\n<p>De base64-kodade: rubriken och nyttolasten tas, de sl\u00e5s samman till en str\u00e4ng via punkten. Denna str\u00e4ng och hemliga nyckeln matas in i krypteringsalgoritmen som anges i rubriken (nyckeln \u201ealg\u201d). Nyckeln kan vara vilken str\u00e4ng som helst. L\u00e4ngre str\u00e4ngar \u00e4r att f\u00f6redra, eftersom de tar l\u00e4ngre tid att kn\u00e4cka.<\/p>\n<p>{\"alg\":\"RSA1_5\",\"payload\":\"A128CBC-HS256\"}<\/p>\n<h3>Byggande av arkitekturen f\u00f6r ett felresistent Keycloak-kluster<\/h3>\n<p>\nN\u00e4r man anv\u00e4nder ett enda kluster f\u00f6r alla projekt \u00f6kar kraven p\u00e5 l\u00f6sningen f\u00f6r SSO. N\u00e4r antalet projekt \u00e4r litet k\u00e4nns dessa krav inte s\u00e5 starkt f\u00f6r alla projekt, men n\u00e4r antalet anv\u00e4ndare och integrationer \u00f6kar \u00f6kar kraven p\u00e5 tillg\u00e4nglighet och prestanda. <\/p>\n<p>\u00d6kningen av riskerna f\u00f6r att det enhetliga SSO-systemet ska falla \u00f6kar kraven p\u00e5 l\u00f6sningens arkitektur och de metoder som anv\u00e4nds f\u00f6r att s\u00e4kra komponenterna, vilket leder till en mycket strikt SLA. D\u00e4rf\u00f6r har projekt ofta en egen icke-felresistent infrastruktur under utvecklingen eller i de tidiga faserna av implementationen. Allteftersom utvecklingen fortskrider kr\u00e4vs det att m\u00f6jligheter f\u00f6r vidareutveckling och skalbarhet l\u00e4ggs in. Den mest flexibla l\u00f6sningen f\u00f6r att bygga en felresistent klusterbildning \u00e4r att anv\u00e4nda containerbaserad virtualisering eller en hybridansats. <\/p>\n<p>F\u00f6r att arbeta i ett Active\/Active och Active\/Passive-kluster kr\u00e4vs det att datakonsistens s\u00e4kerst\u00e4lls i den relationsdatabas - b\u00e5da databasnoderna m\u00e5ste synkront replikeras mellan olika geodistribuerade datacenter.<\/p>\n<p>Det enklaste exemplet p\u00e5 en felresistent installation.<\/p>\n<p><img decoding=\"async\" alt=\"SSO i mikrotj\u00e4nstarkitektur. Anv\u00e4nder Keycloak. Del 1\" src=\"\/wp-content\/uploads\/2020\/02\/c0df30a07e7dda5ae892a1fca3790a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVilka f\u00f6rdelar ger anv\u00e4ndningen av ett enhetligt kluster:<\/p>\n<ul>\n<li>H\u00f6g tillg\u00e4nglighet och prestanda.<\/li>\n<li>St\u00f6d f\u00f6r driftsl\u00e4gen: Active\/Active, Active\/Passive.<\/li>\n<li>M\u00f6jlighet till dynamisk skalning \u2013 vid anv\u00e4ndning av containerbaserad virtualisering.<\/li>\n<li>M\u00f6jlighet till centraliserad hantering och \u00f6vervakning.<\/li>\n<li>Enhetlig strategi f\u00f6r identifiering\/autentisering\/bemyndigande av anv\u00e4ndare i projekten.<\/li>\n<li>Mer transparent samarbete mellan olika projekt utan anv\u00e4ndarengagemang.<\/li>\n<li>M\u00f6jlighet att \u00e5teranv\u00e4nda JWT-token i olika projekt.<\/li>\n<li>En enda f\u00f6rtroendepunkt.<\/li>\n<li>Snabbare projektstart med anv\u00e4ndning av mikrotj\u00e4nster\/containerbaserad virtualisering (inga ytterligare komponenter beh\u00f6ver s\u00e4ttas upp och konfigureras).<\/li>\n<li>M\u00f6jlighet till kommersiellt st\u00f6d fr\u00e5n leverant\u00f6ren. <\/li>\n<\/ul>\n<p><\/p>\n<h3>Vad man b\u00f6r t\u00e4nka p\u00e5 vid planering av klustret<\/h3>\n<p><\/p>\n<h4>DBMS<\/h4>\n<p>\nKeycloak anv\u00e4nder ett databasadministrationssystem f\u00f6r att lagra: realms, clients, users och mer.<br \/>\nSt\u00f6der ett brett spektrum av databasl\u00f6sningar: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak levereras med en egen inbyggd relationsdatabas. Det rekommenderas att anv\u00e4nda den f\u00f6r icke-belastade milj\u00f6er \u2013 som utvecklingsmilj\u00f6er.<\/p>\n<p>F\u00f6r att arbeta i ett Active\/Active och Active\/Passive-kluster kr\u00e4vs datakonsistens i den relationsdatabas och b\u00e5da noderna i databasklustret replikerar synkront mellan datacenter.<\/p>\n<h4>Distributerad cache (Infinspan)<\/h4>\n<p>\nF\u00f6r korrekt drift av klustret kr\u00e4vs ytterligare synkronisering av f\u00f6ljande typer av cache med hj\u00e4lp av JBoss Data Grid:<\/p>\n<p>Autentisering sessioner \u2013 anv\u00e4nds f\u00f6r att spara data vid autentisering av en viss anv\u00e4ndare. Beg\u00e4rningar fr\u00e5n denna cache inneh\u00e5ller vanligtvis endast webbl\u00e4saren och Keycloak-servern, men inte applikationen.<\/p>\n<p>Action tokens \u2013 anv\u00e4nds f\u00f6r scenarier d\u00e4r anv\u00e4ndaren beh\u00f6ver bekr\u00e4fta en \u00e5tg\u00e4rd asynkront (via e-post). Till exempel, under fl\u00f6det f\u00f6r gl\u00f6mt l\u00f6senord anv\u00e4nds cachen actionTokens Infinispan f\u00f6r att sp\u00e5ra metadata om relaterade \u00e5tg\u00e4rdsm\u00e4rken som redan har anv\u00e4nts, s\u00e5 att de inte kan \u00e5teranv\u00e4ndas.<\/p>\n<p>Caching och ogiltigf\u00f6rklaring av best\u00e4ndig data \u2013 anv\u00e4nds f\u00f6r att cacha best\u00e4ndig data f\u00f6r att undvika on\u00f6diga fr\u00e5gor mot databasen. N\u00e4r en Keycloak-server uppdaterar data, m\u00e5ste alla andra Keycloak-servrar i alla datacenter vara medvetna om detta.<\/p>\n<p>Arbete \u2013 anv\u00e4nds endast f\u00f6r att skicka meddelanden om ogiltigf\u00f6rklaring mellan klusternoder och datacenter. <\/p>\n<p>Anv\u00e4ndarsessioner \u2013 anv\u00e4nds f\u00f6r att spara data om anv\u00e4ndarsessioner som \u00e4r giltiga under anv\u00e4ndarens webbl\u00e4sarsession. Cachen m\u00e5ste hantera HTTP-beg\u00e4rningar fr\u00e5n slutkunden och applikationen. <\/p>\n<p>Skydd mot brute force \u2013 anv\u00e4nds f\u00f6r att sp\u00e5ra data om misslyckade inloggningar. <\/p>\n<h4>Lastbalansering<\/h4>\n<p>\nLastbalanseraren \u00e4r en enda ing\u00e5ngspunkt till Keycloak och m\u00e5ste st\u00f6dja sticky sessions. <\/p>\n<h4>Applikationsservrar<\/h4>\n<p>\nAnv\u00e4nds f\u00f6r att kontrollera interaktionen mellan komponenterna och kan virtualiseras eller containeriseras med hj\u00e4lp av befintliga automatiseringsverktyg och dynamisk skalning av infrastrukturautomatisering. De mest f\u00f6rekommande distributionscenarierna \u00e4r i OpenShift, Kubernetes, Rancher.<\/p>\n<p>Den f\u00f6rsta delen \u2013 den teoretiska \u2013 \u00e4r nu avslutad. I f\u00f6ljande artiklar kommer exempel p\u00e5 integrationer med olika identifieringsleverant\u00f6rer och exempel p\u00e5 inst\u00e4llningar att diskuteras.<br \/>\n<br \/>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/X5RetailGroup\/blog\/486778\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Single-Sing-On (SSO). \u041d\u043e \u043a\u0430\u043a \u0431\u044b\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b \u043a\u0430\u043a AD \u0438\u043b\u0438 \u0438\u043d\u044b\u0435, \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":40866,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40865","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47SSO \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Keycloak. \u0427\u0430\u0441\u0442\u044c \u21161 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-05T07:07:04+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-05T07:07:04+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47SSO p\u00e5 mikrotj\u00e4nstarkitektur. Anv\u00e4nder Keycloak. Del \u21161 | ProHoster","description":"I alla stora f\u00f6retag, och X5 Retail Group \u00e4r inget undantag, \u00f6kar antalet projekt som kr\u00e4ver anv\u00e4ndarautorisering i takt med tillv\u00e4xten.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47SSO \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Keycloak. \u0427\u0430\u0441\u0442\u044c \u21161 | ProHoster","og:description":"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.","og:url":"https:\/\/prohoster.info\/sv\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-05T07:07:04+00:00","article:modified_time":"2020-02-05T07:07:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"40865","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:46:14","updated":"2022-09-27 14:28:39","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/40865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=40865"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/40865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/40866"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=40865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=40865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=40865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}