sql >> Base de Datos >  >> RDS >> Database

Cifrado de datos transparente y siempre cifrado

Si necesita almacenar datos confidenciales en su base de datos, puede usar cifrado de datos . SQL Server admite el cifrado con claves simétricas, claves asimétricas, certificados y frases de contraseña. Supongo que usted, el lector, ya está familiarizado con estos términos. En este artículo, me centraré en dos de las muchas opciones de cifrado que ofrece SQL Server:

  • Cifrado de datos transparente (TDE)
  • Siempre cifrado (AE)

Cifrado de datos transparente

El Cifrado de datos transparente (TDE) protege los datos en reposo cuando no se utilizan. Cuando se utilizan los datos, SQL Server los descifra automáticamente. Puede utilizar el TDE para el cifrado y descifrado en tiempo real de los datos y archivos de registro. Cifras los datos con la clave de cifrado de base de datos (DEK) , que es una clave simétrica. Se almacena en el registro de inicio de la base de datos y, por lo tanto, ya está disponible durante el proceso de recuperación de la base de datos. La DEK se protege con un certificado en la base de datos maestra. También puede usar una clave asimétrica en lugar del certificado; sin embargo, la clave asimétrica debe almacenarse en un módulo EKM. TDE utiliza únicamente los cifrados AES y Triple DES. TDE se implementó por primera vez en SQL Server con la versión 2012.

Puede usar TDE solo en bases de datos de usuario. No puede exportar la clave de cifrado de la base de datos. Esta clave solo la utiliza el motor de base de datos de SQL Server. Los usuarios finales nunca lo usan. Incluso si cambia el propietario de la base de datos, no necesita volver a generar la DEK.

TDE cifra los datos a nivel de página. Además, cifra también el registro de transacciones. Debe hacer una copia de seguridad del certificado utilizado para proteger la DEK y la clave privada utilizada para proteger el certificado inmediatamente después de habilitar TDE. Si necesita restaurar o adjuntar la base de datos cifrada a otra instancia de SQL Server, debe restaurar tanto el certificado como la clave privada, o no podrá abrir la base de datos. Tenga en cuenta nuevamente que no exporta el DEK, ya que es parte de la base de datos en sí. Debe conservar y mantener el certificado utilizado para proteger la DEK incluso después de desactivar el TDE en la base de datos. Esto se debe a que es posible que partes del registro de transacciones aún estén encriptadas. El certificado es necesario hasta que realice la copia de seguridad completa de la base de datos.

Siempre encriptado

SQL Server 2016 Enterprise Edition presenta un nuevo nivel de cifrado, a saber, Always Encrypted (AE) rasgo. Esta función permite el mismo nivel de protección de datos que el cifrado de datos en la aplicación cliente. En realidad, aunque esta es una función de SQL Server, los datos se cifran y descifran en el lado del cliente. Las claves de cifrado nunca se revelan al motor de base de datos de SQL Server. De esta manera, un DBA tampoco puede ver datos confidenciales sin las claves de cifrado, solo con tener permisos de administrador del sistema en la instancia de SQL Server con los datos cifrados. De esta forma, AE hace una separación entre los administradores que gestionan los datos y los usuarios que son propietarios de los datos.

Teclas AE

Necesita dos claves para Always Encrypted. Primero, crea la clave maestra de columna (CMK) . Luego crea la clave de cifrado de columna (CEK) y protéjalo con la CMK. Una aplicación utiliza la CEK para cifrar los datos. SQL Server almacena solo datos cifrados y no puede descifrarlos. Esto es posible porque las claves maestras de columna no se almacenan realmente en una base de datos de SQL Server. En la base de datos, SQL Server almacena solo el enlace a esas claves. Las claves maestras de columna se almacenan fuera de SQL Server, en uno de los siguientes lugares posibles:

  • Almacén de certificados de Windows para el usuario actual
  • Almacén de certificados de Windows para el equipo local
  • Servicio Azure Key Vault
  • Un módulo de seguridad de hardware (HSM) , compatible con Microsoft CryptoAPI o Cryptography API:Next Generation

Las claves de cifrado de columna se almacenan en la base de datos. Dentro de una base de datos de SQL Server, solo se almacena la parte cifrada de los valores de las claves de cifrado de columna, junto con la información sobre la ubicación de las claves maestras de columna. Las CEK nunca se almacenan como texto sin formato en una base de datos. Las CMK, como se mencionó, en realidad se almacenan en almacenes de claves de confianza externos.

Uso de las teclas AE

Una aplicación puede usar las claves AE y el cifrado mediante un controlador habilitado para AE, como .NET Framework Data Provider para SQL Server versión 4.6 o superior, controlador Microsoft JDBC para SQL Server 6.0 o superior, o controlador ODBC de Windows para SQL Server versión 13.1 o superior. más alto. La aplicación debe enviar consultas parametrizadas al servidor SQL. El controlador habilitado para AE funciona junto con el motor de base de datos de SQL Server para determinar qué parámetros se deben cifrar o descifrar. Para cada parámetro que debe cifrarse o descifrarse, el controlador obtiene los metadatos necesarios para el cifrado del Motor de base de datos, incluido el algoritmo de cifrado, la ubicación de la CMK correspondiente y el valor cifrado para la CEK correspondiente. Luego, el controlador se pone en contacto con el almacén de CMK, recupera la CMK, descifra la CEK y usa la CEK para cifrar o descifrar el parámetro. Luego, el controlador almacena en caché la CEK para acelerar el próximo uso de la misma CEK. La siguiente figura muestra el proceso gráficamente.

La figura representa todo el proceso en pasos:

  1. La aplicación cliente crea una consulta parametrizada
  2. La aplicación cliente envía la consulta parametrizada al controlador habilitado para AE
  3. El controlador habilitado para AE se comunica con SQL Server para determinar qué parámetros necesitan cifrado o descifrado, la ubicación de la CMK y el valor cifrado de la CEK
  4. El controlador habilitado para AE recupera la CMK y descifra la CEK
  5. El controlador habilitado para AE cifra los parámetros
  6. El controlador envía la consulta al motor de base de datos
  7. El motor de base de datos recupera los datos y envía el conjunto de resultados al controlador
  8. El controlador realiza el descifrado, si es necesario, y envía el conjunto de resultados a la aplicación cliente

Tipos de cifrado AE

Motor de base de datos nunca opera en los datos de texto sin formato almacenados en las columnas cifradas. Sin embargo, son posibles algunas consultas sobre los datos cifrados, según el tipo de cifrado. Hay dos tipos de cifrado:

  • Cifrado determinista , que siempre genera el mismo valor cifrado para el mismo valor de entrada. Con este cifrado, puede indexar la columna cifrada y usar búsquedas de puntos, uniones de igualdad y expresiones de agrupación en la columna cifrada. Sin embargo, un usuario malintencionado podría intentar adivinar los valores analizando los patrones de los valores cifrados. Esto es especialmente peligroso cuando el conjunto de valores posibles para una columna es discreto, con una pequeña cantidad de valores distintos.
  • Cifrado aleatorio , que cifra los datos de forma impredecible.

Demostración AE:creación de objetos

Es hora de mostrar cómo funciona AE a través de algún código de demostración. Primero, creemos y usemos una base de datos de demostración.

USE master;
IF DB_ID(N'AEDemo') IS NULL
   CREATE DATABASE AEDemo;
GO
USE AEDemo;
GO

A continuación, cree la CMK en la GUI de SSMS. En el Explorador de objetos, actualice la carpeta Bases de datos para ver la base de datos AEDemo. Expanda esta carpeta de base de datos, expanda la subcarpeta Seguridad, luego la subcarpeta Claves siempre cifradas y haga clic con el botón derecho en la subcarpeta Clave maestra de columna y seleccione la opción Nueva clave maestra de columna en el menú emergente. En el cuadro de texto Nombre, escriba AE_ColumnMasterKey y asegúrese de seleccionar la opción Almacén de certificados de Windows - Máquina local en la lista desplegable Almacén de claves, como muestra la siguiente figura.

Puede verificar si la CMK se creó correctamente con la siguiente consulta.

SELECT * 
FROM sys.column_master_keys;

A continuación, crea el CEK. En SSMS, en el Explorador de objetos, haga clic con el botón derecho en la subcarpeta Claves de cifrado de columna justo debajo de la subcarpeta Clave maestra de columna y seleccione la opción Nueva clave de cifrado de columna en el menú emergente. Nombre el CEK AE_ColumnEncryptionKey y use el CMK AE_ColumnMasterKey para cifrarlo. Puede verificar si la creación de CEK fue exitosa con la siguiente consulta.

SELECT * 
FROM sys.column_encryption_keys;

Actualmente, solo las nuevas intercalaciones binarias, las intercalaciones con BIN2 sufijo, son compatibles con AE. Por lo tanto, creemos una tabla con intercalaciones apropiadas para las columnas de caracteres.

CREATE TABLE dbo.Table1
(id INT,
 SecretDeterministic NVARCHAR(10) COLLATE Latin1_General_BIN2 
  ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey,
   ENCRYPTION_TYPE = DETERMINISTIC,
   ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
 SecretRandomized NVARCHAR(10) COLLATE Latin1_General_BIN2
  ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey,
   ENCRYPTION_TYPE = RANDOMIZED,
   ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL
);

Demostración AE:Inserción de los datos

Ahora puede intentar insertar una fila de datos con la siguiente declaración.

INSERT INTO dbo.Table1
 (id, SecretDeterministic, SecretRandomized)
VALUES (1, N'DeterSec01', N'RandomSec1');

Obtiene el error 206, texto de error:"Conflicto de tipo de operando:nvarchar es incompatible con nvarchar (4000) cifrado con (encryption_type ='DETERMINISTIC', encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name ='AE_ColumnEncryptionKey', column_encryption_key_EDdatabase_name' =' . SQL Server no puede cifrar ni descifrar los datos. Necesita modificar los datos desde una aplicación cliente. Puede realizar un conjunto limitado de operaciones en la tabla desde SQL Server. Por ejemplo, puede usar la instrucción TRUNCATE TABLE en una tabla con columnas AE.

Creé una aplicación de consola de Windows de cliente muy simple en Visual C#. La aplicación en realidad solo recupera las claves e inserta una sola fila en la tabla creada con el código anterior. Aquí está el código C#.

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AEDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = "Data Source=localhost; “ +
              “Initial Catalog=AEDemo; Integrated Security=true; ” +
              “Column Encryption Setting=enabled";
            SqlConnection connection = new SqlConnection(connectionString);
            connection.Open();
            if (args.Length != 3)
            {
                Console.WriteLine("Please enter a numeric “ + 
                                  “and two string arguments.");
                return;
            }
            int id = Int32.Parse(args[0]);
            {
                using (SqlCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText = @"INSERT INTO dbo.Table1 “ +
                        “(id, SecretDeterministic, SecretRandomized)" +
                        " VALUES (@id, @SecretDeterministic, @SecretRandomized);";

                    SqlParameter paramid= cmd.CreateParameter();
                    paramid.ParameterName = @"@id";
                    paramid.DbType = DbType.Int32;
                    paramid.Direction = ParameterDirection.Input;
                    paramid.Value = id;
                    cmd.Parameters.Add(paramid);

                    SqlParameter paramSecretDeterministic = cmd.CreateParameter();
                    paramSecretDeterministic.ParameterName = 
                      @"@SecretDeterministic";
                    paramSecretDeterministic.DbType = DbType.String;
                    paramSecretDeterministic.Direction = ParameterDirection.Input;
                    paramSecretDeterministic.Value = "DeterSec1";
                    paramSecretDeterministic.Size = 10;
                    cmd.Parameters.Add(paramSecretDeterministic);

                    SqlParameter paramSecretRandomized = cmd.CreateParameter();
                    paramSecretRandomized.ParameterName =
                      @"@SecretRandomized";
                    paramSecretRandomized.DbType = DbType.String;
                    paramSecretRandomized.Direction = ParameterDirection.Input;
                    paramSecretRandomized.Value = "RandomSec1";
                    paramSecretRandomized.Size = 10;
                    cmd.Parameters.Add(paramSecretRandomized);

                    cmd.ExecuteNonQuery();
                }
            }
            connection.Close();
            Console.WriteLine("Row inserted successfully");            
        }
    }
}

Puede ejecutar el código C# desde Visual Studio en el modo de depuración o compilar la aplicación. Luego puede ejecutar la aplicación AEDemo.exe desde el símbolo del sistema o desde SSMS en modo SQMCMD.

Demostración AE:lectura de datos

Después de ejecutar la aplicación, debe intentar leer los datos de la misma sesión en SSMS que utilizó para crear la tabla.

SELECT *
FROM dbo.Table1;

Solo puede ver los datos cifrados. Ahora abra una segunda ventana de consulta en SSMS. Haga clic derecho en esta ventana y elija Conexión, luego Cambiar conexión. En el cuadro de diálogo Conexión, haga clic en el botón Opciones en la parte inferior. Escriba AEDemo para el nombre de la base de datos y luego haga clic en la pestaña Parámetros de conexión adicionales. En el cuadro de texto, ingrese "Configuración de cifrado de columna =habilitado" (sin comillas dobles). Luego haga clic en Conectar.

Vuelva a intentar insertar una fila de SSMS. Utilice la siguiente consulta.

INSERT INTO dbo.Table1
 (id, SecretDeterministic, SecretRandomized)
VALUES (2, N'DeterSec2', N'RandomSec2');

Tengo un error de nuevo. Esta versión de SSMS que estoy usando todavía no puede parametrizar inserciones ad-hoc. Sin embargo, intentemos leer los datos con la siguiente consulta.

SELECT * 
FROM dbo.Table1;

Esta vez, la consulta funciona y obtienes el siguiente resultado:

Id SecretDeterministic SecretRandomized

— ——————– —————-

1 DeterSec1 RandomSec1

2 DeterSec2 RandomSec2

Limitaciones de AE

Ya ha visto algunas limitaciones de Always Encrypted, que incluyen:

  • Solo se admiten intercalaciones BIN2 para cadenas
  • Puede indexar solo columnas con cifrado determinista y usar un conjunto limitado de operaciones T-SQL en esas columnas
  • No puede indexar columnas con cifrado aleatorio
  • AE se limita únicamente a las ediciones Enterprise y Developer
  • Trabajar con AE en SSMS puede ser doloroso

Consulte Books Online para obtener una lista más detallada de las limitaciones de AE. Sin embargo, tenga en cuenta también los puntos fuertes de AE. Es simple de implementar porque no necesita modificaciones en una aplicación, excepto la modificación de cadenas de conexión. Los datos se cifran de extremo a extremo, desde la memoria del cliente a través de la red hasta el almacenamiento de la base de datos. Incluso los DBA no pueden ver los datos solo dentro de SQL Server; incluso los DBA necesitan acceso al almacenamiento de claves fuera de SQL Server para leer la CMK. AE y otras opciones de cifrado en SQL Server brindan un conjunto completo de posibilidades, y depende de usted y del problema empresarial que esté resolviendo seleccionar el método adecuado.

Conclusión

El cifrado de datos transparente es extremadamente fácil de usar. Sin embargo, la protección de datos es muy limitada. TDE protege los datos en reposo únicamente. Sin embargo, Always Encrypted es realmente una característica poderosa. Todavía no es demasiado complejo de implementar y los datos están completamente protegidos. Ni siquiera un DBA puede verlo sin tener acceso a las claves de cifrado. Con suerte, las limitaciones para AE, especialmente la limitación de intercalación, se eliminarán en las futuras versiones de SQL Server.