Databas-verifiering

Gäller för: SQL Server 2022 (16.x) och senare versioner Azure SQL DatabaseAzure SQL Managed Instance

Transaktionsregistret tillhandahåller en form av dataintegritet som kallas vidarebefordrad integritet, vilket ger bevis på datamanipulering av data i dina transaktionsregistertabeller. Databasverifieringsprocessen tar som indata en eller flera tidigare genererade databassammandrag. Den beräknar sedan om hashvärdena som lagras i databasregistret baserat på det aktuella tillståndet för transaktionsregistertabellerna. Om de beräknade hashvärdena inte matchar indatasammandragen misslyckas verifieringen. Felet indikerar att data har manipulerats. Verifieringsprocessen rapporterar alla inkonsekvenser som identifieras.

Databasverifieringsprocess

Verifieringsprocessen söker igenom alla register- och historiktabeller. Den beräknar om SHA-256-hashvärden för deras rader och jämför dem med databassammandragsfilerna som skickas till verifieringens lagrade procedur.

Eftersom transaktionsverifieringen återberäknar alla hashvärden för transaktioner i databasen kan det vara en resursintensiv process för databaser med stora mängder data. För att minska kostnaden för verifiering visar funktionen alternativ för att verifiera enskilda transaktionsregistertabeller eller endast en delmängd av transaktionsregistertabellerna.

Du utför databasverifiering genom två lagrade procedurer, beroende på om du använder automatisk sammanfattad lagring eller om du hanterar sammandrag manuellt.

Anmärkning

Databasalternativet ALLOW_SNAPSHOT_ISOLATION måste aktiveras på databasen innan du kan köra de verifierade lagrade procedurerna.

Databasverifiering som använder automatisk sammandragslagring

När du använder automatisk sammandragslagring för att generera och lagra databassammandrag finns platsen för den sammanfattade lagringen i systemkatalogvyn sys.database_ledger_digest_locations som JSON-objekt. Att utföra databasverifiering innebär att köra den systemlagrade proceduren sp_verify_database_ledger_from_digest_storage. Ange JSON-objekten från sys.database_ledger_digest_locations systemkatalogvyn där databassammandrag har konfigurerats att lagras.

När du använder automatisk sammandragslagring kan du ändra lagringsplatser under hela livscykeln för transaktionsregistertabellerna. Om du till exempel börjar med att använda oföränderlig lagring i Azure för att lagra dina sammanfattade filer, men senare vill använda Azure Confidential Ledger i stället, kan du göra det. Den här ändringen av platsen lagras i sys.database_ledger_digest_locations.

När du kör transaktionsregisterverifiering kontrollerar du platsen för digest_locations för att säkerställa att sammandrag som används i verifieringen hämtas från de platser du förväntar dig. Du vill se till att en privilegierad användare inte har ändrat platser för den sammanfattade lagringen till en oskyddad lagringsplats, till exempel Azure Storage, utan en konfigurerad och låst oföränderlighetsprincip.

För att förenkla körningen av verifiering när du använder flera sammanfattningslagringsplatser hämtar följande skript platserna för sammanfattningarna och utför verifieringen med dessa platser.

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

Databasverifiering som använder manuell sammanfattad lagring

När du använder manuell sammandragslagring för att generera och lagra databassammandrag används den lagrade proceduren sp_verify_database_ledger för att verifiera transaktionsregisterdatabasen. JSON-innehållet i digesten läggs till i lagringsproceduren. När du kör databasverifiering kan du välja att verifiera alla tabeller i databasen eller verifiera specifika tabeller.

Följande kod är ett exempel på hur du kör den sp_verify_database_ledger lagrade proceduren genom att skicka två sammandrag för verifiering:

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"
    }
]';

Returkoder för sp_verify_database_ledger och sp_verify_database_ledger_from_digest_storage är 0 (lyckade) eller 1 (misslyckade).

Recommendation

Helst vill du minimera eller till och med eliminera klyftan mellan tiden då attacken inträffade och den tid då den upptäcktes. Microsoft rekommenderar att du schemalägger transaktionsregisterverifieringen regelbundet för att undvika en återställning av databasen från dagar eller månader sedan efter att manipulering har identifierats. Verifieringsintervallet bör bestämmas av kunden, men tänk på att transaktionsregistrets verifiering kan vara resurskrävande. Vi rekommenderar att du kör detta under ett underhållsfönster eller under lågbelastningstider.

Schemaläggning av databasverifiering i Azure SQL Database kan göras med Elastic Jobs eller Azure Automation. Om du vill schemalägga databasverifieringen i Azure SQL Managed Instance och SQL Server kan du använda SQL Server Agent.

Permissions

Databasverifiering kräver behörigheten VIEW LEDGER CONTENT . Mer information om behörigheter som rör transaktionsregistertabeller finns i Behörigheter.