Verifica dei database

Si applica a: SQL Server 2022 (16.x) Database SQL di AzureIstanza gestita di SQL di Azure

Il libro mastro fornisce una forma di integrità dei dati denominata integrità forward, che fornisce prove di manomissione dei dati sui dati nelle tabelle del libro mastro. Il processo di verifica del database accetta come input uno o più digest del database generati in precedenza. Ricalcola quindi gli hash archiviati nel libro mastro del database in base allo stato corrente delle tabelle del libro mastro. Se gli hash calcolati non corrispondono ai digest di input, la verifica ha esito negativo. Questo vuol dire che i dati sono stati manomessi. Il processo di verifica segnala tutte le incoerenze rilevate.

Processo di verifica dei database

Il processo di verifica analizza tutte le tabelle del libro mastro e cronologia. Ricalcola gli hash SHA-256 delle righe e li confronta con i file digest del database passati alla stored procedure di verifica.

Poiché la verifica del libro mastro ricalcola tutti gli hash per le transazioni nel database, può trattarsi di un processo a elevato utilizzo di risorse per i database con grandi quantità di dati. Per ridurre il costo della verifica, la funzionalità espone le opzioni per verificare le singole tabelle del libro mastro o solo un sottoinsieme delle tabelle del libro mastro.

È possibile eseguire la verifica del database tramite due stored procedure, a seconda che si usi l'archiviazione digest automatica o che si gestiscano manualmente i digest.

Nota

L'opzione del database ALLOW_SNAPSHOT_ISOLATION deve essere abilitata nel database prima di poter eseguire le stored procedure di verifica.

Verifica del database basata sull'archiviazione digest automatica

Quando si usa l'archiviazione digest automatica per generare e archiviare digest di database, la posizione dell'archiviazione digest si trova nella vista del catalogo di sistema sys.database_ledger_digest_locations come oggetti JSON. L'esecuzione della verifica del database consiste nell'esecuzione della stored procedure di sistema sp_verify_database_ledger_from_digest_storage . Specificare gli oggetti JSON dalla vista del catalogo di sistema sys.database_ledger_digest_locations in cui i digest del database sono configurati per l'archiviazione.

Quando si usa l'archiviazione digest automatica, è possibile modificare le posizioni di archiviazione durante tutto il ciclo di vita delle tabelle del libro mastro. Ad esempio, se si usa l'archiviazione non modificabile di Azure per archiviare i file digest, ma in un secondo momento si vuole usare Azure Confidential Ledger, è possibile farlo. Questa modifica nella posizione viene archiviata in sys.database_ledger_digest_locations.

Quando si esegue la verifica del libro mastro, controllare la posizione di digest_locations per assicurarsi che i riepiloghi usati nella verifica vengano recuperati dalle posizioni previste. Si desidera garantire che un utente con privilegi non abbia modificato le posizioni dell'archiviazione digest in una posizione di archiviazione non protetta, ad esempio Archiviazione di Azure, senza criteri di immutabilità configurati e bloccati.

Per semplificare l'esecuzione della verifica quando si usano più posizioni di archiviazione digest, lo script seguente recupererà le posizioni dei digest ed eseguirà la verifica usando tali posizioni.

DECLARE @digest_locations NVARCHAR(MAX) = (SELECT * FROM sys.database_ledger_digest_locations FOR JSON AUTO, INCLUDE_NULL_VALUES);
SELECT @digest_locations as digest_locations;
BEGIN TRY
    EXEC sys.sp_verify_database_ledger_from_digest_storage @digest_locations;
    SELECT 'Ledger verification succeeded.' AS Result;
END TRY
BEGIN CATCH
    THROW;
END CATCH

Verifica del database basata sull'archiviazione digest manuale

Quando si usa l'archiviazione digest manuale per generare e archiviare digest del database, la stored procedure sp_verify_database_ledger viene usata per verificare il database del libro mastro. Il contenuto JSON del digest viene aggiunto nella stored procedure. Quando si esegue la verifica del database, è possibile scegliere di verificare tutte le tabelle nel database o verificare tabelle specifiche.

Il codice seguente è un esempio di esecuzione della stored procedure sp_verify_database_ledger passando due digest per la verifica:

EXECUTE sp_verify_database_ledger N'
[
    {
        "database_name":  "ledgerdb",
        "block_id":  0,
        "hash":  "0xDC160697D823C51377F97020796486A59047EBDBF77C3E8F94EEE0FFF7B38A6A",
        "last_transaction_commit_time":  "2020-11-12T18:01:56.6200000",
        "digest_time":  "2020-11-12T18:39:27.7385724"
    },
    {
        "database_name":  "ledgerdb",
        "block_id":  1,
        "hash":  "0xE5BE97FDFFA4A16ADF7301C8B2BEBC4BAE5895CD76785D699B815ED2653D9EF8",
        "last_transaction_commit_time":  "2020-11-12T18:39:35.6633333",
        "digest_time":  "2020-11-12T18:43:30.4701575"
    }
]';

I codici restituiti per sp_verify_database_ledger e sp_verify_database_ledger_from_digest_storage sono 0 (esito positivo) o 1 (errore).

Elemento consigliato

Idealmente, si vuole ridurre al minimo o addirittura eliminare il divario tra il momento in cui si è verificato l'attacco e il momento in cui è stato rilevato. Microsoft consiglia di pianificare regolarmente la verifica del libro mastro per evitare un ripristino del database a giorni o mesi fa dopo che è stata rilevata la manomissione. L'intervallo di verifica deve essere deciso dal cliente, ma occorre tenere presente che la verifica del libro mastro può richiedere risorse. È consigliabile eseguire questa operazione durante una finestra di manutenzione o nelle ore non di punta.

La pianificazione della verifica del database nel database SQL di Azure può essere eseguita con processi elastici o Automazione di Azure. Per pianificare la verifica del database in Istanza gestita di SQL di Azure e SQL Server, è possibile usare SQL Server Agent.

Autorizzazioni

La verifica del database richiede l'autorizzazione VIEW LEDGER CONTENT . Per conoscere i dettagli sulle autorizzazioni relative alle tabelle del libro mastro, vedere Autorizzazioni.