Späť k mikroslužbám s Istio. Časť 3

Späť k mikroslužbám s Istio. Časť 3

Poznámka. preklad.: Prvá časť táto séria bola venovaná spoznávaniu schopností Istio a ich demonštrácii v praxi, druhý — jemne vyladené smerovanie a správa sieťovej prevádzky. Teraz budeme hovoriť o bezpečnosti: na demonštráciu základných funkcií, ktoré s tým súvisia, autor používa službu identity Auth0, ale podobným spôsobom je možné nakonfigurovať aj iných poskytovateľov.

Nastavili sme klaster Kubernetes, v ktorom sme nasadili Istio a vzorovú aplikáciu mikroslužieb Sentiment Analysis, aby sme demonštrovali schopnosti Istio.

S Istio sme boli schopní udržať naše služby malé, pretože nepotrebujú implementovať vrstvy, ako sú opakovania, časové limity, ističe, sledovanie, monitorovanie. Okrem toho sme použili pokročilé testovacie a nasadzovacie techniky: A/B testovanie, zrkadlenie a canary rollouts.

Späť k mikroslužbám s Istio. Časť 3

V novom materiáli sa budeme zaoberať poslednými vrstvami na ceste k obchodnej hodnote: autentifikáciou a autorizáciou – a v Istio je to skutočné potešenie!

Autentifikácia a autorizácia v Istio

Nikdy by som neveril, že sa budem inšpirovať autentifikáciou a autorizáciou. Čo môže Istio ponúknuť z technologického hľadiska, aby boli tieto témy pre vás zábavné a ešte viac inšpiratívne?

Odpoveď je jednoduchá: Istio presúva zodpovednosť za tieto funkcie z vašich služieb na Envoy proxy. V čase, keď sa požiadavky dostanú do služieb, sú už overené a autorizované, takže všetko, čo musíte urobiť, je napísať kód užitočný pre podnikanie.

Znie to dobre? Poďme sa pozrieť dovnútra!

Autentifikácia pomocou Auth0

Ako server na správu identity a prístupu použijeme Auth0, ktorý má skúšobnú verziu, je intuitívny a jednoducho sa mi páči. Rovnaké princípy však možno použiť aj na akékoľvek iné Implementácie OpenID Connect: KeyCloak, IdentityServer a mnoho ďalších.

Ak chcete začať, prejdite na stránku Portál Auth0 pomocou svojho účtu vytvorte nájomníka (nájomca - „nájomca“, logická jednotka izolácie, bližšie pozri dokumentáciu - približne. preklad.) a prejdite na Aplikácie > Predvolená aplikáciavýber Doména, ako je znázornené na snímke obrazovky nižšie:

Späť k mikroslužbám s Istio. Časť 3

Zadajte túto doménu v súbore resource-manifests/istio/security/auth-policy.yaml (zdroj):

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

S takým zdrojom, Pilot (jeden z troch základných komponentov Control Plane v Istio - približne preklad.) nakonfiguruje Envoys na overenie požiadaviek pred ich preposlaním službám: sa-web-app и sa-feedback. Zároveň sa konfigurácia nepoužije na službu Envoys sa-frontend, čo nám umožňuje ponechať frontend neoverený. Ak chcete použiť politiku, spustite príkaz:

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

Vráťte sa na stránku a urobte požiadavku - uvidíte, že to končí statusom 401 Neoprávnené. Teraz presmerujme používateľov frontendu na overenie pomocou Auth0.

Overenie žiadostí pomocou Auth0

Ak chcete overiť požiadavky koncových používateľov, musíte v Auth0 vytvoriť API, ktoré bude reprezentovať overené služby (recenzie, podrobnosti a hodnotenia). Ak chcete vytvoriť rozhranie API, prejdite na Auth0 Portal > APIs > Create API a vyplňte formulár:

Späť k mikroslužbám s Istio. Časť 3

Tu sú dôležité informácie identifikátor, ktorý neskôr použijeme v scenári. Zapíšme si to takto:

  • Publikum: {YOUR_AUDIENCE}

Zostávajúce podrobnosti, ktoré potrebujeme, sa nachádzajú na portáli Auth0 v sekcii použitie - vybrať Testovacia aplikácia (vytvorené automaticky spolu s API).

Tu budeme písať:

  • Doména: {VAŠA_DOMÉNA}
  • ID klienta: {YOUR_CLIENT_ID}

Prejdite na Testovacia aplikácia do textového poľa Povolené adresy URL spätného volania (vyriešené adresy URL pre spätné volanie), v ktorých špecifikujeme adresu URL, na ktorú má byť hovor odoslaný po dokončení autentifikácie. V našom prípade je to:

http://{EXTERNAL_IP}/callback

A pre Povolené adresy URL na odhlásenie (povolené adresy URL na odhlásenie) pridať:

http://{EXTERNAL_IP}/logout

Prejdime k frontendu.

Aktualizácia frontendu

Prepnúť na pobočku auth0 Úložisko [istio-mastery]. V tejto vetve sa kód frontendu zmení, aby presmeroval používateľov na Auth0 na overenie a použil token JWT v požiadavkách na iné služby. Ten druhý sa implementuje nasledovne (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));
}

Ak chcete prepnúť klientske rozhranie na používanie údajov nájomníka v Auth0, otvorte sa-frontend/src/services/Auth.js a nahraďte v ňom hodnoty, ktoré sme napísali vyššie (Auth.js):

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

Aplikácia je pripravená. Pri vytváraní a nasadzovaní vykonaných zmien zadajte svoje Docker ID v príkazoch nižšie:

$ 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

Vyskúšajte aplikáciu! Budete presmerovaní na Auth0, kde sa musíte prihlásiť (alebo zaregistrovať), po čom budete presmerovaní späť na stránku, z ktorej budú uskutočnené už overené požiadavky. Ak vyskúšate príkazy uvedené v prvých častiach článku pomocou curl, získate kód 401 Stavový kód, čo signalizuje, že požiadavka nie je autorizovaná.

Urobme ďalší krok – autorizujte žiadosti.

Autorizácia s Auth0

Autentifikácia nám umožňuje pochopiť, kto je používateľ, ale vyžaduje sa autorizácia, aby sme vedeli, k čomu má prístup. Istio na to ponúka nástroje.

Ako príklad vytvoríme dve skupiny používateľov (pozrite si diagram nižšie):

  • Členovia (používatelia) — s prístupom len k službám SA-WebApp a SA-Frontend;
  • moderátori (moderátori) — s prístupom ku všetkým trom službám.

Späť k mikroslužbám s Istio. Časť 3
Autorizačný koncept

Na vytvorenie týchto skupín použijeme rozšírenie Auth0 Authorization a pomocou Istio im poskytneme rôzne úrovne prístupu.

Inštalácia a konfigurácia autorizácie Auth0

Na portáli Auth0 prejdite na rozšírenia (Rozšírenie) a nainštalujte Autorizácia Auth0. Po inštalácii prejdite na Predĺženie autorizáciea tam - do konfigurácie nájomcu kliknutím na vpravo hore a výberom príslušnej možnosti ponuky (Konfigurácia). Aktivujte skupiny (skupiny) a kliknite na tlačidlo publikovať pravidlo (Pravidlo zverejnenia).

Späť k mikroslužbám s Istio. Časť 3

Vytváranie skupín

V časti Rozšírenie autorizácie prejdite na Skupiny a vytvorte skupinu Moderátori. Keďže všetkých overených používateľov budeme považovať za bežných používateľov, nie je potrebné pre nich vytvárať ďalšiu skupinu.

Vyberte skupinu Moderátori, Stlačte Pridajte členov, pridajte svoj hlavný účet. Ponechajte niektorých používateľov bez akejkoľvek skupiny, aby ste sa uistili, že majú odmietnutý prístup. (Nových používateľov je možné vytvoriť manuálne cez Auth0 Portal > Používatelia > Vytvoriť používateľa.)

Pridať nárok skupiny k prístupovému tokenu

Používatelia boli pridaní do skupín, ale tieto informácie sa musia prejaviť aj v prístupových tokenoch. Aby sme vyhoveli OpenID Connect a zároveň vrátili skupiny, ktoré potrebujeme, token bude musieť pridať svoje vlastné vlastná reklamácia. Implementované prostredníctvom pravidiel Auth0.

Ak chcete vytvoriť pravidlo, prejdite na portál Auth0 Pravidlá, Stlačte Vytvorte pravidlo a vyberte prázdne pravidlo zo šablón.

Späť k mikroslužbám s Istio. Časť 3

Skopírujte nižšie uvedený kód a uložte ho ako nové pravidlo Pridať skupinový nárok (namespacedGroup.js):

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

Poznámka: Tento kód vezme prvú skupinu používateľov definovanú v rozšírení autorizácie a pridá ju do prístupového tokenu ako vlastný nárok (pod jej priestorom názvov, ako to vyžaduje Auth0).

Návrat na stránku Pravidlá a skontrolujte, či máte napísané dve pravidlá v nasledujúcom poradí:

  • auth0-authorization-extension
  • Pridať skupinový nárok

Poradie je dôležité, pretože pole skupiny prijíma pravidlo asynchrónne auth0-authorization-extension a potom sa pridá ako nárok podľa druhého pravidla. Výsledkom je takýto prístupový token:

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

Teraz musíte nakonfigurovať proxy servera Envoy na kontrolu používateľského prístupu, pre ktorý bude skupina stiahnutá z nároku (https://sa.io/group) vo vrátenom prístupovom tokene. Toto je téma pre ďalšiu časť článku.

Konfigurácia autorizácie v Istio

Aby autorizácia fungovala, musíte povoliť RBAC pre Istio. Na tento účel použijeme nasledujúcu konfiguráciu:

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" 

Vysvetlenie:

  • 1 — povoliť RBAC len pre služby a menné priestory uvedené v poli Inclusion;
  • 2 — uvádzame zoznam našich služieb.

Použime konfiguráciu pomocou nasledujúceho príkazu:

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

Všetky služby teraz vyžadujú riadenie prístupu na základe rolí. Inými slovami, prístup ku všetkým službám je zakázaný a bude mať za následok odpoveď RBAC: access denied. Teraz povoľme prístup oprávneným používateľom.

Konfigurácia prístupu pre bežných používateľov

Všetci používatelia musia mať prístup k službám SA-Frontend a SA-WebApp. Implementované pomocou nasledujúcich zdrojov Istio:

  • Služba Role — určuje práva, ktoré má používateľ;
  • ServiceRoleBinding — určuje, komu táto servisná rola patrí.

Bežným používateľom umožníme prístup k určitým službám (servisná 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: ["*"]

A potom regular-user-binding použiť ServiceRole na všetkých návštevníkov stránky (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"

Znamená „všetci používatelia“, že k aplikácii SA WebApp budú mať prístup aj neoverení používatelia? Nie, politika skontroluje platnosť tokenu JWT.

Aplikujme konfigurácie:

$ 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

Konfigurácia prístupu pre moderátorov

Pre moderátorov chceme povoliť prístup ku všetkým službám (mod-service-role.yaml):

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

Takéto práva však chceme len pre tých používateľov, ktorých prístupový token obsahuje claim https://sa.io/group so zmyslom 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" 

Aplikujme konfigurácie:

$ 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

Z dôvodu ukladania do vyrovnávacej pamäte v vyslancoch môže trvať niekoľko minút, kým pravidlá autorizácie nadobudnú účinnosť. Potom môžete zabezpečiť, aby používatelia a moderátori mali rôzne úrovne prístupu.

Záver k tejto časti

Ale vážne, videli ste už jednoduchší, nenáročný, škálovateľný a bezpečný prístup k autentifikácii a autorizácii?

Na dosiahnutie presnej kontroly nad autentifikáciou a autorizáciou prístupu koncových používateľov k službám boli potrebné iba tri zdroje Istio (RbacConfig, ServiceRole a ServiceRoleBinding).

Okrem toho sme sa o tieto záležitosti postarali prostredníctvom našich vyslaneckých služieb, čím sme dosiahli:

  • zníženie množstva generického kódu, ktorý môže obsahovať bezpečnostné problémy a chyby;
  • zníženie počtu hlúpych situácií, v ktorých sa ukázalo, že jeden koncový bod je prístupný zvonku a zabudol ho nahlásiť;
  • odstránenie potreby aktualizovať všetky služby zakaždým, keď sa pridá nová rola alebo právo;
  • aby nové služby zostali jednoduché, bezpečné a rýchle.

Výkon

Istio umožňuje tímom sústrediť svoje zdroje na kritické obchodné úlohy bez toho, aby pridávali réžiu k službám a vracali ich do mikro stavu.

Článok (v troch častiach) poskytol základné poznatky a hotové praktické návody, ako začať s Istiom v reálnych projektoch.

PS od prekladateľa

Prečítajte si aj na našom blogu:

Zdroj: hab.com

Pridať komentár