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 tarjeta de crédito o números de identificación nacionales o regionales (por ejemplo, números de seguridad social de EE. UU.), almacenados en bases de datos de Azure SQL, Azure SQL Managed Instance y bases de datos de SQL Server. Always Encrypted permite a los clientes cifrar datos confidenciales dentro de las aplicaciones cliente y nunca revelar las claves de cifrado al motor de base de datos. Esto proporciona una separación entre aquellos que poseen los datos y pueden verlos, y aquellos que administran los datos, pero no deben 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 resultado, 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 usuarios internos malintencionados.
Always Encrypted se pueden configurar para admitir consultas confidenciales limitadas en datos cifrados, las consultas que implican comparaciones de igualdad. Por ejemplo, búsquedas de búsqueda puntuales o combinaciones de igualdad. Estas consultas aprovechan el cifrado determinista.
Nota
Los enclaves seguros amplían las funcionalidades de computación confidencial de Always Encrypted con coincidencia de patrones, otros operadores de comparación y cifrado en contexto. 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 proporciona información general sobre la configuración de Always Encrypted. Para más información y para empezar, consulte Tutorial: Introducción a Always Encrypted.
Para configurar Always Encrypted en la base de datos, debe hacer lo siguiente:
Aprovisione claves criptográficas para proteger los datos. En Always Encrypted se usan dos tipos de claves:
- Claves de cifrado de columnas.
- 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.
Debe almacenar claves maestras de columna en un almacén de claves de confianza fuera del sistema de base de datos, como Azure Key Vault, almacén de certificados de Windows o un módulo de seguridad de hardware.
A continuación, necesita 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 de 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 columnas contienen el valor cifrado de la clave de cifrado de columna. El motor de base de datos nunca almacena o usa las claves de cualquier tipo en texto no cifrado.
Para obtener más información sobre cómo administrar claves de Always Encrypted, consulte Introducción a la administración de claves para Always Encrypted
Configure el cifrado para las columnas de base de datos seleccionadas que contienen datos confidenciales que se van a proteger. Esto puede implicar la creación de nuevas tablas con columnas cifradas o el cifrado de las columnas de base de datos existentes y 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 siempre genera el mismo valor cifrado para un valor de texto no cifrado determinado. El empleo del cifrado determinista permite búsquedas de puntos, combinaciones de igualdad, agrupaciones e indexación en columnas cifradas. Pero también puede 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 mediante las herramientas de SQL:
- SQL Server Management Studio (SSMS)
- SQL Server PowerShell
- sqlpackage : que automatiza el proceso de instalación
Para asegurarse de que las claves Always Encrypted y los datos confidenciales protegidos nunca se revelan en texto no cifrado en el entorno de base de datos, el motor de base de datos no puede participar en el aprovisionamiento de claves y el cifrado de datos ni en las operaciones de descifrado. Por lo tanto, Transact-SQL (T-SQL) no admite el aprovisionamiento de claves ni las operaciones criptográficas. Por el mismo motivo, es necesario cifrar los datos existentes o volver a cifrarlos (con un tipo de cifrado diferente o una clave de cifrado de columna) fuera de la base de datos (las herramientas de SQL pueden automatizarlo).
Nota
Always Encrypted con enclaves seguros eleva algunas de las restricciones anteriores al permitir operaciones criptográficas en datos existentes mediante T-SQL y elimina la necesidad de mover los datos fuera de la base de datos.
Funcionamiento de las consultas en columnas cifradas
Para ejecutar una consulta en columnas de base de datos cifradas, insertar datos en columnas cifradas, recuperar valores de texto no cifrado de columnas cifradas o realizar operaciones admitidas (por ejemplo, búsquedas de puntos) en columnas mediante cifrado determinista, un usuario o una aplicación que emite la consulta deben cumplir los siguientes requisitos previos:
- Tener acceso a la clave maestra de columna que protege los datos. Se requiere acceso de clave además de los permisos de nivel de base de datos, como
SELECT
en la tabla que contiene los datos. - Conéctese a la base de datos con Always Encrypted habilitada en la conexión de base de datos. La mayoría de las herramientas de SQL y los controladores de cliente SQL admiten la habilitación de Always Encrypted para las conexiones de base de datos.
Nota
Si el usuario tiene permisos de base de datos necesarios para leer los datos, pero no tiene acceso a las claves que la protegen, el usuario todavía puede recuperar datos cifrados (cifrados) mediante la conexión a la base de datos sin habilitar Always Encrypted en la conexión de base de datos.
A continuación se muestra cómo funcionan las consultas en 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 destino las columnas cifradas y se deben cifrar. Para cada parámetro que se debe cifrar, el controlador recibe el algoritmo de cifrado, el tipo de cifrado y los metadatos de clave, incluida la clave de cifrado de columna cifrada y la ubicación de su clave maestra de columna correspondiente.
- 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 columnas de 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 columna de texto no cifrado obtenidas para cifrar los parámetros de consulta correspondientes a las columnas cifradas.
- El controlador sustituye los valores de texto no cifrado de los parámetros destinados a 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 implicar comparaciones de igualdad en columnas mediante 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 del conjunto de resultados recibido, el controlador primero intenta encontrar la clave de cifrado de columna de texto no cifrado en la memoria caché local y solo realiza un recorrido de ida y vuelta a un almacén de claves que contiene la clave maestra de columna si no encuentra la clave en la memoria caché.
- El controlador descifra los resultados y devuelve valores de 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 para los tipos comunes de almacenes de claves están disponibles en las bibliotecas de controladores del lado 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 obtener la lista de controladores de cliente que admiten Always Encrypted y para obtener información sobre cómo desarrollar aplicaciones que consultan columnas cifradas.
También puede consultar columnas cifradas mediante herramientas de SQL, por ejemplo , Azure Data Studio o SSMS.
Limitaciones
Las siguientes limitaciones se aplican a las consultas en columnas cifradas:
El cifrado determinista admite las siguientes operaciones que implican comparaciones de igualdad: no se permiten otras operaciones.
- = (Es igual a) en las búsquedas 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 coincidencia de patrones, operadores de comparación, ordenación e indexación en columnas mediante cifrado aleatorio.
No se permiten las instrucciones de consulta que desencadenan cálculos que implican texto no cifrado y datos cifrados. Por ejemplo:
- Comparar una columna cifrada con una columna de texto no cifrado o un 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 dan como resultado errores de conflicto entre operandos de la siguiente manera:
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 corresponden a columnas cifradas. Por ejemplo, al insertar datos en columnas cifradas o filtrar por columnas cifradas (al usar el cifrado determinista). No se admite el paso de literales o variables de T-SQL correspondientes a columnas cifradas. Para obtener más información específica de un controlador cliente que usa, consulte Desarrollo de aplicaciones con Always Encrypted.
Debe usar parametrización para Always Encrypted variables 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 filtrar por columnas cifradas (al usar el cifrado determinista).
No se admiten parámetros con valores de tabla destinados a columnas cifradas.
No se admiten las consultas que usan las cláusulas siguientes:
Después de cambiar la definición de una columna cifrada, ejecute sp_refresh_parameter_encryption para actualizar los metadatos de Always Encrypted para el objeto.
Always Encrypted no se admite para las columnas con las siguientes características:
- 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 intercalaciones distintas de las intercalaciones de punto de código binario (_BIN2) al usar el cifrado determinista.
- Columnas que son claves para índices agrupados y no agrupados cuando se usa cifrado aleatorio (se admiten índices en columnas mediante cifrado determinista).
- Columnas incluidas en í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 columnas dispersas.
- Columnas a las que hacen referencia las estadísticas al usar el cifrado aleatorio (se admite el cifrado determinista).
- Columnas de creación de particiones.
- Columnas con restricciones predeterminadas.
- Columnas a las que hacen referencia las restricciones únicas al usar el cifrado aleatorio (se admite el cifrado determinista).
- Columnas de clave principal al usar cifrado aleatorio (se admite el cifrado determinista).
- Hacer referencia a columnas en restricciones de clave externa cuando se usa el cifrado aleatorio o al usar el cifrado determinista, si las columnas a las que se hace referencia usan claves o algoritmos diferentes.
- Columnas a las que hacen referencia las restricciones check.
- Columnas capturadas o rastreadas mediante la captura de datos modificados.
- Columnas de clave principal en tablas que tienen seguimiento de cambios.
- Columnas enmascaradas (mediante enmascaramiento dinámico de datos).
- Columnas de tablas de base de datos extendidas. (Las tablas con columnas cifradas con Always Encrypted pueden habilitarse para Stretch).
Importante
Stretch Database está en desuso en SQL Server 2022 (16.x). Esta característica se quitará en una versión futura de Microsoft SQL Server. 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:
- SQL Server replicación (transaccional, combinación o replicación de instantáneas). Se admiten las características de replicación física, incluido Always.
- Consultas distribuidas (servidores vinculados, OPENROWSET (Transact-SQL), OPENDATASOURCE (Transact-SQL)).
- Consultas entre bases de datos que realizan combinaciones en columnas (mediante cifrado determinista) de bases de datos diferentes.
Always Encrypted referencia de Transact-SQL
Always Encrypted usa las siguientes instrucciones Transact-SQL, vistas de catálogo del sistema, procedimientos almacenados y permisos del sistema.
Instrucciones
- 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 los metadatos de cifrado almacenados para cada columna.
Permisos de base de datos
Hay cuatro permisos de base de datos para Always Encrypted:
ALTER ANY COLUMN MASTER KEY : se requiere para crear y eliminar metadatos de clave maestra de columna.
ALTER ANY COLUMN ENCRYPTION KEY : se requiere para crear y eliminar metadatos de clave de cifrado de columnas.
VIEW ANY COLUMN MASTER KEY DEFINITION: se requiere para acceder a los metadatos de clave maestra de columna y leer los metadatos de la clave maestra de columna, que es necesario para consultar columnas cifradas.
VIEW ANY COLUMN ENCRYPTION KEY DEFINITION : se requiere para acceder a los metadatos de clave maestra de columna y leer los metadatos de la clave maestra de columna, que es necesario 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 al seleccionar columnas cifradas, aunque el usuario no tenga permiso para las claves maestras de columna (en sus almacenes de claves), protegiendo las columnas y no tiene acceso al intento de texto no cifrado.
En SQL Server, los permisos VIEW ANY COLUMN MASTER KEY DEFINITION y VIEW ANY COLUMN ENCRYPTION KEY DEFINITION se conceden de forma predeterminada al rol fijo de base de datos público. Un administrador de bases 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 forma predeterminada al rol de base de datos fijo público. Esto permite que ciertas herramientas heredadas existentes (con versiones anteriores de DacFx) funcionen correctamente. Por lo tanto, para trabajar con columnas cifradas (aunque no las descifre), un administrador de base de datos debe conceder explícitamente los permisos VIEW ANY COLUMN MASTER KEY DEFINITION y VIEW ANY COLUMN ENCRYPTION KEY DEFINITION .
Pasos siguientes
- Para probar Always Encrypted, consulte Tutorial: Introducción a Always Encrypted.