Amazon S3 to usługa, która pozwala przechowywać duże ilości danych.
Amazon S3 oferuje wiele opcji, aby osiągnąć ochronę danych w spoczynku. Opcje obejmują Uprawnienia (Polityka), Szyfrowanie (po stronie klienta i serwera), Wersjonowanie wiadra oraz usuwanie oparte na MFA. Użytkownik może włączyć dowolną z tych opcji, aby osiągnąć ochronę danych. Replikacja danych to wewnętrzna funkcja AWS, w której S3 automatycznie replikuje każdy obiekt we wszystkich strefach dostępności, a organizacja nie musi jej włączać w tym przypadku.
Dzięki uprawnieniom opartym na zasobach możesz definiować uprawnienia dla podkatalogów swojego wiadra oddzielnie.
Wersjonowanie wiadra i usuwanie oparte na MFA
Gdy wersjonowanie wiadra jest włączone, każda akcja, która próbuje zmienić plik wewnątrz pliku, wygeneruje nową wersję pliku, zachowując również poprzednią zawartość tego samego. Dlatego nie nadpisze jego zawartości.
Ponadto, usuwanie oparte na MFA zapobiegnie usunięciu wersji pliku w wiadrze S3 oraz wyłączeniu wersjonowania wiadra, więc atakujący nie będzie mógł zmienić tych plików.
Dzienniki dostępu S3
Możliwe jest włączenie logowania dostępu S3 (które domyślnie jest wyłączone) dla niektórego wiadra i zapisanie logów w innym wiadrze, aby wiedzieć, kto uzyskuje dostęp do wiadra (oba wiadra muszą znajdować się w tym samym regionie).
Pre-signed URLs S3
Możliwe jest wygenerowanie pre-signed URL, który zazwyczaj może być używany do uzyskania dostępu do określonego pliku w wiadrze. Pre-signed URL wygląda tak:
Aby utworzyć presigned URL z cli przy użyciu poświadczeń podmiotu mającego dostęp do obiektu (jeśli konto, którego używasz, nie ma dostępu, zostanie utworzony krótszy presigned URL, ale będzie bezużyteczny)
Jedynym wymaganym uprawnieniem do wygenerowania presigned URL jest przyznane uprawnienie, więc dla poprzedniego polecenia jedynym wymaganym uprawnieniem przez podmiot jest s3:GetObject
Możliwe jest również tworzenie presigned URLs z innymi uprawnieniami:
DEK oznacza Klucz Szyfrowania Danych i jest kluczem, który jest zawsze generowany i używany do szyfrowania danych.
Szyfrowanie po stronie serwera z kluczami zarządzanymi przez S3, SSE-S3
Ta opcja wymaga minimalnej konfiguracji, a zarządzanie kluczami szyfrowania jest obsługiwane przez AWS. Wszystko, co musisz zrobić, to przesłać swoje dane, a S3 zajmie się wszystkimi innymi aspektami. Każdemu koszykowi w koncie S3 przypisany jest klucz koszyka.
Szyfrowanie:
Dane obiektu + utworzony jawny DEK --> Szyfrowane dane (przechowywane w S3)
Utworzony jawny DEK + Klucz Główny S3 --> Szyfrowany DEK (przechowywany w S3) i tekst jawny jest usuwany z pamięci
Deszyfrowanie:
Szyfrowany DEK + Klucz Główny S3 --> Jawny DEK
Jawny DEK + Szyfrowane dane --> Dane obiektu
Proszę zauważyć, że w tym przypadku klucz jest zarządzany przez AWS (rotacja tylko co 3 lata). Jeśli użyjesz własnego klucza, będziesz mógł go rotować, dezaktywować i stosować kontrolę dostępu.
Szyfrowanie po stronie serwera z kluczami zarządzanymi przez KMS, SSE-KMS
Ta metoda pozwala S3 korzystać z usługi zarządzania kluczami do generowania kluczy szyfrowania danych. KMS daje znacznie większą elastyczność w zarządzaniu kluczami. Na przykład, możesz dezaktywować, rotować i stosować kontrole dostępu do CMK oraz monitorować ich użycie za pomocą AWS Cloud Trail.
Szyfrowanie:
S3 żąda kluczy danych od KMS CMK
KMS używa CMK do generowania pary jawnego DEK i szyfrowanego DEK i wysyła je do S3
S3 używa jawnego klucza do szyfrowania danych, przechowuje szyfrowane dane i szyfrowany klucz oraz usuwa z pamięci jawny klucz
Deszyfrowanie:
S3 prosi KMS o deszyfrowanie szyfrowanego klucza danych obiektu
KMS deszyfruje klucz danych za pomocą CMK i wysyła go z powrotem do S3
S3 deszyfruje dane obiektu
Szyfrowanie po stronie serwera z kluczami dostarczonymi przez klienta, SSE-C
Ta opcja daje Ci możliwość dostarczenia własnego klucza głównego, którego możesz już używać poza AWS. Twój klucz dostarczony przez klienta zostanie następnie wysłany z danymi do S3, gdzie S3 wykona szyfrowanie za Ciebie.
Szyfrowanie:
Użytkownik wysyła dane obiektu + Klucz Klienta do S3
Klucz klienta jest używany do szyfrowania danych, a szyfrowane dane są przechowywane
przechowywana jest również wartość HMAC z solą klucza klienta dla przyszłej walidacji klucza
klucz klienta jest usuwany z pamięci
Deszyfrowanie:
Użytkownik wysyła klucz klienta
Klucz jest weryfikowany w stosunku do przechowywanej wartości HMAC
Klucz dostarczony przez klienta jest następnie używany do deszyfrowania danych
Szyfrowanie po stronie klienta z KMS, CSE-KMS
Podobnie jak w przypadku SSE-KMS, ta metoda również wykorzystuje usługę zarządzania kluczami do generowania kluczy szyfrowania danych. Jednak tym razem KMS jest wywoływane przez klienta, a nie przez S3. Szyfrowanie odbywa się po stronie klienta, a szyfrowane dane są następnie wysyłane do S3 w celu przechowywania.
Szyfrowanie:
Klient żąda klucza danych od KMS
KMS zwraca jawny DEK i szyfrowany DEK z CMK
Oba klucze są wysyłane z powrotem
Klient szyfruje dane za pomocą jawnego DEK i wysyła do S3 szyfrowane dane + szyfrowany DEK (który jest zapisywany jako metadane szyfrowanych danych w S3)
Deszyfrowanie:
Szyfrowane dane z szyfrowanym DEK są wysyłane do klienta
Klient prosi KMS o deszyfrowanie szyfrowanego klucza za pomocą CMK, a KMS wysyła z powrotem jawny DEK
Klient może teraz deszyfrować szyfrowane dane
Szyfrowanie po stronie klienta z kluczami dostarczonymi przez klienta, CSE-C
Korzystając z tego mechanizmu, możesz wykorzystać własne dostarczone klucze i użyć klienta AWS-SDK do szyfrowania danych przed wysłaniem ich do S3 w celu przechowywania.
Szyfrowanie:
Klient generuje DEK i szyfruje jawne dane
Następnie, używając własnego niestandardowego CMK, szyfruje DEK
przesyła szyfrowane dane + szyfrowany DEK do S3, gdzie są przechowywane
Deszyfrowanie:
S3 wysyła szyfrowane dane i DEK
Ponieważ klient już ma CMK użyty do szyfrowania DEK, deszyfruje DEK, a następnie używa jawnego DEK do deszyfrowania danych
# 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żesz uzyskać dostęp do koszyka S3 za pomocą punktu końcowego dual-stack, używając nazwy punktu końcowego w stylu hostowanym wirtualnie lub w stylu ścieżki. Są one przydatne do uzyskiwania dostępu do S3 przez IPv6.
Punkty końcowe dual-stack używają następującej składni:
bucketname.s3.dualstack.aws-region.amazonaws.com
s3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
Na następnej stronie możesz sprawdzić, jak nadużywać uprawnień S3, aby eskalować uprawnienia:
Unauthenticated Access
S3 Post Exploitation
Persistence
Other S3 vulns
S3 HTTP Cache Poisoning Issue
Zgodnie z tym badaniem możliwe było buforowanie odpowiedzi z dowolnego koszyka, jakby należała do innego. Mogło to być nadużywane do zmiany na przykład odpowiedzi plików javascript i kompromitacji dowolnych stron korzystających z S3 do przechowywania statycznego kodu.
Amazon Athena
Amazon Athena to interaktywny serwis zapytań, który ułatwia analizowanie danych bezpośrednio w Amazon Simple Storage Service (Amazon S3) przy użyciu standardowego SQL.
Musisz przygotować tabelę DB relacyjną w formacie treści, która ma się pojawić w monitorowanych koszykach S3. A następnie Amazon Athena będzie mogła zapełnić DB z logów, abyś mógł ją zapytać.
Amazon Athena obsługuje możliwość zapytania danych S3, które są już zaszyfrowane, a jeśli jest to skonfigurowane, Athena może również zaszyfrować wyniki zapytania, które mogą być następnie przechowywane w S3.
To szyfrowanie wyników jest niezależne od podstawowych danych S3, co oznacza, że nawet jeśli dane S3 nie są zaszyfrowane, wyniki zapytania mogą być zaszyfrowane. Kilka punktów, o których warto pamiętać, to to, że Amazon Athena obsługuje tylko dane, które zostały zaszyfrowane przy użyciu następujących metod szyfrowania S3, SSE-S3, SSE-KMS i CSE-KMS.
SSE-C i CSE-E nie są obsługiwane. Oprócz tego ważne jest, aby zrozumieć, że Amazon Athena będzie wykonywać zapytania tylko przeciwko zaszyfrowanym obiektom, które znajdują się w tym samym regionie co samo zapytanie. Jeśli musisz zapytać dane S3, które zostały zaszyfrowane przy użyciu KMS, to użytkownik Athena potrzebuje określonych uprawnień, aby umożliwić mu wykonanie zapytania.
Enumeration
# 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>