Amazon S3 è un servizio che consente di memorizzare grandi quantità di dati.
Amazon S3 offre diverse opzioni per ottenere la protezione dei dati a riposo. Le opzioni includono Permessi (Policy), Crittografia (Client e Server Side), Versioning del Bucket e eliminazione basata su MFA. L'utente può abilitare una di queste opzioni per ottenere la protezione dei dati. La replicazione dei dati è una funzionalità interna di AWS in cui S3 replica automaticamente ogni oggetto in tutte le Availability Zone e l'organizzazione non deve abilitarla in questo caso.
Con permessi basati sulle risorse, puoi definire permessi per le sottodirectory del tuo bucket separatamente.
Versioning del Bucket e eliminazione basata su MFA
Quando il versioning del bucket è abilitato, qualsiasi azione che tenta di alterare un file all'interno di un file genererà una nuova versione del file, mantenendo anche il contenuto precedente dello stesso. Pertanto, non sovrascriverà il suo contenuto.
Inoltre, l'eliminazione basata su MFA impedirà che le versioni di file nel bucket S3 vengano eliminate e anche che il Versioning del Bucket venga disabilitato, quindi un attaccante non sarà in grado di alterare questi file.
Log di accesso S3
È possibile abilitare il login di accesso S3 (che per impostazione predefinita è disabilitato) per un certo bucket e salvare i log in un bucket diverso per sapere chi sta accedendo al bucket (entrambi i bucket devono trovarsi nella stessa regione).
URL presigned S3
È possibile generare un URL presigned che può solitamente essere utilizzato per accedere al file specificato nel bucket. Un URL presigned appare così:
Un URL prefirmato può essere creato dalla cli utilizzando le credenziali di un principale con accesso all'oggetto (se l'account che utilizzi non ha accesso, verrà creato un URL prefirmato più breve ma sarà inutile)
L'unica autorizzazione richiesta per generare un URL firmato in anticipo è l'autorizzazione concessa, quindi per il comando precedente l'unica autorizzazione necessaria per il principale è s3:GetObject
È anche possibile creare URL firmati in anticipo con altre autorizzazioni:
DEK significa Data Encryption Key ed è la chiave che viene sempre generata e utilizzata per crittografare i dati.
Server-side encryption with S3 managed keys, SSE-S3
Questa opzione richiede una configurazione minima e tutta la gestione delle chiavi di crittografia utilizzate è gestita da AWS. Tutto ciò che devi fare è caricare i tuoi dati e S3 gestirà tutti gli altri aspetti. Ogni bucket in un account S3 è assegnato a una chiave del bucket.
Crittografia:
Dati dell'oggetto + DEK in chiaro creato --> Dati crittografati (memorizzati all'interno di S3)
DEK in chiaro creato + Chiave Master S3 --> DEK crittografato (memorizzato all'interno di S3) e il testo in chiaro viene eliminato dalla memoria
Decrittografia:
DEK crittografato + Chiave Master S3 --> DEK in chiaro
DEK in chiaro + Dati crittografati --> Dati dell'oggetto
Si prega di notare che in questo caso la chiave è gestita da AWS (rotazione solo ogni 3 anni). Se utilizzi la tua chiave, potrai ruotare, disabilitare e applicare il controllo degli accessi.
Server-side encryption with KMS managed keys, SSE-KMS
Questo metodo consente a S3 di utilizzare il servizio di gestione delle chiavi per generare le tue chiavi di crittografia dei dati. KMS ti offre una flessibilità molto maggiore su come vengono gestite le tue chiavi. Ad esempio, puoi disabilitare, ruotare e applicare controlli di accesso al CMK, e ordinare contro il loro utilizzo utilizzando AWS Cloud Trail.
Crittografia:
S3 richiede chiavi di dati a KMS CMK
KMS utilizza un CMK per generare la coppia DEK in chiaro e DEK crittografato e inviarle a S3
S3 utilizza la chiave in chiaro per crittografare i dati, memorizza i dati crittografati e la chiave crittografata ed elimina dalla memoria la chiave in chiaro
Decrittografia:
S3 chiede a KMS di decrittografare la chiave di dati crittografata dell'oggetto
KMS decrittografa la chiave di dati con il CMK e la restituisce a S3
S3 decrittografa i dati dell'oggetto
Server-side encryption with customer provided keys, SSE-C
Questa opzione ti offre l'opportunità di fornire la tua chiave master che potresti già utilizzare al di fuori di AWS. La tua chiave fornita dal cliente verrebbe quindi inviata con i tuoi dati a S3, dove S3 eseguirebbe la crittografia per te.
Crittografia:
L'utente invia i dati dell'oggetto + Chiave del cliente a S3
La chiave del cliente viene utilizzata per crittografare i dati e i dati crittografati vengono memorizzati
un valore HMAC salato della chiave del cliente viene memorizzato anche per la futura validazione della chiave
la chiave del cliente viene eliminata dalla memoria
Decrittografia:
L'utente invia la chiave del cliente
La chiave viene convalidata rispetto al valore HMAC memorizzato
La chiave fornita dal cliente viene quindi utilizzata per decrittografare i dati
Client-side encryption with KMS, CSE-KMS
Analogamente a SSE-KMS, questo utilizza anche il servizio di gestione delle chiavi per generare le tue chiavi di crittografia dei dati. Tuttavia, questa volta KMS viene chiamato tramite il client e non S3. La crittografia avviene quindi lato client e i dati crittografati vengono inviati a S3 per essere memorizzati.
Crittografia:
Il client richiede una chiave di dati a KMS
KMS restituisce il DEK in chiaro e il DEK crittografato con il CMK
Entrambe le chiavi vengono restituite
Il client quindi crittografa i dati con il DEK in chiaro e invia a S3 i dati crittografati + il DEK crittografato (che viene salvato come metadati dei dati crittografati all'interno di S3)
Decrittografia:
I dati crittografati con il DEK crittografato vengono inviati al client
Il client chiede a KMS di decrittografare la chiave crittografata utilizzando il CMK e KMS restituisce il DEK in chiaro
Il client può ora decrittografare i dati crittografati
Client-side encryption with customer provided keys, CSE-C
Utilizzando questo meccanismo, puoi utilizzare le tue chiavi fornite e utilizzare un client AWS-SDK per crittografare i tuoi dati prima di inviarli a S3 per la memorizzazione.
Crittografia:
Il client genera un DEK e crittografa i dati in chiaro
Poi, utilizzando il proprio CMK personalizzato, crittografa il DEK
invia i dati crittografati + DEK crittografato a S3 dove viene memorizzato
Decrittografia:
S3 invia i dati crittografati e il DEK
Poiché il client ha già il CMK utilizzato per crittografare il DEK, decrittografa il DEK e poi utilizza il DEK in chiaro per decrittografare i dati
Enumeration
Uno dei principali modi tradizionali per compromettere le organizzazioni AWS inizia compromettendo i bucket accessibili pubblicamente. Puoi trovareenumeratori di bucket pubblici in questa pagina.
# Get buckets ACLsawss3apiget-bucket-acl--bucket<bucket-name>awss3apiget-object-acl--bucket<bucket-name>--keyflag# Get policyawss3apiget-bucket-policy--bucket<bucket-name>awss3apiget-bucket-policy-status--bucket<bucket-name>#if it's public# list S3 buckets associated with a profileawss3lsawss3apilist-buckets# list content of bucket (no creds)awss3lss3://bucket-name--no-sign-requestawss3lss3://bucket-name--recursive# list content of bucket (with creds)awss3lss3://bucket-nameawss3apilist-objects-v2--bucket<bucket-name>awss3apilist-objects--bucket<bucket-name>awss3apilist-object-versions--bucket<bucket-name># copy local folder to S3awss3cpMyFolders3://bucket-name--recursive# deleteawss3rbs3://bucket-name–-force# download a whole S3 bucketawss3syncs3://<bucket>/.# move S3 bucket to different locationawss3syncs3://oldbuckets3://newbucket--source-regionus-west-1# list the sizes of an S3 bucket and its contentsawss3apilist-objects--bucketBUCKETNAME--outputjson--query"[sum(Contents[].Size), length(Contents[])]"# Update Bucket policyawss3apiput-bucket-policy--policyfile:///root/policy.json--bucket<bucket-name>##JSON policy example{"Id":"Policy1568185116930","Version":"2012-10-17","Statement": [{"Sid":"Stmt1568184932403","Action": ["s3:ListBucket"],"Effect":"Allow","Resource":"arn:aws:s3:::welcome","Principal":"*"},{"Sid":"Stmt1568185007451","Action": ["s3:GetObject"],"Effect":"Allow","Resource":"arn:aws:s3:::welcome/*","Principal":"*"}]}# Update bucket ACLawss3apiget-bucket-acl--bucket<bucket-name># Way 1 to get the ACLawss3apiput-bucket-acl--bucket<bucket-name>--access-control-policyfile://acl.jsonawss3apiget-object-acl--bucket<bucket-name>--keyflag#Way 2 to get the ACLawss3apiput-object-acl--bucket<bucket-name>--keyflag--access-control-policyfile://objacl.json##JSON ACL example## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.{"Owner":{"DisplayName":"<DisplayName>","ID":"<ID>"},"Grants": [{"Grantee":{"Type":"Group","URI":"http://acs.amazonaws.com/groups/global/AuthenticatedUsers"},"Permission":"FULL_CONTROL"}]}## An ACL should give you the permission WRITE_ACP to be able to put a new ACL
dual-stack
Puoi accedere a un bucket S3 tramite un endpoint dual-stack utilizzando un nome di endpoint in stile host virtuale o in stile percorso. Questi sono utili per accedere a S3 tramite IPv6.
Gli endpoint dual-stack utilizzano la seguente sintassi:
bucketname.s3.dualstack.aws-region.amazonaws.com
s3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
Nella pagina seguente puoi controllare come abusare dei permessi S3 per escalare i privilegi:
Secondo questa ricerca è stato possibile memorizzare nella cache la risposta di un bucket arbitrario come se appartenesse a un altro. Questo potrebbe essere stato abusato per modificare, ad esempio, le risposte dei file javascript e compromettere pagine arbitrarie utilizzando S3 per memorizzare codice statico.
Amazon Athena
Amazon Athena è un servizio di query interattivo che semplifica l'analisi dei dati direttamente in Amazon Simple Storage Service (Amazon S3) utilizzando SQL standard.
Devi preparare una tabella DB relazionale con il formato del contenuto che apparirà nei bucket S3 monitorati. E poi, Amazon Athena sarà in grado di popolare il DB dai log, così potrai interrogarlo.
Amazon Athena supporta la possibilità di interrogare i dati S3 che sono già crittografati e, se configurato per farlo, Athena può anche crittografare i risultati della query che possono poi essere memorizzati in S3.
Questa crittografia dei risultati è indipendente dai dati S3 interrogati, il che significa che anche se i dati S3 non sono crittografati, i risultati interrogati possono essere crittografati. Un paio di punti da tenere a mente è che Amazon Athena supporta solo dati che sono stati crittografati con i seguenti metodi di crittografia S3, SSE-S3, SSE-KMS e CSE-KMS.
SSE-C e CSE-E non sono supportati. Inoltre, è importante comprendere che Amazon Athena eseguirà query solo su oggetti crittografati che si trovano nella stessa regione della query stessa. Se hai bisogno di interrogare dati S3 che sono stati crittografati utilizzando KMS, allora sono necessarie specifiche autorizzazioni da parte dell'utente Athena per consentire loro di eseguire la query.
Enumerazione
# Get catalogsawsathenalist-data-catalogs# Get databases inside catalogawsathenalist-databases--catalog-name<catalog-name>awsathenalist-table-metadata--catalog-name<catalog-name>--database-name<db-name># Get query executions, queries and resultsawsathenalist-query-executionsawsathenaget-query-execution--query-execution-id<id># Get query and meta of resultsawsathenaget-query-results--query-execution-id<id># This will rerun the query and get the results# Get workgroups & Prepared statementsawsathenalist-work-groupsawsathenalist-prepared-statements--work-group<wg-name>awsathenaget-prepared-statement--statement-name<name>--work-group<wg-name># Run queryawsathenastart-query-execution--query-string<query>