
MĂ€rk. tĂ”lge.: selle tsĂŒkli eesmĂ€rk oli tutvustada Istio vĂ”imalusi ning neid praktikas demonstreerida, â peene hÀÀlestusega marsruutimise ja vĂ”rgu liikluse haldamise kaudu. NĂŒĂŒd keskendume turvalisusele: selleks, et demonstreerida sellega seotud pĂ”hifunktsioone, kasutab autor identity-teenust Auth0, kuid samasuguseid seadistusi saab teha ka teiste pakkujatega.
Me seadsime ĂŒles Kubernetes-klastrit, kus kĂ€ivitasime Istio ja nĂ€idis mikroteenuste rakenduse Sentiment Analysis, â nii demonstreeriti Istio vĂ”imalusi.
Istio abil suutsime sĂ€ilitada teenuste vĂ€ikese suuruse, kuna need ei vaja selliste âkihtideâ rakendamist nagu taaskĂ€ivitus (Retries), ajapiirangud (Timeouts), automaatsed katkestajad (Circuit Breakers), jĂ€lgimine (Tracing), monitooring (Monitoring). Lisaks kasutasime arenenud testimise ja juurutamise tehnikaid: A/B-testimine, peegeldamine ja kanarulli vĂ€ljalaskmine.

Uues materjalis uurime viimaseid kihti, mis viivad Ă€rivÀÀrtuseni: autentimise ja autoriseerimise â ja Istios on see tĂ”eline nauding!
Autentimine ja autoriseerimine Istios
Ma ei oleks kunagi uskunud, et mind inspireerivad autentimine ja autoriseerimine. Mida tehniliselt vĂ”ib Istio pakkuda, et muuta need teemad pĂ”nevaks ja veelgi enam â et need inspireeriksid ka sind?
Lihtne! Istio hÔlbustab nende vÔimaluste vastutust teie teenustelt Envoy proxyle. Kui pÀringud jÔuavad teenusteni, on need juba autentitud ja autoriseeritud, nii et teil jÀÀb vaid Àri jaoks kasuliku koodi kirjutamine.
Kas kÔlab hÀsti? Vaadakem siis lÀhemalt!
Autentimine Auth0-ga
Identiteedi ja juurdepÀÀsu haldamise serverina kasutame Auth0, millel on prooviversioon, mis on intuitiivselt kasutatav ja lihtsalt meeldib mulle. Siiski saab samu pÔhimÔtteid rakendada ka mistahes muu : KeyCloak, IdentityServer ja paljusid teisi.
Alustuseks minge oma kontoga, looge tenant (tenant - âĂŒhendusâ, loogiline eraldamise ĂŒksus, vt lĂ€hemalt â kt. tĂ”lge) ja minge Rakendused > Vaikimisi rakendus, valides Domeen, nagu on nĂ€idatud alloleval ekraanipildil:

MÀÀrake see domeen failis resource-manifests/istio/security/auth-policy.yaml ():
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: auth-policy
spec:
targets:
- name: sa-web-app
- name: sa-feedback
origins:
- jwt:
issuer: "https://{YOUR_DOMAIN}/"
jwksUri: "https://{YOUR_DOMAIN}/.well-known/jwks.json"
principalBinding: USE_ORIGIN Selle ressursiga, Pilot (ĂŒks kolmest pĂ”hilisest Control Plane'i komponendist Istios â toimetaja mĂ€rkus.) konfigureerib Envoy'de autentimise pĂ€ringute jaoks enne nende suunamist teenustele: sa-web-app ja sa-feedback. Samal ajal ei rakendata konfiguratsiooni teenuse Envoy'dele sa-frontend, vĂ”imaldades meil jĂ€tta frontend autentimata. Poliitika rakendamiseks kĂ€ivitage kĂ€sk:
$ kubectl apply -f resource-manifests/istio/security/auth-policy.yaml
policy.authentication.istio.io âauth-policyâ createdTagasi minge lehele ja tehke pĂ€ring â nĂ€ete, et see lĂ”ppeb staatusega 401 Unauthorized. NĂŒĂŒd suuname frontendi kasutajad autentimisele Auth0 kaudu.
PĂ€ringute autentimine Auth0-ga
Kasutaja pÀringute autentimiseks peate looma API Auth0-s, mis esindab autentitud teenuseid (reviews, details ja ratings). API loomiseks minge Auth0 Portal > APIs > Create API ja tÀitke vorm:

Oluline teave siin on Tuvustus, mida hiljem skriptis kasutame. Kirjutame selle endale nii:
- Si audience: {YOUR_AUDIENCE}
Vajalikud ĂŒksikasjad asuvad Auth0 Portaalis jaotises Rakendused â vali Testi rakendus (loodud automaatselt koos API-ga).
Siin kirjutame:
- Domeen: {YOUR_DOMAIN}
- Klient ID: {YOUR_CLIENT_ID}
Kerige alla Testi rakendus tekstivÀlja Lubatud Callback URL-id (lubatud URL-id callback'ile), kus mÀÀrame URL-i, kuhu kutse saadetakse pÀrast autentimise lÔppemist. Meie juhul on see:
http://{EXTERNAL_IP}/callbackJa jaoks Lubatud Logout URL-id (lubatud URL-id vÀljaregistreerimiseks) lisame:
http://{EXTERNAL_IP}/logoutLiigume frontendi juurde.
Frontendi vÀrskendamine
LĂŒlituge harule auth0 reposiitiumist [istio-mastery]. Selles harus on frontendi kood muudetud nii, et see suunab kasutajad Auth0-sse autentimiseks ja kasutab JWT-mĂ€rgendit, et teha pĂ€ringuid teistele teenustele. See on realiseeritud jĂ€rgmiselt ():
analyzeSentence() {
fetch('/sentiment', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${auth.getAccessToken()}` // Access Token
},
body: JSON.stringify({ sentence: this.textField.getValue() })
})
.then(response => response.json())
.then(data => this.setState(data));
} Et viia front end Tenant'i andmetele Auth0-s, avage sa-frontend/src/services/Auth.js ja asendage selles vÀÀrtused, mille me ĂŒlal registreerisime ():
const Config = {
clientID: '{YOUR_CLIENT_ID}',
domain:'{YOUR_DOMAIN}',
audience: '{YOUR_AUDIENCE}',
ingressIP: '{EXTERNAL_IP}' // Kasutatakse ĂŒmber suunamiseks pĂ€rast autentimist
}Rakendus on valmis. TÀiendage oma Docker ID-d allpool toodud kÀskudes, kui ehitate ja juurutate tehtud muudatusi:
$ docker build -f sa-frontend/Dockerfile
-t $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0
sa-frontend
$ docker push $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0
$ kubectl set image deployment/sa-frontend
sa-frontend=$DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0Proovige rakendust! Teid suunatakse Auth0-le, kus peate sisse logima (vÔi registreerima), pÀrast mida saadetakse teid tagasi lehele, millelt tehakse juba autentitud pÀringud. Kui proovite esimeses osas mainitud kÀsklusi koos curl'iga, saate koodi 401 Status Code, mis nÀitab, et pÀring ei ole autoriseeritud.
Liigume jĂ€rgmise sammuga â autoriseerime pĂ€ringud.
Autoriseerimine Auth0-ga
Autentimine vÔimaldab meil mÔista, kes kasutaja on, kuid selleks, et teada saada, millele tal on juurdepÀÀs, on vajalik autoriseerimine. Istio pakub ka selleks tööriistu.
NĂ€iteks loome kaks kasutajagruppi (vt schemat allpool):
- Kasutajad (kasutajad) â juurdepÀÀs ainult SA-WebApp ja SA-Frontend teenustele;
- Moderaatorid (moderaatorid) â juurdepÀÀs kĂ”igile kolmele teenusele.

Autoriseerimise kontseptsioon
Nende gruppide loomiseks kasutame Auth0 Authorization laiendust ning Istio kaudu anname neile erinevad juurdepÀÀsutasemed.
Auth0 Authorization seadistamine ja konfigureerimine
Auth0 portaalis varuge aega laiendustele (Laiendid) ja installige Auth0 Authorization. PĂ€rast installimist minge Authorization Extension, ja sealt minge tenant'i konfigureerimise juurde, klikkides paremal ĂŒlal ja valides vastava menĂŒĂŒvaliku (Konfigureerimine). Aktiveerige grupid (Grupid) ja vajutage reeglite avaldamise nuppu (Avalda reegel).

Grupide loomine
Authorization Extension'is minge Groups ja looge grupp Moderaatorid. Kuna kÀsitleme kÔiki autentitud kasutajaid kui tavakasutajaid, ei ole vajadust luua neile tÀiendavat gruppi.
Valige grupp Moderaatorid, klikkige Lisa liikmeid, lisage oma pÔhikonto. JÀtke mÔned kasutajad ilma igasuguse grupita, et veenduda, et nende juurdepÀÀs on keelatud. (Uusi kasutajaid saab luua kÀsitsi lÀbi Auth0 Portaal > Kasutajad > Loo kasutaja.)
Lisage Group Claim Access Tokenisse
Kasutajad on lisatud gruppidesse, kuid see teave peab olema peegeldatud ka juurdepÀÀsu tokenites. Et vastata OpenID Connect nÔuetele ja samal ajal tagastada vajalikud grupid, vajab token oma . See rakendatakse lÀbi Auth0 reeglite.
Reegli loomiseks minge Auth0 Portaalis Reeglid, klikkige Loo reegel ja valige tĂŒhjad reeglid mallidest.

Kopeerige allolev kood ja salvestage see uue reeglina Lisage grupi claim ():
function (user, context, callback) {
context.accessToken['https://sa.io/group'] = user.groups[0];
return callback(null, user, context);
}MÀrkus: see kood vÔtab kasutaja esimese grupi, mis on mÀÀratletud Authorization Extensionis, ja lisab selle access-tokenisse kohandatud claim'ina (oma nimerruumis, nagu nÔuab Auth0).
Naaske lehele Reeglid ja kontrollige, et teil on kaks reeglit, kirja pandud jÀrgmises jÀrjekorras:
- auth0-authorization-extension
- Lisage grupi claim
JĂ€rjekord on oluline, kuna grupi vĂ€li saadakse asĂŒnkroonselt reegliga auth0-authorization-extension ja lisatakse see seejĂ€rel nĂ”udena teise reegliga. Tulemuseks on jĂ€rgmine access-token:
{
"https://sa.io/group": "Moderaatorid",
"iss": "https://sentiment-analysis.eu.auth0.com/",
"sub": "google-oauth2|196405271625531691872"
// [lĂŒhendatud selguse huvides]
} NĂŒĂŒd tuleb seadistada Envoy-proksi, et kontrollida kasutaja juurdepÀÀsu, mille jaoks rĂŒhm saadakse claim-st (https://sa.io/group) tagastatavas access-tokenis. See on teema jĂ€rgmises jaos artiklis.
Autentimise konfigureerimine Istios
Kuna autentimine peab töötama, tuleb RBAC Istios lubada. Selleks kasutame jÀrgmist konfiguratsiooni:
apiVersion: "rbac.istio.io/v1alpha1"
kind: RbacConfig
metadata:
name: default
spec:
mode: 'ON_WITH_INCLUSION' # 1
inclusion:
services: # 2
- "sa-frontend.default.svc.cluster.local"
- "sa-web-app.default.svc.cluster.local"
- "sa-feedback.default.svc.cluster.local" Selgitused:
- 1 â lubame RBAC-i ainult teenuste ja nimede ruumide jaoks, mis on loetletud vĂ€ljaandes
Inclusion; - 2 â loetleme oma teenuste nimekirja.
Rakendame konfiguratsiooni jÀrgmise kÀsuga:
$ kubectl apply -f resource-manifests/istio/security/enable-rbac.yaml
rbacconfig.rbac.istio.io/default created NĂŒĂŒd nĂ”uavad kĂ”ik teenused juurdepÀÀsu haldamist rollide pĂ”hjal (Role-Based Access Control). TeisisĂ”nu, juurdepÀÀs kĂ”igile teenustele on keelatud ja viib vastuseni RBAC: access denied. NĂŒĂŒd lubame juurdepÀÀsu volitatud kasutajatele.
Tavakasutajate juurdepÀÀsu konfiguratsioon
KÔigil kasutajatel peab olema ligipÀÀs SA-Frontend ja SA-WebApp teenustele. Selle rakendamine toimub jÀrgmiste Istio ressursside abil:
- ServiceRole â mÀÀratleb Ă”igused, mis kasutajal on;
- ServiceRoleBinding â mÀÀratleb, kellele see ServiceRole kehtib.
Tavalistele kasutajatele lubame ligipÀÀsu teatud teenustele ():
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: regular-user
namespace: default
spec:
rules:
- services:
- "sa-frontend.default.svc.cluster.local"
- "sa-web-app.default.svc.cluster.local"
paths: ["*"]
methods: ["*"] Ja lĂ€bi regular-user-binding rakendame ServiceRole kĂ”igile lehe kĂŒlastajatele ():
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: regular-user-binding
namespace: default
spec:
subjects:
- user: "*"
roleRef:
kind: ServiceRole
name: "regular-user"Kas âkĂ”ik kasutajadâ tĂ€hendab, et ka mitteautentitud kasutajad saavad SA WebAppâile ligipÀÀsu? Ei, poliitika kontrollib JWT-tokeni kehtivust.
Rakendame konfiguratsioone:
$ kubectl apply -f resource-manifests/istio/security/user-role.yaml
servicerole.rbac.istio.io/regular-user created
servicerolebinding.rbac.istio.io/regular-user-binding createdLigipÀÀsu konfiguratsioon moderaatoritele
Moderaatorite jaoks soovime lubada ligipÀÀsu kÔigile teenustele ():
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: mod-user
namespace: default
spec:
rules:
- services: ["*"]
paths: ["*"]
methods: ["*"] Kuid me soovime neid Ôigusi ainult nende kasutajate jaoks, kelle access-token'is on claim https://sa.io/group vÀÀrtusega Moderaatorid ():
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: mod-user-binding
namespace: default
spec:
subjects:
- properties:
request.auth.claims[https://sa.io/group]: "Moderators"
roleRef:
kind: ServiceRole
name: "mod-user" Rakendame konfiguratsioone:
$ kubectl apply -f resource-manifests/istio/security/mod-role.yaml
servicerole.rbac.istio.io/mod-user created
servicerolebinding.rbac.istio.io/mod-user-binding createdEnvoyâdes esineva vahemĂ€lu tĂ”ttu vĂ”ib autoriseerimisreeglite jĂ”ustumine vĂ”tta paar minutit. PĂ€rast seda saate veenduda, et kasutajatel ja moderaatoritel on erinevad ligipÀÀsutasemed.
JĂ€reldus selle osa kohta
Aga tÔsiselt: kas olete kuskil nÀinud lihtsamat, pingutuseta, skaleeritavat ja turvalist lÀhenemist autentimisele ja autoriseerimisele?
Vajame lihtsalt kolme Istio ressurssi (RbacConfig, ServiceRole ja ServiceRoleBinding), et saavutada tĂ€pne kontroll lĂ”ppkasutajate autentimise ja autoriseerimise ĂŒle teenustele pÀÀsemiseks.
Lisaks oleme need probleemid oma teenustelt vĂ€lja viinud envoyâdesse, saavutades:
- koodistandardeid, kus vÔivad esineda turvaprobleemid ja vead;
- vĂ€henenud vĂ”imalusi rumalaks olukordadeks, kus ĂŒks endpoint on vĂ€ljastpoolt ligipÀÀsetav ja on unustatud sellest teavitada;
- vajadus uuendada kÔiki teenuseid igakord uue rolli vÔi Ôiguse lisamisel;
- tagada, et uued teenused jÀÀvad lihtsateks, turvaliseks ja kiireks.
KokkuvÔte
Istio vĂ”imaldab meeskondadel keskenduda oma ressursid Ă€ri kĂ”ige olulisematele ĂŒlesannetele, lisamata teenustele lisakulusid, tagades nende staatuse 'mikroteenused'.
Artikkel (kolmes osas) pakkus pÔhiteadmisi ja valmis praktiseerimiseks mÔeldud juhiseid Istio kasutuselevÔtmiseks reaalsetes projektides.
P.S. tÔlkija mÀrkused
Lugege ka meie blogist:
- âTagasi mikroteenuste juurde koos Istioâgaâ: , ;
- «»;
- «».
Allikas: habr.com
