동적 데이터 마스킹

적용 대상:Azure SQL Database Azure SQL Managed InstanceAzure Synapse Analytics(전용 SQL 풀만 해당)

Azure SQL Database, Azure SQL Managed Instance 및 Azure Synapse Analytics는 동적 데이터 마스킹을 지원합니다. 동적 데이터 마스킹에서는 권한이 없는 사용자로 마스킹하여 중요한 데이터 노출을 제한합니다.

동적 데이터 마스킹을 사용하면 고객이 애플리케이션 계층에 미치는 영향을 최소화하고 표시할 중요한 데이터의 양을 지정할 수 있게 하여 중요한 데이터에 대한 무단 액세스를 방지할 수 있습니다. 동적 데이터 마스킹은 지정된 데이터베이스 필드를 통해 쿼리의 결과 집합에 중요한 데이터를 숨기는 정책 기반 보안 기능이지만 데이터베이스의 데이터는 변경되지 않습니다.

예를 들어 콜 센터의 서비스 담당자가 이메일 주소의 여러 문자를 확인하여 호출자를 식별할 수 있지만 전체 이메일 주소는 서비스 담당자에게 표시되지 않아야 합니다. 쿼리 결과 세트의 모든 이메일 주소를 마스킹하는 마스킹 규칙을 정의할 수 있습니다. 또 다른 예로, 개인 데이터를 보호하는 적합한 데이터 마스크를 정의할 수 있으므로 개발자가 준수 규정을 위반하지 않고 문제 해결을 위해 프로덕션 환경을 쿼리할 수 있습니다.

동적 데이터 마스킹 기본 사항

SQL Database 구성 창의 보안 아래에서 동적 데이터 마스킹 블레이드를 선택하여 Azure Portal에서 동적 데이터 마스킹 정책을 설정합니다. 이 기능은 SQL Managed Instance 포털을 사용하여 설정할 수 없습니다. 자세한 내용은 동적 데이터 마스킹을 참조하세요.

동적 데이터 마스킹 정책

  • 마스킹에서 제외되는 SQL 사용자: SQL 쿼리 결과에서 마스킹되지 않은 데이터를 가져오는 SQL 사용자(Microsoft Entra ID(구 Azure Active Directory)에서 가져온 ID를 포함할 수 있음) 집합입니다. 서버 관리자, Microsoft Entra 관리자 및 db_owner 역할과 같은 관리 권한이 있는 사용자는 마스크 없이 원래 데이터를 볼 수 있습니다. (참고: SQL Server의 sysadmin 역할에도 적용됨)
  • 마스킹 규칙: 마스킹하도록 지정되는 필드와 사용할 마스킹 기능을 정의하는 규칙 집합입니다. 데이터베이스 스키마 이름, 테이블 이름 및 열 이름을 사용하여 마스킹하도록 지정되는 필드를 정의할 수 있습니다.
  • 마스킹 함수: 각 시나리오에서 데이터 표시를 제어하는 메서드 집합입니다.
마스킹 기능 마스킹 논리
기본값 지정된 필드의 데이터 형식에 따라 모든 데이터 마스킹

* 문자열 데이터 형식(nchar, ntext, nvarchar)의 필드 크기가 4자 미만이면 XXXX(또는 그 이하)를 사용합니다.
* 숫자 데이터 형식(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 /> 문서를 사용합니다.
* 특수 데이터 형식(timestamp, table, HierarchyID, uniqueidentifier, binary, image, varbinary 및 공간 형식)의 경우 빈 값을 사용합니다.
신용 카드 지정된 필드의 마지막 4자리를 표시하고 신용 카드 형식 접두사로 상수 문자열을 추가하는 마스킹 방법입니다.

XXXX-XXXX-XXXX-1234
전자 메일 메일 주소 형식의 상수 문자열 접두사를 사용하여 첫 글자를 표시하고 도메인을 XXX.com으로 바꾸는 마스킹 메서드입니다.

aXX@XXXX.com
난수 선택한 경계 및 실제 데이터 형식에 따라 난수를 생성하는 마스킹 메서드입니다. 지정된 경계가 같으면 마스킹 함수로 상수가 사용됩니다.

난수를 생성하기 위한 마스킹 방법을 보여 주는 스크린샷
사용자 지정 텍스트 첫 문자와 마지막 문자를 표시하고 가운데에 사용자 지정 패딩 문자열을 추가하는 마스킹 메서드입니다. 원래 문자열이 노출된 접두사 및 접미사보다 짧은 경우 패딩 문자열만 사용됩니다.

prefix[padding]suffix

탐색 창의 스크린샷.

DDM 권장 사항 엔진은 중요한 필드일 가능성이 있어 마스크 대상이 될 만한 데이터베이스의 특정 필드를 플래그합니다. 포털의 동적 데이터 마스킹 창은 데이터베이스에 대한 권장 열을 표시합니다. 하나 이상의 열에 대해 마스크 추가를 선택한 다음, 적절한 마스킹 함수를 선택하고 저장을 선택하여 이러한 필드에 마스크를 적용합니다.

T-SQL을 사용하여 동적 데이터 마스킹 관리

PowerShell cmdlet을 사용하여 데이터베이스에 대한 동적 데이터 마스킹 설정

데이터 마스킹 정책

데이터 마스킹 규칙

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 권한은 데이터베이스에 저장된 데이터에 대한 무단 액세스를 제어 및 제한하고 데이터 보안 관리를 개선하는 세분화된 방법을 제공합니다.

  1. 사용자 테이블을 포함하는 스키마를 만듭니다.

    CREATE SCHEMA Data;
    GO
    
  2. 마스킹된 열을 사용하여 테이블을 만듭니다.

    CREATE TABLE Data.Membership (
        MemberID INT IDENTITY(1, 1) NOT NULL,
        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
    );
    
  3. 샘플 데이터를 삽입합니다.

    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');
    
  4. 서비스 테이블을 포함하는 스키마를 만듭니다.

    CREATE SCHEMA Service;
    GO
    
  5. 마스킹된 열을 사용하여 서비스 테이블을 만듭니다.

    CREATE TABLE Service.Feedback (
        MemberID INT IDENTITY(1, 1) NOT NULL,
        Feedback VARCHAR(100) MASKED WITH (FUNCTION = 'default()') NULL,
        Rating INT MASKED WITH (FUNCTION = 'default()'),
        Received_On DATETIME
    );
    
  6. 샘플 데이터를 삽입합니다.

    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');
    
  7. 데이터베이스에 다른 사용자를 만듭니다.

    CREATE USER ServiceAttendant WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceLead WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceManager WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceHead WITHOUT LOGIN;
    GO
    
  8. 데이터베이스의 사용자에게 읽기 권한을 부여합니다.

    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;
    
  9. 사용자에게 다른 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;
    
  10. ServiceAttendant 사용자 컨텍스트에서 데이터를 쿼리합니다.

    EXECUTE AS USER = 'ServiceAttendant';
    
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    
    REVERT;
    
  11. ServiceLead 사용자 컨텍스트에서 데이터를 쿼리합니다.

    EXECUTE AS USER = 'ServiceLead';
    
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    
    REVERT;
    
  12. ServiceManager 사용자 컨텍스트에서 데이터를 쿼리합니다.

    EXECUTE AS USER = 'ServiceManager';
    
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    
    REVERT;
    
  13. 사용자 ServiceHead 컨텍스트에서 데이터 쿼리

    EXECUTE AS USER = 'ServiceHead';
    
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    
    REVERT;
    
  14. 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;