MS-SQL Server

SERVICE MASTER KEY (SMK)

알 수 없는 사용자 2008. 6. 10. 08:28

서버 이전작업시 master DB를 그대로 이전한다고 했을때
MS-SQL 2000에서는 대상서버로 master DB를 이전하려면 master DB의 백업본을 가지고 단일 사용자 모드에서 복원하던지
대상서버의 MSSQL 서비스를 중지시킨 다음 원본 서버의 mdf 파일을 복사해 서비스를 시작시키면 기존의 master DB를 사용할 수 있었다.

하지만 이때 master DB에 저장되어 있는 연결된 서버 정보를 그대로 사용할 수 있으므로
이런 정보를 이용하여 다른 서버에 특정 권한으로 접근할 수 있게 된다.
이러한 문제 때문인지 MS-SQL 2005에서 보안이 강화되어 master DB를 사용하기 위한 추가적인 작업이 필요해졌다.

MS-SQL 2005에서는 "서비스 마스터 키" 라는 개념이 도입되었다.
BOL을 보면 "서비스 마스터 키"는 다음과 같이 설명되어 있다.

서비스 마스터 키는 연결된 서버 암호, 인증서 또는 데이터베이스 마스터 키를 처음으로 암호화할 필요가 있을 자동으로 생성됩니다. 서비스 마스터 키는 로컬 시스템 또는 Windows 데이터 보호 API 사용하여 암호화됩니다. API SQL Server 서비스 계정의 Windows 자격 증명으로부터 파생된 키를 사용합니다.

서비스 마스터 키의 암호는 해당 키가 만들어진 서비스 계정이나 해당 서비스 계정의 Windows 자격 증명에 대한 액세스 권한이 있는 보안 주체 의해서만 해독될 있습니다. 따라서 SQL Server 서비스를 실행 중인 Windows 계정을 변경하면 서비스 마스터 키의 암호 해독도 계정으로 활성화해야 합니다.

만일 master DB를 복사해 오거나 복원을 했다면 서비스를 시작했을 때 sp_readerrorlog를 통해 다음과 같은 오류 메시지를 확인할 수 있다.
(사용자 DB도 모두 정상적으로 시작되고 언뜻 보기엔 정상으로 보일 수 있다.)

    2008-06-06 12:08:08.680 spid4s 오류: 15466, 심각도: 16, 상태: 1.
   
2008-06-06 12:08:08.680 spid4s An error occurred during decryption.

그리고 연결된 서버를 읽거나 추가/수정/삭제 하려고 하면 다음과 같은 화면을 만나게 된다.
"암호화 해독 중에 오류가 발생했습니다."

이때는 원본 서버에서 서비스 마스터키를 파일로 백업해서 대상 서버에서 복원시키면 정상적으로 암호화된 정보를 이용할 수 있다.
     BACKUP SERVICE MASTER KEY TO FILE = 'c:\service_master_key' ENCRYPTION BY PASSWORD = 'password'
    
RESTORE SERVICE MASTER KEY FROM FILE = 'c:\service_master_key' DECRYPTION BY PASSWORD = 'password' -- [FORCE]

RESTORE시 FORCE 옵션은 서비스 마스터 키 복구로 인해 기존에 생성된 정보가 손실될 수 있는 경우 오류 메시지가 발생하게 되는데 이를 무시하고 적용하겠다는 옵션이다.

이렇게 서비스 마스터 키를 복원하고 나서 MS-SQL 2005 서비스를 재시작하면 sp_readerrorlog에서 오류 메시지가 사라진 것을 확인할 수 있다.

이런 이유로 master DB를 백업할 때 서비스 마스터 키도 함께 백업을 해 두어야
나중에 복구할 이슈가 발생했을 때 master DB의 암호화된 정보를 사용할 수 있을 것 같다.


[별첨] BOL에서 설명하고 있는 보안수준.
SQL Server 수준에서의 최상위 정보가 서비스 마스터 키 이며,
데이터베이스 암호화시도 이 서비스 마스터 키를 이용하여 암호화를 한다고 한다.

넥슨 DB 팀 ( http://nexondbteam.tistory.com )
하만철 / Ha Man cheol