다음을 통해 공유


변조 후 원장 데이터베이스 복구

적용 대상: SQL Server 2022(16.x) Azure SQL 데이터베이스 Azure SQL Managed Instance

변조가 발생한 후 복구하는 방법

모든 종류의 변조를 복구하는 가장 간단한 방법은 데이터베이스를 확인할 수 있는 최신 백업으로 복원하는 것입니다. 이를 위해 데이터베이스를 다른 시점으로 복원하고 이전 데이터베이스 다이제스트를 사용하여 원장을 확인할 수 있습니다. 성공적으로 확인할 수 있는 최신 시점은 변조되지 않도록 보장되고 트랜잭션 처리를 계속하는 데 사용할 수 있는 시점입니다. 이러한 이유로 백업이 변조 시간에 최대한 근접할 수 있을 만큼 자주 백업하는 것이 중요합니다. 백업 예약은 Azure SQL Database에 대해 자동으로 수행됩니다. 이 기술은 간단하지만 중요한 주의 사항이 있습니다. 변조가 발생한 후 트랜잭션이 실행된 경우 이러한 트랜잭션이 손실되거나 확인된 트랜잭션에 대한 정보를 다시 삽입하고 데이터베이스 원장의 첫 번째 변조 이벤트 후에 발생한 이러한 새 트랜잭션에 대한 해시를 다시 계산하여 원장 테이블을 수동으로 복구해야 한다는 점을 받아들여야 합니다.

변조 범주

변조 유형에 따라 데이터를 잃지 않고 원장을 복구할 수 있는 경우가 있습니다. 변조 이벤트의 두 가지 범주를 고려해야 합니다.

변조는 추가 트랜잭션에 영향을 주지 않았습니다.

변조 이벤트는 원장에 저장된 일부 데이터를 수정했지만 추가 트랜잭션에는 영향을 주지 않았습니다. 이는 트랜잭션이 변조된 데이터에 대해 작동하기 전에 공격이 감지되었거나 공격이 새 트랜잭션에 영향을 주지 않는 방식으로 데이터에만 영향을 미쳤기 때문일 수 있습니다. 예를 들어 원장 테이블을 사용하여 은행 거래 세부 정보를 저장하는 경우 기존 트랜잭션의 세부 정보를 변조해도 새 트랜잭션에 영향을 주지 않으므로 현재 잔액에서 작동합니다.

변조는 변조 이벤트 후에 발생한 트랜잭션에 영향을 주지 않으므로 새 트랜잭션 실행 및 생성된 결과가 올바릅니다. 이를 기반으로 이러한 트랜잭션에 영향을 주지 않고 원장을 일관된 상태로 유지하는 것이 좋습니다.

공격자가 데이터베이스 수준 원장을 변조하지 않은 경우 이를 쉽게 감지하고 복구할 수 있습니다. 데이터베이스 원장은 생성된 모든 데이터베이스 다이제스트와 일관된 상태이며, 추가된 모든 새 트랜잭션은 이전 트랜잭션의 유효한 해시를 사용하여 해시되었습니다. 이에 따라 변조가 발생한 후에도 트랜잭션에 대해 생성된 모든 데이터베이스 다이제스트는 여전히 유효합니다. 변조된 트랜잭션에 대한 올바른 테이블 원장 페이로드를 검색하여 여전히 안전한지 확인할 수 있는 백업(원장 유효성 검사 사용)을 검색하고 테이블 원장의 변조된 데이터를 덮어써 운영 데이터베이스를 복구할 수 있습니다. 그러면 복구 트랜잭션을 기록하는 새 트랜잭션이 생성됩니다.

추가 트랜잭션에서 사용되는 영향을 받는 데이터 변조

변조 이벤트는 나중에 추가 트랜잭션에서 사용된 데이터에 영향을 주므로 실행에 영향을 줍니다. 예를 들어 현재 계정 잔액이 원장 테이블에 저장되는 은행 애플리케이션에서 테이블의 현재 상태를 수정하는 것은 새 트랜잭션을 초과 지출할 수 있으므로 추가 트랜잭션에 재앙이 될 수 있습니다.

공격자가 데이터베이스 원장을 변조하여 내부적으로 일관성을 유지하도록 블록 해시를 다시 계산하는 경우(외부 데이터베이스 다이제스트에 대해 확인될 때까지) 잘못된 해시를 통해 새 트랜잭션 및 데이터베이스 다이제스트가 생성됩니다. 이렇게 하면 새 데이터베이스 다이제스트가 생성된 맵이 잘못된 상태로 생성되고 이전 백업을 사용하여 원장을 복구하더라도 이러한 모든 데이터베이스 다이제스트가 영구적으로 유효하지 않으므로 원장의 포크가 발생합니다. 또한 데이터베이스 원장이 손상되었으므로 변조 후 발생한 트랜잭션에 대한 세부 정보는 확인할 때까지 신뢰할 수 없습니다. 이에 따라 변조는 다음을 통해 잠재적으로 되돌릴 수 있습니다.

  1. 백업을 사용하여 변조된 트랜잭션의 상태를 복원합니다.
  2. 백업에서 마지막으로 트랜잭션을 복구한 후 원장의 끝까지 원장 부분을 확인합니다. 이를 위해 체인의 포크된 부분에서 데이터베이스 다이제스트를 사용해야 합니다. 데이터베이스 다이제스트가 원장의 원래 부분과 일치하지는 않지만 원장의 포크된 부분이 변조되지 않았는지 확인할 수 있습니다. 또한 변조를 나타내는 경우 이는 두 개 이상의 변조 이벤트가 있었고 백업에서 원장의 다른 부분을 복구하기 위해 프로세스를 재귀적으로 적용해야 함을 의미합니다.
  3. 확인된 트랜잭션에 대한 정보를 다시 삽입하고 데이터베이스 원장의 첫 번째 변조 이벤트 후에 발생한 이러한 새 트랜잭션에 대한 해시를 다시 계산하여 테이블 원장을 수동으로 복구합니다.