Convalida dei risultati della query salvati - AWS CloudTrail

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 dei risultati della query salvati

Per determinare se i risultati della query sono stati modificati, eliminati o invariati dopo aver CloudTrail fornito i risultati della query, è possibile utilizzare la convalida dell'integrità dei risultati delle CloudTrail query. 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 dei risultati delle query senza essere rilevati. CloudTrail Per convalidare i file dei risultati della query, è possibile utilizzare la riga di comando.

Perché utilizzare questa funzionalità?

I file dei risultati della query convalidati sono preziosi nelle indagini giudiziarie e sulla sicurezza. Ad esempio, un file dei risultati della query convalidato consente di affermare in modo positivo che il file dei risultati della query stesso non è cambiato. Il processo di convalida dell'integrità del file dei risultati della CloudTrail query consente inoltre di sapere se un file dei risultati della query è stato eliminato o modificato.

Convalida i risultati delle interrogazioni salvate con AWS CLI

È possibile convalidare l'integrità dei file del risultato della query e firmare il file utilizzando il comando aws cloudtrail verify-query-results.

Prerequisiti

Per convalidare l'integrità dei risultati della query con la riga di comando, è necessario che siano soddisfatte le seguenti condizioni:

  • È necessario disporre di una connettività online a. AWS

  • È necessario utilizzare AWS CLI la versione 2.

  • Per convalidare i file dei risultati delle query e firmare il file in locale, si applicano le seguenti condizioni:

    • È necessario inserire i file dei risultati della query e il file di firma nel percorso del file specificato. Specifica il percorso del file come valore per il parametro --local-export-path.

    • Non è necessario rinominare i file dei risultati della query e il file di firma.

  • Per convalidare i file dei risultati delle query e firmare il file nel bucket S3, si applicano le seguenti condizioni:

    • Non è necessario rinominare i file dei risultati della query e il file di firma.

    • È necessario disporre dell'accesso in lettura al bucket Amazon S3 contenente i file di firma e dei risultati della query.

    • Il prefisso S3 specificato deve contenere i file dei risultati della query e il file di firma. Specifica il prefisso S3 come valore per il parametro --s3-prefix.

verify-query-results

Il comando verify-query-results verifica il valore hash di ogni file dei risultati della query confrontando il valore con il fileHashValue nel file di firma e quindi convalidando hashSignature nel file di firma.

Quando verifichi i risultati della query, puoi utilizzare le opzioni della riga di comando --s3-bucket e --s3-prefix per convalidare i file dei risultati delle query e il file di firma archiviati in un bucket S3, oppure puoi utilizzare l'opzione della riga di comando --local-export-path per eseguire una convalida locale dei file dei risultati delle query e del file di firma scaricati.

Nota

Il comando verify-query-results è specifico della Regione. È necessario specificare l'opzione --region globale per convalidare i risultati della query per uno specifico Regione AWS.

Di seguito sono elencate le opzioni per il comando verify-query-results.

--s3-bucket <string>

Specifica il nome del bucket S3 che memorizza i file dei risultati della query e il file di firma. Non è possibile utilizzare questo parametro con --local-export-path.

--s3-prefix <string>

Specifica il percorso S3 della cartella S3 che contiene i file dei risultati delle query e il file di firma (ad esempio, s3/path/). Non è possibile utilizzare questo parametro con --local-export-path. Non è necessario fornire questo parametro se i file si trovano nella directory root del bucket S3.

--local-export-path <string>

Specifica la directory locale che contiene i file dei risultati delle query e il file di firma (ad esempio, /local/path/to/export/file/). Non è possibile utilizzare questo parametro con --s3-bucket o --s3-prefix.

Esempi

L'esempio seguente convalida i risultati delle query utilizzando le opzioni della riga di comando --s3-bucket e --s3-prefix per specificare il nome del bucket S3 e il prefisso contenente i file dei risultati delle query e il file di firma.

aws cloudtrail verify-query-results --s3-bucket bucket_name --s3-prefix prefix --region region

L'esempio seguente convalida i risultati delle query scaricati utilizzando l'opzione della riga di comando --local-export-path per specificare il percorso locale dei file dei risultati della query e del file di firma. Per informazioni sul download dei file dei risultati delle query, consulta Scarica i risultati delle query salvate su CloudTrail Lake.

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

Risultati della convalida

Nella tabella riportata di seguito sono descritti i possibili messaggi di convalida per i file dei risultati della query e il file di firma.

Tipo di file Messaggio di convalida Descrizione
Sign file Successfully validated sign and query result files La firma del file di firma è valida. I file dei risultati della query a cui fa riferimento possono essere controllati.
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

La convalida non è riuscita perché il valore hash per il file dei risultati della query non corrisponde al fileHashValue nel file di firma.
Sign file

ValidationError: Invalid signature in sign file

La convalida del file di firma non è riuscita perché la firma non è valida.

CloudTrail struttura del file di firma

Il file di firma contiene il nome di ogni file dei risultati della query distribuito nel bucket Amazon S3 al momento del salvataggio dei risultati della query, il valore hash per ogni file dei risultati della query e la firma digitale del file. I valori di firma digitale e hash vengono utilizzati per convalidare l'integrità del file dei risultati della query e del file di firma stesso.

Posizione del file di firma

Il file di firma viene distribuito in un bucket Amazon S3 il cui percorso è conforme alla seguente sintassi.

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

Contenuto dei file di firma di esempio

Il seguente file di segno di esempio contiene informazioni per i risultati delle query di CloudTrail Lake.

{ "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" }

Descrizione dei campi del file di firma

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

version

La versione del file di firma.

region

La regione dell' AWS account utilizzato per salvare i risultati della query.

files.fileHashValue

Valore hash con codifica esadecimale del contenuto compresso del file dei risultati della query.

files.fileName

Il nome del file dei risultati della query.

hashAlgorithm

Algoritmo hash utilizzato per eseguire l'hashing del file dei risultati della query.

signatureAlgorithm

Algoritmo utilizzato per firmare il file di firma.

queryCompleteTime

Indica quando i risultati della query sono CloudTrail stati consegnati al bucket S3. È possibile utilizzare questo valore per trovare la chiave pubblica.

hashSignature

La firma hash per il file.

publicKeyFingerprint

L'impronta con codifica esadecimale della chiave pubblica utilizzata per firmare il file di firma.

Implementazioni personalizzate della convalida dell'integrità dei file dei risultati delle CloudTrail query

Poiché CloudTrail utilizza algoritmi crittografici e funzioni hash standard del settore e disponibili apertamente, è possibile creare strumenti personalizzati per convalidare l'integrità dei file dei risultati delle query. CloudTrail Quando salvi i risultati delle query in un bucket Amazon S3, CloudTrail invia un file di firma al bucket S3. È possibile implementare una soluzione di convalida personalizzata per convalidare la firma e i file dei risultati della query. Per ulteriori informazioni sul file di firma, consultare CloudTrail struttura del file di firma.

Questo argomento descrive come viene firmato il file e illustra in dettaglio le procedure necessarie per implementare una soluzione che convalida il file di firma e i file dei risultati della query a cui il file di firma fa riferimento.

Comprendere come CloudTrail vengono firmati i file di firma

CloudTrail i file di firma sono firmati con firme digitali RSA. Per ogni file di firma, CloudTrail effettua le seguenti operazioni:

  1. Crea una lista hash contenente il valore hash per ogni file dei risultati della query.

  2. Recupera una chiave privata univoca per la Regione.

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

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

  5. Inserisce la firma digitale nel file di firma.

Contenuto della stringa di firma dei dati

La stringa di firma dei dati è costituita dal valore hash per ogni file dei risultati della query separato da uno spazio. Il file di firma elenca la fileHashValue per ogni file dei risultati della query.

Fasi di implementazione della convalida personalizzata

Durante l'implementazione di una soluzione di convalida personalizzata, è necessario convalidare il file di firma per primo e, succesisvamente, i file dei risultati della query a cui fa riferimento.

Convalida del file di firma

Per convalidare un file di firma, è necessario 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 si elaborerà personalmente.

  1. Ottenere il file di firma.

  2. Verificare che il file di firma sia stato recuperato dal relativo percorso originale.

  3. Recuperare la firma con codifica esadecimale del file di firma.

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

  5. Recuperare la chiave pubblica per l'intervallo di tempo corrispondente a queryCompleteTime nel file di firma. Per l'intervallo di tempo, scegliere un intervallo che sia StartTime precedente rispetto a queryCompleteTime e uno che sia EndTime successivo rispetto a queryCompleteTime.

  6. Tra le chiavi pubbliche recuperate, scegliere la chiave pubblica con l'impronta corrispondente al valore publicKeyFingerprint nel file di firma.

  7. Utilizzando un elenco hash contenente il valore hash per ogni file dei risultati della query separato da uno spazio, ricreare la stringa di firma dei dati utilizzata per verificare la firma del file di firma. Il file di firma elenca la fileHashValue per ogni file dei risultati della query.

    Ad esempio, se l'array files del proprio file di firma contiene i seguenti tre file di risultati della query, la lista hash è "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"
 } ],
  8. 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 di firma è valido.

Convalida dei file dei risultati della query

Se il file di firma è valido, convalidare i file dei risultati della query a cui fa riferimento il file di firma. Per convalidare l'integrità di un file dei risultati della query, calcolare il relativo valore hash SHA-256 sul contenuto compresso e confrontare i risultati con il fileHashValue per il file dei risultati della query registrato nel file di firma. Se i valori hash corrispondono, il file dei risultati della query è valido.

Le seguenti sezioni descrivono in dettaglio la procedura di convalida.

A. Ottenere il file di firma

I primi passaggi sono ottenere il file di firma e ottenere l'impronta digitale della chiave pubblica.

  1. Scaricare il file di firma dal proprio bucket Amazon S3 per i risultati della query che si desidera convalidare.

  2. Quindi, recuperare il valore hashSignature dal file di firma.

  3. Nel file di firma recuperare l'impronta della chiave pubblica la cui chiave privata è stata utilizzata per firmare il file di firma dal campo publicKeyFingerprint.

B. Recupero della chiave pubblica per la convalida del file di firma

Per ottenere la chiave pubblica per convalidare il file di firma, puoi utilizzare l' AWS CLI o l' CloudTrail API. In entrambi i casi, è possibile specificare un intervallo di tempo (ovvero un'ora di inizio e una di fine) per il file di firma da convalidare. Utilizzare un intervallo di tempo corrispondente a quello queryCompleteTime indicato nel file di firma. È 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 diverse coppie di chiavi pubblice/private per regione, ogni file di firma è firmato con una chiave privata unica per la regione. Pertanto, quando si convalida un file di firma da una determinata Regione, è necessario recuperare la relativa chiave pubblica dalla stessa Regione.

Usa il per recuperare le AWS CLI chiavi pubbliche

Per recuperare una chiave pubblica per un file di firma utilizzando il AWS CLI, usa il cloudtrail list-public-keys comando. 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:

Utilizza l' CloudTrail API per recuperare le chiavi pubbliche

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

ListPublicKeys

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 Descrizione
StartTime

Facoltativamente, specifica, in UTC, l'inizio dell'intervallo di tempo per la ricerca della chiave pubblica per il file di firma. CloudTrail Se non StartTime è specificato, viene utilizzata l'ora corrente e viene restituita la chiave pubblica corrente.

Tipo: DateTime

EndTime

Facoltativamente, in UTC, la fine dell'intervallo di tempo per la ricerca delle chiavi pubbliche per CloudTrail i file di firma. 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 #1.

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 di firma.

▬Tipo: stringa

C. Scelta della chiave pubblica da utilizzare per la convalida

Tra le chiavi pubbliche recuperate da list-public-keys o ListPublicKeys, scegliere la chiave pubblica la cui impronta corrisponde all'impronta registrata nel campo publicKeyFingerprint del file di firma. Questa è la chiave pubblica che verrà utilizzata per convalidare il file di firma.

D. Creazione di una nuova stringa di firma dei dati

Ora che si dispone della firma del file di firma e della chiave pubblica associata, occore 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 è costituita dal valore hash per ogni file dei risultati della query separato da uno spazio. Dopo aver ricreato questa stringa, sarà possibile convalidare il file di firma.

E. Convalida del file di firma

A questo punto è possibile passare la 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 di firma è verificata e il file di firma è valido.

F. Convalida dei file dei risultati della query

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

Utilizzare la procedura seguente per convalidare i file dei risultati della query elencati nell'array files del file di firma.

  1. Recuperare il valore hash originale del file dal campo files.fileHashValue all'interno del file di firma.

  2. Eseguire l'hashing dei contenuti compressi del file dei risultati della query con l'algoritmo di hashing specificato in hashAlgorithm.

  3. Confrontare il valore hash generato per ogni file dei risultati della query con il files.fileHashValue nel file di firma. Se gli hash corrispondono, i file dei risultati della query sono validi.

Convalida offline dei file di firma e dei risultati della query

Durante la convalida offline dei file di firma e dei risultati della query, in genere è possibile fare riferimento alle procedure descritte nelle sezioni precedenti. Tuttavia, è necessario tenere conto delle seguenti informazioni sulle chiavi pubbliche.

Chiavi pubbliche

Per eseguire la convalida offline, la chiave pubblica necessaria per convalidare i file dei risultati della query in un determinato intervallo di tempo deve prima essere recuperata online (chiamando ListPublicKeys, ad esempio) e quindi memorizzata 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

Il seguente frammento di esempio fornisce un codice scheletrico per la convalida CloudTrail dei file dei risultati delle query e dei segni. Il codice di base non fa distinzione tra le modalità online/offline, ovvero si potrà a scegliere autonomamente se implementare il codice con o senza una connessione online ad AWS. L'implementazione suggerita usa i provider di sicurezza Java Cryptography Extension (JCE) e Bouncy Castle.

Il frammento di codice di esempio mostra:

  • Come creare la stringa di firma dei dati utilizzata per convalidare la firma del file di firma.

  • Come verificare la firma del file di firma.

  • Come calcolare il valore hash per il file dei risultati della query e confrontarlo con il fileHashValue elencato nel file di firma per verificare l'autenticità del file dei risultati della query.

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."); } }