마스터키에는 2가지가 있는데,. 인스턴스 수준의 키와, Database 수준의 키가 있으며, 서비스 마스터키는 SQL Server 설치시에 생성이 됨. Database 수준의 마스터키는 사용자 DB를 생성후 해당 DB에서 생성.
Master Key 의 존재 여부는 select * from sys.symmetric_keys 를 통해서 확인 또는 Management Studio 에서 해당 DB의 보안에서 대칭 키 와 인증서 항목에서 확인이 가능 함.
SELECT * from sys.certificates
SELECT * FROM sys.dm_database_encryption_keys;
SERVICE MASTER KEY
1. Service Master Key Backup
BACKUP SERVICE MASTER KEY TO FILE = 'c:\mssql_service_master.key'
ENCRYPTION BY PASSWORD = '3dH85Hhk003GHk2597gheij4'; -- key 암호화용 패스워드
2. Service Master Key Restore
RESTORE SERVICE MASTER KEY FROM FILE = 'c:\mssql_service_master.key'
DECRYPTION BY PASSWORD = '3dH85Hhk003GHk2597gheij4' FORCE ;
-> 1.2, System DB 마이그레이션/복구 등외, 일반적으로 활용할 일이 거의 없음.
3. Service Master Key Regenerate
ALTER SERVICE MASTER KEY REGENERATE;
-> DPAPI 는 키를 SQL 서비스 실행 계정으로 부터 전달 받기에,
SQL 서비스 계정을 변경했거나, Master DB 를 이전한 경우에 해당.
http://technet.microsoft.com/en-us/library/ms187788.aspx
DATABASE MASTER KEY
1. Create Master Key
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'sfj5300osdVdgwdfkli7';
2. Backup Master key
USE master;
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'sfj5300osdVdgwdfkli7';
BACKUP MASTER KEY TO FILE = 'c:\DBmaster.key'
ENCRYPTION BY PASSWORD = 'sd092735k%jnadsg'; -- DB key 암호화용 패스워드. 암호정책적용.
3. Restore Master key
USE master;
RESTORE MASTER KEY FROM FILE = 'c:\DBmaster.key'
DECRYPTION BY PASSWORD = 'sd092735k%jnadsg' -- DB key 암호화시 사용한 패스워드(복호화)
ENCRYPTION BY PASSWORD = '259087M#MyjkFkjhywiyedfgGDFD'; -- DB key 암호화 패스워드
4. Drop Master Key
USE master;
DROP MASTER KEY;
5. Alter Master Key
USE master;
ALTER MASTER KEY REGENERATE
WITH ENCRYPTION BY PASSWORD = 'dsjdkflJ435907NnmM#sX003'; -- DB 마스터키 재생성. 키 백업필요.
CERTIFICATE
1. Crate Certificates
USE master;
CREATE CERTIFICATE testDBcert
ENCRYPTION BY PASSWORD = 'Gvbd2439587y' -- private key 암호화용 패스워드
WITH SUBJECT = 'testDB Company', EXPIRY_DATE = '20201231';
2. Backup Certificates [매우중요]
USE master;
BACKUP CERTIFICATE testDBcert TO FILE = 'D:\SQL DATA\testDB.cer'
WITH PRIVATE KEY (
-- DECRYPTION BY PASSWORD = 'Gvbd2439587y', -- private key 암호화용 패스워드
FILE = 'D:\SQL DATA\testDB.pvk' ,
ENCRYPTION BY PASSWORD = 'f34535sdD9d' );
--> 개인키와 같이 백업, 다른 서버에 DB 이전/복원시 필요.
3. Restore Certificates
USE master;
CREATE CERTIFICATE testDBcert FROM FILE = 'D:\SQL DATA\testDB.cer'
WITH PRIVATE KEY (
FILE = 'D:\SQL DATA\testDB.pvk',
ENCRYPTION BY PASSWORD = 'Gvbd2439587y',
DECRYPTION BY PASSWORD = 'f34535sdD9d');
4. Drop Certificates
USE master;
DROP CERTIFICATE testDBcert;
DATABASE ENCRYPTION
1. Create Database Encryption Key (DEK)
USE testDB;
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE testDBcert;
[인증서미백업시] 경고: 데이터베이스 암호화 키를 암호화하는 데 사용된 인증서가 백업되지 않았습니다. 인증서와 인증서에 연결된 개인 키를 즉시 백업해야 합니다. 인증서를 사용할 수 없게 되거나 다른 서버에서 데이터베이스를 복원하거나 연결해야 할 경우 인증서와 개인 키의 백업본이 있어야 합니다. 그렇지 않으면 데이터베이스를 열 수 없습니다.
2. Enable TDE
USE testDB;
ALTER DATABASE testDB SET ENCRYPTION ON
3. Disable TDE
USE testDB;
ALTER DATABASE testDB SET ENCRYPTION OFF;
-- 암호화 해제가 완료될때 까지 기다림
4. Delete Database Encryption Key (DEK)
USE testDB;
DROP DATABASE ENCRYPTION KEY;
ps,
다른 시스템에, 사용자 DB 복원이나 Attach 하는 경우, 복원 시스템에는 인스턴스 Master Key 가 설치한후(안되어 있는 경우) 해당 DB를 암호화에 사용한 인증서 복원후, DB복원이나 Attach를 진행 하면 됨.
개인정보보호법에서는, 블록 암호화는 TDE 로 만족되며, 패스워드는 SHA-256 이상의 일방향 암호 알고리즘을 사용해야 하므로 응용프로그램에서는 해당 알고리즘을 이용하여 문자열 암호화는 문제가 없을것이고, SQL 쿼리문에서 직접 암호화를 하는 경우 SQL Server 2012 에서 지원하는 HashBytes('SHA2_256', 'string'); 함수를 이용하면 됨.
그외 주민등록번호나 계좌번호, 신용카드 번호, 여권 번호, 바이오 정보, 운전면허 번호등 복호화가 필요한 경우 인증서를 이용한 대칭키 encryptbykey/descryptbykey 함수를 활용 (대칭키 활용시, MasterKey 및 인증서는 해당 DB에서 생성) .