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à.
Validate CloudTrail Lake ha salvato i risultati delle interrogazioni
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 funzionalità è creata utilizzando algoritmi standard del settore: SHA -256 per l'hashing e SHA -256 per la firma digitale. RSA 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.
Argomenti
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
amzn-s3-demo-bucket
--s3-prefixprefix
--regionregion
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
--regionregion
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 |
|
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 |
|
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://
amzn-s3-demo-bucket
/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 sign 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 RSA digitali. Per ogni file di firma, CloudTrail effettua le seguenti operazioni:
-
Crea una lista hash contenente il valore hash per ogni file dei risultati della query.
-
Recupera una chiave privata univoca per la Regione.
-
Passa l'hash SHA -256 della stringa e la chiave privata all'algoritmo di RSA firma, che produce una firma digitale.
-
Codifica il codice byte della firma in formato esadecimale.
-
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.
-
Ottenere il file di firma.
-
Verificare che il file di firma sia stato recuperato dal relativo percorso originale.
-
Recuperare la firma con codifica esadecimale del file di firma.
-
Recuperare l'impronta con codifica esadecimale della chiave pubblica la cui chiave privata è stata utilizzata per firmare il file di firma.
-
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 siaStartTime
precedente rispetto aqueryCompleteTime
e uno che siaEndTime
successivo rispetto aqueryCompleteTime
. -
Tra le chiavi pubbliche recuperate, scegliere la chiave pubblica con l'impronta corrispondente al valore
publicKeyFingerprint
nel file di firma. -
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" } ],
-
Convalida la firma inserendo l'hash SHA -256 della stringa, la chiave pubblica e la firma come parametri all'algoritmo di verifica della firma. RSA 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 di risultati della query, calcolate il relativo valore hash SHA -256 sul contenuto compresso e confrontate i risultati con il file dei risultati della query registrato nel fileHashValue
file dei segni. 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.
-
Scaricare il file di firma dal proprio bucket Amazon S3 per i risultati della query che si desidera convalidare.
-
Quindi, recuperare il valore
hashSignature
dal file di firma. -
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 dei segni, puoi utilizzare il o il. AWS CLI 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 di inizio e fine sono indicatori UTC temporali e sono 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 JSON oggetti che rappresentano la chiave (o le chiavi) restituite:
Utilizzo della CloudTrail API per il recupero di chiavi pubbliche
Per recuperare una chiave pubblica per un file di firma utilizzando i CloudTrail API, passate i valori dell'ora di inizio e dell'ListPublicKeys
APIora di fine a. ListPublicKeys
APIrestituisce le chiavi pubbliche le cui chiavi private sono state utilizzate per firmare il file entro l'intervallo di tempo specificato. Per ogni chiave pubblica, restituisce API anche l'impronta digitale corrispondente.
ListPublicKeys
Questa sezione descrive i parametri di richiesta e gli elementi di risposta per. ListPublicKeys
API
Nota
La codifica dei campi binari per ListPublicKeys
è soggetta a modifiche.
Parametri della richiesta
Nome | Descrizione |
---|---|
StartTime
|
Facoltativamente, specifica l'inizio dell'intervallo di tempo in UTC cui cercare la chiave pubblica per il file di CloudTrail firma. Se non StartTime è specificato, viene utilizzata l'ora corrente e viene restituita la chiave pubblica corrente. Tipo: DateTime |
EndTime
|
Facoltativamente, specifica la fine dell'intervallo di tempo in UTC cui cercare le chiavi pubbliche per i file di CloudTrail 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
|
Il valore della chiave pubblica DER codificata nel 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
Passa la stringa di firma dei dati, la firma digitale e la chiave pubblica ricreate all'algoritmo di verifica della RSA 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 dei segni 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 di firma non corrisponderà.
Utilizzare la procedura seguente per convalidare i file dei risultati della query elencati nell'array files
del file di firma.
-
Recuperare il valore hash originale del file dal campo
files.fileHashValue
all'interno del file di firma. -
Eseguire l'hashing dei contenuti compressi del file dei risultati della query con l'algoritmo di hashing specificato in
hashAlgorithm
. -
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 utilizza Java Cryptography Extension (JCE)
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."); } }