다이제스트 관리
적용 대상: SQL Server 2022(16.x) Azure SQL 데이터베이스 Azure SQL Managed Instance
데이터베이스 다이제스트
데이터베이스 원장에서 최신 블록의 해시를 데이터베이스 다이제스트라고 합니다. 이는 블록이 생성될 때 데이터베이스에 있는 모든 원장 테이블의 상태를 나타냅니다. 데이터베이스 다이제스트 생성은 최근에 추가된 블록의 해시만 계산하기 때문에 효율적입니다.
데이터베이스 다이제스트는 시스템에서 자동으로 생성하거나 사용자가 수동으로 생성할 수 있습니다. 나중에 이를 사용하여 데이터베이스의 무결성을 확인할 수 있습니다.
데이터베이스 다이제스트는 블록 ID에 대한 메타데이터와 함께 최신 블록의 해시를 포함하는 JSON 문서의 형태로 생성됩니다. 메타데이터에는 다이제스트가 생성된 시간과 이 블록에서 이루어진 마지막 트랜잭션의 커밋 타임스탬프가 포함됩니다.
확인 프로세스와 데이터베이스의 무결성은 입력 다이제스트의 무결성에 따라 달라집니다. 이를 위해 데이터베이스에서 추출된 데이터베이스 다이제스트는 데이터베이스의 권한이 높은 사용자 또는 공격자가 변조할 수 없는 신뢰할 수 있는 스토리지에 저장되어야 합니다.
데이터베이스 다이제스트 자동 생성 및 저장
참고 항목
SQL Server에서 데이터베이스 다이제스트의 자동 생성 및 저장은 Azure Storage 계정만 지원합니다.
원장은 Azure Blob Storage의 변경할 수 없는 스토리지 기능 및 Azure Confidential Ledger와 통합됩니다. 이 통합은 Azure에서 보안 스토리지 서비스를 제공하여 잠재적인 변조로부터 데이터베이스 다이제스트를 보호합니다. 이 통합은 사용자가 가용성 및 지리적 복제에 대해 걱정할 필요 없이 다이제스트 관리를 자동화할 수 있는 간단하고 비용 효율적인 방법을 제공합니다. Azure Confidential Ledger는 권한 있는 관리자가 다이제스트에 액세스하는 것을 염려하는 고객을 위해 더 강력한 무결성을 보장합니다. 이 표에서는 Azure Blob Storage의 변경이 불가능한 스토리지 기능을 Azure Confidential Ledger와 비교합니다.
Azure Portal, PowerShell 또는 Azure CLI를 통해 데이터베이스 다이제스트의 자동 생성 및 저장을 구성할 수 있습니다. 자세한 내용은 자동 다이제스트 스토리지 사용을 참조하세요. 자동 생성 및 저장을 구성하면 데이터베이스 다이제스트는 30초의 미리 정의된 간격으로 생성되고 선택한 스토리지 서비스에 업로드됩니다. 시스템에서 30초 간격으로 트랜잭션이 발생하지 않으면 데이터베이스 다이제스트가 생성 및 업로드되지 않습니다. 이 메커니즘을 통해 데이터베이스에서 데이터가 업데이트된 경우에만 데이터베이스 다이제스트가 생성됩니다. 엔드포인트가 Azure Blob Storage인 경우 Azure SQL 데이터베이스를 위한 논리 서버 또는 Azure SQL Managed Instance의 논리 서버는 sqldbledgerdigests라는 새 컨테이너를 만들고 ServerName/DatabaseName/CreationTime
와 같은 명명 패턴을 사용합니다. 동일한 이름의 데이터베이스를 삭제했다가 다시 만들거나 복원하여 동일한 이름으로 데이터베이스의 다른 인카네이션을 허용할 수 있으므로 생성 시간이 필요합니다. 자세한 내용은 다이제스트 관리 고려 사항을 참조하세요.
참고 항목
SQL Server의 경우 사용자가 컨테이너를 수동으로 만들어야 합니다.
Azure Storage 계정 불변성 정책
데이터베이스 다이제스트 저장에 Azure Storage 계정을 사용하는 경우 데이터베이스 다이제스트가 변조로부터 보호되도록 프로비전한 후에는 컨테이너에 불변성 정책을 구성합니다. 불변성 정책에서 보호된 추가 쓰기가 Blob을 추가하도록 허용하고 정책이 잠겨 있는지 확인합니다.
Azure Storage 계정 권한
Azure SQL 데이터베이스 또는 Azure SQL Managed Instance를 사용하는 경우 논리 서버 또는 관리되는 인스턴스(시스템 ID)에 스토리지 Blob 데이터 기여자 역할에 다이제스트를 추가하여 다이제스트를 작성할 수 있는 충분한 RBAC(역할 기반 액세스 제어) 권한이 있는지 확인합니다. 활성 지역 복제 또는 자동 장애 조치(failover) 그룹을 사용하는 경우 보조 복제본에 Azure Storage 계정에 대해 동일한 RBAC 권한이 있는지 확인합니다.
SQL Server를 사용하는 경우 SQL Server가 Azure Storage 계정에 연결하고 인증할 수 있도록 다이제스트 컨테이너에 SAS(공유 액세스 서명)를 만들어야 합니다.
- Azure Storage 계정에 sqldbledgerdigests라는 컨테이너를 만듭니다.
- 읽기, 추가, 만들기, 쓰기 및 목록 권한을 사용하여 컨테이너에 정책을 만들고 공유 액세스 서명 키를 생성합니다.
- 다이제스트 파일 저장을 위해 사용하는 sqldbledgerdigests 컨테이너의 경우 컨테이너 경로와 일치하는 이름의 SQL Server 자격 증명을 만들어야 합니다.
다음 예제에서는 Azure Storage 컨테이너, 정책 및 SAS 키가 생성되었다고 가정합니다. 이는 SQL Server에서 컨테이너의 다이제스트 파일에 액세스하기 위해 필요합니다.
다음 코드 조각에서는 <your SAS key>
를 SAS 키로 바꿉니다. SAS 키는 'sr=c&si=<MYPOLICYNAME>&sig=<THESHAREDACCESSSIGNATURE>'
와 같습니다.
CREATE CREDENTIAL [https://ledgerstorage.blob.core.windows.net/sqldbledgerdigests]
WITH IDENTITY='SHARED ACCESS SIGNATURE',
SECRET = '<your SAS key>'
Azure Confidential Ledger 권한
Azure SQL 데이터베이스 또는 Azure SQL Managed Instance를 사용하는 경우 논리 서버 또는 관리되는 인스턴스(시스템 ID)에 기여자 역할에 추가하여 다이제스트를 작성할 수 있는 충분한 권한이 있는지 확인합니다. 이를 위해 Azure Confidential Ledger 사용자 관리에 대한 단계를 수행합니다.
참고 항목
SQL Server에서 데이터베이스 다이제스트의 자동 생성 및 저장은 Azure Storage 계정만 지원합니다.
Azure Confidential Ledger에서 작동하도록 Azure SQL Managed Instance NSG 규칙 구성
Azure SQL Managed Instance를 사용하는 경우 Azure Confidential Ledger와 통신하도록 Azure SQL Managed Instance의 가상 네트워크 규칙을 구성해야 합니다. 자세한 내용은 Azure Confidential Ledger에서 작동하도록 Azure SQL Managed Instance NSG 규칙 구성을 참조하세요.
데이터베이스 다이제스트 수동 생성 및 스토리지
또한 주문형 데이터베이스 다이제스트를 생성하여 신뢰할 수 있는 스토리지 대상으로 간주되는 모든 서비스 또는 디바이스에 다이제스트를 수동으로 저장할 수 있습니다. 예를 들어 온-프레미스 WORM(Wright Once, Read Many) 디바이스를 목적지로 선택할 수 있습니다. SQL Server Management Studio 또는 Azure Data Studio에서 sys.sp_generate_database_ledger_digest 저장 프로시저를 실행하여 데이터베이스 다이제스트를 수동으로 생성합니다.
EXECUTE sp_generate_database_ledger_digest;
반환된 결과 집합은 단일 데이터 행입니다. 이러한 결과 집합을 다음과 같이 신뢰할 수 있는 스토리지 위치에 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"
}
사용 권한
데이터베이스 다이제스트를 생성하려면 GENERATE LEDGER DIGEST
권한이 필요합니다. 원장 테이블과 관련된 권한에 대한 자세한 내용은 권한을 참조하세요.
다이제스트 관리 고려 사항
데이터베이스 복원
지정 시간 복원이라고도 하는 이전 시점으로 데이터베이스를 복원하는 작업은 오류가 발생하고 사용자가 데이터베이스의 상태를 이전 시점으로 신속하게 되돌려야 할 때 자주 사용됩니다. 생성된 다이제스트를 Azure Storage 또는 Azure Confidential Ledger에 업로드할 때 이러한 다이제스트가 매핑되는 데이터베이스의 생성 시간이 캡처됩니다. 데이터베이스가 복원될 때마다 새 생성 시간이 태그로 지정되고 이 기술을 통해 데이터베이스의 다양한 "인카네이션" 에 다이제스트를 저장할 수 있습니다. SQL Server의 경우 생성 시간은 다이제스트 업로드를 처음으로 사용하도록 설정한 현재 UTC 시간입니다. 원장은 복원 작업이 발생한 시간에 대한 정보를 유지하므로 확인 프로세스에서 데이터베이스의 다양한 인카네이션에서 관련 다이제스트를 모두 사용할 수 있습니다. 또한 사용자는 다양한 생성 시간의 다이제스트를 모두 검사하여 데이터베이스가 복원된 시간 및 지정 시간을 식별할 수 있습니다. 이 데이터는 변경이 불가능한 스토리지에 기록되므로 이 정보도 보호됩니다.
참고 항목
Azure SQL Managed Instance에서 데이터베이스 백업의 네이티브 복원을 수행하는 경우 Azure Portal, PowerShell 또는 Azure CLI를 사용하여 다이제스트 경로를 수동으로 변경해야 합니다.
활성 지역 복제 및 Always On 가용성 그룹
활성 지역 복제 또는 자동 장애 조치(failover) 그룹은 Azure SQL 데이터베이스 또는 Azure SQL Managed Instance에 대해 구성할 수 있습니다. 지리적 지역 간 복제는 성능상 이유로 비동기적이므로 보조 데이터베이스가 주 데이터베이스에 비해 약간 지연될 수 있습니다. 지리적 장애 조치(failover)가 발생하는 경우 아직 복제되지 않은 최신 데이터가 모두 손실됩니다. 원장은 지리적 보조 데이터베이스에 복제된 데이터에 대해서만 데이터베이스 다이제스트를 실행하여 다이제스트가 지리적 장애 조치(failover)에서 손실될 수 있는 데이터를 참조하지 않도록 합니다. 이는 데이터베이스 다이제스트의 자동 생성 및 저장에만 적용됩니다. 장애 조치(failover) 그룹에서 주 데이터베이스와 보조 데이터베이스는 모두 동일한 다이제스트 경로를 갖습니다. 장애 조치(failover)를 수행하는 경우에도 주 데이터베이스와 보조 데이터베이스 모두에 대해 다이제스트 경로가 변경되지 않습니다.
장애 조치(failover) 그룹이 삭제되거나 링크를 공유하면 두 데이터베이스가 모두 주 데이터베이스로 작동합니다. 이때 이전 보조 데이터베이스의 다이제스트 경로가 변경되고 RemovedSecondaryReplica 폴더가 경로에 추가됩니다.
데이터베이스가 SQL Server의 Always On 가용성 그룹 또는 Managed Instance 링크의 일부인 경우 활성 지역 복제와 동일한 원칙이 사용됩니다. 다이제스트 업로드는 모든 트랜잭션이 보조 복제본에 복제된 경우에만 수행됩니다.