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.
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.
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.
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).
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 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 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 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:
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.
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.
Administre una infraestructura de base de datos de SQL Server para bases de datos relacionales locales e híbridas en la nube mediante las ofertas de bases de datos relacionales PaaS de Microsoft.
En este tutorial se explica cómo cifrar columnas mediante Always Encrypted y cómo consultar columnas cifradas en SQL Server, Azure SQL Database y Azure SQL Managed Instance.
Aprenda a administrar los dos tipos de claves criptográficas que Always Encrypted usa para proteger los datos en SQL Server: clave de cifrado de columna y clave maestra de columna.
Obtenga información sobre cómo consultar columnas en Always Encrypted mediante SQL Server Management Studio. Recupere valores de texto cifrado o texto almacenados en columnas cifradas.
Obtenga información sobre los mecanismos y algoritmos de cifrado que extraen el material criptográfico que se usa en la característica Always Encrypted de SQL Server y Azure SQL Database.
Obtenga información sobre cómo establecer la configuración de Always Encrypted para las columnas de las bases de datos mediante el Asistente para Always Encrypted en SQL Server.