Mikroservis arxitekturasida SSO. Biz Keycloak-dan foydalanamiz. № 1 qism

Har qanday yirik kompaniyada va X5 Chakana savdo guruhi bundan mustasno emas, rivojlanish davom etar ekan, foydalanuvchi ruxsatini talab qiladigan loyihalar soni ortadi. Vaqt o'tishi bilan foydalanuvchilarning bir ilovadan ikkinchisiga uzluksiz o'tishi talab qilinadi va keyin bitta Single-Sing-On (SSO) serveridan foydalanish zarurati tug'iladi. Ammo AD yoki qo'shimcha atributlarga ega bo'lmagan boshqalar kabi identifikatsiya provayderlari turli loyihalarda allaqachon foydalanilganda nima qilish kerak. "Identifikatsiya brokerlari" deb nomlangan tizimlar sinfi yordamga keladi. Eng funktsional uning vakillari, masalan, Keycloak, Gravitee Access boshqaruvi va boshqalar. Ko'pincha foydalanish stsenariylari har xil bo'lishi mumkin: mashinaning o'zaro ta'siri, foydalanuvchi ishtiroki va boshqalar. Yechim barcha talablarni birlashtira oladigan moslashuvchan va kengaytiriladigan funksionallikni qo'llab-quvvatlashi kerak, va bunday yechim Bizning kompaniyamiz endi indikator brokeriga ega - Keycloak.

Mikroservis arxitekturasida SSO. Biz Keycloak-dan foydalanamiz. № 1 qism

Keycloak - RedHat tomonidan qo'llab-quvvatlanadigan ochiq kodli identifikatsiya va kirishni boshqarish mahsulotidir. Bu SSO - RH-SSO dan foydalangan holda kompaniyaning mahsulotlari uchun asosdir.

Asosiy tushunchalar

Yechimlar va yondashuvlarni tushunishni boshlashdan oldin, siz jarayonlarning shartlari va ketma-ketligini aniqlashingiz kerak:

Mikroservis arxitekturasida SSO. Biz Keycloak-dan foydalanamiz. № 1 qism

Identifikatsiya sub'ektni uning identifikatori (boshqacha aytganda, bu ism, login yoki raqamni aniqlash) orqali tanib olish tartibidir.

Autentifikatsiya - bu autentifikatsiya protsedurasi (foydalanuvchi parol yordamida tasdiqlanadi, xat elektron imzo yordamida tasdiqlanadi va hokazo).

Avtorizatsiya - resursga kirishni ta'minlaydi (masalan, elektron pochta).

Keycloak Identity Broker

kalit plash mikroservis arxitektura naqshlaridan foydalanish mumkin boʻlgan ATda foydalanish uchun moʻljallangan ochiq manbali identifikatsiya va kirishni boshqarish yechimidir.

Keycloak yagona tizimga kirish (SSO), brokerlik identifikatori va ijtimoiy login, foydalanuvchi federatsiyasi, mijoz adapterlari, administrator konsoli va hisobni boshqarish konsoli kabi xususiyatlarni taklif etadi.

Keycloak-da qo'llab-quvvatlanadigan asosiy funksiyalar:

  • Brauzer ilovalari uchun bitta tizimga kirish va bitta tizimdan chiqish.
  • OpenID/OAuth 2.0/SAML-ni qo'llab-quvvatlash.
  • Identity Brokering – tashqi OpenID Connect yoki SAML identifikatsiya provayderlari yordamida autentifikatsiya.
  • Ijtimoiy login - foydalanuvchi identifikatsiyasi uchun Google, GitHub, Facebook, Twitter-ni qo'llab-quvvatlash.
  • Foydalanuvchi federatsiyasi - LDAP va Active Directory serverlari va boshqa identifikatsiya provayderlaridan foydalanuvchilarni sinxronlashtirish.
  • Kerberos ko'prigi - avtomatik foydalanuvchi autentifikatsiyasi uchun Kerberos serveridan foydalanish.
  • Admin Console - Internet orqali sozlamalar va yechim parametrlarini yagona boshqarish uchun.
  • Hisobni boshqarish konsoli - foydalanuvchi profilini mustaqil boshqarish uchun.
  • Kompaniyaning korporativ identifikatori asosida yechimni moslashtirish.
  • 2FA autentifikatsiya - Google Authenticator yoki FreeOTP yordamida TOTP/HOTP-ni qo'llab-quvvatlash.
  • Kirish oqimlari - foydalanuvchi o'zini o'zi ro'yxatdan o'tkazish, parolni tiklash va tiklash va boshqalar.
  • Seanslarni boshqarish - ma'murlar foydalanuvchi seanslarini bir nuqtadan boshqarishi mumkin.
  • Token mappers - foydalanuvchi atributlari, rollari va boshqa kerakli atributlarni tokenlarga bog'lash.
  • Hudud, dastur va foydalanuvchilar orqali moslashuvchan siyosat boshqaruvi.
  • CORS qo'llab-quvvatlash - Mijoz adapterlari mahalliy CORS qo'llab-quvvatlashiga ega.
  • Xizmat ko'rsatuvchi provayder interfeyslari (SPI) - serverning turli tomonlarini sozlash imkonini beruvchi ko'p sonli SPI: autentifikatsiya oqimlari, identifikatsiya provayderlari, protokol xaritasi va boshqalar.
  • JavaScript ilovalari uchun mijoz adapterlari, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • OpenID Connect Relying Party kutubxonasi yoki SAML 2.0 xizmat ko'rsatuvchi provayder kutubxonasini qo'llab-quvvatlaydigan turli ilovalar bilan ishlashni qo'llab-quvvatlash.
  • Plaginlar yordamida kengaytirilishi mumkin.

CI/CD jarayonlari, shuningdek Keycloak-da boshqaruv jarayonlarini avtomatlashtirish uchun REST API/JAVA API-dan foydalanish mumkin. Hujjatlar elektron shaklda mavjud:

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

Korxona identifikatori provayderlari (joyida)

Foydalanuvchi federatsiyasi xizmatlari orqali foydalanuvchini autentifikatsiya qilish imkoniyati.

Mikroservis arxitekturasida SSO. Biz Keycloak-dan foydalanamiz. № 1 qism

Pass-through autentifikatsiyadan ham foydalanish mumkin - agar foydalanuvchilar Kerberos (LDAP yoki AD) bilan ish stantsiyalarida autentifikatsiya qilingan bo'lsa, ular foydalanuvchi nomi va parolni qayta kiritmasdan avtomatik ravishda Keycloak-da autentifikatsiya qilinishi mumkin.

Foydalanuvchilarning autentifikatsiyasi va keyingi avtorizatsiyasi uchun ishlab chiqish muhitlari uchun eng mos bo'lgan relyatsion ma'lumotlar bazasidan foydalanish mumkin, chunki u loyihalarning dastlabki bosqichlarida uzoq sozlamalar va integratsiyalarni talab qilmaydi. Odatiy bo'lib, Keycloak sozlamalar va foydalanuvchi ma'lumotlarini saqlash uchun o'rnatilgan ma'lumotlar bazasidan foydalanadi.

Qo'llab-quvvatlanadigan DBMSlar ro'yxati keng bo'lib, quyidagilarni o'z ichiga oladi: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle va boshqalar. Ayni paytda eng ko'p sinovdan o'tganlar Oracle 12C Release1 RAC va MariaDB 3.12 uchun Galera 10.1.19 klasteridir.

Identifikatsiya provayderlari - ijtimoiy login

Ijtimoiy tarmoqlardan logindan foydalanish mumkin. Foydalanuvchilarni autentifikatsiya qilish imkoniyatini yoqish uchun Keycloack administrator konsolidan foydalaning. Ilova kodiga hech qanday o'zgartirish kiritish talab qilinmaydi va bu funksiya qutidan tashqarida mavjud va loyihaning istalgan bosqichida faollashtirilishi mumkin.

Mikroservis arxitekturasida SSO. Biz Keycloak-dan foydalanamiz. № 1 qism

Foydalanuvchilarni autentifikatsiya qilish uchun OpenID/SAML Identity provayderlaridan foydalanish mumkin.

Keycloak-da OAuth2-dan foydalangan holda odatiy avtorizatsiya stsenariylari

Avtorizatsiya kodi oqimi — server tomonidagi ilovalar bilan foydalaniladi. Avtorizatsiya ruxsatining eng keng tarqalgan turlaridan biri, chunki u dasturning manba kodi va mijoz ma'lumotlari boshqalarga kira olmaydigan server ilovalari uchun juda mos keladi. Bu holda jarayon qayta yo'naltirishga asoslangan. Ilova foydalanuvchi agenti orqali yuborilgan API avtorizatsiya kodlarini olish uchun veb-brauzer kabi foydalanuvchi agenti (foydalanuvchi-agent) bilan bog'lana olishi kerak.

Yashirin oqim — mobil yoki veb-ilovalar tomonidan foydalaniladi (foydalanuvchi qurilmasida ishlaydigan ilovalar).

Yashirin avtorizatsiya ruxsati turi mobil va veb-ilovalar tomonidan qo'llaniladi, bunda mijozning maxfiyligi kafolatlanmaydi. Yashirin ruxsat turi foydalanuvchi agentini qayta yo'naltirishdan ham foydalanadi, bunda kirish tokeni keyinchalik ilovada foydalanish uchun foydalanuvchi agentiga uzatiladi. Bu tokenni foydalanuvchiga va foydalanuvchi qurilmasidagi boshqa ilovalarga taqdim etadi. Ushbu turdagi avtorizatsiya ruxsati ilovaning identifikatorini tasdiqlamaydi va jarayonning o'zi qayta yo'naltirish URL manziliga (xizmatda avval ro'yxatdan o'tgan) tayanadi.

Implicit Flow kirish tokenini yangilash tokenlarini qoʻllab-quvvatlamaydi.

Mijoz hisob ma'lumotlari oqimini taqdim etish — ilova API ga kirganda ishlatiladi. Ushbu turdagi avtorizatsiya ruxsati odatda foydalanuvchining bevosita shovqinisiz fonda sodir bo'lishi kerak bo'lgan serverdan serverga o'zaro aloqalar uchun ishlatiladi. Mijozning hisob ma'lumotlarini berish oqimi veb-xizmatga (maxfiy mijoz) boshqa veb-xizmatga qo'ng'iroq qilganda autentifikatsiya qilish uchun foydalanuvchi nomini ko'rsatish o'rniga o'z hisob ma'lumotlaridan foydalanish imkonini beradi. Yuqori darajadagi xavfsizlik uchun qo'ng'iroq qiluvchi xizmat hisob ma'lumotlari sifatida sertifikatdan (umumiy sir o'rniga) foydalanishi mumkin.

OAuth2 spetsifikatsiyasi maqolada tasvirlangan
RFC-6749
RFC-8252
RFC-6819

JWT tokeni va uning afzalliklari

JWT (JSON Web Token) ochiq standartdir (https://tools.ietf.org/html/rfc7519), bu JSON ob'ekti shaklida tomonlar o'rtasida ma'lumotni xavfsiz uzatishning ixcham va mustaqil usulini belgilaydi.

Standartga muvofiq, token nuqtalar bilan ajratilgan baza-64 formatidagi uchta qismdan iborat. Birinchi qism sarlavha deb ataladi, u token turini va raqamli imzoni olish uchun xesh algoritmining nomini o'z ichiga oladi. Ikkinchi qism asosiy ma'lumotlarni (foydalanuvchi, atributlar va boshqalar) saqlaydi. Uchinchi qism - raqamli imzo.

. .
Tokenni hech qachon ma'lumotlar bazasida saqlamang. Yaroqli token parolga ekvivalent bo'lgani uchun tokenni saqlash parolni aniq matnda saqlash bilan bir xil bo'ladi.
Kirish belgisi o'z egasiga himoyalangan server resurslariga kirishni ta'minlovchi tokendir. Odatda u qisqa muddatga ega va tokenni so‘ragan tomonning IP-manzili kabi qo‘shimcha ma’lumotlarni o‘z ichiga olishi mumkin.

Tokenni yangilash mijozlarga ularning amal qilish muddati tugagandan so'ng yangi kirish tokenlarini so'rash imkonini beruvchi tokendir. Ushbu tokenlar odatda uzoq muddatga chiqariladi.

Mikroservis arxitekturasidan foydalanishning asosiy afzalliklari:

  • Bir martalik autentifikatsiya orqali turli ilovalar va xizmatlarga kirish imkoniyati.
  • Foydalanuvchi profilida bir qator talab qilinadigan atributlar mavjud bo'lmaganda, ularni foydali yukga qo'shilishi mumkin bo'lgan ma'lumotlar bilan boyitish mumkin, shu jumladan avtomatik va tezkor.
  • Faol seanslar haqida ma'lumotni saqlashning hojati yo'q, server ilovasi faqat imzoni tekshirishi kerak.
  • Foydali yukdagi qo'shimcha atributlar orqali yanada moslashuvchan kirish nazorati.
  • Sarlavha va foydali yuk uchun token imzosidan foydalanish umumiy yechim xavfsizligini oshiradi.

JWT tokeni - kompozitsiya

header — sukut boʻyicha sarlavha faqat token turini va shifrlash uchun ishlatiladigan algoritmni oʻz ichiga oladi.

Token turi "typ" tugmachasida saqlanadi. JWT da "typ" tugmasi e'tiborga olinmaydi. Agar "typ" kaliti mavjud bo'lsa, uning qiymati JWT bo'lishi kerak, bu ob'ekt JSON Web Token ekanligini ko'rsatadi.

Ikkinchi kalit "alg" tokenni shifrlash uchun ishlatiladigan algoritmni belgilaydi. Odatiy bo'lib, u HS256 ga o'rnatilishi kerak. Sarlavha base64 da kodlangan.

{ "alg": "HS256", "typ": "JWT"}
Foydali yuk (tarkib) — foydali yuk tekshirilishi kerak bo'lgan har qanday ma'lumotlarni saqlaydi. Foydali yukdagi har bir kalit "bayonot" sifatida tanilgan. Masalan, dasturga faqat taklifnoma (yopiq aksiya) orqali kirishingiz mumkin. Biz kimnidir ishtirok etishga taklif qilmoqchi bo'lsak, biz unga taklifnomani elektron pochta orqali yuboramiz. Elektron pochta manzili taklifnomani qabul qilgan shaxsga tegishli ekanligini tekshirish muhim, shuning uchun biz ushbu manzilni “elektron pochta” kalitida saqlash orqali foydali yukga kiritamiz.

{ "elektron pochta": "[elektron pochta bilan himoyalangan]" }

Foydali yukdagi kalitlar o'zboshimchalik bilan bo'lishi mumkin. Biroq, bir nechta zaxiralar mavjud:

  • iss (Emitent) - token yuboriladigan ilovani aniqlaydi.
  • sub (Mavzu) - token predmetini belgilaydi.
  • aud (Auditoriya) – bu tokenni oluvchilar ro‘yxati bo‘lgan katta-kichik harflar yoki URIlar qatori. Qabul qiluvchi tomon JWTni berilgan kalit bilan olganida, u oluvchilarda o'zini tekshirishi kerak - aks holda tokenga e'tibor bermang.
  • exp (Expiration Time) - tokenning amal qilish muddati tugashini bildiradi. JWT standarti barcha ilovalar muddati o'tgan tokenlarni rad etishini talab qiladi. Exp kaliti unix formatidagi vaqt tamg'asi bo'lishi kerak.
  • nbf (oldin emas) unix formatidagi vaqt bo'lib, token haqiqiy bo'lish vaqtini belgilaydi.
  • iat (Issued At) - Bu kalit token chiqarilgan vaqtni ko'rsatadi va JWT yoshini aniqlash uchun ishlatilishi mumkin. iat kaliti unix formatidagi vaqt tamg'asi bo'lishi kerak.
  • Jti (JWT ID) bu token uchun noyob katta-kichik identifikatorni belgilaydigan qatordir.

Foydali yuk shifrlangan holda uzatilmasligini tushunish muhimdir (garchi tokenlarni joylashtirish mumkin va keyin shifrlangan ma'lumotlarni uzatish mumkin). Shuning uchun siz unda hech qanday maxfiy ma'lumotni saqlay olmaysiz. Sarlavha kabi foydali yuk base64 kodlangan.
Imzo - bizda sarlavha va foydali yuk bo'lgandan so'ng, imzoni hisoblashimiz mumkin.

Base64 da kodlangan sarlavha va foydali yuk olinadi va nuqta bilan ajratilgan chiziqqa birlashtiriladi. Keyin ushbu satr va maxfiy kalit sarlavhada ko'rsatilgan shifrlash algoritmiga kiritiladi ("alg" kaliti). Kalit har qanday satr bo'lishi mumkin. Uzunroq satrlar afzalroq bo'ladi, chunki ularni tanlash uchun ko'proq vaqt kerak bo'ladi.

{"alg":"RSA1_5","foydali yuk":"A128CBC-HS256"}

Keycloak Failover klaster arxitekturasini qurish

Barcha loyihalar uchun bitta klasterdan foydalanilganda, SSO yechimiga talablar ortadi. Loyihalar soni kam bo'lsa, bu talablar barcha loyihalar uchun unchalik ahamiyatli emas, ammo foydalanuvchilar soni va integratsiyalashuvi ortib borishi bilan mavjudlik va ishlash talablari ortadi.

Bitta SSO ning ishlamay qolishi xavfining ortishi yechim arxitekturasi va komponentlarning ortiqcha bo'lishi uchun ishlatiladigan usullarga talablarni oshiradi va juda qattiq SLAga olib keladi. Shu munosabat bilan, ko'pincha echimlarni ishlab chiqish yoki amalga oshirishning dastlabki bosqichlarida loyihalar o'zlarining nosozliklarga chidamli infratuzilmalariga ega. Rivojlanish davom etar ekan, rivojlanish va kengayish imkoniyatlarini yaratish kerak. O'chirish klasterini yaratishning eng moslashuvchan usuli konteyner virtualizatsiyasi yoki gibrid yondashuvdan foydalanishdir.

Faol/Faol va Faol/Passiv klaster rejimlarida ishlash uchun relyatsion ma'lumotlar bazasida ma'lumotlarning izchilligini ta'minlash kerak - ikkala ma'lumotlar bazasi tugunlari ham turli xil geo-tarqatilgan ma'lumotlar markazlari o'rtasida sinxron tarzda takrorlanishi kerak.

Nosozliklarga chidamli o'rnatishning eng oddiy misoli.

Mikroservis arxitekturasida SSO. Biz Keycloak-dan foydalanamiz. № 1 qism

Yagona klasterdan foydalanishning afzalliklari nimada:

  • Yuqori mavjudlik va ishlash.
  • Ishlash rejimlarini qo'llab-quvvatlash: faol/faol, faol/passiv.
  • Dinamik masshtablash imkoniyati - konteyner virtualizatsiyasidan foydalanganda.
  • Markazlashtirilgan boshqaruv va monitoring imkoniyati.
  • Loyihalarda foydalanuvchilarni aniqlash/autentifikatsiya qilish/ruxsat berish uchun yagona yondashuv.
  • Foydalanuvchining o'zaro ta'sirisiz turli loyihalar o'rtasidagi yanada shaffof o'zaro ta'sir.
  • JWT tokenini turli loyihalarda qayta ishlatish imkoniyati.
  • Yagona ishonch nuqtasi.
  • Mikroservislar/konteyner virtualizatsiyasidan foydalangan holda loyihalarni tezroq ishga tushirish (qo'shimcha komponentlarni o'rnatish va sozlash shart emas).
  • Sotuvchidan tijorat yordamini sotib olish mumkin.

Klasterni rejalashtirishda nimani e'tiborga olish kerak

Ma'lumotlar bazasi

Keycloak saqlash uchun DBMS boshqaruv tizimidan foydalanadi: hududlar, mijozlar, foydalanuvchilar va boshqalar.
Keng doiradagi DBMS qo'llab-quvvatlanadi: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak o'zining o'rnatilgan relyatsion ma'lumotlar bazasi bilan birga keladi. Rivojlanish muhitlari kabi engil ish sharoitlarida foydalanish tavsiya etiladi.

Faol/Faol va Faol/Passiv klaster rejimlarida ishlash uchun relyatsion ma'lumotlar bazasida ma'lumotlarning izchilligini ta'minlash kerak va ma'lumotlar bazasi klasterining ikkala tugunlari ma'lumotlar markazlari o'rtasida sinxron tarzda takrorlanadi.

Tarqalgan kesh (Infinspan)

Klaster to'g'ri ishlashi uchun JBoss Data Grid yordamida quyidagi kesh turlarini qo'shimcha sinxronlashtirish talab qilinadi:

Autentifikatsiya seanslari - ma'lum bir foydalanuvchini autentifikatsiya qilishda ma'lumotlarni saqlash uchun ishlatiladi. Ushbu keshdan so'rovlar odatda ilovani emas, balki faqat brauzer va Keycloak serverini o'z ichiga oladi.

Harakat belgilari - foydalanuvchi harakatni asinxron tarzda tasdiqlashi kerak bo'lgan stsenariylar uchun ishlatiladi (elektron pochta orqali). Masalan, parolni unutish jarayonida Infinispan actionTokens keshi allaqachon ishlatilgan tegishli harakat tokenlari haqidagi metamaʼlumotlarni kuzatish uchun ishlatiladi, shuning uchun uni qayta ishlatib boʻlmaydi.

Doimiy ma'lumotlarni keshlash va bekor qilish - ma'lumotlar bazasiga keraksiz so'rovlardan qochish uchun doimiy ma'lumotlarni keshlash uchun ishlatiladi. Har qanday Keycloak serveri ma'lumotlarni yangilaganda, barcha ma'lumotlar markazlaridagi barcha boshqa Keycloak serverlari bu haqda bilishi kerak.

Ish - faqat klaster tugunlari va ma'lumotlar markazlari o'rtasida bekor qilish xabarlarini yuborish uchun ishlatiladi.

Foydalanuvchi seanslari - foydalanuvchining brauzer seansi davomida amal qiladigan foydalanuvchi sessiyasi ma'lumotlarini saqlash uchun foydalaniladi. Kesh oxirgi foydalanuvchi va ilovadan HTTP so'rovlarini bajarishi kerak.

Qo'pol kuch himoyasi - muvaffaqiyatsiz loginlar haqidagi ma'lumotlarni kuzatish uchun ishlatiladi.

Yukni muvozanatlash

Yuk balanslagichi kalitlarni yopish uchun yagona kirish nuqtasi bo'lib, yopishqoq seanslarni qo'llab-quvvatlashi kerak.

Ilova serverlari

Ular komponentlarning bir-biri bilan o'zaro ta'sirini nazorat qilish uchun ishlatiladi va mavjud avtomatlashtirish vositalari va infratuzilmani avtomatlashtirish vositalarini dinamik masshtablash yordamida virtualizatsiya qilinishi yoki konteynerlashtirilishi mumkin. Eng keng tarqalgan joylashtirish stsenariylari OpenShift, Kubernates, Rancher-da.

Bu birinchi qismni - nazariy qismni yakunlaydi. Keyingi maqolalar seriyasida turli identifikatsiya provayderlari bilan integratsiya misollari va sozlamalar misollari muhokama qilinadi.

Manba: www.habr.com

a Izoh qo'shish