I enhver stor virksomhed, inklusive X5 Retail Group, stiger antallet af projekter, hvor brugerautorisering er nødvendig, i takt med udviklingen. Over tid er der behov for en sømløs overgang for brugerne fra ĂŠn applikation til en anden, hvilket skaber behovet for en fĂŚlles server til Single-Sign-On (SSO). Men hvordan hĂĽndterer man det, nĂĽr identifikationsudbydere sĂĽsom AD eller andre, der ikke har yderligere attributter, allerede anvendes i forskellige projekter? Her kommer en klasse af systemer kaldet 'identifikationsbrokers' til undsĂŚtning. De mest funktionelle reprĂŚsentanter herfor er sĂĽsom Keycloak, Gravitee Access management osv. Ofte kan anvendelsesscenarierne vĂŚre forskellige: maskinel interaktion, brugerdeltagelse osv. Løsningen skal støtte et fleksibelt og skalerbart funktionalitetsniveau, der kan samle alle krav i ĂŠn løsning, og denne løsning i vores virksomhed er i øjeblikket identifikationsbrokeren â Keycloak.

Keycloak er et open source-produkt designet til identifikation og adgangskontrol, understøttet af RedHat. Det er fundamentet for virksomhedens produkter, der anvender SSO â RH-SSO.
GrundlĂŚggende begreber
Før vi begynder at undersøge løsninger og tilgange, skal vi først definere termerne og sekvensen af processer:

Identifikation â det er en procedure for genkendelse af en enhed baseret pĂĽ dens identifikator (simplere sagt, det er definitionen af navn, login eller nummer).
Godkendelse â det er en procedure til autentificering (brugeren bliver verificeret med en adgangskode, brev bliver verificeret med en elektronisk signatur osv.)
Godkendelse â det er at give adgang til en ressource (for eksempel til e-mail).
Identifikationsbrokeren Keycloak
Keycloak â det er en open source-løsning til styring af identifikation og adgang, beregnet til brug i informationssystemer, hvor mikroservice-arkitekturmønstre kan anvendes.
Keycloak tilbyder funktioner sĂĽsom enkeltlogon (SSO), broker-identifikation og social login, brugerfederation, klientsystemer, administrationskonsol og konto- og managementkonsol.
Den grundlÌggende funktionalitet, der understøttes i Keycloak:
- Single-Sign On og Single-Sign Out til browserbaserede applikationer.
- Understøttelse af OpenID/OAuth 2.0/SAML.
- Identitetsbrokering â autentificering via eksterne OpenID Connect eller SAML-identitetsudbydere.
- Social Login â støtte til Google, GitHub, Facebook, Twitter til brugeridentifikation.
- Brugerfederation â synkronisering af brugere fra LDAP- og Active Directory-servere samt andre identitetsudbydere.
- Kerberos-bro â brug af Kerberos-server til automatisk autentificering af brugere.
- Admin Console â til centraliseret styring af indstillinger og parametre via Web.
- Account Management Console â til selvbetjening med brugerprofiler.
- Tilpasning af løsningen baseret pü virksomhedens branding.
- 2FA-autentificering â støtte til TOTP/HOTP med Google Authenticator eller FreeOTP.
- Login Flow â brugere kan selvregistreres, genoprette og nulstille deres adgangskoder m.m.
- Session Management â administratorer kan styre brugersessioner fra et centralt sted.
- Token Mappers â binding af brugerattributter, roller og andre nødvendige attributter i tokens.
- Fleksibel politikstyring via realm, applikation og brugere.
- CORS Support â klientadaptere har indbygget CORS-støtte.
- Service Provider Interfaces (SPI) â et stort antal SPI'er, der muliggør opsĂŚtning af forskellige aspekter af serverens drift: autentificeringsstrømme, identitetsudbydere, protokolmapping og meget mere.
- Klientadaptere til JavaScript-applikationer, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
- Støtte til arbejde med forskellige applikationer, der understøtter OpenID Connect Relying Party-library eller SAML 2.0 Service Provider Library.
- Mulighed for udvidelse ved hjĂŚlp af plugins.
Til CI/CD-processer samt automatisering af administrationsprocesser i Keycloak kan REST API / JAVA API bruges. Dokumentation er tilgĂŚngelig elektronisk:
REST API
JAVA API
Enterprise-level identitetsudbydere (On-Premise)
Mulighed for autentificering af brugere via User Federation-tjenester.

End-to-end autentificering kan ogsĂĽ anvendes â hvis brugere autentificeres pĂĽ arbejdsstationer med Kerberos (LDAP eller AD), kan de automatisk autentificeres pĂĽ Keycloak uden at skulle indtaste deres brugernavn og adgangskode igen.
Til autentificering og efterfølgende brugergodkendelse kan der anvendes en relationel database, hvilket er mest anvendeligt i udviklingsmiljøer, da det ikke medfører langvarige indstillinger og integrationer i de tidlige stadier af projekterne. Som standard bruger Keycloak en indbygget database til opbevaring af indstillinger og brugerdata.
Listen over understøttede 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.
Identifikationsudbydere â social login
Brug af login fra sociale medier er muligt. For at aktivere muligheden for at autentificere brugere bruges Keycloaks administratorpanel. Der krĂŚves ingen ĂŚndringer i applikationernes kode, og denne funktionalitet er tilgĂŚngelig "ud af boksen" og kan aktiveres pĂĽ enhver fase af projektimplementeringen.

For brugergodkendelse kan OpenID/SAML identitetsudbydere anvendes.
Typiske autoriseringsscenarier ved hjĂŚlp af OAuth2 i Keycloak
Authorization Code Flow â 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ĂŚngelige for tredjeparter. Processen er i dette tilfĂŚlde bygget op omkring omdirigering (redirection). Applikationen skal vĂŚre i stand til at interagere med brugeragenten (user-agent), sĂĽsom en webbrowser â for at modtage autoriseringskoder via API, der omdirigeres gennem brugeragenten.
Implicit Flow â bruges af mobile eller webapplikationer (applikationer, der kører pĂĽ brugerens enhed).
Den implicit tilladelsestype anvendes af mobile og webapplikationer, hvor kundens fortrolighed ikke kan garanteres. Denne type tilladelse bruger ogsü omdirigering af brugeragenten, hvor adgangstokenen sendes til brugeragenten for videre brug i applikationen. Dette gør tokenen tilgÌngelig for brugeren og andre applikationer pü brugerens enhed. Med denne tilladelsestype udføres der ikke autentificering af applikationens legitimitet; i stedet er processen afhÌngig af omdirigerings-URL'en (som tidligere er registreret i tjenesten).
Implicit Flow understøtter ikke opdateringstokens (refresh tokens).
Client Credentials Grant Flow â bruges nĂĽr en applikation fĂĽr adgang til API'en. Denne tilladelsestype anvendes normalt til "server-til-server" interaktioner, der skal udføres i baggrunden uden øjeblikkelig brugerinteraktion. Client Credentials Flow tillader en webtjeneste (fortrolig klient) at anvende sine egne legitimationsoplysninger i stedet for at reprĂŚsentere brugeren for autentificering ved opkald af en anden webtjeneste. For et højere sikkerhedsniveau kan den kaldende tjeneste bruge et certifikat (i stedet for et delt hemmelighed) som legitimationsoplysninger.
OAuth2 specifikationen er beskrevet i
JWT token og dets fordele
JWT (JSON Web Token) â en ĂĽben standard (), der definerer en kompakt og selvstĂŚndig metode til sikker overførsel af information mellem parter i form af et JSON-objekt.
I henhold til standarden bestür tokenen af tre dele i base-64 format, adskilt af punkter. Den første del kaldes header og indeholder type token og navnet pü hash-algoritmen til beregning af den digitale signatur. Den anden del gemmer den primÌre information (bruger, attributter osv.). Tredje del er den digitale signatur.
..
Gem 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.
Adgangstoken â er et token, der giver ejeren adgang til serverens beskyttede ressourcer. Det har typisk en kort livscyklus og kan indeholde yderligere information, sĂĽsom IP-adressen pĂĽ den part, der anmoder om dette token.
Refresh-token â er et token, der gør det muligt for klienter at anmode om nye access-tokens, nĂĽr deres levetid er udløbet. Disse tokens gives typisk for en lĂŚngere periode.
De vigtigste fordele ved at anvende i mikroservicearkitektur:
- Muligheden for at tilgĂĽ forskellige applikationer og tjenester gennem ĂŠn enkelt godkendelse.
- Hvis der mangler en rÌkke nødvendige attributter i brugerprofilen, kan data beriges med oplysninger, der kan tilføjes til payloaden, büde automatisk og "on the fly".
- Ingen behov for at opbevare oplysninger om aktive sessioner, det serverbaserede applikation skal kun kontrollere signaturen.
- Mere fleksibel adgangsstyring takket vĂŚre yderligere attributter i payloaden.
- Brugen af signatur pü tokenet til headeren og payloaden øger sikkerheden i løsningen generelt.
JWT-token â sammensĂŚtning
Overskrift â som standard indeholder headeren kun tokenets type og den algoritme, der anvendes til kryptering.
Tokenets type opbevares i nøglen "typ". Nøglen "typ" ignoreres i JWT. Hvis nøglen "typ" er til stede, skal dens vÌrdi vÌre JWT for at angive, at dette objekt er et JSON Web Token.
Den anden nøgle "alg" bestemmer den algoritme, der anvendes til at kryptere tokenet. Som standard bør den vÌre indstillet til HS256. Headeren kodet i base64.
{ "alg": "HS256", "typ": "JWT"}
Payload (indhold) â i payloaden opbevares enhver information, der skal verificeres. Hver nøgle i payloaden kaldes en "pĂĽstand". For eksempel kan man kun logge ind pĂĽ applikationen ved invitation (lukket promo). NĂĽr vi ønsker at invitere nogen til at deltage, sender vi dem en invitation via e-mail. Det er vigtigt at kontrollere, at e-mailadressen tilhører den person, der accepterer invitationen, sĂĽ vi inkluderer denne adresse i payloaden, ved at gemme den i nøglen "e-mail".
{ "email": "example@x5.ru" }
Nøglerne i payload kan vÌre vilkürlige. Der er dog flere reserverede:
- iss (Issuer) â angiver applikationen, som tokenet sendes fra.
- sub (Emne) â definerer emnet for tokens.
- aud (MĂĽlgruppe) â et array af casesensitive strenge eller URI'er, der udgør en liste over modtagere af dette token. NĂĽr den modtagende part modtager en JWT med denne nøgle, skal den kontrollere, om den selv er blandt modtagerne â ellers skal token ignoreres.
- exp (Udløbstid) â angiver, hvornĂĽr tokenet udløber. JWT-standard krĂŚver, at tokens med udløbet tid afvises i alle implementeringer. Exp-nøglen skal vĂŚre en tidsstempel i unix-format.
- nbf (Ikke Før) â det er et tidspunkt i unix-format, der definerer, hvornĂĽr tokenet bliver gyldigt.
- iat (Udstedt Tidsstempel) â denne nøgle reprĂŚsenterer det tidspunkt, hvor tokenet blev udstedt, og kan bruges til at bestemme alderen af JWT. Iat-nøglen skal vĂŚre et tidsstempel i unix-format.
- Jti (JWT ID) â en streng, der definerer en unik identifikator for dette token med hensyn til store og smĂĽ bogstaver.
Det er vigtigt at forstü, at nyttelasten ikke overføres i krypteret form (selvom tokens kan vÌre indlejrede og krypterede data kan overføres derinde). Derfor kan man ikke gemme nogen hemmelige oplysninger i den. Ligesom headeren, er nyttelasten kodet i base64.
Signatur â nĂĽr vi har header og payload, kan vi beregne signaturen.
De base64-kodede header og payload tages og sammenføjes til en streng adskilt af et punktum. Derefter gives denne streng og den hemmelige nøgle som input til den krypteringsalgoritme, der er angivet i headeren (nøgle "alg"). Nøglen kan vÌre enhver streng. LÌngere strenge vil vÌre at foretrÌkke, da de krÌver lÌngere tid at knÌkke.
{"alg":"RSA1_5", "payload":"A128CBC-HS256"}
Opbygning af en failover-arkitektur for Keycloak-klusteret
Nür der bruges et enkelt kluster til alle projekter, opstür der øgede krav til SSO-løsningen. Nür antallet af projekter ikke er stort, er disse krav ikke sü mÌrkbare for alle projekter, men med en stigning i antallet af brugere og integrationer stiger kravene til tilgÌngelighed og ydeevne.
Ăget risiko for nedetid for den centrale SSO øger kravene til architecture og de metoder, der anvendes til reservesystemer, og fører til meget strenge SLA'er. Som følge heraf har projekter ofte deres egen ikke-fejltolerante infrastruktur i udviklings- eller tidlige implementeringsfaser af løsninger. EfterhĂĽnden som udviklingen skrider frem, skal der tĂŚnkes pĂĽ muligheder for udvikling og skalering. Det er mest fleksibelt at bygge et fejltolerant cluster ved brug af container-virtualisering eller en hybrid tilgang.
For at arbejde i Active/Active og Active/Passive cluster-tilstande er det nødvendigt at sikre datakonsistens i den relationelle database â begge databasenoder skal synkroniseres i realtid mellem forskellige geografisk fordelte datacentre.
Det enkleste eksempel pĂĽ en fejltolerant installation.

Hvilke fordele giver brugen af et enkelt cluster:
- Høj tilgÌngelighed og ydeevne.
- Understøttelse af driftsformer: Active/Active, Active/Passive.
- Mulighed for dynamisk skalering â ved brug af container-virtualisering.
- Mulighed for centraliseret styring og overvĂĽgning.
- En fĂŚlles tilgang til identifikation/authentifikation/autorisation af brugere i projekter.
- Mere gennemsigtig interaktion mellem forskellige projekter uden brugerinddragelse.
- Mulighed for genbrug af JWT-token i forskellige projekter.
- En enkelt tillidspunkt.
- Hurtigere opstart af projekter ved at bruge microservices/container-virtualisering (uden behov for at opsĂŚtte og konfigurere yderligere komponenter).
- Mulighed for at købe kommerciel support fra leverandøren.
Hvad man skal vĂŚre opmĂŚrksom pĂĽ ved planlĂŚgning af clusteret
DBMS
Keycloak bruger et databasehĂĽndteringssystem til at gemme: realms, clients, users mv.
Et stort udvalg af databasesystemer understøttes: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak leveres med en indbygget relationel database. Det anbefales at bruge den til let belastede miljøer, süsom udviklingsmiljøer.
For at arbejde i Active/Active og Active/Passive cluster-tilstande er det nødvendigt at sikre datakonsistens i den relationelle database, og begge databasenoder er synkront replikerede mellem datacentre.
Distribueret cache (Infinspan)
For the proper operation of the cluster, additional synchronization of the following cache types is required using JBoss Data Grid:
Authentication sessions â 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.
Action tokens â 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.
Caching and invalidation of persistent data â 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.
Work â is used only to send messages about invalidation between cluster nodes and data centers.
User sessions â 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.
Brute force protection â is used to track data about failed login attempts.
Load Balancing
The load balancer serves as the single entry point into Keycloak and must support sticky sessions.
Application servers
Are 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.
This concludes the first part â the theoretical one. The following cycles of articles will cover examples of integrations with various identity providers and setup examples.
Kilde: habr.com
