# AWS - KMS Enum

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

## KMS - Key Management Service

AWS Key Management Service (AWS KMS) è presentato come un servizio gestito, semplificando il processo per gli utenti di **creare e gestire le chiavi master dei clienti** (CMK). Queste CMK sono fondamentali per la crittografia dei dati degli utenti. Una caratteristica notevole di AWS KMS è che le CMK sono prevalentemente **protette da moduli di sicurezza hardware** (HSM), migliorando la protezione delle chiavi di crittografia.

KMS utilizza **crittografia simmetrica**. Questa viene utilizzata per **crittografare le informazioni a riposo** (ad esempio, all'interno di un S3). Se hai bisogno di **crittografare le informazioni in transito**, devi utilizzare qualcosa come **TLS**.

KMS è un **servizio specifico per regione**.

**Gli amministratori di Amazon non hanno accesso alle tue chiavi**. Non possono recuperare le tue chiavi e non ti aiutano con la crittografia delle tue chiavi. AWS semplicemente amministra il sistema operativo e l'applicazione sottostante; spetta a noi amministrare le nostre chiavi di crittografia e gestire come vengono utilizzate.

**Chiavi Master dei Clienti** (CMK): Possono crittografare dati fino a 4KB di dimensione. Sono tipicamente utilizzate per creare, crittografare e decrittografare le DEK (Data Encryption Keys). Poi le DEK vengono utilizzate per crittografare i dati.

Una chiave master dei clienti (CMK) è una rappresentazione logica di una chiave master in AWS KMS. Oltre agli identificatori della chiave master e ad altri metadati, inclusi la data di creazione, la descrizione e lo stato della chiave, una **CMK contiene il materiale della chiave utilizzato per crittografare e decrittografare i dati**. Quando crei una CMK, per impostazione predefinita, AWS KMS genera il materiale della chiave per quella CMK. Tuttavia, puoi scegliere di creare una CMK senza materiale della chiave e poi importare il tuo materiale della chiave in quella CMK.

Ci sono 2 tipi di chiavi master:

- **CMK gestite da AWS: Utilizzate da altri servizi per crittografare i dati**. Viene utilizzata dal servizio che l'ha creata in una regione. Vengono create la prima volta che implementi la crittografia in quel servizio. Ruotano ogni 3 anni e non è possibile cambiarle.
- **CMK gestite dal cliente**: Flessibilità, rotazione, accesso configurabile e politica delle chiavi. Abilita e disabilita le chiavi.

**Crittografia a Involucro** nel contesto del Key Management Service (KMS): Sistema gerarchico a due livelli per **crittografare i dati con la chiave dei dati e poi crittografare la chiave dei dati con la chiave master**.

### Politiche delle Chiavi

Queste definiscono **chi può utilizzare e accedere a una chiave in KMS**.

Per **impostazione predefinita:**

- Fornisce all'**IAM dell'** **account AWS che possiede la chiave KMS accesso** per gestire l'accesso alla chiave KMS tramite IAM.

A differenza di altre politiche delle risorse AWS, una **politica della chiave KMS non concede automaticamente permessi a nessuno dei principi dell'account**. Per concedere permessi agli amministratori dell'account, **la politica della chiave deve includere una dichiarazione esplicita** che fornisca questo permesso, come questa.

- Senza consentire all'account(`"AWS": "arn:aws:iam::111122223333:root"`) i permessi IAM non funzioneranno.

- **Consente all'account di utilizzare le politiche IAM** per consentire l'accesso alla chiave KMS, oltre alla politica della chiave.

**Senza questo permesso, le politiche IAM che consentono l'accesso alla chiave sono inefficaci**, sebbene le politiche IAM che negano l'accesso alla chiave siano ancora efficaci.

- **Riduce il rischio che la chiave diventi ingovernabile** dando permessi di controllo accesso agli amministratori dell'account, incluso l'utente root dell'account, che non può essere eliminato.

**Esempio di politica predefinita**:
```json
{
"Sid": "Enable IAM policies",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "kms:*",
"Resource": "*"
}
```
> [!WARNING]
> Se l'**account è autorizzato** (`"arn:aws:iam::111122223333:root"`), un **principale** dell'account **avrà comunque bisogno di permessi IAM** per utilizzare la chiave KMS. Tuttavia, se l'**ARN** di un ruolo, ad esempio, è **specificamente autorizzato** nella **Politica della Chiave**, quel ruolo **non ha bisogno di permessi IAM**.

<details>

<summary>Dettagli della Politica</summary>

Proprietà di una politica:

- Documento basato su JSON
- Risorsa --> Risorse interessate (può essere "\*")
- Azione --> kms:Encrypt, kms:Decrypt, kms:CreateGrant ... (permessi)
- Effetto --> Consenti/Nega
- Principale --> arn interessato
- Condizioni (opzionale) --> Condizione per concedere i permessi

Concessioni:

- Consente di delegare i propri permessi a un altro principale AWS all'interno del proprio account AWS. È necessario crearli utilizzando le API AWS KMS. Può essere indicato l'identificatore CMK, il principale beneficiario e il livello richiesto di operazione (Decrypt, Encrypt, GenerateDataKey...)
- Dopo che la concessione è stata creata, vengono emessi un GrantToken e un GrantID

**Accesso**:

- Tramite **politica della chiave** -- Se esiste, questa ha **precedenza** sulla politica IAM
- Tramite **politica IAM**
- Tramite **concessioni**

</details>

### Amministratori delle Chiavi

Amministratore delle chiavi per impostazione predefinita:

- Ha accesso per gestire KMS ma non per crittografare o decrittografare dati
- Solo gli utenti e i ruoli IAM possono essere aggiunti all'elenco degli Amministratori delle Chiavi (non i gruppi)
- Se viene utilizzato un CMK esterno, gli Amministratori delle Chiavi hanno il permesso di importare materiale di chiave

### Rotazione dei CMK

- Più a lungo la stessa chiave rimane in uso, più dati vengono crittografati con quella chiave, e se quella chiave viene compromessa, allora l'area di esplosione dei dati è a rischio. Inoltre, più a lungo la chiave è attiva, maggiore è la probabilità che venga compromessa.
- **KMS ruota le chiavi dei clienti ogni 365 giorni** (o puoi eseguire il processo manualmente quando vuoi) e **le chiavi gestite da AWS ogni 3 anni** e questo tempo non può essere cambiato.
- **Le chiavi più vecchie vengono mantenute** per decrittografare i dati che sono stati crittografati prima della rotazione
- In caso di compromissione, ruotare la chiave non rimuoverà la minaccia poiché sarà possibile decrittografare tutti i dati crittografati con la chiave compromessa. Tuttavia, i **nuovi dati saranno crittografati con la nuova chiave**.
- Se il **CMK** è in stato di **disabilitato** o **in attesa di** **cancellazione**, KMS **non eseguirà una rotazione della chiave** fino a quando il CMK non sarà riattivato o la cancellazione non sarà annullata.

#### Rotazione manuale

- È necessario **creare un nuovo CMK**, quindi, viene creato un nuovo CMK-ID, quindi dovrai **aggiornare** qualsiasi **applicazione** per **riferirsi** al nuovo CMK-ID.
- Per semplificare questo processo, puoi **utilizzare alias per riferirti a un key-id** e poi semplicemente aggiornare la chiave a cui l'alias si riferisce.
- Devi **mantenere le vecchie chiavi per decrittografare i vecchi file** crittografati con essa.

Puoi importare chiavi dalla tua infrastruttura di chiavi on-premises.

### Altre informazioni rilevanti su KMS

KMS è tariffato in base al numero di richieste di crittografia/decrittografia ricevute da tutti i servizi al mese.

KMS ha piena audit e compliance **integrazione con CloudTrail**; qui puoi auditare tutte le modifiche effettuate su KMS.

Con la politica KMS puoi fare quanto segue:

- Limitare chi può creare chiavi dati e quali servizi hanno accesso a utilizzare queste chiavi
- Limitare l'accesso ai sistemi per crittografare solo, decrittografare solo o entrambi
- Definire per abilitare i sistemi ad accedere alle chiavi attraverso le regioni (anche se non è raccomandato poiché un guasto nella regione che ospita KMS influenzerà la disponibilità dei sistemi in altre regioni).

Non puoi sincronizzare o spostare/copiare chiavi tra regioni; puoi solo definire regole per consentire l'accesso tra le regioni.

### Enumerazione
```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/README.md
{{#endref}}

### Post Exploitation

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

### Persistence

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

## Riferimenti

- [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}}
