Amazon S3 to usługa, która pozwala przechowywać duże ilości danych.
Amazon S3 zapewnia wiele opcji do osiągnięcia ochrony danych w spoczynku. Opcje obejmują Uprawnienia (Polityka), Szyfrowanie (Po stronie klienta i serwera), Wersjonowanie kubełka i Usuwanie oparte na MFA. Użytkownik może włączyć dowolną z tych opcji, aby osiągnąć ochronę danych. Replikacja danych to wewnętrzne udogodnienie AWS, gdzie S3 automatycznie replikuje każdy obiekt we wszystkich strefach dostępności, i organizacja nie musi tego włączać w tym przypadku.
Dzięki uprawnieniom opartym na zasobach, można zdefiniować uprawnienia dla podkatalogów kubełka osobno.
Wersjonowanie kubełka i usuwanie oparte na MFA
Gdy wersjonowanie kubełka jest włączone, każda akcja próbująca zmienić plik wewnątrz pliku spowoduje wygenerowanie nowej wersji pliku, zachowując również poprzednią zawartość tego samego pliku. W związku z tym nie nadpisze ona jego zawartości.
Co więcej, usuwanie oparte na MFA uniemożliwi usunięcie wersji pliku w kubełku S3 oraz wyłączenie wersjonowania kubełka, dzięki czemu atakujący nie będzie mógł zmieniać tych plików.
Dzienniki dostępu do S3
Możliwe jest włączenie logowania dostępu do S3 (które domyślnie jest wyłączone) do pewnego kubełka i zapisywanie logów w innym kubełku, aby dowiedzieć się, kto ma dostęp do kubełka (oba kubełki muszą znajdować się w tej samej regionie).
Podpisane adresy URL S3
Możliwe jest wygenerowanie podpisanego adresu URL, który zazwyczaj może być używany do uzyskania dostępu do określonego pliku w kubełku. Podpisany adres URL wygląda tak:
Można utworzyć pre-signed URL za pomocą wiersza poleceń, korzystając z poświadczeń podmiotu mającego dostęp do obiektu (jeśli konto, którego używasz, nie ma dostępu, zostanie utworzony krótszy pre-signed URL, ale będzie on bezużyteczny)
Jedynym wymaganym uprawnieniem do wygenerowania adresu URL z wstępnym podpisem jest udzielone uprawnienie, więc dla poprzedniej komendy jedynym wymaganym uprawnieniem dla podmiotu jest s3:GetObject
Możliwe jest również tworzenie adresów URL z wstępnym podpisem z innymi uprawnieniami:
DEK oznacza klucz szyfrowania danych i jest to klucz zawsze generowany i używany do szyfrowania danych.
Szyfrowanie po stronie serwera przy użyciu zarządzanych kluczy S3, SSE-S3
Ta opcja wymaga minimalnej konfiguracji, a całe zarządzanie używanymi kluczami szyfrowania jest zarządzane przez AWS. Wszystko, co musisz zrobić, to przesłać swoje dane, a S3 zajmie się wszystkimi innymi aspektami. Każdy kubełek w koncie S3 otrzymuje klucz kubełka.
Szyfrowanie:
Dane obiektu + utworzony zwykły DEK --> Zaszyfrowane dane (przechowywane wewnątrz S3)
Utworzony zwykły DEK + Klucz główny S3 --> Zaszyfrowany DEK (przechowywany wewnątrz S3) i zwykły tekst jest usuwany z pamięci
Deszyfrowanie:
Zaszyfrowany DEK + Klucz główny S3 --> Zwykły DEK
Zwykły DEK + Zaszyfrowane dane --> Dane obiektu
Należy zauważyć, że w tym przypadku klucz jest zarządzany przez AWS (rotacja tylko co 3 lata). Jeśli używasz własnego klucza, będziesz mógł rotować, dezaktywować i stosować kontrolę dostępu.
Szyfrowanie po stronie serwera przy użyciu zarządzanych kluczy KMS, SSE-KMS
Ta metoda pozwala S3 na użycie 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ć kontrolę 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 wygenerowania pary zwykłego DEK i zaszyfrowanego DEK i wysyła je do S3
S3 używa zwykłego klucza do zaszyfrowania danych, przechowuje zaszyfrowane dane i zaszyfrowany klucz, a następnie usuwa z pamięci zwykły klucz
Deszyfrowanie:
S3 prosi KMS o zdeszyfrowanie zaszyfrowanego klucza danych obiektu
KMS deszyfruje klucz danych za pomocą CMK i odsyła go do S3
S3 deszyfruje dane obiektu
Szyfrowanie po stronie serwera przy użyciu kluczy dostarczonych przez klienta, SSE-C
Ta opcja daje możliwość dostarczenia własnego klucza głównego, który możesz już używać poza AWS. Twój klucz dostarczony przez klienta zostanie wysłany wraz z danymi do S3, gdzie S3 przeprowadzi dla Ciebie szyfrowanie.
Szyfrowanie:
Użytkownik wysyła dane obiektu + Klucz klienta do S3
Klucz klienta jest używany do zaszyfrowania danych, a zaszyfrowane dane są przechowywane
zasolona wartość HMAC klucza klienta jest również przechowywana do przyszłej weryfikacji klucza
klucz klienta jest usuwany z pamięci
Deszyfrowanie:
Użytkownik wysyła klucz klienta
Klucz jest weryfikowany względem przechowywanej wartości HMAC
Dostarczony przez klienta klucz jest następnie używany do deszyfrowania danych
Szyfrowanie po stronie klienta przy użyciu 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ływany przez klienta, a nie S3. Szyfrowanie odbywa się po stronie klienta, a zaszyfrowane dane są następnie wysyłane do S3 w celu przechowywania.
Szyfrowanie:
Klient żąda klucza danych od KMS
KMS zwraca zwykły DEK i zaszyfrowany DEK z CMK
Oba klucze są wysyłane z powrotem
Klient następnie szyfruje dane za pomocą zwykłego DEK i wysyła do S3 zaszyfrowane dane + zaszyfrowany DEK (który jest zapisany jako metadane zaszyfrowanych danych wewnątrz S3)
Deszyfrowanie:
Zaszyfrowane dane z zaszyfrowanym DEK są wysyłane do klienta
Klient prosi KMS o zdeszyfrowanie zaszyfrowanego klucza za pomocą CMK, a KMS odsyła zwykły DEK
Klient może teraz odszyfrować zaszyfrowane dane
Szyfrowanie po stronie klienta przy użyciu kluczy dostarczonych przez klienta, CSE-C
Korzystając z tego mechanizmu, możesz użyć dostarczonych przez siebie kluczy i użyć klienta AWS-SDK do zaszyfrowania danych przed ich wysłaniem do S3 w celu przechowywania.
Szyfrowanie:
Klient generuje DEK i szyfruje dane zwykłe
Następnie, używając własnego niestandardowego CMK, szyfruje DEK
przesyła zaszyfrowane dane + zaszyfrowany DEK do S3, gdzie są przechowywane
Deszyfrowanie:
S3 wysyła zaszyfrowane dane i DEK
Ponieważ klient już ma CMK użyty do zaszyfrowania DEK, deszyfruje DEK, a następnie używa zwykłego 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 kubełka S3 poprzez punkt końcowy dual-stack, korzystając z nazwy punktu końcowego w stylu hostowanym wirtualnie lub w stylu ścieżki. Są one przydatne do dostępu do S3 poprzez 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
Przywłaszczenie uprawnień
Na następnej stronie możesz sprawdzić, jak nadużyć uprawnienia S3 w celu eskalacji uprawnień:
Zgodnie z tą analizą możliwe było zatruwanie pamięci podręcznej odpowiedzi dowolnego kubełka, jak gdyby należała do innego. Można było to wykorzystać do zmiany na przykład odpowiedzi plików JavaScript i naruszenia dowolnych stron, korzystając z S3 do przechowywania statycznego kodu.
Amazon Athena
Amazon Athena to interaktywna usługa zapytań, która ułatwia analizowanie danych bezpośrednio w usłudze Amazon Simple Storage Service (Amazon S3) za pomocą standardowego SQL.
Musisz przygotować tabelę bazy danych relacyjnej z formatem treści, która pojawi się w monitorowanych kubełkach S3. Następnie Amazon Athena będzie w stanie zapełnić bazę danych 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 skonfigurowana w ten sposób, Athena może również zaszyfrować wyniki zapytania, które można następnie przechowywać w S3.
To szyfrowanie wyników jest niezależne od zapytywanych danych S3, co oznacza, że nawet jeśli dane S3 nie są zaszyfrowane, wyniki zapytania mogą być zaszyfrowane. Należy pamiętać, że Amazon Athena obsługuje tylko dane, które zostały zaszyfrowane za pomocą następujących metod szyfrowania S3: SSE-S3, SSE-KMS i CSE-KMS.
SSE-C i CSE-E nie są obsługiwane. Ponadto ważne jest zrozumienie, że Amazon Athena będzie wykonywać zapytania tylko przeciwko zaszyfrowanym obiektom znajdującym się w tej samej regionie co samo zapytanie. Jeśli chcesz zapytać dane S3, które zostały zaszyfrowane za pomocą KMS, wymagane są określone uprawnienia przez użytkownika Atheny, aby umożliwić im wykonanie zapytania.
Wyliczenie
# 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>