Enmascaramiento de datos dinámicosDynamic Data Masking

SE APLICA A: síSQL Server síAzure SQL Database síAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse noParallel Data Warehouse

Enmascaramiento de datos dinámicos

El enmascaramiento dinámico de datos (DDM) limita la exposición de información confidencial al ocultarla a los usuarios sin privilegios.Dynamic data masking (DDM) limits sensitive data exposure by masking it to non-privileged users. Se puede usar para simplificar considerablemente el diseño y la codificación de la seguridad en la aplicación.It can be used to greatly simplify the design and coding of security in your application.

El enmascaramiento dinámico de datos evita el acceso no autorizado a información confidencial permitiendo que los clientes especifiquen la cantidad de información confidencial que se debe revelar, con un impacto mínimo en la capa de aplicación.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. DDM se puede configurar en los campos de la base de datos designada para ocultar información confidencial en los conjuntos de resultados de consultas.DDM can be configured on designated database fields to hide sensitive data in the result sets of queries. Con DDM no se modifican los datos en la base de datos.With DDM the data in the database is not changed. El enmascaramiento dinámico de datos resulta fácil de usar con las aplicaciones existentes, ya que las reglas de enmascaramiento se aplican en los resultados de la consulta.Dynamic data masking is easy to use with existing applications, since masking rules are applied in the query results. Muchas aplicaciones pueden enmascarar información confidencial sin modificar las consultas existentes.Many applications can mask sensitive data without modifying existing queries.

  • Una directiva de enmascaramiento de datos central actúa directamente en los campos confidenciales de la base de datos.A central data masking policy acts directly on sensitive fields in the database.
  • Designe roles o usuarios con privilegios que tienen acceso a la información confidencial.Designate privileged users or roles that do have access to the sensitive data.
  • DDM cuenta con funciones de enmascaramiento total y parcial, además de una máscara aleatoria para datos numéricos.DDM features full masking and partial masking functions, and a random mask for numeric data.
  • Comandos Transact-SQLTransact-SQL simples definen y administran las máscaras.Simple Transact-SQLTransact-SQL commands define and manage masks.

Por ejemplo, un técnico de soporte técnico de un centro de llamadas puede identificar al autor de la llamada mediante varios dígitos de su número del seguro social o de una tarjeta 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. Los números del seguro social o los números de una tarjeta de crédito no deben mostrarse por completo al técnico de soporte técnico.Social security numbers or credit card numbers should not be fully exposed to the support person. Puede definir una regla de enmascaramiento enmascare todos los dígitos, excepto los cuatro últimos, de cualquier número del seguro social o de una tarjeta de crédito en el conjunto de resultados de cualquier 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. Por poner otro ejemplo, si utiliza la máscara de datos adecuada para proteger la información de identificación personal, un desarrollador puede realizar consultas en los entornos de producción para resolver problemas sin que ello suponga una infracción de las normativas de cumplimiento.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.

La finalidad del enmascaramiento dinámico de datos consiste en limitar la exposición de la información confidencial, con lo que se impide que los usuarios vean datos a los que no deberían poder acceder.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. El enmascaramiento dinámico de datos no pretende evitar que los usuarios de la base de datos se conecten directamente a ella y ejecuten consultas exhaustivas que expongan información confidencial.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. El enmascaramiento dinámico de datos se complementa con otras características de seguridad de SQL ServerSQL Server (auditoría, cifrado, seguridad de nivel de fila...), y resulta muy recomendable usarlo con esas características para proteger mejor la información confidencial en la base de datos.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.

El enmascaramiento dinámico de datos está disponible en SQL Server 2016 (13.x)SQL Server 2016 (13.x) y en Base de datos SQL de AzureAzure SQL Database, y se configura con comandos Transact-SQLTransact-SQL .Dynamic data masking is available in SQL Server 2016 (13.x)SQL Server 2016 (13.x) and Base de datos SQL de AzureAzure SQL Database, and is configured by using Transact-SQLTransact-SQL commands. Para obtener más información sobre cómo configurar el enmascaramiento dinámico de datos con el Portal de Azure, vea Introducción al enmascaramiento dinámico de datos de SQL Database (Portal de 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).

Definición de una máscara dinámica de datosDefining a Dynamic Data Mask

Es posible definir una regla de enmascaramiento en una columna de una tabla, con el objetivo de ofuscar los datos de esa columna.A masking rule may be defined on a column in a table, in order to obfuscate the data in that column. Existen cuatro tipos de máscaras.Four types of masks are available.

FunciónFunction DescripciónDescription EjemplosExamples
Valor predeterminadoDefault Enmascaramiento completo de acuerdo con los tipos de datos de los campos designados.Full masking according to the data types of the designated fields.

Para los tipos de datos String, use XXXX o un número menor de X si el tamaño del campo es inferior a 4 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 los tipos de datos numéricos, use un valor cero (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).

En el caso de los tipos de datos de fecha y 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).

En lo que respecta a los tipos de datos binarios, use un solo byte de valor 0 de ASCII (binary, varbinary, image).For binary data types use a single byte of ASCII value 0 (binary, varbinary, image).
Ejemplo de sintaxis de definición de columna: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULLExample column definition syntax: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

Sintaxis modificada de ejemplo: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')Example of alter syntax: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
EmailEmail Método de enmascaramiento que expone la primera letra de una dirección de correo electrónico y el sufijo constante ".com", en el formato de una dirección de correo electrónico.Masking method that exposes the first letter of an email address and the constant suffix ".com", in the form of an email address. Columnas en la tabla de origen capturadasaXXX@XXXX.comaXXX@XXXX.com. Ejemplo de sintaxis de definición: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULLExample definition syntax: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

Sintaxis modificada de ejemplo: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')Example of alter syntax: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
AleatorioRandom Una función de enmascaramiento aleatorio que se puede usar con cualquier tipo numérico a fin de enmascarar el valor original con uno aleatorio dentro de un 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. Ejemplo de sintaxis de definición: 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])')

Sintaxis modificada de ejemplo: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')Example of alter syntax: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
Cadena personalizadaCustom String Método de enmascaramiento que expone la primera y última letra y agrega una cadena de relleno personalizada en el medio.Masking method that exposes the first and last letters and adds a custom padding string in the middle. prefix,[padding],suffix

Nota: Si el valor original es demasiado corto como para que se complete toda la máscara, no se expondrá parte del prefijo o sufijo.Note: If the original value is too short to complete the entire mask, part of the prefix or suffix will not be exposed.
Ejemplo de sintaxis de definición: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULLExample definition syntax: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

Sintaxis modificada de ejemplo: 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)')

Otros ejemplos: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)')

PermisosPermissions

No se necesita ningún permiso especial para crear una tabla una máscara dinámica de datos, solo los permisos de esquema estándares CREATE TABLE y 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 agregar, reemplazar o quitar la máscara de una columna, se precisan los permisos ALTER ANY MASK y ALTER (este último, en la tabla).Adding, replacing, or removing the mask of a column, requires the ALTER ANY MASK permission and ALTER permission on the table. Se recomienda otorgar el permiso ALTER ANY MASK a un responsable de seguridad.It is appropriate to grant ALTER ANY MASK to a security officer.

Los usuarios con el permiso SELECT en una tabla, podrán ver los datos de esta.Users with SELECT permission on a table can view the table data. Las columnas que estén definidas como enmascaradas mostrarán datos enmascarados.Columns that are defined as masked, will display the masked data. Otorgue el permiso UNMASK a un usuario para permitir que recupere datos sin enmascarar de las columnas para las que se ha definido una regla de enmascaramiento.Grant the UNMASK permission to a user to enable them to retrieve unmasked data from the columns for which masking is defined.

El permiso CONTROL en la base de datos engloba tanto ALTER ANY MASK como UNMASK .The CONTROL permission on the database includes both the ALTER ANY MASK and UNMASK permission.

Procedimientos recomendados y casos de uso habitualesBest Practices and Common Use Cases

  • La creación de una máscara en una columna no impide que se efectúen actualizaciones en ella.Creating a mask on a column does not prevent updates to that column. De modo que, aunque los usuarios recibirán datos enmascarados cuando realicen una consulta en una columna enmascarada, ellos mismos podrán actualizar los datos si cuentan con permisos de escritura.So although users receive masked data when querying the masked column, the same users can update the data if they have write permissions. Aun así, se debe usar una directiva de control de acceso adecuada para limitar los permisos de actualización.A proper access control policy should still be used to limit update permissions.

  • Si se utiliza SELECT INTO o INSERT INTO para copiar datos de una columna enmascarada en otra tabla, se generarán datos enmascarados en la tabla 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.

  • Se aplica el enmascaramiento dinámico de datos al ejecutar la importación y exportación de SQL ServerSQL Server .Dynamic Data Masking is applied when running SQL ServerSQL Server Import and Export. Una base de datos que contenga columnas enmascaradas dará como resultado un archivo de datos exportado con los datos enmascarados (suponiendo que lo exporte un usuario sin privilegios UNMASK), y la base de datos importada contendrá datos enmascarados de forma estática.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.

Realización de consultas en columnas enmascaradasQuerying for Masked Columns

Use la vista sys.masked_columns para realizar una consulta en columnas y tablas que tengan aplicada la función de enmascaramiento.Use the sys.masked_columns view to query for table-columns that have a masking function applied to them. Esta vista se hereda de la vista sys.columns .This view inherits from the sys.columns view. Devuelve todas las columnas de la vista sys.columns , junto con las columnas is_masked y masking_function . Además, indica si estas están enmascaradas y, en caso afirmativo, qué función de enmascaramiento se ha definido.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. Esta vista solo muestra las columnas en las que se ha aplicado la función de enmascaramiento.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;  

Limitaciones y restriccionesLimitations and Restrictions

No se puede definir una regla de enmascaramiento para los siguientes tipos de columnas:A masking rule cannot be defined for the following column types:

  • Columnas cifradas (siempre cifradas)Encrypted columns (Always Encrypted)

  • FILESTREAMFILESTREAM

  • COLUMN_SET o una columna dispersa que forme parte de un conjunto de columnas.COLUMN_SET or a sparse column that is part of a column set.

  • No se puede configurar una máscara en una columna calculada, pero si esta última depende de otra con una máscara, entonces la columna calculada devolverá datos enmascarados.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 columna con enmascaramiento de datos no puede ser una clave para un índice FULLTEXT.A column with data masking cannot be a key for a FULLTEXT index.

Para los usuarios sin el permiso UNMASK , las instrucciones en desuso READTEXT, UPDATETEXTy WRITETEXT no funcionan adecuadamente en una columna configurada para el enmascaramiento dinámico de datos.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.

Agregar una máscara dinámica de datos se implementa como un cambio de esquema en la tabla subyacente y, por tanto, no puede realizarse en una columna con dependencias.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 trabajar en torno a esta restricción, primero puede quitar la dependencia y, después, agregar la máscara dinámica de datos y volver a crear la dependencia.To work around this restriction, you can first remove the dependency, then add the dynamic data mask and then re-create the dependency. Por ejemplo, si la dependencia se debe a un índice que depende de esa columna, puede quitar el índice, después agregar la máscara y, luego, volver a crear el índice dependiente.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 de seguridad: Omisión del enmascaramiento con técnicas de fuerza bruta o inferenciaSecurity Note: Bypassing masking using inference or brute-force techniques

El enmascaramiento dinámico de datos está diseñado para simplificar el desarrollo de aplicaciones limitando la exposición de los datos en un conjunto de consultas predefinidas que la aplicación usa.Dynamic Data Masking is designed to simplify application development by limiting data exposure in a set of pre-defined queries used by the application. A pesar de que el enmascaramiento dinámico de datos también puede ser útil para evitar la exposición accidental de información confidencial cuando se obtiene acceso directo a una base de datos de producción, es importante tener en cuenta que los usuarios sin privilegios y que tienen permisos de consulta ad hoc.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. Si es necesario conceder ese acceso ad hoc, se debe usar la auditoría para supervisar toda la actividad de base de datos y mitigar este escenario.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 ejemplo, considere una entidad de seguridad de base de datos con los privilegios suficientes para ejecutar consultas ad hoc en la base de datos y que intenta "adivinar" los datos subyacentes y, en última instancia, inferir los valores reales.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. Suponga que tenemos una máscara definida en la columna [Employee].[Salary] , este usuario se conecta directamente a la base de datos, comienza a adivinar los valores y, a la larga, infiere el valor [Salary] de un conjunto de empleados: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;
IdentificadorId NombreName SalarioSalary
6254362543 Jane DoeJane Doe 00
9124591245 John SmithJohn Smith 00

Esto demuestra que el Enmascaramiento dinámico de datos no se debe usar como una medida aislada para proteger completamente la información confidencial de los usuarios que ejecutan consultas ad hoc en la base de datos.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. Es adecuado para evitar la exposición accidental de la información confidencial, pero no brindará protección contra intentos malintencionados de inferir los datos subyacentes.It is appropriate for preventing accidental sensitive data exposure, but will not protect against malicious intent to infer the underlying data.

Es importante administrar adecuadamente los permisos en la base de datos y seguir el principio de un mínimo de permisos requeridos.It is important to properly manage the permissions on the database, and to always follow the minimal required permissions principle. Además, recuerde tener habilitada la auditoría para hacer seguimiento de todas las actividades que se realizan en la base de datos.Also, remember to have Auditing enabled to track all activities taking place on the database.

EjemplosExamples

Creación de una máscara dinámica de datosCreating a Dynamic Data Mask

En el siguiente ejemplo se crea una tabla con tres tipos distintos de máscaras dinámicas de datos.The following example creates a table with three different types of dynamic data masks. En el ejemplo se rellena la tabla y se selecciona que se muestre el 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;  

Se crea un nuevo usuario, a quien se le otorga el permiso SELECT en la tabla.A new user is created and granted SELECT permission on the table. En las consultas ejecutadas como el usuario TestUser , los datos se mostrarán enmascarados.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;  

El resultado demuestra que las máscaras funcionan, ya que cambia los datos de esto: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

Adición o edición de una máscara en una columna existenteAdding or Editing a Mask on an Existing Column

Utilice la instrucción ALTER TABLE para agregar una máscara a una columna existente de la tabla o a fin de editarla en dicha columna.Use the ALTER TABLE statement to add a mask to an existing column in the table, or to edit the mask on that column.
En el siguiente ejemplo se agrega la función de enmascaramiento a la columna 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)');  

En el siguiente ejemplo se cambia la función de enmascaramiento en la columna LastName :The following example changes a masking function on the LastName column:

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

Concesión de permisos para ver datos sin enmascararGranting Permissions to View Unmasked Data

Si se otorga el permiso UNMASK , TestUser podrá ver los datos sin enmascarar.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;  

Anulación de una máscara dinámica de datosDropping a Dynamic Data Mask

La siguiente instrucción anula la máscara de la columna LastName creada en el ejemplo 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 tambiénSee 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)
Introducción al Enmascaramiento dinámico de datos de SQL Database (Portal de Azure)Get started with SQL Database Dynamic Data Masking (Azure portal)