

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Convalida dell'integrità dei file di CloudTrail registro
<a name="cloudtrail-log-file-validation-intro"></a>

Per determinare se un file di registro è stato modificato, eliminato o immutato dopo la CloudTrail consegna, è possibile utilizzare la convalida dell'integrità del file di CloudTrail registro. Questa caratteristica è stata sviluppata utilizzando algoritmi standard di settore: SHA-256 per l'hashing e SHA-256 con RSA per la firma digitale. Ciò rende computazionalmente impossibile modificare, eliminare o falsificare i file di registro senza essere rilevati. CloudTrail È possibile utilizzare il AWS CLI per convalidare i file nella posizione in cui sono stati consegnati. CloudTrail 

## Perché usare questa funzionalità?
<a name="cloudtrail-log-file-validation-intro-use-cases"></a>

I file di log convalidati sono preziosi nelle indagini giudiziarie e sulla sicurezza. Ad esempio, un file di log convalidato consente di confermare senza ombra di dubbio che tale file non ha subito modifiche oppure che una specifica attività API è stata eseguita utilizzando credenziali utente attendibili. Il processo di convalida dell'integrità dei file di CloudTrail registro consente inoltre di sapere se un file di registro è stato eliminato o modificato o di affermare con certezza che nessun file di registro è stato inviato all'account durante un determinato periodo di tempo. 

## Come funziona
<a name="cloudtrail-log-file-validation-intro-how-it-works"></a>

Quando abiliti la convalida dell'integrità dei file di registro, CloudTrail crea un hash per ogni file di registro fornito. Ogni ora, CloudTrail inoltre, crea e consegna un file che fa riferimento ai file di registro dell'ultima ora e contiene un hash di ciascuno di essi. Questo file è chiamato file digest. CloudTrail firma ogni file digest utilizzando la chiave privata di una coppia di chiavi pubblica e privata. Dopo la consegna, è possibile utilizzare la chiave pubblica per convalidare il file digest. CloudTrail utilizza coppie di chiavi diverse per ciascuna. Regione AWS

I file digest vengono inviati allo stesso bucket Amazon S3 associato al percorso dei file di log. CloudTrail Se i tuoi file di log vengono distribuiti da tutte le regioni o da più account in un unico bucket Amazon S3, CloudTrail distribuirà i file digest di tali regioni e account nello stesso bucket.

I file digest vengono inseriti in una cartella distinta rispetto a quella dei file di log. Questa separazione tra file digest e file di log ti consente di applicare policy di sicurezza granulare e di garantire il corretto funzionamento senza modifiche delle soluzioni di elaborazione dei log esistenti. Ogni file digest contiene anche la firma digitale dei file di digest precedente, se esistente. La firma del file digest corrente è memorizzata nelle proprietà metadati dell'oggetto file digest Amazon S3. Per ulteriori informazioni sul contenuto dei file digest, consulta [CloudTrail struttura del file digest](cloudtrail-log-file-validation-digest-file-structure.md).

### Storage dei file di log e file digest
<a name="cloudtrail-log-file-validation-intro-storage"></a>

Puoi archiviare i file di CloudTrail log e i file digest in Amazon S3 o Amazon Glacier in modo sicuro, duraturo ed economico per un periodo di tempo indefinito. Per ottimizzare la sicurezza dei file digest archiviati in Amazon S3, puoi utilizzare la funzionalità di [eliminazione MFA di Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMFADelete.html). 

### Abilitazione della convalida e convalida dei file
<a name="cloudtrail-log-file-validation-intro-enabling-and-using"></a>

Per abilitare la convalida dell'integrità dei file di log, puoi utilizzare l'API, the o. Console di gestione AWS AWS CLI CloudTrail L'abilitazione della convalida dell'integrità dei file di log consente di CloudTrail inviare file di log digest al bucket Amazon S3, ma non convalida l'integrità dei file. Per ulteriori informazioni, consulta [Abilitazione della convalida dell'integrità dei file di registro per CloudTrail](cloudtrail-log-file-validation-enabling.md). 

Per convalidare l'integrità dei file di CloudTrail log, puoi utilizzare o creare una soluzione personalizzata. AWS CLI AWS CLI Convaliderà i file nella posizione in cui sono CloudTrail stati consegnati. Se desideri convalidare i log che sono stati spostati in un percorso diverso, in Amazon S3 o in un'altra posizione, puoi creare strumenti di convalida personalizzati. 

Per informazioni sulla convalida dei log utilizzando il AWS CLI, vedere. [Convalida dell'integrità dei file di CloudTrail registro con AWS CLI](cloudtrail-log-file-validation-cli.md) Per informazioni sullo sviluppo di implementazioni personalizzate per la convalida dei file di CloudTrail registro, vedere. [Implementazioni personalizzate della convalida dell'integrità dei file di CloudTrail registro](cloudtrail-log-file-custom-validation.md) 

# Abilitazione della convalida dell'integrità dei file di registro per CloudTrail
<a name="cloudtrail-log-file-validation-enabling"></a>

È possibile abilitare la convalida dell'integrità dei file di registro utilizzando l' Console di gestione AWS interfaccia a riga di AWS comando (AWS CLI) o l' CloudTrail API. CloudTrail inizia a consegnare i file digest in circa un'ora.

## Console di gestione AWS
<a name="cloudtrail-log-file-validation-enabling-console"></a>

Per abilitare la convalida dell'integrità dei file di registro con la CloudTrail console, scegli **Sì** per l'opzione **Abilita la convalida dei file di registro** quando crei o aggiorni un trail. Per impostazione di default, questa caratteristica è abilitata per nuovi trail. Per ulteriori informazioni, consulta [Creazione e aggiornamento di un percorso con la console](cloudtrail-create-and-update-a-trail-by-using-the-console.md). 

## AWS CLI
<a name="cloudtrail-log-file-validation-enabling-cli"></a>

[Per abilitare la convalida dell'integrità dei file di registro con AWS CLI, utilizza l'`--enable-log-file-validation`opzione con i comandi [create-trail o update-trail](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/create-trail.html).](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/update-trail.html) Per disabilitare la convalida dell'integrità dei file di log per un trail, usa l'opzione `--no-enable-log-file-validation`.

**Esempio**

Il seguente comando `update-trail` abilita la convalida dei file di log e avvia la distribuzione dei file digest al bucket Amazon S3 per il percorso specificato.

```
aws cloudtrail update-trail --name your-trail-name --enable-log-file-validation
```

## CloudTrail API
<a name="cloudtrail-log-file-validation-enabling-api"></a>

Per abilitare la convalida dell'integrità dei file di registro con l' CloudTrail API, imposta il parametro di `EnableLogFileValidation` richiesta su `true` quando chiami `CreateTrail` o`UpdateTrail`. 

Per ulteriori informazioni, consulta le pagine [CreateTrail](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_CreateTrail.html) e [UpdateTrail](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_UpdateTrail.html) nella [Documentazione di riferimento dell'API AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/).

# Convalida dell'integrità dei file di CloudTrail registro con AWS CLI
<a name="cloudtrail-log-file-validation-cli"></a>

Per convalidare i log con AWS Command Line Interface, utilizzare il CloudTrail `validate-logs` comando. Il comando utilizza i file digest distribuiti nel bucket Amazon S3 per eseguire la convalida. Per informazioni sui file digest, consulta [CloudTrail struttura del file digest](cloudtrail-log-file-validation-digest-file-structure.md). 

 AWS CLI Consente di rilevare i seguenti tipi di modifiche:
+ Modifica o cancellazione dei file di CloudTrail registro
+ Modifica o eliminazione dei file CloudTrail digest
+ Modifica o eliminazione di entrambi i tipi di file

**Nota**  
 AWS CLI Convalida solo i file di registro a cui fanno riferimento i file digest. Per ulteriori informazioni, consulta [Verifica se un determinato file è stato consegnato da CloudTrail](#cloudtrail-log-file-validation-cli-validate-logs-check-file).

## Prerequisiti
<a name="cloudtrail-log-file-validation-cli-prerequisites"></a>

Per convalidare l'integrità dei file di registro con AWS CLI, devono essere soddisfatte le seguenti condizioni:
+ È necessario disporre di una connettività online a. AWS
+ Devi disporre dell'accesso in lettura al bucket Amazon S3 contenente i file digest e i file di log. 
+ Il digest e i file di log non devono essere stati spostati dalla posizione originale di Amazon S3 CloudTrail in cui sono stati consegnati.
+ Il ruolo che esegue il comando deve disporre delle autorizzazioni per la chiamata `ListObjects` e `GetBucketLocation` per ogni bucket S3 a cui fa riferimento il trail. `GetObject`

**Nota**  
I file di log scaricati su un disco locale non possono essere convalidati mediante la AWS CLI. Per istruzioni su come creare strumenti personalizzati per la convalida, consulta [Implementazioni personalizzate della convalida dell'integrità dei file di CloudTrail registro](cloudtrail-log-file-custom-validation.md).

## validate-logs
<a name="cloudtrail-log-file-validation-cli-validate-logs"></a>

### Sintassi
<a name="cloudtrail-log-file-validation-cli-validate-logs-syntax"></a>

Di seguito è riportata la sintassi per `validate-logs`. I parametri opzionali sono riportati tra parentesi.

`aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <amzn-s3-demo-bucket>] [--s3-prefix <prefix>] [--account-id <account-id>] [--verbose]` 

**Nota**  
Il comando `validate-logs` è specifico della Regione. È necessario specificare l'opzione `--region` globale per convalidare i log per uno specifico. Regione AWS

### Opzioni
<a name="cloudtrail-log-file-validation-cli-validate-logs-options"></a>

Di seguito sono elencati le opzioni dalla riga di comando per `validate-logs`. Le opzioni `--trail-arn` e `--start-time` sono obbligatorie. L'opzione `--account-id` è inoltre necessaria per i percorsi organizzativi.

`--start-time`  
Specifica che i file di log vengano distribuiti in corrispondenza della o dopo la convalida il valore del time stamp UTC specificato. Esempio: `2015-01-08T05:21:42Z`. 

`--end-time`  
(Opzionale) Specifica che i file di log vengano distribuiti in corrispondenza o prima della convalida il valore del time stamp UTC specificato. Il valore di default è l'ora UTC corrente (`Date.now()`). Esempio: `2015-01-08T12:31:41Z`.   
Per l'intervallo di tempo specificato, il comando `validate-logs` controlla solo i file di log per i quali esistono riferimenti nei corrispondenti file digest. Non viene controllato alcun altro file di log nel bucket Amazon S3. Per ulteriori informazioni, consulta [Verifica se un determinato file è stato consegnato da CloudTrail](#cloudtrail-log-file-validation-cli-validate-logs-check-file). 

`--s3-bucket`  
Facoltativamente, specifica il bucket Amazon S3 in cui vengono archiviati i file digest. Se non viene specificato il nome di un bucket, lo AWS CLI recupererà chiamando. `DescribeTrails()` 

`--s3-prefix`  
Facoltativamente, specifica il prefisso Amazon S3 in cui vengono archiviati i file digest. Se non viene specificato, lo AWS CLI recupererà chiamando. `DescribeTrails()`   
È consigliabile utilizzare questa opzione solo se il prefisso corrente è diverso dal prefisso in uso durante l'intervallo di tempo specificato.

`--account-id`  
Facoltativamente, specifica l'account per la convalida dei log. Questo parametro è necessario per i percorsi organizzativi per la convalida dei log per l'account specifico all'interno di un'organizzazione.

`--trail-arn`  
Specifica l'ARN (Amazon Resource Name) del trail da convalidare. Il formato dell'ARN di un trail è riportato di seguito.  

```
arn:aws:cloudtrail:us-east-2:111111111111:trail/MyTrailName
```
Per recuperare l'ARN per un trail, puoi utilizzare il comando `describe-trails` prima di eseguire `validate-logs`.  
Potresti decidere di specificare il nome e il prefisso del bucket, oltre al relativo ARN, se i file di log sono stati distribuiti in più di un bucket nell'intervallo di tempo specificato e vuoi limitare il processo di convalida ai file di log in uno solo dei bucket. 

`--verbose`  
(Opzionale) Restituisce le informazioni di convalida per ogni file di log o file digest nell'intervallo di tempo specificato. L'output indica se il file è rimasto invariato o se è stato modificato o eliminato. In modalità non dettagliata (impostazione di default), le informazioni vengono restituite solo nei casi in cui si è verificato un errore di convalida. 

### Esempio
<a name="cloudtrail-log-file-validation-cli-validate-logs-example"></a>

L'esempio seguente consente di convalidare i file di log dall'ora di inizio specificata all'ora corrente utilizzando il bucket Amazon S3 configurato per il percorso corrente e specificando l'output dettagliato.

```
aws cloudtrail validate-logs --start-time 2015-08-27T00:00:00Z --end-time 2015-08-28T00:00:00Z --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/my-trail-name --verbose
```

### Funzionamento di `validate-logs`
<a name="cloudtrail-log-file-validation-cli-validate-logs-how-it-works"></a>

Il comando `validate-logs` inizia con la convalida del file digest più recente nell'intervallo di tempo specificato. In primo luogo, verifica se il file digest è stato scaricato da un percorso a cui il file effettivamente appartiene. In altre parole, se la CLI ha scaricato il file digest `df1` dal percorso S3 `p1`, validate-logs verificherà quanto segue: `p1 == df1.digestS3Bucket + '/' + df1.digestS3Object`.

Se la firma del file digest è valida, controlla il valore hash di ciascuno dei log a cui viene fatto riferimento nel file digest. Il comando va a ritroso nel tempo e convalida i file digest precedenti e i corrispondenti file di log di riferimento, in sequenza. Continua il processo fino al raggiungimento del valore specificato per `start-time` o fino al termine della sequenza di file digest. Se un file digest non è disponibile o non è valido, l'intervallo di tempo che non può essere convalidato è indicato nell'output. Il `validate-logs` comando opera innanzitutto sulla catena di digest standard. Dopo aver completato la convalida del digest standard, convalida i file di backfill digest, se presenti. I backfill digest formano una catena di convalida separata e vengono elaborati indipendentemente dai digest standard.

## Risultati della convalida
<a name="cloudtrail-log-file-validation-cli-results"></a>

I risultati della convalida iniziano con un'intestazione di riepilogo avente il formato seguente:

```
Validating log files for trail trail_ARN  between time_stamp and time_stamp
```

Ogni riga dell'output principale contiene i risultati della convalida per un singolo digest o file di registro nel seguente formato. Le righe precedute da `(backfill)` indicano i file digest di backfill, che formano una catena di convalida separata dai file digest standard.

```
<optional (backfill)> <Digest file | Log file> <S3 path> <Validation Message>
```

Nella tabella riportata di seguito sono descritti i possibili messaggi di convalida per i file di log e i file digest.


****  

| Tipo di file | Messaggio di convalida | Description | 
| --- | --- | --- | 
| Digest file | valid | La firma del file digest è valida. I file di log a cui fa riferimento possono essere controllati. Questo messaggio è incluso solo nella modalità dettagliata (verbose). | 
| Digest file | INVALID: has been moved from its original location | Il bucket S3 o l'oggetto S3 da cui il file digest è stato recuperato non corrisponde alla posizione del bucket S3 o a quella dell'oggetto S3 registrate nel file digest stesso. | 
| Digest file | INVALID: invalid format | Il formato del file digest non è valido. I file di log corrispondenti all'intervallo di tempo rappresentato dal file digest non può essere convalidato. | 
| Digest file | INVALID: not found | Il file digest non è stato trovato. I file di log corrispondenti all'intervallo di tempo rappresentato dal file digest non può essere convalidato. | 
| Digest file | INVALID: public key not found for fingerprint fingerprint | La chiave pubblica corrispondente alla impronta registrata nel file digest non è stata trovata. Il file digest non può essere convalidato. | 
| Digest file | INVALID: signature verification failed | La firma del file digest non è valida. Poiché il file digest non è valido, i file di log a cui fa riferimento non possono essere convalidati e non è possibile effettuare alcuna asserzione sulla corrispondente attività delle API. | 
| Digest file | INVALID: Unable to load PKCS \$11 key with fingerprint fingerprint | Poiché è risultato impossibile caricare la chiave pubblica con codifica DER nel formato PKCS \$1 1 e con l'impronta specificata, il file digest non può essere convalidato. | 
| Log file | valid | Il file di log è stato convalidato e non è stato modificato dopo la distribuzione. Questo messaggio è incluso solo nella modalità dettagliata (verbose). | 
| Log file | INVALID: hash value doesn't match | L'hash per il file di log non corrisponde. Il file di log è stato modificato dopo la distribuzione da parte di CloudTrail. | 
| Log file | INVALID: invalid format | Il formato del file di log non è valido. Il file di log non può essere convalidato. | 
| Log file | INVALID: not found | Il file di log non è stato trovato e non può essere convalidato. | 

L'output include informazioni riepilogative sui risultati restituiti.

## Output di esempio
<a name="cloudtrail-log-file-validation-cli-results-examples"></a>

### Modalità dettagliata
<a name="cloudtrail-log-file-validation-cli-results-verbose"></a>

Il comando `validate-logs` di esempio seguente utilizza il flag `--verbose` e restituisce l'output di esempio seguente. `[...]` indica che l'output di esempio è stato abbreviato.

```
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name --start-time 2015-08-31T22:00:00Z --end-time 2015-09-01T19:17:29Z --verbose
```

```
Validating log files for trail arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name between 2015-08-31T22:00:00Z and 2015-09-01T19:17:29Z
                                       
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2015/09/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T201728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1925Z_WZZw1RymnjCRjxXc.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_POuvV87nu6pfAV2W.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1930Z_l2QgXhAKVm1QXiIA.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_eQJteBBrfpBCqOqw.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1950Z_9g5A6qlR2B5KaRdq.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_i4DNCC12BuXd6Ru7.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_Sg5caf2RH6Jdx0EJ.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2015/09/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T191728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1910Z_YYSFiuFQk4nrtnEW.json.gz	valid
[...]
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1055Z_0Sfy6m9f6iBzmoPF.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1040Z_lLa3QzVLpOed7igR.json.gz	valid

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T101728Z.json.gz	INVALID: signature verification failed

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T091728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T0830Z_eaFvO3dwHo4NCqqc.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T081728Z.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T071728Z.json.gz	valid
[...]
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2245Z_mbJkEO5kNcDnVhGh.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2225Z_IQ6kXy8sKU03RSPr.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2230Z_eRPVRTxHQ5498ROA.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2255Z_IlWawYZGvTWB5vYN.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2015/08/31/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150831T221728Z.json.gz	valid

Results requested for 2015-08-31T22:00:00Z to 2015-09-01T19:17:29Z
Results found for 2015-08-31T22:17:28Z to 2015-09-01T20:17:28Z:

22/23 digest files valid, 1/23 digest files INVALID
63/63 log files valid
```

Il `validate-logs` comando di esempio seguente utilizza il `--verbose` flag su un periodo in cui sono presenti file di backfill digest e produce l'output di esempio che segue. I backfill digest vengono visualizzati con il `(backfill)` prefisso e vengono convalidati separatamente dalla catena di digest standard. `[...]`indica che l'output del campione è stato abbreviato.

```
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name --start-time 2024-07-31T22:00:00Z --end-time 2024-08-01T19:17:29Z --verbose
```

```
Validating log files for trail arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name between 2024-07-31T22:00:00Z and 2024-08-01T19:17:29Z

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T201728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1925Z_Xm3pK9vN2wQ5rT8h.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1915Z_Bj7cL4nM6pR9sU2v.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1930Z_Fy1dG8kN3qT6wX0z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1920Z_Hn5jM2pQ7sV9yB4e.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1950Z_Kp8rN1tW4xZ7aC3f.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1920Z_Mq6sP9uX2yB5dE8g.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1915Z_Rt4vQ7wZ0aC3fG6h.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T191728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1910Z_Uw9xR2yB5dH8jK1m.json.gz	valid
[...]
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2024/08/01/144218288521_CloudTrail_us-east-2_20240801T1055Z_Vz3aS6cE9fL2nP5q.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2024/08/01/144218288521_CloudTrail_us-east-2_20240801T1040Z_Xy7bT0dG3hM6pR9s.json.gz	valid

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T101728Z.json.gz	INVALID: signature verification failed

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T091728Z.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T081728Z.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T071728Z.json.gz	valid
[...]
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/07/31/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240731T221728Z.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T201728Z_backfill.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T191728Z_backfill.json.gz	valid
[...]

(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T101728Z_backfill.json.gz	INVALID: signature verification failed

(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T091728Z_backfill.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2024/08/01/144218288521_CloudTrail_us-east-2_20240801T0830Z_Rn6uk0wY5aD9fJ3n.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T081728Z_backfill.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T071728Z_backfill.json.gz	valid
[...]
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/07/31/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240731T221728Z_backfill.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2145Z_Sp3vm7xZ2bE6gK0p.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2125Z_Tq0wn4ya9cF3hL7q.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2130Z_Ur7xp1zb6dG0jM4r.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2155Z_Vs4yq8ac3eH7kN1s.json.gz	valid

Results requested for 2024-07-31T22:00:00Z to 2024-08-01T19:17:29Z
Results found for 2024-07-31T22:17:28Z to 2024-08-01T20:17:28Z:

22/23 digest files valid, 1/23 digest files INVALID
22/23 backfill digest files valid, 1/23 backfill digest files INVALID
63/63 log files valid
```

### Modalità non dettagliata
<a name="cloudtrail-log-file-validation-cli-results-non-verbose"></a>

Il comando `validate-logs` di esempio seguente non utilizza il flag `--verbose`. Nell'output di esempio che segue è stato rilevato un errore. Vengono restituite solo le informazioni relative a intestazione, errori e riepilogo.

```
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name --start-time 2015-08-31T22:00:00Z --end-time 2015-09-01T19:17:29Z
```

```
Validating log files for trail arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name between 2015-08-31T22:00:00Z and 2015-09-01T19:17:29Z

Digest file	s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T101728Z.json.gz	INVALID: signature verification failed

(backfill) Digest file	s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T101728Z_backfill.json.gz	INVALID: signature verification failed

Results requested for 2015-08-31T22:00:00Z to 2015-09-01T19:17:29Z
Results found for 2015-08-31T22:17:28Z to 2015-09-01T20:17:28Z:

22/23 digest files valid, 1/23 digest files INVALID
22/23 backfill digest files valid, 1/23 backfill digest files INVALID
63/63 log files valid
```

## Verifica se un determinato file è stato consegnato da CloudTrail
<a name="cloudtrail-log-file-validation-cli-validate-logs-check-file"></a>

Per verificare se un particolare file nel tuo bucket è stato consegnato da CloudTrail, eseguilo `validate-logs` in modalità dettagliata per il periodo di tempo che include il file. Se il file appare nell'output di`validate-logs`, allora il file è stato consegnato da. CloudTrail

# CloudTrail struttura del file digest
<a name="cloudtrail-log-file-validation-digest-file-structure"></a>

Ogni file digest contiene i nomi dei file di log distribuiti nel bucket Amazon S3 durante l'ultima ora, i valori hash per tali file di log e la firma digitale del file di digest precedente. La firma del file digest corrente è memorizzata nelle proprietà metadati dell'oggetto file digest. Le firme digitali e gli hash vengono utilizzati per la convalida dell'integrità dei file di log e del file digest stesso. 

## Posizione dei file digest
<a name="cloudtrail-log-file-validation-digest-file-location"></a>

I file digest vengono distribuiti in un bucket Amazon S3 il cui percorso è conforme alla seguente sintassi.

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/aws-account-id/CloudTrail-Digest/
    region/digest-end-year/digest-end-month/digest-end-date/
    aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp.json.gz
```

**Nota**  
Per i trail dell'organizzazione, la posizione del bucket include anche l'ID dell'unità organizzativa, come segue:  

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/O-ID/aws-account-id/CloudTrail-Digest/
    region/digest-end-year/digest-end-month/digest-end-date/
    aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp.json.gz
```

**Nota**  
I file backfill digest vengono forniti quando è CloudTrail necessario includere file di log a cui non si faceva riferimento nel digest originale a causa di ritardi di elaborazione. I file Backfill Digest utilizzano il `_backfill` suffisso nel nome del file, come segue:  

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/aws-account-id/CloudTrail-Digest/
    region/digest-end-year/digest-end-month/digest-end-date/
    aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp_backfill.json.gz
```

## Contenuto dei file digest di esempio
<a name="cloudtrail-log-file-validation-digest-file-contents"></a>

Il seguente file digest di esempio contiene informazioni per un registro. CloudTrail 

```
{
  "awsAccountId": "111122223333",
  "digestStartTime": "2015-08-17T14:01:31Z",
  "digestEndTime": "2015-08-17T15:01:31Z",
  "digestS3Bucket": "amzn-s3-demo-bucket",
  "digestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/17/111122223333_CloudTrail-Digest_us-east-2_your-trail-name_us-east-2_20150817T150131Z.json.gz",
  "digestPublicKeyFingerprint": "31e8b5433410dfb61a9dc45cc65b22ff",
  "digestSignatureAlgorithm": "SHA256withRSA",
  "newestEventTime": "2015-08-17T14:52:27Z",
  "oldestEventTime": "2015-08-17T14:42:27Z",
  "previousDigestS3Bucket": "amzn-s3-demo-bucket",
  "previousDigestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/17/111122223333_CloudTrail-Digest_us-east-2_your-trail-name_us-east-2_20150817T140131Z.json.gz",
  "previousDigestHashValue": "97fb791cf91ffc440d274f8190dbdd9aa09c34432aba82739df18b6d3c13df2d",
  "previousDigestHashAlgorithm": "SHA-256",
  "previousDigestSignature": "50887ccffad4c002b97caa37cc9dc626e3c680207d41d27fa5835458e066e0d3652fc4dfc30937e4d5f4cc7f796e7a258fb50a43ac427f2237f6e505d4efaf373d156e15e3b68dea9f58111d395b62628d6bd367a9024d2183b5c5f6e19466d3a996b92df705bc997b8a0e13430f241d733cf95df4e41bb6c304c3f58363043572ea57a27085639ce187e679c0d81c7519b1184fa77fb7ab0b0e40a32dace6e1eefc3995c5ae182da49b62b26398cebb52a2201a6387b75b89c83e5570bcb9bba6c34a80f2f00a1c6ebe07d1ff149eccd812dc805bb3eeff6657db32a6cb48d2d096404eb76181877bc6ebb8cd0b23f823200155b2fd8848d428e46e8456328a",
  "logFiles": [
    {
      "s3Bucket": "amzn-s3-demo-bucket",
      "s3Object": "AWSLogs/111122223333/CloudTrail/us-east-2/2015/08/17/111122223333_CloudTrail_us-east-2_20150817T1445Z_9nYN7gp2eWAJHIfT.json.gz",
      "hashValue": "9bb6196fc6b84d6f075a56548feca262bd99ba3c2de41b618e5b6e22c1fc71f6",
      "hashAlgorithm": "SHA-256",
      "newestEventTime": "2015-08-17T14:52:27Z",
      "oldestEventTime": "2015-08-17T14:42:27Z"
    }
  ]
}
```

## Descrizione dei campi dei file digest
<a name="cloudtrail-log-file-validation-digest-file-descriptions"></a>

Di seguito sono riportate descrizioni di ciascun campo del file digest: 

`awsAccountId`  
L'ID AWS dell'account per il quale è stato consegnato il file digest. 

`digestStartTime`  
L'intervallo di tempo UTC iniziale coperto dal file digest, prendendo come riferimento l'ora in cui i file di registro sono stati consegnati. CloudTrail Ciò significa che se l'intervallo di tempo è [Ta, Tb], il file digest conterrà tutti i file di log distribuiti al cliente tra Ta e Tb. 

`digestEndTime`  
L'intervallo di tempo UTC finale coperto dal file digest, prendendo come riferimento l'ora in cui i file di registro sono stati consegnati. CloudTrail Ciò significa che se l'intervallo di tempo è [Ta, Tb], il file digest conterrà tutti i file di log distribuiti al cliente tra Ta e Tb. 

`digestS3Bucket`  
Nome del bucket Amazon S3 in cui il file digest corrente è stato distribuito. 

`digestS3Object`  
Chiave dell'oggetto Amazon S3 (ovvero il percorso del bucket Amazon S3) del file digest corrente. Le prime due Regioni nella stringa mostrano la Regione da cui il file digest è stato distribuito. L'ultima Regione (dopo `your-trail-name`) è la Regione di origine del percorso. La Regione di origine è la Regione in cui è stato creato il percorso. Nel caso di un percorso multi-regione, la Regione potrebbe essere diversa da quella da cui il file digest è stato distribuito.

`newestEventTime`  
Ora, in formato UTC, dell'evento più recente rispetto a tutti gli eventi nei file di log inclusi nel file digest. 

`oldestEventTime`  
Ora, in formato UTC, dell'evento meno recente rispetto a tutti gli eventi nei file di log inclusi nel file digest.   
Se il file digest viene distribuito in ritardo, il valore di `oldestEventTime` sarà anteriore al valore di `digestStartTime`. 

`previousDigestS3Bucket`  
Bucket Amazon S3 in cui il precedente file digest è stato distribuito. 

`previousDigestS3Object`  
Chiave dell'oggetto Amazon S3 (ovvero il percorso del bucket Amazon S3) del file digest precedente. 

`previousDigestHashValue`  
Valore hash con codifica esadecimale dei contenuti non compressi del file digest precedente. 

`previousDigestHashAlgorithm`  
Nome dell'algoritmo hash utilizzato per eseguire l'hashing del file digest precedente. 

`publicKeyFingerprint`  
Impronta con codifica esadecimale della chiave pubblica corrispondente alla chiave privata utilizzata per firmare il file digest. È possibile recuperare le chiavi pubbliche per l'intervallo di tempo corrispondente al file digest utilizzando o l' AWS CLI API. CloudTrail Tra le chiavi pubbliche restituite, la chiave la cui impronta corrisponde a questo valore può essere usata per convalidare il file digest. Per informazioni sul recupero delle chiavi pubbliche per i file digest, consulta il comando o l' AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/list-public-keys.html](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/list-public-keys.html)API. CloudTrail [https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_ListPublicKeys.html](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_ListPublicKeys.html)   
CloudTrail utilizza coppie di private/public chiavi diverse per regione. Ogni file digest è firmato con una chiave privata univoca per la Regione corrispondente. Pertanto, quando convalidi un file digest di una determinata Regione, nella stessa Regione devi recuperare la corrispondente chiave pubblica. 

`digestSignatureAlgorithm`  
Algoritmo usato per firmare il file digest. 

`logFiles.s3Bucket`  
Nome del bucket Amazon S3 per il file di log. 

`logFiles.s3Object`  
Chiave dell'oggetto Amazon S3 del file di log corrente. 

`logFiles.newestEventTime`  
Ora, in formato UTC, dell'evento più recente nel file di log. Questa ora corrisponde inoltre al time stamp del file di log stesso. 

`logFiles.oldestEventTime`  
Ora, in formato UTC, dell'evento meno recente nel file di log. 

`logFiles.hashValue`  
Valore hash con codifica esadecimale del contenuto non compresso del file di log. 

`logFiles.hashAlgorithm`  
Algoritmo hash usato per eseguire l'hashing del file di log. 

## File digest di iniziale
<a name="cloudtrail-log-file-validation-digest-file-starting"></a>

Quando viene avviata la convalida dell'integrità dei file di log, verrà generato un file digest iniziale. Un file digest iniziale verrà generato anche quando viene riavviata la convalida dell'integrità dei file di log (mediante la disabilitazione e quindi la riabilitazione di tale processo di convalida oppure mediante l'arresto e il riavvio della registrazione con la convalida abilitata). In un file digest iniziale, i seguenti campi relativi al file digest precedente saranno null:
+ `previousDigestS3Bucket`
+ `previousDigestS3Object`
+ `previousDigestHashValue`
+ `previousDigestHashAlgorithm`
+ `previousDigestSignature`

## File digest 'vuoti'
<a name="cloudtrail-log-file-validation-digest-file-empty"></a>

CloudTrail fornirà un file digest anche se non vi è stata alcuna attività API nel tuo account durante il periodo di un'ora rappresentato dal file digest. Ciò può essere utile quando è necessario verificare che non sono stati distribuiti file di log durante l'ora di riferimento del file digest. 

L'esempio seguente mostra i contenuti di un file digest contenente un'ora di registrazione in assenza di qualsiasi tipo di attività API. Si noti che il campo `logFiles:[ ]` alla fine del contenuto del file digest è vuoto. 

```
{
  "awsAccountId": "111122223333",
  "digestStartTime": "2015-08-20T17:01:31Z",
  "digestEndTime": "2015-08-20T18:01:31Z",
  "digestS3Bucket": "amzn-s3-demo-bucket",
  "digestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/20/111122223333_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150820T180131Z.json.gz",
  "digestPublicKeyFingerprint": "31e8b5433410dfb61a9dc45cc65b22ff",
  "digestSignatureAlgorithm": "SHA256withRSA",
  "newestEventTime": null,
  "oldestEventTime": null,
  "previousDigestS3Bucket": "amzn-s3-demo-bucket",
  "previousDigestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/20/111122223333_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150820T170131Z.json.gz",
  "previousDigestHashValue": "ed96c4bac9eaa8fe9716ca0e515da51938be651b1db31d781956416a9d05cdfa",
  "previousDigestHashAlgorithm": "SHA-256",
  "previousDigestSignature": "82705525fb0fe7f919f9434e5b7138cb41793c776c7414f3520c0242902daa8cc8286b29263d2627f2f259471c745b1654af76e2073264b2510fd45236b3aea4d80c0e8e6455223d7bd54ff80af0edf22a5f14fa856626daec919f0591479aa4f213787ba1e1076328dcf8ff624e03a977fa5612dcf58594c590fd8c1c5b48bddf43fc84ecc00b41bedd0ff7f293c3e2de8dcdc78f98b03e17577f5822ba842399d69eb79921c0429773509520e08c8b518702d987dfbb3a4e5d8c5f17673ce1f989dfff82d4becf24e452f20d3bcac94ad50131f93e57f10155536acb54c60efbe9d57228c2b930bc6082b2318e3ccd36834a8e835b8d112dbf32145f445c11",
  "logFiles": []
}
```

## Firma del file digest
<a name="cloudtrail-log-file-validation-digest-file-signature"></a>

Le informazioni sulla firma di un file digest si trovano in due proprietà metadati dell'oggetto file digest Amazon S3. Ogni file digest include le seguenti voci di metadati: 
+ `x-amz-meta-signature`

  Valore con codifica esadecimale della firma del file digest. Di seguito è riportata una firma di esempio:

  ```
  3be472336fa2989ef34de1b3c1bf851f59eb030eaff3e2fb6600a082a23f4c6a82966565b994f9de4a5989d053d9d15d20fc5c43e66358652d93326550a4acc5c5f541bb52e9b455897ab723bd7cbabfe963a406a41d600f3658f7a3135e5ed9fcae7b79bb5857d1e5eb78fcce8595ce0ade2f3ad1d9f2d62be7bc4660d83166ce24586489b7da9ee9883eaf0b9efabb5dd3cbba565cc4aab5c9c46c9fa7e9cda310afcc5e8adcd9e48d0597ec5f8174a52c3bebb3e845eeb1d18904fbf4cc14cd117080098e10022ddf55e017a9431446acad8560de0ba1e477af9f8a3048bc6196350adad0cc0cb4ab99b5e7c9944437a3c674a038009220684ced7be07b4f
  28f1cc237f372264a51b611c01da429565def703539f4e71009051769469231bc22232fa260df02740047af532229885ea2b0e95ecd353326b7104941e0cbddb076a391f1fcf2923c19565f4841770a78723451aeb732ff1b6162dc40e601fc6720bc5325987942ebd817783b322f0ac77698523bf742fdea7aa44f4911b3101221b7e1233387f16a52077610498f4a1254211258e37da0fb4cb207aef593b4c1baa13674e85acc52046b3adb889e63331a66abac5de7e42ffdd6952987c31ae871650e130bd2e63bfe145b22bbd39ea192210f6df64d49b888a321e02d3fc4cf126accae30d2857ccd6b2286a7c9feba6c35c44161b24147d645e6ca26844ba
  05d3ffcb5d2dd5dc28f8bb5b7993938e8a5f912a82b448a367eccb2ec0f198ba71e23eb0b97278cf65f3c8d1e652c6de33a22ca8428821ffc95bf8b726ba9f37cfbc20c54dc5bd6159bdea1c4d951b68cb8e0528852c55bb0c5e499ea60560f7c2bb3af7f694407da863a2594f7a2f2838cb09254afbaf8003587746e719a0437f85eeffae534f283f3837eb939a9bccc3c71573500661245891051231b580ac92d9e0e68c6f47ad38975f493e2c40e7f303353c4adc7d563ef1e875977afac2e085f0c824045d998c9543d8a3293ad3c063b7a109d0bfd84b0b1e3f72c4f057e744e6a2cf9cc97727b08584f44bfa47799c5072b60f0b619aea88a17de585e9
  ```
+ `x-amz-meta-signature-algorithm`

  L'esempio seguente mostra un valore dell'algoritmo utilizzato per generare la firma del file digest:

  `SHA256withRSA`
+ `x-amz-meta-backfill-generation-timestamp`

  Il timestamp UTC in cui è stato generato il backfill digest. Questa proprietà dei metadati è presente solo nei file backfill digest e viene utilizzata per identificare la chiave pubblica corretta per la convalida della firma. Di seguito è riportato un esempio di timestamp:

  `2025-05-20T00:00:00.000Z`

## Concatenamento di file digest
<a name="cloudtrail-log-file-validation-digest-file-chaining"></a>

Il fatto che ogni file digest contenga un riferimento al file digest precedente consente un «concatenamento» che consente a strumenti di convalida come il di AWS CLI rilevare se un file digest è stato eliminato. Consente inoltre ai file digest di un intervallo di tempo specificato di venire controllati in successione, a partire dal file più recente. 

**Nota**  
Quando si disabilita la convalida dell'integrità dei file di registro, la catena di file digest viene interrotta dopo un'ora. CloudTrail non creerà file digest per i file di registro che sono stati consegnati durante un periodo in cui la convalida dell'integrità dei file di registro era disabilitata. Ad esempio, se si abilita la convalida dell'integrità dei file di log a mezzogiorno del 1° gennaio, la si disabilita a mezzogiorno del 2 gennaio e la si abilita di nuovo a mezzogiorno del 10 gennaio, non verranno creati file digest per i file di log distribuiti da mezzogiorno del 2 gennaio a mezzogiorno del 10 gennaio. Lo stesso vale ogni volta che si interrompe CloudTrail la registrazione o si elimina una traccia. 

Se la [policy del bucket S3](create-s3-bucket-policy-for-cloudtrail.md) del tuo trail non è configurata correttamente o si verifica CloudTrail un'interruzione imprevista del servizio, potresti non ricevere tutti o alcuni file digest. Per confermare se il trail presenta errori di consegna del digest, esegui il [https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_GetTrailStatus.html](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_GetTrailStatus.html)comando e verifica la presenza di errori nel parametro. `LatestDigestDeliveryError` Dopo aver risolto il problema di consegna (ad esempio, correggendo la policy del bucket), CloudTrail tenterà di recapitare i file digest mancanti. Durante il periodo di riconsegna, i file digest potrebbero essere consegnati fuori servizio, pertanto la catena potrebbe sembrare temporaneamente interrotta.

Se la registrazione viene interrotta o la traccia viene eliminata, CloudTrail consegnerà un file digest finale. Questo file digest può contenere informazioni per qualsiasi file di log rimanente che fa riferimento fino all'evento `StopLogging` compreso. 

# Implementazioni personalizzate della convalida dell'integrità dei file di CloudTrail registro
<a name="cloudtrail-log-file-custom-validation"></a>

Poiché CloudTrail utilizza algoritmi crittografici e funzioni hash standard del settore e disponibili apertamente, è possibile creare strumenti personalizzati per convalidare l'integrità dei file di registro. CloudTrail Quando la convalida dell'integrità dei file di log è abilitata, CloudTrail invia i file digest al tuo bucket Amazon S3. Puoi utilizzare questi file per implementare la tua soluzione di convalida personalizzata. Per ulteriori informazioni sui file digest, consulta [CloudTrail struttura del file digest](cloudtrail-log-file-validation-digest-file-structure.md). 

Questo argomento descrive come vengono firmati i file digest e illustra in dettaglio le procedure necessarie per implementare una soluzione che convalida i file digest e i file di log a cui fanno riferimento.

## Comprendere come CloudTrail vengono firmati i file digest
<a name="cloudtrail-log-file-custom-validation-how-cloudtrail-digest-files-are-signed"></a>

CloudTrail i file digest sono firmati con firme digitali RSA. Per ogni file digest, CloudTrail esegue le seguenti operazioni: 

1. Crea una stringa per la firma dei dati in base ai campi del file digest designato (descritti nella sezione successiva). 

1. Recupera una chiave privata univoca per la Regione.

1. Passa l'hash SHA-256 della stringa e la chiave privata all'algoritmo di firma RSA, che genera una firma digitale.

1. Codifica il codice byte della firma in formato esadecimale.

1. Inserisce la firma digitale nella proprietà metadati `x-amz-meta-signature` dell'oggetto file digest Amazon S3.

### Contenuto della stringa di firma dei dati
<a name="cloudtrail-log-file-custom-validation-data-signing-string-summary"></a>

I seguenti CloudTrail oggetti sono inclusi nella stringa per la firma dei dati: 
+ Time stamp finale del file digest nel formato UTC esteso (ad esempio, `2015-05-08T07:19:37Z`)
+ Percorso S3 del file digest corrente
+ Hash SHA-256 con codifica esadecimale del file digest corrente
+ Firma con codifica esadecimale del precedente file digest

Il formato per calcolare questa stringa e un esempio di stringa vengono forniti più avanti in questo documento.

## Fasi di implementazione della convalida personalizzata
<a name="cloudtrail-log-file-custom-validation-steps"></a>

Durante l'implementazione di una soluzione di convalida personalizzata, devi convalidare il file digest per primo e quindi i file di log a cui fa riferimento. 

### Convalida del file digest
<a name="cloudtrail-log-file-custom-validation-steps-digest"></a>

Per convalidare un file digest, devi disporre della relativa firma, della chiave pubblica la cui chiave privata è stata utilizzata per firmare il file e di una stringa di firma dei dati che elaborerai personalmente. 

1. Recuperare il file digest.

1. Verificare che il file digest sia stato recuperato dal relativo percorso originale. 

1. Recuperare la firma con codifica esadecimale del file digest.

1. Recuperare l'impronta con codifica esadecimale della chiave pubblica la cui chiave privata è stata utilizzata per firmare il file digest.

1. Recuperate le chiavi pubbliche per l'intervallo di tempo corrispondente al file digest.

1. Tra le chiavi pubbliche recuperate scegliere la chiave pubblica con l'impronta corrispondente a quella nel file digest.

1. Utilizzando l'hash del file digest e gli altri campi del file, ricreare la stringa di firma dei dati per verificare la firma del file digest.

1. Per convalidare la firma, passare l'hash SHA-256 della stringa, la chiave pubblica e la firma come parametri all'algoritmo RSA di verifica della firma. Se il risultato è true, il file digest è valido. 

### Convalida dei file di log
<a name="cloudtrail-log-file-custom-validation-steps-logs"></a>

Se il file digest è valido, convalidare ciascun file di log a cui il file digest fa riferimento.

1. Per convalidare l'integrità di un file di log, calcolare il relativo valore hash SHA-256 per il relativo contenuto non compresso e confrontare i risultati con il valore hash per il file di log registrato in formato esadecimale nel digest. Se i valori hash corrispondono, il file di log è valido.

1. Utilizzando le informazioni relative al file digest precedente incluse nel file digest corrente, convalidare in sequenza i file digest precedenti e i corrispondenti file di log.

Le seguenti sezioni descrivono in dettaglio queste fasi.

### A. Recupero del file digest
<a name="cloudtrail-log-file-custom-validation-steps-get-the-digest-file"></a>

Durante la fase iniziale di recupero del file digest più recente, devi assicurarsi di avere recuperato il file dalla relativa posizione originale, verificarne la firma digitale e recuperare l'impronta della chiave pubblica.

1. Utilizzando S3 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)o la classe AmazonS3Client (ad esempio), ottieni il file digest più recente dal tuo bucket Amazon S3 per l'intervallo di tempo che desideri convalidare. 

1. Verificare che il bucket S3 e l'oggetto S3 utilizzati per recuperare il file corrispondano alla posizione del bucket S3 e a quella dell'oggetto S3 registrate nel file digest stesso. 

1. Recupera quindi la firma digitale del file digest dalla proprietà metadati `x-amz-meta-signature` dell'oggetto del file digest in Amazon S3.

1. Nel file digest recuperare l'impronta della chiave pubblica la cui chiave privata è stata utilizzata per firmare il file digest dal campo `digestPublicKeyFingerprint`. 

### B. Recupero della chiave pubblica per la convalida del file digest
<a name="cloudtrail-log-file-custom-validation-steps-retrieve-public-key"></a>

Per ottenere la chiave pubblica per convalidare il file digest, puoi utilizzare l'o l'API. AWS CLI CloudTrail In entrambi i casi, puoi specificare un intervallo di tempo (ovvero un'ora di inizio e una di fine) per il file digest da convalidare. È possibile che vengano restituite una o più chiavi pubbliche per l'intervallo di tempo specificato. Le chiavi restituite possono avere intervalli di tempo di validità sovrapposti.

**Nota**  
Poiché CloudTrail utilizza coppie di private/public chiavi diverse per regione, ogni file digest è firmato con una chiave privata unica per la sua regione. Pertanto, quando convalidi un file digest da una determinata Regione, devi recuperare la relativa chiave pubblica dalla stessa Regione.

#### Usa il AWS CLI per recuperare le chiavi pubbliche
<a name="cloudtrail-log-file-custom-validation-steps-retrieve-public-key-cli"></a>

Per recuperare le chiavi pubbliche per i file digest utilizzando il AWS CLI, usa il comando. `cloudtrail list-public-keys` Il comando ha il formato seguente: 

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

I parametri relativi all'ora di inizio e all'ora di fine sono time stamp UTC facoltativi. Se non specificata, verrà utilizzata l'ora corrente e verranno restituite la chiave o le chiavi pubbliche attualmente attive.

 **Risposta di esempio** 

La risposta sarà un elenco di oggetti JSON che rappresentano la chiave o le chiavi restituite: 

```
{
    "publicKeyList": [
        {
            "ValidityStartTime": "1436317441.0",
            "ValidityEndTime": "1438909441.0",
            "Value": "MIIBCgKCAQEAn11L2YZ9h7onug2ILi1MWyHiMRsTQjfWE+pHVRLk1QjfWhirG+lpOa8NrwQ/r7Ah5bNL6HepznOU9XTDSfmmnP97mqyc7z/upfZdS/AHhYcGaz7n6Wc/RRBU6VmiPCrAUojuSk6/GjvA8iOPFsYDuBtviXarvuLPlrT9kAd4Lb+rFfR5peEgBEkhlzc5HuWO7S0y+KunqxX6jQBnXGMtxmPBPP0FylgWGNdFtks/4YSKcgqwH0YDcawP9GGGDAeCIqPWIXDLG1jOjRRzWfCmD0iJUkz8vTsn4hq/5ZxRFE7UBAUiVcGbdnDdvVfhF9C3dQiDq3k7adQIziLT0cShgQIDAQAB",
            "Fingerprint": "8eba5db5bea9b640d1c96a77256fe7f2"
        },
        {
            "ValidityStartTime": "1434589460.0",
            "ValidityEndTime": "1437181460.0",
            "Value": "MIIBCgKCAQEApfYL2FiZhpN74LNWVUzhR+VheYhwhYm8w0n5Gf6i95ylW5kBAWKVEmnAQG7BvS5g9SMqFDQx52fW7NWV44IvfJ2xGXT+wT+DgR6ZQ+6yxskQNqV5YcXj4Aa5Zz4jJfsYjDuO2MDTZNIzNvBNzaBJ+r2WIWAJ/Xq54kyF63B6WE38vKuDE7nSd1FqQuEoNBFLPInvgggYe2Ym1Refe2z71wNcJ2kY+q0h1BSHrSM8RWuJIw7MXwF9iQncg9jYzUlNJomozQzAG5wSRfbplcCYNY40xvGd/aAmO0m+Y+XFMrKwtLCwseHPvj843qVno6x4BJN9bpWnoPo9sdsbGoiK3QIDAQAB",
            "Fingerprint": "8933b39ddc64d26d8e14ffbf6566fee4"
        },
        {
            "ValidityStartTime": "1434589370.0",
            "ValidityEndTime": "1437181370.0",
            "Value": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqlzPJbvZJ42UdcmLfPUqXYNfOs6I8lCfao/tOs8CmzPOEdtLWugB9xoIUz78qVHdKIqxbaG4jWHfJBiOSSFBM0lt8cdVo4TnRa7oG9io5pysS6DJhBBAeXsicufsiFJR+wrUNh8RSLxL4k6G1+BhLX20tJkZ/erT97tDGBujAelqseGg3vPZbTx9SMfOLN65PdLFudLP7Gat0Z9p5jw/rjpclKfo9Bfc3heeBxWGKwBBOKnFAaN9V57pOaosCvPKmHd9bg7jsQkI9Xp22IzGLsTFJZYVA3KiTAElDMu80iFXPHEq9hKNbt9e4URFam+1utKVEiLkR2disdCmPTK0VQIDAQAB",
            "Fingerprint": "31e8b5433410dfb61a9dc45cc65b22ff"
        }
    ]
}
```

#### Utilizza l' CloudTrail API per recuperare le chiavi pubbliche
<a name="cloudtrail-log-file-custom-validation-steps-retrieve-public-key-api"></a>

Per recuperare le chiavi pubbliche per i file digest utilizzando l' CloudTrail API, trasmetti i valori dell'ora di inizio e dell'ora di fine all'API. `ListPublicKeys` L'API `ListPublicKeys` restituisce le chiavi pubbliche le cui chiavi private sono state utilizzate per firmare i file digest compresi nell'intervallo di tempo specificato. Per ogni chiave pubblica, l'API restituisce anche le corrispondenti impronte.

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

Questa sezione descrive i parametri di richiesta e gli elementi di risposta dell'API `ListPublicKeys`.

**Nota**  
La codifica dei campi binari per `ListPublicKeys` è soggetta a modifiche. 

 **Parametri della richiesta** 


****  

| Nome | Description | 
| --- | --- | 
|  StartTime  |  Facoltativamente, in UTC, l'inizio dell'intervallo di tempo per la ricerca delle chiavi pubbliche per i file digest. CloudTrail Se non StartTime è specificato, viene utilizzata l'ora corrente e viene restituita la chiave pubblica corrente.  Tipo: DateTime   | 
|  EndTime  |  Facoltativamente, specifica, in UTC, la fine dell'intervallo di tempo in cui cercare le chiavi pubbliche per CloudTrail i file digest. Se non EndTime è specificato, viene utilizzata l'ora corrente.  Tipo: DateTime   | 

 **Elementi di risposta** 

`PublicKeyList`, una matrice di oggetti `PublicKey` contenenti: 


****  

|  |  | 
| --- |--- |
|  Nome  |  Descrizione  | 
|  Value  |  Valore della chiave pubblica con codifica DER in formato PKCS \$11.  Tipo: Blob   | 
|  ValidityStartTime  |  Ora di inizio della validità della chiave pubblica. Tipo: DateTime   | 
|  ValidityEndTime  |  Ora di fine della validità della chiave pubblica. Tipo: DateTime   | 
|  Fingerprint  |  Impronta della chiave pubblica. L'impronta può essere utilizzata per identificare la chiave pubblica da utilizzare per convalidare il file digest. Tipo: String   | 

### C. Scelta della chiave pubblica da utilizzare per la convalida
<a name="cloudtrail-log-file-custom-validation-steps-choose-public-key"></a>

Tra le chiavi pubbliche recuperate da `list-public-keys` o `ListPublicKeys`scegliere la chiave pubblica restituita con l'impronta corrispondente all'impronta registrata nel campo `digestPublicKeyFingerprint` del file digest. Questa è la chiave pubblica che verrà utilizzata per convalidare il file digest. 

### D. Creazione di una nuova stringa di firma dei dati
<a name="cloudtrail-log-file-custom-validation-steps-recreate-data-signing-string"></a>

Ora che disponi della firma del file digest e della chiave pubblica associata, devi calcolare la stringa di firma dei dati. Dopo aver calcolato tale stringa, si disporrà di tutte le informazioni necessarie per verificare la firma.

La stringa di firma dei dati ha il formato seguente: 

```
Data_To_Sign_String = 
  Digest_End_Timestamp_in_UTC_Extended_format + '\n' +
  Current_Digest_File_S3_Path + '\n' +
  Hex(Sha256(current-digest-file-content)) + '\n' +
  Previous_digest_signature_in_hex
```

Di seguito è riportato un esempio di stringa `Data_To_Sign_String`.

```
2015-08-12T04:01:31Z
amzn-s3-demo-bucket/AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/12/111122223333_us-east-2_CloudTrail-Digest_us-east-2_20150812T040131Z.json.gz
4ff08d7c6ecd6eb313257e839645d20363ee3784a2328a7d76b99b53cc9bcacd
6e8540b83c3ac86a0312d971a225361d28ed0af20d70c211a2d405e32abf529a8145c2966e3bb47362383a52441545ed091fb81
d4c7c09dd152b84e79099ce7a9ec35d2b264eb92eb6e090f1e5ec5d40ec8a0729c02ff57f9e30d5343a8591638f8b794972ce15bb3063a01972
98b0aee2c1c8af74ec620261529265e83a9834ebef6054979d3e9a6767dfa6fdb4ae153436c567d6ae208f988047ccfc8e5e41f7d0121e54ed66b1b904f80fb2ce304458a2a6b91685b699434b946c52589e9438f8ebe5a0d80522b2f043b3710b87d2cda43e5c1e0db921d8d540b9ad5f6d4$31b1f4a8ef2d758424329583897339493a082bb36e782143ee5464b4e3eb4ef6
```

Dopo aver ricreato questa stringa, puoi convalidare il file digest.

### E. Convalida del file digest
<a name="cloudtrail-log-file-custom-validation-steps-validate-digest-file"></a>

A questo punto puoi passare l'hash SHA-256 della stringa di firma dei dati ricreata, la firma digitale e la chiave pubblica all'algoritmo RSA di verifica della firma. Se l'output è true, la firma del file digest è verificata e il file digest è valido. 

### F. Convalida dei file di log
<a name="cloudtrail-log-file-custom-validation-steps-validate-log-files"></a>

Dopo aver convalidato il file digest, puoi convalidare il file di log a cui fa riferimento. Il file digest contiene gli hash SHA-256 dei file di log. Se uno dei file di registro è stato modificato dopo la CloudTrail consegna, gli hash SHA-256 cambieranno e la firma del file digest non corrisponderà. 

Di seguito è descritto come convalidare i file di log:

1. Eseguire un comando `S3 Get` sul file di log utilizzando le informazioni sulla posizione S3 nei campi `logFiles.s3Bucket` e `logFiles.s3Object` del file digest.

1. Se l'operazione `S3 Get` ha esito positivo, ripetere l'operazione nei file di log elencati nella matrice logFiles del file digest utilizzando la procedura seguente:

   1. Recuperate il valore hash originale del file dal campo `logFiles.hashValue` del log corrispondente nel file digest.

   1. Eseguire l'hashing dei contenuti non compressi del file di log con l'algoritmo di hashing specificato in `logFiles.hashAlgorithm`.

   1. Confrontare il valore hash generato con quello del log nel file digest. Se i valori hash corrispondono, il file di log è valido.

### G. Convalida di file digest e file di log aggiuntivi
<a name="cloudtrail-log-file-custom-validation-steps-validate-additional-files"></a>

In ogni file digest, i seguenti campi forniscono le informazioni su posizione e firma del file digest precedente:
+  `previousDigestS3Bucket` 
+  `previousDigestS3Object` 
+  `previousDigestSignature` 

Utilizzare queste informazioni per recuperare i file digest precedenti in sequenza, convalidare la firma di ciascuno di essi e i file di log a cui fanno riferimento mediante le procedure descritta nelle sezioni precedenti. L'unica differenza risiede nel fatto che, per i file digest precedenti, non devi recuperare la firma digitale dalle proprietà metadati Amazon S3 dell'oggetto file digest. La firma del file digest precedente è disponibile automaticamente nel campo `previousDigestSignature`. 

Puoi andare a ritroso nel tempo finché non raggiungi il file digest iniziale o fino all'interruzione della sequenza di file digest, a seconda di quale evento si verifica prima. 

## Convalida di file digest e file di log offline
<a name="cloudtrail-log-file-custom-validation-offline"></a>

Durante la convalida di file digest e file di log offline, in genere puoi fare riferimento alle procedure descritte nelle sezioni precedenti. Devi tuttavia tenere in considerazione i seguenti punti:

### Utilizzo del file digest più recente
<a name="cloudtrail-log-file-custom-validation-offline-most-recent-digest"></a>

La firma digitale del file digest più recente (ovvero "corrente") si trova nelle proprietà metadati Amazon S3 dell'oggetto file digest. In uno scenario offline, la firma digitale del file digest corrente non sarà disponibile.

Per gestire questa situazione sono disponibili due modi:
+ Poiché la firma digitale per il file digest precedente si trova nel file digest corrente, iniziate la convalida dal file digest. next-to-last Con questo metodo il file digest più recente non può essere convalidato.
+ Come prima cosa recupera la firma del file digest corrente dalle proprietà metadati dell'oggetto del file digest e quindi memorizzala in modo sicuro offline. In questo modo il file digest corrente verrà convalidato assieme ai file precedenti nella sequenza.

### Risoluzione del percorso
<a name="cloudtrail-log-file-custom-validation-offline-path-resolution"></a>

I campi nei file digest scaricati, ad esempio `s3Object` e `previousDigestS3Object`, continueranno a fare riferimento alle posizioni Amazon S3 online dei file di log e file digest. Una soluzione offline deve trovare un modo per reindirizzare queste posizioni al percorso corrente dei file di log e file digest scaricati.

### Chiavi pubbliche
<a name="cloudtrail-log-file-custom-validation-offline-public-keys"></a>

Per eseguire la convalida offline, tutte le chiavi pubbliche necessarie per convalidare i file di log in un determinato intervallo di tempo devono prima essere recuperate online (chiamando `ListPublicKeys`, ad esempio) e quindi memorizzate in modo sicuro offline. Questo passaggio deve essere ripetuto ogni volta che si vuole convalidare altri file non compresi nell'intervallo di tempo iniziale specificato.

## Esempio di frammento di codice di convalida
<a name="cloudtrail-log-file-custom-validation-sample-code"></a>

Il seguente frammento di esempio fornisce un codice scheletrico per la convalida dei file digest e di registro. CloudTrail Il codice skeleton è online/offline agnostico, ovvero sta all'utente decidere se implementarlo con o senza connettività online a. AWS L'implementazione suggerita usa i provider di sicurezza [Java Cryptography Extension (JCE)](https://en.wikipedia.org/wiki/Java_Cryptography_Extension) e [Bouncy Castle](https://www.bouncycastle.org/). 

Il frammento di codice di esempio mostra:
+ Come creare la stringa di firma dei dati utilizzata per convalidare la firma del file digest. 
+ Come verificare la firma del file digest.
+ Come verificare gli hash del file di log.
+ Una struttura di codice per convalidare una sequenza di file digest.

```
import java.util.Arrays;
import java.security.MessageDigest;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Security;
import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;
import org.json.JSONObject;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.apache.commons.codec.binary.Hex;

public class DigestFileValidator {

    public void validateDigestFile(String digestS3Bucket, String digestS3Object, String digestSignature) {
 
        // Using the Bouncy Castle provider as a JCE security provider - http://www.bouncycastle.org/
        Security.addProvider(new BouncyCastleProvider());
 
        // Load the digest file from S3 (using Amazon S3 Client) or from your local copy
        JSONObject digestFile = loadDigestFileInMemory(digestS3Bucket, digestS3Object);
 
        // Check that the digest file has been retrieved from its original location
        if (!digestFile.getString("digestS3Bucket").equals(digestS3Bucket) ||
                !digestFile.getString("digestS3Object").equals(digestS3Object)) {
            System.err.println("Digest file has been moved from its original location.");
        } else {
            // Compute digest file hash
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(convertToByteArray(digestFile));
            byte[] digestFileHash = messageDigest.digest();
            messageDigest.reset();
 
            // Compute the data to sign
            String dataToSign = String.format("%s%n%s/%s%n%s%n%s",
                                digestFile.getString("digestEndTime"),
                                digestFile.getString("digestS3Bucket"), digestFile.getString("digestS3Object"), // Constructing the S3 path of the digest file as part of the data to sign
                                Hex.encodeHexString(digestFileHash),
                                digestFile.getString("previousDigestSignature"));
 
            byte[] signatureContent = Hex.decodeHex(digestSignature);
 
            /*
                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 digest 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
                }                
            */
            pkcs1PublicKeyBytes = getPublicKey(digestFile.getString("digestPublicKeyFingerprint")));
 
            // 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(dataToSign.getBytes("UTF-8"));
 
            if (signature.verify(signatureContent)) {
                System.out.println("Digest file signature is valid, validating log files…");
                for (int i = 0; i < digestFile.getJSONArray("logFiles").length(); i++) {
 
                    JSONObject logFileMetadata = digestFile.getJSONArray("logFiles").getJSONObject(i);
 
                    // Compute log file hash
                    byte[] logFileContent = loadUncompressedLogFileInMemory(
                                                logFileMetadata.getString("s3Bucket"),
                                                logFileMetadata.getString("s3Object")
                                            );
                    messageDigest.update(logFileContent);
                     byte[] logFileHash = messageDigest.digest();
                    messageDigest.reset();
 
                    // Retrieve expected hash for the log file being processed
                    byte[] expectedHash = Hex.decodeHex(logFileMetadata.getString("hashValue"));
 
                    boolean signaturesMatch = Arrays.equals(expectedHash, logFileHash);
                    if (!signaturesMatch) {
                        System.err.println(String.format("Log file: %s/%s hash doesn't match.\tExpected: %s Actual: %s",
                               logFileMetadata.getString("s3Bucket"), logFileMetadata.getString("s3Object"),
                               Hex.encodeHexString(expectedHash), Hex.encodeHexString(logFileHash)));
                    } else {
                        System.out.println(String.format("Log file: %s/%s hash match",
                               logFileMetadata.getString("s3Bucket"), logFileMetadata.getString("s3Object")));
                    }
                }
 
            } else {
                System.err.println("Digest signature failed validation.");
            }
 
            System.out.println("Digest file validation completed.");
 
            if (chainValidationIsEnabled()) {
                // This enables the digests' chain validation
                validateDigestFile(
                        digestFile.getString("previousDigestS3Bucket"),
                        digestFile.getString("previousDigestS3Object"),
                        digestFile.getString("previousDigestSignature"));
            }
        }
    }
}
```