데이터베이스 확인
적용 대상: SQL Server 2022(16.x) Azure SQL 데이터베이스 Azure 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"
}
]';
sp_verify_database_ledger
및 sp_verify_database_ledger_from_digest_storage
는 0
(성공) 또는 1
(실패)에 대한 코드를 반환합니다.
추천
이상적으로는 공격이 발생한 시간과 검색된 시간 사이의 간격을 최소화하거나 제거하려고 합니다. 변조가 감지된 후 며칠 또는 몇 달 전에 데이터베이스를 복원하지 않도록 정기적으로 원장 확인을 예약하는 것이 좋습니다. 확인 간격은 고객이 결정해야 하지만 원장 확인은 리소스 소비일 수 있습니다. 유지 관리 기간 동안 또는 사용량이 적은 시간에 이 작업을 실행하는 것이 좋습니다.
Azure SQL 데이터베이스에서의 확인 예약은 Elastic Jobs 또는 Azure Automation을 사용해 진행할 수 있습니다. Azure SQL Managed Instance 및 SQL Server에서 데이터베이스 확인을 예약하는 경우 SQL Server 에이전트를 사용할 수 있습니다.
사용 권한
데이터베이스 확인에는 VIEW LEDGER CONTENT
권한이 필요합니다. 원장 테이블과 관련된 권한에 대한 자세한 내용은 권한을 참조하세요.