View a markdown version of this page

Clientseitige Verschlüsselung für Amazon S3 - Amazon EMR

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Clientseitige Verschlüsselung für Amazon S3

Mit Amazon S3 bei der clientseitigen Verschlüsselung erfolgt der Amazon-S3-Ver- und Entschlüsselungsvorgang im EMRFS-Client auf Ihrem EMR-Cluster. Objekte werden vor dem Hochladen nach Amazon S3 verschlüsselt und nach dem Herunterladen entschlüsselt. Der von Ihnen festgelegte Anbieter stellt den vom Client verwendeten Verschlüsselungsschlüssel bereit. Der Client kann die von AWS KMS (CSE-KMS) bereitgestellten Schlüssel oder eine benutzerdefinierte Java-Klasse verwenden, die den clientseitigen Root-Schlüssel () CSE-C bereitstellt. Die Verschlüsselungsspezifikationen zwischen CSE-KMS und unterscheiden sich geringfügigCSE-C, abhängig vom angegebenen Anbieter und den Metadaten des Objekts, das entschlüsselt oder verschlüsselt wird. Weitere Informationen zu diesen Unterschieden finden Sie unter Schützen von Daten durch clientseitige Verschlüsselung im Entwicklerhandbuch von Amazon Simple Storage Service.

Anmerkung

Amazon S3 CSE stellt nur sicher, dass EMRFS-Daten, die mit Amazon S3 ausgetauscht werden, verschlüsselt sind. Nicht alle Daten auf den Cluster-Instance-Volumes werden verschlüsselt. Da Hue EMRFS nicht verwendet, werden darüber hinaus Objekte, die vom Hue-S3-Dateibrowser in Amazon S3 geschrieben werden, nicht verschlüsselt.

CSE-KMS Zur Angabe von EMRFS-Daten in Amazon S3 verwenden Sie die AWS CLI
  • Geben Sie den folgenden Befehl ein und MyKMSKeyID ersetzen Sie ihn durch die Schlüssel-ID oder ARN des zu verwendenden KMS-Schlüssels:

    aws emr create-cluster --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=KMS,KMSKeyId=MyKMSKeyId

Erstellen eines benutzerdefinierten Schlüsselanbieters

Abhängig von der Art der Verschlüsselung, die Sie beim Erstellen eines benutzerdefinierten Schlüsselanbieters verwenden, muss die Anwendung auch unterschiedliche EncryptionMaterialsProvider Schnittstellen implementieren. Beide Schnittstellen sind im AWS SDK für Java, Version 1.11.0 und höher, verfügbar.

Sie können jede Strategie verwenden, um Verschlüsselungsmaterial für die Implementierung bereitzustellen. Beispielsweise könnten Sie statische Verschlüsselungsmaterialien bereitstellen oder die Integration in ein komplexeres Schlüsselverwaltungssystem vornehmen.

Wenn Sie die Amazon S3-Verschlüsselung verwenden, müssen Sie die Verschlüsselungsalgorithmen AES/GCM/NoPadding für benutzerdefinierte Verschlüsselungsmaterialien verwenden.

Wenn Sie die lokale Festplattenverschlüsselung verwenden, variiert der für benutzerdefinierte Verschlüsselungsmaterialien zu verwendende Verschlüsselungsalgorithmus je nach EMR-Version. Für Amazon EMR 7.0.0 und niedriger müssen Sie Folgendes verwenden. AES/GCM/NoPadding Für Amazon EMR 7.1.0 und höher müssen Sie AES verwenden.

Die EncryptionMaterialsProvider Klasse erhält Verschlüsselungsmaterial nach Verschlüsselungskontext. Amazon EMR aktualisiert die Verschlüsselungskontextinformationen während der Laufzeit. So wird der Aufrufer bei der Entscheidung unterstützt, welche korrekten Verschlüsselungsmaterialien zurückzugeben sind.

Beispiel Beispiel: Verwenden eines benutzerdefinierten Schlüsselanbieters für die Amazon-S3-Verschlüsselung mit EMRFS

Wenn Amazon EMR die Verschlüsselungsmaterialien aus der EncryptionMaterialsProvider Klasse abruft, um die Verschlüsselung durchzuführen, füllt EMRFS das Argument MaterialsDescription optional mit zwei Feldern auf: der Amazon S3-URI für das Objekt und dem des Clusters, die JobFlowId von der Klasse verwendet werden können, um selektiv Verschlüsselungsmaterial zurückzugeben. EncryptionMaterialsProvider

Beispielsweise kann der Anbieter unterschiedliche Schlüssel für unterschiedliche Amazon-S3-URI-Präfixe zurückgeben. Es ist die Beschreibung der zurückgegebenen Verschlüsselungsmaterialien, die schließlich mit dem Amazon-S3-Objekt gespeichert wird, und nicht der materialsDescription-Wert, der von EMRFS generiert und an den Anbieter weitergeleitet wird. Beim Entschlüsseln eines Amazon S3-Objekts wird die Beschreibung des Verschlüsselungsmaterials an die EncryptionMaterialsProvider Klasse übergeben, sodass sie erneut selektiv den passenden Schlüssel zur Entschlüsselung des Objekts zurückgeben kann.

Eine EncryptionMaterialsProvider Referenzimplementierung finden Sie unten. Ein weiterer benutzerdefinierter Anbieter EMRFSRSAEncryptionMaterialsProvider,, ist erhältlich bei GitHub.

import com.amazonaws.services.s3.model.EncryptionMaterials; import com.amazonaws.services.s3.model.EncryptionMaterialsProvider; import com.amazonaws.services.s3.model.KMSEncryptionMaterials; import org.apache.hadoop.conf.Configurable; import org.apache.hadoop.conf.Configuration; import java.util.Map; /** * Provides KMSEncryptionMaterials according to Configuration */ public class MyEncryptionMaterialsProviders implements EncryptionMaterialsProvider, Configurable{ private Configuration conf; private String kmsKeyId; private EncryptionMaterials encryptionMaterials; private void init() { this.kmsKeyId = conf.get("my.kms.key.id"); this.encryptionMaterials = new KMSEncryptionMaterials(kmsKeyId); } @Override public void setConf(Configuration conf) { this.conf = conf; init(); } @Override public Configuration getConf() { return this.conf; } @Override public void refresh() { } @Override public EncryptionMaterials getEncryptionMaterials(Map<String, String> materialsDescription) { return this.encryptionMaterials; } @Override public EncryptionMaterials getEncryptionMaterials() { return this.encryptionMaterials; } }

Angeben eines Anbieters für benutzerdefinierte Materialien mithilfe der AWS CLI

Um die AWS CLI zu verwenden, übergeben Sie die Argumente Encryption, ProviderType, CustomProviderClass und CustomProviderLocation an die Option emrfs.

aws emr create-cluster --instance-type m5.xlarge --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=Custom,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/provider.jar,CustomProviderClass=classname

Das Festlegen von Encryption auf ClientSide aktiviert die clientseitige Verschlüsselung. CustomProviderClass ist der Name des EncryptionMaterialsProvider-Objekts und CustomProviderLocation ist der lokale oder Amazon-S3-Speicherort, aus dem Amazon EMR CustomProviderClass zu jedem Knoten im Cluster kopiert und in den Klassenpfad platziert.

Angabe eines benutzerdefinierten Materialanbieters unter Verwendung eines SDK

Um ein SDK zu verwenden, können Sie die Eigenschaft fs.s3.cse.encryptionMaterialsProvider.uri auf das Herunterladen der benutzerdefinierten EncryptionMaterialsProvider-Klasse festlegen, die Sie in Amazon S3 auf jedem Knoten Ihres Clusters speichern. Sie konfigurieren dies in der Datei emrfs-site.xml zusammen mit der aktivierten CSE sowie dem richtigen Speicherort des benutzerdefinierten Anbieters.

Bei der AWS SDK für Java Verwendung RunJobFlowRequest könnte Ihr Code beispielsweise wie folgt aussehen:

<snip> Map<String,String> emrfsProperties = new HashMap<String,String>(); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider.uri","s3://amzn-s3-demo-bucket/MyCustomEncryptionMaterialsProvider.jar"); emrfsProperties.put("fs.s3.cse.enabled","true"); emrfsProperties.put("fs.s3.consistent","true"); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider","full.class.name.of.EncryptionMaterialsProvider"); Configuration myEmrfsConfig = new Configuration() .withClassification("emrfs-site") .withProperties(emrfsProperties); RunJobFlowRequest request = new RunJobFlowRequest() .withName("Custom EncryptionMaterialsProvider") .withReleaseLabel("emr-7.13.0") .withApplications(myApp) .withConfigurations(myEmrfsConfig) .withServiceRole("EMR_DefaultRole_V2") .withJobFlowRole("EMR_EC2_DefaultRole") .withLogUri("s3://myLogUri/") .withInstances(new JobFlowInstancesConfig() .withEc2KeyName("myEc2Key") .withInstanceCount(2) .withKeepJobFlowAliveWhenNoSteps(true) .withMasterInstanceType("m5.xlarge") .withSlaveInstanceType("m5.xlarge") ); RunJobFlowResult result = emr.runJobFlow(request); </snip>

Benutzerdefiniert EncryptionMaterialsProvider mit Argumenten

Möglicherweise müssen Sie Argumente direkt dem Anbieter übergeben. Zu diesem Zweck können Sie die emrfs-site-Konfigurationsklassifizierung mit benutzerdefinierten Argumente als Eigenschaften verwenden. Eine Beispielkonfiguration ist nachfolgend gezeigt, die als Datei gespeichert wird, myConfig.json:

[ { "Classification": "emrfs-site", "Properties": { "myProvider.arg1":"value1", "myProvider.arg2":"value2" } } ]

Mit dem create-cluster Befehl von können Sie die --configurations Option verwenden AWS CLI, um die Datei wie folgt anzugeben:

aws emr create-cluster --release-label emr-7.13.0 --instance-type m5.xlarge --instance-count 2 --configurations file://myConfig.json --emrfs Encryption=ClientSide,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/myprovider.jar,CustomProviderClass=classname

Konfiguration der EMRFS-S3EC-V2-Unterstützung

S3-Java-SDK-Versionen (1.11.837 und höher) unterstützen den Verschlüsselungsclient Version 2 (S3EC V2) mit verschiedenen Sicherheitsverbesserungen. Weitere Informationen finden Sie im S3-Blogbeitrag: Updates für den Amazon S3 Encryption Client. Weitere Informationen finden Sie im AWS SDK für Java Entwicklerhandbuch unter Migration des Amazon S3-Verschlüsselungsclients.

Der Encryption Client V1 ist aus Gründen der Abwärtskompatibilität weiterhin im SDK verfügbar. Standardmäßig verwendet EMRFS S3EC V1 zum Verschlüsseln und Entschlüsseln von S3-Objekten, wenn CSE aktiviert ist.

Mit S3EC V2 verschlüsselte S3-Objekte können nicht von EMRFS auf einem EMR-Cluster entschlüsselt werden, dessen Release-Version älter als emr-5.31.0 ist (emr-5.30.1 und früher, emr-6.1.0 und früher).

Beispiel Konfigurieren Sie EMRFS für die Verwendung von S3EC V2

Um EMRFS für die Verwendung von S3EC V2 zu konfigurieren, fügen Sie die folgende Konfiguration hinzu:

{ "Classification": "emrfs-site", "Properties": { "fs.s3.cse.encryptionV2.enabled": "true" } }

emrfs-site.xml Eigenschaften für die clientseitige Amazon S3-Verschlüsselung

Eigenschaft Standardwert Description
fs.s3.cse.enabled false

Wenn dies auf true festgelegt ist, werden in Amazon S3 gespeicherte EMRFS-Objekte mittels clientseitiger Verschlüsselung verschlüsselt.

fs.s3.cse.encryptionV2.enabled false

Wenn diese Option auf true gesetzt ist, verwendet EMRFS den S3-Verschlüsselungsclient Version 2 zum Verschlüsseln und Entschlüsseln von Objekten auf S3. Verfügbar in der EMR-Version 5.31.0 und höher verfügbar.

fs.s3.cse.encryptionMaterialsProvider.uri N/A Gilt bei der Verwendung benutzerdefinierter Verschlüsselungsmaterialien. Die Amazon-S3-URI, in der sich die JAR mit dem EncryptionMaterialsProvider befindet. Wenn Sie diesen URI bereitstellen, Amazon EMR automatisch die JAR-Datei auf alle Knoten im Cluster herunter.
fs.s3.cse.encryptionMaterialsProvider N/A

Der EncryptionMaterialsProvider-Klassenpfad, der bei der clientseitigen Verschlüsselung verwendet wird. Geben Sie bei der Verwendung CSE-KMS an. com.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider

fs.s3.cse.materialsDescription.enabled false

Wenn auf gesetzttrue, füllt die MaterialsDescription verschlüsselter Objekte mit der Amazon S3-URI für das Objekt und den. JobFlowId Bei der Verwendung benutzerdefinierter Verschlüsselungsmaterialien auf true setzen.

fs.s3.cse.kms.keyId N/A

Gilt bei Verwendung von. CSE-KMS Der Wert von KeyId, ARN oder Alias des KMS-Schlüssels, der für die Verschlüsselung verwendet wird.

fs.s3.cse.cryptoStorageMode ObjectMetadata

Der Amazon-S3-Speichermodus. Standardmäßig wird die Beschreibung der Verschlüsselungsdaten in den Objektmetadaten gespeichert. Sie können die Beschreibung auch in einer Anweisungsdatei speichern. Gültige Werte sind ObjectMetadata undInstructionFile. Weitere Informationen finden Sie unter Client-side Datenverschlüsselung mit AWS SDK für Java und Amazon S3.