Itzuli mikrozerbitzuetara Istio-rekin. 3. zatia

Itzuli mikrozerbitzuetara Istio-rekin. 3. zatia

Ohar. itzul.: Lehenengo zatian serie hau Istioren gaitasunak ezagutzera eta ekintzan erakustera bideratu zen, bigarren β€” bideraketa eta sareko trafikoaren kudeaketa finak. Orain segurtasunari buruz hitz egingo dugu: hari lotutako oinarrizko funtzioak erakusteko, egileak Auth0 identitate zerbitzua erabiltzen du, baina beste hornitzaile batzuk antzera konfigura daitezke.

Kubernetes kluster bat ezarri dugu eta bertan Istio eta adibide mikrozerbitzu aplikazio bat, Sentiment Analysis, zabaldu ditugu Istioren gaitasunak erakusteko.

Istio-rekin, gure zerbitzuak txikiak mantendu ahal izan ditugu, ez dutelako berriro saiakerak, denbora-muga, etengailuak, trazadura, monitorizazioa... bezalako geruzak ezarri behar. Horrez gain, proba eta inplementazio teknika aurreratuak erabili ditugu: A/B testing, ispilua eta canary rollouts.

Itzuli mikrozerbitzuetara Istio-rekin. 3. zatia

Material berrian, negozio-balioaren bidean azken geruzak landuko ditugu: autentifikazioa eta baimena - eta Istio-n benetako plazerra da!

Autentifikazioa eta baimena Istio-n

Inoiz ez nuen sinetsiko autentifikazioan eta baimenean inspiratuko nintzenik. Zer eskain dezake Istio-k teknologiaren ikuspuntutik gai hauek dibertigarriak eta, are gehiago, inspiratzaileak izan daitezen?

Erantzuna erraza da: Istio-k gaitasun horien erantzukizuna zure zerbitzuetatik Envoy proxyra aldatzen du. Eskaerak zerbitzuetara iristen direnerako, dagoeneko autentifikatu eta baimenduta daude, beraz, negoziorako baliagarria den kodea idatzi besterik ez duzu egin behar.

Ondo entzuten da? Ea barrura begirada bat!

Autentifikazioa Auth0-rekin

Identitatearen eta sarbideen kudeaketaren zerbitzari gisa, Auth0 erabiliko dugu, probako bertsioa duena, erabiltzeko intuitiboa eta besterik gabe gustatzen zait. Hala ere, printzipio berdinak beste edozeinetan aplika daitezke OpenID Connect inplementazioak: KeyCloak, IdentityServer eta beste asko.

Lehenik eta behin, joan Auth0 Ataria zure kontuarekin, sortu maizterrak (maizter - "maizter", isolamendu-unitate logikoa, xehetasun gehiagorako, ikus dokumentazioa - gutxi gorabehera. itzul.) eta joan Aplikazioak > Aplikazio lehenetsiaaukeratzen domeinu, beheko pantaila-argazkian erakusten den moduan:

Itzuli mikrozerbitzuetara Istio-rekin. 3. zatia

Zehaztu domeinu hau fitxategian resource-manifests/istio/security/auth-policy.yaml (iturria):

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

Halako baliabide batekin, Pilot (Istioko oinarrizko hiru kontrol-plano osagaietako bat - gutxi gorabehera. itzul.) Envoy-ek konfiguratzen du eskaerak autentifikatzeko zerbitzuetara birbidaltzeko: sa-web-app ΠΈ sa-feedback. Aldi berean, konfigurazioa ez da zerbitzu-Envoys aplikatzen sa-frontend, frontend-a autentifikatu gabe uzteko aukera emanez. Politika aplikatzeko, exekutatu komandoa:

$ kubectl apply -f resource-manifests/istio/security/auth-policy.yaml
policy.authentication.istio.io β€œauth-policy” created

Itzuli orrialdera eta egin eskaera - egoerarekin amaitzen dela ikusiko duzu 401 ez da baimenik. Orain birbidera ditzagun frontend erabiltzaileak Auth0-rekin autentifikatzeko.

Eskaerak autentifikatzea Auth0-rekin

Azken erabiltzaileen eskaerak autentifikatzeko, autentifikatutako zerbitzuak (iritziak, xehetasunak eta balorazioak) irudikatuko dituen API bat sortu behar duzu Auth0-n. API bat sortzeko, joan hona Auth0 Portal > APIak > Sortu APIa eta bete formularioa:

Itzuli mikrozerbitzuetara Istio-rekin. 3. zatia

Hemen informazio garrantzitsua da identifikatzailea, geroago gidoian erabiliko duguna. Idatz dezagun honela:

  • Audience: {YOUR_AUDIENCE}

Behar ditugun gainerako xehetasunak atalean Auth0 atarian daude aplikazioak - hautatu Proba Aplikazioa (APIarekin batera automatikoki sortua).

Hemen idatziko dugu:

  • domeinu: {YOUR_DOMAIN}
  • Bezeroaren ID: {YOUR_CLIENT_ID}

Joan zaitez Proba Aplikazioa testu eremura Baimendutako deiak itzultzeko URLak (deialdirako ebatzitako URLak), zeinetan autentifikazioa amaitu ondoren deia bidali behar den URLa zehazten dugu. Gure kasuan hau da:

http://{EXTERNAL_IP}/callback

Eta horretarako Baimendutako saioa amaitzeko URLak (saioa amaitzeko baimendutako URLak) gehitu:

http://{EXTERNAL_IP}/logout

Goazen frontend-era.

Frontend eguneratzea

Adarra aldatu auth0 biltegia [istio-mastery]. Adar honetan, frontend kodea aldatzen da erabiltzaileak Auth0-ra birbideratzeko autentifikaziorako eta JWT tokena beste zerbitzu batzuetarako eskaeretan erabiltzeko. Azken hau honela ezartzen da (Aplikazioa.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));
}

Frontend-a aldatzeko maizterraren datuak Auth0-n erabiltzeko, ireki sa-frontend/src/services/Auth.js eta ordezkatu bertan goian idatzi ditugun balioak (Auth.js):

const Config = {
    clientID: '{YOUR_CLIENT_ID}',
    domain:'{YOUR_DOMAIN}',
    audience: '{YOUR_AUDIENCE}',
    ingressIP: '{EXTERNAL_IP}' // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π° послС Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
}

Aplikazioa prest dago. Zehaztu zure Docker IDa beheko komandoetan egindako aldaketak eraikitzean eta zabaltzean:

$ 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

Probatu aplikazioa! Auth0-ra birbideratuko zaituzte, non saioa hasi (edo erregistratu) behar duzun, eta ondoren, dagoeneko autentifikatu diren eskaerak egingo diren orrialdera itzuliko zara. Artikuluaren lehen zatietan aipatutako komandoak kizkurrekin probatzen badituzu, kodea lortuko duzu 401 Egoera-kodea, eskaera baimenduta ez dagoela adieraziz.

Eman dezagun hurrengo urratsa: baimendu eskaerak.

Baimena Auth0

Autentifikazioari esker, erabiltzaile bat nor den uler dezakegu, baina baimena behar da zertarako sarbidea duen jakiteko. Istiok horretarako ere tresnak eskaintzen ditu.

Adibide gisa, sor ditzagun bi erabiltzaile talde (ikus beheko diagrama):

  • Kide (erabiltzaileak) β€” SA-WebApp eta SA-Frontend zerbitzuetarako soilik sarbidearekin;
  • Moderatzaileak (moderatzaileak) β€” Hiru zerbitzuetarako sarbidearekin.

Itzuli mikrozerbitzuetara Istio-rekin. 3. zatia
Baimenaren kontzeptua

Talde hauek sortzeko, Auth0 Authorization luzapena erabiliko dugu eta Istio erabiliko dugu sarbide maila desberdinak emateko.

Auth0 Baimenaren instalazioa eta konfigurazioa

Auth0 atarian, joan luzapenetara (Extensions) eta instalatu Auth0 Baimena. Instalatu ondoren, joan hona Baimenaren luzapena, eta hor - maizterraren konfiguraziora, goiko eskuinaldean klik eginez eta menu-aukera egokia hautatuz (Konfigurazioa). Taldeak aktibatu (Taldeak) eta egin klik argitaratu araua botoian (Argitaratu araua).

Itzuli mikrozerbitzuetara Istio-rekin. 3. zatia

Taldeak sortzea

Baimenaren luzapena atalean, joan hona Taldeak eta talde bat sortu Moderatzaileak. Autentifikatutako erabiltzaile guztiak ohiko erabiltzaile gisa tratatuko ditugunez, ez dago talde gehigarririk sortu behar.

Aukeratu talde bat Moderatzaileak, Sakatu Gehitu kideak, gehitu zure kontu nagusia. Utzi erabiltzaile batzuk inolako talderik gabe sarbidea ukatzen zaiela ziurtatzeko. (Erabiltzaile berriak eskuz sor daitezke Auth0 Portal > Erabiltzaileak > Sortu erabiltzailea.)

Gehitu Taldearen Erreklamazioa Sarbide Token-era

Erabiltzaileak taldeetara gehitu dira, baina informazio hori sarbide-tokenetan ere islatu behar da. OpenID Connect-a betetzeko eta, aldi berean, behar ditugun taldeak itzultzeko, tokenak berea gehitu beharko du erreklamazio pertsonalizatua. Auth0 arauen bidez ezarri da.

Arau bat sortzeko, joan Auth0 Portalera Arauak, Sakatu Sortu araua eta hautatu txantiloietatik arau huts bat.

Itzuli mikrozerbitzuetara Istio-rekin. 3. zatia

Kopiatu beheko kodea eta gorde arau berri gisa Gehitu taldeko erreklamazioa (namespacedGroup.js):

function (user, context, callback) {
    context.accessToken['https://sa.io/group'] = user.groups[0];
    return callback(null, user, context);
}

Kontuan izan: Kode honek Authorization Extensionean definitutako lehen erabiltzaile-taldea hartzen du eta sarbide-tokenari gehitzen dio erreklamazio pertsonalizatu gisa (bere izen-espaziopean, Auth0-k eskatzen duen moduan).

Itzuli orrialdera Arauak eta egiaztatu bi arau dituzula ordena honetan idatzita:

  • auth0-authorization-extension
  • Gehitu taldeko erreklamazioa

Ordena garrantzitsua da taldeko eremuak araua modu asinkronoan jasotzen duelako auth0-authorization-extension eta horren ondoren bigarren arauaren erreklamazio gisa gehitzen da. Emaitza honelako sarbide-token bat da:

{
 "https://sa.io/group": "Moderators",
 "iss": "https://sentiment-analysis.eu.auth0.com/",
 "sub": "google-oauth2|196405271625531691872"
 // [сокращСно для наглядности]
}

Orain Envoy proxy-a konfiguratu behar duzu erabiltzaileen sarbidea egiaztatzeko, eta horretarako taldea erreklamaziotik aterako da (https://sa.io/group) itzulitako sarbide-tokenean. Hau da artikuluaren hurrengo atalaren gaia.

Baimen konfigurazioa Istio-n

Baimenak funtziona dezan, Istiorako RBAC gaitu behar duzu. Horretarako, konfigurazio hau erabiliko dugu:

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" 

Azalpena:

  • 1 β€” gaitu RBAC eremuan zerrendatutako zerbitzu eta izen-espazioetarako soilik Inclusion;
  • 2 β€” gure zerbitzuen zerrenda zerrendatzen dugu.

Aplikatu dezagun konfigurazioa komando honekin:

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

Zerbitzu guztiek orain roletan oinarritutako sarbide-kontrola behar dute. Beste era batera esanda, zerbitzu guztietarako sarbidea debekatuta dago eta erantzuna emango du RBAC: access denied. Orain baimendu diezaiegun erabiltzaile baimenduei sarbidea.

Erabiltzaile arruntentzako sarbide-konfigurazioa

Erabiltzaile guztiek SA-Frontend eta SA-WebApp zerbitzuetarako sarbidea izan behar dute. Istio baliabide hauek erabiliz ezarri da:

  • Zerbitzu Rol β€” erabiltzaileak dituen eskubideak zehazten ditu;
  • ServiceRoleBinding β€” Zerbitzu-Rol hau norena den zehazten du.

Erabiltzaile arruntei zenbait zerbitzutarako sarbidea baimenduko diegu (zerbitzu rola.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: ["*"]

Eta ondoren regular-user-binding aplikatu ServiceRole orrialdeko bisitari guztiei (ohiko-erabiltzaile-zerbitzua-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"

"Erabiltzaile guztiek" esan nahi al dute autentifikatu gabeko erabiltzaileek ere SA WebApp-erako sarbidea izango dutela? Ez, politikak JWT tokenaren baliozkotasuna egiaztatuko du.

Aplikatu ditzagun konfigurazioak:

$ 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

Moderatzaileentzako sarbide-konfigurazioa

Moderatzaileentzat, zerbitzu guztietarako sarbidea gaitu nahi dugu (mod-service-role.yaml):

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

Baina eskubide horiek soilik nahi ditugu sarbide-tokenak erreklamazioa duten erabiltzaileentzat https://sa.io/group esanahiarekin Moderators (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" 

Aplikatu ditzagun konfigurazioak:

$ 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

Envoys-en cachean gordetzea dela eta, baliteke minutu pare bat behar izatea baimen-arauak indarrean jartzeko. Ondoren, erabiltzaileek eta moderatzaileek sarbide-maila desberdinak dituztela ziurtatu dezakezu.

Atal honi buruzko ondorioa

Egia esan, ikusi al duzu inoiz autentifikaziorako eta baimentzeko ikuspegi sinpleago, esfortzurik gabeko, eskalagarri eta seguruagorik?

Istio-ren hiru baliabide baino ez ziren behar (RbacConfig, ServiceRole eta ServiceRoleBinding) autentifikazioaren eta azken erabiltzaileen zerbitzuetarako sarbidearen gaineko kontrol zehatza lortzeko.

Horrez gain, gure ordezkari zerbitzuetatik gai hauek zaindu ditugu, eta lortu dugu:

  • segurtasun-arazoak eta akatsak izan ditzakeen kode generiko kopurua murriztea;
  • amaierako puntu bat kanpotik irisgarria izan eta horren berri ematea ahaztu den egoera ergelen kopurua murriztea;
  • rol edo eskubide berri bat gehitzen den bakoitzean zerbitzu guztiak eguneratzeko beharra ezabatzea;
  • zerbitzu berriak sinpleak, seguruak eta azkarrak izaten jarraitzen dutela.

Irteera

Istio-k taldeei beren baliabideak negozio-zeregin kritikoetara bideratzeko aukera ematen die zerbitzuei gainkostuak gehitu gabe, mikro egoerara itzuliz.

Artikuluak (hiru ataletan) oinarrizko ezagutzak eta prest egindako argibide praktikoak eskaintzen zituen Istiorekin proiektu errealetan hasteko.

PS itzultzailetik

Irakurri ere gure blogean:

Iturria: www.habr.com

Gehitu iruzkin berria