SSO ing arsitektur microservice. Kita nggunakake Keycloak. Bagean #1

Ing sembarang perusahaan gedhe, lan X5 Retail Group ora istiméwa, minangka develops, jumlah proyèk sing mbutuhake idin pangguna mundhak. Sajrone wektu, transisi pangguna sing lancar saka siji aplikasi menyang aplikasi liyane dibutuhake, banjur kudu nggunakake server Single-Sing-On (SSO). Nanging kepiye nalika panyedhiya identitas kayata AD utawa liyane sing ora duwe atribut tambahan wis digunakake ing macem-macem proyek. Kelas sistem sing diarani "makelar identifikasi" bakal nylametake. Sing paling fungsional yaiku perwakilan, kayata Keycloak, manajemen Akses Gravitee, lan liya-liyane. Paling asring, kasus panggunaan bisa beda-beda: interaksi mesin, partisipasi pangguna, lan liya-liyane. lan solusi kasebut perusahaan kita saiki duwe broker indikasi - Keycloak.

SSO ing arsitektur microservice. Kita nggunakake Keycloak. Bagean #1

Keycloak minangka identitas sumber terbuka lan produk kontrol akses sing dikelola dening RedHat. Iku basis kanggo produk perusahaan nggunakake SSO - RH-SSO.

Konsep dhasar

Sadurunge miwiti ngatasi solusi lan pendekatan, sampeyan kudu mutusake babagan syarat lan urutan proses:

SSO ing arsitektur microservice. Kita nggunakake Keycloak. Bagean #1

Identifikasi minangka prosedur kanggo ngenali subyek kanthi pengenal (ing tembung liya, iki minangka definisi jeneng, login utawa nomer).

Otentikasi - iki minangka prosedur otentikasi (pangguna dicenthang nganggo sandhi, surat kasebut dicenthang nganggo tanda tangan elektronik, lsp.)

Wewenang - iki panentu akses menyang sumber daya (contone, kanggo e-mail).

Identity Broker Keycloak

gantungan kunci minangka identitas sumber terbuka lan solusi manajemen akses sing dirancang kanggo digunakake ing IS ing ngendi pola arsitektur microservice bisa digunakake.

Keycloak nawakake fitur kayata single sign-on (SSO), identitas broker lan login sosial, federasi pangguna, adaptor klien, konsol admin lan konsol manajemen akun.

Fungsi dhasar sing didhukung dening Keycloak:

  • Single-Sign On lan Single-Sign Out kanggo aplikasi browser.
  • Dhukungan kanggo OpenID/OAuth 2.0/SAML.
  • Identity Brokering - otentikasi nggunakake OpenID Connect eksternal utawa panyedhiya identitas SAML.
  • Login Sosial - Dhukungan Google, GitHub, Facebook, Twitter kanggo identifikasi pangguna.
  • Federasi Panganggo - sinkronisasi pangguna saka server LDAP lan Active Directory lan panyedhiya identitas liyane.
  • Kreteg Kerberos - nggunakake server Kerberos kanggo otentikasi pangguna otomatis.
  • Konsol Admin - kanggo ngatur setelan lan pilihan solusi sing terpadu liwat Web.
  • Konsol Manajemen Akun - kanggo ngatur profil pangguna.
  • Kustomisasi solusi adhedhasar identitas perusahaan perusahaan.
  • 2FA Authentication - Dhukungan TOTP/HOTP nggunakake Google Authenticator utawa FreeOTP.
  • Alur Login - registrasi diri pangguna, pemulihan sandhi lan reset, lan liya-liyane bisa uga.
  • Manajemen Sesi - pangurus bisa ngatur sesi pangguna saka siji titik.
  • Token Mappers - ngiket atribut pangguna, peran lan atribut liyane sing dibutuhake kanggo token.
  • Manajemen kabijakan sing fleksibel ing wilayah, aplikasi lan pangguna.
  • Dhukungan CORS - Adaptor klien duwe dhukungan CORS sing dibangun.
  • Antarmuka Panyedhiya Layanan (SPI) - Akeh SPI sing ngidini sampeyan ngatur macem-macem aspek server: aliran otentikasi, panyedhiya identitas, pemetaan protokol, lan liya-liyane.
  • Adaptor klien kanggo aplikasi JavaScript, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • Dhukungan kanggo nggarap macem-macem aplikasi sing ndhukung perpustakaan OpenID Connect Relying Party utawa Perpustakaan Penyedia Layanan SAML 2.0.
  • Expandable nggunakake plugins.

Kanggo proses CI / CD, uga otomatisasi proses manajemen ing Keycloak, REST API / JAVA API bisa digunakake. Dokumentasi kasedhiya kanthi elektronik:

REST API https://www.keycloak.org/docs-api/8.0/rest-api/index.html
Java API https://www.keycloak.org/docs-api/8.0/javadocs/index.html

Panyedhiya Identitas Perusahaan (On-Premise)

Kemampuan kanggo otentikasi pangguna liwat layanan Federasi Panganggo.

SSO ing arsitektur microservice. Kita nggunakake Keycloak. Bagean #1

Otentikasi pass-through uga bisa digunakake - yen pangguna otentikasi marang stasiun kerja nganggo Kerberos (LDAP utawa AD), mula bisa diotentikasi kanthi otomatis menyang Keycloak tanpa kudu ngetik jeneng pangguna lan sandhi maneh.

Kanggo otentikasi lan wewenang luwih saka pangguna, bisa nggunakake DBMS relasional, sing paling ditrapake kanggo lingkungan pangembangan, amarga ora kalebu setelan lan integrasi sing dawa ing tahap awal proyek. Kanthi gawan, Keycloak nggunakake DBMS sing dibangun kanggo nyimpen setelan lan data pangguna.

Dhaptar DBMS sing didhukung iku ekstensif lan kalebu: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle lan liya-liyane. Sing paling dites nganti saiki yaiku Oracle 12C Release1 RAC lan kluster Galera 3.12 kanggo MariaDB 10.1.19.

Panyedhiya identitas - login sosial

Sampeyan bisa nggunakake login saka jaringan sosial. Kanggo ngaktifake kemampuan kanggo otentikasi pangguna, gunakake konsol admin Keycloack. Owah-owahan ing kode aplikasi ora dibutuhake lan fungsi iki kasedhiya metu saka kothak lan bisa diaktifake ing sembarang tataran saka project.

SSO ing arsitektur microservice. Kita nggunakake Keycloak. Bagean #1

Sampeyan bisa nggunakake panyedhiya OpenID/SAML Identity kanggo otentikasi pangguna.

Skenario wewenang khas nggunakake OAuth2 ing Keycloak

Alur Kode Wewenang - digunakake karo aplikasi sisih server. Salah sawijining jinis ijin wewenang sing paling umum amarga cocog kanggo aplikasi server sing kode sumber aplikasi lan data klien ora kasedhiya kanggo wong njaba. Proses ing kasus iki adhedhasar pangalihan. Aplikasi kasebut kudu bisa sesambungan karo agen panganggo (user-agent), kayata browser web - kanggo nampa kode wewenang API sing dialihake liwat agen panganggo.

aliran implisit - digunakake dening aplikasi seluler utawa web (aplikasi sing mlaku ing piranti pangguna).

Jinis idin wewenang implisit digunakake dening aplikasi seluler lan web sing ora bisa dijamin rahasia klien. Jinis ijin implisit uga nggunakake pangalihan agen panganggo, kanthi token akses diterusake menyang agen pangguna supaya bisa digunakake maneh ing aplikasi kasebut. Iki ndadekake token kasedhiya kanggo pangguna lan aplikasi liyane ing piranti pangguna. Jinis ijin wewenang iki ora otentikasi identitas aplikasi, lan proses kasebut dhewe gumantung ing URL pangalihan (sadurunge didaftar ing layanan kasebut).

Aliran Implisit ora ndhukung token refresh token akses.

Alur Grant Kredensial Klien - digunakake nalika aplikasi ngakses API. Jinis ijin wewenang iki biasane digunakake kanggo interaksi server-kanggo-server sing kudu ditindakake ing latar mburi tanpa interaksi pangguna langsung. Aliran hibah kredensial klien ngidini layanan web (klien rahasia) nggunakake kredensial dhewe tinimbang niru pangguna kanggo otentikasi nalika nelpon layanan web liyane. Kanggo tingkat keamanan sing luwih dhuwur, layanan nelpon bisa nggunakake sertifikat (tinimbang rahasia bareng) minangka kredensial.

Spesifikasi OAuth2 diterangake ing
RFC-6749
RFC-8252
RFC-6819

Token JWT lan keuntungane

JWT (JSON Web Token) minangka standar mbukak (https://tools.ietf.org/html/rfc7519) sing nemtokake cara sing kompak lan mandhiri kanggo nransfer informasi kanthi aman antarane pihak minangka obyek JSON.

Miturut standar, token kasusun saka telung bagean ing format basa-64, dipisahake kanthi titik. Bagian pisanan diarani header, sing ngemot jinis token lan jeneng algoritma hash kanggo entuk tandha digital. Bagian kapindho nyimpen informasi dhasar (pangguna, atribut, lsp). Bagian katelu yaiku tandha digital.

. .
Aja nyimpen token ing DB sampeyan. Amarga token sing bener padha karo sandhi, nyimpen token kaya nyimpen sandhi ing teks sing cetha.
Token akses minangka token sing menehi akses sing nduweni kanggo ngamanake sumber daya server. Biasane umure cendhak lan bisa uga nggawa informasi tambahan kayata alamat IP pihak sing njaluk token.

Refresh token minangka token sing ngidini klien njaluk token akses anyar sawise umure wis kadaluwarsa. Token iki biasane ditanggepi kanggo wektu sing suwe.

Kauntungan utama nggunakake arsitektur microservice:

  • Kemampuan kanggo ngakses macem-macem aplikasi lan layanan liwat otentikasi siji-wektu.
  • Yen ora ana sawetara atribut sing dibutuhake ing profil pangguna, sampeyan bisa nambah data sing bisa ditambahake menyang muatan, kalebu otomatis lan on-the-fly.
  • Ora perlu nyimpen informasi babagan sesi aktif, aplikasi server mung kudu verifikasi teken.
  • Kontrol akses sing luwih fleksibel liwat atribut tambahan ing muatan.
  • Panganggone tandha token kanggo header lan muatan nambah keamanan solusi kanthi sakabehe.

Token JWT - komposisi

Header - kanthi standar, header mung ngemot jinis token lan algoritma sing digunakake kanggo enkripsi.

Jinis token disimpen ing tombol "typ". Tombol 'jinis' ora digatekake ing JWT. Yen tombol "tipe" ana, nilaine kudu JWT kanggo nunjukake yen obyek iki minangka Token Web JSON.

Tombol kapindho "alg" nemtokake algoritma sing digunakake kanggo encrypt token. Sampeyan kudu disetel menyang HS256 minangka standar. Header dienkode ing base64.

{ "alg": "HS256", "jinis": "JWT"}
muatan (isi) - muatan nyimpen informasi apa wae sing kudu dipriksa. Saben tombol ing payload dikenal minangka "klaim". Contone, sampeyan bisa ngetik aplikasi mung kanthi undhangan (promo ditutup). Nalika kita arep ngundang wong kanggo melu, kita ngirim layang uleman. Penting kanggo mriksa manawa alamat email kasebut duweke wong sing nampa undhangan kasebut, mula kita bakal nyakup alamat kasebut ing muatan, kanggo iki disimpen ing tombol "email".

{"email":"[email dilindhungi]"}

Tombol ing muatan bisa sewenang-wenang. Nanging, ana sawetara sing dilindhungi:

  • iss (Penerbit) - Ngenali aplikasi saka ngendi token dikirim.
  • sub (Subject) - nemtokake subyek saka token.
  • aud (Pemirsa) minangka susunan string utawa URI sing sensitif huruf cilik sing minangka dhaptar panampa token iki. Nalika sisih panampa nampa JWT karo tombol diwenehi, iku kudu mriksa ngarsane dhewe ing panampa - digunakake nglirwakake token.
  • exp (Wektu Kadaluwarsa) - Nuduhake nalika token kadaluwarsa. Standar JWT mbutuhake kabeh implementasine kanggo nolak token kadaluwarsa. Tombol exp kudu dadi stempel wektu ing format unix.
  • nbf (Ora Sadurunge) iku wektu ing format unix sing nemtokake wayahe nalika token dadi bener.
  • iat (Ditanggepi Ing) - Tombol iki nuduhake wektu token ditanggepi lan bisa digunakake kanggo nemtokake umur JWT. Tombol iat kudu dadi stempel wektu ing format unix.
  • Jti (ID JWT) - string sing nemtokake pengenal unik token iki, sensitif huruf cilik.

Iku penting kanggo ngerti sing payload ora ditularaké ing wangun ndhelik (sanajan token bisa nested lan banjur bisa kanggo ngirim data ndhelik). Mulane, ora bisa nyimpen informasi rahasia. Kaya header, muatan kasebut dienkode base64.
Tandha - nalika kita duwe judhul lan payload, kita bisa ngetung teken.

Base64-encoded: header lan payload dijupuk, padha digabungake menyang senar liwat titik. Banjur senar lan kunci rahasia iki dilebokake menyang algoritma enkripsi sing ditemtokake ing header (tombol "alg"). Tombol bisa dadi string apa wae. Senar sing luwih dawa bakal luwih disenengi amarga bakal njupuk luwih suwe.

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

Mbangun Arsitektur Kluster Keycloak Failover

Nalika nggunakake kluster siji kanggo kabeh proyek, ana syarat tambah kanggo solusi SSO. Nalika jumlah proyek cilik, syarat kasebut ora katon kanggo kabeh proyek, nanging kanthi nambah jumlah pangguna lan integrasi, syarat kasedhiyan lan nambah kinerja.

Nambah risiko gagal SSO siji nambah syarat kanggo arsitektur solusi lan cara sing digunakake kanggo komponen keluwih lan ndadékaké menyang SLA banget nyenyet. Ing babagan iki, luwih asring sajrone pangembangan utawa tahap awal implementasine solusi, proyek duwe infrastruktur sing ora tahan kesalahan dhewe. Nalika pembangunan maju, perlu nyedhiyakake kesempatan kanggo pangembangan lan skala. Paling fleksibel kanggo mbangun kluster failover nggunakake virtualisasi wadah utawa pendekatan hibrida.

Kanggo bisa ing mode cluster Aktif / Aktif lan Aktif / Pasif, iku perlu kanggo mesthekake konsistensi data ing database relasional - loro simpul database kudu synchronously replicated antarane pusat data geo-mbagekke beda.

Conto paling gampang saka instalasi fault-tolerant.

SSO ing arsitektur microservice. Kita nggunakake Keycloak. Bagean #1

Apa keuntungan nggunakake kluster tunggal:

  • kasedhiyan dhuwur lan kinerja.
  • Dhukungan kanggo mode operasi: Aktif / Aktif, Aktif / Pasif.
  • Kemampuan kanggo skala dinamis - nalika nggunakake virtualisasi wadhah.
  • Kemungkinan manajemen lan pemantauan terpusat.
  • Pendekatan terpadu kanggo identifikasi / otentikasi / wewenang pangguna ing proyek.
  • Interaksi sing luwih transparan ing antarane macem-macem proyek tanpa keterlibatan pangguna.
  • Kemampuan kanggo nggunakake maneh token JWT ing macem-macem proyek.
  • Titik tunggal kepercayaan.
  • Bukak proyek sing luwih cepet nggunakake layanan mikro / virtualisasi wadah (ora perlu ngangkat lan ngatur komponen tambahan).
  • Sampeyan bisa tuku dhukungan komersial saka vendor.

Apa sing kudu digoleki nalika ngrancang Kluster

DBMS

Keycloak nggunakake sistem manajemen basis data kanggo nyimpen: alam, klien, pangguna, lsp.
Macem-macem DBMS didhukung: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak dilengkapi database relasional sing dibangun dhewe. Disaranake digunakake kanggo lingkungan sing ora dimuat - kayata lingkungan pangembangan.

Kanggo nggarap mode cluster Aktif / Aktif lan Aktif / Pasif, konsistensi data ing basis data relasional dibutuhake, lan loro simpul kluster database ditiru bebarengan ing antarane pusat data.

Cache sing disebarake (Infinspan)

Supaya kluster bisa mlaku kanthi bener, sinkronisasi tambahan saka jinis cache ing ngisor iki nggunakake JBoss Data Grid dibutuhake:

Sesi otentikasi - digunakake kanggo nyimpen data nalika otentikasi pangguna tartamtu. Panjaluk saka cache iki biasane mung kalebu browser lan server Keycloak, dudu aplikasi kasebut.

Token aksi digunakake kanggo skenario ing ngendi pangguna kudu ngonfirmasi tumindak kanthi ora sinkron (liwat email). Contone, sajrone aliran lali sandi, cache actionTokens Infinispan digunakake kanggo nglacak metadata babagan token tumindak sing gegandhengan sing wis digunakake, saengga ora bisa digunakake maneh.

Caching lan invalidation data ngengkel - digunakake kanggo cache data ngengkel kanggo ngindhari pitakon rasah kanggo database. Nalika server Keycloak nganyari data, kabeh server Keycloak liyane ing kabeh pusat data kudu ngerti babagan iki.

Pakaryan - Mung digunakake kanggo ngirim pesen sing ora bener antarane simpul kluster lan pusat data.

Sesi pangguna - digunakake kanggo nyimpen data babagan sesi pangguna sing valid sajrone sesi browser pangguna. Cache kudu ngolah panjalukan HTTP saka pangguna pungkasan lan aplikasi.

Proteksi brute force - digunakake kanggo nglacak data babagan login sing gagal.

Ngimbangi beban

Load balancer minangka titik entri siji kanggo keycloak lan kudu ndhukung sesi lengket.

Server Aplikasi

Iki digunakake kanggo ngontrol interaksi komponen siji liyane lan bisa virtualisasi utawa wadah nggunakake alat otomatisasi sing ana lan skala dinamis alat otomatisasi infrastruktur. Skenario penyebaran paling umum ing OpenShift, Kubernates, Rancher.

Iki nyimpulake bagean pisanan - sing teoritis. Ing seri artikel sabanjure, conto integrasi karo macem-macem panyedhiya identitas lan conto setelan bakal dianalisis.

Source: www.habr.com

Add a comment