Azure SQL Database – Dynamic Data Masking

O Azure SQL Database estende a funcionalidade de Dynamic Data Masking (DDM) que foi introduzido no SQL Server 2016.
A intenção desse post é ter um overview sobre o que o DDM e mostrar como utilizar essa funcionalidade no Azure SQL Database

O que é o DDM

Ofuscar dados em tempo real para impedir o acesso não autorizado
Os dados armazenados em disco não são criptografados ou alterados
Útil para ocultar dados sensíveis e confidenciais, como números de identificação pessoal, números de cartão de crédito, data de nascimento e assim por diante.

Como o DDM funciona

Ofuscamento sobre os dados nos resultados da consulta
As regras podem ser definidas em colunas particulares
Não há mudanças físicas (storage)
Os dados permanecem intactos e estão totalmente disponíveis para usuários / aplicativos autorizados.
Os dados em máscaras têm o mesmo tipo de dados que os dados originais
Múltiplas funções de máscara disponíveis para várias categorias de dados sensíveis
Flexibilidade para definir um conjunto de logins privilegiados para acesso de dados não mascarados
Por padrão, db_owner do banco de dados tem acesso aos dados sem máscara.
Pode ser aplicado sem fazer alterações nos procedimentos do banco de dados ou no código da aplicação.

Existem 5 tipos de máscaras disponíveis (espere que tem uma surpresa)

  • Default ou Full masking
  • Email
  • Custom String ou Partial masking
  • Random
  • Credit card – Até o momento somente disponível do Azure SQL Database
Função Antes da Máscara Depois da Máscara
Default () –  O valor é completamente ofuscado.

Number: 487

Text: Tiago

(FUNCTION = ‘default()’)

Number: 000

Text: XXX

Email() – Ofusca quase tudo menos a primeira letra, @ e sufixo tiago@email.com

(FUNCTION = ‘email()’)

tXX@XXXXX.com

Partial() – Personalizada em que você determina o quanto será mostrado 912-564-897

(FUNCTION = ‘partial(1,”XXXXXXX”,0)’)

9XXXXXXXXX

(FUNCTION = ‘partial(3,”XXXXXXX”,0)’)

912XXXXXXX

Random() – Usado com tipos de dados numéricos. Ofusca os dados com um valor aleatório em um determinado intervalo 487

(FUNCTION = ‘random(1,1000)’)

198, ou 633, ou 1000

Credit card – expõe os últimos quatro dígitos e adiciona uma sequência constante como um prefixo na forma de um cartão de crédito 1234-5678-9876-1234 XXXX-XXXX-XXXX-1234

Usando o portal do Azure

Para utilizar essa funcionalidade acesse seu database através do portal e procure a opção Dynamic Data Masking. Uma vez que você acessar o próprio Azure irá te sugerir tabelas e colunas.

Um simples clique em ADD MASK você terá criado a máscara para aquela coluna e uma lista com todas as mascaras irá aparecer

O Azure SQL Database tenta identificar a tipo de dados e sugere um tipo de máscara (muitas vezes acerta outras nem tanto) porém é possível mudar o tipo de máscara clicando sobre o nome do mascara uma nova blade irá abrir.  Escolha a nova máscara que melhor se aplique para o tipo de dados da coluna e atualize a máscara. Da mesma forma é possível apagar a máscara que foi criada apenas clicando no botão DELETE.

Assim você pode rever todas as colunas que deseja e é possível mudar isso de forma simples e rápido. Quando tiver pronto salve as alterações.

Uma forma de verificar as colunas e as máscaras é consultar uma DMV nova – sys.masked_columns.

E agora com PowerShell?

Tudo se torna fácil para automatizar com PS e uma surpresa (na opinião boa) apareceu quando estava criando os comandos. Um outro tipo de máscara “SocialSecureNumber” está disponível e até o momento não é possível utilizar pelo portal (o que eu posso concluir que existem outros comandos com esse mesmo comportamento e que existe muito trabalho para o time de desenvolvimento do portal)

Porém uma vez que você criou a máscara por PS a informação fica disponível para visualização com o tipo de máscara correto!

Aqui esta a lista de comandos PS:

#region connect to Azure

Login-AzureRmAccount
Get-AzureRmSubscription 
Select-AzureRmSubscription -SubscriptionName 'MSDN Platforms'

#endregion disk caching

#list of commands 
Get-Command -Module AzureRM.Sql -Noun *masking*

#region get all masking rule in all databases or masking policy

$ResoureGroup = Get-AzureRmResourceGroup | where {$_.ResourceGroupName -contains “SQL-Database”} #or $ResoureGroup = “SQL-Database”
$ServerName = Get-AzureRmSqlServer -ResourceGroupName $ResoureGroup.ResourceGroupName
$Databases = Get-AzureRmSqlDatabase -ResourceGroupName $ResoureGroup.ResourceGroupName -ServerName $ServerName.ServerName | where {$_.CurrentServiceObjectiveName -ne “System0”} 

foreach ($db in $Databases)
{
    Get-AzureRmSqlDatabaseDataMaskingRule -ResourceGroupName $ResoureGroup.ResourceGroupName -ServerName $ServerName.ServerName -DatabaseName $db.DatabaseName | Format-Table
   # Get-AzureRmSqlDatabaseDataMaskingPolicy -ResourceGroupName $ResoureGroup.ResourceGroupName -ServerName $ServerName.ServerName -DatabaseName $db.DatabaseName | Format-Table
}

#endregion

#region add new masking rule

New-AzureRmSqlDatabaseDataMaskingRule -MaskingFunction SocialSecurityNumber -SchemaName "HumanResources" -TableName "Employee" -ColumnName "NationalIDNumber" -DatabaseName "AzureAdventureWorks" -ServerName $ServerName.ServerName -ResourceGroupName $ResoureGroup.ResourceGroupName

#endregion

#region remove new masking rule

Remove-AzureRmSqlDatabaseDataMaskingRule -SchemaName "HumanResources" -TableName "Employee" -ColumnName "NationalIDNumber" -DatabaseName "AzureAdventureWorks" -ServerName $ServerName.ServerName -ResourceGroupName $ResoureGroup.ResourceGroupName

#endregion

#region update a masking rule

Set-AzureRmSqlDatabaseDataMaskingRule -MaskingFunction Text -PrefixSize 1 -SuffixSize 5 -ReplacementString "XDXDXDXD" -SchemaName "Person" -TableName "PersonPhone" -ColumnName "PhoneNumber" -DatabaseName "AzureAdventureWorks" -ServerName $ServerName.ServerName -ResourceGroupName $ResoureGroup.ResourceGroupName
#endregion

#region update a masking policy

Set-AzureRmSqlDatabaseDataMaskingPolicy -DataMaskingState Enabled -DatabaseName "AzureAdventureWorks" -ServerName $ServerName.ServerName -ResourceGroupName $ResoureGroup.ResourceGroupName 

#endregion

Links:

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-dynamic-data-masking-get-started

https://docs.microsoft.com/en-us/powershell/module/azurerm.sql/New-AzureRmSqlDatabaseDataMaskingRule?view=azurermps-4.2.0

Maníaco, entusiasta, fascinado, fanático por SQL Server e nas horas vagas um DBA que adora o que faz! Também possui certificações como: MCT, MCSE - Data Management and Analystics, MCSE - Data Plataform e MCSA - SQL Server 2016/2014/2012

Responda