Istio bilan mikroservislarga qaytish. 3-qism

Istio bilan mikroservislarga qaytish. 3-qism

Eslatma. tarjima.: Birinchi qism ushbu seriya Istio imkoniyatlari bilan tanishish va ularni amalda namoyish etishga bag'ishlangan edi, ikkinchi β€” nozik sozlangan marshrutlash va tarmoq trafigini boshqarish. Endi biz xavfsizlik haqida gaplashamiz: u bilan bog'liq asosiy funktsiyalarni namoyish qilish uchun muallif Auth0 identifikatsiya xizmatidan foydalanadi, ammo boshqa provayderlar ham xuddi shunday tarzda sozlanishi mumkin.

Biz Kubernetes klasterini yaratdik, unda biz Istio-ni va Istio imkoniyatlarini namoyish qilish uchun misol mikroservis ilovasi, Sentiment Analysis-ni joylashtirdik.

Istio yordamida biz xizmatlarimizni kichikroq saqlashga muvaffaq boΚ»ldik, chunki ular qayta urinishlar, kutish vaqti, oΚ»chirgichlar, kuzatish, monitoring kabi qatlamlarni qoΚ»llashga hojat yoΚ»q. . Bundan tashqari, biz ilg'or sinov va joylashtirish usullaridan foydalandik: A/B testi, aks ettirish va kanareykalarni chiqarish.

Istio bilan mikroservislarga qaytish. 3-qism

Yangi materialda biz biznes qiymati yo'lidagi yakuniy qatlamlar bilan shug'ullanamiz: autentifikatsiya va avtorizatsiya - va Istio-da bu haqiqiy zavq!

Istio-da autentifikatsiya va avtorizatsiya

Autentifikatsiya va avtorizatsiyadan ilhom olishimga hech qachon ishonmagan bo'lardim. Istio ushbu mavzularni qiziqarli va siz uchun ilhomlantiruvchi qilish uchun texnologiya nuqtai nazaridan nimani taklif qilishi mumkin?

Javob oddiy: Istio ushbu imkoniyatlar uchun javobgarlikni sizning xizmatlaringizdan Envoy proksi-serveriga o'tkazadi. So'rovlar xizmatlarga yetib borgunga qadar ular allaqachon autentifikatsiya qilingan va avtorizatsiya qilingan, shuning uchun siz qilishingiz kerak bo'lgan yagona narsa biznes uchun foydali kod yozishdir.

Juda yaxshi? Keling, ichkariga qaraylik!

Auth0 bilan autentifikatsiya

Identifikatsiya va kirishni boshqarish serveri sifatida biz Auth0 dan foydalanamiz, uning sinov versiyasi mavjud, foydalanish oson va menga bu yoqadi. Biroq, xuddi shu tamoyillar boshqa har qanday holatda ham qo'llanilishi mumkin OpenID Connect ilovalari: KeyCloak, IdentityServer va boshqalar.

Boshlash uchun quyidagi manzilga o'ting Auth0 portali hisobingiz bilan ijarachi yarating (ijarachi - "ijarachi", mantiqiy izolyatsiya birligi, batafsil ma'lumot uchun qarang hujjatlar - taxminan. tarjima.) va ga boring Ilovalar > Standart ilovatanlash domen, quyidagi skrinshotda ko'rsatilganidek:

Istio bilan mikroservislarga qaytish. 3-qism

Faylda ushbu domenni belgilang resource-manifests/istio/security/auth-policy.yaml (manba):

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

Bunday manba bilan, Pilot (Istio-dagi uchta asosiy Boshqarish tekisligi komponentlaridan biri - taxminan tarjimasi) Elchini soΚ»rovlarni xizmatlarga yuborishdan oldin autentifikatsiya qilish uchun sozlaydi: sa-web-app ΠΈ sa-feedback. Shu bilan birga, konfiguratsiya Elchilar xizmatiga tatbiq etilmaydi sa-frontend, old qismni autentifikatsiya qilinmagan holda qoldirishimizga imkon beradi. Siyosatni qo'llash uchun buyruqni bajaring:

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

Sahifaga qayting va so'rov yuboring - bu holat bilan tugashini ko'rasiz 401 ruxsatsiz. Endi old foydalanuvchilarni Auth0 bilan autentifikatsiya qilish uchun yo'naltiramiz.

Auth0 bilan so'rovlarni autentifikatsiya qilish

Yakuniy foydalanuvchi soΚ»rovlarini autentifikatsiya qilish uchun Auth0 da autentifikatsiya qilingan xizmatlarni (sharhlar, tafsilotlar va reytinglar) ifodalovchi API yaratishingiz kerak. API yaratish uchun quyidagi manzilga oβ€˜ting Auth0 Portal > API'lar > API yaratish va shaklni to'ldiring:

Istio bilan mikroservislarga qaytish. 3-qism

Bu erda muhim ma'lumot aniqlash, biz keyinchalik skriptda foydalanamiz. Keling, buni shunday yozamiz:

  • Tomoshabin: {YOUR_AUDIENCE}

Bizga kerak bo'lgan qolgan tafsilotlar bo'limdagi Auth0 portalida joylashgan ilovalar β€” tanlang Test ilovasi (API bilan birga avtomatik ravishda yaratilgan).

Bu erda biz yozamiz:

  • domen: {YOUR_DOMAIN}
  • Mijoz identifikatori: {YOUR_CLIENT_ID}

ga aylantiring Test ilovasi matn maydoniga Ruxsat berilgan qayta qo'ng'iroq qilish URL manzillari (qayta qo'ng'iroq qilish uchun hal qilingan URL manzillari), unda autentifikatsiya tugagandan so'ng qo'ng'iroq yuborilishi kerak bo'lgan URL manzilini belgilaymiz. Bizning holatlarimizda bu:

http://{EXTERNAL_IP}/callback

Va uchun Ruxsat berilgan tizimdan chiqish URL manzillari (tizimdan chiqish uchun ruxsat berilgan URL manzillari) qo'shing:

http://{EXTERNAL_IP}/logout

Keling, old qismga o'tamiz.

Frontend yangilanishi

Filialga o'tish auth0 ombori [istio-mastery]. Ushbu filialda foydalanuvchilarni autentifikatsiya qilish uchun Auth0 ga yo'naltirish va boshqa xizmatlarga so'rovlarda JWT tokenidan foydalanish uchun frontend kodi o'zgartiriladi. Ikkinchisi quyidagicha amalga oshiriladi (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 ijarachi ma'lumotlaridan foydalanish uchun old qismni o'zgartirish uchun oching sa-frontend/src/services/Auth.js va unda biz yuqorida yozgan qiymatlarni almashtiring (Auth.js):

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

Ilova tayyor. Kiritilgan o'zgarishlarni yaratish va qo'llashda quyidagi buyruqlarda Docker ID raqamingizni belgilang:

$ 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

Ilovani sinab ko'ring! Siz Auth0-ga yo'naltirilasiz, u erda tizimga kirishingiz (yoki ro'yxatdan o'tishingiz) kerak, shundan so'ng siz allaqachon autentifikatsiya qilingan so'rovlar yuboriladigan sahifaga qaytasiz. Agar siz maqolaning birinchi qismlarida keltirilgan buyruqlarni curl bilan sinab ko'rsangiz, kodni olasiz 401 Holat kodi, so'rovga ruxsat berilmaganligini bildiradi.

Keling, keyingi bosqichga o'tamiz - so'rovlarni avtorizatsiya qilish.

Auth0 bilan avtorizatsiya

Autentifikatsiya bizga foydalanuvchi kimligini tushunishga imkon beradi, lekin ular nimaga kirishi mumkinligini bilish uchun avtorizatsiya talab qilinadi. Istio ham buning uchun vositalarni taklif qiladi.

Misol tariqasida ikkita foydalanuvchilar guruhini yaratamiz (quyidagi diagrammaga qarang):

  • foydalanuvchilar (foydalanuvchilar) β€” faqat SA-WebApp va SA-Frontend xizmatlaridan foydalanish imkoniyati bilan;
  • Moderatorlar (moderatorlar) β€” har uchala xizmatdan foydalanish imkoniyati bilan.

Istio bilan mikroservislarga qaytish. 3-qism
Avtorizatsiya tushunchasi

Ushbu guruhlarni yaratish uchun biz Auth0 Authorization kengaytmasidan foydalanamiz va ularga turli darajadagi kirishni ta'minlash uchun Istio-dan foydalanamiz.

Auth0 avtorizatsiyasini o'rnatish va sozlash

Auth0 portalida kengaytmalarga o'ting (Kengaytmalar) va o'rnating Auth0 Avtorizatsiya. O'rnatishdan so'ng, ga o'ting Avtorizatsiya kengaytmasi, va u erda - yuqori o'ng burchakni bosish va tegishli menyu variantini tanlash orqali ijarachining konfiguratsiyasiga o'ting (Konfiguratsiya). Guruhlarni faollashtirish (Guruhlar) va qoidani nashr etish tugmasini bosing (Nashr qilish qoidasi).

Istio bilan mikroservislarga qaytish. 3-qism

Guruhlar yaratish

Avtorizatsiya kengaytmasida ga o'ting Guruhlar va guruh yarating Moderatorlar. Biz autentifikatsiya qilingan barcha foydalanuvchilarni oddiy foydalanuvchilar sifatida ko'rib chiqamiz, ular uchun qo'shimcha guruh yaratishga hojat yo'q.

Guruh tanlang Moderatorlar, bosing A'zolar qo'shish, asosiy hisobingizni qo'shing. Ba'zi foydalanuvchilarga kirish taqiqlanganligiga ishonch hosil qilish uchun hech qanday guruhsiz qoldiring. (Yangi foydalanuvchilar orqali qo'lda yaratilishi mumkin Auth0 Portal > Foydalanuvchilar > Foydalanuvchi yaratish.)

Kirish tokeniga guruh da'vosini qo'shing

Foydalanuvchilar guruhlarga qo'shilgan, ammo bu ma'lumotlar kirish tokenlarida ham aks ettirilishi kerak. OpenID Connect-ga rioya qilish va shu bilan birga bizga kerak bo'lgan guruhlarni qaytarish uchun token o'zini qo'shishi kerak odatiy da'vo. Auth0 qoidalari orqali amalga oshiriladi.

Qoida yaratish uchun Auth0 portaliga o'ting qoidalari, bosing Qoida yaratish va shablonlardan bo'sh qoidani tanlang.

Istio bilan mikroservislarga qaytish. 3-qism

Quyidagi koddan nusxa oling va uni yangi qoida sifatida saqlang Guruh da'vosini qo'shing (namespacedGroup.js):

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

nota: Ushbu kod avtorizatsiya kengaytmasida aniqlangan birinchi foydalanuvchi guruhini oladi va uni maxsus da'vo sifatida kirish tokeniga qo'shadi (Auth0 talab qilganidek, uning nom maydoni ostida).

Sahifaga qaytish qoidalari va quyidagi tartibda yozilgan ikkita qoida mavjudligini tekshiring:

  • auth0-avtorizatsiya-kengaytma
  • Guruh da'vosini qo'shing

Buyurtma muhim, chunki guruh maydoni qoidani asinxron qabul qiladi auth0-avtorizatsiya-kengaytma va undan keyin ikkinchi qoida bilan da'vo sifatida qo'shiladi. Natijada quyidagi kabi kirish tokeni olinadi:

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

Endi siz foydalanuvchi ruxsatini tekshirish uchun Envoy proksi-serverini sozlashingiz kerak, buning uchun guruh da'vodan chiqariladi (https://sa.io/group) qaytarilgan kirish tokenida. Bu maqolaning keyingi qismi uchun mavzu.

Istio-da avtorizatsiya konfiguratsiyasi

Ishlash uchun avtorizatsiya qilish uchun Istio uchun RBAC-ni yoqishingiz kerak. Buning uchun biz quyidagi konfiguratsiyadan foydalanamiz:

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" 

Izohlar:

  • 1 β€” RBAC-ni faqat ushbu sohada ko'rsatilgan xizmatlar va nomlar bo'shliqlari uchun yoqing Inclusion;
  • 2 - biz xizmatlarimiz ro'yxatini keltiramiz.

Quyidagi buyruq bilan konfiguratsiyani qo'llaymiz:

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

Barcha xizmatlar endi rolga asoslangan kirishni boshqarishni talab qiladi. Boshqacha qilib aytadigan bo'lsak, barcha xizmatlarga kirish taqiqlangan va javobga olib keladi RBAC: access denied. Keling, ruxsat berilgan foydalanuvchilarga kirishga ruxsat beraylik.

Oddiy foydalanuvchilar uchun kirish konfiguratsiyasi

Barcha foydalanuvchilar SA-Frontend va SA-WebApp xizmatlaridan foydalanishlari kerak. Quyidagi Istio resurslaridan foydalangan holda amalga oshirildi:

  • Xizmat roli β€” foydalanuvchining huquqlarini belgilaydi;
  • ServiceRoleBinding β€” ushbu ServiceRole kimga tegishli ekanligini aniqlaydi.

Oddiy foydalanuvchilar uchun biz ba'zi xizmatlarga kirishga ruxsat beramiz (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: ["*"]

Va orqali regular-user-binding Barcha sahifaga tashrif buyuruvchilarga ServiceRole ilovasini qo'llang (muntazam foydalanuvchi-xizmat-rol-bog'lash.yaml):

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

"Barcha foydalanuvchilar" autentifikatsiya qilinmagan foydalanuvchilar ham SA WebApp ilovasiga kirish huquqiga ega bo'lishini anglatadimi? Yo'q, siyosat JWT tokenining haqiqiyligini tekshiradi.

Keling, konfiguratsiyalarni qo'llaymiz:

$ 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 uchun kirish konfiguratsiyasi

Moderatorlar uchun biz barcha xizmatlarga kirishni yoqmoqchimiz (mod-service-role.yaml):

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

Lekin biz bunday huquqlarni faqat kirish tokenida daΚΌvo mavjud boΚ»lgan foydalanuvchilar uchun istaymiz https://sa.io/group ma'nosi bilan Moderators (mod-xizmat-rol-bog'lash.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" 

Keling, konfiguratsiyalarni qo'llaymiz:

$ 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

Elchilarda keshlanganligi sababli avtorizatsiya qoidalari kuchga kirishi uchun bir necha daqiqa vaqt ketishi mumkin. Keyin foydalanuvchilar va moderatorlarning turli darajadagi kirish huquqiga ega ekanligiga ishonch hosil qilishingiz mumkin.

Ushbu qism bo'yicha xulosa

Jiddiy ravishda, autentifikatsiya va avtorizatsiya uchun oddiyroq, oson, kengaytiriladigan va xavfsiz yondashuvni ko'rganmisiz?

Autentifikatsiya va oxirgi foydalanuvchining xizmatlarga kirishini avtorizatsiya qilish ustidan nozik nazoratga erishish uchun faqat uchta Istio resurslari (RbacConfig, ServiceRole va ServiceRoleBinding) talab qilingan.

Bundan tashqari, biz vakillik xizmatlarimiz orqali ushbu masalalarni hal qildik va quyidagilarga erishdik:

  • xavfsizlik muammolari va xatolarni o'z ichiga olishi mumkin bo'lgan umumiy kod miqdorini kamaytirish;
  • bitta so'nggi nuqta tashqaridan kirish mumkin bo'lgan va bu haqda xabar berishni unutgan ahmoqona holatlar sonini kamaytirish;
  • har safar yangi rol yoki huquq qo'shilganda barcha xizmatlarni yangilash zaruratini bartaraf etish;
  • yangi xizmatlar oddiy, xavfsiz va tezkor bo'lib qoladi.

xulosa

Istio jamoalarga xizmatlarga qo'shimcha xarajatlar qo'shmasdan, ularni mikro maqomga qaytarmasdan, o'z resurslarini biznes uchun muhim vazifalarga yo'naltirish imkonini beradi.

Maqolada (uch qismdan iborat) Istio-ni haqiqiy loyihalarda boshlash uchun asosiy bilimlar va tayyor amaliy ko'rsatmalar berilgan.

Tarjimondan PS

Shuningdek, bizning blogimizda o'qing:

Manba: www.habr.com

a Izoh qo'shish