ダイジェストの管理とデータベースの検証

適用対象: Azure SQL Database

注意

現在、Azure SQL Database 台帳はパブリック プレビュー段階にあります。

Azure SQL Database 台帳では、前方整合性 と呼ばれるデータ整合性の形式が提供されており、台帳テーブルのデータに対するデータ改ざんに関する証拠が示されます。 たとえば、残高が x の値に更新された台帳テーブルで銀行取引が発生し、攻撃者が後でデータを変更して x から y に残高を変えた場合、データベースの検証によって、この改ざんアクティビティが検出されます。

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

データベース ダイジェスト

データベース台帳における最新のブロックのハッシュは、データベース ダイジェスト と呼ばれます。 これは、ブロックが生成された時点のデータベース内のすべての台帳テーブルの状態を表します。 データベース ダイジェストの生成は、最近追加されたブロックのハッシュだけが計算されるため、効率的です。

データベース ダイジェストは、システムによって自動的に生成することも、ユーザーが手動で生成することもできます。 後でこれらを使用して、データベースのデータ整合性を確認することができます。

データベース ダイジェストは、最新ブロックのハッシュと、ブロック ID のメタデータを含む JSON ドキュメントの形式で生成されます。 メタデータには、ダイジェストが生成された時刻と、このブロック内の最後のトランザクションのコミット タイムスタンプが含まれます。

検証プロセスとデータベースの整合性は、入力ダイジェストの整合性によって左右されます。 このため、データベースから抽出されるデータベース ダイジェストは、Azure SQL Database サーバーの高い特権を持つユーザーや攻撃者が改ざんできない、信頼できるストレージに保管する必要があります。

データベース ダイジェストの自動生成と保存

Azure SQL Database 台帳は、Azure Blob Storage の不変ストレージ機能および Azure Confidential Ledger と統合されています。 この統合により、Azure においてセキュリティで保護されたストレージ サービスがもたらされ、データベース ダイジェストは改ざんの可能性から保護されます。 この統合により、ユーザーは可用性や地理的なレプリケーションについて心配することなく、簡単でコスト効率の高い方法でダイジェスト管理を自動化できます。

Azure portal、PowerShell、または Azure CLI を使用して、データベース ダイジェストの自動生成とストレージを構成できます。 自動生成とストレージを構成すると、データベース ダイジェストは、30 秒の事前定義された間隔で生成され、選択したストレージ サービスにアップロードされます。 30 秒間隔でシステムでトランザクションが発生しない場合、データベース ダイジェストは生成およびアップロードされません。 このメカニズムにより、データベース ダイジェストは、データベースでデータが更新された場合にのみ生成されます。

ダイジェスト ストレージを有効にするための選択内容を示したスクリーンショット。

重要

データベース ダイジェストが改ざんから確実に保護されるように、プロビジョニングの後、コンテナーで不変性ポリシーを構成します。

データベース ダイジェストの手動生成と保存

Azure SQL Database 台帳を使用して、必要に応じてデータベース ダイジェストを生成し、信頼される保管先と見なされるサービスやデバイスにダイジェストを手動で保管することもできます。 たとえば、オンプレミスの Write Once Read Many (WORM) デバイスを保管先として選択することができます。 データベース ダイジェストを手動で生成するには、SQL Server Management Studio または Azure Data Studio で、sys.sp_generate_database_ledger_digest ストアド プロシージャを実行します。

重要

データベース ダイジェストを生成するには、GENERATE LEDGER DIGEST 権限が必要です。 台帳テーブルに関連する権限の詳細は、権限に関する記事をご覧ください。

EXECUTE sp_generate_database_ledger_digest

返される結果セットは、1 行のデータです。 これは、次のように、JSON ドキュメントとして信頼できる保管場所に保存する必要があります。

    {
        "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"
    }

データベースの検証

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

大規模な台帳テーブルでは、データベースの検証はリソースを集中的に使用するプロセスになる可能性があります。 これは、データベースの整合性を確認する必要がある場合にのみ使用してください。

検証プロセスは、データベースの整合性を頻繁に監視する必要がある場合は、1 時間ごとまたは毎日実行できます。 または、データをホストしている組織が監査を受け、データの整合性に関する暗号化された証拠を提供する必要がある場合にのみ実行することができます。 検証コストを削減するために、台帳では、個々の台帳テーブル、または台帳テーブルの一部のみを検証するオプションが公開されています。

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

重要

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

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

データベース ダイジェストの生成と格納に自動ダイジェスト ストレージを使用する場合、ダイジェスト ストレージの場所は、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 に保管されます。

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

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

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

データベース ダイジェストの生成と格納に手動ダイジェスト ストレージを使用する場合は、次のストアド プロシージャを使用して台帳データベースを検証します。 ダイジェストの JSON コンテンツがストアド プロシージャに追加されます。 データベース検証を実行しているときに、データベース内のすべてのテーブルを検証するか、特定のテーブルを検証するかを選択できます。

次に、sp_verify_database_ledger ストアド プロシージャの構文を示します。

sp_verify_database_ledger <JSON_document_containing_digests>, <table_name> 

次のコードは、検証用に 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 (失敗) です。

次の手順