Balik sa microservices kauban si Istio. Bahin 3

Balik sa microservices kauban si Istio. Bahin 3

Nota. transl.: Una nga bahin kini nga serye gigahin aron mahibal-an ang mga kapabilidad sa Istio ug ipakita kini sa aksyon, ikaduha β€” maayong pagkatul-id nga ruta ug pagdumala sa trapiko sa network. Karon maghisgot kami bahin sa seguridad: aron ipakita ang sukaranan nga mga gimbuhaton nga may kalabotan niini, gigamit sa tagsulat ang serbisyo sa pagkakakilanlan sa Auth0, apan ang ubang mga taghatag mahimong ma-configure sa parehas nga paagi.

Nag-set up mi og Kubernetes cluster diin among gi-deploy ang Istio ug usa ka pananglitan nga microservice application, Sentiment Analysis, aron ipakita ang mga kapabilidad ni Istio.

Uban sa Istio, nahimo namon nga gamay ang among mga serbisyo tungod kay dili nila kinahanglan nga ipatuman ang mga layer sama sa Retries, Timeouts, Circuit Breakers, Tracing, Monitoring. . Dugang pa, migamit kami ug advanced testing ug deployment techniques: A/B testing, mirroring ug canary rollouts.

Balik sa microservices kauban si Istio. Bahin 3

Sa bag-ong materyal, atong atubangon ang katapusang mga lut-od sa dalan sa bili sa negosyo: pag-authenticate ug pagtugot - ug sa Istio kini usa ka tinuod nga kalipay!

Authentication ug pagtugot sa Istio

Wala gyud ko magtuo nga madasig ko sa authentication ug authorization. Unsa ang ikatanyag ni Istio gikan sa panan-aw sa teknolohiya aron mahimo kining mga hilisgutan nga makalingaw, ug labi pa, aron madasig ka?

Ang tubag yano ra: Gibalhin ni Istio ang responsibilidad alang sa kini nga mga kapabilidad gikan sa imong mga serbisyo ngadto sa proxy nga Envoy. Sa panahon nga ang mga hangyo makaabot sa mga serbisyo, sila napamatud-an na ug gitugutan, mao nga ang kinahanglan nimong buhaton mao ang pagsulat sa mapuslanon nga code sa negosyo.

Nindot paminawon? Atong tan-awon ang sulod!

Pagpamatuod gamit ang Auth0

Isip usa ka server alang sa pagdumala sa identidad ug pag-access, among gamiton ang Auth0, nga adunay usa ka pagsulay nga bersyon, intuitive nga gamiton ug ganahan lang ko niini. Bisan pa, ang parehas nga mga prinsipyo mahimong magamit sa bisan unsang uban Mga pagpatuman sa OpenID Connect: KeyCloak, IdentityServer ug uban pa.

Aron makasugod, adto sa Auth0 Portal gamit ang imong account, paghimo usa ka tenant (tenant - β€œtenant”, logical unit of isolation, para sa dugang detalye tan-awa dokumentasyon - gibanabana. transl.) ug adto sa Mga Aplikasyon > Default nga Apppagpili domain, ingon sa gipakita sa screenshot sa ubos:

Balik sa microservices kauban si Istio. Bahin 3

Ipiho kini nga domain sa file resource-manifests/istio/security/auth-policy.yaml (tinubdan):

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

Uban sa ingon nga kapanguhaan, Pilot (usa sa tulo ka batakang Control Plane component sa Istio - gibanabana nga transl.) nag-configure sa Envoy aron mapamatud-an ang mga hangyo sa dili pa ipadala kini sa mga serbisyo: sa-web-app ΠΈ sa-feedback. Sa parehas nga oras, ang pag-configure wala magamit sa serbisyo sa mga Envoy sa-frontend, nga nagtugot kanamo sa pagbiya sa frontend nga dili tinuod. Aron magamit ang Polisiya, pagdagan ang mando:

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

Balik sa panid ug paghimo usa ka hangyo - imong makita nga kini matapos sa kahimtang 401 Dili awtorisado. Karon atong i-redirect ang mga frontend nga tiggamit sa pag-authenticate sa Auth0.

Pag-authenticate sa mga hangyo gamit ang Auth0

Aron mapamatud-an ang mga hangyo sa katapusan nga tiggamit, kinahanglan nimo nga maghimo usa ka API sa Auth0 nga magrepresentar sa gipamatud-an nga mga serbisyo (mga pagsusi, mga detalye, ug mga rating). Aron makahimo og API, adto sa Auth0 Portal > Mga API > Paghimo og API ug sulati ang porma:

Balik sa microservices kauban si Istio. Bahin 3

Ang importante nga impormasyon dinhi mao ilhanan sa, nga atong gamiton sa ulahi sa script. Atong isulat kini sama niini:

  • Tigpaminaw: {YOUR_AUDIENCE}

Ang nahabilin nga mga detalye nga among gikinahanglan nahimutang sa Auth0 Portal sa seksyon aplikasyon β€” pagpili Pagsulay Aplikasyon (awtomatiko nga gihimo kauban ang API).

Dinhi atong isulat:

  • domain: {YOUR_DOMAIN}
  • Client ID: {YOUR_CLIENT_ID}

Pag-scroll sa Pagsulay Aplikasyon sa text field Gitugotan ang mga Callback URL (nasulbad nga mga URL alang sa callback), diin among gipiho ang URL diin ang tawag kinahanglan ipadala human makompleto ang pag-authenticate. Sa among kaso kini mao ang:

http://{EXTERNAL_IP}/callback

Ug alang Gitugotan ang Logout URLs (gitugotan ang mga URL para sa pag-log out) idugang:

http://{EXTERNAL_IP}/logout

Mopadayon ta sa frontend.

Pag-update sa frontend

Pagbalhin sa sanga auth0 tipiganan [istio-mastery]. Niini nga sanga, ang frontend code giusab aron i-redirect ang mga tiggamit sa Auth0 alang sa pag-authenticate ug gamiton ang JWT token sa mga hangyo sa ubang mga serbisyo. Ang ulahi gipatuman sama sa mosunod (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));
}

Aron usbon ang frontend aron magamit ang data sa tenant sa Auth0, ablihi sa-frontend/src/services/Auth.js ug pulihan niini ang mga kantidad nga among gisulat sa ibabaw (Auth.js):

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

Ang aplikasyon andam na. Ipiho ang imong Docker ID sa mga sugo sa ubos sa pagtukod ug pag-deploy sa mga kausaban nga gihimo:

$ 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

Sulayi ang app! I-redirect ka sa Auth0, diin kinahanglan ka nga mag-log in (o magparehistro), pagkahuman ipadala ka balik sa panid diin himuon ang mga gipamatud-an nga mga hangyo. Kung imong sulayan ang mga sugo nga gihisgutan sa unang mga bahin sa artikulo nga adunay curl, makuha nimo ang code 401 Status Code, nagsenyas nga ang hangyo dili awtorisado.

Atong buhaton ang sunod nga lakang - pagtugot sa mga hangyo.

Awtorisasyon sa Auth0

Ang authentication nagtugot kanamo nga masabtan kung kinsa ang usa ka tiggamit, apan ang pagtugot gikinahanglan aron mahibal-an kung unsa ang ilang magamit. Nagtanyag usab ang Istio og mga himan alang niini.

Isip usa ka pananglitan, maghimo kita og duha ka grupo sa tiggamit (tan-awa ang diagram sa ubos):

  • Mga tiggamit (mga tiggamit) β€” nga adunay access lamang sa mga serbisyo sa SA-WebApp ug SA-Frontend;
  • Mga moderator (mga moderator) β€” nga adunay access sa tanan nga tulo ka mga serbisyo.

Balik sa microservices kauban si Istio. Bahin 3
Konsepto sa pagtugot

Aron mahimo kini nga mga grupo, among gamiton ang Auth0 Authorization extension ug gamiton ang Istio aron mahatagan sila sa lainlaing lebel sa pag-access.

Pag-instalar ug pag-configure sa Auth0 Authorization

Sa Auth0 portal, adto sa mga extension (extensions) ug i-install Awtorisasyon 0. Human sa pag-instalar, adto sa Pagdugang sa pagtugot, ug didto - sa configuration sa tenant pinaagi sa pag-klik sa ibabaw nga tuo ug pagpili sa angay nga opsyon sa menu (Pag-ayo). I-aktibo ang mga grupo (Mga Grupo) ug i-klik ang buton sa pagmantala sa lagda (Imantala ang lagda).

Balik sa microservices kauban si Istio. Bahin 3

Paghimo og mga grupo

Sa Authorization Extension adto sa Groups ug paghimo ug grupo Mga Moderador. Tungod kay among tagdon ang tanan nga napamatud-an nga tiggamit ingon nga regular nga tiggamit, dili kinahanglan nga maghimo usa ka dugang nga grupo alang kanila.

Pagpili og grupo Mga Moderador, Press Pagdugang Mga Miyembro, idugang ang imong main account. Biyai ang pipila ka mga tiggamit nga walay bisan unsang grupo aron masiguro nga sila dili maka-access. (Ang mga bag-ong tiggamit mahimong mugnaon nga mano-mano pinaagi sa Auth0 Portal > Users > Create User.)

Idugang ang Group Claim sa Access Token

Ang mga tiggamit gidugang sa mga grupo, apan kini nga kasayuran kinahanglan usab nga makita sa mga token sa pag-access. Aron pagtuman sa OpenID Connect ug sa samang higayon ibalik ang mga grupo nga atong gikinahanglan, ang token kinahanglan nga magdugang sa iyang kaugalingon kostumbre nga pag-angkon. Gipatuman pinaagi sa mga lagda sa Auth0.

Aron makahimo og lagda, adto sa Auth0 Portal sa Rules, Press Paghimo og Lagda ug pagpili og walay sulod nga lagda gikan sa mga templates.

Balik sa microservices kauban si Istio. Bahin 3

Kopyaha ang code sa ubos ug i-save kini isip bag-ong lagda Idugang ang Claim sa Grupo (namespacedGroup.js):

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Kini nga code nagkuha sa unang grupo sa tiggamit nga gihubit sa Authorization Extension ug gidugang kini sa access token isip custom claim (ubos sa namespace niini, sumala sa gikinahanglan sa Auth0).

Balik sa panid Rules ug susiha nga aduna kay duha ka lagda nga gisulat sa mosunod nga han-ay:

  • auth0-authorization-extension
  • Idugang ang Claim sa Grupo

Importante ang han-ay tungod kay ang field sa grupo makadawat sa lagda nga asynchronously auth0-authorization-extension ug human niana kini gidugang ingon nga pag-angkon sa ikaduhang lagda. Ang resulta mao ang access token sama niini:

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

Karon kinahanglan nimo nga i-configure ang Envoy proxy aron masusi ang pag-access sa gumagamit, diin ang grupo makuha gikan sa pag-angkon (https://sa.io/group) sa gibalik nga access token. Kini ang ulohan sa sunod nga seksiyon sa artikulo.

Pag-configure sa pagtugot sa Istio

Para sa pagtugot sa pagtrabaho, kinahanglan nimo nga palihokon ang RBAC para sa Istio. Sa pagbuhat niini, atong gamiton ang mosunod nga configuration:

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" 

Mga pagpasabut:

  • 1 β€” i-enable ang RBAC para lang sa mga serbisyo ug namespaces nga nalista sa field Inclusion;
  • 2 β€” naglista kami og lista sa among mga serbisyo.

Atong i-apply ang configuration gamit ang mosunod nga command:

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

Ang tanan nga mga serbisyo karon nanginahanglan Role-Based Access Control. Sa laing pagkasulti, ang pag-access sa tanan nga mga serbisyo gidili ug moresulta sa usa ka tubag RBAC: access denied. Karon tugotan nato ang pag-access sa mga awtorisado nga tiggamit.

Pag-access sa configuration alang sa mga regular nga tiggamit

Ang tanan nga mga tiggamit kinahanglan adunay access sa mga serbisyo sa SA-Frontend ug SA-WebApp. Gipatuman gamit ang mosunod nga mga kapanguhaan sa Istio:

  • Papel sa Serbisyo β€” nagtino sa mga katungod nga naa sa tiggamit;
  • ServiceRoleBinding β€” nagtino kung kinsa ang kini nga ServiceRole.

Para sa mga ordinaryo nga tiggamit, tugotan namo ang pag-access sa pipila ka mga serbisyo (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: ["*"]

Ug pinaagi sa regular-user-binding i-apply ang ServiceRole sa tanang bisita sa pahina (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"

Ang "tanan nga mga tiggamit" ba nagpasabut nga ang mga wala mapamatud-an nga tiggamit adunay access usab sa SA WebApp? Dili, ang polisiya magsusi sa kabalido sa JWT token.

Atong i-apply ang mga configuration:

$ 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

Pag-access sa configuration alang sa mga moderator

Para sa mga moderator, gusto namong i-enable ang access sa tanang serbisyo (mod-service-role.yaml):

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

Apan gusto namon ang ingon nga mga katungod alang lamang sa mga tiggamit kansang access token adunay pag-angkon https://sa.io/group uban sa kahulogan 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" 

Atong i-apply ang mga configuration:

$ 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

Tungod sa pag-cache sa mga envoy, mahimo’g pipila ka minuto aron matuman ang mga lagda sa pagtugot. Mahimo nimong masiguro nga ang mga tiggamit ug mga moderator adunay lainlaing lebel sa pag-access.

Konklusyon niini nga bahin

Seryoso hinuon, nakakita ka na ba ug mas simple, walay kahago, scalable ug luwas nga paagi sa pag-authenticate ug pagtugot?

Tulo ra nga mga kapanguhaan sa Istio (RbacConfig, ServiceRole, ug ServiceRoleBinding) ang gikinahanglan aron makab-ot ang maayo nga pagkontrol sa pag-authenticate ug pagtugot sa pag-access sa end user sa mga serbisyo.

Dugang pa, among giatiman kini nga mga isyu gikan sa among mga serbisyo sa envoy, nga nakab-ot:

  • pagkunhod sa gidaghanon sa generic code nga mahimong adunay mga problema sa seguridad ug mga bug;
  • pagkunhod sa gidaghanon sa mga hungog nga mga sitwasyon diin ang usa ka endpoint nahimong accessible gikan sa gawas ug nakalimot sa pagtaho niini;
  • pagwagtang sa panginahanglan sa pag-update sa tanang serbisyo sa matag higayon nga idugang ang bag-ong tahas o katungod;
  • nga ang bag-ong mga serbisyo magpabilin nga yano, luwas ug paspas.

konklusyon

Gitugotan sa Istio ang mga koponan nga ipunting ang ilang mga kahinguhaan sa mga buluhaton nga kritikal sa negosyo nga wala magdugang overhead sa mga serbisyo, nga ibalik kini sa micro status.

Ang artikulo (sa tulo ka bahin) naghatag sukaranan nga kahibalo ug andam nga praktikal nga mga panudlo alang sa pagsugod sa Istio sa tinuud nga mga proyekto.

PS gikan sa tighubad

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment