驗證總帳資料表以偵測竄改

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

在本文中,您將驗證總帳資料表中資料的完整性。 如果您已在資料庫上設定自動摘要儲存體,請遵循使用自動摘要儲存體的 T-SQL 一節。 否則,請遵循使用手動產生的摘要進行的 T-SQL 一節。

必要條件

執行資料庫的總帳驗證

  1. 使用 SQL Server Management StudioAzure Data Studio 連線至資料庫。

  2. 使用下列 T-SQL 陳述式來建立新的查詢:

    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
    

    注意

    也可以在 Azure 入口網站中找到驗證指令碼。 開啟 Azure 入口網站,並找出您想要驗證的資料庫。 在 [安全性] 中,選取 [總帳] 選項。 在 [總帳] 窗格中,選取 </> 驗證資料庫

  3. 執行查詢。 您會看到 digest_locations 傳回資料庫摘要儲存所在的目前位置,以及任何先前的位置。 [結果] 會傳回總帳驗證成功或失敗。

    Screenshot of running ledger verification by using Azure Data Studio.

  4. 開啟 digest_locations 結果集以檢視摘要的位置。 下列範例顯示此資料庫的兩個摘要儲存位置:

    • path 指出摘要的位置。

    • last_digest_block_id 指出 path 位置中所儲存之最後一個摘要的區塊識別碼。

    • is_current 指出 path 中的位置是目前位置 (true) 還是先前的位置 (false)。

      [
       {
           "path": "https:\/\/digest1.blob.core.windows.net\/sqldbledgerdigests\/janderstestportal2server\/jandersnewdb\/2021-05-20T04:39:47.6570000",
           "last_digest_block_id": 10016,
           "is_current": true
       },
       {
           "path": "https:\/\/jandersneweracl.confidential-ledger.azure.com\/sqldbledgerdigests\/janderstestportal2server\/jandersnewdb\/2021-05-20T04:39:47.6570000",
           "last_digest_block_id": 1704,
           "is_current": false
       }
      ]
      

    重要

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

  5. 驗證會在 [結果] 視窗中傳回下列訊息。

    • 如果您的資料庫中未遭到篡改,則訊息為:

      Ledger verification successful
      
    • 如果您的資料庫中遭到篡改,則 [訊息] 視窗中會出現下列錯誤:

      Failed to execute query. Error: The hash of block xxxx in the database ledger doesn't match the hash provided in the digest for this block.