
Poznámka. preklad.: táto séria bola venovaná spoznávaniu schopností Istio a ich demonštrácii v praxi, — 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.

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é : KeyCloak, IdentityServer a mnoho ďalších.
Ak chcete začať, prejdite na stránku pomocou svojho účtu vytvorte nájomníka (nájomca - „nájomca“, logická jednotka izolácie, bližšie pozri - približne. preklad.) a prejdite na Aplikácie > Predvolená aplikáciavýber Doména, ako je znázornené na snímke obrazovky nižšie:

Zadajte túto doménu v súbore resource-manifests/istio/security/auth-policy.yaml ():
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” createdVráť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:

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}/callbackA pre Povolené adresy URL na odhlásenie (povolené adresy URL na odhlásenie) pridať:
http://{EXTERNAL_IP}/logoutPrejdime 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 ():
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 ():
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-auth0Vyskúš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.

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).

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é . 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.

Skopírujte nižšie uvedený kód a uložte ho ako nové pravidlo Pridať skupinový nárok ():
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 ():
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 ():
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 createdKonfigurácia prístupu pre moderátorov
Pre moderátorov chceme povoliť prístup ku všetkým službám ():
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 ():
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 createdZ 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:
- "Späť na mikroslužby s Istio": , ;
- «»;
- «".
Zdroj: hab.com
