TL; DR: se jkun hemm deskrizzjoni ta 'Keycloak, sistema ta' kontroll ta 'aċċess ta' sors miftuħ, analiżi tal-istruttura interna, dettalji tal-konfigurazzjoni.
Introduzzjoni u Ideat Ewlenin
F'dan l-artikolu, se naraw l-ideat bażiċi li għandek iżżomm f'moħħok meta tuża cluster Keycloak fuq Kubernetes.
Jekk trid tkun taf aktar dwar Keycloak, irreferi għall-links fl-aħħar tal-artiklu. Sabiex issir aktar mgħaddsa fil-prattika, tista 'tistudja repożitorju tagħna b'modulu li jimplimenta l-ideat ewlenin ta 'dan l-artikolu (il-gwida tat-tnedija tinsab hemm, dan l-artikolu se jipprovdi ħarsa ġenerali lejn l-apparat u s-settings, madwar. traduttur).
Keycloak hija sistema komprensiva miktuba bil-Java u mibnija fuq server ta 'applikazzjoni Wildfly. Fil-qosor, huwa qafas għall-awtorizzazzjoni li jagħti lill-utenti tal-applikazzjoni kapaċitajiet ta 'federazzjoni u SSO (single sign-on).
Nistednuk taqra l-uffiċjal website jew Wikipedija għal fehim dettaljat.
Tnedija Keycloak
Keycloak jeħtieġ żewġ sorsi ta 'dejta persistenti biex jaħdem:
Database użata biex taħżen data stabbilita, bħal informazzjoni dwar l-utent
Datagrid cache, li hija użata biex taħżen data mid-database, kif ukoll biex taħżen xi metadata ta 'ħajja qasira u li tinbidel ta' spiss, bħal sessjonijiet tal-utent. Implimentati Infinispan, li ġeneralment tkun ferm aktar mgħaġġla mid-database. Iżda fi kwalunkwe każ, id-dejta ssejvjata f'Infinispan hija effimera - u m'għandhiex għalfejn tiġi ssejvjata kullimkien meta l-cluster jerġa' jinbeda.
Keycloak jaħdem f'erba' modi differenti:
Normali - proċess wieħed u wieħed biss, ikkonfigurat permezz ta 'fajl standalone.xml
Raggruppament regolari (għażla ta 'disponibbiltà għolja) - il-proċessi kollha għandhom jużaw l-istess konfigurazzjoni, li għandha tkun sinkronizzata manwalment. Is-settings huma maħżuna f'fajl standalone-ha.xml, Barra minn hekk għandek bżonn tagħmel aċċess kondiviż għad-database u load balancer.
cluster tad-dominju — il-bidu ta’ cluster fil-modalità normali malajr isir kompitu ta’ rutina u tedjanti hekk kif il-cluster jikber, peress li kull darba li tinbidel il-konfigurazzjoni, il-bidliet kollha jridu jsiru fuq kull nodu tal-cluster. Il-mod ta 'tħaddim tad-dominju jsolvi din il-kwistjoni billi jistabbilixxi xi post ta' ħażna kondiviż u jippubblika l-konfigurazzjoni. Dawn is-settings huma maħżuna fil-fajl domain.xml
Replikazzjoni bejn ċentri tad-dejta — jekk trid tħaddem Keycloak f'grupp ta' diversi ċentri tad-dejta, ħafna drabi f'postijiet ġeografiċi differenti. F'din l-għażla, kull ċentru tad-dejta se jkollu l-cluster tiegħu ta 'servers Keycloak.
F'dan l-artikolu ser nikkunsidraw fid-dettall it-tieni għażla, jiġifieri cluster regolari, u se nmissu wkoll ftit is-suġġett tar-replikazzjoni bejn iċ-ċentri tad-dejta, peress li jagħmel sens li tmexxi dawn iż-żewġ għażliet f'Kubernetes. Fortunatament, f'Kubernetes m'hemm l-ebda problema fis-sinkronizzazzjoni tas-settings ta 'diversi imżiewed (nodi Keycloak), għalhekk cluster tad-dominju Mhux se jkun diffiċli ħafna li tagħmel.
Ukoll jekk jogħġbok innota li l-kelma cluster għall-bqija tal-artikolu se japplika biss għal grupp ta 'nodi Keycloak li jaħdmu flimkien, m'hemmx bżonn li tirreferi għal cluster Kubernetes.
Cluster Keycloak regolari
Biex tħaddem Keycloak f'din il-modalità għandek bżonn:
kkonfigurat database kondiviża esterna
tinstalla load balancer
għandhom netwerk intern b'appoġġ multicast IP
Aħna mhux se niddiskutu t-twaqqif ta 'database esterna, peress li mhuwiex l-iskop ta' dan l-artikolu. Ejja nassumu li hemm database li taħdem x'imkien - u għandna punt ta 'konnessjoni magħha. Aħna sempliċiment inżidu din id-dejta mal-varjabbli ambjentali.
Biex tifhem aħjar kif jaħdem Keycloak f'cluster ta' failover (HA), huwa importanti li tkun taf kemm dan kollu jiddependi fuq il-kapaċitajiet ta' clustering ta' Wildfly.
Wildfly juża diversi sottosistemi, uħud minnhom jintużaw bħala load balancer, uħud għat-tolleranza tal-ħsarat. Il-load balancer jiżgura d-disponibbiltà tal-applikazzjoni meta node tal-cluster ikun mgħobbi żżejjed, u t-tolleranza tal-ħsarat tiżgura d-disponibbiltà tal-applikazzjoni anki jekk xi nodi tal-cluster ifallu. Xi wħud minn dawn is-sottosistemi:
mod_cluster: Jaħdem flimkien ma 'Apache bħala bilanċjar tat-tagħbija HTTP, jiddependi fuq TCP multicast biex issib hosts awtomatikament. Jista 'jiġi sostitwit b'balancer estern.
infinispan: Cache distribwit li juża kanali JGroups bħala saff tat-trasport. Barra minn hekk, jista 'juża l-protokoll HotRod biex jikkomunika ma' cluster Infinispan estern biex jissinkronizza l-kontenut tal-cache.
jgroups: Jipprovdi appoġġ għall-komunikazzjoni tal-grupp għal servizzi disponibbli ħafna bbażati fuq kanali JGroups. Il-pajpijiet bl-isem jippermettu li l-istanzi tal-applikazzjoni fi cluster jiġu konnessi fi gruppi sabiex il-komunikazzjoni jkollha proprjetajiet bħall-affidabbiltà, l-ordni, u s-sensittività għall-fallimenti.
Load Balancer
Meta tinstalla balancer bħala kontrollur tad-dħul fi cluster Kubernetes, huwa importanti li wieħed iżomm f'moħħu l-affarijiet li ġejjin:
Keycloak jassumi li l-indirizz remot tal-klijent li jgħaqqad permezz HTTP mas-server ta 'awtentikazzjoni huwa l-indirizz IP reali tal-kompjuter tal-klijent. Is-settings tal-balancer u l-ingress għandhom jistabbilixxu headers HTTP b'mod korrett X-Forwarded-For и X-Forwarded-Proto, u ssalva wkoll it-titlu oriġinali HOST. L-aħħar verżjoni ingress-nginx (>0.22.0) tiddiżattiva dan awtomatikament
Attivazzjoni tal-bandiera proxy-address-forwarding billi tistabbilixxi varjabbli ambjentali PROXY_ADDRESS_FORWARDING в true jagħti lil Keycloak il-fehim li qed jaħdem wara prokura.
Għandek bżonn ukoll li tippermetti sessjonijiet li jwaħħlu fid-dħul. Keycloak juża cache Infinispan distribwit biex jaħżen id-dejta assoċjata mas-sessjoni ta 'awtentikazzjoni attwali u s-sessjoni tal-utent. Il-caches joperaw b'mod awtomatiku ma' sid wieħed, fi kliem ieħor, dik is-sessjoni partikolari hija maħżuna fuq xi nodu fil-cluster, u nodi oħra jridu jfittxuha mill-bogħod jekk ikollhom bżonn aċċess għal dik is-sessjoni.
Speċifikament, kuntrarjament għad-dokumentazzjoni, it-twaħħil ta 'sessjoni bil-cookie tal-isem ma ħadimx għalina AUTH_SESSION_ID. Keycloak għandu redirect loop, għalhekk nirrakkomandaw li tagħżel isem tal-cookie differenti għas-sessjoni li twaħħal.
Keycloak jehmeż ukoll l-isem tan-node li wieġeb l-ewwel AUTH_SESSION_ID, u peress li kull node fil-verżjoni disponibbli ħafna juża l-istess database, kull wieħed minnhom irid ikollok identifikatur tan-nodi separat u uniku għall-ġestjoni tat-tranżazzjonijiet. Huwa rakkomandat li tpoġġi JAVA_OPTS parametri jboss.node.name и jboss.tx.node.id uniku għal kull nodu - tista ', pereżempju, tpoġġi l-isem tal-pod. Jekk tpoġġi isem pod, tinsiex dwar il-limitu ta '23 karattru għall-varjabbli jboss, għalhekk huwa aħjar li tuża StatefulSet aktar milli Deployment.
Rake ieħor - jekk il-pod titħassar jew jerġa 'jibda, il-cache tiegħu jintilef. Meta wieħed iqis dan, ta' min jiġi stabbilit in-numru ta' sidien tal-cache għall-caches kollha għal mill-inqas tnejn, sabiex tibqa' kopja tal-cache. Is-soluzzjoni hija li taħdem skript għal Wildfly meta tibda l-pod, poġġiha fid-direttorju /opt/jboss/startup-scripts fil-kontenitur:
Kontenut tal-Iskript
embed-server --server-config=standalone-ha.xml --std-out=echo
batch
echo * Setting CACHE_OWNERS to "${env.CACHE_OWNERS}" in all cache-containers
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
run-batch
stop-embedded-server
imbagħad issettja l-valur tal-varjabbli ambjentali CACHE_OWNERS għal dak meħtieġ.
Netwerk privat b'appoġġ multicast IP
Jekk tuża Weavenet bħala CNI, il-multicast jaħdem immedjatament - u n-nodi Keycloak tiegħek jaraw lil xulxin hekk kif jitnedew.
Jekk m'għandekx appoġġ multicast ip fil-cluster Kubernetes tiegħek, tista 'tikkonfigura JGroups biex taħdem ma' protokolli oħra biex issib nodi.
L-ewwel għażla hija li tuża KUBE_DNSli juża headless service biex issib in-nodi Keycloak, inti sempliċiment tgħaddi lil JGroups l-isem tas-servizz li se jintuża biex issib in-nodi.
Għażla oħra hija li tuża l-metodu KUBE_PING, li taħdem mal-API biex tfittex nodi (jeħtieġlek tikkonfigura serviceAccount bid-drittijiet list и get, u mbagħad ikkonfigura l-imżiewed biex jaħdmu ma 'dan serviceAccount).
Il-mod kif JGroups isibu nodi huwa kkonfigurat billi jiġu stabbiliti varjabbli ambjentali JGROUPS_DISCOVERY_PROTOCOL и JGROUPS_DISCOVERY_PROPERTIES. Biex KUBE_PING għandek bżonn tagħżel imżiewed billi tistaqsi namespace и labels.
️ Jekk tuża multicast u tħaddem żewġ raggruppamenti Keycloak jew aktar fi cluster wieħed ta’ Kubernetes (ejja ngħidu wieħed fl-ispazju tal-isem production, it-tieni - staging) - nodi ta' cluster wieħed Keycloak jistgħu jingħaqdu ma' cluster ieħor. Kun żgur li tuża indirizz multicast uniku għal kull cluster billi tistabbilixxi varjabblijboss.default.multicast.address и jboss.modcluster.multicast.address в JAVA_OPTS.
Replikazzjoni bejn ċentri tad-dejta
Связь
Keycloak juża diversi clusters separati ta' cache Infinispan għal kull ċentru tad-dejta fejn jinsabu clusters Keycloack magħmulin minn nodi Keycloak. Iżda m'hemm l-ebda differenza bejn in-nodi Keycloak f'ċentri tad-dejta differenti.
Nodi Keycloak jużaw Java Data Grid esterna (servers Infinispan) għall-komunikazzjoni bejn iċ-ċentri tad-data. Il-komunikazzjoni taħdem skont il-protokoll Infinispan HotRod.
Il-caches Infinispan għandhom jiġu kkonfigurati bl-attribut remoteStore, sabiex id-dejta tkun tista’ tinħażen mill-bogħod (f’ċentru tad-dejta ieħor, madwar. traduttur) caches. Hemm raggruppamenti infinispan separati fost is-servers JDG, sabiex id-dejta maħżuna fuq JDG1 fuq il-post site1 se jiġi replikat għal JDG2 fuq il-post site2.
U fl-aħħarnett, is-server JDG li jirċievi jinnotifika lis-servers Keycloak tal-cluster tiegħu permezz ta 'konnessjonijiet tal-klijenti, li hija karatteristika tal-protokoll HotRod. Keycloak nodi fuq site2 jaġġornaw il-caches Infinispan tagħhom u s-sessjoni speċifika tal-utent issir disponibbli wkoll fuq in-nodi Keycloak fuq site2.
Għal xi caches, huwa wkoll possibbli li ma tagħmilx backups u tevita kompletament il-kitba tad-dejta permezz tas-server Infinispan. Biex tagħmel dan għandek bżonn tneħħi l-issettjar remote-store cache Infinispan speċifiku (fil-fajl standalone-ha.xml), wara xi wħud speċifiċi replicated-cache mhux se jkun aktar meħtieġ ukoll fuq in-naħa tas-server Infinispan.
Twaqqif ta 'caches
Hemm żewġ tipi ta’ caches f’Keycloak:
Lokali. Hija tinsab ħdejn id-database u sservi biex tnaqqas it-tagħbija fuq id-database, kif ukoll biex tnaqqas il-latenza tar-rispons. Dan it-tip ta 'cache jaħżen isfera, klijenti, rwoli, u metadejta tal-utent. Dan it-tip ta 'cache mhuwiex replikat, anki jekk il-cache hija parti minn cluster Keycloak. Jekk dħul fil-cache tinbidel, jintbagħat messaġġ dwar il-bidla lis-servers li jifdal fil-cluster, u wara dan id-dħul jiġi eskluż mill-cache. Ara d-deskrizzjoni work Ara hawn taħt għal deskrizzjoni aktar dettaljata tal-proċedura.
Replikat. Jipproċessa sessjonijiet tal-utenti, tokens offline, u jimmonitorja wkoll l-iżbalji tal-login biex jiskopri tentattivi ta’ phishing tal-password u attakki oħra. Id-dejta maħżuna f'dawn il-caches hija temporanja, maħżuna biss fir-RAM, iżda tista' tiġi replikata madwar il-cluster.
Infinispan caches
Sessjonijiet - kunċett f'Keycloak, caches separati msejħa authenticationSessions, huma użati biex jaħżnu data ta 'utenti speċifiċi. Talbiet minn dawn il-caches huma ġeneralment meħtieġa mill-browser u mis-servers Keycloak, mhux mill-applikazzjonijiet. Dan huwa fejn tidħol id-dipendenza fuq sessjonijiet li jwaħħlu, u tali caches infushom m'għandhomx għalfejn jiġu replikati, anke fil-każ tal-modalità Attiva-Attiva.
Tokens ta' Azzjoni. Kunċett ieħor, normalment użat għal diversi xenarji meta, pereżempju, l-utent irid jagħmel xi ħaġa b'mod asinkroniku bil-posta. Per eżempju, matul il-proċedura forget password cache actionTokens użat biex jintraċċa metadata ta 'tokens assoċjati - pereżempju, token diġà intuża u ma jistax jerġa' jiġi attivat. Dan it-tip ta 'cache tipikament jeħtieġ li jiġi replikat bejn iċ-ċentri tad-dejta.
Caching u aging tad-dejta maħżuna jaħdem biex itaffi t-tagħbija fuq id-database. Dan it-tip ta 'caching itejjeb il-prestazzjoni, iżda jżid problema ovvja. Jekk server Keycloak wieħed jaġġorna d-dejta, is-servers l-oħra għandhom jiġu nnotifikati sabiex ikunu jistgħu jaġġornaw id-dejta fil-caches tagħhom. Keycloak juża caches lokali realms, users и authorization għall-caching tad-data mid-database.
Hemm ukoll cache separata work, li hija replikata fiċ-ċentri tad-dejta kollha. Hija nnifisha ma taħżen l-ebda dejta mid-database, iżda sservi biex tibgħat messaġġi dwar it-tixjiħ tad-dejta lil cluster nodes bejn iċ-ċentri tad-dejta. Fi kliem ieħor, hekk kif id-dejta tiġi aġġornata, in-nodu Keycloak jibgħat messaġġ lil nodi oħra fiċ-ċentru tad-dejta tiegħu, kif ukoll nodi f'ċentri tad-dejta oħra. Wara li jirċievi messaġġ bħal dan, kull nodu jneħħi d-dejta korrispondenti fil-caches lokali tiegħu.
Sessjonijiet tal-utenti. Caches bl-ismijiet sessions, clientSessions, offlineSessions и offlineClientSessions, huma ġeneralment replikati bejn iċ-ċentri tad-dejta u jservu biex jaħżnu dejta dwar sessjonijiet tal-utent li huma attivi waqt li l-utent ikun attiv fil-browser. Dawn il-caches jaħdmu mal-applikazzjoni li tipproċessa t-talbiet HTTP mill-utenti finali, għalhekk huma assoċjati ma 'sessjonijiet li jwaħħlu u għandhom jiġu replikati bejn iċ-ċentri tad-dejta.
Protezzjoni tal-forza bruta. Cache loginFailures Użat biex jittraċċa d-dejta tal-iżball tal-login, bħal kemm-il darba utent daħħal password żbaljata. Ir-replikazzjoni ta' din il-cache hija r-responsabbiltà tal-amministratur. Iżda għal kalkolu preċiż, ta 'min jattiva r-replikazzjoni bejn iċ-ċentri tad-dejta. Iżda min-naħa l-oħra, jekk ma tirreplikax din id-dejta, ittejjeb il-prestazzjoni, u jekk tqum din il-kwistjoni, ir-replikazzjoni tista 'ma tiġix attivata.
Meta toħroġ cluster Infinispan, trid iżżid definizzjonijiet tal-cache mal-fajl tas-settings:
Int trid tikkonfigura u tibda l-cluster Infinispan qabel ma tibda l-cluster Keycloak
Imbagħad għandek bżonn tikkonfigura remoteStore għall-caches Keycloak. Biex tagħmel dan, huwa biżżejjed skript, li jsir b'mod simili għal dak ta 'qabel, li jintuża biex tissettja l-varjabbli CACHE_OWNERS, trid tissejvjah f'fajl u poġġih f'direttorju /opt/jboss/startup-scripts:
L-artiklu ġie tradott u ppreparat għal Habr mill-impjegati Ċentru ta 'taħriġ Slurm — korsijiet intensivi, korsijiet bil-vidjo u taħriġ korporattiv minn speċjalisti prattikanti (Kubernetes, DevOps, Docker, Ansible, Ceph, SRE)