Retounen nan microservices ak Istio. Pati 3

Retounen nan microservices ak Istio. Pati 3

Remak. trad.: Pati nan premye seri sa a te konsakre nan aprann konnen kapasite Istio ak demontre yo nan aksyon, dezyèm fwa - tise byen branche routage ak jesyon trafik rezo a. Koulye a, nou pral pale sou sekirite: pou demontre fonksyon debaz yo ki gen rapò ak li, otè a sèvi ak sèvis idantite Auth0, men lòt founisè yo ka configuré nan yon fason menm jan an.

Nou mete yon gwoup Kubernetes kote nou te deplwaye Istio ak yon egzanp aplikasyon mikwosèvis, Sentiment Analysis, pou demontre kapasite Istio.

Avèk Istio, nou te kapab kenbe sèvis nou yo piti paske yo pa bezwen aplike kouch tankou Retries, Timeouts, Circuit Breakers, Tracing, Monitoring. . Anplis de sa, nou te itilize tès avanse ak teknik deplwaman: tès A/B, mirwar ak lansman Canary.

Retounen nan microservices ak Istio. Pati 3

Nan nouvo materyèl la, nou pral fè fas ak kouch final yo sou chemen an nan valè biznis: otantifikasyon ak otorizasyon - ak nan Istio se yon plezi reyèl!

Otantifikasyon ak otorizasyon nan Istio

Mwen pa janm ta kwè ke mwen ta enspire pa otantifikasyon ak otorizasyon. Kisa Istio ka ofri nan yon pèspektiv teknoloji pou fè sijè sa yo plezi e, plis toujou, enspire pou ou?

Repons lan se senp: Istio chanje responsablite pou kapasite sa yo soti nan sèvis ou yo nan proxy Envoy la. Depi lè demann yo rive nan sèvis yo, yo te deja otantifye ak otorize, kidonk tout sa ou dwe fè se ekri kòd ki itil pou biznis.

Son bon? Ann gade anndan!

Otantifikasyon ak Auth0

Kòm yon sèvè pou idantite ak jesyon aksè, nou pral sèvi ak Auth0, ki gen yon vèsyon esè, se entwisyon yo itilize epi mwen tou senpleman renmen li. Sepandan, menm prensip yo ka aplike nan nenpòt lòt Enplemantasyon OpenID Connect: KeyCloak, IdentityServer ak anpil lòt moun.

Premyèman, ale nan Auth0 Portal ak kont ou, kreye yon lokatè (lokatè - "lokatè", inite lojik izolasyon, pou plis detay gade dokiman - approx. trad.) epi ale nan Aplikasyon > Default Appchwazi Domèn, jan yo montre nan ekran ki anba a:

Retounen nan microservices ak Istio. Pati 3

Espesifye domèn sa a nan dosye a resource-manifests/istio/security/auth-policy.yaml (sous):

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

Avèk yon resous konsa, Pilòt (youn nan twa eleman debaz Plan Kontwòl nan Istio - tradiksyon apeprè) configure Envoy pou otantifye demann yo anvan yo voye yo bay sèvis yo: sa-web-app и sa-feedback. An menm tan an, konfigirasyon an pa aplike nan anvwaye sèvis yo sa-frontend, ki pèmèt nou kite frontend a san otantifikasyon. Pou aplike Règleman an, kouri lòd la:

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

Retounen nan paj la epi fè yon demann - ou pral wè ke li fini ak estati a 401 san otorizasyon. Koulye a, ann redireksyon itilizatè entèfas pou otantifye ak Auth0.

Otantifye demann ak Auth0

Pou otantifye demann itilizatè fen yo, ou bezwen kreye yon API nan Auth0 ki pral reprezante sèvis otantifye yo (revizyon, detay, ak evalyasyon). Pou kreye yon API, ale nan Auth0 Portal > APIs > Kreye API epi ranpli fòm nan:

Retounen nan microservices ak Istio. Pati 3

Enfòmasyon enpòtan isit la se idantifikatè, ke nou pral itilize pita nan script la. Ann ekri l konsa:

  • Odyans: {YOUR_ODYENCE}

Rès detay nou bezwen yo sitiye sou Portal Auth0 nan seksyon an Aplikasyon - chwazi Tès Aplikasyon (kreye otomatikman ansanm ak API a).

Isit la nou pral ekri:

  • Domèn: {YOUR_DOMAIN}
  • Kliyan Id: {YOUR_CLIENT_ID}

Scroll to Tès Aplikasyon nan jaden tèks Adrès URL apèl yo (Rezoud URL pou callback la), nan ki nou presize URL kote apèl la ta dwe voye apre otantifikasyon fini. Nan ka nou an se:

http://{EXTERNAL_IP}/callback

Ak pou Adrès URL Dekonekte (URL ki pèmèt pou dekonekte) ajoute:

http://{EXTERNAL_IP}/logout

Ann ale nan entèfas la.

Mizajou Frontend

Chanje nan branch auth0 depo [istio-mastery]. Nan branch sa a, kòd frontend la chanje pou redireksyon itilizatè yo nan Auth0 pou otantifikasyon epi sèvi ak siy JWT la nan demann bay lòt sèvis. Lèt la aplike jan sa a (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));
}

Pou chanje entèfas a pou itilize done lokatè nan Auth0, louvri sa-frontend/src/services/Auth.js epi ranplase nan li valè ke nou te ekri pi wo a (Auth.js):

const Config = {
    clientID: '{YOUR_CLIENT_ID}',
    domain:'{YOUR_DOMAIN}',
    audience: '{YOUR_AUDIENCE}',
    ingressIP: '{EXTERNAL_IP}' // Используется для редиректа после аутентификации
}

Aplikasyon an pare. Espesifye ID Docker ou a nan kòmandman ki anba yo lè w ap bati ak deplwaye chanjman yo te fè yo:

$ 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

Eseye app a! Yo pral redireksyon w nan Auth0, kote ou bezwen konekte (oswa enskri), apre sa y ap voye w tounen nan paj kote yo pral fè demann ki deja otantifye. Si ou eseye kòmandman yo mansyone nan premye pati yo nan atik la ak boukl, ou pral jwenn kòd la 401 Kòd Estati, siyal ke demann lan pa otorize.

Ann pran pwochen etap la - otorize demann yo.

Otorizasyon ak Auth0

Otantifikasyon pèmèt nou konprann kiyès yon itilizatè ye, men yo mande otorizasyon pou konnen ki sa yo gen aksè. Istio ofri zouti pou sa tou.

Kòm yon egzanp, ann kreye de gwoup itilizatè (gade dyagram ki anba a):

  • Manm (itilizatè) — ak aksè sèlman nan SA-WebApp ak sèvis SA-Frontend;
  • Moderatè (moderatè) — ak aksè a tout twa sèvis yo.

Retounen nan microservices ak Istio. Pati 3
Konsèp otorizasyon

Pou kreye gwoup sa yo, nou pral sèvi ak ekstansyon Otorizasyon Otorizasyon an epi sèvi ak Istio pou ba yo diferan nivo aksè.

Enstalasyon ak konfigirasyon Otorizasyon Otorizasyon

Nan pòtal Auth0, ale nan ekstansyon (Ekstansyon) epi enstale Otorizasyon Otorizasyon. Apre enstalasyon, ale nan Ekstansyon Otorizasyon, epi gen - nan konfigirasyon lokatè a lè w klike sou tèt dwat la epi chwazi opsyon meni ki apwopriye a (Konfigirasyon). Aktive gwoup yo (Gwoup) epi klike sou bouton pibliye règ la (Pibliye règ).

Retounen nan microservices ak Istio. Pati 3

Kreye gwoup

Nan ekstansyon otorizasyon ale nan Gwoup epi kreye yon gwoup Moderatè yo. Piske nou pral trete tout itilizatè otantifye kòm itilizatè regilye, pa gen okenn nesesite pou kreye yon gwoup adisyonèl pou yo.

Chwazi yon gwoup Moderatè yo, Peze Ajoute Manm yo, ajoute kont prensipal ou a. Kite kèk itilizatè san okenn gwoup pou asire w ke yo refize aksè. (Nouvo itilizatè yo ka kreye manyèlman atravè Auth0 Portal > Itilizatè yo > Kreye itilizatè.)

Ajoute Reklamasyon Gwoup Aksè Token

Itilizatè yo te ajoute nan gwoup yo, men enfòmasyon sa a dwe reflete tou nan jeton aksè. Pou konfòme ak OpenID Connect epi an menm tan retounen gwoup nou bezwen yo, siy la ap bezwen ajoute pwòp li yo. reklamasyon koutim. Aplike atravè règ Auth0.

Pou kreye yon règ, ale nan Auth0 Portal pou Règleman, Peze Kreye Règ epi chwazi yon règ vid nan modèl yo.

Retounen nan microservices ak Istio. Pati 3

Kopi kòd ki anba a epi sove li kòm yon nouvo règ Ajoute Gwoup Reklamasyon (namespacedGroup.js):

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

Note: Kòd sa a pran premye gwoup itilizatè ki defini nan Ekstansyon Otorizasyon an epi li ajoute li nan siy aksè a kòm yon reklamasyon koutim (anba espas non li yo, jan Auth0 egzije sa).

Retounen nan paj la Règleman epi tcheke si ou gen de règ ekri nan lòd sa a:

  • auth0-otorizasyon-ektansyon
  • Ajoute Gwoup Reklamasyon

Lòd la enpòtan paske jaden gwoup la resevwa règ la asynchrone auth0-otorizasyon-ektansyon epi apre sa li ajoute kòm yon reklamasyon pa dezyèm règ la. Rezilta a se yon siy aksè tankou sa a:

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

Koulye a, ou bezwen konfigirasyon prokurasyon Envoy la pou tcheke aksè itilizatè a, pou yo pral retire gwoup la nan reklamasyon an (https://sa.io/group) nan siy aksè ki retounen an. Sa a se sijè pou pwochen seksyon atik la.

Konfigirasyon otorizasyon nan Istio

Pou otorizasyon travay, ou dwe aktive RBAC pou Istio. Pou fè sa, nou pral sèvi ak konfigirasyon sa a:

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" 

Eksplikasyon:

  • 1 — pèmèt RBAC sèlman pou sèvis ak espas non ki nan lis nan jaden an Inclusion;
  • 2 — nou lis yon lis sèvis nou yo.

Ann aplike konfigirasyon an ak lòd sa a:

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

Kounye a tout sèvis yo mande kontwòl Aksè ki baze sou wòl. Nan lòt mo, aksè a tout sèvis yo entèdi epi yo pral lakòz yon repons RBAC: access denied. Koulye a, ann pèmèt aksè a itilizatè otorize yo.

Aksè konfigirasyon pou itilizatè regilye

Tout itilizatè yo dwe gen aksè a sèvis SA-Frontend ak SA-WebApp. Aplike lè l sèvi avèk resous Istio sa yo:

  • ServiceRole — detèmine dwa itilizatè a genyen;
  • ServiceRoleBinding — detèmine kiyès ServiceRole sa a fè pati.

Pou itilizatè òdinè nou pral pèmèt aksè a sèten sèvis (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: ["*"]

Ak atravè regular-user-binding aplike ServiceRole pou tout vizitè paj yo (regilye-itilizatè-sèvis-wòl-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"

Èske "tout itilizatè" vle di itilizatè ki pa otantifye yo ap gen aksè a SA WebApp tou? Non, politik la pral tcheke validite siy JWT la.

Ann aplike konfigirasyon yo:

$ 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

Aksè konfigirasyon pou moderatè yo

Pou moderatè, nou vle pèmèt aksè a tout sèvis (mod-service-role.yaml):

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

Men, nou vle dwa sa yo sèlman pou itilizatè sa yo ki gen siy aksè a gen reklamasyon https://sa.io/group ak siyifikasyon 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" 

Ann aplike konfigirasyon yo:

$ 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

Akòz kachèt nan anvwaye yo, sa ka pran kèk minit pou règ otorizasyon yo pran efè. Lè sa a, ou ka asire ke itilizatè yo ak moderatè gen diferan nivo aksè.

Konklizyon sou pati sa a

Seryezman menm si, èske ou janm wè yon apwòch ki pi senp, san efò, évolutive ak an sekirite nan otantifikasyon ak otorizasyon?

Se sèlman twa resous Istio (RbacConfig, ServiceRole, ak ServiceRoleBinding) yo te oblije reyalize kontwòl amann sou otantifikasyon ak otorizasyon aksè itilizatè fen nan sèvis yo.

Anplis de sa, nou te pran swen pwoblèm sa yo nan sèvis anvwaye nou yo, reyalize:

  • diminye kantite kòd jenerik ki ka genyen pwoblèm sekirite ak ensèk;
  • diminye kantite sitiyasyon estipid kote yon pwen final te vin aksesib soti deyò epi li bliye rapòte li;
  • elimine nesesite pou ajou tout sèvis chak fwa yo ajoute yon nouvo wòl oswa dwa;
  • ke nouvo sèvis yo rete senp, an sekirite ak rapid.

Sòti

Istio pèmèt ekip yo konsantre resous yo sou travay ki enpòtan pou biznis yo san yo pa ajoute sou tèt yo nan sèvis yo, retounen yo nan estati mikwo.

Atik la (an twa pati) bay konesans debaz ak enstriksyon pratik ki pare pou kòmanse ak Istio nan pwojè reyèl.

PS soti nan tradiktè

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè