데이터베이스 확인

적용 대상: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

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

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

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

원장 확인은 데이터베이스의 트랜잭션에 대한 모든 해시를 다시 계산하므로 많은 양의 데이터가 있는 데이터베이스에 대한 리소스 집약적 프로세스가 될 수 있습니다. 확인 비용을 줄이기 위해 이 기능은 개별 원장 테이블 또는 원장 테이블의 하위 집합만 확인하는 옵션을 노출합니다.

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

참고 항목

꼭짓점 저장 프로시저를 실행하려면 데이터베이스에서 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 콘텐츠는 저장 프로시저에 추가됩니다. 데이터베이스 확인을 실행하는 경우 데이터베이스의 모든 테이블을 확인하거나 특정 테이블을 확인하도록 선택할 수 있습니다.

다음 코드는 확인을 위해 두 개의 다이제스트를 전달하여 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"
    }
]';

(성공) 또는 1 (실패)에 대한 0sp_verify_database_ledgersp_verify_database_ledger_from_digest_storage 코드를 반환합니다.

권장

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

탄력적 작업 또는 Azure Automation을 사용하여 Azure SQL Database에서 데이터베이스 확인 예약을 수행할 수 있습니다. Azure SQL Managed Instance 및 SQL Server에서 데이터베이스 확인을 예약하려면 SQL Server 에이전트 사용할 수 있습니다.

사용 권한

데이터베이스 확인에는 VIEW LEDGER CONTENT 사용 권한이 필요합니다. 원장 테이블과 관련된 권한에 대한 자세한 내용은 권한을 참조하세요.