ProHoster > Blog > uprava > Uvod u autorizaciju Kubernetesa tvrtke Hashicorp Consul
Uvod u autorizaciju Kubernetesa tvrtke Hashicorp Consul
Tako je, nakon puštanja na slobodu Hashicorp Consul 1.5.0 početkom svibnja 2019. u Consulu možete autorizirati aplikacije i usluge koje se izvode u Kubernetesu nativno.
U ovom vodiču ćemo kreirati korak po korak POC (Dokaz koncepta, PoC) koji demonstrira ovu novu značajku. Od vas se očekuje da imate osnovno znanje o Kubernetesu i Hashicorpovom Consulu. Iako možete koristiti bilo koju platformu u oblaku ili lokalno okruženje, u ovom ćemo vodiču koristiti Googleovu platformu u oblaku.
Pregled
Ako odemo na Konzulska dokumentacija o načinu autorizacije, dobit ćemo brzi pregled njegove namjene i slučaja uporabe, kao i neke tehničke detalje i opći pregled logike. Toplo preporučam da ga pročitate barem jednom prije nego što nastavite, jer ću sada sve objašnjavati i žvakati.
Dijagram 1: Službeni pregled metode ovlaštenja konzula
Naravno, ondje ima korisnih informacija, ali nema vodiča o tome kako ih sve zapravo koristiti. Dakle, kao svaka zdrava osoba, pretražujete Internet u potrazi za smjernicama. A onda... Ne uspijete. Događa se. Popravimo ovo.
Prije nego što prijeđemo na kreiranje našeg POC-a, vratimo se pregledu Consulovih metoda autorizacije (Dijagram 1) i doradimo ga u kontekstu Kubernetesa.
arhitektura
U ovom vodiču ćemo kreirati Consul poslužitelj na zasebnom računalu koji će komunicirati s Kubernetes klasterom s instaliranim Consul klijentom. Zatim ćemo kreirati našu lažnu aplikaciju u modulu i koristiti našu konfiguriranu metodu autorizacije za čitanje iz naše Consul pohrane ključeva/vrijednosti.
Donji dijagram detaljno opisuje arhitekturu koju stvaramo u ovom vodiču, kao i logiku iza metode autorizacije, koja će biti objašnjena kasnije.
Dijagram 2: Pregled metode autorizacije Kubernetesa
Kratka napomena: poslužitelj Consul ne mora živjeti izvan Kubernetes klastera da bi ovo funkcioniralo. Ali da, može i ovako i onako.
Dakle, uzimajući Consul pregledni dijagram (Dijagram 1) i primjenjujući Kubernetes na njega, dobivamo gornji dijagram (Dijagram 2), a logika je sljedeća:
Svaki pod imat će priložen račun usluge koji sadrži JWT token koji je generirao i poznat Kubernetesu. Ovaj je token također umetnut u pod prema zadanim postavkama.
Naša aplikacija ili usluga unutar modula pokreće naredbu za prijavu našem Consul klijentu. Zahtjev za prijavu također će sadržavati naš token i ime posebno stvorena način autorizacije (tip Kubernetes). Ovaj korak #2 odgovara koraku 1 Consul dijagrama (shema 1).
Naš Consul klijent će zatim proslijediti ovaj zahtjev našem Consul serveru.
MAGIJA! Ovdje Consul poslužitelj provjerava autentičnost zahtjeva, prikuplja informacije o identitetu zahtjeva i uspoređuje ga sa svim povezanim unaprijed definiranim pravilima. Ispod je još jedan dijagram koji to ilustrira. Ovaj korak odgovara koracima 3, 4 i 5 preglednog dijagrama Consul (Dijagram 1).
Naš Consul poslužitelj generira Consul token s dopuštenjima u skladu s našim određenim pravilima metode autorizacije (koja smo definirali) u vezi s identitetom podnositelja zahtjeva. Zatim će poslati taj token natrag. Ovo odgovara koraku 6 Consul dijagrama (Dijagram 1).
Naš klijent Consul prosljeđuje token aplikaciji ili usluzi koja zahtijeva.
Naša aplikacija ili usluga sada može koristiti ovaj Consul token za komunikaciju s našim Consul podacima, kako je određeno povlasticama tokena.
Čarolija je otkrivena!
Za one od vas koji nisu zadovoljni samo zecom iz šešira i žele znati kako to funkcionira... dopustite mi da vam "pokažem koliko duboko zečja rupa".
Kao što je ranije spomenuto, naš "čarobni" korak (Slika 2: Korak 4) je mjesto gdje Consul poslužitelj provjerava autentičnost zahtjeva, prikuplja informacije o zahtjevu i uspoređuje ih sa svim povezanim unaprijed definiranim pravilima. Ovaj korak odgovara koracima 3, 4 i 5 preglednog dijagrama Consul (Dijagram 1). Ispod je dijagram (Dijagram 3), čija je svrha jasno pokazati što se zapravo događa ispod haube specifična Kubernetes metoda autorizacije.
Dijagram 3: Magija je otkrivena!
Kao početnu točku, naš klijent Consul prosljeđuje zahtjev za prijavu našem poslužitelju Consul s tokenom Kubernetes računa i specifičnim nazivom instance metode autorizacije koja je ranije stvorena. Ovaj korak odgovara koraku 3 u prethodnom objašnjenju kruga.
Sada Consul server (ili voditelj) treba provjeriti autentičnost primljenog tokena. Stoga će konzultirati Kubernetes klaster (putem Consul klijenta) i uz odgovarajuće dozvole saznat ćemo je li token originalan i kome pripada.
Potvrđeni zahtjev se zatim vraća voditelju Consula, a Consul poslužitelj traži instancu metode autorizacije s navedenim imenom iz zahtjeva za prijavu (i vrste Kubernetes).
Vođa konzula utvrđuje navedenu instancu metode autorizacije (ako je pronađena) i čita skup obvezujućih pravila koja su joj priložena. Zatim čita ta pravila i uspoređuje ih s potvrđenim atributima identiteta.
TA-da! Prijeđimo na korak 5 u prethodnom objašnjenju kruga.
Pokrenite Consul-poslužitelj na običnom virtualnom računalu
Od sada ću uglavnom davati upute o tome kako izraditi ovaj POC, često u točkama, bez potpunih objašnjenja rečenice. Također, kao što je ranije navedeno, koristit ću GCP za stvaranje cijele infrastrukture, ali istu infrastrukturu možete stvoriti bilo gdje drugdje.
Pokrenite virtualni stroj (instanca/poslužitelj).
Napravite pravilo za vatrozid (sigurnosna grupa u AWS-u):
Volim dodijeliti isto ime stroja i pravilu i mrežnoj oznaci, u ovom slučaju "skywiz-consul-server-poc".
Pronađite IP adresu svog lokalnog računala i dodajte je na popis izvornih IP adresa kako bismo mogli pristupiti korisničkom sučelju (UI).
Otvorite priključak 8500 za korisničko sučelje. Pritisnite Stvori. Uskoro ćemo ponovo promijeniti ovaj vatrozid [link].
Instanci dodajte pravilo vatrozida. Vratite se na VM nadzornu ploču na Consul Serveru i dodajte “skywiz-consul-server-poc” u polje mrežnih oznaka. Pritisnite Spremi.
Instalirajte Consul na virtualni stroj, provjerite ovdje. Ne zaboravite da vam je potrebna Consul verzija ≥ 1.5 [link]
Kreirajmo jedan čvor Consul - konfiguracija je sljedeća.
groupadd --system consul
useradd -s /sbin/nologin --system -g consul consul
mkdir -p /var/lib/consul
chown -R consul:consul /var/lib/consul
chmod -R 775 /var/lib/consul
mkdir /etc/consul.d
chown -R consul:consul /etc/consul.d
Za detaljniji vodič o instaliranju Consula i postavljanju klastera od 3 čvora, pogledajte здесь.
Napravite datoteku /etc/consul.d/agent.json na sljedeći način [link]:
consul agent
-server
-ui
-client 0.0.0.0
-data-dir=/var/lib/consul
-bootstrap-expect=1
-config-dir=/etc/consul.d
Trebali biste vidjeti hrpu izlaza i završiti s "... ažuriranje blokirano ACL-ovima."
Pronađite vanjsku IP adresu Consul poslužitelja i otvorite preglednik s ovom IP adresom na portu 8500. Provjerite otvara li se korisničko sučelje.
Pokušajte dodati par ključ/vrijednost. Mora da postoji greška. To je zato što smo učitali Consul poslužitelj s ACL-om i onemogućili sva pravila.
Vratite se u svoju ljusku na Consul poslužitelju i pokrenite proces u pozadini ili na neki drugi način da ga pokrenete i unesite sljedeće:
consul acl bootstrap
Pronađite vrijednost "SecretID" i vratite se na korisničko sučelje. Na kartici ACL unesite tajni ID tokena koji ste upravo kopirali. Kopirajte SecretID negdje drugdje, trebat će nam kasnije.
Sada dodajte par ključ/vrijednost. Za ovaj POC dodajte sljedeće: ključ: “custom-ns/test_key”, vrijednost: “Ja sam u mapi custom-ns!”
Pokretanje Kubernetes klastera za našu aplikaciju s Consul klijentom kao Daemonsetom
Napravite K8s (Kubernetes) klaster. Stvorit ćemo ga u istoj zoni kao i poslužitelj radi bržeg pristupa i tako možemo koristiti istu podmrežu za jednostavno povezivanje s internim IP adresama. Nazvat ćemo ga "skywiz-aplikacija-s-konzulom-klijent-poc".
Kao usputna napomena, ovdje je dobar vodič na koji sam naišao dok sam postavljao POC Consul klaster s Consul Connectom.
Također ćemo koristiti Hashicorp helm chart s proširenom datotekom vrijednosti.
Instalirajte i konfigurirajte Helm. Konfiguracijski koraci:
Koristite sljedeću datoteku vrijednosti (imajte na umu da sam većinu onemogućio):
### poc-helm-consul-values.yaml
global:
enabled: false
image: "consul:latest"
# Expose the Consul UI through this LoadBalancer
ui:
enabled: false
# Allow Consul to inject the Connect proxy into Kubernetes containers
connectInject:
enabled: false
# Configure a Consul client on Kubernetes nodes. GRPC listener is required for Connect.
client:
enabled: true
join: ["<PRIVATE_IP_CONSUL_SERVER>"]
extraConfig: |
{
"acl" : {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
# Minimal Consul configuration. Not suitable for production.
server:
enabled: false
# Sync Kubernetes and Consul services
syncCatalog:
enabled: false
Primijeni dijagram kormila:
./helm install -f poc-helm-consul-values.yaml ./consul-helm - name skywiz-app-with-consul-client-poc
Kada se pokuša pokrenuti, trebat će mu dozvole za Consul poslužitelj, pa ih dodamo.
Obratite pažnju na "Pod Address Range" koji se nalazi na nadzornoj ploči klastera i pogledajte naše pravilo vatrozida "skywiz-consul-server-poc".
Dodajte raspon adresa za modul na popis IP adresa i otvorite portove 8301 i 8300.
Idite na Consul UI i nakon nekoliko minuta vidjet ćete da se naš klaster pojavljuje na kartici čvorova.
Konfiguriranje metode autorizacije integracijom Consula s Kubernetesom
Vratite se na ljusku poslužitelja Consul i izvezite token koji ste ranije spremili:
export CONSUL_HTTP_TOKEN=<SecretID>
Trebat će nam informacije iz našeg Kubernetes klastera za stvaranje instance auth metode:
kubernetes-domaćin
kubectl get endpoints | grep kubernetes
kubernetes-uslužni-račun-jwt
kubectl get sa <helm_deployment_name>-consul-client -o yaml | grep "- name:"
kubectl get secret <secret_name_from_prev_command> -o yaml | grep token:
Token je base64 kodiran, pa ga dešifrirajte koristeći svoj omiljeni alat [link]
kubernetes-ca-cert
kubectl get secret <secret_name_from_prev_command> -o yaml | grep ca.crt:
Uzmite certifikat “ca.crt” (nakon base64 dekodiranja) i zapišite ga u datoteku “ca.crt”.
Sada instancirajte metodu autentifikacije, zamjenjujući rezervirana mjesta vrijednostima koje ste upravo primili.
consul acl auth-method create
-type "kubernetes"
-name "auth-method-skywiz-consul-poc"
-description "This is an auth method using kubernetes for the cluster skywiz-app-with-consul-client-poc"
-kubernetes-host "<k8s_endpoint_retrieved earlier>"
[email protected]
-kubernetes-service-account-
jwt="<decoded_token_retrieved_earlier>"
Zatim moramo stvoriti pravilo i priložiti ga novoj ulozi. Za ovaj dio možete koristiti Consul UI, ali mi ćemo koristiti naredbeni redak.
Zatim upotrijebite sljedeću ugrađenu naredbu za stvaranje configmapa [link]. Imajte na umu da se pozivamo na naziv naše usluge, zamijenite ga ako je potrebno.
Stvorite još nekoliko ključnih mapa s istim ključem najviše razine (tj. /sample_key) i vrijednost po vašem izboru. Stvorite odgovarajuće politike i uloge za nove ključne staze. Poslije ćemo napraviti uvezivanje.
Test prilagođenog prostora imena:
Kreirajmo vlastiti prostor imena:
kubectl create namespace custom-ns
Kreirajmo pod u našem novom prostoru imena. Napišite konfiguraciju za pod.
Možete base64 dekodirati "Vrijednost" i vidjeti da odgovara vrijednosti u custom-ns/test_key u korisničkom sučelju. Ako ste koristili istu vrijednost iznad u ovom vodiču, vaša kodirana vrijednost bi bila IkknbSBpbiB0aGUgY3VzdG9tLW5zIGZvbGRlciEi.
Test računa korisničke usluge:
Stvorite prilagođeni ServiceAccount pomoću sljedeće naredbe [link].
Dopuštenje odbijeno. Oh, zaboravili smo dodati nova pravila obvezujuća s odgovarajućim dopuštenjima, učinimo to sada.
Ponovite prethodne korake iznad:
a) Napravite identičnu Politiku za prefiks “custom-sa/”.
b) Stvorite ulogu, nazovite je "custom-sa-role"
c) Priložite Politiku ulozi.
Napravite povezivanje pravila (moguće samo iz cli/api). Obratite pažnju na različito značenje zastavice za odabir.
consul acl binding-rule create
-method=auth-method-skywiz-consul-poc
-bind-type=role
-bind-name='custom-sa-role'
-selector='serviceaccount.name=="custom-sa"'
Ponovno se prijavite iz spremnika "poc-ubuntu-custom-sa". Uspjeh!
Također možete osigurati da ovaj token ne dopušta pristup kv u "custom-ns/". Samo ponovite gornju naredbu nakon što ste "custom-sa" zamijenili prefiksom "custom-ns".
Dopuštenje odbijeno.
Primjer preklapanja:
Vrijedno je napomenuti da će sva preslikavanja koja obvezuju pravila biti dodana tokenu s ovim pravima.
Naš spremnik "poc-ubuntu-custom-sa" nalazi se u zadanom prostoru imena - pa ga upotrijebimo za drugačije vezanje pravila.
Ponovite prethodne korake:
a) Napravite identična pravila za prefiks ključa "default/".
b) Napravite ulogu, nazovite je "default-ns-role"
c) Priložite Politiku ulozi.
Stvaranje povezivanja pravila (moguće samo iz cli/api)
consul acl binding-rule create
-method=auth-method-skywiz-consul-poc
-bind-type=role
-bind-name='default-ns-role'
-selector='serviceaccount.namespace=="default"'
Vratite se na naš spremnik "poc-ubuntu-custom-sa" i pokušajte pristupiti kv stazi "default/".
Dopuštenje odbijeno.
Navedene vjerodajnice za svaki token možete vidjeti u korisničkom sučelju pod ACL > Tokeni. Kao što vidite, naš trenutni token ima samo jednu "prilagođenu-sa-ulogu" pridruženu sebi. Token koji trenutačno koristimo generiran je kad smo se prijavili i postojalo je samo jedno vezanje pravila koje je tada odgovaralo. Moramo se ponovno prijaviti i koristiti novi token.
Provjerite možete li čitati s kv staza "custom-sa/" i "default/".
Uspjeh!
To je zato što naš "poc-ubuntu-custom-sa" odgovara vezivanju pravila "custom-sa" i "default-ns".
Zaključak
Upravljanje TTL tokenom?
U vrijeme pisanja ovog teksta ne postoji integrirani način za određivanje TTL-a za tokene generirane ovom metodom autorizacije. Bila bi to fantastična prilika za sigurnu automatizaciju konzulske autorizacije.
Postoji opcija za ručno stvaranje tokena s TTL-om: