데이터베이스 확인

적용 대상: SQL Server 2022(16.x) 미리 보기 Azure SQL Database

원장은 전달 무결성이라는 데이터 무결성의 형태를 제공하며, 이는 원장 테이블의 데이터에 대한 데이터 변조 증거를 제공합니다. 데이터베이스 확인 프로세스는 이전에 생성된 데이터베이스 다이제스트 하나 이상을 입력으로 사용합니다. 그런 후 데이터베이스 원장에 저장된 해시를 원장 테이블의 현재 상태를 기준으로 다시 계산합니다. 계산된 해시가 입력 다이제스트와 일치하지 않는 경우 확인에 실패합니다. 실패는 데이터가 변조되었음을 나타냅니다. 확인 프로세스는 검색된 불일치를 모두 보고합니다.

데이터베이스 확인 프로세스

확인 프로세스는 모든 원장 및 기록 테이블을 검색합니다. 또한 해당 행의 SHA-256 해시를 다시 계산한 다음 확인 저장 프로시저에 전달된 데이터베이스 다이제스트 파일과 비교합니다.

원장 확인 과정에서는 데이터베이스의 트랜잭션에 대한 모든 해시를 다시 계산하기 때문에 대량의 데이터가 있는 데이터베이스의 경우 리소스를 많이 사용하는 프로세스가 될 수 있습니다. 확인 비용을 줄이기 위해 개별 원장 테이블을 확인하거나 원장 테이블의 하위 세트만 확인하는 옵션을 제공합니다.

자동 다이제스트 스토리지를 사용하는지 아니면 수동으로 다이제스트를 관리하는지에 따라 두 개의 저장 프로시저를 통해 데이터베이스 확인을 수행합니다.

중요

데이터베이스 확인에는 원장 콘텐츠 보기 권한이 필요합니다. 원장 테이블과 관련된 권한에 대한 자세한 내용은 권한을 참조하세요.

자동 다이제스트 스토리지를 사용하는 데이터베이스 확인

참고

자동 다이제스트 스토리지를 사용한 데이터베이스 확인은 현재 Azure SQL Database에서 사용할 수 있지만 SQL Server에서는 지원되지 않습니다.

데이터베이스 다이제스트의 생성 및 사용에 자동 다이제스트 스토리지를 사용할 경우 다이제스트 스토리지의 위치는 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 콘텐츠가 저장 프로시저에 추가됩니다. 데이터베이스 확인을 실행할 때 데이터베이스의 모든 테이블 또는 특정 테이블을 확인하도록 선택할 수 있습니다.

다음 코드는 확인을 위해 두 개의 다이제스트를 전달하여 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(실패)입니다.

권장

이상적으로는 공격이 발생한 시간과 검색된 시간 사이의 간격을 최소화하거나 제거하려고 합니다. 변조가 감지된 후 며칠 또는 몇 달 전에 데이터베이스를 복원하지 않도록 정기적으로 원장 확인을 예약하는 것이 좋습니다. 확인 간격은 고객이 결정해야 하지만 원장 확인은 리소스 소비일 수 있습니다. 유지 관리 기간 동안 또는 사용량이 적은 시간에 이 작업을 실행하는 것이 좋습니다.

Elastic Jobs 또는 Azure Automation을 사용하여 데이터베이스 확인 예약을 수행할 수 있습니다.

다음 단계