Always Encrypted
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
Always Encrypted y Always Encrypted con enclaves seguros son características diseñadas para proteger información confidencial, incluidos números de tarjeta de crédito y números de identificación nacionales o regionales (como los números de seguridad social de EE. UU.), en Azure SQL Database, Azure SQL Managed Instance y bases de datos de SQL Server. Permite a los clientes cifrar datos confidenciales dentro de las aplicaciones cliente, lo que garantiza que las claves de cifrado nunca se exponen 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 seguridad sus datos confidenciales en la nube y reducir el riesgo de robo de datos por parte de usuarios internos maliciosos.
Always Encrypted tiene ciertas restricciones, como la incapacidad de realizar operaciones en datos cifrados, incluida la ordenación, el filtrado (excepto las búsquedas de puntos mediante cifrado determinista), etc. Esto significa que es posible que algunas consultas y aplicaciones no sean compatibles con Always Encrypted o que requieran cambios significativos en la lógica de aplicación.
Para abordar estas limitaciones, Always Encrypted con enclaves seguros permite al motor de base de datos procesar datos cifrados dentro de un área de memoria protegida denominada enclave seguro. Los enclaves seguros mejoran las capacidades de cálculo confidencial de Always Encrypted al admitir la coincidencia de patrones, varios operadores de comparación y el cifrado local.
Always Encrypted garantiza que el cifrado sea perfecto para las aplicaciones. En el lado cliente, el controlador habilitado para Always Encrypted cifra los datos confidenciales antes de enviarlos al motor de base de datos y vuelve a escribir automáticamente las consultas para mantener la semántica de la aplicación. También descifra automáticamente los resultados de la consulta de columnas de base de datos cifradas.
Configuración de Always Encrypted
Nota:
Para las aplicaciones que necesitan realizar la coincidencia de patrones, usar operadores de comparación, ordenar e indexar en columnas cifradas, debe implementar Always Encrypted con enclaves seguros.
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 la base de datos, siga estos pasos:
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 dentro 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, almacene los metadatos sobre las claves en la base de datos. Los metadatos de la clave maestra de columna incluyen 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 no almacena ni usa ninguna clave 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.
Configure el cifrado para columnas de base de datos específicas que incluyan información confidencial para garantizar la protección. Esto podría requerir la creación de nuevas tablas con columnas cifradas o el cifrado de las columnas y de los datos existentes. Al configurar el cifrado para una columna, debe especificar detalles sobre el algoritmo de cifrado, la clave de cifrado de columna para proteger los datos y el 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.
El cifrado aleatorio usa un método que cifra los datos de una forma impredecible. Cada entrada de texto no cifrado idéntica da como resultado una salida cifrada distinta. Esto mejora la seguridad del cifrado aleatorio.
Para realizar la coincidencia de patrones mediante operadores de comparación, ordenación e indexación en columnas cifradas, debe adoptar Always Encrypted con enclaves seguros y aplicar cifrado aleatorio. El cifrado aleatorio Always Encrypted (sin enclaves seguros) no admite la búsqueda, agrupación, indexación ni combinación en columnas cifradas. En su lugar, para las columnas destinadas a fines de búsqueda o agrupación, es esencial usar el cifrado determinista. Esto permite operaciones como búsquedas de puntos, combinaciones de igualdad, agrupación e indexación en columnas cifradas.
Puesto que por diseño el sistema de base de datos no tiene acceso a claves criptográficas, cualquier cifrado de columna requiere mover y cifrar datos fuera de la base de datos. Esto significa que este proceso de cifrado puede tardar mucho tiempo y es vulnerable a interrupciones de la red. Además, si necesita volver a cifrar una columna más adelante, como al rotar la clave de cifrado o cambiar los tipos de cifrado, encontrará las mismas dificultades de nuevo. El uso de Always Encrypted con enclaves seguros elimina la necesidad de mover datos fuera de la base de datos. Dado que el enclave es de confianza, un controlador cliente dentro de la aplicación o una herramienta como Azure Data Studio o SQL Server Management Studio (SSMS) puede compartir de forma segura las claves con el enclave durante las operaciones criptográficas. Después, el enclave puede cifrar o volver a cifrar columnas en su lugar, lo que reduce significativamente el tiempo necesario para estas acciones.
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:
- Aprovisionamiento de claves de Always Encrypted mediante SQL Server Management Studio
- Configurar Always Encrypted con 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).
Después de cambiar la definición de una columna cifrada, ejecute sp_refresh_parameter_encryption para actualizar los metadatos Always Encrypted del objeto.
Limitaciones
Las siguientes limitaciones se aplican a las consultas sobre columnas cifradas:
No se permiten cálculos en columnas cifradas mediante cifrado aleatorio. El cifrado determinista admite las siguientes operaciones que implican comparaciones de igualdad: no se permiten otras operaciones.
- = (Equals) (Transact-SQL) en búsquedas de búsqueda de puntos.
- IN (Transact-SQL).
- SELECT - GROUP BY- Transact-SQL.
- DISTINCT.
Nota:
Para las aplicaciones que necesitan realizar la coincidencia de patrones, usar operadores de comparación, ordenar e indexar en columnas cifradas, debe implementar Always Encrypted con enclaves seguros.
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 proporcionar valores para las columnas cifradas. Por ejemplo, al insertar datos en columnas cifradas o filtrarlos mediante cifrado determinista, se deben usar parámetros de consulta. 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.
En Azure Data Studio o SSMS, es esencial aplicar parametrización en las variables Always Encrypted para ejecutar consultas que manejan los valores asociados a columnas cifradas. Esto incluye escenarios como insertar datos en columnas cifradas o aplicar filtros en ellas (en casos en los que se usa el 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:
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).
- Especifique columnas calculadas en una tabla.
- Columnas que hacen referencia a columnas calculadas (cuando la expresión realiza operaciones no admitidas para Always Encrypted).
- Use columnas dispersas.
- 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 On availability group.
- Consultas distribuidas (servidores vinculados, OPENROWSET (Transact-SQL), OPENDATASOURCE (Transact-SQL)).
- Consultas cruzadas de bases de datos que realizan uniones en columnas que están cifradas en 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
Instrucción DDL | Descripción |
---|---|
CREATE COLUMN MASTER KEY | Crea un objeto de metadatos de clave maestra de columna en una base de datos. |
DROP COLUMN MASTER KEY | Quita una clave maestra de columna de una base de datos. |
CREATE COLUMN ENCRYPTION KEY | Crea un objeto de metadatos de clave de cifrado de columna. |
ALTER COLUMN ENCRYPTION KEY | Modifica una clave de cifrado de columna en una base de datos agregando o quitando un valor cifrado. |
DROP COLUMN ENCRYPTION KEY | Quita una clave de cifrado de columna de una base de datos. |
CREATE TABLE (ENCRYPTED WITH) | Especifica columnas de cifrado |
Vistas de catálogo del sistema y procedimientos almacenados
Vistas de catálogo del sistema y procedimientos almacenados | Descripción |
---|---|
sys.column_encryption_keys | Devuelve información sobre claves de cifrado de columna (CEK) |
sys.column_encryption_key_values | Devuelve información sobre valores de cifrado de claves de cifrado de columna (CEK) |
sys.column_master_keys | Devuelve una fila para cada clave maestra de base de datos. |
sp_refresh_parameter_encryption | Actualiza los metadatos Always Encrypted para los parámetros del procedimiento almacenado no enlazado a un esquema específico, función definida por el usuario, vista, desencadenador DML, desencadenador DDL de nivel de la base de datos o desencadenador DDL de nivel de servidor. |
sp_describe_parameter_encryption | Analiza la instrucción Transact-SQL especificada y sus parámetros para determinar qué parámetros corresponden a columnas de base de datos protegidas mediante la característica Always Encrypted. |
Consulte también sys.columns 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.
Vistas de catálogo del sistema y procedimientos almacenados | Descripción |
---|---|
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 de cifrado 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.