# 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 <a href="#common_use_cases" id="common_use_cases"></a>

- 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**

<details>

<summary>Ovo su politike koje će Google dodati podrazumevano prilikom postavljanja vaše GCP organizacije:</summary>

**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.

</details>

## **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 <a href="#default-credentials" id="default-credentials"></a>

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:

<table data-header-hidden><thead><tr><th width="299.3076923076923"></th><th></th></tr></thead><tbody><tr><td><strong>Grupa</strong></td><td><strong>Funkcija</strong></td></tr><tr><td><strong><code>gcp-organization-admins</code></strong><br><em>(grupa ili pojedinačni nalozi potrebni za kontrolnu listu)</em></td><td>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.</td></tr><tr><td><strong><code>gcp-network-admins</code></strong><br><em>(potrebno za kontrolnu listu)</em></td><td>Kreiranje mreža, podmreža, pravila vatrozida i mrežnih uređaja kao što su Cloud Router, Cloud VPN i cloud load balancers.</td></tr><tr><td><strong><code>gcp-billing-admins</code></strong><br><em>(potrebno za kontrolnu listu)</em></td><td>Postavljanje računa za naplatu i praćenje njihove upotrebe.</td></tr><tr><td><strong><code>gcp-developers</code></strong><br><em>(potrebno za kontrolnu listu)</em></td><td>Dizajniranje, kodiranje i testiranje aplikacija.</td></tr><tr><td><strong><code>gcp-security-admins</code></strong><br></td><td>Usmeravanje i upravljanje sigurnosnim politikama za celu organizaciju, uključujući upravljanje pristupom i <a href="https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints">politike ograničenja organizacije</a>. Pogledajte <a href="https://cloud.google.com/architecture/security-foundations/authentication-authorization#users_and_groups">vodič za sigurnosne osnove Google Clouda</a> za više informacija o planiranju vaše Google Cloud sigurnosne infrastrukture.</td></tr><tr><td><strong><code>gcp-devops</code></strong></td><td>Kreiranje ili upravljanje end-to-end procesima koji podržavaju kontinuiranu integraciju i isporuku, praćenje i sistemsko obezbeđenje.</td></tr><tr><td><strong><code>gcp-logging-admins</code></strong></td><td></td></tr><tr><td><strong><code>gcp-logging-viewers</code></strong></td><td></td></tr><tr><td><strong><code>gcp-monitor-admins</code></strong></td><td></td></tr><tr><td><strong><code>gcp-billing-viewer</code></strong><br><em>(više nije podrazumevano)</em></td><td>Praćenje troškova na projektima. Tipični članovi su deo finansijskog tima.</td></tr><tr><td><strong><code>gcp-platform-viewer</code></strong><br><em>(više nije podrazumevano)</em></td><td>Pregled informacija o resursima širom Google Cloud organizacije.</td></tr><tr><td><strong><code>gcp-security-reviewer</code></strong><br><em>(više nije podrazumevano)</em></td><td>Pregledanje sigurnosti u oblaku.</td></tr><tr><td><strong><code>gcp-network-viewer</code></strong><br><em>(više nije podrazumevano)</em></td><td>Pregledanje mrežnih konfiguracija.</td></tr><tr><td><strong><code>grp-gcp-audit-viewer</code></strong><br><em>(više nije podrazumevano)</em></td><td>Pregledanje revizorskih logova.</td></tr><tr><td><strong><code>gcp-scc-admin</code></strong><br><em>(više nije podrazumevano)</em></td><td>Upravljanje Security Command Center-om.</td></tr><tr><td><strong><code>gcp-secrets-admin</code></strong><br><em>(više nije podrazumevano)</em></td><td>Upravljanje tajnama u Secret Manager-u.</td></tr></tbody></table>

## **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=<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: <project-name>"
```
## **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}}
