資料庫驗證
適用於:SQL Server 2022 (16.x) Azure SQL 資料庫 Azure 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_ledger
和 sp_verify_database_ledger_from_digest_storage
的傳回碼為 0
(成功) 或 1
(失敗)。
建議
在理想情況下,您想盡可能減少或甚至消除攻擊發生時與偵測到攻擊時之間的差距。 Microsoft 建議定期安排總帳驗證,避免在偵測到竄改後還原幾天或幾個月前的資料庫。 驗證的間隔應由客戶決定,但請注意總帳驗證可能非常耗資源。 建議您在維護時段或離峰時間執行這項作業。
您可以使用彈性作業或 Azure 自動化,在 Azure SQL 資料庫中排程資料庫驗證。 若要在 Azure SQL 受控執行個體和 SQL Server 中排程資料庫驗證,您可以使用 SQL Server Agent。
權限
資料庫驗證需要VIEW LEDGER CONTENT
權限。 如需總帳資料表相關權限的詳細資訊,請參閱權限。