OpenID Connect: sisemiste rakenduste autoriseerimine kohandatud lahendustest standardini

MĂ”ni kuu tagasi töötasin OpenID Connect serveri rakendamise kallal, et hallata ligipÀÀsu sadadele meie sisemistele rakendustele. Omandatud lahendustest, mis olid mugavad vĂ€iksematel ulatustel, liikusime ĂŒldiselt aktsepteeritud standardini. LigipÀÀs keskse teenuse kaudu lihtsustab oluliselt rutiinseid toiminguid, vĂ€hendab autoriseerimise rakendamise kulusid, vĂ”imaldab leida palju valmis lahendusi ning ei pane pead vaeva uute arendamisel. Selles artiklis rÀÀgin maagilisest ĂŒleminekust ja saamudest, mis me oleme saanud.

OpenID Connect: sisemiste rakenduste autoriseerimine kohandatud lahendustest standardini

Kaugel-kaugel... Kuidas kÔik alguse sai

MĂ”ned aastad tagasi, kui meie organisatsiooni sisemisi rakendusi oli liiga palju, et neid kĂ€sitsi hallata, arendasime pÀÀsukontrolli rakenduse. See oli lihtne Rails-rakendus, mis liitus töötajate teavet sisaldava andmebaasiga, kus seadistati juurdepÀÀs erinevatele funktsioonidele. Sel ajal rakendasime ka esimest SSO-d, mis pĂ”hines klientide ja autoriseerimiserveri vaheliste tokenite kontrollimisel; token edastati krĂŒptitud kujul koos mitmete parameetritega ja kontrolliti autoriseerimiserveris. See polnud kĂ”ige mugavam lahendus, sest igas sisemises rakenduses tuli rakendada mĂ€rkimisvÀÀrne loogikakiht ja töötajate andmebaasid ei sĂŒnkroniseerunud autoriseerimiserveriga.

MĂ”ne aja pĂ€rast otsustasime keskse autentimise ĂŒlesande lihtsustada. SSO viidud koormuse tasakaalustajale. OpenResty abil Lua-s lisasime ĆĄablooni, mis kontrollis tokenid, teadis, millisesse rakendusse pĂ€ring lĂ€heb ja sai kontrollida, kas seal on juurdepÀÀs. Selline lĂ€henemine lihtsustas siseringi rakenduste ligipÀÀsu kontrollimise ĂŒlesannet — iga rakenduse koodis ei olnud enam vaja kirjeldada tĂ€iendavat loogikat. LĂ”ppkokkuvĂ”ttes sulgesime vĂ€list liiklust, aga rakendus ei teadnud autentimisest midagi.

Kuid ĂŒks probleem jĂ€i lahendamata. Kuidas neid rakendusi kĂ€sitleda, mis vajavad töötajate teavet? VĂ”isime kirjutada autoriseerimisteenuse API, kuid sel juhul oleks tulnud lisada iga rakenduse jaoks tĂ€iendav loogika. Samuti soovisime loobuda sĂ”ltuvusest ĂŒhest meie ise kirjutatud rakendusest, mis suunatud edaspidi OpenSource'i, meie sisemisest autoriseerimisteenusest. Sellest rÀÀgime mĂ”ni teine kord. MĂ”lema probleemi lahenduseks oli OAuth.

Üldiselt aktsepteeritud standarditele

OAuth on arusaadav, ĂŒldiselt aktsepteeritud autentimisstandard, kuid kuna selle funktsionaalsus ĂŒksi ei piisa, hakati kohe vaatama ka OpenID Connecti (OIDC). OIDC on kolmas avatud autentimisstandard, mis on ĂŒles ehitatud OAuth 2.0 (avatud autoriseerimise protokoll) peale. Selline lahendus lahendab lĂ”ppkasutaja andmete puudumise probleemi ning pakub vĂ”imalust autoriseerimisprovajderi vahetamiseks.

Siiski ei olnud me otsustanud konkreetset provajderit ja otsustasime oma olemasolevale autoriseerimiserverile lisada OIDC integreerimise. Sellise lahenduse kasuks rÀÀkis OIDC suur paindlikkus lÔppkasutaja autoriseerimisel. Seega oli meil vÔimalus OIDC toetust oma praeguses autoriseerimiserveris rakendada.

OpenID Connect: sisemiste rakenduste autoriseerimine kohandatud lahendustest standardini

Meie tee oma OIDC-serveri teostamiseni

1) Toimesime andmed vajaliku vormingusse

OIDC integreerimiseks on vaja olemasolevad kasutajaandmed viia vormingusse, mis on standardiga arusaadav. OIDC-s nimetatakse seda Kleepsudeks. Kleepsud on pÔhimÔtteliselt lÔplikud vÀljad kasutajate andmebaasis (nimi, e-post, telefon jne). On olemas standardne kleepsude nimekiri, ja kÔik, mis ei kuulu sellesse loendisse, loetakse kohandatuks. Seega on esimene asi, millele peate tÀhelepanu pöörama, kui soovite valida olemasoleva OIDC-prosidendi, uute claimide mugav kohandamine.

Claimide rĂŒhm koondub jĂ€rgmisse alarĂŒhma – Scope. Autoriseerimise kĂ€igus kĂŒsitakse juurdepÀÀsu mitte konkreetsetele claimidele, vaid just nimelt skoopidele, isegi kui osa skoopi claimidest ei ole vajalik.

2) Realiseeritud vajalikud grantid

JĂ€rgmiseks osaks OIDC integreerimisel on autoriseerimistĂŒĂŒpide valimine ja rakendamine, nn grantid. Valitud grant sĂ”ltub edasise suhtlemise stsenaarium valitud rakenduse ja autoriseerimiserveri vahel. NĂ€idis skeem vajalikest grantidest on esitatud alloleval joonisel.

OpenID Connect: sisemiste rakenduste autoriseerimine kohandatud lahendustest standardini

Meie esimese rakenduse jaoks kasutasime kĂ”ige levinumat volitust – Authorization Code. Selle erinevus teistega on see, et see on kolmesammuline, s.t. see lĂ€bib tĂ€iendava kontrolli. Esiteks teeb kasutaja volituse saamiseks pĂ€ringu, saab toekina – Authorization Code, seejĂ€rel kĂŒsib ta selle tokeniga, nagu piletiga sĂ”itmiseks, juurdepÀÀsu tokenit. KĂ”ik peamine interaktsioon selle autoriseerimise stsenaariumi puhul pĂ”hineb suunamistel rakenduse ja autoriseerimisserveri vahel. Rohkem selle volituse kohta saab lugeda siit. siit.

OAuth jĂ€rgib pĂ”himĂ”tet, et autoriseerimise teel saadud juurdepÀÀsutokendid peaksid olema ajutised ja neid tuleks vahetada soovitatavalt keskmiselt iga 10 minuti jĂ€rel. Autoriseerimiskoodi grant on kolmeastmeline protsess, mis toimub ĂŒmbersuunamiste kaudu, ning iga 10 minuti jĂ€rel sellise sammu tegemine ei ole ausalt öeldes kĂ”ige meeldivam vaatepilt. Selle probleemi lahendamiseks on olemas veel ĂŒks grant – Refresh Token, mida me samuti kasutame. Siin on kĂ”ik lihtsam. Kontrollimise kĂ€igus teise grant'iga annab juurdepÀÀsutokendi kĂ”rval vĂ€lja ka Refresh Token'i, mida saab kasutada ainult ĂŒks kord ja mille eluaeg on tavaliselt oluliselt pikem. Selle Refresh Token'iga, kui peamise juurdepÀÀsutokendi TTL (Time to Live) aeg on lĂ”ppenud, saadetakse uus juurdepÀÀsutokeni pĂ€ring juba mĂ”ne teise grant'i lĂ”pp-punkti. Kasutatud Refresh Token nullitakse kohe. Selline kontroll on kaheastmeline ja seda saab teha taustal, kasutajale mĂ€rkamatult.

3) Konfigureerisime kasutajandmete vÀljundiformaadid

Kui valitud toetused on rakendatud ja autoriseerimine töötab, tasub mainida lĂ”ppkasutaja andmete saamist. OIDC-s on selleks eraldi lĂ”pp-punkt, kus kehtiva juurdepÀÀsu tokeniga saab kasutajaandmeid kĂŒsida. Kui kasutajaandmed ei muutu sageli, aga neid peab mitu korda kĂŒsima, vĂ”ib leida lahenduse JWT-tokenite kasutamisel. Need tokenid on samuti standardi kohaselt toetatud. Iga JWT-token koosneb kolmest osast: header (tokeni teave), payload (vajalikud andmed) ja signature (allkiri, token allkirjastatakse serveris ja hiljem saab kontrollida allkiri allikat).

OIDC rakenduses nimetatakse JWT-tokenit id_tokeniks. Seda saab kĂŒsida koos tavalise juurdepÀÀsu tokeniga ja kĂ”ik, mis jÀÀb ĂŒle, on allkirja kontrollimine. Autoriseerimisteenusel on selleks eraldi lĂ”pp-punkt koos avalike vĂ”tmete paariga, mis on formaadis JWK. RÀÀkides sellest, tasub mainida, et on olemas veel ĂŒks lĂ”pp-punkt, mis pĂ”hineb standardil RFC5785 peegeldab praegust OIDC-serveri konfiguratsiooni. See sisaldab kĂ”iki endpoint’ide aadresse (sealhulgas avalike vĂ”tmete sidumise aadressid, mida kasutatakse allkirjastamiseks), toetatud vĂ€iteid ja ulatusi, kasutatavaid krĂŒpteerimisalgoritme, toetatud grant'e jne.

NĂ€iteks Google'is:

{
 "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"
 ]
}

Sel viisil saab id_token'i abil edastada kĂ”ik vajalikud vĂ€ited tokeni koormuses, ilma et peaks iga kord autentimisseerverilt kasutaja andmeid kĂŒsima. Selle lĂ€henemise miinus on see, et kasutaja andmete muutmine serverist ei jĂ”ua koheselt, vaid koos uue juurdepÀÀsutokeniga.

Tegevuste kokkuvÔte

Nii et pĂ€rast oma OIDC-serveri elluviimist ja ĂŒhenduste seadistamist rakenduste poolel lahendasime kasutajate teabe edastamise probleemi.
Kuna OIDC on avatud standard, on meil vĂ”imalus valida olemasolev teenusepakkuja vĂ”i rakendada oma server. Proovisime Keycloak'i, mis osutus vĂ€ga mugavaks seadistamisel; pĂ€rast seadistamist ja rakenduste poolel ĂŒhenduste konfigureerimise muutmist on see tööks valmis. Rakenduste poolel jÀÀb alles vaid seadistuste muutmine.

RÀÀkides olemasolevatest lahendustest

Meie organisatsiooni raames oleme esimese OIDC-serverina kokku pannud oma rakenduse, mida on vajadusel tĂ€iustatud. PĂ€rast teiste valmis lahenduste pĂ”hjalikku lĂ€bivaatamist vĂ”ib öelda, et see on vaieldav teema. Oma serveri rakenduse kasuks rÀÀkisid mured teenusepakkujate poolt vajaliku funktsionaalsuse puudumise ĂŒle, samuti vana sĂŒsteemi olemasolu, mis sisaldas erinevaid kohandatud autoriseerimisi teatud teenuste jaoks ja kus oli juba ĂŒsna palju töötajate andmeid. Siiski, valmis lahendustes on mugavusi integratsiooniks. NĂ€iteks Keycloak's on oma kasutajate haldamise sĂŒsteem ning andmed sĂ€ilitatakse otse seal, mistĂ”ttu oma kasutajate ĂŒleviimine sinna ei tekita suuri raskusi. Selleks on Keycloak's API, mis vĂ”imaldab teostada kĂ”ik vajalikud toimingud andmete ĂŒleviimiseks.

Veel ĂŒhe sertifitseeritud, huvitava lahenduse nĂ€ide on Ory Hydra. See on huvitav, kuna see koosneb erinevatest komponentidest. Integreerimiseks peate siduma oma kasutajate haldusteenuse nende autoriseerimisteenusega ning vajadusel laiendama.

Keycloak ja Ory Hydra ei ole ainsad valmislahendused. Parim on valida sertifitseeritud OpenID Foundation'i lahendus. TĂŒĂŒpiliselt on sellistel lahendustel OpenID sertifitseerimise ikoon.

OpenID Connect: sisemiste rakenduste autoriseerimine kohandatud lahendustest standardini

Samuti Àrge unustage olemasolevaid tasulisi teenuseid, kui te ei soovi oma OIDC-serverit hallata. TÀna on palju hÀid valikuid.

Mis edasi

LÀhiajal plaanime suunata liiklust siseteenustele teistmoodi. Kavatseme viia oma praeguse SSO tasakaalustajale OpenResty abil proxy'le, mille aluseks on OAuth. Ka siin on olemas palju valmislahendusi, nÀiteks:
github.com/bitly/oauth2_proxy
github.com/ory/oathkeeper
github.com/keycloak/keycloak-gatekeeper

Lisamaterjalid

jwt.io – hea teenus JWT-tokenite kontrollimiseks
openid.net/developers/certified — sertifitseeritud OIDC lahenduste nimekiri

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster