Микросервис архитектурасында SSO. Біз Keycloak қолданамыз. №1 бөлім

Кез келген ірі компанияда және X5 Retail Group-та ерекшелік емес, даму қарқын алған сайын пайдаланушы авторизациясын талап ететін жобалар саны артады. Уақыт өте келе, пайдаланушылардың бір қолданбадан екіншісіне үздіксіз ауысуы қажет, содан кейін бір Single-Sing-On (SSO) серверін пайдалану қажеттілігі туындайды. Бірақ AD немесе қосымша атрибуттары жоқ басқалар сияқты сәйкестендіру провайдерлері әртүрлі жобаларда бұрыннан қолданылғанда не істеу керек. «Сәйкестендіру брокерлері» деп аталатын жүйелер класы көмекке келеді. Ең функционалды болып оның өкілдері болып табылады, мысалы, Keycloak, Gravitee Access басқару және т.б. Көбінесе пайдалану сценарийлері әртүрлі болуы мүмкін: машинаның өзара әрекеттесуі, пайдаланушының қатысуы және т.б. Шешім барлық талаптарды бір жүйеге біріктіре алатын икемді және масштабталатын функционалдылықты қолдауы керек, және осындай шешім Біздің компанияда қазір индикаторлық брокер бар – Keycloak.

Микросервис архитектурасында SSO. Біз Keycloak қолданамыз. №1 бөлім

Keycloak – RedHat қолдайтын ашық бастапқы кодты сәйкестендіру және кіруді басқару өнімі. Ол SSO - RH-SSO қолданатын компания өнімдерінің негізі болып табылады.

Негізгі ұғымдар

Шешімдер мен тәсілдерді түсінуді бастамас бұрын, сіз процестердің терминдері мен ретін анықтауыңыз керек:

Микросервис архитектурасында SSO. Біз Keycloak қолданамыз. №1 бөлім

Сәйкестендіру субъектіні оның идентификаторы бойынша тану процедурасы (басқаша айтқанда, бұл атау, логин немесе нөмірдің анықтамасы).

Түпнұсқалық растама - бұл аутентификация процедурасы (пайдаланушы пароль арқылы тексеріледі, хат электронды қолтаңбамен тексеріледі және т.б.)

Авторизация - бұл ресурсқа (мысалы, электрондық поштаға) қол жеткізуді қамтамасыз ету.

Identity Broker Keycloak

пернетақта микросервис архитектура үлгілерін пайдалануға болатын АЖ жүйесінде пайдалануға арналған ашық бастапқы кодты сәйкестендіру және қол жеткізуді басқару шешімі.

Keycloak бір рет кіру (SSO), делдалдық сәйкестендіру және әлеуметтік логин, пайдаланушы федерациясы, клиент адаптерлері, әкімші консолі және есептік жазбаны басқару консолі сияқты мүмкіндіктерді ұсынады.

Keycloak қолдайтын негізгі функциялар:

  • Браузер қолданбалары үшін бір рет кіру және бір рет шығу.
  • OpenID/OAuth 2.0/SAML қолдауы.
  • Identity Brokering – сыртқы OpenID Connect немесе SAML идентификациялық провайдерлері арқылы аутентификация.
  • Әлеуметтік логин – пайдаланушы сәйкестендіру үшін Google, GitHub, Facebook, Twitter қолдауы.
  • Пайдаланушы федерациясы – LDAP және Active Directory серверлерінен және басқа сәйкестендіру провайдерлерінен пайдаланушыларды синхрондау.
  • Kerberos көпірі – автоматты пайдаланушы аутентификациясы үшін Kerberos серверін пайдалану.
  • Әкімші консолі - Интернет арқылы параметрлерді және шешім параметрлерін бірыңғай басқаруға арналған.
  • Есептік жазбаны басқару консолі - пайдаланушы профилін өзін-өзі басқаруға арналған.
  • Компанияның корпоративтік сәйкестігіне негізделген шешімді теңшеу.
  • 2FA аутентификациясы - Google Authenticator немесе FreeOTP көмегімен TOTP/HOTP қолдауы.
  • Кіру ағындары - пайдаланушының өзін-өзі тіркеуі, құпия сөзді қалпына келтіру және қалпына келтіру және басқалар мүмкін.
  • Сеанстарды басқару – әкімшілер пайдаланушы сеанстарын бір нүктеден басқара алады.
  • Token Mappers – пайдаланушы атрибуттарын, рөлдерін және таңбалауыштарға қажетті басқа атрибуттарды байланыстырады.
  • Аймақ, қолданба және пайдаланушылар арқылы икемді саясатты басқару.
  • CORS қолдауы - Клиент адаптерлерінде кірістірілген CORS қолдауы бар.
  • Сервис провайдерінің интерфейстері (SPI) - сервердің әртүрлі аспектілерін теңшеуге мүмкіндік беретін SPI көп саны: аутентификация ағындары, сәйкестендіру провайдерлері, протоколды салыстыру және т.б.
  • JavaScript қолданбаларына арналған клиент адаптерлері, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • OpenID Connect Relying Party кітапханасын немесе SAML 2.0 Service Provider Library қолдау көрсететін әртүрлі қолданбалармен жұмыс істеуге қолдау көрсету.
  • Плагиндерді пайдалану арқылы кеңейтуге болады.

CI / CD процестері үшін, сондай-ақ Keycloak жүйесіндегі басқару процестерін автоматтандыру үшін REST API / JAVA API пайдалануға болады. Құжаттама электронды түрде қолжетімді:

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

Кәсіпорынның сәйкестендіру провайдерлері (жергілікті)

Пайдаланушылар федерациясы қызметтері арқылы пайдаланушыларды аутентификациялау мүмкіндігі.

Микросервис архитектурасында SSO. Біз Keycloak қолданамыз. №1 бөлім

Өтпелі аутентификацияны да пайдалануға болады - егер пайдаланушылар Kerberos (LDAP немесе AD) көмегімен жұмыс станцияларына қарсы аутентификация жасаса, олар пайдаланушы аты мен құпия сөзді қайта енгізбей-ақ, Keycloak бағдарламасына автоматты түрде аутентификациялануы мүмкін.

Пайдаланушылардың аутентификациясы және одан әрі авторизациясы үшін әзірлеу орталары үшін ең қолайлы реляциялық ДҚБЖ пайдалануға болады, өйткені ол жобалардың бастапқы кезеңдерінде ұзақ баптаулар мен интеграцияларды қажет етпейді. Әдепкі бойынша, Keycloak параметрлерді және пайдаланушы деректерін сақтау үшін кірістірілген ДҚБЖ пайдаланады.

Қолдау көрсетілетін ДҚБЖ тізімі кең және мыналарды қамтиды: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle және т.б. Осы уақытқа дейін ең көп сыналған Oracle 12C Release1 RAC және MariaDB 3.12 үшін Galera 10.1.19 кластері.

Сәйкестендіру провайдерлері - әлеуметтік логин

Әлеуметтік желілерден логинді пайдалануға болады. Пайдаланушыларды аутентификациялау мүмкіндігін қосу үшін Keycloack әкімші консолін пайдаланыңыз. Қолданба кодына ешқандай өзгертулер енгізу қажет емес және бұл функция қораптан тыс қолжетімді және жобаның кез келген кезеңінде іске қосылуы мүмкін.

Микросервис архитектурасында SSO. Біз Keycloak қолданамыз. №1 бөлім

Пайдаланушы аутентификациясы үшін OpenID/SAML идентификациялық провайдерлерін пайдалануға болады.

Keycloak бағдарламасында OAuth2 қолданатын әдеттегі авторизация сценарийлері

Авторизация кодының ағыны - серверлік қосымшалармен қолданылады. Авторизация рұқсатының ең кең тараған түрлерінің бірі, себебі ол қолданбаның бастапқы коды және клиент деректері бөгде адамдар үшін қол жетімді емес серверлік қолданбалар үшін өте қолайлы. Бұл жағдайда процесс қайта бағыттауға негізделген. Қолданба веб-шолғыш сияқты пайдаланушы агентімен (пайдаланушы-агент) өзара әрекеттесе алуы керек - пайдаланушы агенті арқылы қайта бағытталатын API рұқсат кодтарын алу үшін.

Жасырын ағын — мобильді немесе веб-қосымшалармен пайдаланылады (пайдаланушы құрылғысында жұмыс істейтін қолданбалар).

Жасырын авторизация рұқсат түрі клиенттің құпиялылығына кепілдік берілмейтін мобильді және веб-қосымшалар арқылы пайдаланылады. Сондай-ақ жасырын рұқсат түрі пайдаланушы агентінің қайта бағыттауын пайдаланады, оның көмегімен қол жеткізу таңбалауышы қолданбада одан әрі пайдалану үшін пайдаланушы агентіне беріледі. Бұл таңбалауышты пайдаланушыға және пайдаланушы құрылғысындағы басқа қолданбаларға қолжетімді етеді. Авторизация рұқсатының бұл түрі қолданбаның идентификациясын растамайды және процестің өзі қайта бағыттау URL мекенжайына (қызметпен бұрын тіркелген) сүйенеді.

Implicit Flow қатынас таңбалауышын жаңарту таңбалауыштарына қолдау көрсетпейді.

Клиент тіркелгі деректерін беру ағыны — қолданба API интерфейсіне кірген кезде пайдаланылады. Авторизация рұқсатының бұл түрі әдетте пайдаланушының тікелей әрекеттесуінсіз фондық режимде орындалуы керек серверден серверге өзара әрекеттесу үшін пайдаланылады. Клиенттің тіркелгі деректерін беру ағыны веб-қызметке (құпия клиент) басқа веб-қызметке қоңырау шалған кезде аутентификациялау үшін пайдаланушыны еліктеу орнына өзінің жеке тіркелгі деректерін пайдалануға мүмкіндік береді. Қауіпсіздіктің жоғары деңгейі үшін қоңырау шалушы қызмет тіркелгі деректері ретінде сертификатты (ортақ құпияның орнына) пайдалана алады.

OAuth2 сипаттамасында сипатталған
RFC-6749
RFC-8252
RFC-6819

JWT таңбалауышы және оның артықшылықтары

JWT (JSON Web Token) – ашық стандарт (https://tools.ietf.org/html/rfc7519), ол JSON нысаны түрінде тараптар арасында ақпаратты қауіпсіз тасымалдаудың ықшам және дербес жолын анықтайды.

Стандартқа сәйкес, токен нүктелермен бөлінген базалық-64 форматындағы үш бөліктен тұрады. Бірінші бөлік таңбалауыш түрін және ЭЦҚ алуға арналған хэш-алгоритмнің атауын қамтитын тақырып деп аталады. Екінші бөлімде негізгі ақпарат (пайдаланушы, атрибуттар және т.б.) сақталады. Үшінші бөлік – электрондық цифрлық қолтаңба.

. .
Ешқашан дерекқорда таңбалауышты сақтамаңыз. Жарамды таңбалауыш құпия сөзге баламалы болғандықтан, таңбалауышты сақтау құпия сөзді анық мәтінде сақтау сияқты.
Қолжетімділік белгісі оның иесіне қорғалған сервер ресурстарына қол жеткізуді қамтамасыз ететін таңбалауыш болып табылады. Әдетте оның қызмет ету мерзімі қысқа және токенді сұрайтын тараптың IP мекенжайы сияқты қосымша ақпаратты тасымалдауы мүмкін.

Токенді жаңарту клиенттерге олардың қызмет ету мерзімі аяқталғаннан кейін жаңа кіру токендерін сұрауға мүмкіндік беретін таңбалауыш болып табылады. Бұл белгілер әдетте ұзақ уақытқа шығарылады.

Микросервис архитектурасын қолданудың негізгі артықшылықтары:

  • Бір реттік аутентификация арқылы әртүрлі қолданбалар мен қызметтерге қол жеткізу мүмкіндігі.
  • Пайдаланушы профилінде бірқатар қажетті атрибуттар болмаған жағдайда, пайдалы жүктемеге қосуға болатын деректермен байытуға болады, соның ішінде автоматтандырылған және жылдам.
  • Белсенді сеанстар туралы ақпаратты сақтаудың қажеті жоқ, сервер қолданбасы тек қолтаңбаны тексеруі керек.
  • Пайдалы жүктемедегі қосымша атрибуттар арқылы қол жеткізуді басқарудың икемділігі.
  • Тақырып пен пайдалы жүктеме үшін таңбалауыш қолтаңбаны пайдалану жалпы шешімнің қауіпсіздігін арттырады.

JWT таңбалауышы – композиция

тақырып — әдепкі бойынша тақырып тек таңбалауыш түрін және шифрлау үшін қолданылатын алгоритмді қамтиды.

Токен түрі «typ» пернесінде сақталады. JWT тілінде «typ» пернесі еленбейді. Егер "typ" кілті бар болса, оның мәні JWT болуы керек, бұл нысан JSON веб-токен.

Екінші «alg» кілті таңбалауышты шифрлау үшін қолданылатын алгоритмді көрсетеді. Әдепкі бойынша ол HS256 мәніне орнатылуы керек. Тақырып base64 кодталады.

{ "alg": "HS256", "тип": "JWT"}
пайдалы жүктеме (мазмұн) — пайдалы жүктеме тексерілуі қажет кез келген ақпаратты сақтайды. Пайдалы жүктемедегі әрбір кілт «мәлімдеме» ретінде белгілі. Мысалы, қосымшаны тек шақыру арқылы енгізуге болады (жабық жарнама). Біз біреуді қатысуға шақырғымыз келгенде, біз оған шақыру электрондық поштасын жібереміз. Электрондық пошта мекенжайы шақыруды қабылдайтын адамға тиесілі екенін тексеру маңызды, сондықтан біз бұл мекенжайды «электрондық пошта» кілтінде сақтау арқылы пайдалы жүктемеге қосамыз.

{ «электрондық пошта»: »[электрондық пошта қорғалған]"}

Пайдалы жүктемедегі кілттер ерікті болуы мүмкін. Дегенмен, бірнеше сақталған:

  • iss (Эмитент) – токен жіберілетін қосымшаны анықтайды.
  • sub (Subject) – лексеманың тақырыбын анықтайды.
  • aud (Аудитория) – осы таңбалауышты алушылардың тізімі болып табылатын регистрді ескеретін жолдар немесе URI массиві. Қабылдаушы тарап берілген кілті бар JWT алған кезде, ол алушыларда өзін тексеруі керек - әйтпесе таңбалауышты елемеңіз.
  • exp (Expiration Time) - таңбалауыштың мерзімі біткенін көрсетеді. JWT стандарты мерзімі өткен таңбалауыштарды қабылдамау үшін барлық енгізулерді талап етеді. Exp кілті unix пішіміндегі уақыт белгісі болуы керек.
  • nbf (Бұрын емес) — таңбалауыш жарамды болатын сәтті анықтайтын unix пішіміндегі уақыт.
  • iat (Issued At) - Бұл кілт таңбалауыштың шығарылған уақытын білдіреді және оны JWT жасын анықтау үшін пайдалануға болады. iat кілті unix пішіміндегі уақыт белгісі болуы керек.
  • Jti (JWT идентификаторы) — регистрді ескере отырып, осы таңбалауыштың бірегей идентификаторын анықтайтын жол.

Пайдалы жүктеме шифрланған түрде берілмейтінін түсіну маңызды (бірақ таңбалауыштарды кірістіруге болады және шифрланған деректерді жіберуге болады). Сондықтан ол ешқандай құпия ақпаратты сақтай алмайды. Тақырып сияқты пайдалы жүктеме base64 кодталған.
Қолы - бізде тақырып пен пайдалы жүктеме болған кезде, біз қолтаңбаны есептей аламыз.

base64-те кодталған тақырып пен пайдалы жүктеме алынып, нүктемен бөлінген жолға біріктіріледі. Бұл жол мен құпия кілт тақырыпта көрсетілген шифрлау алгоритміне енгізіледі («alg» кілті). Кілт кез келген жол болуы мүмкін. Ұзынырақ жолдар жақсырақ болады, өйткені оларды таңдау үшін көп уақыт қажет.

{"alg":"RSA1_5","пайдалы жүктеме":"A128CBC-HS256"}

Keycloak Failover кластерінің архитектурасын құру

Барлық жобалар үшін жалғыз кластерді пайдаланған кезде SSO шешіміне қойылатын талаптар артады. Жобалар саны аз болған кезде, бұл талаптар барлық жобалар үшін соншалықты маңызды емес, дегенмен пайдаланушылар мен интеграциялар саны артқан сайын қолжетімділік пен өнімділікке қойылатын талаптар артады.

Жалғыз SSO істен шығу қаупінің артуы шешім архитектурасына және құрамдастардың артық болуы үшін қолданылатын әдістерге қойылатын талаптарды арттырады және өте қатаң SLA-ға әкеледі. Осыған байланысты, шешімдерді әзірлеу немесе енгізудің бастапқы кезеңдерінде жиі жобалардың өздерінің ақауларға төзімді емес инфрақұрылымы болады. Даму ілгерілеген сайын даму және масштабтау мүмкіндіктерін құру қажет. Ауыспалы кластерді құрудың ең икемді жолы контейнерлік виртуализацияны немесе гибридті тәсілді пайдалану болып табылады.

Белсенді/Белсенді және Белсенді/Пассивті кластер режимдерінде жұмыс істеу үшін реляциялық дерекқордағы деректердің сәйкестігін қамтамасыз ету қажет - екі дерекқор түйіні әртүрлі гео-таратылған деректер орталықтары арасында синхронды түрде қайталануы керек.

Ақауларға төзімді орнатудың қарапайым мысалы.

Микросервис архитектурасында SSO. Біз Keycloak қолданамыз. №1 бөлім

Бір кластерді пайдаланудың қандай артықшылықтары бар:

  • Жоғары қолжетімділік пен өнімділік.
  • Жұмыс режимдерін қолдау: Белсенді / Белсенді, Белсенді / Пассивті.
  • Динамикалық масштабтау мүмкіндігі - контейнерлік виртуализацияны пайдалану кезінде.
  • Орталықтандырылған басқару және бақылау мүмкіндігі.
  • Жобалардағы пайдаланушыларды сәйкестендіру/аутентификация/авторизациялаудың бірыңғай тәсілі.
  • Пайдаланушы әрекетінсіз әртүрлі жобалар арасындағы ашық өзара әрекеттесу.
  • JWT токенін әртүрлі жобаларда қайта пайдалану мүмкіндігі.
  • Бір сенім нүктесі.
  • Микросервистерді/контейнерді виртуалдандыруды қолданатын жобаларды тезірек іске қосу (қосымша құрамдастарды орнату және конфигурациялау қажет емес).
  • Сатушыдан коммерциялық қолдауды сатып алуға болады.

Кластерді жоспарлау кезінде нені іздеу керек

ДББЖ

Keycloak сақтау үшін дерекқорды басқару жүйесін пайдаланады: аймақтар, клиенттер, пайдаланушылар және т.б.
ДҚБЖ кең ауқымына қолдау көрсетіледі: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak өзінің кірістірілген реляциялық дерекқорымен бірге келеді. Әзірлеу орталары сияқты жеңіл жұмыс істейтін орталарда пайдалану ұсынылады.

Белсенді/Белсенді және Белсенді/Пассивті кластер режимдерінде жұмыс істеу үшін реляциялық дерекқордағы деректер сәйкестігі қажет және екі дерекқор кластері түйіндері деректер орталықтары арасында синхронды түрде қайталанады.

Бөлінген кэш (Infinspan)

Кластердің дұрыс жұмыс істеуі үшін JBoss Data Grid арқылы келесі кэш түрлерін қосымша үндестіру қажет:

Аутентификация сеанстары – белгілі бір пайдаланушының аутентификациясы кезінде деректерді сақтау үшін пайдаланылады. Бұл кэштен сұраулар әдетте қолданбаны емес, браузер мен Keycloak серверін ғана қамтиды.

Әрекет таңбалауыштары пайдаланушы әрекетті асинхронды түрде (электрондық пошта арқылы) растауы қажет сценарийлер үшін пайдаланылады. Мысалы, құпия сөзді ұмыту ағыны кезінде actionTokens Infinispan кэші бұрыннан пайдаланылған байланысты әрекет таңбалауыштары туралы метадеректерді қадағалау үшін пайдаланылады, сондықтан оны қайта пайдалану мүмкін емес.

Тұрақты деректерді кэштеу және жарамсыздандыру – дерекқорға қажетсіз сұрауларды болдырмау үшін тұрақты деректерді кэштеу үшін қолданылады. Кез келген Keycloak сервері деректерді жаңартқанда, барлық деректер орталықтарындағы барлық басқа Keycloak серверлері бұл туралы білуі керек.

Жұмыс - кластер түйіндері мен деректер орталықтары арасында жарамсыз хабарларды жіберу үшін ғана пайдаланылады.

Пайдаланушы сеанстары - пайдаланушының шолғыш сеансының ұзақтығына жарамды пайдаланушы сеансы деректерін сақтау үшін пайдаланылады. Кэш соңғы пайдаланушы мен қолданбадан HTTP сұрауларын өңдеуі керек.

Қатал күштен қорғау – сәтсіз кірулер туралы деректерді бақылау үшін қолданылады.

Жүктемені теңестіру

Жүктеме балансы пернелерді жабуға арналған жалғыз кіру нүктесі болып табылады және жабысқақ сеанстарды қолдауы керек.

Қолданба серверлері

Олар құрамдастардың бір-бірімен өзара әрекеттесуін басқару үшін пайдаланылады және бар автоматтандыру құралдары мен инфрақұрылымды автоматтандыру құралдарын динамикалық масштабтау арқылы виртуализациялануы немесе контейнерленуі мүмкін. OpenShift, Kubernates, Rancher ішіндегі ең көп тараған орналастыру сценарийлері.

Осымен бірінші бөлім – теориялық бөлім аяқталды. Келесі мақалалар сериясында әртүрлі сәйкестендіру провайдерлерімен біріктіру мысалдары және параметрлер мысалдары талданатын болады.

Ақпарат көзі: www.habr.com

пікір қалдыру