INTRODUCCIÓN
En este artículo presentamos dos técnicas de cifrado de bases de datos en sql-server y cómo poner a buen recaudo todas las herramientas que utilicemos durante estos procesos.
En primer lugar, la encriptación simétrica es una técnica que nos permite cifrar ciertas partes de la base de datos. Es la técnica más oóptima sopesando criterios de rendimiento y seguridad.
En segundo lugar veremos el TDE (cifrado de datos transparente), que es una técnica que nos permite tener cifrada la información en las copias de seguridad sin ningún coste de rendimiento para la base de datos(de ahí que se le llame transparente).
Por último, os mostraré cómo se hacen copias de seguridad y restauración (en otro servidor si se desea) de las claves y los certificados que usamos para realizar las técnicas de cifrado.
ENCRIPTACIÓN CLAVE SIMETRICA
La encriptación simetrica utiliza la misma clave para encriptar y para desencriptar, las claves simetricas son mas pequeñas que las asimetricas, por lo que el proceso de cifrado/descifrado es mas rápido.
La encriptación simetrica permite obtener el máximo rendimiento de la BBDD respecto a certificados y claves asimétricas.
No podemos cifrar una base de datos completamente porque el rendimiento se reduciría drásticamente, la solución es cifrar las columnas que requieran mayor seguridad.
Esta técnica la podéis hacer servir también en la versión de SQL-Server 2005, sin embargo las otras técnicas que comento en este articulo sólo las podéis utilizar a partir de la versión 2008
1. Creamos la tabla tarjetas, donde contraseña será el valor que guardaremos cifrado, por eso lo definimos VARBINARY.
create table tarjetas
(id_tarjeta varchar(20),
numero varchar(16),
nombre varchar(50),
apellido varchar(50)
banco varchar(20),
codigo_seguridad varchar(3)
contraseña varbinary(80))
2. Creamos una clave simetrica llamada MICLAVESIMETRICA.
CREATE SYMMETRIC KEY MICLAVESIMETRICA WITH ALGORITHM = RC4
ENCRYPTION BY PASSWORD =’PASSWORDCHUNGO’
3. Activamos la clave simetrica
OPEN SYMMETRIC KEY MICLAVESIMETRICA DECRYPTION BY PASSWORD = ‘PASSWORDCHUNGO’
4. Insertamos un registro, introduciendo la contraseña cifrada con la orden ENCRYPTbykEY
INSERT INTO tarjetas(id_tarjeta,numero,contraseña)
VALUES(’17’,234567889,
ENCRYPTbykEY(KEY_GUID(‘MICLAVESIMETRICA’),’2345′))
5. Visualizamos el contenido de la tabla tarjetas, fijaros como el campo contraseña está cifrado.
select * from tarjetas
6. Con la orden DecryptByKey mostramos el contenido del campo contraseña desencriptado, lógicamente lo podemos ver porque está abierta la clave simetrica(y ahí le hemos dado el password)
SELECT contraseña,cast(DecryptByKey(contraseña) as varchar(20)) as [nombre desencriptado]
FROM tarjetas
7. Cerrar la clave simétrica, a partir de ahora no podremos visualizar la contraseña sin desencriptar, a no ser que la volvamos a abrir
CLOSE SYMMETRIC KEY MICLAVESIMETRICA
CIFRADO DE DATOS TRANSPARENTE(TDE)
- La encriptación de una BBDD entera tiene unos costes prohibitivos.
- Para impedir el robo de datos que residen en disco o copia de seguridad existe TDE(transparent data encryption)
- Proteger la base de datos del robo de medios físicos(discos, cintas)
- Es un cifrado en tiempo real que permiten que los contenidos al completo de una BBDD permanezcan encriptados en disco y en Backup sin tener impacto sobre las aplicaciones existentes.
- El que sea «transparente» significa no sólo que los clientes no son afectados y no se enteran, sino que es realizado en forma nativa por el motor de base de datos. Es una manera fácil de lograr cifrado sin tener que cambiar ni las aplicaciones cliente ni los objetos de base de datos.
- El TDE se realiza con la MASTER KEY de la base de datos master.
- Cada BBDD puede tener su propia MASTER KEY
Grafico sacado de la web: http://msdn.microsoft.com/es-es/library/bb934049.aspx
Ejemplo
BBDD: Empresa
Tabla: Altos_cargos
create table altos_cargos
(cif varchar(10),
nombre varchar(20),
apellido varchar(20),
sueldo int,
dietas int)
SELECT * FROM Altos_cargos
23465490J ELENA ORTEGA 3450000 800000
46564567Y ALBERTO MILIAN 1200000 234000
54367834U JUANJO BOTIN 4500000 456000
Hacemos una copia de seguridad
EMPRESA/Tareas/Copia de seguridad
Si abrimos el fichero empresa.bak con el block de notas podemos encontrar y leer los datos de la empresa(y muchos datos del sistema):
Encriptación TDE(pasos).
Los pasos 1 y 2 a nivel de servidor(en bbdd master), los pasos 3 y 4 a nivel de BBDD.
1.Crearemos una master key de BBDD en master(Hay una sola master key en un servidor)
USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD=’Passwordchunguisimo’
2. Creamos un certificado en master
USE master
GO
CREATE CERTIFICATE Alberto_certificado WITH SUBJECT =’Mi certificado para TDE’
3. Creamos una DATABASE ENCRYPTION KEY (DEK) para la base de datos empresa
USE EMPRESA
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM= AES_128
ENCRYPTION BY SERVER CERTIFICATE Alberto_certificado
4. Activar la encriptación para la base de datos empresa
ALTER DATABASE EMPRESA
SET ENCRYPTION ON
Ahora realizamos una nueva copia de seguridad (empresa_encriptada.bak)
Y abrimos el fichero con el block de notas, fijaros como el contenido cambia.Está encriptado y no podemos ver nada.
BACKUP Y RESTORE DE CLAVES Y CERTIFICADOS
Por último, debemos hacer una copia de seguridad de la clave maestra, del certificado y de la clave privada, para asegurar la recuperación de los datos.
- En caso de borrado o perdida; ya que si volviésemos a ejecutar las claves y contraseñas de nuevo, los valores internos de los certificados variarían.
- En caso de que quisiésemos restaurar una BBDD en otra instancia.
–Backup de master key
USE master
GO
OPEN MASTER KEY DECRYPTION BY PASSWORD = ‘Passwordchunguisimo’;
GO
BACKUP MASTER KEY TO FILE = ‘c:admon_bbddexportedmasterkey’
ENCRYPTION BY PASSWORD = ‘sd092735kjn$&adsg’;
‘sd092735kjn$&adsg’à Es la contraseña utilizada para cifrar la clave maestra en el archivo
–Backup del certificado
USE master
GO
BACKUP CERTIFICATE Alberto_certificado TO FILE = ‘C:admon_bbddservercert.cer’
WITH PRIVATE KEY(FILE = ‘C:admon_bbddservercert.key’,
ENCRYPTION BY PASSWORD =’pass_q_encripta_file_servert’)
RESTAURAR MASTER KEY
Suponer que durante la vida de la base de datos alguien cambia la master key de la tabla master o la borra
use master
drop certificate Alberto_certificado
drop MASTER KEY
Ahora intentamos restaurar la BBDD
¡¡HORROR!! Algo ha ocurrido con el certificado!!!
1. Restauramos la clave y el certificado.
–Clave (para el caso de TDE no es necesario restaurar la master key, puedes crear una nueva y restaurar el certificado, eso SÍ)
USE master
RESTORE MASTER KEY
FROM FILE = ‘c:admon_bbddexportedmasterkey’
DECRYPTION BY PASSWORD = ‘sd092735kjn$&adsg’
ENCRYPTION BY PASSWORD = ‘Passwordchunguisimo’;
–Certificado
OPEN MASTER KEY DECRYPTION BY PASSWORD = ‘Passwordchunguisimo’
GO
CREATE CERTIFICATE Alberto_certificado FROM FILE = ‘C:admon_bbddservercert.cer’
WITH PRIVATE KEY(FILE = ‘C:admon_bbddservercert.key’,
DECRYPTION BY PASSWORD =’pass_q_encripta_file_servert’)
–Y por último y muy importante, lanzamos la siguiente orden que lo que hace es aplicar el nuevo certificado sobre el contenido de la (nueva o no) base de datos
ALTER MASTER KEY
ADD ENCRYPTION BY SERVICE MASTER KEY
Si ahora restauráis el backup en la nueva base de datos veréis como funciona correctamente.