OpenID Connect: iekŔējo lietojumprogrammu autorizācija no pielāgotas uz standarta

Pirms dažiem mēneÅ”iem es ieviesu OpenID Connect serveri, lai pārvaldÄ«tu piekļuvi simtiem mÅ«su iekŔējo lietojumprogrammu. No mÅ«su paÅ”u izstrādes, kas ir ērti mazākā mērogā, mēs esam pārgājuÅ”i uz vispārpieņemtu standartu. Piekļuve, izmantojot centrālo pakalpojumu, ievērojami vienkārÅ”o monotonās darbÄ«bas, samazina autorizāciju ievieÅ”anas izmaksas, ļauj atrast daudz gatavu risinājumu un nelauzt smadzenes, izstrādājot jaunus. Å ajā rakstā es runāŔu par Å”o pāreju un izciļņiem, kurus mums izdevās aizpildÄ«t.

OpenID Connect: iekŔējo lietojumprogrammu autorizācija no pielāgotas uz standarta

Sen... Kā tas viss sākās

Pirms dažiem gadiem, kad bija pārāk daudz iekŔējo lietojumprogrammu manuālai kontrolei, mēs uzrakstÄ«jām pieteikumu, lai kontrolētu piekļuvi uzņēmuma iekÅ”ienē. Tā bija vienkārÅ”a Rails aplikācija, kas pieslēdzās datu bāzei ar informāciju par darbiniekiem, kurā tika konfigurēta pieeja dažādām funkcionalitātēm. Tajā paŔā laikā mēs izvirzÄ«jām pirmo SSO, kas balstÄ«jās uz tokenu pārbaudi no klienta un autorizācijas servera puses, marÄ·ieris tika pārsÅ«tÄ«ts Å”ifrētā veidā ar vairākiem parametriem un pārbaudÄ«ts autorizācijas serverÄ«. Tas nebija ērtākais variants, jo katrai iekŔējai lietojumprogrammai bija jāapraksta ievērojams loÄ£ikas slānis, un darbinieku datu bāzes tika pilnÄ«bā sinhronizētas ar autorizācijas serveri.

Pēc kāda laika mēs nolēmām vienkārÅ”ot centralizētās autorizācijas uzdevumu. SSO tika pārsÅ«tÄ«ts uz balansētāju. Ar OpenResty palÄ«dzÄ«bu Lua tika pievienota veidne, kas pārbaudÄ«ja marÄ·ierus, zināja, uz kuru lietojumprogrammu tiek nosÅ«tÄ«ts pieprasÄ«jums, un varēja pārbaudÄ«t, vai tur ir piekļuve. Å Ä« pieeja ievērojami vienkārÅ”oja uzdevumu kontrolēt piekļuvi iekŔējām lietojumprogrammām - katras lietojumprogrammas kodā vairs nebija jāapraksta papildu loÄ£ika. Rezultātā mēs ārēji slēdzām satiksmi, un pati lietojumprogramma neko nezināja par autorizāciju.

Tomēr viena problēma palika neatrisināta. Kā ar lietojumprogrammām, kurām nepiecieÅ”ama informācija par darbiniekiem? Autorizācijas pakalpojumam bija iespējams uzrakstÄ«t API, bet tad katrai Ŕādai lietojumprogrammai bÅ«tu jāpievieno papildu loÄ£ika. Turklāt mēs vēlējāmies atbrÄ«voties no atkarÄ«bas no vienas no mÅ«su paÅ”u rakstÄ«tajām lietojumprogrammām, kas vēlāk tiks pārtulkotas OpenSource, mÅ«su iekŔējā autorizācijas serverÄ«. Par to runāsim citreiz. Abu problēmu risinājums bija OAuth.

kopējiem standartiem

OAuth ir saprotams, vispārpieņemts autorizācijas standarts, taču, tā kā ar tā funkcionalitāti vien nepietiek, viņi nekavējoties sāka apsvērt OpenID Connect (OIDC) analÄ«zi. Pati OIDC ir treŔā atvērtā autentifikācijas standarta ievieÅ”ana, kas ir iekļauta OAuth 2.0 protokola (atvērtā autorizācijas protokola) papildinājumā. Å is risinājums novērÅ” datu trÅ«kuma problēmu par gala lietotāju, kā arÄ« ļauj mainÄ«t autorizācijas nodroÅ”inātāju.

Tomēr mēs neizvēlējāmies konkrētu pakalpojumu sniedzēju un nolēmām pievienot integrāciju ar OIDC mÅ«su esoÅ”ajam autorizācijas serverim. Par labu Å”im lēmumam bija tas, ka OIDC ir ļoti elastÄ«gs galalietotāju autorizācijas ziņā. Tādējādi bija iespējams ieviest OIDC atbalstu jÅ«su paÅ”reizējā autorizācijas serverÄ«.

OpenID Connect: iekŔējo lietojumprogrammu autorizācija no pielāgotas uz standarta

Mūsu veids, kā ieviest savu OIDC serveri

1) Atnesa datus vēlamajā formā

Lai integrētu OIDC, ir nepiecieÅ”ams ieviest paÅ”reizējos lietotāja datus standartam saprotamā formā. OIDC to sauc par pretenzijām. Pretenzijas bÅ«tÄ«bā ir galÄ«gie lauki lietotāju datubāzē (vārds, e-pasts, tālruņa numurs utt.). Pastāv standarta zÄ«mogu saraksts, un viss, kas nav iekļauts Å”ajā sarakstā, tiek uzskatÄ«ts par pasÅ«tÄ«jumu. Tāpēc pirmais punkts, kam jāpievērÅ” uzmanÄ«ba, ja vēlaties izvēlēties esoÅ”u OIDC nodroÅ”inātāju, ir iespēja ērti pielāgot jaunus zÄ«molus.

PazÄ«mes grupa ir apvienota Ŕādā apakÅ”kopā - DarbÄ«bas joma. Autorizācijas laikā tiek pieprasÄ«ta piekļuve nevis konkrētiem zÄ«moliem, bet tvērumiem, pat ja daži no tvēruma zÄ«moliem nav nepiecieÅ”ami.

2) Ieviesa nepiecieŔamās dotācijas

Nākamā OIDC integrācijas daļa ir autorizācijas veidu, tā saukto grantu, izvēle un ievieÅ”ana. Turpmākais mijiedarbÄ«bas scenārijs starp atlasÄ«to lietojumprogrammu un autorizācijas serveri bÅ«s atkarÄ«gs no izvēlētās dotācijas. Paraugshēma pareizās dotācijas izvēlei ir parādÄ«ta attēlā zemāk.

OpenID Connect: iekŔējo lietojumprogrammu autorizācija no pielāgotas uz standarta

Pirmajā pieteikumā mēs izmantojām visizplatÄ«tāko dotāciju ā€” Autorizācijas kodu. Tā atŔķirÄ«ba no citiem ir tā, ka tā ir trÄ«spakāpju, t.i. tiek veikta papildu pārbaude. Pirmkārt, lietotājs veic autorizācijas atļaujas pieprasÄ«jumu, saņem tokenu - Autorizācijas kodu, pēc tam ar Å”o marÄ·ieri, it kā ar ceļojuma biļeti, pieprasa piekļuves pilnvaru. Visa Ŕī autorizācijas skripta galvenā mijiedarbÄ«ba ir balstÄ«ta uz novirzÄ«Å”anu starp lietojumprogrammu un autorizācijas serveri. JÅ«s varat lasÄ«t vairāk par Å”o stipendiju Å”eit.

OAuth ievēro koncepciju, ka piekļuves marÄ·ieriem, kas iegÅ«ti pēc autorizācijas, jābÅ«t Ä«slaicÄ«giem un jāmainās, vēlams vidēji ik pēc 10 minÅ«tēm. Autorizācijas koda pieŔķirÅ”ana ir trÄ«s soļu pārbaude, izmantojot novirzÄ«Å”anu, ik pēc 10 minÅ«tēm pagriezt Ŕādu soli, atklāti sakot, nav tas patÄ«kamākais uzdevums acÄ«m. Lai atrisinātu Å”o problēmu, ir vēl viens grants - Refresh Token, ko izmantojām arÄ« mÅ«su valstÄ«. Å eit viss ir vieglāk. Veicot verifikāciju no cita granta, papildus galvenajam piekļuves pilnvaram tiek izsniegts vēl viens - Refresh Token, kuru var izmantot tikai vienu reizi un tā kalpoÅ”anas laiks parasti ir daudz ilgāks. Izmantojot Å”o atsvaidzināŔanas pilnvaru, kad beidzas galvenās piekļuves pilnvaras TTL (Time to Live), jaunas piekļuves pilnvaras pieprasÄ«jums nonāks citas pieŔķirÅ”anas galapunktā. Izmantotā atsvaidzināŔanas pilnvara tiek nekavējoties atiestatÄ«ta uz nulli. Å Ä« pārbaude ir divpakāpju, un to var veikt fonā, lietotājam nemanāmi.

3) Iestatiet pielāgotus datu izvades formātus

Pēc izvēlēto grantu ievieÅ”anas, autorizācijas nostrādāŔanas, ir vērts pieminēt datu iegÅ«Å”anu par gala lietotāju. OIDC Å”im nolÅ«kam ir atseviŔķs galapunkts, kurā varat pieprasÄ«t lietotāja datus ar savu paÅ”reizējo piekļuves pilnvaru un ja tie ir atjaunināti. Un, ja lietotāja dati nemainās tik bieži, un daudzkārt ir jāseko lÄ«dzi esoÅ”ajiem, varat nonākt pie tāda risinājuma kā JWT marÄ·ieri. Å os marÄ·ierus atbalsta arÄ« standarts. Pats JWT marÄ·ieris sastāv no trim daļām: galvenes (informācija par marÄ·ieri), slodzes (jebkuri nepiecieÅ”amie dati) un paraksta (paraksts, marÄ·ieri paraksta serveris un vēlāk varat pārbaudÄ«t tā paraksta avotu).

OIDC ievieÅ”anā JWT marÄ·ieri sauc par id_token. To var pieprasÄ«t kopā ar parasto piekļuves pilnvaru, un atliek tikai pārbaudÄ«t parakstu. Autorizācijas serverim ir atseviŔķs galapunkts ar virkni publisko atslēgu formātā J.W.K.. Un runājot par to, ir vērts pieminēt, ka ir vēl viens galapunkts, kas, pamatojoties uz standartu RFC5785 atspoguļo paÅ”reizējo OIDC servera konfigurāciju. Tajā ir visas galapunktu adreses (tostarp parakstÄ«Å”anai izmantotā publiskās atslēgas gredzena adrese), atbalstÄ«tie zÄ«moli un tvērumi, izmantotie Å”ifrÄ“Å”anas algoritmi, atbalstÄ«tās dotācijas utt.

Piemēram, Google:

{
 "issuer": "https://accounts.google.com",
 "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",
 "device_authorization_endpoint": "https://oauth2.googleapis.com/device/code",
 "token_endpoint": "https://oauth2.googleapis.com/token",
 "userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo",
 "revocation_endpoint": "https://oauth2.googleapis.com/revoke",
 "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",
 "response_types_supported": [
  "code",
  "token",
  "id_token",
  "code token",
  "code id_token",
  "token id_token",
  "code token id_token",
  "none"
 ],
 "subject_types_supported": [
  "public"
 ],
 "id_token_signing_alg_values_supported": [
  "RS256"
 ],
 "scopes_supported": [
  "openid",
  "email",
  "profile"
 ],
 "token_endpoint_auth_methods_supported": [
  "client_secret_post",
  "client_secret_basic"
 ],
 "claims_supported": [
  "aud",
  "email",
  "email_verified",
  "exp",
  "family_name",
  "given_name",
  "iat",
  "iss",
  "locale",
  "name",
  "picture",
  "sub"
 ],
 "code_challenge_methods_supported": [
  "plain",
  "S256"
 ],
 "grant_types_supported": [
  "authorization_code",
  "refresh_token",
  "urn:ietf:params:oauth:grant-type:device_code",
  "urn:ietf:params:oauth:grant-type:jwt-bearer"
 ]
}

Tādējādi, izmantojot id_token, jÅ«s varat pārsÅ«tÄ«t visas nepiecieÅ”amās iezÄ«mes uz marÄ·iera lietderÄ«go slodzi un katru reizi nesazināties ar autorizācijas serveri, lai pieprasÄ«tu lietotāja datus. Å Ä«s pieejas trÅ«kums ir tāds, ka lietotāja datu izmaiņas no servera nenotiek uzreiz, bet kopā ar jaunu piekļuves pilnvaru.

ÄŖstenoÅ”anas rezultāti

Tātad, pēc mÅ«su paÅ”u OIDC servera ievieÅ”anas un savienojumu konfigurÄ“Å”anas ar to lietojumprogrammas pusē, mēs atrisinājām informācijas pārsÅ«tÄ«Å”anas problēmu par lietotājiem.
Tā kā OIDC ir atvērts standarts, mums ir iespēja izvēlēties esoÅ”u pakalpojumu sniedzēju vai servera ievieÅ”anu. Izmēģinājām Keycloak, kas izrādÄ«jās ļoti ērti konfigurējams, pēc savienojuma konfigurāciju iestatÄ«Å”anas un maiņas aplikācijas pusē tas ir gatavs darbam. Lietojumprogrammas pusē atliek tikai mainÄ«t savienojuma konfigurācijas.

Runā par esoŔajiem risinājumiem

MÅ«su organizācijas ietvaros kā pirmais OIDC serveris samontējām savu implementāciju, kas tika papildināta pēc nepiecieÅ”amÄ«bas. Pēc detalizētas citu gatavo risinājumu apskates varam teikt, ka tas ir strÄ«dÄ«gs jautājums. Par labu lēmumam ieviest savu serveri, pakalpojumu sniedzēji pauda bažas par vajadzÄ«gās funkcionalitātes trÅ«kumu, kā arÄ« par vecas sistēmas klātbÅ«tni, kurā dažiem pakalpojumiem bija dažādas pielāgotas autorizācijas un diezgan daudz. dati par darbiniekiem jau bija saglabāti. Tomēr gatavās implementācijās ir integrācijas ērtÄ«bas. Piemēram, Keycloak ir sava lietotāju pārvaldÄ«bas sistēma un dati tiek glabāti tieÅ”i tajā, un apsteigt savus lietotājus tur nebÅ«s grÅ«ti. Lai to izdarÄ«tu, Keycloak ir API, kas ļaus pilnÄ«bā veikt visas nepiecieÅ”amās pārsÅ«tÄ«Å”anas darbÄ«bas.

Vēl viens sertificētas, interesantas, manuprāt, ievieÅ”anas piemērs ir Ory Hydra. Tas ir interesanti, jo sastāv no dažādām sastāvdaļām. Lai integrētu, jums bÅ«s jāsaista savs lietotāju pārvaldÄ«bas pakalpojums ar viņu autorizācijas pakalpojumu un pēc vajadzÄ«bas jāpaplaÅ”ina.

Keycloak un Ory Hydra nav vienÄ«gie pieejamie risinājumi. Vislabāk ir izvēlēties OpenID Foundation sertificētu ievieÅ”anu. Å iem risinājumiem parasti ir OpenID sertifikācijas emblēma.

OpenID Connect: iekŔējo lietojumprogrammu autorizācija no pielāgotas uz standarta

Neaizmirstiet arÄ« par esoÅ”ajiem maksas pakalpojumu sniedzējiem, ja nevēlaties paturēt savu OIDC serveri. Å odien ir daudz labu iespēju.

Kas ir nākamais

Tuvākajā laikā iekŔējiem pakalpojumiem slēgsim satiksmi citādā veidā. Mēs plānojam pārsÅ«tÄ«t mÅ«su paÅ”reizējo SSO balansētājā, izmantojot OpenResty, uz starpniekserveri, kura pamatā ir OAuth. Å eit jau ir daudz gatavu risinājumu, piemēram:
github.com/bitly/oauth2_proxy
github.com/ory/oathkeeper
github.com/keycloak/keycloak-gatekeeper

Papildu materiāli

jwt.io ā€“ labs serviss JWT marÄ·ieru apstiprināŔanai
openid.net/developers/certified - sertificētu OIDC ievieÅ”anu saraksts

Avots: www.habr.com

Pievieno komentāru