Amazon S3 ist ein Dienst, der es Ihnen ermöglicht, große Mengen an Daten zu speichern.
Amazon S3 bietet mehrere Optionen, um den Schutz von Daten im Ruhezustand zu gewährleisten. Die Optionen umfassen Berechtigungen (Richtlinie), Verschlüsselung (Client- und Server-Seite), Bucket-Versionierung und MFAbasierte Löschung. Der Benutzer kann eine dieser Optionen aktivieren, um den Datenschutz zu erreichen. Datenreplikation ist eine interne Funktion von AWS, bei der S3 automatisch jedes Objekt über alle Verfügbarkeitszonen repliziert und die Organisation es in diesem Fall nicht aktivieren muss.
Mit ressourcenbasierten Berechtigungen können Sie Berechtigungen für Unterverzeichnisse Ihres Buckets separat definieren.
Bucket-Versionierung und MFA-basierte Löschung
Wenn die Bucket-Versionierung aktiviert ist, erzeugt jede Aktion, die versucht, eine Datei innerhalb einer Datei zu ändern, eine neue Version der Datei und behält auch den vorherigen Inhalt derselben bei. Daher wird der Inhalt nicht überschrieben.
Darüber hinaus verhindert die MFA-basierte Löschung, dass Versionen von Dateien im S3-Bucket gelöscht werden und auch, dass die Bucket-Versionierung deaktiviert wird, sodass ein Angreifer diese Dateien nicht ändern kann.
S3-Zugriffsprotokolle
Es ist möglich, das S3-Zugriffsprotokoll (das standardmäßig deaktiviert ist) für einen Bucket zu aktivieren und die Protokolle in einem anderen Bucket zu speichern, um zu erfahren, wer auf den Bucket zugreift (beide Buckets müssen sich in derselben Region befinden).
S3-Vorgenehmigte URLs
Es ist möglich, eine vorgenehmigte URL zu generieren, die normalerweise verwendet werden kann, um auf die angegebene Datei im Bucket zuzugreifen. Eine vorgenehmigte URL sieht so aus:
Ein vorab signierter URL kann über die CLI mit den Anmeldeinformationen eines Hauptnutzers erstellt werden, der Zugriff auf das Objekt hat (wenn das Konto, das Sie verwenden, keinen Zugriff hat, wird ein kürzerer vorab signierter URL erstellt, der jedoch nutzlos sein wird)
Die einzige erforderliche Berechtigung zum Generieren einer vorab signierten URL ist die erteilte Berechtigung. Für den vorherigen Befehl benötigt der Principal also nur die Berechtigung s3:GetObject.
Es ist auch möglich, vorab signierte URLs mit anderen Berechtigungen zu erstellen:
DEK bedeutet Datenverschlüsselungsschlüssel und ist der Schlüssel, der immer generiert wird und zur Verschlüsselung von Daten verwendet wird.
Serverseitige Verschlüsselung mit S3 verwalteten Schlüsseln, SSE-S3
Diese Option erfordert minimale Konfiguration und die gesamte Verwaltung der verwendeten Verschlüsselungsschlüssel wird von AWS verwaltet. Alles, was Sie tun müssen, ist Ihre Daten hochzuladen und S3 kümmert sich um alle anderen Aspekte. Jeder Bucket in einem S3-Konto erhält einen Bucket-Schlüssel.
Verschlüsselung:
Objekt Daten + erstellter Klartext DEK --> Verschlüsselte Daten (in S3 gespeichert)
Erstellter Klartext DEK + S3 Master Key --> Verschlüsselter DEK (in S3 gespeichert) und der Klartext wird aus dem Speicher gelöscht
Entschlüsselung:
Verschlüsselter DEK + S3 Master Key --> Klartext DEK
Klartext DEK + Verschlüsselte Daten --> Objekt Daten
Bitte beachten Sie, dass in diesem Fall der Schlüssel von AWS verwaltet wird (Rotation nur alle 3 Jahre). Wenn Sie Ihren eigenen Schlüssel verwenden, können Sie rotieren, deaktivieren und Zugriffskontrollen anwenden.
Serverseitige Verschlüsselung mit KMS verwalteten Schlüsseln, SSE-KMS
Diese Methode ermöglicht es S3, den Schlüsselverwaltungsdienst zu nutzen, um Ihre Datenverschlüsselungsschlüssel zu generieren. KMS bietet Ihnen eine viel größere Flexibilität, wie Ihre Schlüssel verwaltet werden. Zum Beispiel können Sie die CMK deaktivieren, rotieren und Zugriffskontrollen anwenden sowie deren Nutzung über AWS Cloud Trail überwachen.
Verschlüsselung:
S3 fordert Datenkeys von KMS CMK an
KMS verwendet eine CMK, um das Paar DEK Klartext und DEK verschlüsselt zu generieren und sendet sie an S3
S3 verwendet den Klartextschlüssel, um die Daten zu verschlüsseln, speichert die verschlüsselten Daten und den verschlüsselten Schlüssel und löscht den Klartextschlüssel aus dem Speicher
Entschlüsselung:
S3 fragt KMS, um den verschlüsselten Datenkey des Objekts zu entschlüsseln
KMS entschlüsselt den Datenkey mit der CMK und sendet ihn an S3 zurück
S3 entschlüsselt die Objekt Daten
Serverseitige Verschlüsselung mit vom Kunden bereitgestellten Schlüsseln, SSE-C
Diese Option gibt Ihnen die Möglichkeit, Ihren eigenen Master-Schlüssel bereitzustellen, den Sie möglicherweise bereits außerhalb von AWS verwenden. Ihr vom Kunden bereitgestellter Schlüssel würde dann mit Ihren Daten an S3 gesendet, wo S3 dann die Verschlüsselung für Sie durchführt.
Verschlüsselung:
Der Benutzer sendet die Objekt Daten + Kunden Schlüssel an S3
Der Kunden Schlüssel wird verwendet, um die Daten zu verschlüsseln, und die verschlüsselten Daten werden gespeichert
Ein gesalzener HMAC-Wert des Kunden Schlüssels wird ebenfalls für zukünftige Schlüsselvalidierung gespeichert
Der Kunden Schlüssel wird aus dem Speicher gelöscht
Entschlüsselung:
Der Benutzer sendet den Kunden Schlüssel
Der Schlüssel wird gegen den gespeicherten HMAC-Wert validiert
Der vom Kunden bereitgestellte Schlüssel wird dann verwendet, um die Daten zu entschlüsseln
Client-seitige Verschlüsselung mit KMS, CSE-KMS
Ähnlich wie bei SSE-KMS verwendet dies ebenfalls den Schlüsselverwaltungsdienst, um Ihre Datenverschlüsselungsschlüssel zu generieren. Diesmal wird KMS jedoch über den Client und nicht über S3 aufgerufen. Die Verschlüsselung erfolgt dann clientseitig und die verschlüsselten Daten werden an S3 gesendet, um gespeichert zu werden.
Verschlüsselung:
Client fordert einen Datenkey von KMS an
KMS gibt den Klartext DEK und den verschlüsselten DEK mit der CMK zurück
Beide Schlüssel werden zurückgesendet
Der Client verschlüsselt dann die Daten mit dem Klartext DEK und sendet die verschlüsselten Daten + den verschlüsselten DEK (der als Metadaten der verschlüsselten Daten in S3 gespeichert wird) an S3
Entschlüsselung:
Die verschlüsselten Daten mit dem verschlüsselten DEK werden an den Client gesendet
Der Client fragt KMS, um den verschlüsselten Schlüssel mit der CMK zu entschlüsseln, und KMS sendet den Klartext DEK zurück
Der Client kann nun die verschlüsselten Daten entschlüsseln
Client-seitige Verschlüsselung mit vom Kunden bereitgestellten Schlüsseln, CSE-C
Mit diesem Mechanismus können Sie Ihre eigenen bereitgestellten Schlüssel nutzen und einen AWS-SDK-Client verwenden, um Ihre Daten zu verschlüsseln, bevor Sie sie zur Speicherung an S3 senden.
Verschlüsselung:
Der Client generiert einen DEK und verschlüsselt die Klartextdaten
Dann verschlüsselt er mit seiner eigenen benutzerdefinierten CMK den DEK
Sendet die verschlüsselten Daten + verschlüsselten DEK an S3, wo sie gespeichert werden
Entschlüsselung:
S3 sendet die verschlüsselten Daten und DEK
Da der Client bereits die CMK hat, die zur Verschlüsselung des DEK verwendet wurde, entschlüsselt er den DEK und verwendet dann den Klartext DEK, um die Daten zu entschlüsseln
# 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
Sie können auf einen S3-Bucket über einen Dual-Stack-Endpunkt zugreifen, indem Sie einen virtual hosted-style oder einen path-style Endpunktnamen verwenden. Diese sind nützlich, um S3 über IPv6 zuzugreifen.
Dual-Stack-Endpunkte verwenden die folgende Syntax:
bucketname.s3.dualstack.aws-region.amazonaws.com
s3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
Auf der folgenden Seite können Sie überprüfen, wie man S3-Berechtigungen missbrauchen kann, um Privilegien zu eskalieren:
Unauthenticated Access
S3 Post Exploitation
Persistence
Other S3 vulns
S3 HTTP Cache Poisoning Issue
Laut dieser Forschung war es möglich, die Antwort eines beliebigen Buckets zu cachen, als ob sie zu einem anderen gehörte. Dies hätte missbraucht werden können, um beispielsweise die Antworten von Javascript-Dateien zu ändern und beliebige Seiten zu kompromittieren, die S3 zur Speicherung von statischem Code verwenden.
Amazon Athena
Amazon Athena ist ein interaktiver Abfragedienst, der es einfach macht, Daten direkt im Amazon Simple Storage Service (Amazon S3) unter Verwendung von standard SQL zu analysieren.
Sie müssen eine relationale DB-Tabelle mit dem Format des Inhalts vorbereiten, der in den überwachten S3-Buckets erscheinen wird. Anschließend kann Amazon Athena die DB aus den Protokollen befüllen, sodass Sie Abfragen durchführen können.
Amazon Athena unterstützt die Möglichkeit, S3-Daten abzufragen, die bereits verschlüsselt sind, und wenn es so konfiguriert ist, kann Athena auch die Ergebnisse der Abfrage verschlüsseln, die dann in S3 gespeichert werden können.
Diese Verschlüsselung der Ergebnisse ist unabhängig von den zugrunde liegenden abgefragten S3-Daten, was bedeutet, dass selbst wenn die S3-Daten nicht verschlüsselt sind, die abgefragten Ergebnisse verschlüsselt werden können. Ein paar Punkte, die zu beachten sind, sind, dass Amazon Athena nur Daten unterstützt, die mit den folgenden S3-Verschlüsselungsmethodenverschlüsselt wurden: SSE-S3, SSE-KMS und CSE-KMS.
SSE-C und CSE-E werden nicht unterstützt. Darüber hinaus ist es wichtig zu verstehen, dass Amazon Athena nur Abfragen gegen verschlüsselte Objekte ausführen wird, die sich in derselben Region wie die Abfrage selbst befinden. Wenn Sie S3-Daten abfragen müssen, die mit KMS verschlüsselt wurden, sind spezifische Berechtigungen für den Athena-Benutzer erforderlich, um ihm die Durchführung der Abfrage zu ermöglichen.
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>