Mascaramento de dados dinâmicosDynamic Data Masking

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Mascaramento de dados dinâmicos

O DDM (Máscara de Dados Dinâmicos) limita a exposição de dados confidenciais aplicando uma máscara para usuários sem privilégios.Dynamic data masking (DDM) limits sensitive data exposure by masking it to non-privileged users. Ele pode ser usado para simplificar bastante o design e a codificação de segurança em seu aplicativo.It can be used to greatly simplify the design and coding of security in your application.

A máscara de dados dinâmicos ajuda a impedir o acesso não autorizado a dados confidenciais, permitindo que os clientes especifiquem a quantidade de dados confidenciais a revelar, com impacto mínimo sobre a camada de aplicativo.Dynamic data masking helps prevent unauthorized access to sensitive data by enabling customers to specify how much sensitive data to reveal with minimal impact on the application layer. O DDM pode ser configurado em campos de banco de dados designados para ocultar dados confidenciais nos conjuntos de resultados de consultas.DDM can be configured on designated database fields to hide sensitive data in the result sets of queries. Com DDM, os dados no banco de dados não são alterados.With DDM the data in the database is not changed. O mascaramento de dados dinâmicos é fácil de usar com aplicativos existentes, já que as regras de mascaramento são aplicadas nos resultados da consulta.Dynamic data masking is easy to use with existing applications, since masking rules are applied in the query results. Muitos aplicativos podem mascarar dados confidenciais sem modificar consultas existentes.Many applications can mask sensitive data without modifying existing queries.

  • Uma política de mascaramento de dados central atua diretamente nos campos confidenciais do banco de dados.A central data masking policy acts directly on sensitive fields in the database.
  • Designe usuários ou funções com privilégios que tenham acesso aos dados confidenciais.Designate privileged users or roles that do have access to the sensitive data.
  • O DDM apresenta funções de máscara completa e parcial e uma máscara aleatória para dados numéricos.DDM features full masking and partial masking functions, and a random mask for numeric data.
  • Comandos simples do Transact-SQLTransact-SQL definem e gerenciam máscaras.Simple Transact-SQLTransact-SQL commands define and manage masks.

Por exemplo, um profissional de suporte do call center pode identificar chamadores por vários dígitos do seu número do seguro social ou número de cartão de crédito.As an example, a call center support person may identify callers by several digits of their social security number or credit card number. Números do seguro social ou números de cartão de crédito não devem ser totalmente expostos para o profissional de suporte.Social security numbers or credit card numbers should not be fully exposed to the support person. Uma regra de mascaramento pode ser definida para mascarar todos exceto os quatro últimos dígitos de qualquer número do seguro social ou número de cartão de crédito no conjunto de resultado de qualquer consulta.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. Em outro exemplo, ao usar a máscara de dados apropriada para proteger dados de informações de identificação pessoal (PII), um desenvolvedor pode consultar os ambientes de produção para fins de solução de problemas sem violar os regulamentos de conformidade.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.

A finalidade do mascaramento de dados dinâmicos é limitar a exposição de dados confidenciais, impedindo que os usuários que não devem ter acesso a esses dados os visualizem.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. O mascaramento de dados dinâmicos não pretende impedir que usuários de banco de dados se conectem diretamente ao banco de dados e executem consultas abrangentes que exponham dados confidenciais.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. A Máscara de Dados Dinâmicos é complementar aos outros recursos de segurança do SQL ServerSQL Server (auditoria, criptografia, segurança em nível de linha...) e seu uso é altamente recomendável em conjunto com esses outros recursos, a fim de proteger melhor os dados confidenciais no banco de dados.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.

O mascaramento de dados dinâmicos está disponível em SQL Server 2016 (13.x)SQL Server 2016 (13.x) e Banco de dados SQL do AzureAzure SQL Database, e é configurado usando comandos do Transact-SQLTransact-SQL .Dynamic data masking is available in SQL Server 2016 (13.x)SQL Server 2016 (13.x) and Banco de dados SQL do AzureAzure SQL Database, and is configured by using Transact-SQLTransact-SQL commands. Para obter mais informações sobre como configurar a máscara de dados dinâmicos usando o portal do Azure, veja Introdução à Máscara de Dados Dinâmicos do Banco de Dados SQL (portal do Azure).For more information about configuring dynamic data masking by using the Azure portal, see Get started with SQL Database Dynamic Data Masking (Azure portal).

Definir uma máscara de dados dinâmicosDefining a Dynamic Data Mask

Uma regra de mascaramento pode ser definida em uma coluna de tabela para ocultar os dados dessa coluna.A masking rule may be defined on a column in a table, in order to obfuscate the data in that column. Há quatro tipos de máscaras disponíveis.Four types of masks are available.

FunçãoFunction DescriçãoDescription ExemplosExamples
PadrãoDefault Mascaramento completo de acordo com os tipos de dados dos campos designados.Full masking according to the data types of the designated fields.

Para os tipos de dados string, use XXXX ou menos Xs se o tamanho do campo for inferior a quatro caracteres (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).

Para os tipos de dados numeric, use um valor zero (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).

Para os tipos de dados data e hora, use 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).

Para os tipos de dados binary, use um único byte de valor ASCII 0 (binary, varbinary, image).For binary data types use a single byte of ASCII value 0 (binary, varbinary, image).
Exemplo da sintaxe de definição de coluna: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULLExample column definition syntax: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

Exemplo de sintaxe de alteração: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')Example of alter syntax: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
EmailEmail O método de mascaramento que expõe a primeira letra de um endereço de email e o sufixo constante ".com", na forma de um endereço de email.Masking method that 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. Exemplo da sintaxe de definição: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULLExample definition syntax: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

Exemplo de sintaxe de alteração: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')Example of alter syntax: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
RandomRandom Uma função de mascaramento aleatório para uso em qualquer tipo numérico para mascarar o valor original com um valor aleatório dentro de um intervalo especificado.A random masking function for use on any numeric type to mask the original value with a random value within a specified range. Exemplo da sintaxe de definição: 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])')

Exemplo de sintaxe de alteração: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')Example of alter syntax: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
Cadeia de caracteres personalizadaCustom String O método de mascaramento que expõe as primeiras e últimas letras e adiciona uma cadeia de caracteres de preenchimento personalizada no meio.Masking method that exposes the first and last letters and adds a custom padding string in the middle. prefix,[padding],suffix

Observação: se o valor original for muito curto para completar a máscara inteira, parte do prefixo ou sufixo não será exposta.Note: If the original value is too short to complete the entire mask, part of the prefix or suffix will not be exposed.
Exemplo da sintaxe de definição: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULLExample definition syntax: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

Exemplo de sintaxe de alteração: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')Example of alter syntax: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

Exemplos adicionais: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)')

PermissõesPermissions

Não é necessário qualquer permissão especial para criar uma tabela com uma máscara de dados dinâmico, somente as permissões padrão de esquema CREATE TABLE e ALTER .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.

Para adicionar, substituir ou remover a máscara de uma coluna, a tabela deve ter as permissões ALTER ANY MASK e ALTER .Adding, replacing, or removing the mask of a column, requires the ALTER ANY MASK permission and ALTER permission on the table. É recomendável conceder ALTER ANY MASK para um analista de segurança.It is appropriate to grant ALTER ANY MASK to a security officer.

Os usuários com a permissão SELECT em uma tabela podem exibir os dados da tabela.Users with SELECT permission on a table can view the table data. As colunas definidas como mascaradas exibirão os dados mascarados.Columns that are defined as masked, will display the masked data. Conceda a permissão UNMASK a um usuário para que ele possa recuperar dados não mascarados de colunas para as quais o mascaramento é definido.Grant the UNMASK permission to a user to enable them to retrieve unmasked data from the columns for which masking is defined.

A permissão CONTROL no banco de dados inclui as permissões ALTER ANY MASK e UNMASK .The CONTROL permission on the database includes both the ALTER ANY MASK and UNMASK permission.

Práticas recomendadas e casos de uso comunsBest Practices and Common Use Cases

  • Criar uma máscara em uma coluna não impede que atualizações nessa coluna.Creating a mask on a column does not prevent updates to that column. Portanto, embora os usuários recebam dados mascarados ao consultar a coluna mascarada, os mesmos usuários podem atualizar os dados se tiverem permissões de gravação.So although users receive masked data when querying the masked column, the same users can update the data if they have write permissions. Uma política de controle de acesso adequada ainda deve ser usada para limitar as permissões de atualização.A proper access control policy should still be used to limit update permissions.

  • Usar SELECT INTO ou INSERT INTO para copiar dados de uma coluna mascarada para outra tabela resulta em dados mascarados na tabela de destino.Using SELECT INTO or INSERT INTO to copy data from a masked column into another table results in masked data in the target table.

  • O mascaramento de dados dinâmicos é aplicado durante a execução de importações e exportações do SQL ServerSQL Server .Dynamic Data Masking is applied when running SQL ServerSQL Server Import and Export. Um banco de dados que contém colunas mascaradas resultará em um arquivo de dados exportado contendo dados mascarados (supondo que ele seja exportado por um usuário sem privilégios de UNMASK) e o banco de dados importado conterá dados estaticamente mascarados.A database containing masked columns will result in an exported data file with masked data (assuming it is exported by a user without UNMASK privileges), and the imported database will contain statically masked data.

Consultar colunas mascaradasQuerying for Masked Columns

Use a exibição sys.masked_columns para consultar colunas de tabela que tenham uma função de máscara aplicada.Use the sys.masked_columns view to query for table-columns that have a masking function applied to them. Essa exibição herda valores da exibição sys.columns .This view inherits from the sys.columns view. Ela retorna todas as colunas na exibição sys.columns , mais as colunas is_masked e masking_function , indicando se a coluna é mascarada e, em caso positivo, qual função de mascaramento foi definida.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. Essa exibição só mostra colunas com uma função de máscara aplicada.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;  

Limitações e RestriçõesLimitations and Restrictions

Não é possível definir uma regra de mascaramento para os seguintes tipos de coluna:A masking rule cannot be defined for the following column types:

  • Colunas criptografadas (Sempre Criptografadas)Encrypted columns (Always Encrypted)

  • FILESTREAMFILESTREAM

  • COLUMN_SET ou uma coluna esparsa que faz parte de um conjunto de colunas.COLUMN_SET or a sparse column that is part of a column set.

  • Uma máscara não pode ser configurada em uma coluna computada, mas se a coluna computada depender de uma coluna com uma MÁSCARA, ela retornará dados mascarados.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.

  • Uma coluna com mascaramento de dados não pode ser uma chave para um índice FULLTEXT.A column with data masking cannot be a key for a FULLTEXT index.

Para os usuários que não tenham a permissão UNMASK , as instruções READTEXT, UPDATETEXTe WRITETEXT preteridas não funcionarão corretamente em uma coluna configurada para mascaramento de dados dinâmicos.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.

A adição de uma máscara de dados dinâmicos é implementada como uma alteração de esquema na tabela subjacente e, portanto, não pode ser realizada em uma coluna com dependências.Adding a dynamic data mask is implemented as a schema change on the underlying table, and therefore cannot be performed on a column with dependencies. Para contornar essa restrição, você pode primeiro remover a dependência e adicionar a máscara de dados dinâmicos e, em seguida, recriar a dependência.To work around this restriction, you can first remove the dependency, then add the dynamic data mask and then re-create the dependency. Por exemplo, se a dependência ocorre devido a um índice dependente nessa coluna, você poderá remover o índice, adicionar a máscara e, em seguida, recriar o índice dependente.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.

Observação de segurança: ignorar a máscara usando técnicas de inferência ou força brutaSecurity Note: Bypassing masking using inference or brute-force techniques

O Mascaramento de dados dinâmicos foi projetado para simplificar o desenvolvimento de aplicativos, limitando a exposição de dados em um conjunto de consultas predefinidas usadas pelo aplicativo.Dynamic Data Masking is designed to simplify application development by limiting data exposure in a set of pre-defined queries used by the application. Embora o Mascaramento de dados dinâmicos também possa ser útil para evitar a exposição acidental de dados confidenciais ao acessar diretamente um banco de dados de produção, é importante observar que usuários sem privilégios com permissões de consulta ad hoc podem aplicar técnicas para acessar os dados reais.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. Se houver a necessidade de conceder esse acesso ad hoc, a Auditoria deve ser usada para monitorar todas as atividades do banco de dados e reduzir esse cenário.If there is a need to grant such ad-hoc access, Auditing should be used to monitor all database activity and mitigate this scenario.

Por exemplo, considere uma entidade de banco de dados principal que tem privilégios suficientes para executar consultas ad hoc no banco de dados e tenta "adivinhar" os dados subjacentes e inferir os valores reais.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. Suponha que tenhamos uma máscara definida na coluna [Employee].[Salary] e esse usuário se conecte diretamente ao banco de dados e comece a adivinhar valores, eventualmente inferindo o valor [Salary] de um conjunto de funcionários: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 NomeName SalárioSalary
6254362543 Jane DoeJane Doe 00
9124591245 John SmithJohn Smith 00

Isso demonstra que Mascaramento de dados dinâmicos não deve ser usado como uma medida isolada para proteger dados confidenciais de usuários que executam consultas ad hoc no banco de dados.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. Ele é adequado para impedir a exposição acidental de dados confidenciais, mas não protege contra intenções mal-intencionadas de inferir os dados subjacentes.It is appropriate for preventing accidental sensitive data exposure, but will not protect against malicious intent to infer the underlying data.

É importante gerenciar corretamente as permissões no banco de dados e sempre seguir o princípio de mínimo de permissões necessárias.It is important to properly manage the permissions on the database, and to always follow the minimal required permissions principle. Além disso, lembre-se de ter a Auditoria habilitada para acompanhar todas as atividades que ocorrem no banco de dados.Also, remember to have Auditing enabled to track all activities taking place on the database.

ExemplosExamples

Criar uma máscara de dados dinâmicosCreating a Dynamic Data Mask

O exemplo a seguir cria uma tabela com três tipos diferentes de máscaras de dados dinâmicos.The following example creates a table with three different types of dynamic data masks. O exemplo preenche a tabela e faz seleções para mostrar o resultado.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;  

Um novo usuário é criado e recebe a permissão SELECT na tabela.A new user is created and granted SELECT permission on the table. As consultas executadas como o TestUser exibem os dados mascarados.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;  

O resultado demonstra as máscaras ao alterar os dados deThe 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

Adicionar ou editar uma máscara em uma coluna existenteAdding or Editing a Mask on an Existing Column

Use a instrução ALTER TABLE para adicionar uma máscara a uma coluna existente na tabela ou para editar a máscara nessa coluna.Use the ALTER TABLE statement to add a mask to an existing column in the table, or to edit the mask on that column.
O exemplo a seguir adiciona uma função de mascaramento para a coluna 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)');  

O exemplo a seguir altera uma função de mascaramento da coluna LastName :The following example changes a masking function on the LastName column:

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

Conceder permissões para exibir dados não mascaradosGranting Permissions to View Unmasked Data

Conceder a permissão UNMASK permite que TestUser visualize os dados não mascarados.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;  

Eliminar uma máscara de dados dinâmicosDropping a Dynamic Data Mask

A instrução a seguir elimina a máscara da coluna LastName criada no exemplo anterior:The following statement drops the mask on the LastName column created in the previous example:

ALTER TABLE Membership   
ALTER COLUMN LastName DROP MASKED;  

Consulte TambémSee 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)
Introdução à máscara de dados dinâmicos do Banco de Dados SQL (portal do Azure)Get started with SQL Database Dynamic Data Masking (Azure portal)