{"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\/da\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","title":{"rendered":"SSO p\u00e5 mikroservice-arkitektur. Vi bruger Keycloak. Del #1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I enhver stor virksomhed, inklusive X5 Retail Group, stiger antallet af projekter, hvor brugerautorisering er n\u00f8dvendig, i takt med udviklingen. Over tid er der behov for en s\u00f8ml\u00f8s overgang for brugerne fra \u00e9n applikation til en anden, hvilket skaber behovet for en f\u00e6lles server til Single-Sign-On (SSO). Men hvordan h\u00e5ndterer man det, n\u00e5r identifikationsudbydere s\u00e5som AD eller andre, der ikke har yderligere attributter, allerede anvendes i forskellige projekter? Her kommer en klasse af systemer kaldet 'identifikationsbrokers' til unds\u00e6tning. De mest funktionelle repr\u00e6sentanter herfor er s\u00e5som Keycloak, Gravitee Access management osv. Ofte kan anvendelsesscenarierne v\u00e6re forskellige: maskinel interaktion, brugerdeltagelse osv. L\u00f8sningen skal st\u00f8tte et fleksibelt og skalerbart funktionalitetsniveau, der kan samle alle krav i \u00e9n l\u00f8sning, og denne l\u00f8sning i vores virksomhed er i \u00f8jeblikket identifikationsbrokeren \u2013 Keycloak. <\/p>\n<p><img decoding=\"async\" alt=\"SSO p\u00e5 mikroservice-arkitektur. Vi bruger 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 er et open source-produkt designet til identifikation og adgangskontrol, underst\u00f8ttet af RedHat. Det er fundamentet for virksomhedens produkter, der anvender SSO \u2013 RH-SSO.<\/p>\n<h3>Grundl\u00e6ggende begreber <\/h3>\n<p>\nF\u00f8r vi begynder at unders\u00f8ge l\u00f8sninger og tilgange, skal vi f\u00f8rst definere termerne og sekvensen af processer:<\/p>\n<p><img decoding=\"async\" alt=\"SSO p\u00e5 mikroservice-arkitektur. Vi bruger Keycloak. Del #1\" src=\"\/wp-content\/uploads\/2020\/02\/3a83d4364425aeed1019662fd1d5f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Identifikation<\/b> \u2014 det er en procedure for genkendelse af en enhed baseret p\u00e5 dens identifikator (simplere sagt, det er definitionen af navn, login eller nummer).<\/p>\n<p><b>Godkendelse<\/b> \u2013 det er en procedure til autentificering (brugeren bliver verificeret med en adgangskode, brev bliver verificeret med en elektronisk signatur osv.)<\/p>\n<p><b>Godkendelse<\/b> \u2013 det er at give adgang til en ressource (for eksempel til e-mail).<\/p>\n<h4>Identifikationsbrokeren Keycloak<\/h4>\n<p>\n<b>Keycloak<\/b> \u2014 det er en open source-l\u00f8sning til styring af identifikation og adgang, beregnet til brug i informationssystemer, hvor mikroservice-arkitekturm\u00f8nstre kan anvendes.<\/p>\n<p>Keycloak tilbyder funktioner s\u00e5som enkeltlogon (SSO), broker-identifikation og social login, brugerfederation, klientsystemer, administrationskonsol og konto- og managementkonsol.<\/p>\n<p>Den grundl\u00e6ggende funktionalitet, der underst\u00f8ttes i Keycloak:<\/p>\n<ul>\n<li>Single-Sign On og Single-Sign Out til browserbaserede applikationer.<\/li>\n<li>Underst\u00f8ttelse af OpenID\/OAuth 2.0\/SAML.<\/li>\n<li>Identitetsbrokering \u2013 autentificering via eksterne OpenID Connect eller SAML-identitetsudbydere.<\/li>\n<li>Social Login \u2013 st\u00f8tte til Google, GitHub, Facebook, Twitter til brugeridentifikation.<\/li>\n<li>Brugerfederation \u2013 synkronisering af brugere fra LDAP- og Active Directory-servere samt andre identitetsudbydere.<\/li>\n<li>Kerberos-bro \u2013 brug af Kerberos-server til automatisk autentificering af brugere.<\/li>\n<li>Admin Console \u2013 til centraliseret styring af indstillinger og parametre via Web.<\/li>\n<li>Account Management Console \u2013 til selvbetjening med brugerprofiler.<\/li>\n<li>Tilpasning af l\u00f8sningen baseret p\u00e5 virksomhedens branding.<\/li>\n<li>2FA-autentificering \u2013 st\u00f8tte til TOTP\/HOTP med Google Authenticator eller FreeOTP.<\/li>\n<li>Login Flow \u2013 brugere kan selvregistreres, genoprette og nulstille deres adgangskoder m.m.<\/li>\n<li>Session Management \u2013 administratorer kan styre brugersessioner fra et centralt sted.<\/li>\n<li>Token Mappers \u2013 binding af brugerattributter, roller og andre n\u00f8dvendige attributter i tokens.<\/li>\n<li>Fleksibel politikstyring via realm, applikation og brugere.<\/li>\n<li>CORS Support \u2013 klientadaptere har indbygget CORS-st\u00f8tte.<\/li>\n<li>Service Provider Interfaces (SPI) \u2013 et stort antal SPI'er, der muligg\u00f8r ops\u00e6tning af forskellige aspekter af serverens drift: autentificeringsstr\u00f8mme, identitetsudbydere, protokolmapping og meget mere.<\/li>\n<li>Klientadaptere til JavaScript-applikationer, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.<\/li>\n<li>St\u00f8tte til arbejde med forskellige applikationer, der underst\u00f8tter OpenID Connect Relying Party-library eller SAML 2.0 Service Provider Library.<\/li>\n<li>Mulighed for udvidelse ved hj\u00e6lp af plugins.<\/li>\n<\/ul>\n<p>\nTil CI\/CD-processer samt automatisering af administrationsprocesser i Keycloak kan REST API \/ JAVA API bruges. Dokumentation er tilg\u00e6ngelig elektronisk: <\/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>Enterprise-level identitetsudbydere (On-Premise)<\/h4>\n<p>\nMulighed for autentificering af brugere via User Federation-tjenester.<\/p>\n<p><img decoding=\"async\" alt=\"SSO p\u00e5 mikroservice-arkitektur. Vi bruger Keycloak. Del #1\" src=\"\/wp-content\/uploads\/2020\/02\/59bbeaf4630855467ddb003d52b0c1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEnd-to-end autentificering kan ogs\u00e5 anvendes \u2013 hvis brugere autentificeres p\u00e5 arbejdsstationer med Kerberos (LDAP eller AD), kan de automatisk autentificeres p\u00e5 Keycloak uden at skulle indtaste deres brugernavn og adgangskode igen. <\/p>\n<p>Til autentificering og efterf\u00f8lgende brugergodkendelse kan der anvendes en relationel database, hvilket er mest anvendeligt i udviklingsmilj\u00f8er, da det ikke medf\u00f8rer langvarige indstillinger og integrationer i de tidlige stadier af projekterne. Som standard bruger Keycloak en indbygget database til opbevaring af indstillinger og brugerdata.<\/p>\n<p>Listen over underst\u00f8ttede databaser er omfattende og inkluderer: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle og andre. De mest testede indtil videre er Oracle 12C Release1 RAC og Galera 3.12 cluster til MariaDB 10.1.19. <\/p>\n<h4>Identifikationsudbydere \u2014 social login <\/h4>\n<p>\nBrug af login fra sociale medier er muligt. For at aktivere muligheden for at autentificere brugere bruges Keycloaks administratorpanel. Der kr\u00e6ves ingen \u00e6ndringer i applikationernes kode, og denne funktionalitet er tilg\u00e6ngelig \"ud af boksen\" og kan aktiveres p\u00e5 enhver fase af projektimplementeringen.<\/p>\n<p><img decoding=\"async\" alt=\"SSO p\u00e5 mikroservice-arkitektur. Vi bruger Keycloak. Del #1\" src=\"\/wp-content\/uploads\/2020\/02\/546ddea10c79662ca37a448d3dfc1fd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFor brugergodkendelse kan OpenID\/SAML identitetsudbydere anvendes.<\/p>\n<h3>Typiske autoriseringsscenarier ved hj\u00e6lp af OAuth2 i Keycloak<\/h3>\n<p>\n<b>Authorization Code Flow <\/b> \u2014 bruges med serverapplikationer (server-side applications). En af de mest udbredte typer af autorisation, da den passer godt til serverapplikationer, hvor kildekoden og klientdataene ikke er tilg\u00e6ngelige for tredjeparter. Processen er i dette tilf\u00e6lde bygget op omkring omdirigering (redirection). Applikationen skal v\u00e6re i stand til at interagere med brugeragenten (user-agent), s\u00e5som en webbrowser \u2014 for at modtage autoriseringskoder via API, der omdirigeres gennem brugeragenten.<\/p>\n<p><b>Implicit Flow<\/b> \u2014 bruges af mobile eller webapplikationer (applikationer, der k\u00f8rer p\u00e5 brugerens enhed).<\/p>\n<p>Den implicit tilladelsestype anvendes af mobile og webapplikationer, hvor kundens fortrolighed ikke kan garanteres. Denne type tilladelse bruger ogs\u00e5 omdirigering af brugeragenten, hvor adgangstokenen sendes til brugeragenten for videre brug i applikationen. Dette g\u00f8r tokenen tilg\u00e6ngelig for brugeren og andre applikationer p\u00e5 brugerens enhed. Med denne tilladelsestype udf\u00f8res der ikke autentificering af applikationens legitimitet; i stedet er processen afh\u00e6ngig af omdirigerings-URL'en (som tidligere er registreret i tjenesten).<\/p>\n<p>Implicit Flow underst\u00f8tter ikke opdateringstokens (refresh tokens).<br \/>\n<br \/>\n<b>Client Credentials Grant Flow<\/b> \u2014 bruges n\u00e5r en applikation f\u00e5r adgang til API'en. Denne tilladelsestype anvendes normalt til \"server-til-server\" interaktioner, der skal udf\u00f8res i baggrunden uden \u00f8jeblikkelig brugerinteraktion. Client Credentials Flow tillader en webtjeneste (fortrolig klient) at anvende sine egne legitimationsoplysninger i stedet for at repr\u00e6sentere brugeren for autentificering ved opkald af en anden webtjeneste. For et h\u00f8jere sikkerhedsniveau kan den kaldende tjeneste bruge et certifikat (i stedet for et delt hemmelighed) som legitimationsoplysninger.<\/p>\n<p>OAuth2 specifikationen er beskrevet 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 og dets fordele<\/h3>\n<p>\nJWT (JSON Web Token) \u2014 en \u00e5ben standard (<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc7519\">https:\/\/tools.ietf.org\/html\/rfc7519<\/a><\/noindex>), der definerer en kompakt og selvst\u00e6ndig metode til sikker overf\u00f8rsel af information mellem parter i form af et JSON-objekt.<\/p>\n<p>I henhold til standarden best\u00e5r tokenen af tre dele i base-64 format, adskilt af punkter. Den f\u00f8rste del kaldes header og indeholder type token og navnet p\u00e5 hash-algoritmen til beregning af den digitale signatur. Den anden del gemmer den prim\u00e6re information (bruger, attributter osv.). Tredje del er den digitale signatur.<\/p>\n<p>..<br \/>\nGem aldrig tokenen i din database. For en gyldig token svarer til et kodeord; at gemme tokenen er det samme som at gemme kodeordet i klar tekst.<br \/>\n<b>Adgangstoken <\/b>\u2014 er et token, der giver ejeren adgang til serverens beskyttede ressourcer. Det har typisk en kort livscyklus og kan indeholde yderligere information, s\u00e5som IP-adressen p\u00e5 den part, der anmoder om dette token.<\/p>\n<p><b>Refresh-token <\/b>\u2014 er et token, der g\u00f8r det muligt for klienter at anmode om nye access-tokens, n\u00e5r deres levetid er udl\u00f8bet. Disse tokens gives typisk for en l\u00e6ngere periode.<\/p>\n<p>De vigtigste fordele ved at anvende i mikroservicearkitektur:<\/p>\n<ul>\n<li>Muligheden for at tilg\u00e5 forskellige applikationer og tjenester gennem \u00e9n enkelt godkendelse.<\/li>\n<li>Hvis der mangler en r\u00e6kke n\u00f8dvendige attributter i brugerprofilen, kan data beriges med oplysninger, der kan tilf\u00f8jes til payloaden, b\u00e5de automatisk og \"on the fly\".<\/li>\n<li>Ingen behov for at opbevare oplysninger om aktive sessioner, det serverbaserede applikation skal kun kontrollere signaturen.<\/li>\n<li>Mere fleksibel adgangsstyring takket v\u00e6re yderligere attributter i payloaden.<\/li>\n<li>Brugen af signatur p\u00e5 tokenet til headeren og payloaden \u00f8ger sikkerheden i l\u00f8sningen generelt.<\/li>\n<\/ul>\n<p><\/p>\n<h3>JWT-token \u2014 sammens\u00e6tning<\/h3>\n<p>\n<b>Overskrift<\/b> \u2014 som standard indeholder headeren kun tokenets type og den algoritme, der anvendes til kryptering.<\/p>\n<p>Tokenets type opbevares i n\u00f8glen \"typ\". N\u00f8glen \"typ\" ignoreres i JWT. Hvis n\u00f8glen \"typ\" er til stede, skal dens v\u00e6rdi v\u00e6re JWT for at angive, at dette objekt er et JSON Web Token.<\/p>\n<p>Den anden n\u00f8gle \"alg\" bestemmer den algoritme, der anvendes til at kryptere tokenet. Som standard b\u00f8r den v\u00e6re indstillet til HS256. Headeren kodet i base64.<\/p>\n<p>{ \"alg\": \"HS256\", \"typ\": \"JWT\"}<br \/>\n<b>Payload (indhold)<\/b> \u2014 i payloaden opbevares enhver information, der skal verificeres. Hver n\u00f8gle i payloaden kaldes en \"p\u00e5stand\". For eksempel kan man kun logge ind p\u00e5 applikationen ved invitation (lukket promo). N\u00e5r vi \u00f8nsker at invitere nogen til at deltage, sender vi dem en invitation via e-mail. Det er vigtigt at kontrollere, at e-mailadressen tilh\u00f8rer den person, der accepterer invitationen, s\u00e5 vi inkluderer denne adresse i payloaden, ved at gemme den i n\u00f8glen \"e-mail\".<\/p>\n<p>{ \"email\": \"example@x5.ru\" }<br \/>\n<br \/>\nN\u00f8glerne i payload kan v\u00e6re vilk\u00e5rlige. Der er dog flere reserverede:<\/p>\n<ul>\n<li>iss (Issuer) \u2014 angiver applikationen, som tokenet sendes fra.<\/li>\n<li>sub (Emne) \u2014 definerer emnet for tokens.<\/li>\n<li>aud (M\u00e5lgruppe) \u2013 et array af casesensitive strenge eller URI'er, der udg\u00f8r en liste over modtagere af dette token. N\u00e5r den modtagende part modtager en JWT med denne n\u00f8gle, skal den kontrollere, om den selv er blandt modtagerne \u2014 ellers skal token ignoreres.<\/li>\n<li>exp (Udl\u00f8bstid) \u2014 angiver, hvorn\u00e5r tokenet udl\u00f8ber. JWT-standard kr\u00e6ver, at tokens med udl\u00f8bet tid afvises i alle implementeringer. Exp-n\u00f8glen skal v\u00e6re en tidsstempel i unix-format.<\/li>\n<li>nbf (Ikke F\u00f8r) \u2014 det er et tidspunkt i unix-format, der definerer, hvorn\u00e5r tokenet bliver gyldigt.<\/li>\n<li>iat (Udstedt Tidsstempel) \u2014 denne n\u00f8gle repr\u00e6senterer det tidspunkt, hvor tokenet blev udstedt, og kan bruges til at bestemme alderen af JWT. Iat-n\u00f8glen skal v\u00e6re et tidsstempel i unix-format.<\/li>\n<li>Jti (JWT ID) \u2014 en streng, der definerer en unik identifikator for dette token med hensyn til store og sm\u00e5 bogstaver.<\/li>\n<\/ul>\n<p>\nDet er vigtigt at forst\u00e5, at nyttelasten ikke overf\u00f8res i krypteret form (selvom tokens kan v\u00e6re indlejrede og krypterede data kan overf\u00f8res derinde). Derfor kan man ikke gemme nogen hemmelige oplysninger i den. Ligesom headeren, er nyttelasten kodet i base64.<br \/>\n<b>Signatur<\/b> \u2014 n\u00e5r vi har header og payload, kan vi beregne signaturen.<\/p>\n<p>De base64-kodede header og payload tages og sammenf\u00f8jes til en streng adskilt af et punktum. Derefter gives denne streng og den hemmelige n\u00f8gle som input til den krypteringsalgoritme, der er angivet i headeren (n\u00f8gle \"alg\"). N\u00f8glen kan v\u00e6re enhver streng. L\u00e6ngere strenge vil v\u00e6re at foretr\u00e6kke, da de kr\u00e6ver l\u00e6ngere tid at kn\u00e6kke.<\/p>\n<p>{\"alg\":\"RSA1_5\",\"payload\":\"A128CBC-HS256\"}<\/p>\n<h3>Opbygning af en failover-arkitektur for Keycloak-klusteret<\/h3>\n<p>\nN\u00e5r der bruges et enkelt kluster til alle projekter, opst\u00e5r der \u00f8gede krav til SSO-l\u00f8sningen. N\u00e5r antallet af projekter ikke er stort, er disse krav ikke s\u00e5 m\u00e6rkbare for alle projekter, men med en stigning i antallet af brugere og integrationer stiger kravene til tilg\u00e6ngelighed og ydeevne. <\/p>\n<p>\u00d8get risiko for nedetid for den centrale SSO \u00f8ger kravene til architecture og de metoder, der anvendes til reservesystemer, og f\u00f8rer til meget strenge SLA'er. Som f\u00f8lge heraf har projekter ofte deres egen ikke-fejltolerante infrastruktur i udviklings- eller tidlige implementeringsfaser af l\u00f8sninger. Efterh\u00e5nden som udviklingen skrider frem, skal der t\u00e6nkes p\u00e5 muligheder for udvikling og skalering. Det er mest fleksibelt at bygge et fejltolerant cluster ved brug af container-virtualisering eller en hybrid tilgang. <\/p>\n<p>For at arbejde i Active\/Active og Active\/Passive cluster-tilstande er det n\u00f8dvendigt at sikre datakonsistens i den relationelle database \u2014 begge databasenoder skal synkroniseres i realtid mellem forskellige geografisk fordelte datacentre.<\/p>\n<p>Det enkleste eksempel p\u00e5 en fejltolerant installation.<\/p>\n<p><img decoding=\"async\" alt=\"SSO p\u00e5 mikroservice-arkitektur. Vi bruger Keycloak. Del #1\" src=\"\/wp-content\/uploads\/2020\/02\/c0df30a07e7dda5ae892a1fca3790a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvilke fordele giver brugen af et enkelt cluster:<\/p>\n<ul>\n<li>H\u00f8j tilg\u00e6ngelighed og ydeevne.<\/li>\n<li>Underst\u00f8ttelse af driftsformer: Active\/Active, Active\/Passive.<\/li>\n<li>Mulighed for dynamisk skalering \u2014 ved brug af container-virtualisering.<\/li>\n<li>Mulighed for centraliseret styring og overv\u00e5gning.<\/li>\n<li>En f\u00e6lles tilgang til identifikation\/authentifikation\/autorisation af brugere i projekter.<\/li>\n<li>Mere gennemsigtig interaktion mellem forskellige projekter uden brugerinddragelse.<\/li>\n<li>Mulighed for genbrug af JWT-token i forskellige projekter.<\/li>\n<li>En enkelt tillidspunkt.<\/li>\n<li>Hurtigere opstart af projekter ved at bruge microservices\/container-virtualisering (uden behov for at ops\u00e6tte og konfigurere yderligere komponenter).<\/li>\n<li>Mulighed for at k\u00f8be kommerciel support fra leverand\u00f8ren. <\/li>\n<\/ul>\n<p><\/p>\n<h3>Hvad man skal v\u00e6re opm\u00e6rksom p\u00e5 ved planl\u00e6gning af clusteret<\/h3>\n<p><\/p>\n<h4>DBMS<\/h4>\n<p>\nKeycloak bruger et databaseh\u00e5ndteringssystem til at gemme: realms, clients, users mv.<br \/>\nEt stort udvalg af databasesystemer underst\u00f8ttes: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak leveres med en indbygget relationel database. Det anbefales at bruge den til let belastede milj\u00f8er, s\u00e5som udviklingsmilj\u00f8er.<\/p>\n<p>For at arbejde i Active\/Active og Active\/Passive cluster-tilstande er det n\u00f8dvendigt at sikre datakonsistens i den relationelle database, og begge databasenoder er synkront replikerede mellem datacentre.<\/p>\n<h4>Distribueret cache (Infinspan)<\/h4>\n<p>\nFor the proper operation of the cluster, additional synchronization of the following cache types is required using JBoss Data Grid:<\/p>\n<p>Authentication sessions \u2014 used to retain data during the authentication of a specific user. Requests from this cache usually involve only the browser and the Keycloak server, not the application.<\/p>\n<p>Action tokens \u2014 are used for scenarios where a user must confirm an action asynchronously (via email). For example, during the forget password flow, the actionTokens cache in Infinispan is used to track metadata about related action tokens that have already been used, so they cannot be reused.<\/p>\n<p>Caching and invalidation of persistent data \u2013 is used for caching persistent data to avoid unnecessary database queries. When any Keycloak server updates data, all other Keycloak servers in all data centers must be aware of this.<\/p>\n<p>Work \u2014 is used only to send messages about invalidation between cluster nodes and data centers. <\/p>\n<p>User sessions \u2014 are used to retain data about user sessions that are valid during the user's browser session. The cache must handle HTTP requests from end users and applications. <\/p>\n<p>Brute force protection \u2014 is used to track data about failed login attempts. <\/p>\n<h4>Load Balancing<\/h4>\n<p>\nThe load balancer serves as the single entry point into Keycloak and must support sticky sessions. <\/p>\n<h4>Application servers<\/h4>\n<p>\nAre used to control the interaction between components and can be virtualized or containerized using existing automation tools and dynamic scaling of infrastructure automation tools. The most common deployment scenarios are in OpenShift, Kubernetes, and Rancher.<\/p>\n<p>This concludes the first part \u2014 the theoretical one. The following cycles of articles will cover examples of integrations with various identity providers and setup examples.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 on microservices architecture. Using Keycloak. Part No. 1 | ProHoster","description":"In any large company, and X5 Retail Group is no exception, the number of projects requiring user authentication increases as it develops.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/40865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=40865"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/40865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/40866"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=40865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=40865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=40865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}