Always Encrypted
Se aplica a: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Always Encrypted es una característica diseñada para proteger datos confidenciales, como números de tarjetas de crédito o números de identificación nacional/regional (por ejemplo, números del seguro social estadounidense), almacenados en bases de datos Azure SQL Database, Azure SQL Managed Instance y SQL Server. Always Encrypted permite a los clientes cifrar datos confidenciales dentro de las aplicaciones cliente y no revelar nunca las claves de cifrado al motor de base de datos. Esto ofrece una separación entre los que poseen los datos y pueden verlos, y los que los gestionan pero no deberían tener acceso: administradores de bases de datos locales, operadores de bases de datos en la nube u otros usuarios no autorizados con privilegios elevados. Como consecuencia, Always Encrypted permite a los clientes almacenar con confianza sus datos confidenciales en la nube y reducir la probabilidad de robo de datos por parte de intrusos malintencionados.
Always Encrypted puede configurarse para admitir consultas confidenciales limitadas sobre datos cifrados, las consultas que implican comparaciones de igualdad. Por ejemplo, búsquedas de puntos o uniones de igualdad. Estas consultas se basan en el cifrado determinista.
Nota:
Los enclaves seguros amplían las capacidades de cálculo confidencial de Always Encrypted con la concordancia de patrones, otros operadores de comparación y el cifrado local. Para más información, consulte Always Encrypted con enclaves seguros.
Always Encrypted realiza cifrado transparente en las aplicaciones. Un controlador habilitado para Always Encrypted instalado en el equipo cliente consigue esto al cifrar y descifrar automáticamente la información confidencial en la aplicación cliente. El controlador cifra los datos en columnas confidenciales antes de pasar los datos a Motor de base de datosy vuelve a escribir las consultas automáticamente para que se conserve la semántica de la aplicación. De forma similar, el controlador descifra los datos de forma transparente, almacenados en columnas de bases de datos cifradas, incluidas en los resultados de la consulta.
Configuración de Always Encrypted
En esta sección se ofrece información general de la configuración de Always Encrypted. Para obtener más información y empezar, vea Tutorial: Introducción a Always Encrypted.
Para configurar Always Encrypted en su base de datos, debe:
Aprovisionar claves criptográficas para proteger sus datos. En Always Encrypted se usan dos tipos de claves:
- Claves de cifrado de columna.
- Claves maestras de columna.
Una clave de cifrado de columna se usa para cifrar los datos de una columna cifrada. Una clave maestra de columna es una clave de protección de claves que cifra una o varias claves de cifrado de columna.
Se deben almacenar claves maestras de columna en un almacén de claves de confianza fuera del sistema de base de datos, como Azure Key Vault, el almacén de certificados de Windows o un módulo de seguridad de hardware.
Después, debe aprovisionar claves de cifrado de columna y cifrar cada una de ellas con una clave maestra de columna.
Por último, debe almacenar los metadatos sobre las claves en la base de datos.
- Los metadatos de la clave maestra de columna capturan la ubicación de la clave maestra de columna.
- Los metadatos de la clave de cifrado de columna contienen el valor cifrado de la clave de cifrado de columna. El motor de base de datos nunca almacena ni usa las claves de ninguno de los dos tipos en texto no cifrado.
Para obtener más información sobre la administración de claves Always Encrypted, consulte Información general de la administración de claves para Always Encrypted
Configurar el cifrado para las columnas seleccionadas de la base de datos que contengan datos confidenciales que deban protegerse. Esto implica la creación de nuevas tablas con columnas cifradas o el cifrado de columnas de bases de datos existentes y de los datos existentes. Al configurar el cifrado para una columna, se especifica la información sobre un algoritmo de cifrado, una clave de cifrado de columna para proteger los datos de la columna y un tipo de cifrado. Always Encrypted admite dos tipos de cifrado:
El cifrado determinista genera siempre el mismo valor cifrado para un valor de texto no cifrado dado. El empleo del cifrado determinista permite búsquedas de puntos, combinaciones de igualdad, agrupaciones e indexación en columnas cifradas. Pero también puedes permitir que usuarios no autorizados adivinen información sobre los valores cifrados al examinar los patrones de la columna cifrada, especialmente si hay un pequeño conjunto de posibles valores cifrados, como verdadero o falso, o como la región norte, sur, este u oeste.
Elcifrado aleatorio utiliza un método que cifra los datos de una manera menos predecible. El cifrado aleatorio es más seguro, pero evita las búsquedas, la agrupación, la indexación y la combinación en columnas cifradas.
Use el cifrado determinista para las columnas que se usarán como parámetros de búsqueda o agrupación. Por ejemplo, un número de identificación gubernamental. Use el cifrado aleatorio para aquellos datos como comentarios de investigación confidenciales que no están agrupados con otros registros y no se usan para combinar tablas.
Para obtener detalles sobre los algoritmos criptográficos de Always Encrypted, vea Criptografía de Always Encrypted.
Puede realizar los pasos anteriores con herramientas SQL:
- SQL Server Management Studio (SSMS)
- SQL Server PowerShell
- sqlpackage: que automatiza el proceso de configuración
Para garantizar que las claves Always Encrypted y los datos confidenciales protegidos nunca se revelen en texto no cifrado al entorno de base de datos, el motor de base de datos no puede participar en el aprovisionamiento de claves ni en las operaciones de cifrado o descifrado de datos. Por lo tanto, Transact-SQL (T-SQL) no admite el aprovisionamiento de claves ni las operaciones criptográficas. Por esta misma razón, cifrar datos existentes o volver a cifrarlos (con un tipo de cifrado diferente o una clave de cifrado de columna) debe realizarse fuera de la base de datos (las herramientas SQL pueden automatizarlo).
Nota:
Always Encrypted con enclaves seguros elimina algunas de las restricciones anteriores al permitir operaciones criptográficas en datos existentes con T-SQL, y elimina la necesidad de mover los datos fuera de la base de datos.
Funcionamiento de las consultas sobre columnas cifradas
Para ejecutar una consulta en columnas cifradas de la base de datos, insertar datos en columnas cifradas, recuperar valores en texto no cifrado de columnas cifradas o realizar operaciones compatibles (por ejemplo, búsquedas especificas) en columnas que usan cifrado determinista, el usuario o la aplicación que emite la consulta debe cumplir los siguientes requisitos previos:
- Tener acceso a la clave maestra de columna que protege los datos. El acceso a la clave es necesario además de los permisos a nivel de base de datos, como
SELECT
en la tabla que contiene los datos. - Conectarse a la base de datos con la opción Always Encrypted activada en la conexión de base de datos. La mayoría de las herramientas SQL y los controladores de cliente SQL admiten la activación de Always Encrypted para las conexiones de bases de datos.
Nota:
Si el usuario tiene los permisos de base de datos necesarios para leer los datos, pero no tiene acceso a las claves que los protegen, puede recuperar los datos de texto cifrado (cifrados) conectándose a la base de datos sin activar Always Encrypted en la conexión de base de datos.
A continuación se explica cómo funcionan las consultas sobre columnas cifradas:
- Cuando una aplicación emite una consulta con parámetros, el controlador de cliente SQL dentro de la aplicación se pone en contacto de forma transparente con el motor de base de datos (llamando a sp_describe_parameter_encryption (Transact-SQL) para determinar qué parámetros tienen como objetivo columnas cifradas y deben cifrarse. Para cada parámetro que debe cifrarse, el controlador recibe el algoritmo de cifrado, el tipo de cifrado y los metadatos de la clave, incluida la clave de cifrado de la columna cifrada y la ubicación de su correspondiente clave maestra de columna.
- El controlador llama al almacén de claves, que contiene claves maestras de columna para descifrar los valores de la clave de cifrado de columna cifrada. Las claves de cifrado de columna en texto no cifrado resultantes se almacenan en caché para reducir el número de recorridos de ida y vuelta al almacén de claves en usos posteriores de las mismas claves de cifrado de columna.
- El controlador usa las claves de cifrado de columnas en texto no cifrado obtenidas para cifrar los parámetros de consulta correspondientes a las columnas cifradas.
- El controlador sustituye los valores en texto no cifrado de los parámetros correspondientes a las columnas cifradas por sus valores cifrados y envía la consulta al motor de base de datos para su procesamiento.
- El motor de base de datos ejecuta la consulta, que puede incluir comparaciones de igualdad en columnas que usan cifrado determinista.
- Si los resultados de la consulta incluyen datos de columnas cifradas, el motor de base de datos adjunta metadatos de cifrado para cada columna, incluida la información sobre el algoritmo de cifrado, el tipo de cifrado y los metadatos de clave al conjunto de resultados.
- El motor de base de datos envía el conjunto de resultados a la aplicación cliente.
- Para cada columna cifrada en el conjunto de resultados recibido, el controlador primero intenta encontrar la clave de cifrado de la columna en texto plano en la caché local, y solo realiza un recorrido de ida y vuelta a un almacén de claves que contenga la clave maestra de la columna si no puede encontrar la clave en la caché.
- El controlador descifra los resultados y devuelve los valores en texto no cifrado a la aplicación.
Un controlador cliente interactúa con un almacén de claves, que contiene una clave maestra de columna, mediante un proveedor de almacén de claves maestras de columna, que es un componente de software de cliente que encapsula un almacén de claves que contiene la clave maestra de columna. Los proveedores de los tipos más comunes de almacenes de claves están disponibles en las bibliotecas de controladores del lado del cliente de Microsoft, o como descargas independientes. También puede implementar su propio proveedor. Las funciones de Always Encrypted, incluidos los proveedores integrados de almacenes de claves maestras de columna, varían según la biblioteca de controladores y su versión.
Consulte Desarrollo de aplicaciones con Always Encrypted para ver la lista de controladores cliente compatibles con Always Encrypted e información sobre cómo desarrollar aplicaciones que consulten columnas cifradas.
También puede consultar columnas cifradas con herramientas SQL, por ejemplo Azure Data Studio o SSMS.
Limitaciones
Las siguientes limitaciones se aplican a las consultas sobre columnas cifradas:
El cifrado determinista admite las siguientes operaciones que implican comparaciones de igualdad: no se permiten otras operaciones.
- = (Es igual a) en consultas de búsqueda de puntos.
- IN.
- SELECT - GROUP BY.
- DISTINCT.
No se permiten cálculos en columnas cifradas mediante cifrado aleatorio.
Nota:
Always Encrypted con enclaves seguros relaja la restricción anterior al permitir la concordancia de patrones, los operadores de comparación, la ordenación y la indexación en columnas que usan cifrado aleatorio.
No se permiten las instrucciones de consulta que activan cálculos en los que intervienen datos cifrados y en texto no cifrado. Por ejemplo:
- Comparación de una columna cifrada con una columna de texto no cifrado o una literal.
- Copiar datos de una columna de texto no cifrado a una columna cifrada (o al revés) UPDATE, BULK INSERT, SELECT INTO o INSERT..SELECT.
- Insertar literales en columnas cifradas.
Estas instrucciones producen errores de conflicto entre operandos como este:
Msg 206, Level 16, State 2, Line 89 Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char
Las aplicaciones deben usar parámetros de consulta para pasar valores que correspondan a columnas cifradas. Por ejemplo, al insertar datos en columnas cifradas o al filtrar por columnas cifradas (cuando se usa cifrado determinista). No se admite el paso de literales o variables T-SQL correspondientes a columnas cifradas. Para más información específica sobre el controlador de cliente que utiliza, consulte Desarrollo de aplicaciones con Always Encrypted.
Debe usar Parametrización para variables Always Encrypted en Azure Data Studio o SSMS para emitir consultas que pasen valores correspondientes a columnas cifradas en estas herramientas. Por ejemplo, al insertar datos en columnas cifradas o al filtrar por columnas cifradas (cuando se usa cifrado determinista).
No se admiten parámetros con valores de tabla que se dirijan a columnas cifradas.
No se admiten consultas que usen las siguientes cláusulas:
Después de cambiar la definición de una columna cifrada, ejecute sp_refresh_parameter_encryption para actualizar los metadatos Always Encrypted del objeto.
Always Encrypted no se admite para las columnas con las características siguientes:
- Columnas que usan uno de los siguientes tipos de datos: xml, timestamp, rowversion, image, ntext, text, sql_variant, hierarchyid, geography, geometry, alias, tipos definidos por el usuario.
- Columnas FILESTREAM
- Columnas con la propiedad IDENTITY.
- Columnas con la propiedad ROWGUIDCOL.
- Columnas de cadena (varchar, char, etc.) con colaciones distintas de las de punto de código binario (_BIN2) cuando se usa cifrado determinista.
- Columnas que son claves para índices agrupados y no agrupados cuando se usa cifrado aleatorio (se admiten índices en columnas que usan cifrado determinista).
- Se incluyen columnas en los índices de texto completo (Always Encrypted no admite Búsqueda de texto completo).
- Columnas calculadas.
- Columnas que hacen referencia a columnas calculadas (cuando la expresión realiza operaciones no admitidas para Always Encrypted).
- Conjunto de columna dispersa.
- Columnas a las que hacen referencia las estadísticas mediante el cifrado aleatorio (se admite el cifrado determinista).
- Columnas de partición.
- Columnas con restricciones predeterminadas.
- Columnas a las que hacen referencia la restricción de unicidad mediante el cifrado aleatorio (se admite el cifrado determinista).
- Columnas de clave principal al usar cifrado aleatorio (se admite el cifrado determinista).
- Columnas de referencia en restricciones de clave extranjera cuando se usa el cifrado aleatorio o cuando se usa el cifrado determinista, si las columnas de referencia y de referencia usan claves o algoritmos diferentes.
- Columnas de referencia por restricciones de comprobación.
- Columnas capturadas o con seguimiento mediante captura de datos modificados.
- Columnas de clave principal en tablas que tienen seguimiento de cambios.
- Columnas que están enmascaradas (con Enmascaramiento dinámico de datos).
- Columnas de las tablas de la base de datos de extensión. (Las tablas con columnas cifradas con Always Encrypted pueden habilitarse para Stretch).
Importante
Stretch Database está en desuso en SQL Server 2022 (16.x) y Azure SQL Database. Esta característica se quitará en una versión futura del motor de base de datos. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.
- Columnas de tablas externas (PolyBase). (Nota: Se admite el uso de tablas externas y tablas con columnas cifradas en la misma consulta).
Las características siguientes no funcionan en las columnas cifradas:
- Replicación de SQL Server (replicación de instantáneas, transaccional o fusionada). Se admiten las funciones de replicación física, incluida Always.
- Consultas distribuidas (servidores vinculados, OPENROWSET (Transact-SQL), OPENDATASOURCE (Transact-SQL)).
- Consultas cruzadas de bases de datos que realizan uniones en columnas (usando encriptación determinista) de diferentes bases de datos.
Referencia Transact-SQL de Always Encrypted
Always Encrypted usa las siguientes instrucciones Transact-SQL, vistas del catálogo del sistema, procedimientos almacenados del sistema y permisos.
Extractos
- CREATE COLUMN MASTER KEY (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- CREATE COLUMN ENCRYPTION KEY (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- DROP COLUMN ENCRYPTION KEY (Transact-SQL)
- CREATE TABLE (ENCRYPTED WITH)
Vistas de catálogo del sistema y procedimientos almacenados
- sys.column_encryption_keys (Transact-SQL)
- sys.column_encryption_key_values (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sp_refresh_parameter_encryption (Transact-SQL)
- sp_describe_parameter_encryption (Transact-SQL)
Consulte también sys.columns (Transact-SQL) para obtener información sobre el repositorio de metadatos cifrados para cada columna.
Permisos de base de datos
Los permisos de base de datos para Always Encrypted son cuatro:
ALTER ANY COLUMN MASTER KEY: necesario para crear y eliminar metadatos de clave maestra de columna.
ALTER ANY COLUMN ENCRYPTION KEY: necesario para crear y eliminar metadatos de clave de cifrado de columna..
VIEW ANY COLUMN MASTER KEY DEFINITION: necesario para acceder y leer los metadatos de la clave maestra de la columna, necesarios para consultar las columnas encriptadas.
VIEW ANY COLUMN ENCRYPTION KEY DEFINITION: necesario para acceder y leer los metadatos de la clave maestra de columna, que se necesitan para consultar columnas cifradas.
En la tabla siguiente se resumen los permisos necesarios para acciones comunes.
Escenario | ALTER ANY COLUMN MASTER KEY | ALTER ANY COLUMN ENCRYPTION KEY | VIEW ANY COLUMN MASTER KEY DEFINITION | VIEW ANY COLUMN ENCRYPTION KEY DEFINITION |
---|---|---|---|---|
Administración de claves (crear, cambiar, revisar metadatos de clave en la base de datos) | X | X | X | X |
Consultar columnas cifradas | X | X |
Consideraciones importantes
Los permisos VIEW ANY COLUMN MASTER KEY DEFINITION y VIEW ANY COLUMN ENCRYPTION KEY DEFINITION son necesarios cuando se seleccionan columnas encriptadas, incluso si el usuario no tiene permiso para las claves maestras de las columnas (en sus almacenes de claves), protegiendo las columnas y no accede al intento de texto no cifrado.
En SQL Server, tanto los permisos VIEW ANY COLUMN MASTER KEY DEFINITION como VIEW ANY COLUMN ENCRYPTION KEY DEFINITION se conceden de manera predeterminada al rol fijo de base de datos público. Un administrador de base de datos puede optar por revocar (o denegar) los permisos al rol público y concederlos a roles o usuarios específicos para implementar un control más restringido.
En SQL Database, los permisos VIEW ANY COLUMN MASTER KEY DEFINITION y VIEW ANY COLUMN ENCRYPTION KEY DEFINITION no se conceden de manera predeterminada al rol fijo de base de datos público. Esto habilita ciertas herramientas heredadas existentes (que utilizan versiones anteriores de DacFx) funcionen correctamente. Para trabajar con columnas cifradas (aunque no las descifre), el administrador de la base de datos debe conceder explícitamente los permisos VIEW ANY COLUMN MASTER KEY DEFINITION y VIEW ANY COLUMN ENCRYPTION KEY DEFINITION.