MĂ”ni kuu tagasi tegelesin OpenID Connect serveri rakendamisega, et hallata ligipÀÀsu sadadele meie sisemistele rakendustele. Omandustest, mis olid mugavad vĂ€iksematel mastaapidel, liikusime ĂŒldiselt tunnustatud standardile. LigipÀÀs keskse teenuse kaudu lihtsustab oluliselt tĂŒĂŒtuid toiminguid, vĂ€hendab autoriseerimiskulude rakendamise aega, vĂ”imaldab leida palju valmis lahendusi ega pane pead vaevama uute arendamisega. Selles artiklis rÀÀgin sellest ĂŒleminekust ja vigadest, mille oleme suutnud teha.

Kaua aega tagasi⊠Kuidas kÔik algas
MĂ”ni aasta tagasi, kui sisemisi rakendusi oli liiga palju, et kĂ€sitsi hallata, kirjutasime ligipÀÀsuhaldusrakenduse ettevĂ”tte sees. See oli lihtne Rails-rakendus, mis lĂ”puks ĂŒhendati töötajate teabega andmebaasi, kus seadistati ligipÀÀs erinevatele funktsioonidele. Samuti tĂ”ime esmakordselt vĂ€lja SSO, mis pĂ”hines kliendi ja autoriseerimisteenuse tokenite kontrollimisel, token edastati krĂŒpteeritud kujul mitmete parameetritega ja kontrolliti autoriseerimisteenuses. See ei olnud kĂ”ige mugavam variant, sest igas sisemises rakendus oli vaja kirjeldada mĂ€rkimisvÀÀrset loogikakihti, ning töötajate andmebaasid ei sĂŒnkroonitud autoriseerimisteenusega.
MĂ”ne aja pĂ€rast otsustasime lihtsustada tsentraliseeritud autoriseerimise ĂŒlesannet. SSO viidi koormustaseme kĂ€sitlemisele. OpenResty abil Lua-s lisasime ĆĄablooni, mis kontrollis tokenid, teadis, kuhu rakendusse pĂ€ring lĂ€heb, ja sai kontrollida, kas sinna on ligipÀÀs. Selline lĂ€henemine lihtsustas oluliselt ligipÀÀsu kontrollimise ĂŒlesannet sisemistes rakendustes â iga rakenduse koodis ei olnud enam vaja kirjeldada tĂ€iendavat loogikat. LĂ”puks sulgesime liikluse vĂ€ljastpoolt ja rakendus ei teadnud autoriseerimisest midagi.
Siiski jĂ€i ĂŒks probleem lahendamata. Kuidas olla rakendustega, mis vajavad teavet töötajate kohta? API kirjutamine autentimisteenusele oleks vĂ”imalik, kuid sel juhul tuleks igasse taolisse rakendusse lisada tĂ€iendav loogika. Lisaks soovisime vabaneda sĂ”ltuvusest meie ĂŒhisest kohandatud rakendusest, mis oli suunatud edasisele ĂŒleminekule OpenSource'ile, meie sisemisest autentimiserverist. RÀÀgime sellest kunagi hiljem. Lahenduseks mĂ”lemale probleemile sai OAuth.
TavapÀrased standardid
OAuth on arusaadav, laialdaselt tunnustatud autentimisstandard, kuid kuna ainult selle funktsionaalsus ei olnud piisav, hakati kaaluma ka OpenID Connect (OIDC). OIDC on avatud autentimisestandardite kolmas uus rakendus, mis on ehitatud OAuth 2.0 (avatud autoriseerimise protokoll) peale. Selline lahendus lahendab lÔppkasutaja teabe puudumise probleemi ning vÔimaldab autoriseerimise teenuse pakkuja vahetamist.
Kuid me ei valinud konkreetset pakkujat ja otsustasime meie olemasolevale autentimisteenusele lisada OIDC integreerimise. Sellega kaasnenud eelised seisnesid OIDC paindlikkuses lÔppkasutaja autoriseerimises. Nii oli meil vÔimalik OIDC toetust rakendada oma praeguses autentimisteenuses.

Meie tee oma OIDC-serveri rakendamiseni
1) Andmed viidi Ôigele kujule
OIDC integreerimiseks on oluline viia olemasolevad kasutajaandmed vormingusse, mis on standardile arusaadav. OIDC-s nimetatakse seda Claims'iks. Kleepsud on pĂ”himĂ”tteliselt lĂ”plikud vĂ€ljad kasutajate andmebaasis (nimi, e-post, telefon jne). On olemas , ja kĂ”ik, mis ei kuulu sellesse nimekirja, peetakse kohandatuks. SeetĂ”ttu on esimene punkt, millele peate tĂ€helepanu pöörama, kui soovite valida olemasoleva OIDC pakkuja â uute kleepsude mugav kohandamise vĂ”imalus.
Kleepsute rĂŒhm koondub jĂ€rgnevasse alamkogusse â Scope. Autoriseerimisel esitatakse juurdepÀÀsu taotlus mitte konkreetsetele kleepsudele, vaid just nimelt skoopidele, isegi kui osa skoopi kleepsudest pole vajalikud.
2) Rakendati vajalikud grant'id
OIDC integreerimise jĂ€rgmine osa on autoriseerimise tĂŒĂŒpide valik ja rakendamine, nn grant'id. Valitud grant mĂ”jutab edasist koostoime stseeni valitud rakenduse ja autoriseerimisserveri vahel. Sobiva grant'i valimise ligikaudne skeem on esitatud alloleval joonisel.

Meie esimese rakenduse jaoks kasutasime kĂ”ige levinumat grant'i â Autoriseerimiskood. Selle erinevus teistest on see, et see on kolmeastmeline, st see lĂ€bib tĂ€iendava kontrolli. Esiteks esitab kasutaja autoriseerimise loa taotluse, saab tokeni â Autoriseerimiskoodi, seejĂ€rel kĂŒsib ta selle tokeniga, nagu piletiga, juurdepÀÀsu tokenit. KĂ”ik pĂ”hikoostöö selle autoriseerimistootmis stseeniga pĂ”hineb ĂŒmbersuunangutel rakenduse ja autoriseerimisserveri vahel. Lisainfot selle grant'i kohta saab lugeda .
OAuth jĂ€rgib kontseptsiooni, et autoriseerimise kĂ€igus saadud juurdepÀÀsu tokenid peaksid olema ajutised ja neid tuleks muuta, eelistatavalt iga 10 minuti tagant. Autoriseerimiskoodi grant on kolmeastmeline kontroll ĂŒmbersuunangute kaudu, iga 10 minuti tagant sellise sammu lĂ€bimine ei ole ausalt öeldes kĂ”ige meeldivam ajaviide. Selle probleemi lahendamiseks on olemas veel ĂŒks grant â Refresh Token, mida oleme ka enda juures kasutanud. Siin on kĂ”ik lihtsam. Teise grant'i kontrolli kĂ€igus, peale peamise juurdepÀÀsu tokeni, antakse vĂ€lja veel ĂŒks â Refresh Token, mida saab kasutada ainult ĂŒks kord ja mille eluiga on reeglina oluliselt pikem. Selle Refresh Token'iga, kui peamise juurdepÀÀsu tokeni TTL (Time to Live) lĂ”ppeb, tuleb uue juurdepÀÀsu tokeni taotlus juba teise grant'i endpoint'ile. Kasutatud Refresh Token nullitakse kohe. Selline kontroll on kaheastmeline ja seda saab teostada taustal, kasutajale mĂ€rkamatult.
3) Kohandatud kasutajateabe vÀljastamise formaadid on seadistatud
PÀrast projekti elluviimist ja autentimise korraldamist tasub mainida lÔppkasutaja andmete saamist. OIDCi puhul on selle jaoks eraldi lÔpp-punkt, kus saab oma praeguse juurdepÀsutunnuse kehtivuse korral taotleda kasutajate andmeid. Ja kui kasutaja andmed ei muutu nii tihti, kuid nende jÀrele on tihti vajadus, vÔib lahenduseks olla JWT-tunnused. Need tunnused on samuti standardiga kooskÔlas. Igal JWT-tunnusel on kolm osa: header (tunnuse teave), payload (vajalikud andmed) ja signature (tunnus, mille allkirjastab server ja mida saab hiljem allkirja kehtivust kontrollida).
OIDC rakenduses nimetatakse JWT-tunnust id_token. Seda saab taotleda koos tavalisel juurdepĂ€sutunnusega ning ainus, mis jÀÀb, on allkirja kontrollimine. Autoriseerimisserveril on selle jaoks eraldi lĂ”pp-punkt, mis sisaldab avalike vĂ”tmete seotust formaadis . RÀÀkides sellest, tasub mainida, et eksisteerib veel ĂŒks lĂ”pp-punkt, mis standardi alusel peegeldab praegust OIDC-serveri konfiguratsiooni. Seal on loetletud kĂ”ik lĂ”pp-punktide aadressid (sealhulgas avalike vĂ”tmete seotuse aadress, mida kasutatakse allkirjastamiseks), toetatud claim'id ja ulatused, kasutatavad krĂŒptimisalgoritmid, toetatud grant'id 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"
]
}Seega saab id_token'i abil edastada kĂ”ik vajalikud vĂ€idetud payload'i ja ei pea iga kord volituse serveri poole pöörduma, et kasutaja andmeid kĂŒsida. Selle lĂ€henemise miinuseks on see, et muudatused kasutaja andmetes serverist ei saabu kohe, vaid koos uue juurdepÀÀsu tokeniga.
Teostuse tulemused
Nii, pĂ€rast oma OIDC serveri rakendamist ja selle seadistamist rakenduste kĂŒljel, lahendasime kasutaja teabe edastamise probleemi.
Kuna OIDC on avatud standard, on meil vĂ”imalus valida olemasolev teenusepakkuja vĂ”i rakendada server. Proovisime Keycloak'i, mis osutus vĂ€ga mugavaks konfigureerimiseks; pĂ€rast seadistamise ja ĂŒhenduskonfiguratsioonide muutmist rakenduste kĂŒljel on see tööks valmis. Rakenduste kĂŒljel jÀÀb ainult muuta ĂŒhenduskonfiguratsioonid.
RÀÀkides olemasolevatest lahendustest
Meie organisatsiooni raames kogusime esimese OIDC serverina oma implementatsiooni, mida tĂ€iendati vajadusel. PĂ€rast teiste olemasolevate lahenduste pĂ”hjalikku uurimist vĂ”ib öelda, et see on vaieldav teema. Oma serveri rakenduse kasuks mĂ€ngisid rolli teenusepakkujate mured vajaliku funktsionaalsuse puudumise ĂŒle, samuti olemasoleva vanade sĂŒsteemide tĂ”ttu, kus oli erinevaid kohandatud volitusi mĂ”ne teenuse jaoks ja kus on juba kogunenud palju töötajate andmeid. Kuid valmislahendustes on integreerimise mugavused. NĂ€iteks Keycloak'il on oma kasutajate haldamise sĂŒsteem ja andmed hoitakse otse seal; oma kasutajate sinna toimetamine ei ole suur probleem. Selleks on Keycloak'is API, mis vĂ”imaldab tĂ€ielikult teostada kĂ”iki vajalikke toiminguid andmete edastamiseks.
Veel ĂŒks sertifitseeritud ja huvitav, minu arvates, rakendus â Ory Hydra. See on huvitav kuna see on ĂŒles ehitatud erinevatest komponentidest. Integreerimiseks peate siduma oma kasutajahaldus teenuse nende autoriseerimise teenusega ja laiendama seda vajadusel.
Keycloak ja Ory Hydra ei ole ainus valmis lahendused. Parim on valida sertifitseeritud OpenID Foundation'i lahendus. Loomulikult on sellistel lahendustel OpenID sertifitseerimise mÀrge.

Ărge unustage olemasolevaid tasulisi teenusepakkujaid, kui te ei soovi hoida oma OIDC serverit. TĂ€napĂ€eval on palju hĂ€id vĂ”imalusi.
Mis edasi
Peatselt plaanime suunata liikluse siseteenustele muul viisil. Kavatseme viia meie praeguse SSO koormustasakaidiku OpenResty kaudu proxisse, mille aluseks on OAuth. Siin on juba palju valmis lahendusi, nÀiteks:
Lisaressursid
â hea teenus JWT-tokenite kontrollimiseks
â sertifitseeritud OIDC rakenduste nimekiri
Allikas: habr.com
