Se recomienda cuándo usar Always Encrypted de Azure SQL Database

Completado

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 Azure SQL Database, 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 en el motor de base de datos. Always Encrypted 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 puede configurar para admitir consultas confidenciales limitadas en datos cifrados, las consultas que implican comparaciones de igualdad. Por ejemplo, seleccione búsquedas puntuales o combinaciones de igualdad. Estas consultas usan cifrado determinista.

Diagrama que muestra un ejemplo de una base de datos siempre cifrada.

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.

Always Encrypted hace que el cifrado sea transparente para las aplicaciones. Un controlador habilitado para Always Encrypted instalado en el equipo cliente cifra y descifra automáticamente datos confidenciales en la aplicación cliente. El controlador cifra los datos en columnas confidenciales antes de pasar los datos al motor de base de datos. A continuación, el controlador vuelve a escribir automáticamente las consultas para que se conserve la semántica de la aplicación. Del mismo modo, el controlador descifra de forma transparente los datos, almacenados en columnas de base de datos cifradas, contenidas en los resultados de la consulta.

Configuración de Always Encrypted

Para configurar Always Encrypted en la base de datos, debe:

  1. Implemente claves criptográficas para proteger los datos. Always Encrypted usa 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 más claves de cifrado de columna. Debe almacenar las claves maestras de las columnas en un almacén de claves de confianza fuera del sistema de base de datos. Las ubicaciones de almacenamiento más comunes son Azure Key Vault, almacén de certificados de Windows o un módulo de seguridad de hardware. A continuación, necesita implementar 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 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.
  2. Configure el cifrado para las columnas de base de datos seleccionadas que contienen datos confidenciales que se van a proteger. Puede crear nuevas tablas con columnas cifradas o cifrar 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 uso del cifrado determinista permite búsquedas de puntos, combinaciones de igualdad, agrupación e indexación en columnas cifradas. Sin embargo, también puede permitir a los usuarios no autorizados adivinar información sobre los valores cifrados mediante el examen de patrones en la columna cifrada, especialmente si hay un pequeño conjunto de valores cifrados posibles, como True/False o Región Norte/Sur/Este/Oeste.
    • El cifrado aleatorio usa un método que cifra los datos de forma menos predecible. El cifrado aleatorio es más seguro, pero evita la búsqueda, agrupación, indexación y unión en columnas cifradas.

    Use el cifrado determinista para las columnas que se usan como parámetros de búsqueda o agrupación. Por ejemplo, un número de identificador gubernamental. Use el cifrado aleatorio para datos como comentarios de investigación confidencial, que no se agrupan con otros registros y no se usan para combinar tablas. Para obtener más información sobre los algoritmos criptográficos de Always Encrypted, consulte Criptografía de Always Encrypted. Puede realizar los pasos anteriores mediante las herramientas de SQL:

    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 admiten 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).

Funcionamiento de las consultas sobre columnas cifradas

Se debe cumplir un conjunto de requisitos previos, si el usuario debe realizar alguna de estas acciones:

  • Ejecución de una consulta en columnas de base de datos cifradas
  • Insertar datos en columnas cifradas
  • Recuperación de valores de texto no cifrado de columnas cifradas
  • Realizar operaciones admitidas (por ejemplo, búsquedas de búsqueda 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 a claves 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 habilitado 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 los permisos de base de datos necesarios para leer los datos, pero no es posible acceder a las claves que protegen las acciones. El usuario puede recuperar texto cifrado (encriptado) mediante la conexión a la base de datos sin habilitar "Always Encrypted" en la conexión a la base de datos.

A continuación se muestra cómo funcionan las consultas en columnas cifradas:

  1. Cuando una aplicación emite una consulta parametrizada, 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 debe cifrarse, 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.
  2. El controlador llama al almacén de claves, que contiene claves maestras de columna para descifrar los valores de clave de cifrado de columnas cifradas. Las claves de cifrado de columna 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.
  3. El controlador usa las claves de cifrado de columnas de texto no cifrado obtenidas para cifrar los parámetros de consulta correspondientes a las columnas cifradas.
  4. 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.
  5. El motor de base de datos ejecuta la consulta, que puede implicar comparaciones de igualdad en columnas mediante cifrado determinista.
  6. 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.
  7. El motor de base de datos envía el conjunto de resultados a la aplicación cliente.
  8. 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 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é.
  9. El controlador descifra los resultados y devuelve valores de texto no cifrado a la aplicación.

Un controlador de 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 del lado cliente que encapsula un almacén de claves que contiene la clave maestra de columna. Los proveedores de 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 funcionalidades de Always Encrypted, incluidos los proveedores integrados del almacén de claves maestras de columna, varían según una 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 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.

  • No se permiten cálculos en columnas cifradas mediante cifrado aleatorio.

Nota:

Always Encrypted con enclaves seguros relaja la restricción al permitir la coincidencia de patrones, operadores de comparación, ordenación e indexación en columnas mediante cifrado aleatorio.

  • No se permiten instrucciones de consulta que desencadenan cálculos relacionados con 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 viceversa) UPDATE, BULK INSERT, SELECT INTO o INSERT..SELECT.
    • Insertar literales en columnas cifradas.

Estas instrucciones producen errores de conflicto entre operandos como este:

Output
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 (cuando se usa cifrado determinista). No se admite el paso de literales o variables T-SQL correspondientes a columnas cifradas. Para obtener más información específica sobre un controlador cliente que usa, 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 filtrar por columnas cifradas (cuando se usa 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:

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.

Referencia de 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.

Instrucciones

Vistas de catálogo del sistema y procedimientos almacenados

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: es necesario para crear y eliminar metadatos de clave maestra de columna.
  • ALTER ANY COLUMN ENCRYPTION KEY: es necesario para crear y eliminar metadatos de clave de cifrado de columnas.
  • VIEW ANY COLUMN MASTER KEY DEFINITION: es necesario 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.
  • VER CUALQUIER DEFINICIÓN DE CLAVE DE CIFRADO DE COLUMNA: es necesario para acceder y leer los metadatos de la clave maestra de columna, que se requiere para consultar columnas cifradas.

En la tabla siguiente se resumen los permisos necesarios para las acciones comunes.

Escenario ALTERAR CUALQUIER CLAVE MAESTRA DE COLUMNA ALTERAR CUALQUIER CLAVE DE ENCRIPTACIÓN DE COLUMNA VER CUALQUIER DEFINICIÓN DE CLAVE MAESTRA DE COLUMNA VER CUALQUIER DEFINICIÓN DE CLAVE DE CIFRADO DE COLUMNAS
Administración de claves (creación, cambio y revisión de metadatos de clave en la base de datos) X X X X
Consulta de 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, incluso si el usuario no tiene permiso para las claves maestras de columna (en sus almacenes de claves), protegiendo las columnas y no accede 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 fijo de base de datos público. Esto permite que ciertas herramientas heredadas existentes (con versiones anteriores de DacFx) funcionen correctamente. Para trabajar con columnas cifradas (incluso si no las descifra), un administrador de bases de datos debe conceder explícitamente los permisos VIEW ANY COLUMN MASTER KEY DEFINITION y VIEW ANY COLUMN ENCRYPTION KEY DEFINITION.