資料庫驗證

適用於: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL 受控執行個體

總帳提供名為「向前完整性」(forward integrity) 的資料完整性,這可針對總帳資料表中的資料提供資料竄改的證據。 資料庫驗證程序會將一或多個先前產生的資料庫摘要作為輸入。 接著程序會根據總帳資料表的目前狀態,重新計算儲存於資料表總帳的雜湊。 如果計算的雜湊不符合輸入摘要,驗證便會失敗。 失敗表示資料已遭竄改。 驗證程序接著會報告偵測到的所有不一致資料。

資料庫驗證流程

驗證程序會掃描所有總帳和歷程記錄資料表。 程序會重新計算 SHA-256 資料列的雜湊,並將其與傳遞給驗證預存程式的資料庫摘要檔案進行比較。

因為總帳驗證會重新計算資料庫中所有交易的雜湊,所以對擁有大量資料的資料庫而言,是會佔用很多資源的程序。 為降低驗證成本,此功能可選擇驗證個別總帳資料表或只驗證部分總帳資料表。

您可以透過兩個預存程序完成資料庫驗證,這取決於您使用自動化摘要儲存或您透過手動管理摘要

注意

您必須先在資料庫上啟用資料庫選項 ALLOW_SNAPSHOT_ISOLATION,才能執行驗證預存程序。

使用自動化摘要儲存的資料庫驗證

當您使用自動化摘要儲存來產生和儲存資料庫摘要時,摘要儲存的位置會位於系統目錄檢視 sys.database_ledger_digest_locations 中,為 JSON 物件。 執行資料庫驗證包含執行 sp_verify_database_ledger_from_digest_storage 系統預存程序。 透過資料庫摘要設定為儲存的 sys.database_ledger_digest_locations 系統目錄檢視指定 JSON 物件。

當您使用自動化摘要儲存時,您可以在總帳資料表的生命週期中變更儲存位置。 例如,如果您一開始使用 Azure 不可變儲存體來儲存您的摘要檔案,但之後您想要改為使用 Azure 機密總帳,可直接進行變更。 位置的這項變更會儲存在 sys.database_ledger_digest_locations中。

當您執行總帳驗證時,請檢查 digest_locations 的位置,以確保驗證中使用的摘要是從您預期的位置所擷取。 您想確保特殊權限使用者在沒有設定及鎖定不變性原則的情況下,將摘要儲存體的位置變更為未受保護的儲存位置 (例如 Azure 儲存體)。

若要在您使用多個摘要儲存位置時簡化執行驗證,下列指令碼可擷取摘要的位置,並藉由這些位置執行驗證。

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

使用手動摘要儲存的資料庫驗證

當您使用手動摘要儲存體來產生和儲存資料庫摘要時,會使用 sp_verify_database_ledger 預存程序來驗證總帳資料庫。 摘要的 JSON 內容會附加在預存程序中。 當您執行資料庫驗證時,您可以選擇驗證資料庫中的所有資料表,或驗證特定的資料表。

下列程式碼是藉由傳遞兩個摘要進行驗證來執行 sp_verify_database_ledger 預存程序的範例:

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

sp_verify_database_ledgersp_verify_database_ledger_from_digest_storage 的傳回碼為 0 (成功) 或 1 (失敗)。

建議

在理想情況下,您想盡可能減少或甚至消除攻擊發生時與偵測到攻擊時之間的差距。 Microsoft 建議定期安排總帳驗證,避免在偵測到竄改後還原幾天或幾個月前的資料庫。 驗證的間隔應由客戶決定,但請注意總帳驗證可能非常耗資源。 建議您在維護時段或離峰時間執行這項作業。

您可以使用彈性作業或 Azure 自動化,在 Azure SQL 資料庫中排程資料庫驗證。 若要在 Azure SQL 受控執行個體和 SQL Server 中排程資料庫驗證,您可以使用 SQL Server Agent。

權限

資料庫驗證需要VIEW LEDGER CONTENT權限。 如需總帳資料表相關權限的詳細資訊,請參閱權限