S3-Uploads inkompatibel mit serverseitiger Verschlüsselung

Ich versuche, einen bestehenden Discourse-Server in eine neue AWS-basierte Umgebung zu migrieren und Uploads in S3 in einem Bucket zu speichern, der serverseitige Verschlüsselung mit kundenverwalteten Schlüsseln (SSE-C) verwendet. Während des Wiederherstellungsprozesses werden die Uploads nicht in S3 übertragen – jeder einzelne Upload schlägt fehl. Durch den gezielten Einsatz von tap|p-Debugging habe ich festgestellt, dass der Upload zwar erfolgt, aber die Validierung des zurückgegebenen etag fehlschlägt, da der von S3 nach dem Upload zurückgegebene etag jedes Mal anders ist. Zum Beispiel ist dies der Rückgabewert des Aufrufs put_object bei zwei verschiedenen Wiederherstellungsversuchen:

# Lauf 1
# <struct Aws::S3::Types::PutObjectOutput expiration=nil, etag="\"d49ec2006cfd6fe957af2f711edd9a4b\"", checksum_crc32=nil, checksum_crc32c=nil, checksum_sha1=nil, checksum_sha256=nil, server_side_encryption="aws:kms", version_id="xAF23wQ.zwpoxVmmGiTjxfX0svMZbHAe", sse_customer_algorithm=nil, sse_customer_key_md5=nil, ssekms_key_id="**redacted**", ssekms_encryption_context=nil, bucket_key_enabled=true, request_charged=nil>

# Lauf 2:
# <struct Aws::S3::Types::PutObjectOutput expiration=nil, etag="\"05edffee421c6aef950b3d4418ada293\"", checksum_crc32=nil, checksum_crc32c=nil, checksum_sha1=nil, checksum_sha256=nil, server_side_encryption="aws:kms", version_id="H2_8SVh.Yx2LKB4GIjhyPbVoj_.Vc1E2", sse_customer_algorithm=nil, sse_customer_key_md5=nil, ssekms_key_id="**redacted**", ssekms_encryption_context=nil, bucket_key_enabled=true, request_charged=nil>

(Ich weiß, dass es sich um dieselben Dateien handelt, da ich auch die clientseitige MD5-Summe und die put_object-Anforderungsoptionen ausdrucke, die den Dateinamen enthalten.)

Es stellt sich heraus, dass der ETag-Antwortheader sich… anders verhält, wenn SSE-C verwendet wird:

Objekte, die mit serverseitiger Verschlüsselung mit kundenbereitgestellten Schlüsseln (SSE-C) oder AWS Key Management Service (AWS KMS)-Schlüsseln (SSE-KMS) verschlüsselt sind, haben ETags, die keine MD5-Digest ihrer Objektdaten sind.

Die einzige Möglichkeit, die ich finden kann, um die Integrität von Uploads mit SSE-C zu überprüfen, besteht darin, den Content-MD5-Anforderungsheader zu senden und S3 die Korruptionserkennung durchführen zu lassen. Beachten Sie auch, dass die Prüfung auf bereits hochgeladene Dateien ebenfalls fehlschlägt, wenn SSE-C verwendet wird, aber zumindest kann diese durch SKIP_ETAG_VERIFY deaktiviert werden.

Ich reiche keinen PR ein, da es zwei verschiedene Ansätze gibt:

  1. Erweitern Sie einfach SKIP_ETAG_VERIFY, um die Überprüfung nach dem Upload einzuschließen, was billig und hacky ist und erfordert, dass Benutzer wissen, dass sie diese Option aktivieren müssen, wenn sie SSE-C verwenden. oder
  2. Wechseln Sie zur Verwendung des Content-MD5-Headers (vorzugsweise immer) zur Integritätssicherung von Uploads, was den Vorteil hat, dass es für alle funktioniert, auf Kosten eines weitaus größeren PR.

(Nebenbei bemerkt, bin ich ziemlich beunruhigt, dass niemand dies zuvor getroffen hat – verwendet niemand Discourse mit SSE-C für Uploads?!?)

4 „Gefällt mir“

Meine Vermutung ist, dass „sichere Uploads“ nur in sehr spezifischen Fällen verwendet werden, wodurch 99,8 % aller Uploads ohnehin öffentlich bereitgestellt werden, was jede Art von Verschlüsselung im Ruhezustand nutzlos macht?

Sie liegen hier nicht falsch, Matt, soweit ich weiß, ist dies das erste Mal, dass dies zur Sprache kommt.

(2) scheint für mich der richtige Ansatz zu sein, wenn Sie ihn umsetzen können.

Andernfalls werden Sie wahrscheinlich kein Vertrauen haben, dass alle Dateien ordnungsgemäß vorhanden sind.

Sobald Sie alle Uploads in Ihren S3-Bucket hochgeladen haben, ist der allgemeine Betrieb von Discourse in Ordnung? Sind weitere Änderungen für den täglichen Gebrauch erforderlich (denken Sie an Dinge wie Lagerbestände, die möglicherweise kaputt gehen - vielleicht sind Änderungen für vorab signierte URLs usw. erforderlich)?

5 „Gefällt mir“

Ich werde versuchen, es hinzubekommen. Glücklicherweise sollte es ausreichen, überall nach “etag” zu suchen, um alle Code-Stellen zu finden, die geändert werden müssen, und die Testsuite ist gut aufgebaut, sodass ich leicht herausfinden kann, was ausgeführt und geändert werden muss.

Was andere Dinge angeht, die kaputt gehen könnten, habe ich es noch nicht zu einer funktionierenden Website geschafft, und ich werde weiterhin berichten/PRs einreichen, während ich vorgehe. Das Inventar sollte nicht kaputt gehen, da nur der Dateiinhalt verschlüsselt wird, nicht die Namen. Ich werde wahrscheinlich nicht herausfinden, ob vorab signierte URLs kaputt gehen, da ich sie nicht benutze.

3 „Gefällt mir“

Ich habe gerade diesen PR geöffnet, der die ETag-basierte Upload-Verifizierung während der S3-Migration entfernt. Es stellt sich heraus, dass sie nur während der Migration zu S3 verwendet wird; beim normalen Upload wird sie einfach YOLO’d, was mir das Leben erheblich erleichtert hat. Mit diesem PR und dem zuvor eingereichten ACL-Deaktivierungs-Site-Einstellungs-PR habe ich nun eine abgeschlossene Wiederherstellung. Nächster Schritt: Testen von Funktionen.

6 „Gefällt mir“

Ich glaube, das wurde jetzt zusammengeführt. :partying_face:

1 „Gefällt mir“

Dieses Thema wurde nach 2 Tagen automatisch geschlossen. Neue Antworten sind nicht mehr möglich.