Amazon S3 je usluga koja vam omogućava da čuvate velike količine podataka.
Amazon S3 pruža više opcija za postizanje zaštite podataka u mirovanju. Opcije uključuju Dozvolu (Politiku), Enkripciju (Klijentsku i Serversku stranu), Verzionisanje kanti i MFAzasnovano brisanje. Korisnik može omogućiti bilo koju od ovih opcija za postizanje zaštite podataka. Replikacija podataka je interna funkcija AWS-a gde S3 automatski replicira svaki objekat širom svih dostupnih zona i organizacija je ne mora omogućiti u ovom slučaju.
Sa dozvolama zasnovanim na resursima, možete definisati dozvole za poddirektorijume vaše kante odvojeno.
Verzionisanje kanti i MFA zasnovano brisanje
Kada je verzionisanje kanti omogućeno, svaka akcija koja pokušava da izmeni datoteku unutar datoteke generisaće novu verziju datoteke, zadržavajući takođe prethodni sadržaj iste. Stoga, neće prepisati njen sadržaj.
Štaviše, MFA zasnovano brisanje će sprečiti verzije datoteka u S3 kanti da budu obrisane i takođe će sprečiti onemogućavanje verzionisanja kanti, tako da napadač neće moći da menja ove datoteke.
S3 pristupni logovi
Moguće je omogućiti S3 pristupne logove (koji su po defaultu onemogućeni) za neku kantu i sačuvati logove u drugoj kanti kako biste znali ko pristupa kanti (obe kante moraju biti u istoj regiji).
S3 Presigned URLs
Moguće je generisati presigned URL koji se obično može koristiti za pristup određenoj datoteci u kanti. Presigned URL izgleda ovako:
A presigned URL can be napravljen iz cli koristeći akreditive glavnog korisnika sa pristupom objektu (ako nalog koji koristite nema pristup, biće napravljen kraći presigned URL, ali će biti beskoristan)
Jedina potrebna dozvola za generisanje presigned URL-a je dozvola koja se daje, tako da za prethodnu komandu jedina dozvola koja je potrebna principalu je s3:GetObject
Takođe je moguće kreirati presigned URL-ove sa drugim dozvolama:
DEK znači Ključ za enkripciju podataka i to je ključ koji se uvek generiše i koristi za enkripciju podataka.
Enkripcija na strani servera sa S3 upravljanim ključevima, SSE-S3
Ova opcija zahteva minimalnu konfiguraciju i svu upravu nad ključevima za enkripciju vrši AWS. Sve što treba da uradite je da otpremite svoje podatke i S3 će se pobrinuti za sve ostale aspekte. Svakom bucket-u u S3 nalogu dodeljuje se ključ bucket-a.
Enkripcija:
Podaci objekta + kreirani plaintext DEK --> Enkriptovani podaci (smešteni unutar S3)
Kreirani plaintext DEK + S3 Master Key --> Enkriptovani DEK (smešten unutar S3) i plaintext se briše iz memorije
Dekripcija:
Enkriptovani DEK + S3 Master Key --> Plaintext DEK
Plaintext DEK + Enkriptovani podaci --> Podaci objekta
Molimo vas, imajte na umu da je u ovom slučaju ključ upravljan od strane AWS-a (rotacija samo svake 3 godine). Ako koristite svoj ključ, moći ćete da rotirate, onemogućite i primenite kontrolu pristupa.
Enkripcija na strani servera sa KMS upravljanim ključevima, SSE-KMS
Ova metoda omogućava S3 da koristi servis za upravljanje ključevima za generisanje vaših ključeva za enkripciju podataka. KMS vam daje mnogo veću fleksibilnost u upravljanju vašim ključevima. Na primer, možete onemogućiti, rotirati i primeniti kontrole pristupa na CMK, i narediti protiv njihove upotrebe koristeći AWS Cloud Trail.
Enkripcija:
S3 zahteva ključeve podataka od KMS CMK
KMS koristi CMK za generisanje para DEK plaintext i DEK enkriptovanog i šalje ih S3
S3 koristi plaintext ključ za enkripciju podataka, čuva enkriptovane podatke i enkriptovani ključ i briše plaintext ključ iz memorije
Dekripcija:
S3 traži od KMS da dekriptuje enkriptovani ključ podataka objekta
KMS dekriptuje ključ podataka sa CMK i vraća ga S3
S3 dekriptuje podatke objekta
Enkripcija na strani servera sa ključevima koje obezbeđuje korisnik, SSE-C
Ova opcija vam daje priliku da obezbedite svoj vlastiti master ključ koji možda već koristite van AWS-a. Vaš ključ koji obezbeđuje korisnik biće zatim poslat sa vašim podacima u S3, gde će S3 izvršiti enkripciju umesto vas.
Enkripcija:
Korisnik šalje podatke objekta + Ključ korisnika u S3
Ključ korisnika se koristi za enkripciju podataka i enkriptovani podaci se čuvaju
takođe se čuva salted HMAC vrednost ključa korisnika za buduću validaciju ključa
ključ korisnika se briše iz memorije
Dekripcija:
Korisnik šalje ključ korisnika
Ključ se validira u odnosu na sačuvanu HMAC vrednost
Ključ koji obezbeđuje korisnik se zatim koristi za dekripciju podataka
Enkripcija na strani klijenta sa KMS, CSE-KMS
Slično SSE-KMS, ovo takođe koristi servis za upravljanje ključevima za generisanje vaših ključeva za enkripciju podataka. Međutim, ovaj put KMS se poziva putem klijenta, a ne S3. Enkripcija se zatim vrši na strani klijenta, a enkriptovani podaci se šalju u S3 na čuvanje.
Enkripcija:
Klijent zahteva ključ podataka od KMS
KMS vraća plaintext DEK i enkriptovani DEK sa CMK
Obe ključeve se vraćaju
Klijent zatim enkriptuje podatke sa plaintext DEK i šalje S3 enkriptovane podatke + enkriptovani DEK (koji se čuva kao metapodatak enkriptovanih podataka unutar S3)
Dekripcija:
Enkriptovani podaci sa enkriptovanim DEK se šalju klijentu
Klijent traži od KMS da dekriptuje enkriptovani ključ koristeći CMK i KMS vraća plaintext DEK
Klijent sada može dekriptovati enkriptovane podatke
Enkripcija na strani klijenta sa ključevima koje obezbeđuje korisnik, CSE-C
Korišćenjem ovog mehanizma, možete koristiti svoje obezbeđene ključeve i koristiti AWS-SDK klijenta za enkripciju vaših podataka pre nego što ih pošaljete u S3 na čuvanje.
Enkripcija:
Klijent generiše DEK i enkriptuje plaintext podatke
Zatim, koristeći svoj vlastiti prilagođeni CMK, enkriptuje DEK
šalje enkriptovane podatke + enkriptovani DEK u S3 gde se čuva
Dekripcija:
S3 šalje enkriptovane podatke i DEK
Kako klijent već ima CMK koji se koristi za enkripciju DEK, dekriptuje DEK i zatim koristi plaintext DEK za dekripciju podataka
Enumeracija
Jedan od tradicionalnih glavnih načina kompromitovanja AWS organizacija počinje kompromitovanjem javno dostupnih bucket-a. Možete pronaćijavne enumeratore bucket-a na ovoj stranici.
# 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
Možete pristupiti S3 bucket-u putem dual-stack endpoint-a koristeći virtualni hosted-style ili path-style naziv endpoint-a. Ovi su korisni za pristup S3 putem IPv6.
Dual-stack endpoint-i koriste sledeću sintaksu:
bucketname.s3.dualstack.aws-region.amazonaws.com
s3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
Na sledećoj stranici možete proveriti kako da zloupotrebite S3 dozvole za eskalaciju privilegija:
Prema ovom istraživanju bilo je moguće keširati odgovor proizvoljnog bucket-a kao da pripada drugom. Ovo je moglo biti zloupotrebljeno za promenu, na primer, odgovora javascript datoteka i kompromitovanje proizvoljnih stranica koristeći S3 za skladištenje statičkog koda.
Amazon Athena
Amazon Athena je interaktivna usluga za upite koja olakšava analizu podataka direktno u Amazon Simple Storage Service (Amazon S3) koristeći standardni SQL.
Potrebno je pripremiti relacijsku DB tabelu sa formatom sadržaja koji će se pojaviti u nadgledanim S3 bucket-ima. A zatim, Amazon Athena će moći da popuni DB iz logova, tako da možete da upitujete.
Amazon Athena podržava mogućnost upita nad S3 podacima koji su već enkriptovani i ako je tako konfigurisano, Athena takođe može enkriptovati rezultate upita koji se zatim mogu skladištiti u S3.
Ova enkripcija rezultata je nezavisna od osnovnih upitanih S3 podataka, što znači da čak i ako S3 podaci nisu enkriptovani, upitani rezultati mogu biti enkriptovani. Nekoliko tačaka na koje treba obratiti pažnju je da Amazon Athena podržava samo podatke koji su enkriptovani sa sledećim S3 metodama enkripcije, SSE-S3, SSE-KMS, i CSE-KMS.
SSE-C i CSE-E nisu podržani. Pored ovoga, važno je razumeti da će Amazon Athena izvršavati upite samo protiv enkriptovanih objekata koji su u istoj regiji kao i sam upit. Ako trebate da upitujete S3 podatke koji su enkriptovani koristeći KMS, tada su potrebne specifične dozvole za korisnika Athene kako bi im omogućili izvršavanje upita.
Enumeracija
# 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>