データベースの検証

適用対象: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

台帳では、前方整合性と呼ばれるデータ整合性の形式が提供されており、台帳テーブルのデータに対するデータ改ざんに関する証拠が示されます。 データベース検証プロセスでは、以前に生成された 1 つ以上のデータベース ダイジェストが入力として受け取られます。 続いて、現在の台帳テーブルの状態に基づいて、データベース台帳に格納されているハッシュが再度計算されます。 計算されたハッシュが入力ダイジェストと一致しない場合、検証は失敗します。 このエラーは、データが改ざんされていることを示します。 検証プロセスで、検出されたすべての不一致が報告されます。

データベースの検証プロセス

検証プロセスでは、すべての台帳テーブルと履歴テーブルがスキャンされます。 それらの行の SHA-256 ハッシュが再計算されて、検証ストアド プロシージャに渡されたデータベース ダイジェスト ファイルと比較されます。

台帳の検証では、データベース内のトランザクションのすべてのハッシュが再計算されるので、大量のデータを含むデータベースではリソースを大量に消費するプロセスになる可能性があります。 検証コストを削減するために、この機能では、個々の台帳テーブル、または台帳テーブルのサブセットのみを検証するオプションが公開されています。

自動ダイジェスト ストレージを使用するか、手動でダイジェストを管理するかに応じて、2 つのストアド プロシージャを使用してデータベース検証を実行します。

Note

検証ストアド プロシージャを実行する前に、データベースでデータベース オプション ALLOW_SNAPSHOT_ISOLATION を有効にする必要があります。

自動ダイジェスト ストレージを使用したデータベース検証

データベース ダイジェストの生成と格納に自動ダイジェスト ストレージを使用する場合、ダイジェスト ストレージの場所は、JSON オブジェクトとして sys.database_ledger_digest_locations システム カタログ ビュー内にあります。 データベース検証の実行は、sp_verify_database_ledger_from_digest_storage システム ストアド プロシージャの実行から構成されます。 データベース ダイジェストが格納されるように構成されている sys.database_ledger_digest_locations システム カタログ ビューから JSON オブジェクトを指定します。

自動ダイジェスト ストレージを使用すると、台帳テーブルのライフサイクル全体でストレージの場所を変更できます。 たとえば、最初は Azure 不変ストレージを使用してダイジェスト ファイルを格納するが、後で代わりに Azure Confidential Ledger を使用する場合は、それを行うことができます。 この場所の変更は、sys.database_ledger_digest_locations に保管されます。

台帳検証を実行するときに、digest_locations の場所を調べて、検証に使用されるダイジェストが予期した場所から取得されるようにします。 権限のあるユーザーによって、構成済みでロックされている不変ポリシーを使用せずに、Azure Storage などの保護されていないストレージの場所にダイジェスト ストレージの場所が変更されていないことを確認する必要があります。

複数のダイジェスト ストレージの場所を使用している場合に検証の実行を簡略化するために、次のスクリプトでは、ダイジェストの場所をフェッチし、それらの場所を使用して検証を実行します。

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 コンテンツがストアド プロシージャに追加されます。 データベース検証を実行しているときに、データベース内のすべてのテーブルを検証するか、特定のテーブルを検証するかを選択できます。

次のコードは、検証用に 2 つのダイジェストを渡して 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 SQL Databaseのデータベース確認のスケジューリングは、Elastic JobsまたはAzure Automationで行うことができます。 Azure SQL Managed Instance および SQL Server のデータベース確認のスケジューリングには、SQL Server エージェント を使用できます。

アクセス許可

データベースの確認にはVIEW LEDGER CONTENTアクセス許可が必要です。 台帳テーブルに関連するアクセス許可の詳細については、アクセス許可に関するページを参照してください。