SQL Server 2016 동적 데이터 마스킹을 우회하여 원본 데이터 출력하기
-
Version : SQL Server 2016
SQL Server 2016에 도입된 동적 데이터 마스킹은(Dynamic Data Masking, DDM) 권한이 없는 사용자에 대해 중요한 데이터를 마스킹해 표시함으로써 데이터 노출을 제한한다. 동적 데이터 마스킹을 수행하면 고객이 응용 프로그램 레이어에 대한 영향을 최소화하면서 표시할 중요한 데이터의 양을 지정할 수 있도록 하여 중요한 데이터에 대한 무단 액세스를 방지할 수 있다.
-
동적 데이터 마스킹 : http://sqlmvp.kr/220425326727
동적 데이터 마스킹은 실제 데이터가 암호화 되지 않는다. 그러므로 데이터는 언제나 노출 될 가능성이 있다. 동적 데이터 마스킹이 적용된 데이터를 우회하여 실제 데이터가 노출되는 상황에 대해서 알아본다.
실습을 위해서 아래 스크립트를 실행 한다. 테이블 및 데이터를 생성한다. SQL Server 버전이 CTP 2.0인경우 TF 209, 219를 활성화 해야 한다.
CREATE LOGIN ddm_Test WITH PASSWORD = 'ddm_Test', CHECK_POLICY = OFF; GO
CREATE DATABASE DDM; GO
USE DDM; GO
CREATE USER ddm_Test FROM LOGIN ddm_Test; GO
CREATE TABLE dbo.Employees ( ID INT PRIMARY KEY, Name SYSNAME, Salary INT ); GO
INSERT dbo.Employees(ID, Name, Salary) VALUES (1,N'Wayne',100000), (2,N'Teemu',75000), (3,N'Aaron',20); GO
-- for CTP 2.0 only: DBCC TRACEON(209,219,-1); DBCC TRACEON(209,219,-1) go
ALTER TABLE dbo.Employees ALTER COLUMN Salary ADD MASKED WITH (FUNCTION = 'default()'); GO
GRANT SELECT ON dbo.Employees TO ddm_Test; |
CTP2.0에서 권한이 없는 ddm_test로 데이터를 조회하면 마스킹된 데이터가 표시 된다.
EXECUTE AS USER = N'ddm_Test'; GO SELECT ID, Name, Salary FROM dbo.Employees; GO REVERT; |
권한이 없는 ddm_Test에서 데이터를 조회할 때 마스킹된 데이터를 변환하면 실제 데이터 값이 표시 된다.
EXECUTE AS USER = N'ddm_Test'; GO SELECT ID, Name, CONVERT(CHAR(12), Salary) FROM dbo.Employees; GO REVERT; |
CTP 2.1에서는 형 변환을 통한 데이터 노출은 해결되었으나 또 다른 방식으로 마스킹된 데이터를 우회할 수 있다. 테이블에 별칭을 사용한 경우 데이터가 노출 되었다.
EXECUTE AS USER = N'ddm_Test'; GO SELECT ID, Name, Salary FROM dbo.Employees AS e; GO REVERT; |
CTP 2.2에서는 CTP 2.1의 문제가 해결되었지만 또 다른 우회 방법으로 데이터를 확인할 수 있다. 첫 번째 우회 방법은 임시테이블을 생성하여 데이터를 임시테이블에 저장 후 조회하면 마스킹된 데이터의 원본을 확인할 수 있다.
EXECUTE AS USER = N'ddm_Test'; GO DECLARE @x TABLE(ID INT, Name SYSNAME, Salary INT); INSERT @x(ID, Name, Salary) SELECT ID, Name, Salary FROM dbo.Employees; SELECT ID, Name, Salary FROM @x; GO REVERT; GO |
두 번째 우회 방법은 새로운 데이터베이스를 생성하고 db_owner 권한을 부여한 다음 마스킹된 데이터베이스를 조회하면 마스킹된 원본 데이터를 확인할 수 있다.
CREATE DATABASE DDM2; GO
USE DDM2; GO
CREATE USER ddm_Test FROM LOGIN ddm_Test; ALTER ROLE db_owner ADD MEMBER ddm_Test; GO
USE DDM2; GO
SELECT ID, Name, Salary FROM DDM.dbo.Employees; |
[참고자료]
-
Dynamic Data Masking : https://msdn.microsoft.com/library/mt130841(sql.130).aspx
2015-08-27 / 강성욱 / http://sqlmvp.kr
동적 데이터 마스킹, 마스킹 데이터 우회하기, 데이터 보안, DB 보안, 기밀 데이터 보안, SQL Server, MS SQL 2016, SQL 2016
'SQL Server > SQL Server Tip' 카테고리의 다른 글
In-Memory 최적화 파일 경로 변경 (0) | 2015.09.08 |
---|---|
SQL Server 2016 Query Store -실행된 쿼리에 대한 실행 계획 및 통계 정보를 확인하자 (0) | 2015.09.01 |
SA 계정 이름 변경 및 비활성화 (0) | 2015.08.25 |
SQL Server 데이터베이스 속성을 확인할 때 사용되는 master.dbo.spt_values 복구 (0) | 2015.08.19 |
SQL Server 2016 라이브 쿼리 통계 (0) | 2015.08.17 |