동적 데이터 마스킹Dynamic Data Masking

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database아니요Azure SQL Data Warehouse아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

동적 데이터 마스킹

DDM(동적 데이터 마스킹)에서는 권한이 없는 사용자로 마스킹하여 중요한 데이터 노출을 제한합니다.Dynamic data masking limits (DDM) sensitive data exposure by masking it to non-privileged users. 응용 프로그램의 보안 설계 및 코딩을 크게 간소화하는 데 사용됩니다.It can be used to greatly simplify the design and coding of security in your application.

동적 데이터 마스킹을 사용하면 고객이 응용 프로그램 계층에 미치는 영향을 최소화하고 표시할 중요한 데이터의 양을 지정할 수 있게 하여 중요한 데이터에 대한 무닥 액세스를 방지할 수 있습니다.Dynamic data masking helps prevent unauthorized access to sensitive data by enabling customers to designate how much of the sensitive data to reveal with minimal impact on the application layer. 데이터베이스의 데이터는 변경되지 않으면서 지정된 데이터베이스 필드에 대한 쿼리의 결과 집합에서 중요한 데이터를 숨기도록 데이터베이스에서 DDM을 구성할 수 있습니다.DDM can be configured on the database to hide sensitive data in the result sets of queries over designated database fields, while the data in the database is not changed. 동적 데이터 마스킹은 마스킹 규칙이 쿼리 결과에서 적용되므로 기존 응용 프로그램과 함께 사용하기 쉽습니다.Dynamic data masking is easy to use with existing applications, since masking rules are applied in the query results. 많은 응용 프로그램이 기존 쿼리를 수정하지 않고 중요한 데이터를 마스킹할 수 있습니다.Many applications can mask sensitive data without modifying existing queries.

  •  중앙 데이터 마스킹 정책은 데이터베이스의 중요한 필드에 직접 역할을 합니다. A central data masking policy acts directly on sensitive fields in the database.
  •  중요한 데이터에 대한 액세스 권한이 있는 권한 있는 사용자 또는 역할을 지정합니다. Designate privileged users or roles that do have access to the sensitive data.
  •  DDM은 전체 마스킹 및 부분 마스킹 기능뿐 아니라 숫자 데이터에 대한 임의 마스크 기능을 갖추고 있습니다. DDM features full masking and partial masking functions, as well as a random mask for numeric data.
  •  간단한 Transact-SQLTransact-SQL 명령에서 마스크를 정의하고 관리합니다. Simple Transact-SQLTransact-SQL commands define and manage masks.

예를 들어, 콜 센터 지원 담당자는 사회 보장 번호 또는 신용 카드 번호의 여러 숫자로 발신자를 식별할 수 있지만, 이러한 데이터 항목이 지원 담당자에게 완전히 노출되어서는 안 됩니다.As an example, a call center support person may identify callers by several digits of their social security number or credit card number, but those data items should not be fully exposed to the support person. 모든 마스킹 규칙은 어떠한 쿼리의 결과 집합에서 사회 보장 번호 또는 신용 카드 번호의 마지막 네 자리 숫자를 제외하고 모두 마스킹하도록 정의할 수 있습니다.A masking rule can be defined that masks all but the last four digits of any social security number or credit card number in the result set of any query. 또 다른 예로, 개인 식별이 가능한 정보(PII) 데이터를 보호하기 위해 적합한 데이터 마스크를 사용하여 개발자는 적합성 규정 준수 규칙을 위반하지 않고 문제 해결 목적으로 프로덕션 환경을 쿼리할 수 있습니다.For another example, by using the appropriate data mask to protect personally identifiable information (PII) data, a developer can query production environments for troubleshooting purposes without violating compliance regulations.

동적 데이터 마스킹의 목적은 중요한 데이터의 노출을 제한하여 데이터에 대한 액세스 권한이 없는 사용자가 보지 못하게 하는 것이지The purpose of dynamic data masking is to limit exposure of sensitive data, preventing users who should not have access to the data from viewing it. 데이터베이스 사용자가 데이터베이스에 직접 연결하여 중요한 데이터 조각을 노출하는 과도한 쿼리를 실행하지 못하게 하는 것은 아닙니다.Dynamic data masking does not aim to prevent database users from connecting directly to the database and running exhaustive queries that expose pieces of the sensitive data. 동적 데이터 마스킹은 다른 SQL ServerSQL Server 보안 기능(감사, 암호화, 행 수준 보안...)에 보완적이며 데이터베이스에서 중요한 데이터의 보호를 강화하기 위해 추가적으로 이 기능을 함께 사용하는 것이 좋습니다.Dynamic data masking is complementary to other SQL ServerSQL Server security features (auditing, encryption, row level security…) and it is highly recommended to use this feature in conjunction with them in addition in order to better protect the sensitive data in the database.

동적 데이터 마스킹은에서 SQL Server 2016SQL Server 2016Azure SQL 데이터베이스Azure SQL Database에서 사용할 수 있으며 Transact-SQLTransact-SQL 명령을 사용하여 구성됩니다.합니다.Dynamic data masking is available in SQL Server 2016SQL Server 2016 and Azure SQL 데이터베이스Azure SQL Database, and is configured by using Transact-SQLTransact-SQL commands. Azure 포털을 사용하여 동적 데이터 마스킹을 구성하는 방법은 SQL 데이터베이스 동적 데이터 마스킹 시작(Azure 포털)을 참조하세요.For additional information about configuring dynamic data masking by using the Azure portal, see Get started with SQL Database Dynamic Data Masking (Azure portal).

동적 데이터 마스크 정의Defining a Dynamic Data Mask

해당 열에서 데이터 난독 처리를 위해 테이블의 열에 마스킹 규칙을 정의할 수 있습니다.A masking rule may be defined on a column in a table, in order to obfuscate the data in that column. 네 가지 유형의 마스크를 사용할 수 있습니다.Four types of masks are available.

함수Function 설명Description Examples
기본값Default 지정된 필드의 데이터 형식에 따라 전체 마스킹.Full masking according to the data types of the designated fields.

문자열 데이터 형식의 경우 필드의 크기가 4자 미만인 경우 XXXX 미만의 X를 사용합니다(char, nchar, varchar, nvarchar, text, ntext).For string data types, use XXXX or fewer Xs if the size of the field is less than 4 characters (char, nchar, varchar, nvarchar, text, ntext).

숫자 데이터 형식의 경우 영(0) 값을 사용합니다(bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real).For numeric data types use a zero value (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real).

날짜 및 시간 데이터 형식의 경우 01.01.1900 00:00:00.0000000(date, datetime2, datetime, datetimeoffset, smalldatetime, time)을 사용합니다.For date and time data types use 01.01.1900 00:00:00.0000000 (date, datetime2, datetime, datetimeoffset, smalldatetime, time).

이진 데이터 형식의 경우 단일 바이트의 ASCII 값 0을 사용합니다(binary, varbinary, image).For binary data types use a single byte of ASCII value 0 (binary, varbinary, image).
열 정의 구문 예제: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULLExample column definition syntax: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

변경 구문 예제: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')Example alter syntax: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
EmailEmail 전자 메일 주소 형식에서 전자 메일 주소의 첫 글자와 상수 접미사 ".com"을 표시하는 마스킹 방법입니다.Masking method which exposes the first letter of an email address and the constant suffix ".com", in the form of an email address. 을 참조하세요.. aXXX@XXXX.com을 참조하세요.aXXX@XXXX.com. 정의 구문 예제: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULLExample definition syntax: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

변경 구문 예제: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')Example alter syntax: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
임의Random 지정된 범위 내에서 임의 값으로 원래 값을 마스킹하기 위해 숫자 유형에서 사용할 임의 마스킹 함수입니다.A random masking function for use on any numeric type to mask the original value with a random value within a specified range. 정의 구문 예제: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')Example definition syntax: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')

변경 구문 예제: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')Example alter syntax: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
사용자 지정 문자열Custom String 첫 번째 및 마지막 문자를 표시하고 가운데에 사용자 지정 안쪽 여백 문자열을 추가하는 마스킹 방법입니다.Masking method which exposes the first and last letters and adds a custom padding string in the middle. prefix,[padding],suffix

참고: 원래 값이 너무 짧아서 전체 마스크를 완료할 수 없는 경우 접두사 또는 접미사 부분이 표시되지 않습니다.Note: If the original value is too short to complete the entire mask, part of the prefix or suffix will not be exposed.
정의 구문 예제: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULLExample definition syntax: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

변경 구문 예제: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')Example alter syntax: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

추가 예:Additional examples:

ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)')

ALTER COLUMN [Social Security Number] ADD MASKED WITH (FUNCTION = 'partial(0,"XXX-XX-",4)')

PermissionsPermissions

동적 데이터 마스크로 테이블을 만드는 데 특별한 권한이 필요하지 않습니다. 구성표 권한에 대한 표준 CREATE TABLEALTER 만 필요합니다.You do not need any special permission to create a table with a dynamic data mask, only the standard CREATE TABLE and ALTER on schema permissions.

열 마스크를 추가, 대체 또는 제거하려면 테이블에서 ALTER ANY MASK 권한 및 ALTER 권한이 필요합니다.Adding, replacing, or removing the mask of a column, requires the ALTER ANY MASK permission and ALTER permission on the table. ALTER ANY MASK 를 보안 책임자에게 부여하는 것이 적합합니다.It is appropriate to grant ALTER ANY MASK to a security officer.

테이블에 대한 SELECT 권한이 있는 사용자는 테이블 데이터를 볼 수 있습니다.Users with SELECT permission on a table can view the table data. 마스크됨으로 정의된 열은 마스크된 데이터를 표시합니다.Columns that are defined as masked, will display the masked data. UNMASK 권한을 사용자에게 부여하여 마스킹이 정의된 열에서 마스크 해제된 데이터를 검색할 수 있게 합니다.Grant the UNMASK permission to a user to enable them to retrieve unmasked data from the columns for which masking is defined.

데이터베이스의 CONTROL 권한은 ALTER ANY MASKUNMASK 권한을 모두 포함합니다.The CONTROL permission on the database includes both the ALTER ANY MASK and UNMASK permission.

최선의 구현 방법 및 일반적인 사용 사례Best Practices and Common Use Cases

  • 열에서 마스크를 만들어도 해당 열에 대한 업데이트가 방해되지는 않습니다.Creating a mask on a column does not prevent updates to that column. 따라서 마스크된 열 쿼리 시 사용자가 마스크된 데이터를 받게 되더라도 쓰기 권한이 있는 경우 같은 사용자는 데이터를 업데이트할 수 있습니다.So although users receive masked data when querying the masked column, the same users can update the data if they have write permissions. 업데이트 권한을 제한하려면 적절한 액세스 제어 정책을 사용해야 합니다.A proper access control policy should still be used to limit update permissions.

  • SELECT INTO 또는 INSERT INTO 을 사용하여 데이터를 마스크된 열에서 다른 테이블로 복사하면 대상 테이블에 마스크된 데이터가 생성됩니다.Using SELECT INTO or INSERT INTO to copy data from a masked column into another table results in masked data in the target table.

  • SQL ServerSQL Server 가져오기 및 내보내기 실행 시 동적 데이터 마스킹이 적용됩니다.Dynamic Data Masking is applied when running SQL ServerSQL Server Import and Export. 마스크된 열을 포함한 데이터베이스는 마스크된 데이터로 백업 파일이 생성되며( UNMASK 권한이 없는 사용자가 내보냈다고 가정하고) 가져온 데이터베이스는 정적으로 마스크된 데이터를 포함하게 됩니다.A database containing masked columns will result in a backup file with masked data (assuming it is exported by a user without UNMASK privileges), and the imported database will contain statically masked data.

마스크된 열에 대한 쿼리Querying for Masked Columns

sys.masked_columns 뷰를 사용하여 마스킹 함수가 적용되어 있는 테이블-열에 대해 쿼리합니다.Use the sys.masked_columns view to query for table-columns that have a masking function applied to them. 이 보기는 sys.columns 보기에서 상속됩니다.This view inherits from the sys.columns view. sys.columns 뷰의 모든 열과 열이 마스킹되었는지, 그렇다면 정의된 마스킹 함수가 무엇인지 나타내는 is_maskedmasking_function 열을 반환합니다.It returns all columns in the sys.columns view, plus the is_masked and masking_function columns, indicating if the column is masked, and if so, what masking function is defined. 이 보기는 마스킹 함수가 적용된 열만 보여줍니다.This view only shows the columns on which there is a masking function applied.

SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function  
FROM sys.masked_columns AS c  
JOIN sys.tables AS tbl   
    ON c.[object_id] = tbl.[object_id]  
WHERE is_masked = 1;  

제한 사항Limitations and Restrictions

다음 열 형식에 대해 마스킹 규칙을 정의할 수 없습니다.A masking rule cannot be defined for the following column types:

  • 암호화된 열(상시 암호화)Encrypted columns (Always Encrypted)

  • FILESTREAMFILESTREAM

  • COLUMN_SET 또는 열 집합에 포함된 스파스 열COLUMN_SET or a sparse column that is part of a column set.

  • 계산된 열에서는 마스크를 구성할 수 없지만, 계산된 열이 MASK가 포함된 열에 종속되어 있다면 계산된 열은 마스크된 데이터를 반환합니다.A mask cannot be configured on a computed column, but if the computed column depends on a column with a MASK, then the computed column will return masked data.

  • 데이터 마스킹이 있는 열은 FULLTEXT 인덱스에 대한 키가 될 수 없습니다.A column with data masking cannot be a key for a FULLTEXT index.

    UNMASK 권한이 없는 사용자의 경우, 사용되지 않은 READTEXT, UPDATETEXTWRITETEXT 문은 동적 데이터 마스킹용으로 구성된 열에서 제대로 작동하지 않습니다.For users without the UNMASK permission, the deprecated READTEXT, UPDATETEXT, and WRITETEXT statements do not function properly on a column configured for Dynamic Data Masking.

    동적 데이터 마스크 추가는 기본 테이블에 대한 스키마 변경으로 구현되므로 종속성이 있는 열에서 수행할 수 없습니다.Adding a dynamic data mask is implemented as a schema change on the underlying table, and therefor cannot be performed on a column with dependencies. 이 제한을 해결하려면 먼저 종속성을 제거하고 동적 데이터 마스크를 추가한 다음 종속성을 다시 만들면 됩니다.To work around this restriction, you can first remove the dependency, then add the dynamic data mask and then re-create the dependency. 예를 들어 해당 열에 종속된 인덱스로 인해 종속성이 있는 경우 해당 인덱스를 삭제하고 마스크를 추가한 다음 종속 인덱스를 다시 만들면 됩니다.For example, if the dependency is due to an index dependent on that column, you can drop the index, then add the mask, and then re-create the dependent index.

보안 정보: 유추 또는 무작위 기술을 사용하여 마스킹 무시Security Note: Bypassing masking using inference or brute-force techniques

동적 데이터 마스킹은 응용 프로그램에서 사용되는 미리 정의된 쿼리 집합에서 데이터 노출을 제한하여 응용 프로그램 개발을 간소화하도록 설계되었습니다.Dynamic Data Masking is designed to simplify application development by limiting data exposure in a set of pre-defined queries used by the application. 동적 데이터 마스킹은 프로덕션 데이터베이스에 직접 액세스하는 경우 중요한 데이터를 실수로 노출하지 않도록 하는 데 유용할 수 있지만, 임시 쿼리 권한이 있는 권한 없는 사용자가 기술을 사용하여 실제 데이터에 액세스할 수 있음을 알고 있어야 합니다.While Dynamic Data Masking can also be useful to prevent accidental exposure of sensitive data when accessing a production database directly, it is important to note that unprivileged users with ad-hoc query permissions can apply techniques to gain access to the actual data. 이러한 임시 액세스 권한을 부여해야 하는 경우 모든 데이터베이스 작업을 모니터링하여 이 시나리오를 방지할 수 있도록 감사를 사용해야 합니다.If there is a need to grant such ad-hoc access, Auditing should be used to monitor all database activity and mitigate this scenario.

예를 들어 데이터베이스에서 임시 쿼리를 실행할 수 있는 충분한 권한이 부여된 데이터베이스 보안 주체가 있고 기본 데이터를 '추측'하여 궁극적으로 실제 값을 유추 하려 한다고 생각하고As an example, consider a database principal that has sufficient privileges to run ad-hoc queries on the database, and tries to 'guess' the underlying data and ultimately infer the actual values. [Employee].[Salary] 열에 마스크를 정의하고 이 사용자가 직접 데이터베이스에 연결하여 값 추측을 시작하면서 결국 직원의 [Salary] 값을 유추한다고 가정해보겠습니다.Assume that we have a mask defined on the [Employee].[Salary] column, and this user connects directly to the database and starts guessing values, eventually inferring the [Salary] value of a set of Employees:

SELECT ID, Name, Salary FROM Employees
WHERE Salary > 99999 and Salary < 100001;
IdId 이름Name 급여Salary
6254362543 Jane DoeJane Doe 00
9124591245 John SmithJohn Smith 00

이 경우 임시 쿼리를 실행하는 사용자로부터 중요한 데이터를 보호하기 위해 격리 수단으로 동적 데이터 마스킹을 사용할 수 없음을 보여 줍니다.This demonstrates that Dynamic Data Masking should not be used as an isolated measure to fully secure sensitive data from users running ad-hoc queries on the database. 실수로 중요한 데이터의 노출을 방지하는 데 적절하지만 악의적인 의도를 가지고 기본 데이터를 유추하는 상황은 보호되지 않습니다.It is appropriate for preventing accidental sensitive data exposure, but will not protect against malicious intent to infer the underlying data.

데이터베이스에 대한 권한을 제대로 관리하고 항상 필요한 최소 권한 원칙에 따르는 것이 중요합니다.It is important to properly manage the permissions on the database, and to always follow the minimal required permissions principle. 또한 감사를 사용하도록 설정하여 데이터베이스에서 수행하는 모든 활동을 추적해야 합니다.Also, remember to have Auditing enabled to track all activities taking place on the database.

Examples

동적 데이터 마스크 만들기Creating a Dynamic Data Mask

다음 예에서는 세 가지 유형의 동적 데이터 마스크가 있는 테이블을 만듭니다.The following example creates a table with three different types of dynamic data masks. 이 예제는 테이블을 채우며 결과를 표시하도록 선택합니다.The example populates the table, and selects to show the result.

CREATE TABLE Membership  
  (MemberID int IDENTITY PRIMARY KEY,  
   FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') NULL,  
   LastName varchar(100) NOT NULL,  
   Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL,  
   Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL);  

INSERT Membership (FirstName, LastName, Phone#, Email) VALUES   
('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com'),  
('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co'),  
('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net');  
SELECT * FROM Membership;  

새 사용자를 만들고 테이블에 대한 SELECT 권한이 부여됩니다.A new user is created and granted SELECT permission on the table. TestUser 보기가 데이터를 마스크할 때 쿼리가 실행됩니다.Queries executed as the TestUser view masked data.

CREATE USER TestUser WITHOUT LOGIN;  
GRANT SELECT ON Membership TO TestUser;  

EXECUTE AS USER = 'TestUser';  
SELECT * FROM Membership;  
REVERT;  

그 결과는 데이터를 변경하여 마스크를 보여 줍니다.The result demonstrates the masks by changing the data from

1 Roberto Tamburello 555.123.4567 RTamburello@contoso.com

intointo

1 RXXXXXXX Tamburello xxxx RXXX@XXXX.com

기존 열에 대한 마스크 추가 또는 편집Adding or Editing a Mask on an Existing Column

ALTER TABLE 문을 사용하여 테이블의 기존 열에 마스크를 추가하거나 해당 열의 마스크를 편집합니다.Use the ALTER TABLE statement to add a mask to an existing column in the table, or to edit the mask on that column.
다음 예제는 LastName 열에서 마스킹 함수를 추가합니다.The following example adds a masking function to th LastName column:

ALTER TABLE Membership  
ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"XXX",0)');  

다음 예제는 LastName 열에서 마스킹 함수를 변경합니다.The following example changes a masking function on the LastName column:

ALTER TABLE Membership  
ALTER COLUMN LastName varchar(100) MASKED WITH (FUNCTION = 'default()');  

마스크 해제된 데이터를 볼 수 있는 권한 부여Granting Permissions to View Unmasked Data

UNMASK 권한을 부여하면 TestUser 에서 마스크 해제된 데이터를 볼 수 있습니다.Granting the UNMASK permission allows TestUser to see the data unmasked.

GRANT UNMASK TO TestUser;  
EXECUTE AS USER = 'TestUser';  
SELECT * FROM Membership;  
REVERT;   

-- Removing the UNMASK permission  
REVOKE UNMASK TO TestUser;  

동적 데이터 마스크 삭제Dropping a Dynamic Data Mask

다음 문은 이전 예제에서 만들 LastName 열에서 마스크를 삭제합니다.The following statement drops the mask on the LastName column created in the previous example:

ALTER TABLE Membership   
ALTER COLUMN LastName DROP MASKED;  

참고 항목See Also

CREATE TABLE(Transact-SQL) CREATE TABLE (Transact-SQL)
ALTER TABLE(Transact-SQL) ALTER TABLE (Transact-SQL)
column_definition(Transact-SQL) column_definition (Transact-SQL)
sys.masked_columns(Transact-SQL) sys.masked_columns (Transact-SQL)
SQL 데이터베이스 동적 데이터 마스킹시작(Azure 미리 보기 포털)Get started with SQL Database Dynamic Data Masking (Azure Preview portal)