

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
<a name="emr-emrfs-encryption-cse"></a>

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](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html) 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
<a name="emr-emrfs-create-cse-key"></a>

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.
+ Verwenden Sie das com.amazonaws.services.s3.model, um die [ Amazon S3-Verschlüsselung zu implementieren. EncryptionMaterialsProvider Schnittstelle. ](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/EncryptionMaterialsProvider.html)
+ Verwenden Sie die Datei [ com.amazonaws.services.elasticmapreduce.spi.security, um die lokale Festplattenverschlüsselung zu implementieren. EncryptionMaterialsProvider Schnittstelle. ](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/spi/security/EncryptionMaterialsProvider.html)

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.

**Example 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](https://github.com/awslabs/emr-sample-apps/tree/master/emrfs-plugins/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
<a name="emr-emrfs-encryption-cse-custom-cli"></a>

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
<a name="emr-emrfs-encryption-cse-custom-sdk"></a>

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.14.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
<a name="emr-emrfs-encryption-custommaterials"></a>

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.14.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
<a name="emr-emrfs-encryption-cse-s3v2"></a>

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](https://aws.amazon.com/blogs/developer/updates-to-the-amazon-s3-encryption-client/). Weitere Informationen finden Sie [ im AWS SDK für Java Entwicklerhandbuch unter Migration des ](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/s3-encryption-migration.html) 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).

**Example 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
<a name="emr-emrfs-cse-config"></a>


| 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 gesetzt`true`, 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](https://aws.amazon.com/articles/client-side-data-encryption-with-the-aws-sdk-for-java-and-amazon-s3/). | 