sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server 2016:siempre cifrado

SQL Server 2016 incluye una característica de seguridad de la base de datos llamada Siempre cifrada. Dado que hemos agregado compatibilidad con Always Encrypted al controlador ODBC de SQL Server, nuestros clientes podrán aprovechar esta función.

Always Encrypted protege los datos de SQL Server en el punto en el que son más susceptibles a un ataque:cuando se utilizan esos datos. Por ejemplo, durante transacciones y cálculos. Esto difiere de las funciones de cifrado existentes de SQL Server, ya que requieren que los datos se descifren antes de que se puedan realizar operaciones en ellos.

La clave de cifrado que protege las columnas de Always Encrypted se almacena en la máquina de la aplicación. Esto significa que SQL Server no puede descifrar los datos de Always Encrypted. Si la máquina de SQL Server se ve comprometida, el atacante solo podrá acceder a los datos de Always Encrypted en forma cifrada.

Para la mayoría de los usuarios, la función Always Encrypted será transparente, es decir, están aislados del funcionamiento de Always Encrypted y no tienen que cambiar lo que están haciendo para beneficiarse de la función.

Al final de la aplicación, el controlador de software que proporciona la interfaz de cliente para SQL Server realiza el cifrado. En Linux y UNIX, se trata de un controlador ODBC que cifra o descifra datos de forma transparente según la dirección de viaje. En el caso del controlador Easysoft, Always Encrypted se habilita configurando un parámetro de cadena de conexión.

Dado que las personas están cada vez más preocupadas de que sus datos estén seguros en la nube, Always Encrypted estará disponible en Azure SQL, la versión de pago por uso basada en la nube de SQL Server. Por lo tanto, el controlador ODBC de Easysoft para Azure SQL también será compatible con Always Encrypted.

Tutorial:trabajar con datos de columnas de Always Encrypted en Linux

El controlador ODBC de SQL Server de Easysoft le permite actualizar y consultar los datos contenidos en las columnas de Always Encrypted.

Cree la tabla y genere las claves de cifrado

Estos pasos se realizan en la máquina de SQL Server.

  1. En SQL Server Management Studio 2016 CTP3 o posterior, cree una nueva base de datos.
  2. En la nueva base de datos, cree una tabla que contenga una o más columnas cuyo contenido desee cifrar. Por ejemplo:
    CREATE TABLE dbo.EncryptedTable
    (
      ID INT IDENTITY(1,1) PRIMARY KEY, LastName NVARCHAR(32), Salary INT NOT NULL
    );
    
  3. Haga clic derecho en la base de datos. En el menú emergente, seleccione Tareas> Cifrar columnas .

    Se inicia el asistente de Always Encrypted.

  4. En la Selección de columna página, expanda las tablas y seleccione las columnas que desea cifrar.
  5. Elija un tipo de cifrado para cada columna.

    Determinista - siempre cifra con el mismo texto cifrado, lo que permite realizar búsquedas de igualdad, uniones y agrupaciones.

    Al azar genera un valor de texto cifrado diferente para el mismo texto sin formato, que es más seguro, pero no admite ninguna operación.

  6. Elija CEK_Auto1 (New) como clave de cifrado para cada columna, que es una nueva clave generada automáticamente. Elija Siguiente .
  7. En la página Configuración de clave maestra, acepte la configuración predeterminada:
    Field Valor
    Seleccionar clave maestra de columna Generar automáticamente clave maestra de columna
    Seleccione el proveedor de almacenamiento de claves Almacén de certificados de Windows
    Seleccionar clave maestra de columna Usuario actual
  8. Utilice Siguiente botón para pasar al Resumen página. Elija Finalizar .
  9. Espere a que se complete el asistente y luego elija Cerrar .

Exportar los certificados

Para transferir los certificados a la máquina Linux, primero debe exportarlos en Windows.

  1. En una ventana del símbolo del sistema, escriba certmgr , para iniciar el complemento Certificados.
  2. El nuevo certificado de Always Encrypted estará disponible en Certificados - Usuario actual> Personal> Certificados .
  3. Haga clic con el botón derecho en el certificado (que se llamará algo así como Always Encrypted Auto Certificate1 ). En el menú emergente, seleccione Todas las tareas> Exportar .

    Se inicia el Asistente para exportación de certificados. Elija Siguiente .

  4. Elija Sí, exportar la clave privada .
  5. Acepte los valores predeterminados en la página Exportar formato de archivo. Elija Siguiente .
  6. Proporcione una contraseña cuando se le solicite. Elija Siguiente .
  7. Asigne un nombre y guarde el certificado cuando se le solicite. Por ejemplo, CMK_Auto1.pfx .
  8. Utilice Siguiente y Finalizar botones para completar el asistente.

Instalación de los Certificados en Linux

Transfiera los certificados exportados a la máquina Linux desde la que desea acceder a las columnas de Always Encrypted:

  1. Copie el certificado que acaba de exportar a ~/ssl/private en la máquina Linux o UNIX donde ha instalado el controlador ODBC de SQL Server.

    ~ es el directorio de inicio del usuario que ejecutará la aplicación que se conecta a SQL Server a través del controlador ODBC de Easysoft. ~/ssl/private es la ubicación desde donde la capa OpenSSL integrada en el controlador intentará cargar un certificado personal. Cree el directorio si no existe. Por ejemplo:

    $ mkdir -p ~/ssl/private
    $ cd ~/ssl/private
    $ mv /tmp/CMK_Auto1.pfx .
    
  2. Para usar el certificado con el controlador ODBC de SQL Server, debe eliminar la frase de contraseña que contiene. Para hacer esto, OpenSSL debe estar instalado en la máquina. (Esto solo es necesario para eliminar la frase de contraseña; para otras operaciones, el controlador ODBC de SQL Server usa una capa OpenSSL integrada). Elimine la frase de contraseña con los siguientes comandos. Cuando se le solicite la frase de contraseña después del segundo comando, presione RETURN sin ingresar nada. Esto establecerá la frase de contraseña en nada.
    $ openssl pkcs12 -in CMK_Auto1.pfx -nodes -out temp.pem
    Enter Import Password: *******
    MAC verified OK
    $ openssl pkcs12 -export -in temp.pem  -out nopassphrase.p12
    Enter Export Password:
    Verifying - Enter Export Password:
    $
    
  3. Para cargar el certificado, el controlador ODBC de SQL Server utiliza la metainformación que recibe de SQL Server sobre la columna cifrada. El nombre del certificado que el controlador recibe de SQL Server tiene el formato my/thumbprint . Debe utilizar esta convención de nomenclatura para el certificado. Use OpenSSL para mostrar la huella digital del certificado y luego cambie el nombre del certificado en un subdirectorio llamado my:
    $ openssl x509 -in temp.pem -fingerprint -noout | tr -d ":"
    SHA1 Fingerprint=EFC1940E545941D6C05C763361403F55A5DEF0E8
    $ mkdir my
    $ cp nopassphrase.p12 my/EFC1940E545941D6C05C763361403F55A5DEF0E8
    $ ln -s my My
    

    Nota Durante las pruebas, notamos que SQL Server a veces llamaba al certificado My/thumbprint . El enlace simbólico en el ejemplo anterior soluciona esta inconsistencia.

Instalación del controlador ODBC de SQL Server

El controlador ODBC de SQL Server no solo proporciona la capa de conectividad entre la aplicación y SQL Server, sino que también maneja el cifrado/descifrado de los datos almacenados en las columnas de Always Encrypted.

Instale y obtenga la licencia del controlador ODBC de SQL Server. Para obtener instrucciones sobre cómo hacerlo, consulte la documentación del controlador ODBC de SQL Server. Si su aplicación es de 64 bits, descargue la versión de 64 bits del controlador ODBC. De lo contrario, utilice la versión de 32 bits del controlador, independientemente de la arquitectura del sistema operativo.

Un origen de datos ODBC contiene la información de la cadena de conexión que permite que el controlador ODBC de SQL Server se conecte a la instancia de destino de SQL Server. En nuestra máquina, las fuentes de datos ODBC se almacenan en /etc/odbc.ini . Este extracto de la fuente de datos muestra la configuración relevante para las columnas de Always Encrypted:

[SQLSERVER_2016]
Driver=Easysoft ODBC-SQL Server SSL # Must use SSL version of driver
Server=machine\sqlserver_instance
Database=database_with_always_encrypted_data
User=user # This can be a Windows or SQL Server login.
Password=password
Trusted_Connection=Yes # Set this to No for a SQL Server login
ColumnEncryption=Enabled # To view Always Encrypted data or to
                         # insert into an Always Encrypted column set to Enabled

Nota Si su conexión falla con el error "La conexión SSL falló en syscall", su sistema carece de un "dispositivo de aleatoriedad". Ver la Entropy atributo en el manual del controlador ODBC de SQL Server para obtener información sobre qué hacer al respecto.

Inserción de datos en una columna siempre cifrada

Ahora hemos creado una tabla vacía con columnas Always Encrypted y configuramos nuestra máquina cliente Linux para que el controlador ODBC de SQL Server pueda funcionar con datos Always Encrypted. A continuación, debemos completar la tabla con datos.

Para insertar datos en una columna de Always Encrypted, una aplicación debe:

  1. Usar una inserción parametrizada, es decir, INSERTAR EN VALORES de EncryptedTable (?, ?).

    Esto permite que el controlador ODBC de SQL Server diferencie entre los valores de columna (que debe cifrar) y el texto de la instrucción SQL (que debe permanecer en texto sin formato; con Siempre cifrado, recuerde, SQL Server no descifra).

  2. Describa explícitamente el tipo de datos de los parámetros.

    SQL Server no proporciona la información necesaria sobre una columna Always Encrypted para que el controlador ODBC de SQL Server descubra el tipo de datos mediante SQLDescribeParam .

Aquí hay una muestra de Perl que muestra cómo hacer esto:

# Use Perl DBI / DBD:ODBC to insert data into Always Encrypted columns.
use strict;
use warnings;
use DBI;

my $data_source = q/dbi:ODBC:SQLSERVER_2016/;

my $h = DBI->connect($data_source)
    or die "Can't connect to $data_source: $DBI::errstr";
$h->{RaiseError} = 1;

my $s = $h->prepare(q/insert into EncryptedTable values(?,?)/);
my $lastname='Smith';
my $salary=25000;

# Set the data type of the target columns.
# Cannot use SQLDescribeParam with Always Encrypted columns.
$s->bind_param(1, $lastname, DBI::SQL_WVARCHAR);
$s->bind_param(2, $salary, DBI::SQL_INTEGER);
$s->execute($lastname,$salary);
$h->disconnect;

Aquí hay una muestra de C que muestra cómo hacer esto:

#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlucode.h>
#include <sqlext.h>
#include <string.h>
#include <wchar.h>

#define LASTNAME_LEN 6

SQLHENV   henv  = SQL_NULL_HENV;   // Environment
SQLHDBC   hdbc  = SQL_NULL_HDBC;   // Connection handle
SQLHSTMT  hstmt = SQL_NULL_HSTMT;  // Statement handle
SQLRETURN retcode;

SQLCHAR strLastName[]="Jones";
SQLINTEGER pSalary=25000;

SQLLEN lenLastName=0;

int main () {
    // Allocate environment
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    // Set ODBC Version
    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
                            (SQLPOINTER*)SQL_OV_ODBC3, 0);

    // Allocate Connection
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

    // Connect to DSN
    retcode = SQLConnect(hdbc, (SQLCHAR*) "MyDSN", SQL_NTS,
                         (SQLCHAR*) NULL, 0, NULL, 0);

    // Allocate Statement Handle
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

    // Bind Parameters to all fields
    retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR,
                               SQL_WVARCHAR, LASTNAME_LEN, 0, strLastName, LASTNAME_LEN,
                    &lenLastName);

    retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG,
                               SQL_INTEGER, 0, 0, &pSalary, 0, NULL);

    retcode = SQLPrepare(hstmt, (SQLCHAR*)"INSERT INTO [dbo].[EncryptedTable] ([LastName],[Salary]) VALUES (?,?)",
                               SQL_NTS);

    lenLastName=strlen((char*)strLastName);

    retcode = SQLExecute(hstmt);

exit:

    printf ("\nComplete.\n");

    // Free handles
    // Statement

    if (hstmt != SQL_NULL_HSTMT)
        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

    // Connection
    if (hdbc != SQL_NULL_HDBC) {
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    }

    // Environment
    if (henv != SQL_NULL_HENV)
        SQLFreeHandle(SQL_HANDLE_ENV, henv);

    return 0;
}

	

Ahora que las columnas están llenas, podemos usar isql para recuperar los datos:

$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016
SQL> select * from EncryptedTable
+----+----------+------------+
| ID | LastName | Salary     |
+----+----------+------------+
| 1  | Smith    | 25000      |
+----+----------+------------+

Teníamos el registro de controladores activado en nuestra fuente de datos. El siguiente extracto del registro del controlador muestra que:

  1. SQL Server proporciona el nombre del certificado como metainformación sobre la columna.
  2. Los datos de la columna se cifran en el extremo de SQL Server y, por lo tanto, permanecen cifrados en tránsito. El controlador ODBC de SQL Server en el cliente descifra los valores de columna y luego los devuelve en texto sin formato a la aplicación.
1.
M.S.S.Q.L._.C.E.
R.T.I.F.I.C.A.T.
E._.S.T.O.R.E.7.
C.u.r.r.e.n.t.U.
s.e.r./.m.y./.7.
2.8.8.1.8.C.5.F.
B.2.C.6.E.B.F.C.
2.5.3.D.B.C.1.2.
2.8.5.B.6.A.D.9.
4.8.9.0.8.3.E..R
.S.A._.O.A.E.P..
.....8.I.D......
...........@....
......L.a.s.t.N.
a.m.e........Q..
.....8....S.a.l.
a.r.y...........

2.
PKTDUMP:         Encrypted column
.);...'A..zs..I.
.N.]r..p.-..$...
.S;.].km6.....3c
r.OhR..j*.....fj
....ARN{V.F.....

DETAIL:  EVP_DecryptInit returns 1
DETAIL:  EVP_DecryptUpdate returns 1, 0
DETAIL:  EVP_DecryptUpdate returns 1, 16
DETAIL:  EVP_DecryptFinal returns 1, 0
PKTDUMP:         data

S.m.i.t.h.

Ver también

  • Uso de datos protegidos con Azure Key Vault desde Linux
  • Uso de datos protegidos con un almacén de claves personalizado de Linux