Tagasi teenustesse koos Istio’ga. Osa 3

Tagasi teenustesse koos Istio’ga. Osa 3

MĂ€rkus tĂ”lke kohta.: Esimene osa selle seeria keskendus Istio vĂ”imaluste tutvustamisele ja nende demonstreerimisele toimimas, teine — peene seadistamise suunamise ja vĂ”rgu liikluse juhtimise osas. NĂŒĂŒd rÀÀgime turvalisusest: demonstreerimiseks kasutab autor sellega seotud pĂ”hifunktsioone identity-teenuse Auth0, kuid selle pĂ”himĂ”tete alusel saab seadistada ka teisi pakkujaid.

Oleme seadistanud Kubernetes klastrit, kuhu oleme paiknenud Istio ja nĂ€idis mikroteenuste rakenduse Sentiment Analysis, — sellega demonstreeriti Istio vĂ”imalusi.

Istio abil suutsime hoida teenuste vĂ€ikest suurust, kuna need ei vaja selliste „kihtide“ nagu korduskatsetused (Retries), ajaĂŒlesanded (Timeouts), automaatsed katkestajad (Circuit Breakers), jĂ€lgimine (Tracing), monitooring (Monitoring) rakendamist. Lisaks kasutasime edasijĂ”udnud testimise ja kasutuselevĂ”tu tehnikaid: A/B-testimist, peegeldamist ja kanarbiku vĂ€ljalaskmist.

Tagasi teenustesse koos Istio’ga. Osa 3

Uues materjalis uurime viimaseid kihte teel Ă€ri vÀÀrtuseni: autentimist ja autoriseerimist — ja Istios on see puhas rÔÔm!

Autentimine ja autoriseerimine Istios

Ma poleks kunagi uskunud, et mind inspireerib autentimine ja autoriseerimine. Mida tehniliselt vÔib Istio pakkuda, et muuta need teemad huvitavaks ja isegi nii, et nad inspireeriksid ka teid?

Vastus on lihtne: Istio kannab nende vÔimaluste vastutuse teie teenustelt proksile Envoy. Aja jooksul, mil pÀringud jÔuavad teenusteni, on need juba autentitud ja autoriseeritud, nii et teil jÀÀb lihtsalt kirjutada kasulik Àrikood.

Kostab hÀsti? Vaatame siis lÀhemalt!

Autentimine Auth0-ga

Identiteedi ja ligipÀÀsu haldamiseks kasutame Auth0, millel on prooviversioon, mis on intuitiivne kasutada ja mis mulle lihtsalt meeldib. Siiski, samu pÔhimÔtteid saab rakendada ka mistahes teise OpenID Connect rakenduse: KeyCloak, IdentityServer ja paljusid teisi.

Esialgu minge Auth0 Portaal oma kontoga, looge tenant (tenant — "ĂŒĂŒrnik", loogiline isolatsioonĂŒksus, vt lĂ€hemalt dokumentatsioon — toimetaja mĂ€rkus) ja minge Rakendused > Vaikimisi rakendus, valides Domeen, nagu on kujutatud alloleval ekraanipildil:

Tagasi teenustesse koos Istio’ga. Osa 3

MÀÀrake see domeen failis resource-manifests/istio/security/auth-policy.yaml (allikas):

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

Sellise ressursiga seadistab Pilot (ĂŒks kolmest pĂ”hi komponentidest Control Plane'is Istios — tĂ”lge.) Envoy'ide autentimise seadistamine enne nende suunamist teenustele: sa-web-app ja sa-feedback. Samal ajal ei rakendata seadistust teenuse Envoy'idele 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" loodud

Naaske lehele ja tehke pĂ€ring — nĂ€ete, et see lĂ”ppeb staatusega 401 Unauthorized. NĂŒĂŒd suuname frontendi kasutajad autentimisele Auth0-ga.

PĂ€ringute autentimine Auth0-ga

Kasutaja pÀringute autentimiseks peate looma API Auth0-s, mis esindab autentitud teenuseid (reviews, details ja ratings). API loomise jaoks minge siia: Auth0 Portal > APIs > Create API ja tÀitke vorm:

Tagasi teenustesse koos Istio’ga. Osa 3

Siin on oluline info Identifier, mida hiljem oma skriptis kasutame. Kirjutame selle endale ĂŒles:

  • Audience: {YOUR_AUDIENCE}

KĂ”ik vajalikud detailid asuvad Auth0 Portalis jaotises Applications — valige Test Application (loodud automaatselt koos API-ga).

Siin kirjutame:

  • Domeen: {YOUR_DOMAIN}
  • Client Id: {YOUR_CLIENT_ID}

Kerige alla Test Application kuni tekstivÀljani Allowed Callback URLs (lubatud URL-id callback'ide jaoks), kuhu peame mÀÀrama URL-i, kuhu kutse saadetakse pÀrast autentimise lÔpetamist. Meie puhul on see:

http://{EXTERNAL_IP}/callback

Ja Allowed Logout URLs (lubatud URL-id vÀljalogimiseks) lisage:

http://{EXTERNAL_IP}/logout

Liigume frontendi juurde.

Frontend'i vÀrskendamine

LĂŒlituge harule auth0 repositsioon [istio-mastery]. KĂ€esolevas harus on frontend kood muudetud, et suunata kasutajad Auth0-sse autentimiseks ja kasutada JWT-tokenit pĂ€ringutesse teiste teenuste poole. Viimane on realiseeritud jĂ€rgmiselt (App.js):

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));
}

Kuna frontend muuta autentimise andmete kasutamiseks Auth0-s, avage sa-frontend/src/services/Auth.js ja asendage seal vÀÀrtused, mille me varem kirja panime (Auth.js):

const Config = {
    clientID: '{YOUR_CLIENT_ID}',
    domain:'{YOUR_DOMAIN}',
    audience: '{YOUR_AUDIENCE}',
    ingressIP: '{EXTERNAL_IP}' // Kasutatakse autentimise jÀrel suunamiseks
}

Rakendus on valmis. Palun sisestage oma Docker ID allpool olevates kÀskudes, kui koostate ja juurutate 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-auth0

Proovige rakendust! Teid suunatakse Auth0-le, kus peate sisse logima (vĂ”i registreerima), seejĂ€rel saadetakse teid tagasi lehele, kust tehakse juba autentitud pĂ€ringud. Kui proovite alguses mainitud kĂ€sklusi curl’iga, saate koodi 401 Status Code, mis nĂ€itab, et pĂ€ring ei ole autentitud.

Teeme jĂ€rgmise sammu — autentime pĂ€ringud.

Autentimine Auth0-ga

Autentimine vÔimaldab meil mÔista, kes on kasutaja, kuid et teada saada, millistele ressurssidele tal on juurdepÀÀs, on vajalik autoriseerimine. Istio pakub ka selleks tööriistu.

NĂ€iteks loome kaks kasutajarĂŒhma (vt alloleval skeemil):

  • Kasutajad (users) — kellel on juurdepÀÀs ainult SA-WebApp ja SA-Frontend teenustele;
  • Moderaatorid (moderators) — kellel on juurdepÀÀs kĂ”igile kolmele teenusele.

Tagasi teenustesse koos Istio’ga. Osa 3
Autoriseerimise kontseptsioon

Nende rĂŒhmade loomiseks kasutame Auth0 Autoriseerimise laiendust ning Istio kaudu anname neile erinevad juurdepÀÀsu tasemed.

Auth0 Autoriseerimise installimine ja konfigureerimine

Auth0 portaalis minge laienduste juurde (Extensions) ja installige Auth0 Autorization. PĂ€rast installimist minge Autoriseerimise laiendusse, seejĂ€rel paremal ĂŒlal nupule klĂ”psates valige vastav menĂŒĂŒvalik (Configuration). Aktiveerige rĂŒhmad (Groups) ja klĂ”psake reegli avaldamise nuppu (Publish rule).

Tagasi teenustesse koos Istio’ga. Osa 3

RĂŒhmade loomine

Autoriseerimise laienduses minge RĂŒhmad ja looge rĂŒhm ModeraatoridKuna me kĂ€sitleme kĂ”iki autentitud kasutajaid tavakasutajatena, ei ole vajalik nende jaoks lisagruppide loomine.

Valige grupp Moderaatorid, vajutage Lisa liikmed, lisage oma peamine konto. JÀtke mÔned kasutajad ilma igasuguste gruppideta, et veenduda, et nende juurdepÀÀs on keelatud. (Uusi kasutajaid saab luua kÀsitsi lÀbi Auth0 Portaal > Kasutajad > Lisa kasutaja.)

Lisage grupi vÀide juurdepÀÀsulubadusse

Kasutajad on gruppidesse lisatud, kuid see teave peab olema kajastatud ka juurdepÀÀsulubades. OpenID Connect'ile vastamiseks ja samal ajal vajalikke hulki tagastamiseks, peab lubadal olema selle kohandatud vÀide. Seda teostatakse lÀbi Auth0 reeglite.

Reegli loomiseks minge Auth0 portaalis Reeglid, vajutage Loo reegel ja valige tĂŒhjad reeglid mallidest.

Tagasi teenustesse koos Istio’ga. Osa 3

Kopeerige allolev kood ja salvestage see uue reegli alla Lisa grupi vÀide (namespacedGroup.js):

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ÀÀratud autoriseerimise laienduses, ja lisab selle juurdepÀÀsulubadesse kui kohandatud vÀite (oma nimeruumi all, nagu nÔuab Auth0).

Pöörduge tagasi lehe Reeglid ja kontrollige, et teil on kaks reeglit, mis on kirjutatud jÀrgmises jÀrjekorras:

  • auth0-autoriseerimise-laiendus
  • Lisa grupi vĂ€ide

JĂ€rjekord on oluline, kuna grupi vĂ€li saab reegli asĂŒnkroonselt auth0-autoriseerimise-laiendus ja seejĂ€rel lisatakse see teise reegli kui vĂ€ide. Selle tulemuseks on selline juurdepÀÀsuluba:

{
 "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 vaheproksi kasutaja juurdepÀÀsu kontrollimiseks, mille jaoks grupp tĂ”mmatakse vĂ€lja vĂ€itest (https://sa.io/group) tagastatud juurdepÀÀsulubes. See on teema jĂ€rgmises jaotises.

Autoriseerimise seadistamine Istios

Et autoriseerimine töötaks, tuleb Istios RBAC sisse lĂŒlitada. Selleks kasutame jĂ€rgmist seadistust:

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 — lĂŒlitame RBAC sisse ainult teenustele ja nimedele, mis on loetletud vĂ€ites Inclusion;
  • 2 — loetleme meie teenuste nimekirja.

Rakendame seadistuse sellise kÀsuga:

$ kubectl apply -f resource-manifests/istio/security/enable-rbac.yaml
rbacconfig.rbac.istio.io/default created

NĂŒĂŒd vajavad kĂ”ik teenused rollipĂ”hist juurdepÀÀsu haldust (Role-Based Access Control). TeisisĂ”nu, juurdepÀÀs kĂ”igile teenustele on keelatud ja toob kaasa vastuse RBAC: juurdepÀÀs keelatud. NĂŒĂŒd lubame juurdepÀÀsu autoriseeritud kasutajatele.

Juhtimiskonfiguratsioon tavakasutajatele

KÔigil kasutajatel peab olema juurdepÀÀs teenustele SA-Frontend ja SA-WebApp. See teostatakse jÀrgmiste Istio ressursside abil:

  • ServiceRole — mÀÀratleb Ă”igused, mis kasutajal on;
  • ServiceRoleBinding — mÀÀratleb, kellele see ServiceRole kuulub.

Tavakasutajatele lubame juurdepÀÀsu teatud teenustele (servicerole.yaml):

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 (regular-user-service-role-binding.yaml):

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 autentimata kasutajad saavad juurdepÀÀsu SA WebApp-ile? Ei, poliitika kontrollib JWT-tokeni kehtivust.

Rakendame konfiguratsioonid:

$ kubectl apply -f resource-manifests/istio/security/user-role.yaml
servicerole.rbac.istio.io/regular-user created
servicerolebinding.rbac.istio.io/regular-user-binding created

Juhtimiskonfiguratsioon moderaatoritele

Moderaatoritele soovime lubada juurdepÀÀsu kÔigile teenustele (mod-service-role.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: mod-user
  namespace: default
spec:
  rules:
  - services: ["*"]
    paths: ["*"]
    methods: ["*"]

Kuid me soovime selliseid Ôigusi ainult nendele kasutajatele, kelle access-tokenis on claim https://sa.io/group vÀÀrtusega Moderaatorid (mod-service-role-binding.yaml):

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 konfiguratsioonid:

$ kubectl apply -f resource-manifests/istio/security/mod-role.yaml
servicerole.rbac.istio.io/mod-user created
servicerolebinding.rbac.istio.io/mod-user-binding created

Kuna envoy'des toimuvad vahemÀllu salvestamised, vÔib autoriseerimisreeglite jÔustumiseks kuluda paar minutit. PÀrast seda saate veenduda, et kasutajatel ja moderaatoritel on erinevad juurdepÀÀsutasemed.

KokkuvÔte selle osa kohta

TÔsiselt, kas olete nÀinud kusagil lihtsamat, vaeva nÀgemata, skaleeritavat ja turvalist lÀhenemist autentimisele ja autoriseerimisele?

Vaid ainult kolm Istio ressursi (RbacConfig, ServiceRole ja ServiceRoleBinding) olid vajalikud, et saavutada peen regulatsioon lĂ”ppkasutajate autentimise ja autoriseerimise ĂŒle teenustele.

Lisaks tĂ”ime nende probleemide haldamise meie teenustest vĂ€lja envoy’dele, saavutades:

  • tĂŒĂŒpkoodeksi vĂ€henemise, kus vĂ”ivad esineda turvaprobleemid ja vead;
  • rumalate olukordade vĂ€henemise, kus ĂŒks endpoint oli vĂ€ljastpoolt ligipÀÀsetav ja unustasid sellest teatada;
  • vajaduse elimineerimise, et uuendada kĂ”iki teenuseid iga kord, kui lisatakse uus roll vĂ”i Ă”igus;
  • uute teenuste lihtsuse, turvalisuse ja kiirus.

KokkuvÔte

Istio vÔimaldab meeskondadel keskenduda oma ressursid olulistele Àritegevustele, lisamata teenustele tÀiendavaid kulusid, tuues need tagasi "mikro" staatusesse.

Artikkel (kolmes osas) pakkus pÔhiteadmisi ja valmis praktilisi juhiseid Istio kasutamiseks reaalses projektis.

P.S. tÔlkijalt

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster