# GCP - Osnovne informacije {{#include ../../../banners/hacktricks-training.md}} ## **Hijerarhija resursa** Google Cloud koristi [Hijerarhiju resursa](https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy) koja je konceptualno slična tradicionalnom fajl sistemu. Ovo pruža logički radni tok roditelj/dete sa specifičnim tačkama vezivanja za politike i dozvole. Na visokom nivou, izgleda ovako: ``` Organization --> Folders --> Projects --> Resources ``` Virtuelna mašina (nazvana Compute Instance) je resurs. Resurs se nalazi u projektu, verovatno zajedno sa drugim Compute Instances, skladišnim kanticama itd. ## **Migracija Projekata** Moguće je **migrirati projekat bez organizacije** u organizaciju sa dozvolama `roles/resourcemanager.projectCreator` i `roles/resourcemanager.projectMover`. Ako je projekat unutar druge organizacije, potrebno je kontaktirati GCP podršku da **ih prvo premeste iz organizacije**. Za više informacija pogledajte [**ovo**](https://medium.com/google-cloud/migrating-a-project-from-one-organization-to-another-gcp-4b37a86dd9e6). ## **Politike Organizacije** Omogućavaju centralizaciju kontrole nad resursima vaše organizacije u oblaku: - Centralizujte kontrolu da **konfigurišete ograničenja** o tome kako se resursi vaše organizacije mogu koristiti. - Definišite i uspostavite **ograničenja** za vaše razvojne timove da ostanu unutar granica usklađenosti. - Pomozite vlasnicima projekata i njihovim timovima da brzo napreduju bez brige o kršenju usklađenosti. Ove politike mogu biti kreirane da **uticaju na kompletnu organizaciju, folder(e) ili projekat(e)**. Potomci ciljanog čvora hijerarhije resursa **nasleđuju politiku organizacije**. Da biste **definisali** politiku organizacije, **birate** [**ograničenje**](https://cloud.google.com/resource-manager/docs/organization-policy/overview#constraints), što je određena vrsta ograničenja prema Google Cloud usluzi ili grupi Google Cloud usluga. **Konfigurišete to ograničenje sa željenim ograničenjima**. #### Uobičajeni slučajevi korišćenja - Ograničite deljenje resursa na osnovu domena. - Ograničite korišćenje naloga za upravljanje identitetom i pristupom. - Ograničite fizičku lokaciju novokreiranih resursa. - Onemogućite kreiranje naloga za usluge. Postoji mnogo drugih ograničenja koja vam daju preciznu kontrolu nad resursima vaše organizacije. Za **više informacija, pogledajte** [**spisak svih ograničenja politike organizacije**](https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints)**.** ### **Podrazumevane Politike Organizacije**
Ovo su politike koje će Google dodati podrazumevano prilikom postavljanja vaše GCP organizacije: **Politike upravljanja pristupom** - **Kontakti sa ograničenim domenom:** Sprečava dodavanje korisnika u Esencijalne kontakte van vaših specificiranih domena. Ovo ograničava Esencijalne kontakte da dozvole samo upravljanim identitetima korisnika u vašim odabranim domenama da primaju obaveštenja sa platforme. - **Deljenje sa ograničenim domenom:** Sprečava dodavanje korisnika u IAM politike van vaših specificiranih domena. Ovo ograničava IAM politike da dozvole samo upravljanim identitetima korisnika u vašim odabranim domenama da pristupaju resursima unutar ove organizacije. - **Sprečavanje javnog pristupa:** Sprečava Cloud Storage kante da budu izložene javnosti. Ovo osigurava da programer ne može konfigurisati Cloud Storage kante da imaju neautentifikovani pristup internetu. - **Uniformni pristup na nivou kante:** Sprečava liste kontrola pristupa (ACL) na nivou objekta u Cloud Storage kantama. Ovo pojednostavljuje vaše upravljanje pristupom primenom IAM politika dosledno na svim objektima u Cloud Storage kantama. - **Zahtevajte OS prijavu:** VMs kreirane u novim projektima će imati omogućenu OS prijavu. Ovo vam omogućava da upravljate SSH pristupom vašim instancama koristeći IAM bez potrebe da kreirate i upravljate pojedinačnim SSH ključevima. **Dodatne sigurnosne politike za naloge za usluge** - **Onemogućite automatske IAM dozvole:** Sprečava da se podrazumevani App Engine i Compute Engine nalozi za usluge automatski dodeljuju IAM ulogu urednika na projektu prilikom kreiranja. Ovo osigurava da nalozi za usluge ne dobiju previše dozvola prilikom kreiranja. - **Onemogućite kreiranje ključeva naloga za usluge:** Sprečava kreiranje javnih ključeva naloga za usluge. Ovo pomaže u smanjenju rizika od izlaganja trajnih akreditiva. - **Onemogućite otpremu ključeva naloga za usluge:** Sprečava otpremu javnih ključeva naloga za usluge. Ovo pomaže u smanjenju rizika od curenja ili ponovne upotrebe materijala ključeva. **Politike konfiguracije sigurnih VPC mreža** - **Definišite dozvoljene spoljne IP adrese za VM instance:** Sprečava kreiranje Compute instanci sa javnim IP, što može da ih izloži internet saobraćaju. * **Onemogućite VM ugnježdenu virtualizaciju:** Sprečava kreiranje ugnježdenih VMs na Compute Engine VMs. Ovo smanjuje sigurnosni rizik od neproverenih ugnježdenih VMs. - **Onemogućite serijski port VM:** Sprečava pristup serijskom portu Compute Engine VMs. Ovo sprečava unos u serijski port servera koristeći Compute Engine API. * **Ograničite autorizovane mreže na Cloud SQL instancama:** Sprečava javne ili neinternetske mrežne opsege da pristupaju vašim Cloud SQL bazama podataka. - **Ograničite prosleđivanje protokola na osnovu tipa IP adrese:** Sprečava prosleđivanje VM protokola za spoljne IP adrese. * **Ograničite javni pristup IP na Cloud SQL instancama:** Sprečava kreiranje Cloud SQL instanci sa javnim IP, što može da ih izloži internet saobraćaju. - **Ograničite uklanjanje tereta zajedničkog VPC projekta:** Sprečava slučajno brisanje zajedničkih VPC host projekata. * **Postavite internu DNS postavku za nove projekte na Zonal DNS Samo:** Sprečava korišćenje nasleđene DNS postavke koja je smanjila dostupnost usluga. - **Preskočite kreiranje podrazumevane mreže:** Sprečava automatsko kreiranje podrazumevane VPC mreže i povezanih resursa. Ovo izbegava previše dozvola podrazumevanih pravila vatrozida. * **Onemogućite korišćenje VPC spoljnog IPv6:** Sprečava kreiranje spoljašnjih IPv6 podmreža, koje mogu biti izložene neovlašćenom pristupu internetu.
## **IAM Uloge** Ove su slične IAM politikama u AWS-u jer **svaka uloga sadrži skup dozvola.** Međutim, za razliku od AWS-a, ne postoji **centralizovani repozitorijum** uloga. Umesto toga, **resursi daju X pristupne uloge Y principima**, a jedini način da saznate ko ima pristup resursu je korišćenje **`get-iam-policy` metode nad tim resursom**.\ To može biti problem jer to znači da je jedini način da saznate **koje dozvole ima princip da pitate svaki resurs kome dodeljuje dozvole**, a korisnik možda nema dozvole da dobije dozvole od svih resursa. Postoje **tri tipa** uloga u IAM: - **Osnovne/Primitivne uloge**, koje uključuju **Vlasnika**, **Urednika** i **Gledaoca** uloge koje su postojale pre uvođenja IAM-a. - **Predefinisane uloge**, koje pružaju granularan pristup za određenu uslugu i kojima upravlja Google Cloud. Postoji mnogo predefinisanih uloga, možete **videti sve njih sa privilegijama koje imaju** [**ovde**](https://cloud.google.com/iam/docs/understanding-roles#predefined_roles). - **Prilagođene uloge**, koje pružaju granularan pristup prema listi dozvola koju je odredio korisnik. Postoje hiljade dozvola u GCP-u. Da biste proverili da li uloga ima dozvolu, možete [**pretražiti dozvolu ovde**](https://cloud.google.com/iam/docs/permissions-reference) i videti koje uloge je imaju. Takođe možete [**pretražiti ovde predefinisane uloge**](https://cloud.google.com/iam/docs/understanding-roles#product_specific_documentation) **koje nudi svaki proizvod.** Imajte na umu da neke **uloge** ne mogu biti dodeljene korisnicima i **samo SA-ima zbog nekih dozvola** koje sadrže.\ Pored toga, imajte na umu da će **dozvole** imati efekat samo ako su **priključene relevantnoj usluzi.** Ili proverite da li **prilagođena uloga može koristiti** [**određenu dozvolu ovde**](https://cloud.google.com/iam/docs/custom-roles-permissions-support)**.** ## Korisnici U **GCP konzoli** ne postoji upravljanje Korisnicima ili Grupama, to se obavlja u **Google Workspace**. Iako možete sinhronizovati različitog provajdera identiteta u Google Workspace. Možete pristupiti korisnicima i grupama Workspace-a na [**https://admin.google.com**](https://admin.google.com/). **MFA** može biti **prinudna** za korisnike Workspace-a, međutim, **napadač** može koristiti token za pristup GCP-u **putem CLI-a koji neće biti zaštićen MFA** (biće zaštićen MFA samo kada se korisnik prijavi da ga generiše: `gcloud auth login`). ## Grupe Kada se organizacija kreira, nekoliko grupa je **snažno preporučeno da se kreiraju.** Ako upravljate bilo kojom od njih, mogli ste kompromitovati sve ili važan deo organizacije:
GrupaFunkcija
gcp-organization-admins
(grupa ili pojedinačni nalozi potrebni za kontrolnu listu)
Upravljanje bilo kojim resursom koji pripada organizaciji. Dodelite ovu ulogu štedljivo; administratori organizacije imaju pristup svim vašim Google Cloud resursima. Alternativno, s obzirom na to da je ova funkcija visoko privilegovana, razmotrite korišćenje pojedinačnih naloga umesto kreiranja grupe.
gcp-network-admins
(potrebno za kontrolnu listu)
Kreiranje mreža, podmreža, pravila vatrozida i mrežnih uređaja kao što su Cloud Router, Cloud VPN i cloud load balancers.
gcp-billing-admins
(potrebno za kontrolnu listu)
Postavljanje računa za naplatu i praćenje njihove upotrebe.
gcp-developers
(potrebno za kontrolnu listu)
Dizajniranje, kodiranje i testiranje aplikacija.
gcp-security-admins
Usmeravanje i upravljanje sigurnosnim politikama za celu organizaciju, uključujući upravljanje pristupom i politike ograničenja organizacije. Pogledajte vodič za sigurnosne osnove Google Clouda za više informacija o planiranju vaše Google Cloud sigurnosne infrastrukture.
gcp-devopsKreiranje ili upravljanje end-to-end procesima koji podržavaju kontinuiranu integraciju i isporuku, praćenje i sistemsko obezbeđenje.
gcp-logging-admins
gcp-logging-viewers
gcp-monitor-admins
gcp-billing-viewer
(više nije podrazumevano)
Praćenje troškova na projektima. Tipični članovi su deo finansijskog tima.
gcp-platform-viewer
(više nije podrazumevano)
Pregled informacija o resursima širom Google Cloud organizacije.
gcp-security-reviewer
(više nije podrazumevano)
Pregledanje sigurnosti u oblaku.
gcp-network-viewer
(više nije podrazumevano)
Pregledanje mrežnih konfiguracija.
grp-gcp-audit-viewer
(više nije podrazumevano)
Pregledanje revizorskih logova.
gcp-scc-admin
(više nije podrazumevano)
Upravljanje Security Command Center-om.
gcp-secrets-admin
(više nije podrazumevano)
Upravljanje tajnama u Secret Manager-u.
## **Podrazumevana Politika Lozinki** - Sprovodite jake lozinke - Između 8 i 100 karaktera - Bez ponovne upotrebe - Bez isteka - Ako ljudi pristupaju Workspace-u putem treće strane, ovi zahtevi se ne primenjuju. ## **Nalozi za usluge** Ovo su principi koje **resursi** mogu **imati** **priključene** i pristupiti kako bi lako interagovali sa GCP-om. Na primer, moguće je pristupiti **auth tokenu** naloga za usluge **priključenog VM-u** u metapodacima.\ Moguće je naići na neke **sukobe** kada se koriste i **IAM i pristupne oblasti**. Na primer, vaš nalog za usluge može imati IAM ulogu `compute.instanceAdmin`, ali instanca koju ste kompromitovali ima ograničenje opsega `https://www.googleapis.com/auth/compute.readonly`. Ovo bi vam onemogućilo da napravite bilo kakve promene koristeći OAuth token koji je automatski dodeljen vašoj instanci. Slično je **IAM ulogama iz AWS-a**. Ali ne kao u AWS-u, **bilo koji** nalog za usluge može biti **priključen bilo kojoj usluzi** (ne mora to da dozvoli putem politike). ``` PROJECT_NUMBER-compute@developer.gserviceaccount.com PROJECT_ID@appspot.gserviceaccount.com ``` Međutim, takođe je moguće kreirati i pridružiti se resursima **prilagođenim servisnim nalozima**, koji će izgledati ovako: ``` SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com ``` ### **Ključevi i Tokeni** Postoje 2 glavna načina za pristup GCP-u kao servisnom nalogu: - **Putem OAuth tokena**: To su tokeni koje ćete dobiti sa mesta kao što su metapodaci ili krađom http zahteva i ograničeni su **opsegom pristupa**. - **Ključevi**: To su javni i privatni parovi ključeva koji će vam omogućiti da potpišete zahteve kao servisni nalog i čak generišete OAuth tokene za izvršavanje radnji kao servisni nalog. Ovi ključevi su opasni jer ih je teže ograničiti i kontrolisati, zato GCP preporučuje da ih ne generišete. - Imajte na umu da svaki put kada se kreira SA, **GCP generiše ključ za servisni nalog** kojem korisnik ne može pristupiti (i neće biti naveden u web aplikaciji). Prema [**ovoj temi**](https://www.reddit.com/r/googlecloud/comments/f0ospy/service_account_keys_observations/) ovaj ključ je **interno korišćen od strane GCP-a** da omogući metapodacima pristup za generisanje dostupnih OAuth tokena. ### **Opsezi pristupa** Opsezi pristupa su **priključeni generisanim OAuth tokenima** za pristup GCP API krajnjim tačkama. Oni **ograničavaju dozvole** OAuth tokena.\ To znači da ako token pripada vlasniku resursa, ali nema u opsegu tokena pristup tom resursu, token **ne može biti korišćen za (zlo)upotrebu tih privilegija**. Google zapravo [preporučuje](https://cloud.google.com/compute/docs/access/service-accounts#service_account_permissions) da se **opsezi pristupa ne koriste i da se potpuno oslanjaju na IAM**. Web portal za upravljanje zapravo to sprovodi, ali opsezi pristupa se i dalje mogu primeniti na instance koristeći prilagođene servisne naloge programatski. Možete videti koji su **opsezi** **dodeljeni** **upitom:** ```bash curl 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=' { "issued_to": "223044615559.apps.googleusercontent.com", "audience": "223044615559.apps.googleusercontent.com", "user_id": "139746512919298469201", "scope": "openid https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/sqlservice.login https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/accounts.reauth", "expires_in": 2253, "email": "username@testing.com", "verified_email": true, "access_type": "offline" } ``` Prethodni **opsezi** su oni generisani **podrazumevano** koristeći **`gcloud`** za pristup podacima. To je zato što kada koristite **`gcloud`** prvo kreirate OAuth token, a zatim ga koristite za kontaktiranje krajnjih tačaka. Najvažniji opseg od onih potencijalno je **`cloud-platform`**, što u osnovi znači da je moguće **pristupiti bilo kojoj usluzi u GCP**. Možete **pronaći listu** [**svih mogućih opsega ovde**](https://developers.google.com/identity/protocols/googlescopes)**.** Ako imate **`gcloud`** kredencijale za pretraživač, moguće je **dobiti token sa drugim opsezima,** radeći nešto poput: ```bash # Maybe you can get a user token with other scopes changing the scopes array from ~/.config/gcloud/credentials.db # Set new scopes for SDKs credentials gcloud auth application-default login --scopes=https://www.googleapis.com/auth/userinfo.email,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/sqlservice.login,https://www.googleapis.com/auth/appengine.admin,https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/accounts.reauth,https://www.googleapis.com/auth/admin.directory.user,https://www.googleapis.com/auth/admin.directory.group,https://www.googleapis.com/auth/admin.directory.domain,https://www.googleapis.com/auth/admin.directory.user # Print new token gcloud auth application-default print-access-token # To use this token with some API you might need to use curl to indicate the project header with --header "X-Goog-User-Project: " ``` ## **Terraform IAM Politike, Povezivanja i Članstva** Kao što je definisano od strane terraform-a u [https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam), korišćenjem terraform-a sa GCP postoje različiti načini za dodeljivanje pristupa resursu: - **Članstva**: Postavljate **principale kao članove uloga** **bez ograničenja** nad ulogom ili principima. Možete staviti korisnika kao člana uloge, a zatim staviti grupu kao člana iste uloge i takođe postaviti te principe (korisnika i grupu) kao članove drugih uloga. - **Povezivanja**: Nekoliko **principala može biti povezano sa ulogom**. Ti **principali mogu i dalje biti povezani ili članovi drugih uloga**. Međutim, ako je principal koji nije povezan sa ulogom postavljen kao **član povezane uloge**, sledeći put kada se **povezivanje primeni, članstvo će nestati**. - **Politike**: Politika je **autoritativna**, ukazuje na uloge i principe i tada, **ti principi ne mogu imati više uloga i te uloge ne mogu imati više principa** osim ako ta politika nije izmenjena (čak ni u drugim politikama, povezivanjima ili članstvima). Stoga, kada je uloga ili principal specificiran u politici, sve njegove privilegije su **ograničene tom politikom**. Očigledno, ovo se može zaobići u slučaju da principal dobije opciju da izmeni politiku ili dozvole za eskalaciju privilegija (kao što je kreiranje novog principa i povezivanje sa novom ulogom). ## Reference - [https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/](https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/) - [https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy](https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy) {{#include ../../../banners/hacktricks-training.md}}