다음을 통해 공유


동적 데이터 마스킹

적용 대상:Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics(전용 SQL 풀에만 해당)Fabric의 SQL 데이터베이스

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

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

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

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

Azure SQL Database의 경우 SQL Database 구성 창에서 보안 아래의 동적 데이터 마스킹 창을 선택하여 Azure Portal에서 동적 데이터 마스킹 정책을 설정합니다.

이 기능은 Azure Portal for SQL Managed Instance 또는 Fabric의 SQL 데이터베이스를 사용하여 설정할 수 없습니다. 대신 이 문서의 세분화된 권한 예제 와 같이 Transact-SQL(T-SQL)를 사용합니다. 자세한 내용은 동적 데이터 마스킹을 참조하세요.

동적 데이터 마스킹 정책

  • 마스킹에서 제외된 SQL 사용자: SQL 쿼리 결과에서 마스크되지 않은 데이터를 가져오는 Microsoft Entra ID의 ID를 포함할 수 있는 SQL 사용자 집합입니다. 서버 관리자, Microsoft Entra 관리자 및 db_owner 역할과 같은 관리 권한이 있는 사용자는 마스크 없이 원래 데이터를 볼 수 있습니다. (참고: SQL Server의 sysadmin 역할에도 적용됨)

  • 마스킹 규칙: 마스킹하도록 지정되는 필드와 사용할 마스킹 기능을 정의하는 규칙 집합입니다. 지정된 필드는 데이터베이스 스키마 이름, 테이블 이름 및 열 이름을 사용하여 정의할 수 있습니다.

  • 마스킹 함수: 각 시나리오에서 데이터 표시를 제어하는 메서드 집합입니다.

    마스킹 기능 마스킹 논리
    기본값 지정된 필드의 데이터 형식에 따라 모든 데이터 마스킹

    문자열 데이터 형식(XXXX, ntext, nvarchar)에 필드 크기가 4자 미만인 경우 사용합니다 (또는 더 적은 수).
    숫자 데이터 형식(bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real)에 0 값을 사용합니다.
    날짜/시간 데이터 형식(1900-01-01, datetime2, datetime, datetimeoffset, smalldatetime, time)에 사용합니다.
    sql_variant 현재 형식의 기본값이 사용됩니다.
    XML의 경우 문서가 <masked /> 사용됩니다.
    특수 데이터 형식(타임스탬프, 테이블, HierarchyID, uniqueidentifier, 이진, 이미지, varbinary 및 공간 형식)에 빈 값을 사용합니다.
    신용 카드 지정된 필드의 마지막 4자리를 표시하고 신용 카드 형식 접두사로 상수 문자열을 추가하는 마스킹 방법입니다.

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

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

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

    prefix[padding]suffix
    탐색 창의 스크린샷.
    날짜/시간 날짜/시간 열에 대해 세분화된 마스킹을 사용하도록 설정합니다, 즉 datetime, datetime2, date, time, datetimeoffset, smalldatetime. 연도(), 월(), 일(datetime("Y")datetime("M")), 시간(datetime("D")), 분(datetime("h")) 또는 초(datetime("m")datetime("s"))와 같은 특정 구성 요소를 마스크할 수 있습니다. T-SQL을 사용하여 이 함수를 적용합니다.

    다음은 그 예입니다.

    - 마스크 연도: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")').
    - 마스크 월: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")').
    - 마스크 분: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")').

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 인증 UNMASK 과 결합하면 Azure 환경 내에서 유지 관리되는 사용자, 그룹 및 애플리케이션에 대한 사용 권한을 관리할 수 있습니다. 이 권한은 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 권한을 부여합니다.

    • 열 수준 UNMASK 권한을 ServiceAttendant에 부여합니다.

      GRANT UNMASK ON Data.Membership (FirstName) TO ServiceAttendant;
      
    • 테이블 수준 UNMASK 권한을 ServiceLead에 부여하십시오.

      GRANT UNMASK ON Data.Membership TO ServiceLead;
      
    • 다음을 위해 스키마 수준의 UNMASK 권한을 ServiceManager에 부여합니다.

      GRANT UNMASK ON SCHEMA::Data TO ServiceManager;
      GRANT UNMASK ON SCHEMA::Service TO ServiceManager;
      
    • 데이터베이스 수준 UNMASK 사용 권한을 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;