

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.

# In CloudTrail Lake gespeicherte Abfrageergebnisse validieren
<a name="cloudtrail-query-results-validation"></a>

Um festzustellen, ob die Abfrageergebnisse nach CloudTrail der Übermittlung der Abfrageergebnisse geändert, gelöscht oder unverändert wurden, können Sie die Integritätsprüfung der CloudTrail Abfrageergebnisse verwenden. Dieses Feature wurde mit dem Branchenstandard entsprechenden Algorithmen entwickelt: SHA-256 für die Hashfunktion und SHA-256 mit RSA für digitale Signaturen. Dadurch ist es rechnerisch unmöglich, CloudTrail Abfrageergebnisdateien unbemerkt zu ändern, zu löschen oder zu fälschen. Sie können die Befehlszeilenschnittstelle zur Validierung von Abfrageergebnisdateien verwenden. 

## Warum sollten Sie diese Funktion nutzen?
<a name="cloudtrail-query-results-validation-use-cases"></a>

Validierte Abfrageergebnisdateien sind bei Sicherheits- und kriminaltechnischen Ermittlungen unersetzlich. Mit einer validierten Abfrageergebnisdatei können Sie beispielsweise bestätigen, dass sich die Abfrageergebnisdatei selbst nicht geändert hat. Bei der Integritätsprüfung der CloudTrail Abfrageergebnisdatei erfahren Sie auch, ob eine Abfrageergebnisdatei gelöscht oder geändert wurde. 

**Topics**
+ [Warum sollten Sie diese Funktion nutzen?](#cloudtrail-query-results-validation-use-cases)
+ [Überprüfen Sie gespeicherte Abfrageergebnisse mit dem AWS CLI](#cloudtrail-query-results-validation-cli)
+ [CloudTrail Dateistruktur signieren](#cloudtrail-results-file-validation-sign-file-structure)
+ [Benutzerdefinierte Implementierungen der Integritätsprüfung von CloudTrail Abfrageergebnisdateien](#cloudtrail-results-file-custom-validation)

## Überprüfen Sie gespeicherte Abfrageergebnisse mit dem AWS CLI
<a name="cloudtrail-query-results-validation-cli"></a>

Sie können die Integrität der Abfrageergebnisdateien und der Sign-Datei mit dem Befehl [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudtrail/verify-query-results.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudtrail/verify-query-results.html) überprüfen.

### Voraussetzungen
<a name="cloudtrail-query-results-validation-cli-prerequisites"></a>

Zum Überpfüfen der Integrität von Abfrageergebnissen mit der Befehlszeile müssen die folgenden Bedingungen erfüllt sein:
+ Sie müssen über eine Online-Verbindung zu verfügen AWS.
+ Sie müssen AWS CLI Version 2 verwenden.
+ Um Abfrageergebnisdateien zu validieren und die Datei lokal zu signieren, gelten die folgenden Bedingungen:
  + Sie müssen die Abfrageergebnisdateien und die Sign-Datei im angegebenen Dateipfad ablegen. Geben Sie den Dateipfad als Wert für den **--local-export-path**-Parameter an.
  + Sie dürfen die Abfrageergebnisdateien und die Sign-Datei nicht umbenennen.
+ Um die Abfrageergebnisdateien zu validieren und die Datei im S3-Bucket zu signieren, gelten die folgenden Bedingungen:
  + Sie dürfen die Abfrageergebnisdateien und die Sign-Datei nicht umbenennen.
  + Sie müssen über Lesezugriff auf den Amazon-S3-Bucket verfügen, der die Abfrageergebnisdateien und die Sign-Datei enthält.
  + Das angegebene S3-Präfix muss die Abfrageergebnisdateien und die Sign-Datei enthalten. Geben Sie das S3-Präfix als Wert für den **--s3-prefix**-Parameter an.

### verify-query-results
<a name="cloudtrail-query-results-validation-cli-command"></a>

 Der Befehl **verify-query-results** überprüft den Hashwert jeder Abfrageergebnisdatei, indem er den Wert mit dem `fileHashValue` in der Sign-Datei vergleicht und validiert dann den Wert `hashSignature` in der Sign-Datei. 

Wenn Sie Abfrageergebnisse überprüfen, können Sie entweder die Befehlszeilenoptionen **--s3-bucket** und **--s3-prefix** verwenden, um die Abfrageergebnisdateien zu validieren und die in einem S3-Bucket gespeicherte Datei zu signieren, oder Sie verwenden die Befehlszeilenoption **--local-export-path**, um eine lokale Überprüfung der heruntergeladenen Abfrageergebnisdateien und der Sign-Datei durchzuführen.

**Anmerkung**  
Der Befehl **verify-query-results** ist regionsspezifisch. Sie müssen die **--region** globale Option angeben, um die Abfrageergebnisse für einen bestimmten Bereich zu überprüfen AWS-Region.

Im Folgenden werden die Optionen für den Befehl **verify-query-results** aufgeführt.

**--s3-bucket** *<string>*  
Gibt den S3-Bucket-Namen an, der die Abfrageergebnisdateien und die Sign-Datei speichert. Sie können diesen Parameter nicht mit **--local-export-path** verwenden.

**--s3-prefix** *<string>*  
Gibt den S3-Pfad des S3-Ordners an, der die Abfrageergebnisdateien und die Sign-Datei enthält (z. B. `s3/path/`). Sie können diesen Parameter nicht mit **--local-export-path** verwenden. Sie müssen diesen Parameter nicht angeben, wenn sich die Dateien im Stammverzeichnis des S3-Buckets befinden.

**--local-export-path** *<string>*  
Gibt das lokale Verzeichnis an, das die Abfrageergebnisdateien und die Sign-Datei enthält (z. B. `/local/path/to/export/file/`). Sie können diesen Parameter nicht mit **--s3-bucket** oder **--s3-prefix** verwenden.

#### Beispiele
<a name="cloudtrail-query-results-validation-cli-examples"></a>

Im folgenden Beispiel werden Abfrageergebnisse mithilfe der Befehlszeilenoptionen **--s3-bucket** und **--s3-prefix** überprüft, um den Namen und das Präfix des S3-Buckets anzugeben, der die Abfrageergebnisdateien und die Sign-Datei enthält.

```
aws cloudtrail verify-query-results --s3-bucket amzn-s3-demo-bucket --s3-prefix prefix --region region
```

Im folgenden Beispiel werden heruntergeladene Abfrageergebnisse mithilfe der **--local-export-path**-Befehlszeilenoption überprüft, um den lokalen Pfad für die Abfrageergebnisdateien und die Sign-Datei anzugeben. Weitere Informationen zum Herunterladen von Abfrageergebnisdateien finden Sie unter [Laden Sie Ihre in CloudTrail Lake gespeicherten Abfrageergebnisse herunter](view-download-cloudtrail-lake-query-results.md#cloudtrail-download-lake-query-results).

```
aws cloudtrail verify-query-results --local-export-path local_file_path --region region
```

#### Validierungsergebnisse
<a name="cloudtrail-query-results-validation-cli-command-messages"></a>

Die folgende Tabelle beschreibt die möglichen Validierungsmeldungen für Abfrageergebnisdateien und der Sign-Datei.


****  

| Dateityp | Validierungsmeldung | Description | 
| --- | --- | --- | 
| Sign file | Successfully validated sign and query result files | Die Signatur der Sign-Datei ist gültig. Die Abfrageergebnisdateien, auf die sie verweist, können überprüft werden. | 
| Query result file |  `ValidationError: "File file_name has inconsistent hash value with hash value recorded in sign file, hash value in sign file is expected_hash, but get computed_hash`  | Die Überprüfung ist fehlgeschlagen, weil der Hashwert für die Abfrageergebnisdatei nicht mit dem fileHashValue in der Sign-Datei übereinstimmt. | 
| Sign file |  `ValidationError: Invalid signature in sign file`  | Die Überprüfung der Sign-Datei ist fehlgeschlagen, da die Signatur nicht gültig ist. | 

## CloudTrail Dateistruktur signieren
<a name="cloudtrail-results-file-validation-sign-file-structure"></a>

Die Sign-Datei enthält den Namen von allen Abfrageergebnissen, die an Ihren Amazon-S3-Bucket übermittelt wurden, als Sie die Abfrageergebnisse gespeichert haben, den Hash-Wert für jede Abfrageergebnisdatei und die digitale Signatur der Datei. Die digitale Signatur und Hash-Werte werden zur Validierung der Integrität der Abfrageergebnisdateien und der Sign-Datei selbst verwendet. 

### Speicherort von Sign-Dateien
<a name="cloudtrail-results-file-validation-sign-file-location"></a>

Die Sign-Datei wird an einen Amazon-S3-Bucket-Speicherort übermittelt, der dieser Syntax folgt.

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/aws-account-ID/CloudTrail-Lake/Query/year/month/date/query-ID/result_sign.json
```

### Beispiel von Sign-Dateiinhalten
<a name="cloudtrail-results-file-validation-sign-file-contents"></a>

Die folgende Beispielsigndatei enthält Informationen für CloudTrail Lake-Abfrageergebnisse.

```
{
  "version": "1.0",
  "region": "us-east-1",
  "files": [
    {
      "fileHashValue" : "de85a48b8a363033c891abd723181243620a3af3b6505f0a44db77e147e9c188",
      "fileName" : "result_1.csv.gz"
    }
  ],
  "hashAlgorithm" : "SHA-256",
  "signatureAlgorithm" : "SHA256withRSA",
  "queryCompleteTime": "2022-05-10T22:06:30Z",
  "hashSignature" : "7664652aaf1d5a17a12ba50abe6aca77c0ec76264bdf7dce71ac6d1c7781117c2a412e5820bccf473b1361306dff648feae20083ad3a27c6118172a81635829bdc7f7b795ebfabeb5259423b2fb2daa7d1d02f55791efa403dac553171e7ce5f9307d13e92eeec505da41685b4102c71ec5f1089168dacde702c8d39fed2f25e9216be5c49769b9db51037cb70a84b5712e1dffb005a74580c7fdcbb89a16b9b7674e327de4f5414701a772773a4c98eb008cca34228e294169901c735221e34cc643ead34628aabf1ba2c32e0cdf28ef403e8fe3772499ac61e21b70802dfddded9bea0ddfc3a021bf2a0b209f312ccee5a43f2b06aa35cac34638f7611e5d7",
  "publicKeyFingerprint" : "67b9fa73676d86966b449dd677850753"
}
```

### Beschreibungen der Felder in Sign-Dateien
<a name="cloudtrail-results-file-validation-sign-file-descriptions"></a>

Im Folgenden sind Beschreibungen für die einzelnen Felder in der Sign-Datei aufgeführt: 

`version`  
Die Version der Sign-Datei. 

`region`  
Die Region für das AWS Konto, das zum Speichern der Abfrageergebnisse verwendet wurde. 

`files.fileHashValue`  
Der im Hexadezimalformat verschlüsselte Hash-Wert des komprimierten Inhalts der Abfrageergebnisdatei.

`files.fileName`  
Der Name der Abfrageergebnisdatei. 

`hashAlgorithm`  
Der für das Hashing der Abfrageergebnisdatei verwendete Hash-Algorithmus. 

`signatureAlgorithm`  
Der zum Signieren der Datei verwendete Algorithmus. 

`queryCompleteTime`  
Gibt an, wann die Abfrageergebnisse an den S3-Bucket CloudTrail übermittelt wurden. Sie können diesen Wert verwenden, um den öffentlichen Schlüssel zu finden.

`hashSignature`  
Die Hash-Signatur für die Datei.

`publicKeyFingerprint`  
Der im Hexadezimalformat verschlüsselte Fingerabdruck des öffentlichen Schlüssels, der zum Signieren der Datei verwendet wurde.

## Benutzerdefinierte Implementierungen der Integritätsprüfung von CloudTrail Abfrageergebnisdateien
<a name="cloudtrail-results-file-custom-validation"></a>

Da branchenübliche, offen verfügbare kryptografische Algorithmen und Hashfunktionen CloudTrail verwendet werden, können Sie Ihre eigenen Tools erstellen, um die Integrität der CloudTrail Abfrageergebnisdateien zu überprüfen. Wenn Sie Abfrageergebnisse in einem Amazon S3 S3-Bucket speichern, wird CloudTrail eine Signierdatei an Ihren S3-Bucket gesendet. Sie können Ihre eigene Validierungslösung implementieren, um die Signatur- und Abfrageergebnisdateien zu überprüfen. Weitere Informationen zur Sign-Datei finden Sie unte [CloudTrail Dateistruktur signieren](#cloudtrail-results-file-validation-sign-file-structure). 

In diesem Thema wird das Signieren von Sign-Dateien beschrieben. Zudem werden detailliert die Schritte dargelegt, die zur Implementierung einer Lösung für die Validierung von Sign-Dateien sowie den von der Sign-Datei referenzierten Abfrageergebnisdateien ausgeführt werden müssen. 

### Verstehen, wie CloudTrail Signdateien signiert werden
<a name="cloudtrail-results-file-custom-validation-how-cloudtrail-sign-files-are-signed"></a>

CloudTrail Signierdateien werden mit digitalen RSA-Signaturen signiert. CloudTrailFührt für jede Signierdatei Folgendes aus: 

1. Erstellt eine Hashliste, die den Hashwert für jede Abfrageergebnisdatei enthält.

1. Ein privater Schlüssel, der für die Region eindeutig ist, wird abgerufen.

1. Der SHA-256-Hash der Zeichenfolge und der private Schlüssel werden an den RSA-Signaturalgorithmus übergeben, der die digitale Signatur generiert.

1. Der Byte-Signaturcode wird im Hexadezimalformat verschlüsselt.

1. Fügt die digitale Signatur in die Sign-Datei ein.

#### Inhalt der Datensignatur-Zeichenfolge
<a name="cloudtrail-results-file-custom-validation-data-signing-string-summary"></a>

Die Datensignierungszeichenfolge besteht aus dem Hashwert für jede Abfrageergebnisdatei, getrennt durch ein Leerzeichen. Die Sign-Datei listet den `fileHashValue` für jede Abfrageergebnisdatei auf.

### Schritte der benutzerdefinierten Validierungsimplementierung
<a name="cloudtrail-results-file-custom-validation-steps"></a>

Bei der Implementierung einer benutzerdefinierten Validierungslösung müssen Sie zunächst die Sign-Datei und anschließend die von ihr referenzierten Abfrageergebnisdateien validieren. 

#### Validieren der Sign-Datei
<a name="cloudtrail-results-file-custom-validation-steps-sign"></a>

Zur Validierung einer Sign-Datei benötigen Sie die Signatur, den öffentlichen Schlüssel, dessen privater Schlüssel zum Signieren verwendet wurde und eine berechnete Datensignatur-Zeichenfolge. 

1. Rufen Sie die Sign-Datei ab.

1. Überprüfen Sie, ob die Sign-Datei vom ursprünglichen Speicherort abgerufen wurde. 

1. Rufen Sie die im Hexadezimalformat verschlüsselte Signatur der Sign-Datei ab.

1. Rufen Sie den im Hexadezimalformat verschlüsselten Fingerabdruck des öffentlichen Schlüssels ab, dessen privater Schlüssel zum Signieren der Sign-Datei verwendet wurde.

1. Rufen Sie den öffentlichen Schlüssel für den `queryCompleteTime` entsprechenden Zeitraum der Sign-Datei ab. Wählen Sie für den Zeitraum eine frühere `StartTime` als die `queryCompleteTime` und eine spätere `EndTime` als die `queryCompleteTime`.

1. Wählen Sie aus den abgerufenen öffentlichen Schlüsseln denjenigen aus, dessen Fingerabdruck mit dem `publicKeyFingerprint`-Wert in der Sign-Datei übereinstimmt.

1. Erstellen Sie mithilfe einer Hashliste, die den Hashwert für jede Abfrageergebnisdatei durch ein Leerzeichen getrennt enthält, die Datensignaturzeichenfolge neu, die zur Überprüfung der Signatur der Sign-Datei verwendet wird. Die Sign-Datei listet den `fileHashValue` für jede Abfrageergebnisdatei auf.

   Wenn das `files`-Array Ihrer Sign-Datei beispielsweise die folgenden drei Abfrageergebnisdateien enthält, lautet Ihre Hashliste „aaa bbb ccc“.

   ```
   “files": [ 
      { 
           "fileHashValue" : “aaa”, 
           "fileName" : "result_1.csv.gz" 
      },
      {       
           "fileHashValue" : “bbb”,       
           "fileName" : "result_2.csv.gz"      
      },
      { 
           "fileHashValue" : “ccc”,       
           "fileName" : "result_3.csv.gz" 
      }
   ],
   ```

1. Überprüfen Sie die Signatur, indem Sie den SHA-256-Hash der Zeichenfolge, den öffentlichen Schlüssel und die Signatur als Parameter an den RSA-Signaturprüfalgorithmus übergeben. Wenn das Ergebnis "True" lautet, ist die Sign-Datei gültig. 

#### Validieren der Abfrageergebnissdateien
<a name="cloudtrail-results-file-custom-validation-steps-logs"></a>

Überprüfen Sie die Abfrageergebnisdateien, auf die die Sign-Datei verweist, wenn die Sign-Datei gültig ist. Um die Integrität einer Abfrageergebnisdatei zu überprüfen, berechnen Sie ihren SHA-256-Hashwert für ihren komprimierten Inhalt und vergleichen Sie die Ergebnisse mit dem `fileHashValue` für die Abfrageergebnisdatei, die in der Sign-Datei aufgezeichnet wurde. Stimmen die Hashwerte überein, ist die Abfrageergebnisdatei gültig.

In den folgenden Abschnitten wird dieser Validierungsprozess ausführlich beschrieben.

#### A. Abrufen der Sign-Datei
<a name="cloudtrail-results-file-custom-validation-steps-get-the-sign-file"></a>

Die ersten Schritte bestehen darin, die Sign-Datei und den Fingerabdruck des öffentlichen Schlüssels abzurufen.

1. Rufen Sie die Sign-Datei aus Ihrem Amazon S3-Bucket für die Abfrageergebnisse ab, die Sie validieren möchten. 

1. Rufen Sie als Nächstes den `hashSignature`-Wert aus der Sign-Datei ab.

1. Rufen Sie in der Sign-Datei den Fingerabdruck des öffentlichen Schlüssels, dessen privater Schlüssel zum Signieren der Datei verwendet wurde, aus dem Feld `publicKeyFingerprint` ab. 

#### B. Abrufen des öffentlichen Schlüssels zur Validierung der Sign-Datei
<a name="cloudtrail-results-file-custom-validation-steps-retrieve-public-key"></a>

Um den öffentlichen Schlüssel zur Validierung der Signdatei zu erhalten, können Sie entweder die AWS CLI oder die CloudTrail API verwenden. In beiden Fällen geben Sie einen Zeitraum (Start- und Endzeitpunkt) für die zu validierende Sign-Datei an. Verwenden Sie einen Zeitraum, der der `queryCompleteTime` in der Sign-Datei entspricht. Für den angegebenen Zeitraum können ein oder mehrere öffentliche Schlüssel zurückgegeben werden. Möglicherweise überschneiden sich die Gültigkeitszeiträume der zurückgegebenen Schlüssel.

**Anmerkung**  
Da pro Region unterschiedliche private/public Schlüsselpaare CloudTrail verwendet werden, ist jede Signierdatei mit einem privaten Schlüssel signiert, der für ihre Region einzigartig ist. Wenn Sie also die Sign-Datei einer bestimmten Region validieren, müssen Sie den öffentlichen Schlüssel dieser Region abrufen.

##### Verwenden Sie den AWS CLI , um öffentliche Schlüssel abzurufen
<a name="cloudtrail-results-file-custom-validation-steps-retrieve-public-key-cli"></a>

Um mit dem einen öffentlichen Schlüssel für eine Signdatei abzurufen AWS CLI, verwenden Sie den `cloudtrail list-public-keys` Befehl. Der Befehl hat das folgende Format: 

 `aws cloudtrail list-public-keys [--start-time <start-time>] [--end-time <end-time>]` 

Bei den Parametern für den Start- und den Endzeitpunkt handelt es sich um optionale UTC-Zeitstempel. Wenn diese Parameter nicht angegeben werden, wird die aktuelle Uhrzeit verwendet und der aktuell aktive öffentliche Schlüssel (oder mehrere) wird zurückgegeben.

 **Beispielantwort** 

Die Antwort besteht aus einer Liste mit JSON-Objekten, die den bzw. die zurückgegebenen Schlüssel darstellen: 

##### Verwenden Sie die CloudTrail API, um öffentliche Schlüssel abzurufen
<a name="cloudtrail-results-file-custom-validation-steps-retrieve-public-key-api"></a>

Um mithilfe der CloudTrail API einen öffentlichen Schlüssel für eine Signdatei abzurufen, übergeben Sie Werte für die Startzeit und die Endzeit an die `ListPublicKeys` API. Die API `ListPublicKeys` gibt die öffentlichen Schlüssel, deren private Schlüssel zum Signieren der Sign-Datei verwendet wurden, für den angegebenen Zeitraum zurück. Für jeden öffentlichen Schlüssel gibt die API außerdem den entsprechenden Fingerabdruck zurück.

##### `ListPublicKeys`
<a name="cloudtrail-results-file-custom-validation-steps-list-public-keys"></a>

In diesem Abschnitt werden die Anforderungsparameter sowie die Antwortelemente der `ListPublicKeys`-API beschrieben.

**Anmerkung**  
Hinsichtlich der Codierung der binären Felder von `ListPublicKeys` sind Änderungen vorbehalten. 

 **Anfrageparameter** 


****  

| Name | Description | 
| --- | --- | 
|  StartTime  |  Gibt optional in UTC den Beginn des Zeitbereichs an, in dem der öffentliche Schlüssel für die CloudTrail Signdatei nachgeschlagen werden soll. Wenn StartTime nicht angegeben, wird die aktuelle Uhrzeit verwendet und der aktuelle öffentliche Schlüssel zurückgegeben.  Typ: DateTime   | 
|  EndTime  |  Gibt optional in UTC das Ende des Zeitbereichs an, in dem nach öffentlichen Schlüsseln für Signaturdateien gesucht CloudTrail werden soll. Wenn nicht angegeben, EndTime wird die aktuelle Uhrzeit verwendet.  Typ: DateTime   | 

 **Antwortelemente** 

`PublicKeyList` ist ein Array aus `PublicKey`-Objekten und enthält folgende Elemente: 


****  

|  |  | 
| --- |--- |
|  Name  |  Beschreibung  | 
|  Value  |  Dies gibt den mit DER-verschlüsselten öffentlichen Schlüsselwert im PKCS \$11-Format an.  Typ: Blob   | 
|  ValidityStartTime  |  Dies gibt den Beginn des Gültigkeitszeitraums für den öffentlichen Schlüssel an. Typ: DateTime   | 
|  ValidityEndTime  |  Dies gibt das Ende des Gültigkeitszeitraums für den öffentlichen Schlüssel an. Typ: DateTime   | 
|  Fingerprint  |  Die Fingerabdruck des öffentlichen Schlüssels. Mit dem Fingerabdruck kann der öffentliche Schlüssel identifiziert werden, der zur Validierung der Sign-Datei verwendet werden muss. Typ: Zeichenfolge   | 

#### C. Auswählen des öffentlichen Schlüssels für die Validierung
<a name="cloudtrail-results-file-custom-validation-steps-choose-public-key"></a>

Wählen Sie aus den von `list-public-keys` oder `ListPublicKeys` abgerufenen öffentlichen Schlüsseln denjenigen aus, dessen Fingerabdruck mit dem im Feld `publicKeyFingerprint` der Sign-Datei aufgezeichneten Fingerabdruck übereinstimmt. Diesen öffentlichen Schlüssel verwenden Sie für die Validierung der Sign-Datei. 

#### D. Neues Erstellen der Datensignatur-Zeichenfolge
<a name="cloudtrail-results-file-custom-validation-steps-recreate-data-signing-string"></a>

Nachdem Sie über die Signatur der Sign-Datei und dem entsprechenden öffentlichen Schlüssel verfügen, berechnen Sie die Datensignatur-Zeichenfolge. Wenn Sie die Datensignatur-Zeichenfolge berechnet haben, stehen Ihnen alle für die Signaturvalidierung benötigten Daten zur Verfügung.

Die Datensignierungszeichenfolge besteht aus dem Hashwert für jede Abfrageergebnisdatei, getrennt durch ein Leerzeichen. Wenn Sie diese Zeichenfolge neu erstellt haben, können Sie die Sign-Datei validieren.

#### E. Validieren der Sign-Datei
<a name="cloudtrail-results-file-custom-validation-steps-validate-sign-file"></a>

Übergeben Sie die neu erstellten Datensignatur-Zeichenfolge, die digitale Signatur und den öffentlichen Schlüssel an den RSA-Signaturprüfalgorithmus. Wenn das Ergebnis "True" lautet, wurde die Signatur der Sign-Datei überprüft und die Sign-Datei ist gültig. 

#### F. Validieren der Abfrageergebnisdateien
<a name="cloudtrail-results-file-custom-validation-steps-validate-log-files"></a>

Nachdem Sie die Sign-Dateien validiert haben, können Sie die referenzierten Abfrageergebnisdateien überprüfen. Die Sign-Datei enthält die SHA-256-Hashwerte der Abfrageergebnisdateien. Wenn eine der Abfrageergebnisdateien nach der CloudTrail Übermittlung geändert wurde, ändern sich die SHA-256-Hashes und die Signatur der Signdatei stimmt nicht überein. 

Verwenden Sie das folgende Verfahren, um die im `files`-Array der Sign-Datei aufgelisteten Abfrageergebnisdateien zu validieren.

1. Rufen Sie den ursprünglichen Hash der Datei aus dem Feld `files.fileHashValue` der Sign-Datei ab.

1. Führen Sie für den komprimierten Inhalt der Abfrageergebnisdatei einen Hash mit dem Hash-Algorithmus in `hashAlgorithm` aus.

1. Vergleichen Sie den Hashwert, den Sie für jede Abfrageergebnisdatei generiert haben, mit dem `files.fileHashValue` in der Sign-Datei. Wenn die Hashes übereinstimmen, sind die Abfrageergebnisdateien gültig.

### Überprüfen von Signatur- und Abfrageergebnisdateien offline
<a name="cloudtrail-results-file-custom-validation-offline"></a>

Wenn Sie Sign- und Abfrageergebnisdateien offline validieren möchten, können Sie dazu die in den vorherigen Abschnitten beschriebenen Verfahren nutzen. Sie müssen jedoch die folgenden Informationen zu öffentlichen Schlüsseln berücksichtigen.

#### Öffentliche Schlüssel
<a name="cloudtrail-results-file-custom-validation-offline-public-keys"></a>

Bei einer Offline-Validierung muss der öffentliche Schlüssel, der für die Validierung der Abfrageergebnisdateien in einem bestimmten Zeitraum erforderlich ist, zuvor online abgerufen (z. B. über den Aufruf von `ListPublicKeys`) und dann offline gespeichert werden. Dieser Schritt muss stets wiederholt werden, wenn Sie weitere Dateien außerhalb des ursprünglich angegebenen Zeitraums validieren möchten.

### Snippet mit Beispielvalidierung
<a name="cloudtrail-results-file-custom-validation-sample-code"></a>

Der folgende Beispielausschnitt enthält einen Grundcode für die Überprüfung von Zeichen- und Abfrageergebnisdateien. CloudTrail Der Skelettcode ist online/offline agnostisch, das heißt, es liegt an Ihnen, zu entscheiden, ob Sie ihn mit oder ohne Online-Konnektivität für implementieren möchten. AWS Die empfohlene Implementierung nutzt [Java Cryptography Extension (JCE)](https://en.wikipedia.org/wiki/Java_Cryptography_Extension) und [Bouncy Castle](https://www.bouncycastle.org/) als Sicherheitsanbieter. 

Das Beispiel-Snippet zeigt die folgenden Schritte:
+ So erstellen Sie die Datensignatur-Zeichenfolge für die Validierung der Sign-Dateisignatur.
+ So überprüfen Sie die Sign-Dateisignatur.
+ So berechnen Sie den Hashwert für die Abfrageergebnisdatei und vergleichen ihn mit dem in der Sign-Datei aufgeführten Wert `fileHashValue`, um die Authentizität der Abfrageergebnisdatei zu überprüfen.

```
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.pkcs.RSAPublicKey;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.json.JSONArray;
import org.json.JSONObject;
 
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.PublicKey;
import java.security.Security;
import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
 
public class SignFileValidationSampleCode {
 
    public void validateSignFile(String s3Bucket, String s3PrefixPath) throws Exception {
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
 
        // Load the sign file from S3 (using Amazon S3 Client) or from your local copy
        JSONObject signFile = loadSignFileToMemory(s3Bucket, String.format("%s/%s", s3PrefixPath, "result_sign.json"));
 
        // Using the Bouncy Castle provider as a JCE security provider - http://www.bouncycastle.org/
        Security.addProvider(new BouncyCastleProvider());
 
        List<String> hashList = new ArrayList<>();
 
        JSONArray jsonArray = signFile.getJSONArray("files");
 
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject file = jsonArray.getJSONObject(i);
            String fileS3ObjectKey = String.format("%s/%s", s3PrefixPath, file.getString("fileName"));
 
            // Load the export file from S3 (using Amazon S3 Client) or from your local copy
            byte[] exportFileContent = loadCompressedExportFileInMemory(s3Bucket, fileS3ObjectKey);
            messageDigest.update(exportFileContent);
            byte[] exportFileHash = messageDigest.digest();
            messageDigest.reset();
            byte[] expectedHash = Hex.decodeHex(file.getString("fileHashValue"));
 
            boolean signaturesMatch = Arrays.equals(expectedHash, exportFileHash);
            if (!signaturesMatch) {
                System.err.println(String.format("Export file: %s/%s hash doesn't match.\tExpected: %s Actual: %s",
                        s3Bucket, fileS3ObjectKey,
                        Hex.encodeHexString(expectedHash), Hex.encodeHexString(exportFileHash)));
            } else {
                System.out.println(String.format("Export file: %s/%s hash match",
                        s3Bucket, fileS3ObjectKey));
            }
 
            hashList.add(file.getString("fileHashValue"));
        }
        String hashListString = hashList.stream().collect(Collectors.joining(" "));
 
        /*
            NOTE:
            To find the right public key to verify the signature, call CloudTrail ListPublicKey API to get a list
            of public keys, then match by the publicKeyFingerprint in the sign file. Also, the public key bytes
            returned from ListPublicKey API are DER encoded in PKCS#1 format:
 
            PublicKeyInfo ::= SEQUENCE {
                algorithm       AlgorithmIdentifier,
                PublicKey       BIT STRING
            }
 
            AlgorithmIdentifier ::= SEQUENCE {
                algorithm       OBJECT IDENTIFIER,
                parameters      ANY DEFINED BY algorithm OPTIONAL
            }
        */
        byte[] pkcs1PublicKeyBytes = getPublicKey(signFile.getString("queryCompleteTime"),
                signFile.getString("publicKeyFingerprint"));
        byte[] signatureContent = Hex.decodeHex(signFile.getString("hashSignature"));
 
        // Transform the PKCS#1 formatted public key to x.509 format.
        RSAPublicKey rsaPublicKey = RSAPublicKey.getInstance(pkcs1PublicKeyBytes);
        AlgorithmIdentifier rsaEncryption = new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, null);
        SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo(rsaEncryption, rsaPublicKey);
 
        // Create the PublicKey object needed for the signature validation
        PublicKey publicKey = KeyFactory.getInstance("RSA", "BC")
                .generatePublic(new X509EncodedKeySpec(publicKeyInfo.getEncoded()));
 
        // Verify signature
        Signature signature = Signature.getInstance("SHA256withRSA", "BC");
        signature.initVerify(publicKey);
        signature.update(hashListString.getBytes("UTF-8"));
 
        if (signature.verify(signatureContent)) {
            System.out.println("Sign file signature is valid.");
        } else {
            System.err.println("Sign file signature failed validation.");
        }
 
        System.out.println("Sign file validation completed.");
    }
}
```