동적 마스크 계획 및 구현
Azure SQL Database, Azure SQL Managed Instance 및 Azure Synapse Analytics는 동적 데이터 마스킹을 지원합니다. 동적 데이터 마스킹은 권한이 없는 사용자에게 중요한 데이터를 마스킹하여 데이터 노출을 제한합니다.
동적 데이터 마스킹을 사용하면 고객이 애플리케이션 계층에 미치는 영향을 최소화하고 표시할 중요한 데이터의 양을 지정할 수 있게 하여 중요한 데이터에 대한 무단 액세스를 방지할 수 있습니다. 동적 데이터 마스킹은 지정된 데이터베이스 필드를 통해 쿼리의 결과 집합에 중요한 데이터를 숨기는 정책 기반 보안 기능이지만 데이터베이스의 데이터는 변경되지 않습니다.
예를 들어 콜 센터의 서비스 담당자가 이메일 주소의 여러 문자를 확인하여 호출자를 식별할 수 있지만 전체 이메일 주소는 서비스 담당자에게 표시되지 않아야 합니다. 마스킹 규칙은 모든 쿼리의 결과 집합에 있는 모든 전자 메일 주소를 마스킹하기로 정의할 수 있습니다. 또 다른 예로, 개발자가 준수 규정을 위반하지 않고 문제 해결을 위해 프로덕션 환경을 쿼리할 수 있도록 적절한 데이터 마스킹을 정의하여 개인 데이터를 보호할 수 있습니다.
동적 데이터 마스킹 기본 내용
SQL Database 구성 창의 보안 아래에서 동적 데이터 마스킹 블레이드를 선택하여 Azure Portal에서 동적 데이터 마스킹 정책을 설정합니다.
동적 데이터 마스킹 정책
- 마스킹에서 제외된 사용자 SQL - SQL 쿼리 결과에서 마스킹되지 않은 데이터를 얻는 SQL 사용자 또는 Microsoft Entra ID 집합입니다. 관리자 권한이 있는 사용자는 항상 마스킹에서 제외되며 마스크 없이 원본 데이터를 보게 됩니다.
- 마스킹 규칙 - 마스킹하도록 지정되는 필드와 사용할 마스킹 기능을 정의하는 규칙 집합입니다. 지정된 필드는 데이터베이스 스키마 이름, 테이블 이름, 열 이름을 사용하여 정의할 수 있습니다.
- 마스킹 함수 - 각 시나리오에서 데이터 표시를 제어하는 메서드 집합입니다.
| Function | 설명 | 예 |
|---|---|---|
| 기본값 | 지정된 필드의 데이터 형식에 따라 전체 마스킹. 문자열 데이터 형식의 경우 필드의 크기가 4자 미만인 경우 XXXX 미만의 X를 사용합니다(char, nchar, varchar, nvarchar, text, ntext). 숫자 데이터 형식의 경우 영(0) 값을 사용합니다(bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real). 날짜 및 시간 데이터 형식의 경우 1900-01-01 00:00:00.0000000(date, datetime2, datetime, datetimeoffset, smalldatetime, time)을 사용합니다. 이진 데이터 형식의 경우 단일 바이트의 ASCII 값 0을 사용합니다(binary, varbinary, image). |
열 정의 구문 예: Phone# varchar(12) MASKED WITH(FUNCTION = 'default()') NULL 변경 구문 예: ALTER COLUMN Gender ADD MASKED WITH(FUNCTION = 'default()') |
| 메일 | 이메일 주소의 형식에서 이메일 주소의 첫 번째 문자와 상수 접미사 ".com"을 표시하는 마스킹 방법입니다. aXXX@XXXX.com. | 정의 구문 예: Email varchar(100) MASKED WITH(FUNCTION = 'email()') NULL alter 구문의 예: ALTER COLUMN Email ADD MASKED WITH(FUNCTION = 'email()') |
| 임의 | 지정된 범위 내에서 임의 값으로 원래 값을 마스킹하기 위해 숫자 유형에서 사용할 임의 마스킹 함수입니다. | 정의 구문 예: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])') alter 구문 예: ALTER COLUMN [Month] ADD MASKED WITH(FUNCTION = 'random(1, 12)') |
| 사용자 지정 문자열 | 첫 번째 및 마지막 문자를 표시하고 가운데에 사용자 지정 안쪽 여백 문자열을 추가하는 마스킹 방법입니다. 접두사,[패딩], 접미사 원래 값이 너무 짧아서 전체 마스크를 완료할 수 없는 경우 접두사 또는 접미사 부분이 표시되지 않습니다. |
정의 구문 예: FirstName varchar(100) MASKED WITH(FUNCTION = 'partial(prefix,[padding],suffix)') NULL alter 구문 예: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') 이렇게 하면 555.123.1234와 같은 전화 번호가 5XXXXXXX로 바뀝니다. 추가 예제: ALTER COLUMN [전화 번호] ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)') 이렇게 하면 555.123.1234와 같은 전화 번호가 555.1XXXXXXX로 바뀝니다. |
| Datetime | 적용 대상: SQL Server 2022(16.x) 데이터 형식 datetime, datetime2, date, time, datetimeoffset, smalldatetime으로 정의된 열에 대한 마스킹 메서드입니다. 연도=>datetime("Y"), 월=>datetime("M"), 일=>datetime("D"), 시=>datetime("h"), 분=>datetime("m"), 초=>datetime("s") 부분을 마스킹하는 데 도움이 됩니다. |
datetime 값의 연도를 마스킹하는 방법의 예: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")') datetime 값의 월을 마스킹하는 방법의 예: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")') datetime 값의 분을 마스킹하는 방법의 예: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")') |
| 마스킹 기능 | 마스킹 논리 |
|---|---|
| 기본값 | 지정된 필드의 데이터 형식에 따라 모든 데이터 마스킹 * 문자열 데이터 형식(nchar, ntext, nvarchar)의 필드 크기가 4자 미만이면 XXXX개 이하의 X를 사용합니다. * 숫자 데이터 형식(bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real)의 경우 0 값을 사용합니다. * 날짜/시간 데이터 형식(date, datetime2, datetime, datetimeoffset, smalldatetime, time)의 경우 1900-01-01을 사용합니다. * sql_variant의 경우 현재 형식의 기본값이 사용됩니다. * XML의 경우 <masked /> 문서가 사용됩니다. * 특수 데이터 형식(타임스탬프, 테이블, HierarchyID, uniqueidentifier, 이진, 이미지, varbinary, 공간 형식)의 경우 빈 값을 사용합니다. |
| 신용 카드 | 지정된 필드의 마지막 4자리를 표시하고 신용 카드 형식 접두사로 상수 문자열을 추가하는 마스킹 방법입니다. XXXX-XXXX-XXXX-1234 |
| 메일 | 메일 주소 형식의 상수 문자열 접두사를 사용하여 첫 글자를 표시하고 도메인을 XXX.com으로 바꾸는 마스킹 메서드입니다. aXX@XXXX.com |
| 난수 | 선택한 경계 및 실제 데이터 형식에 따라 난수를 생성하는 마스킹 메서드입니다. 지정된 경계가 같으면 마스킹 함수로 상수가 사용됩니다.
|
| 사용자 지정 텍스트 | 첫 문자와 마지막 문자를 표시하고 가운데에 사용자 지정 패딩 문자열을 추가하는 마스킹 메서드입니다. 원래 문자열이 노출된 접두사 및 접미사보다 짧은 경우 패딩 문자열만 사용됩니다. prefix[padding]suffix
|
마스킹할 권장 필드
DDM 권장 사항 엔진은 데이터베이스의 특정 필드를 잠재적으로 중요한 필드로 플래그를 지정하며 이는 마스킹에 적합한 후보일 수 있습니다. 포털의 동적 데이터 마스킹 창에는 데이터베이스에 대한 권장 열이 표시됩니다. 하나 이상의 열에 대해 마스크 추가를 선택한 다음, 적절한 마스킹 함수를 선택하고 저장을 선택하여 이러한 필드에 마스크를 적용합니다.
T-SQL을 사용하여 동적 데이터 마스킹 관리
- 동적 데이터 마스크를 만들려면 동적 데이터 마스크 만들기를 참조하세요.
- 기존 열에 마스크를 추가하거나 편집하려면 기존 열에 마스크 추가 또는 편집을 참조하세요.
- 마스킹 해제된 데이터를 볼 수 있는 권한을 부여하려면 마스킹 해제된 데이터를 볼 수 있는 권한 부여를 참조하세요.
- 동적 데이터 마스크를 삭제하려면 동적 데이터 마스크 삭제를 참조하세요.
PowerShell cmdlet을 사용하여 데이터베이스에 대한 동적 데이터 마스킹 설정
데이터 마스킹 정책
데이터 마스킹 규칙
- Get-AzSqlDatabaseDataMaskingRule
- New-AzSqlDatabaseDataMaskingRule
- Remove-AzSqlDatabaseDataMaskingRule
- Set-AzSqlDatabaseDataMaskingRule
REST API를 사용하여 데이터베이스에 대한 동적 데이터 마스킹 설정
REST API를 사용하여 데이터 마스킹 정책 및 규칙을 프로그래밍 방식으로 관리할 수 있습니다. 게시된 REST API는 다음과 같은 작업을 지원합니다.
데이터 마스킹 정책
- 만들기 또는 업데이트: 데이터베이스 데이터 마스킹 정책을 만들거나 업데이트합니다.
- 가져오기: 데이터베이스 데이터 마스킹 정책을 가져옵니다.
데이터 마스킹 규칙
- 만들기 또는 업데이트: 데이터베이스 데이터 마스킹 규칙을 만들거나 업데이트합니다.
- 데이터베이스별 목록: 데이터베이스 데이터 마스킹 규칙 목록을 가져옵니다.
권한
동적 데이터 마스킹을 구성하는 데 필요한 기본 제공 역할은 다음과 같습니다.
동적 데이터 마스킹을 사용하려면 다음 작업이 필요합니다.
읽기/쓰기:
Microsoft.Sql/servers/databases/dataMaskingPolicies/*
읽기:
Microsoft.Sql/servers/databases/dataMaskingPolicies/read
쓰기:
Microsoft.Sql/servers/databases/dataMaskingPolicies/write
T-SQL 명령으로 동적 데이터 마스킹을 사용할 때 권한에 대해 자세히 알아보려면 권한을 참조하세요.
세분화된 권한 예
중요한 데이터에 대한 무단 액세스를 방지하고 데이터베이스의 다양한 수준에서 무단 사용자에게 데이터를 마스킹하여 제어권을 확보합니다. 데이터베이스 수준, 스키마 수준, 테이블 수준 또는 열 수준에서 데이터베이스 사용자 또는 역할에 UNMASK 권한을 부여하거나 철회할 수 있습니다. Microsoft Entra 인증과 결합하면 Azure 환경 내에서 유지 관리되는 사용자, 그룹 및 애플리케이션에 대해 UNMASK 권한을 관리할 수 있습니다. UNMASK 권한은 데이터베이스에 저장된 데이터에 대한 무단 액세스를 제어 및 제한하고 데이터 보안 관리를 개선하는 세분화된 방법을 제공합니다.
사용자 테이블을 포함하는 스키마를 만듭니다.
CREATE SCHEMA Data; GO마스킹된 열을 사용하여 테이블을 만듭니다.
CREATE TABLE Data.Membership ( MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED, FirstName VARCHAR(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL, LastName VARCHAR(100) NOT NULL, Phone VARCHAR(12) MASKED WITH (FUNCTION = 'default()') NULL, Email VARCHAR(100) MASKED WITH (FUNCTION = 'email()') NOT NULL, DiscountCode SMALLINT MASKED WITH (FUNCTION = 'random(1, 100)') NULL, BirthDay DATETIME MASKED WITH (FUNCTION = 'default()') NULL );샘플 데이터를 삽입합니다.
INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode, BirthDay) VALUES ('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10, '1985-01-25 03:25:05'), ('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5, '1990-05-14 11:30:00'), ('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50, '2004-02-29 14:20:10'), ('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40, '1990-03-01 06:00:00');서비스 테이블을 포함하는 스키마를 만듭니다.
CREATE SCHEMA Service; GO마스킹된 열을 사용하여 서비스 테이블을 만듭니다.
CREATE TABLE Service.Feedback ( MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED, Feedback VARCHAR(100) MASKED WITH (FUNCTION = 'default()') NULL, Rating INT MASKED WITH (FUNCTION = 'default()'), Received_On DATETIME );샘플 데이터를 삽입합니다.
INSERT INTO Service.Feedback (Feedback, Rating, Received_On) VALUES ('Good', 4, '2022-01-25 11:25:05'), ('Excellent', 5, '2021-12-22 08:10:07'), ('Average', 3, '2021-09-15 09:00:00');데이터베이스에 다른 사용자를 만듭니다.
CREATE USER ServiceAttendant WITHOUT LOGIN; GO CREATE USER ServiceLead WITHOUT LOGIN; GO CREATE USER ServiceManager WITHOUT LOGIN; GO CREATE USER ServiceHead WITHOUT LOGIN; GO데이터베이스의 사용자에게 읽기 권한을 부여합니다.
ALTER ROLE db_datareader ADD MEMBER ServiceAttendant; ALTER ROLE db_datareader ADD MEMBER ServiceLead; ALTER ROLE db_datareader ADD MEMBER ServiceManager; ALTER ROLE db_datareader ADD MEMBER ServiceHead;사용자에게 다른 UNMASK 권한을 부여합니다.
--Grant column level UNMASK permission to ServiceAttendant GRANT UNMASK ON Data.Membership(FirstName) TO ServiceAttendant;-- Grant table level UNMASK permission to ServiceLead GRANT UNMASK ON Data.Membership TO ServiceLead;-- Grant schema level UNMASK permission to ServiceManager GRANT UNMASK ON SCHEMA::Data TO ServiceManager; GRANT UNMASK ON SCHEMA::Service TO ServiceManager;--Grant database level UNMASK permission to ServiceHead; GRANT UNMASK TO ServiceHead;사용자
ServiceAttendant의 컨텍스트에서 데이터를 쿼리합니다.EXECUTE AS USER = 'ServiceAttendant'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;사용자
ServiceLead의 컨텍스트에서 데이터를 쿼리합니다.EXECUTE AS USER = 'ServiceLead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;사용자
ServiceManager의 컨텍스트에서 데이터를 쿼리합니다.EXECUTE AS USER = 'ServiceManager'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;사용자
ServiceHead의 컨텍스트에서 데이터를 쿼리합니다.EXECUTE AS USER = 'ServiceHead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;UNMASK 권한을 철회하려면 다음 T-SQL 문을 사용합니다.
REVOKE UNMASK ON Data.Membership(FirstName) FROM ServiceAttendant; REVOKE UNMASK ON Data.Membership FROM ServiceLead; REVOKE UNMASK ON SCHEMA::Data FROM ServiceManager; REVOKE UNMASK ON SCHEMA::Service FROM ServiceManager; REVOKE UNMASK FROM ServiceHead;

