# 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:
| |
|---|
| Grupa | Funkcija |
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-devops | Kreiranje 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}}