# AWS - KMS Enum

{{#include ../../../banners/hacktricks-training.md}}

## KMS - Usluga upravljanja ključevima

AWS Usluga upravljanja ključevima (AWS KMS) se predstavlja kao upravljana usluga, pojednostavljujući proces za korisnike da **kreiraju i upravljaju glavnim korisničkim ključevima** (CMK). Ovi CMK-ovi su ključni za enkripciju korisničkih podataka. Značajna karakteristika AWS KMS-a je da su CMK-ovi pretežno **zaštićeni hardverskim bezbednosnim modulima** (HSM), što poboljšava zaštitu enkripcijskih ključeva.

KMS koristi **simetričnu kriptografiju**. Ovo se koristi za **enkripciju informacija u mirovanju** (na primer, unutar S3). Ako treba da **enkriptuješ informacije u prenosu**, moraš koristiti nešto poput **TLS**.

KMS je **usluga specifična za region**.

**Administratori u Amazonu nemaju pristup tvojim ključevima**. Ne mogu da povrate tvoje ključeve i ne pomažu ti u enkripciji tvojih ključeva. AWS jednostavno upravlja operativnim sistemom i osnovnom aplikacijom, a na nama je da upravljamo našim enkripcijskim ključevima i upravljamo kako se ti ključevi koriste.

**Glavni korisnički ključevi** (CMK): Mogu enkriptovati podatke do 4KB veličine. Obično se koriste za kreiranje, enkripciju i dekripciju DEK-ova (Ključevi za enkripciju podataka). Zatim se DEK-ovi koriste za enkripciju podataka.

Glavni korisnički ključ (CMK) je logička reprezentacija glavnog ključa u AWS KMS-u. Pored identifikatora glavnog ključa i drugih metapodataka, uključujući datum kreiranja, opis i stanje ključa, **CMK sadrži materijal ključa koji se koristi za enkripciju i dekripciju podataka**. Kada kreiraš CMK, po defaultu, AWS KMS generiše materijal ključa za taj CMK. Međutim, možeš izabrati da kreiraš CMK bez materijala ključa i zatim uvezeš svoj materijal ključa u taj CMK.

Postoje 2 tipa glavnih ključeva:

- **AWS upravljani CMK-ovi: Koriste ih druge usluge za enkripciju podataka**. Koristi ih usluga koja ih je kreirala u regionu. Kreiraju se prvi put kada implementiraš enkripciju u toj usluzi. Rotiraju se svake 3 godine i nije moguće promeniti ih.
- **CMK-ovi koje upravlja korisnik**: Fleksibilnost, rotacija, konfigurisani pristup i politika ključeva. Omogućavanje i onemogućavanje ključeva.

**Enkripcija u omotu** u kontekstu Usluge upravljanja ključevima (KMS): Dvostepeni hijerarhijski sistem za **enkripciju podataka sa ključem podataka i zatim enkripciju ključa podataka sa glavnim ključem**.

### Politike ključeva

Ove definišu **ko može koristiti i pristupiti ključu u KMS-u**.

Po **defaultu:**

- Daje **IAM-u** **AWS naloga koji poseduje KMS ključ pristup** za upravljanje pristupom KMS ključu putem IAM-a.

Za razliku od drugih politika resursa AWS-a, politika **KMS ključa ne daje automatski dozvolu bilo kojem od principala naloga**. Da bi se dala dozvola administratorima naloga, **politika ključa mora uključivati eksplicitnu izjavu** koja pruža ovu dozvolu, poput ove.

- Bez omogućavanja naloga(`"AWS": "arn:aws:iam::111122223333:root"`) IAM dozvole neće raditi.

- **Omogućava nalogu da koristi IAM politike** za omogućavanje pristupa KMS ključu, pored politike ključa.

**Bez ove dozvole, IAM politike koje omogućavaju pristup ključu su neefikasne**, iako su IAM politike koje odbijaju pristup ključu i dalje efikasne.

- **Smanjuje rizik od toga da ključ postane neuredan** dajući dozvolu za kontrolu pristupa administratorima naloga, uključujući korisnika root naloga, koji ne može biti obrisan.

**Primer default politike**:
```json
{
"Sid": "Enable IAM policies",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "kms:*",
"Resource": "*"
}
```
> [!WARNING]
> Ako je **nalog dozvoljen** (`"arn:aws:iam::111122223333:root"`), **principal** iz naloga **će i dalje trebati IAM dozvole** da koristi KMS ključ. Međutim, ako je **ARN** uloge, na primer, **specifično dozvoljen** u **Politici ključeva**, ta uloga **ne treba IAM dozvole**.

<details>

<summary>Detalji politike</summary>

Osobine politike:

- Dokument zasnovan na JSON-u
- Resurs --> Pogođeni resursi (može biti "\*")
- Akcija --> kms:Encrypt, kms:Decrypt, kms:CreateGrant ... (dozvole)
- Efekat --> Dozvoli/Zabraniti
- Principal --> arn pogođen
- Uslovi (opciono) --> Uslov za davanje dozvola

Grantovi:

- Dozvoljava delegiranje vaših dozvola drugom AWS principalu unutar vašeg AWS naloga. Morate ih kreirati koristeći AWS KMS API-je. Može se naznačiti identifikator CMK, principal koji dobija i potrebni nivo operacije (Decrypt, Encrypt, GenerateDataKey...)
- Nakon što je grant kreiran, izdaju se GrantToken i GrantID

**Pristup**:

- Putem **politike ključeva** -- Ako ovo postoji, ovo ima **prioritet** nad IAM politikom
- Putem **IAM politike**
- Putem **grantova**

</details>

### Administratori ključeva

Administrator ključeva po defaultu:

- Ima pristup za upravljanje KMS-om, ali ne i za enkripciju ili dekripciju podataka
- Samo IAM korisnici i uloge mogu biti dodati na listu Administratora ključeva (ne grupe)
- Ako se koristi eksterni CMK, Administratori ključeva imaju dozvolu da uvezu materijal ključa

### Rotacija CMK-ova

- Što duže isti ključ ostane na mestu, to više podataka se enkriptuje tim ključem, a ako taj ključ bude kompromitovan, šira oblast podataka je u riziku. Pored toga, što duže ključ bude aktivan, verovatnoća da će biti kompromitovan raste.
- **KMS rotira korisničke ključeve svake 365 dana** (ili možete izvršiti proces ručno kad god želite) i **ključeve koje upravlja AWS svake 3 godine** i ovaj put se ne može promeniti.
- **Stariji ključevi se čuvaju** za dekripciju podataka koji su enkriptovani pre rotacije
- U slučaju kompromitacije, rotacija ključa neće ukloniti pretnju jer će biti moguće dekriptovati sve podatke enkriptovane sa kompromitovanim ključem. Međutim, **novi podaci će biti enkriptovani novim ključem**.
- Ako je **CMK** u stanju **onemogućeno** ili **na čekanju** **brisanja**, KMS **neće izvršiti rotaciju ključa** dok se CMK ponovo ne omogući ili brisanje ne otkaže.

#### Ručna rotacija

- **Novi CMK treba da bude kreiran**, zatim se kreira novi CMK-ID, tako da ćete morati da **ažurirate** svaku **aplikaciju** da **referencira** novi CMK-ID.
- Da biste ovaj proces olakšali, možete **koristiti alias za referenciranje ID ključa** i zatim samo ažurirati ključ na koji alias se odnosi.
- Morate **čuvati stare ključeve za dekripciju starih fajlova** enkriptovanih tim ključem.

Možete uvesti ključeve iz vaše lokalne infrastrukture ključeva.

### Druge relevantne KMS informacije

KMS se naplaćuje po broju zahteva za enkripciju/dekripciju primljenih od svih usluga mesečno.

KMS ima potpunu reviziju i usklađenost **integraciju sa CloudTrail**; ovde možete revizirati sve promene izvršene na KMS-u.

Sa KMS politikom možete učiniti sledeće:

- Ograničiti ko može kreirati ključeve podataka i koje usluge imaju pristup korišćenju ovih ključeva
- Ograničiti pristup sistemima samo za enkripciju, samo za dekripciju ili oboje
- Definisati da omogućite sistemima pristup ključevima širom regiona (iako se ne preporučuje jer će kvar u regionu koji hostuje KMS uticati na dostupnost sistema u drugim regionima).

Ne možete sinhronizovati ili premestiti/kopirati ključeve između regiona; možete samo definisati pravila za omogućavanje pristupa između regiona.

### Enumeracija
```bash
aws kms list-keys
aws kms list-key-policies --key-id <id>
aws kms list-grants --key-id <id>
aws kms describe-key --key-id <id>
aws kms get-key-policy --key-id <id> --policy-name <name> # Default policy name is "default"
aws kms describe-custom-key-stores

# This script enumerates AWS KMS keys across all available regions.
for region in $(aws ec2 describe-regions --query "Regions[].RegionName" --output text); do
echo -e "\n### Region: $region ###"; aws kms list-keys --region $region --query "Keys[].KeyId" --output text | tr '\t' '\n';
done
```
### Privesc

{{#ref}}
../aws-privilege-escalation/aws-kms-privesc.md
{{#endref}}

### Post Exploitation

{{#ref}}
../aws-post-exploitation/aws-kms-post-exploitation.md
{{#endref}}

### Persistence

{{#ref}}
../aws-persistence/aws-kms-persistence.md
{{#endref}}

## References

- [https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html)

{{#include ../../../banners/hacktricks-training.md}}
