Mascheramento dati dinamiciDynamic Data Masking

In questo argomento si applica a: SìSQL ServerSìDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Mascheramento dati dinamici

La maschera dati dinamica (DDM) limita l'esposizione dei dati sensibili nascondendoli agli utenti senza privilegi.Dynamic data masking limits (DDM) sensitive data exposure by masking it to non-privileged users. Può essere usata per semplificare notevolmente la progettazione e la codifica della sicurezza nell'applicazione.It can be used to greatly simplify the design and coding of security in your application.

La maschera dati dinamica aiuta a impedire l'accesso non autorizzato ai dati sensibili consentendo agli utenti di definire la quantità di dati sensibili da rivelare, con un impatto minimo sul livello dell'applicazione.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. La funzionalità DDM può essere configurata nel database per nascondere i dati sensibili nei set di risultati delle query in campi di database designati, senza modificare i dati nel database.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. La maschera dati dinamica è semplice da usare con le applicazioni esistenti, poiché vengono applicate le regole per la maschera nei risultati della query.Dynamic data masking is easy to use with existing applications, since masking rules are applied in the query results. Molte applicazioni sono in grado di mascherare i dati sensibili senza modificare le query esistenti.Many applications can mask sensitive data without modifying existing queries.

  • I criteri di mascheramento dei dati centrali operano direttamente sui campi sensibili del database.A central data masking policy acts directly on sensitive fields in the database.
  • Designare gli utenti con privilegi o ruoli che hanno accesso ai dati sensibili.Designate privileged users or roles that do have access to the sensitive data.
  • Le funzionalità DDM offrono funzioni di mascheramento completo e parziale, nonché una maschera casuale per dati numerici.DDM features full masking and partial masking functions, as well as a random mask for numeric data.
  • Semplici comandi Transact-SQLTransact-SQL definiscono e gestiscono le maschere.Simple Transact-SQLTransact-SQL commands define and manage masks.

Ad esempio, un addetto del call center può identificare i chiamanti da diverse cifre del codice fiscale o dal numero della carta di credito, ma tali elementi di dati non devono essere completamente visibili all'addetto.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. È possibile definire una regola per la maschera che nasconde nel set di risultati di una query tutte le cifre, ad eccezione delle ultime quattro di qualsiasi codice fiscale o numero di carta di credito.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. Un altro esempio: usando la maschera dati appropriata per proteggere i dati relativi a informazioni personali, uno sviluppatore può eseguire una query negli ambienti di produzione per la risoluzione dei problemi senza violare la regolamentazione di conformità.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.

Lo scopo della maschera dati dinamica consiste nel limitare l'esposizione dei dati sensibili, impedendo la visualizzazione dei dati agli utenti che non dovrebbero averne accesso.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. La maschera dati dinamica non mira a impedire agli utenti del database di connettersi direttamente al database ed eseguire query complete che espongano parti dei dati sensibili.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. La maschera dati dinamica è complementare ad altre funzionalità di sicurezza di SQL ServerSQL Server , ad esempio il controllo, la crittografia e la sicurezza a livello di riga, ed è consigliabile usare questa funzionalità insieme alle altre per ottimizzare la protezione dei dati sensibili nel database.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.

Il mascheramento dei dati dinamici è disponibile in SQL Server 2016SQL Server 2016 e Database SQL di AzureAzure SQL Databasee viene configurato usando i comandi Transact-SQLTransact-SQL .Dynamic data masking is available in SQL Server 2016SQL Server 2016 and Database SQL di AzureAzure SQL Database, and is configured by using Transact-SQLTransact-SQL commands. Per altre informazioni sulla configurazione di una maschera dati dinamica tramite il portale di Azure, vedere Introduzione alla Maschera dati dinamica del database SQL (portale di 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).

Definizione di una maschera dati dinamicaDefining a Dynamic Data Mask

Una regola per la maschera può essere definita in una colonna all'interno di una tabella, al fine di nascondere i dati in tale colonna.A masking rule may be defined on a column in a table, in order to obfuscate the data in that column. Sono disponibili quattro tipi di maschere.Four types of masks are available.

FunzioneFunction DescrizioneDescription EsempiExamples
Valore predefinitoDefault Maschera completa in base al tipo di dati dei campi designati.Full masking according to the data types of the designated fields.

Per il tipo di dati stringa usare XXXX o X minori se la dimensione del campo è inferiore a 4 caratteri (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).

Per il tipo di dati numerici, usare il valore 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).

Per i tipi di dati data e ora, usare 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).

Per i tipi di dati binati, usare un singolo byte di valore 0 ASCII (binary, varbinary, image).For binary data types use a single byte of ASCII value 0 (binary, varbinary, image).
Esempio di sintassi di definizione della colonna: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULLExample column definition syntax: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

Esempio di sintassi di alter: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')Example alter syntax: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
EmailEmail Metodo di maschera che espone la prima lettera di un indirizzo di posta elettronica e il suffisso costante ".com", sotto forma di un indirizzo di posta elettronica.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. Esempio di sintassi di definizione: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULLExample definition syntax: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

Esempio di sintassi di alter: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')Example alter syntax: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
CasualeRandom Una funzione di maschera casuale per l'uso in qualsiasi tipo numerico al fine di mascherare il valore originale con un valore casuale in un intervallo specificato.A random masking function for use on any numeric type to mask the original value with a random value within a specified range. Esempio di sintassi di definizione: 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])')

Esempio di sintassi di alter: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')Example alter syntax: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
Stringa personalizzataCustom String Metodo di maschera che espone la prima e l'ultima lettera e aggiunge al centro una stringa di riempimento personalizzata.Masking method which exposes the first and last letters and adds a custom padding string in the middle. prefix,[padding],suffix

Nota: se il valore originale è troppo breve per completare l'intera maschera, parte del prefisso o del suffisso non sarà esposta.Note: If the original value is too short to complete the entire mask, part of the prefix or suffix will not be exposed.
Esempio di sintassi di definizione: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULLExample definition syntax: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

Esempio di sintassi di alter: 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)')

Esempi aggiuntivi: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

Non sono necessarie autorizzazioni per creare una tabella con una maschera dati dinamica. Sono sufficienti le autorizzazioni standard per schemi 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.

L'aggiunta, la sostituzione o la rimozione della maschera da una colonna richiede le autorizzazioni ALTER ANY MASK e ALTER sulla tabella.Adding, replacing, or removing the mask of a column, requires the ALTER ANY MASK permission and ALTER permission on the table. È opportuno concedere l'autorizzazione ALTER ANY MASK a un responsabile della sicurezza.It is appropriate to grant ALTER ANY MASK to a security officer.

Gli utenti con autorizzazione SELECT su una tabella possono visualizzare i dati in essa contenuti.Users with SELECT permission on a table can view the table data. Le colonne definite con maschera visualizzano i dati mascherati.Columns that are defined as masked, will display the masked data. Concedere l'autorizzazione UNMASK a un utente per consentire di recuperare i dati senza maschera dalle colonne su cui è definita la maschera.Grant the UNMASK permission to a user to enable them to retrieve unmasked data from the columns for which masking is defined.

L'autorizzazione CONTROL sul database include l'autorizzazione ALTER ANY MASK e UNMASK .The CONTROL permission on the database includes both the ALTER ANY MASK and UNMASK permission.

Procedure consigliate e casi d'uso comuniBest Practices and Common Use Cases

  • La creazione di una maschera in una colonna non ne impedisce l'aggiornamento.Creating a mask on a column does not prevent updates to that column. Pertanto, anche se gli utenti ricevono dati mascherati quando eseguono una query sulla colonna con maschera, gli stessi utenti possono aggiornare i dati se dispongono di autorizzazioni di scrittura.So although users receive masked data when querying the masked column, the same users can update the data if they have write permissions. Tuttavia, usare un criterio di controllo di accesso appropriato per limitare le autorizzazioni all'aggiornamento.A proper access control policy should still be used to limit update permissions.

  • Usando SELECT INTO o INSERT INTO per copiare i dati da una colonna con maschera in un'altra tabella vengono restituiti i dati mascherati nella tabella di destinazione.Using SELECT INTO or INSERT INTO to copy data from a masked column into another table results in masked data in the target table.

  • La maschera dati dinamica viene applicata quando si esegue l'importazione e l'esportazione di SQL ServerSQL Server .Dynamic Data Masking is applied when running SQL ServerSQL Server Import and Export. Un database contenente colonne con maschera genera un file di backup con dati mascherati, supponendo che venga esportato da un utente senza privilegi UNMASK , e il database importato conterrà dati mascherati in modo statico.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.

Esecuzione di query per le colonne con mascheraQuerying for Masked Columns

Usare la vista sys.masked_columns per eseguire query per tabelle e colonne con funzione di maschera applicata.Use the sys.masked_columns view to query for table-columns that have a masking function applied to them. Questa vista viene ereditata dalla vista sys.columns ,This view inherits from the sys.columns view. che restituisce tutte le colonne della vista sys.columns , in aggiunta alle colonne is_masked e masking_function , che indicano se la colonna è nascosta e, in tal caso, quale funzione di maschera viene definita.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. Questa vista mostra solo le colonne su cui è applicata una funzione di maschera.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;  

Limitazioni e restrizioniLimitations and Restrictions

Non è possibile definire una regola per la maschera per i tipi di colonna seguenti:A masking rule cannot be defined for the following column types:

  • Colonne crittografate (Crittografia sempre attiva)Encrypted columns (Always Encrypted)

  • FILESTREAMFILESTREAM

  • COLUMN_SET o una colonna di tipo sparse che fa parte di un set di colonne.COLUMN_SET or a sparse column that is part of a column set.

  • Una maschera non può essere configurata su una colonna calcolata, ma se la colonna calcolata dipende da una colonna dotata di MASCHERA, la colonna calcolata restituirà dati mascherati.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.

  • Una colonna con la maschera dati non può essere una chiave per un indice FULLTEXT.A column with data masking cannot be a key for a FULLTEXT index.

    Per gli utenti senza autorizzazione UNMASK , le istruzioni READTEXT, UPDATETEXTe WRITETEXT deprecate non funzionano correttamente in una colonna configurata per la maschera dati dinamica.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.

    Poiché l'aggiunta di una maschera di dati dinamici viene implementata come modifica dello schema nella tabella sottostante, l'operazione non può essere eseguita in una colonna con dipendenze.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. Per aggirare questa limitazione, è possibile rimuovere la dipendenza, aggiungere la maschera di dati dinamici e quindi ricreare la dipendenza.To work around this restriction, you can first remove the dependency, then add the dynamic data mask and then re-create the dependency. Ad esempio, se la dipendenza è dovuta a un indice che dipende dalla colonna, è possibile eliminare l'indice, aggiungere la maschera e quindi ricreare l'indice dipendente.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.

Nota sulla sicurezza: Ignorare il mascheramento usando tecniche di attacchi di forza bruta o inferenzaSecurity Note: Bypassing masking using inference or brute-force techniques

Il mascheramento dei dati dinamici è progettato per semplificare lo sviluppo di applicazioni, limitando l'esposizione dei dati in un set di query predefinito usato dall'applicazione.Dynamic Data Masking is designed to simplify application development by limiting data exposure in a set of pre-defined queries used by the application. Nonostante possa essere utile anche per prevenire l'esposizione accidentale dei dati sensibili durante l'accesso diretto a un database di protezione, è importante notare che gli utenti senza privilegi con autorizzazioni per le query ad hoc possono applicare le tecniche per ottenere l'accesso ai dati effettivi.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 è necessario concedere l'accesso ad hoc, usare il Controllo per monitorare tutte le attività del database e attenuare questo scenario.If there is a need to grant such ad-hoc access, Auditing should be used to monitor all database activity and mitigate this scenario.

Ad esempio, si consideri un'entità di database con privilegi sufficienti per eseguire query ad hoc sul database che provi a trovare i dati sottostanti e infine a dedurre i valori effettivi.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. Si presupponga di aver definito una maschera nella colonna [Employee].[Salary] e che l'utente si connetta direttamente al database e inizi a ipotizzare i valori, deducendo infine il valore [Salary] di un insieme di dipendenti: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 StipendioSalary
6254362543 Valeria Dal MonteJane Doe 00
9124591245 Giorgio CavaglieriJohn Smith 00

Ciò dimostra che il mascheramento dati dinamici non deve essere usato come misura isolata per garantire la sicurezza dei dati sensibili dagli utenti che eseguono query ad hoc nel database.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. È appropriato per impedire l'esposizione accidentale dei dati sensibili, ma non protegge da potenziali attacchi dannosi mirati a dedurre i dati sottostanti.It is appropriate for preventing accidental sensitive data exposure, but will not protect against malicious intent to infer the underlying data.

È importante gestire correttamente le autorizzazioni per il database e seguire sempre il principio di autorizzazioni minime necessarie.It is important to properly manage the permissions on the database, and to always follow the minimal required permissions principle. Ricordare anche di abilitare il Controllo per tenere traccia di tutte le attività eseguite sul database.Also, remember to have Auditing enabled to track all activities taking place on the database.

EsempiExamples

Creazione di una maschera dati dinamicaCreating a Dynamic Data Mask

L'esempio seguente illustra la creazione di una tabella con tre tipi diversi di maschera dati dinamica.The following example creates a table with three different types of dynamic data masks. Nell'esempio la tabella viene compilata ed è possibile selezionare la visualizzazione dei risultati.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;  

Viene creato un nuovo utente a cui viene concessa autorizzazione SELECT per la tabella.A new user is created and granted SELECT permission on the table. Le query eseguite come TestUser possono visualizzare i dati mascherati.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;  

Il risultato illustra le maschere modificando i dati daThe 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

Aggiunta o modifica di una maschera su una colonna esistenteAdding or Editing a Mask on an Existing Column

Usare l'istruzione ALTER TABLE per aggiungere una maschera a una colonna esistente nella tabella o per modificare la maschera su tale colonna.Use the ALTER TABLE statement to add a mask to an existing column in the table, or to edit the mask on that column.
L'esempio seguente aggiunge una funzione della maschera alla colonna 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)');  

L'esempio seguente modifica una funzione della maschera sulla colonna LastName :The following example changes a masking function on the LastName column:

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

Concessione di autorizzazioni per visualizzare i dati senza mascheraGranting Permissions to View Unmasked Data

La concessione dell'autorizzazione UNMASK consente a TestUser di visualizzare i dati senza maschera.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;  

Eliminazione di una maschera dati dinamicaDropping a Dynamic Data Mask

L'istruzione seguente elimina la maschera della colonna LastName creata nell'esempio precedente:The following statement drops the mask on the LastName column created in the previous example:

ALTER TABLE Membership   
ALTER COLUMN LastName DROP MASKED;  

Vedere ancheSee 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)
Introduzione alla Maschera dati dinamica del database SQL (portale di anteprima di Azure)Get started with SQL Database Dynamic Data Masking (Azure Preview portal)