# AWS - Redshift Enum

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

## Amazon Redshift

Redshift è un servizio completamente gestito che può scalare fino a oltre un petabyte di dimensione, utilizzato come **data warehouse per soluzioni di big data**. Utilizzando i cluster Redshift, è possibile eseguire analisi sui propri dataset utilizzando strumenti di query basati su SQL e applicazioni di business intelligence per ottenere una maggiore comprensione della visione per la propria azienda.

**Redshift offre crittografia a riposo utilizzando una gerarchia di chiavi di crittografia a quattro livelli, utilizzando KMS o CloudHSM per gestire il livello superiore delle chiavi**. **Quando la crittografia è abilitata per il tuo cluster, non può essere disabilitata e viceversa**. Quando hai un cluster non crittografato, non può essere crittografato.

La crittografia per il tuo cluster può avvenire solo durante la sua creazione e, una volta crittografati, i dati, i metadati e qualsiasi snapshot sono anch'essi crittografati. I livelli di gerarchia delle chiavi di crittografia sono i seguenti: **il livello uno è la chiave master, il livello due è la chiave di crittografia del cluster, la CEK, il livello tre è la chiave di crittografia del database, la DEK, e infine il livello quattro, le chiavi di crittografia dei dati stesse**.

### KMS

Durante la creazione del tuo cluster, puoi selezionare la **chiave KMS predefinita** per Redshift o selezionare il tuo **CMK**, che ti offre maggiore flessibilità nel controllo della chiave, specificamente da una prospettiva auditabile.

La chiave KMS predefinita per Redshift viene creata automaticamente da Redshift la prima volta che l'opzione della chiave viene selezionata e utilizzata, ed è completamente gestita da AWS.

Questa chiave KMS viene quindi crittografata con la chiave master CMK, livello uno. Questa chiave di dati KMS crittografata viene quindi utilizzata come chiave di crittografia del cluster, la CEK, livello due. Questa CEK viene quindi inviata da KMS a Redshift, dove viene memorizzata separatamente dal cluster. Redshift invia quindi questa CEK crittografata al cluster tramite un canale sicuro, dove viene memorizzata in memoria.

Redshift richiede quindi a KMS di decrittografare la CEK, livello due. Questa CEK decrittografata viene quindi anch'essa memorizzata in memoria. Redshift crea quindi una chiave di crittografia del database casuale, la DEK, livello tre, e la carica nella memoria del cluster. La CEK decrittografata in memoria crittografa quindi la DEK, che viene anch'essa memorizzata in memoria.

Questa DEK crittografata viene quindi inviata tramite un canale sicuro e memorizzata in Redshift separatamente dal cluster. Sia la CEK che la DEK sono ora memorizzate in memoria del cluster sia in forma crittografata che decrittografata. La DEK decrittografata viene quindi utilizzata per crittografare le chiavi dei dati, livello quattro, che vengono generate casualmente da Redshift per ogni blocco di dati nel database.

Puoi utilizzare AWS Trusted Advisor per monitorare la configurazione dei tuoi bucket Amazon S3 e assicurarti che il logging dei bucket sia abilitato, il che può essere utile per eseguire audit di sicurezza e tracciare i modelli di utilizzo in S3.

### CloudHSM

<details>

<summary>Utilizzare Redshift con CloudHSM</summary>

Quando lavori con CloudHSM per eseguire la tua crittografia, prima di tutto devi impostare una connessione di fiducia tra il tuo client HSM e Redshift utilizzando certificati client e server.

Questa connessione è necessaria per fornire comunicazioni sicure, consentendo l'invio di chiavi di crittografia tra il tuo client HSM e i tuoi cluster Redshift. Utilizzando una coppia di chiavi private e pubbliche generate casualmente, Redshift crea un certificato client pubblico, che viene crittografato e memorizzato da Redshift. Questo deve essere scaricato e registrato nel tuo client HSM e assegnato alla corretta partizione HSM.

Devi quindi configurare Redshift con i seguenti dettagli del tuo client HSM: l'indirizzo IP HSM, il nome della partizione HSM, la password della partizione HSM e il certificato del server HSM pubblico, che è crittografato da CloudHSM utilizzando una chiave master interna. Una volta forniti queste informazioni, Redshift confermerà e verificherà che può connettersi e accedere alla partizione di sviluppo.

Se le tue politiche di sicurezza interne o i controlli di governance stabiliscono che devi applicare la rotazione delle chiavi, allora questo è possibile con Redshift, consentendoti di ruotare le chiavi di crittografia per i cluster crittografati; tuttavia, devi essere consapevole che durante il processo di rotazione delle chiavi, renderà un cluster non disponibile per un breve periodo di tempo, quindi è meglio ruotare le chiavi solo quando necessario o se ritieni che possano essere state compromesse.

Durante la rotazione, Redshift ruoterà la CEK per il tuo cluster e per eventuali backup di quel cluster. Ruoterà una DEK per il cluster, ma non è possibile ruotare una DEK per gli snapshot memorizzati in S3 che sono stati crittografati utilizzando la DEK. Metterà il cluster in uno stato di 'rotazione delle chiavi' fino al completamento del processo, quando lo stato tornerà a 'disponibile'.

</details>

### Enumeration
```bash
# Get clusters
aws redshift describe-clusters
## Get if publicly accessible
aws redshift describe-clusters | jq -r ".Clusters[].PubliclyAccessible"
## Get DB username to login
aws redshift describe-clusters | jq -r ".Clusters[].MasterUsername"
## Get endpoint
aws redshift describe-clusters | jq -r ".Clusters[].Endpoint"
## Public addresses of the nodes
aws redshift describe-clusters | jq -r ".Clusters[].ClusterNodes[].PublicIPAddress"
## Get IAM roles of the clusters
aws redshift describe-clusters | jq -r ".Clusters[].IamRoles"

# Endpoint access & authorization
aws redshift describe-endpoint-access
aws redshift describe-endpoint-authorization

# Get credentials
aws redshift get-cluster-credentials --db-user <username> --cluster-identifier <cluster-id>
## By default, the temporary credentials expire in 900 seconds. You can optionally specify a duration between 900 seconds (15 minutes) and 3600 seconds (60 minutes).
aws redshift get-cluster-credentials-with-iam --cluster-identifier <cluster-id>
## Gives creds to access redshift with the IAM redshift permissions given to the current AWS account
## More in https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html

# Authentication profiles
aws redshift describe-authentication-profiles

# Snapshots
aws redshift describe-cluster-snapshots

# Scheduled actions
aws redshift describe-scheduled-actions

# Connect
# The redshift instance must be publicly available (not by default), the sg need to allow inbounds connections to the port and you need creds
psql -h redshift-cluster-1.sdflju3jdfkfg.us-east-1.redshift.amazonaws.com -U admin -d dev -p 5439
```
## Privesc

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

## Persistenza

Le seguenti azioni consentono di concedere accesso ad altri account AWS al cluster:

- [authorize-endpoint-access](https://docs.aws.amazon.com/cli/latest/reference/redshift/authorize-endpoint-access.html)
- [authorize-snapshot-access](https://docs.aws.amazon.com/cli/latest/reference/redshift/authorize-snapshot-access.html)

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