Istio ilə mikroservislərə qayıdın. 3-ci hissə

Istio ilə mikroservislərə qayıdın. 3-ci hissə

Qeyd. tərcümə.: Birinci hissə bu seriya Istio-nun imkanları ilə tanış olmağa və onları fəaliyyətdə nümayiş etdirməyə həsr olunmuşdu, Ikinci — incə tənzimlənmiş marşrutlaşdırma və şəbəkə trafikinin idarə edilməsi. İndi biz təhlükəsizlik haqqında danışacağıq: onunla əlaqəli əsas funksiyaları nümayiş etdirmək üçün müəllif Auth0 şəxsiyyət xidmətindən istifadə edir, lakin digər provayderlər də oxşar şəkildə konfiqurasiya edilə bilər.

Istio-nu yerləşdirdiyimiz Kubernetes klasterini və Istio-nun imkanlarını nümayiş etdirmək üçün nümunə mikroservis tətbiqi, Sentiment Analysis qurduq.

Istio ilə biz xidmətlərimizi kiçik saxlaya bildik, çünki onlar Yenidən Sınaqlar, Taymoutlar, Devre kesiciler, İzləmə, Monitorinq kimi təbəqələri tətbiq etməyə ehtiyac duymurlar. . Bundan əlavə, biz qabaqcıl sınaq və yerləşdirmə üsullarından istifadə etdik: A/B sınağı, aynalama və kanareykalar.

Istio ilə mikroservislərə qayıdın. 3-ci hissə

Yeni materialda biz biznes dəyərinə aparan yolda son qatlarla məşğul olacağıq: autentifikasiya və avtorizasiya - və Istio-da bu, əsl zövqdür!

Istio-da identifikasiya və avtorizasiya

Doğrulama və icazədən ilham alacağıma heç vaxt inanmazdım. Istio bu mövzuları əyləncəli və daha çox sizin üçün ruhlandırıcı etmək üçün texnologiya baxımından nə təklif edə bilər?

Cavab sadədir: Istio bu imkanlar üçün məsuliyyəti xidmətlərinizdən Elçi proksisinə keçir. Sorğular xidmətlərə çatana qədər onlar artıq autentifikasiya olunub və icazə verilib, ona görə də sizə sadəcə biznes üçün faydalı kod yazmaq kifayətdir.

Yaxşı səslənir? Gəlin içəri nəzər salaq!

Auth0 ilə autentifikasiya

İdentifikasiya və girişin idarə edilməsi üçün server olaraq biz sınaq versiyası olan Auth0-dan istifadə edəcəyik, istifadəsi intuitivdir və sadəcə olaraq bunu bəyənirəm. Bununla belə, eyni prinsiplər hər hansı digərinə tətbiq oluna bilər OpenID Connect tətbiqləri: KeyCloak, IdentityServer və bir çox başqaları.

Birincisi, gedin Auth0 Portalı hesabınızla kirayəçi yaradın (icarəçi - "icarəçi", təcridin məntiqi vahidi, daha çox məlumat üçün baxın sənədləşdirmə - təqribən. tərcümə.) və gedin Proqramlar > Defolt Proqramseçim Domain, aşağıdakı ekran görüntüsündə göstərildiyi kimi:

Istio ilə mikroservislərə qayıdın. 3-ci hissə

Faylda bu domeni göstərin resource-manifests/istio/security/auth-policy.yaml (mənbə):

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

Belə bir mənbə ilə Pilot (Istio-da üç əsas İdarəetmə Təyyarə komponentindən biri - təqribən tərcümə.) Elçini sorğuları xidmətlərə yönləndirməzdən əvvəl autentifikasiya etmək üçün konfiqurasiya edir: sa-web-app и sa-feedback. Eyni zamanda, konfiqurasiya Elçilərin xidmətinə tətbiq edilmir sa-frontend, bizə ön tərəfi təsdiqlənməmiş tərk etməyə imkan verir. Siyasəti tətbiq etmək üçün əmri işlədin:

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

Səhifəyə qayıdın və sorğu göndərin - bunun statusla bitdiyini görəcəksiniz 401 İcazəsiz. İndi frontend istifadəçilərini Auth0 ilə autentifikasiya etmək üçün yönləndirək.

Auth0 ilə sorğuların doğrulanması

Son istifadəçi sorğularının autentifikasiyası üçün Auth0-da autentifikasiya edilmiş xidmətləri (nəzərlər, təfərrüatlar və reytinqlər) təmsil edəcək API yaratmalısınız. API yaratmaq üçün bura keçin Auth0 Portalı > API-lər > API yarat və formanı doldurun:

Istio ilə mikroservislərə qayıdın. 3-ci hissə

Burada vacib olan məlumatdır Identifier, bundan sonra skriptdə istifadə edəcəyik. Bunu belə yazaq:

  • Tamaşaçı: {YOUR_AUDIENCE}

Bizə lazım olan qalan detallar bölmədə Auth0 Portalında yerləşir Applications - seçin Test Tətbiqi (API ilə birlikdə avtomatik olaraq yaradılmışdır).

Burada yazacağıq:

  • Domain: {YOUR_DOMAIN}
  • Müştəri İD: {YOUR_CLIENT_ID}

-a sürüşdürün Test Tətbiqi mətn sahəsinə İcazəli Geri Zəng URL-ləri (geri zəng üçün həll edilmiş URL-lər), burada identifikasiya tamamlandıqdan sonra zəngin göndərilməli olduğu URL-i müəyyən edirik. Bizim vəziyyətimizdə belədir:

http://{EXTERNAL_IP}/callback

Və üçün İcazə verilən çıxış URL-ləri (çıxmaq üçün icazə verilən URL-lər) əlavə edin:

http://{EXTERNAL_IP}/logout

Ön tərəfə keçək.

Frontend yeniləməsi

Filiallara keçin auth0 anbar [istio-mastery]. Bu filialda istifadəçiləri autentifikasiya üçün Auth0-a yönləndirmək və digər xidmətlərə sorğularda JWT işarəsindən istifadə etmək üçün ön kod dəyişdirilir. Sonuncu aşağıdakı kimi həyata keçirilir (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));
}

Auth0-da kirayəçi məlumatlarından istifadə etmək üçün ön tərəfi dəyişdirmək üçün açın sa-frontend/src/services/Auth.js və yuxarıda yazdığımız dəyərləri orada əvəz edin (Auth.js):

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

Tətbiq hazırdır. Edilən dəyişiklikləri qurarkən və yerləşdirərkən aşağıdakı əmrlərdə Docker ID-nizi göstərin:

$ 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

Proqramı sınayın! Siz Auth0-a yönləndiriləcəksiniz, burada daxil olmaq (və ya qeydiyyatdan keçmək) lazımdır, bundan sonra siz artıq təsdiqlənmiş sorğuların ediləcəyi səhifəyə geri göndəriləcəksiniz. Məqalənin ilk hissələrində qeyd olunan əmrləri curl ilə sınasanız, kodu alacaqsınız 401 Status Kodu, sorğuya icazə verilmədiyini bildirir.

Gəlin növbəti addımı ataq - sorğulara icazə verin.

Auth0 ilə avtorizasiya

Doğrulama bizə istifadəçinin kim olduğunu anlamağa imkan verir, lakin onların nəyə girişi olduğunu bilmək üçün icazə tələb olunur. İstio da bunun üçün alətlər təklif edir.

Nümunə olaraq iki istifadəçi qrupu yaradaq (aşağıdakı diaqrama baxın):

  • İstifadəçi (istifadəçilər) — yalnız SA-WebApp və SA-Frontend xidmətlərinə çıxışla;
  • Moderatorlar (moderatorlar) — hər üç xidmətə çıxış imkanı ilə.

Istio ilə mikroservislərə qayıdın. 3-ci hissə
Avtorizasiya konsepsiyası

Bu qrupları yaratmaq üçün biz Auth0 Authorization genişlənməsindən istifadə edəcəyik və onlara müxtəlif giriş səviyyələri ilə təmin etmək üçün Istio-dan istifadə edəcəyik.

Auth0 Avtorizasiyasının quraşdırılması və konfiqurasiyası

Auth0 portalında genişləndirmələrə keçin (Extensions) və quraşdırın Auth0 Avtorizasiya. Quraşdırıldıqdan sonra gedin Avtorizasiya uzadılması, və orada - yuxarı sağda klikləməklə və müvafiq menyu seçimini seçməklə kirayəçinin konfiqurasiyasına (Konfiqurasiya). Qrupları aktivləşdirin (Qruplar) və qaydanı dərc et düyməsini klikləyin (Nəşr etmə qaydası).

Istio ilə mikroservislərə qayıdın. 3-ci hissə

Qrupların yaradılması

Avtorizasiya Uzatmasında gedin Qruplar və qrup yaradın Moderatorlar. Bütün autentifikasiya edilmiş istifadəçiləri adi istifadəçilər kimi qəbul edəcəyimiz üçün onlar üçün əlavə qrup yaratmağa ehtiyac yoxdur.

Qrup seçin Moderatorlar, Basın Üzv əlavə edin, əsas hesabınızı əlavə edin. Bəzi istifadəçiləri heç bir qrup olmadan buraxın ki, onların girişinə icazə verilməyib. (Yeni istifadəçilər vasitəsilə əl ilə yaradıla bilər Auth0 Portalı > İstifadəçilər > İstifadəçi yarat.)

Giriş Tokeninə Qrup İddiası əlavə edin

İstifadəçilər qruplara əlavə edilib, lakin bu məlumat giriş nişanlarında da əks olunmalıdır. OpenID Connect ilə uyğunlaşmaq və eyni zamanda bizə lazım olan qrupları geri qaytarmaq üçün token özünü əlavə etməlidir xüsusi iddia. Auth0 qaydaları vasitəsilə həyata keçirilir.

Qayda yaratmaq üçün Auth0 Portalına keçin Qaydalar, Basın Qayda Yaradın və şablonlardan boş bir qayda seçin.

Istio ilə mikroservislərə qayıdın. 3-ci hissə

Aşağıdakı kodu kopyalayın və yeni qayda olaraq yadda saxlayın Qrup İddiasını əlavə edin (namespacedGroup.js):

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

Qeyd: Bu kod Avtorizasiya Uzatmasında müəyyən edilmiş ilk istifadəçi qrupunu götürür və onu xüsusi iddia kimi giriş nişanına əlavə edir (Auth0 tərəfindən tələb olunduğu kimi ad sahəsi altında).

Səhifəsinə qayıt Qaydalar və aşağıdakı ardıcıllıqla yazılmış iki qaydanızı yoxlayın:

  • auth0-authorization-uzatma
  • Qrup İddiasını əlavə edin

Qrup sahəsi qaydanı asinxron şəkildə qəbul etdiyi üçün sifariş vacibdir auth0-authorization-uzatma ondan sonra isə ikinci qayda ilə iddia kimi əlavə edilir. Nəticə belə bir giriş nişanıdır:

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

İndi istifadəçi girişini yoxlamaq üçün Envoy proxy-ni konfiqurasiya etməlisiniz, bunun üçün qrup iddiadan çıxarılacaq (https://sa.io/group) qaytarılmış giriş nişanında. Bu, məqalənin növbəti bölməsinin mövzusudur.

Istio-da avtorizasiya konfiqurasiyası

İşləmək üçün avtorizasiya üçün Istio üçün RBAC-ı aktivləşdirməlisiniz. Bunu etmək üçün aşağıdakı konfiqurasiyadan istifadə edəcəyik:

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" 

Şərhlər:

  • 1 — RBAC-ı yalnız sahədə sadalanan xidmətlər və ad məkanları üçün aktiv edin Inclusion;
  • 2 — xidmətlərimizin siyahısını sadalayırıq.

Konfiqurasiyanı aşağıdakı komanda ilə tətbiq edək:

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

Bütün xidmətlər indi Rol Əsaslı Giriş Nəzarəti tələb edir. Başqa sözlə, bütün xidmətlərə giriş qadağandır və cavabla nəticələnəcək RBAC: access denied. İndi icazəli istifadəçilərə girişə icazə verək.

Daimi istifadəçilər üçün giriş konfiqurasiyası

Bütün istifadəçilərin SA-Frontend və SA-WebApp xidmətlərinə girişi olmalıdır. Aşağıdakı Istio resurslarından istifadə etməklə həyata keçirilir:

  • Xidmət Rolu — istifadəçinin malik olduğu hüquqları müəyyən edir;
  • ServiceRoleBinding — bu ServiceRole-un kimə aid olduğunu müəyyən edir.

Adi istifadəçilər üçün müəyyən xidmətlərə girişə icazə verəcəyik (xidmət rolu.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: ["*"]

Və vasitəsilə regular-user-binding Bütün səhifə ziyarətçilərinə ServiceRole tətbiq edin (müntəzəm-istifadəçi-xidmət-rol-bağlama.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: regular-user-binding
  namespace: default
spec:
  subjects:
  - user: "*"
  roleRef:
    kind: ServiceRole
    name: "regular-user"

"Bütün istifadəçilər" təsdiqlənməmiş istifadəçilərin də SA WebApp-a daxil ola biləcəyini bildirirmi? Xeyr, siyasət JWT tokeninin etibarlılığını yoxlayacaq.

Konfiqurasiyaları tətbiq edək:

$ 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

Moderatorlar üçün giriş konfiqurasiyası

Moderatorlar üçün biz bütün xidmətlərə girişi təmin etmək istəyirik (mod-service-role.yaml):

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

Lakin biz bu cür hüquqları yalnız giriş nişanında iddia ehtiva edən istifadəçilər üçün istəyirik https://sa.io/group mənası ilə Moderators (mod-xidmət rolu bağlama.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" 

Konfiqurasiyaları tətbiq edək:

$ 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

Elçilərdə keşləmə səbəbindən avtorizasiya qaydalarının qüvvəyə minməsi bir neçə dəqiqə çəkə bilər. Daha sonra istifadəçilərin və moderatorların müxtəlif səviyyəli girişə malik olmasını təmin edə bilərsiniz.

Bu hissə üzrə nəticə

Ciddi olsa da, identifikasiya və avtorizasiya üçün daha sadə, səysiz, genişlənən və təhlükəsiz bir yanaşma görmüsünüzmü?

Autentifikasiya və son istifadəçinin xidmətlərə giriş icazəsi üzərində incə dənəli nəzarətə nail olmaq üçün yalnız üç Istio resursu (RbacConfig, ServiceRole və ServiceRoleBinding) tələb olunurdu.

Bundan əlavə, biz elçi xidmətlərimizdən kənarda bu məsələləri həll etdik və aşağıdakılara nail olduq:

  • təhlükəsizlik problemləri və səhvləri ehtiva edə bilən ümumi kodun miqdarının azaldılması;
  • bir son nöqtənin kənardan əlçatan olduğu və bu barədə məlumat verməyi unutduğu axmaq vəziyyətlərin sayını azaltmaq;
  • hər dəfə yeni rol və ya hüquq əlavə edildikdə bütün xidmətlərin yenilənməsi ehtiyacının aradan qaldırılması;
  • yeni xidmətlər sadə, təhlükəsiz və sürətli olaraq qalır.

Buraxılış

Istio, komandalara xidmətlərə əlavə xərclər əlavə etmədən, onları mikro statusa qaytarmadan resurslarını biznes üçün kritik vəzifələrə yönəltməyə imkan verir.

Məqalədə (üç hissədə) real layihələrdə Istio ilə işə başlamaq üçün əsas biliklər və hazır praktiki təlimatlar verilmişdir.

Tərcüməçidən PS

Bloqumuzda da oxuyun:

Mənbə: www.habr.com

Добавить комментарий