Поделиться через


Проверка таблицы реестра для обнаружения незаконного изменения

Применимо к: SQL Server 2022 (16.x) и более поздних версийУправляемого экземпляра Базы данных SQL Azure SQL Azure

В этой статье вы проверяете целостность данных в таблицах реестра. Если вы настраиваете автоматическое хранилище дайджеста в вашей базе данных, см. раздел T-SQL об использовании автоматического хранилища дайджеста. В противном случае перейдите к разделу T-SQL с использованием ручного создания дайджестов.

Предварительные требования

Выполнение проверки реестра для базы данных

  1. Подключитесь к базе данных с помощью SQL Server Management Studio.

  2. Создайте новый запрос с помощью следующей инструкции T-SQL:

    DECLARE @digest_locations AS NVARCHAR (MAX) = (SELECT *
                                                   FROM sys.database_ledger_digest_locations
                                                   FOR JSON AUTO, INCLUDE_NULL_VALUES);
    SELECT @digest_locations AS digest_locations;
    BEGIN TRY
        EXECUTE 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 возвращает текущее расположение, в котором хранятся дайджесты базы данных и все предыдущие расположения. В окне Результаты отображается сообщение об успешности проверки реестра.

    Снимок экрана: проверка реестра с помощью Visual Studio Code.

  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.