CIFRANDO Y AUDITANDO SQL SERVER



Vamos a ir dando las bases de seguridad en base de datos centrándonos en esta serie en SQL Server para pasar posteriormente a otros motores de Bases de Datos para poder cubrir el mayor espectro posible de entornos en producción y minimizar las medidas reactivas frente a las preventvas.

CIFRANDO SQL SERVER

Antes de entrar en materia con las bondades de la criptografía y auditoría de base de datos, vamos a crearnos antes de nada alguna que otra cosa necesaria previamente en seguridad de base de datos cuando hablamos de SQL Server y hacerlo BIEN!!  .. Si no, como dice mi compañero Fran (@btshell) NO LO HAGAS.. ¡!

Asignación de Usuarios





Asignación Rol de Servidor






Creación de Inicio de Sesión







Creación de Rol






Elementos que pueden protegerse





Establecer protección





Estado de Inicio de Sesión





PERMISOS

Como se conceden permisos en un asegurable a una entidad de seguridad ?

GRANT { ALL [ PRIVILEGES ] }
| permission [ ( column [ ,...n ] ) ] [ ,...n ]
[ ON [ class :: ] securable ] TO principal [ ,...n ]
[ WITH GRANT OPTION ] [ AS principal ]

_ ALL : Esta opción no concede todos los permisos posibles.

-Si el asegurable es una base de datos, "ALL" significa BACKUP DATABASE, BACKUP LOG,CREATE DATABASE, CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE,CREATE RULE, CREATE TABLE y CREATE VIEW.

- Si es una función escalar, "ALL" significa EXECUTE y REFERENCES.

- Si es una función con valores de tabla, "ALL" se refiere a DELETE, INSERT, REFERENCES,SELECT y UPDATE.

- Si es un proc. almacenado, "ALL" significa DELETE, EXECUTE, INSERT, SELECT y UPDATE.

- Si es una tabla o vista, "ALL" significa DELETE, INSERT, REFERENCES, SELECT y UPDATE.

_ WITH GRANT OPTION: el usuario al que se le otorga permiso, puede a su vez, otorgárselo a otro.



CIFRANDO SQL SERVER

SQL Server cifra los datos con una infraestructura de cifrado jerárquico y administración de claves.




   Nivel de la jerarquía de cifrado cifra el nivel que tiene por debajo y muestra las configuraciones de cifrado más comunes.


La clave maestra de servicio y todas las claves maestras de base de datos son claves simétricas.


                                                                        Las flechas indican las jerarquías de cifrado comunes.


Pequeñas consideraciones sobre el cifrado..

_ Cifrado a nivel de columna

_ Cifrado transparente (TDE), afecta a toda la BD

_ ¿coste?

_ Mayor sobrecarga y puede afectar al rendimiento

_ Requiere una estrategia para la definición y mantenimiento de

claves, passwords y certificados

_ Evitar acceso a datos sensibles

_ Evitar robo de copias de seguridad con datos sensibles

_ ¿qué técnicas?

_ Por ello no debe considerarse para todos los datos y
Conexiones


              >Cifrado a nivel de columna

_ Mediante certificados, keys o frases

_ Requiere el uso de funciones específicas

_ EncrypByCert() – DecryptByCert()

_ EncrypyAsymkey() – DecryptByAsymKey()

_ Encrypykey() – DecryptBKey()

_ EncrypyPassphrase() – DecryptByPassphrase()

_ Cifratransparente (TDE), afecta a toda la BD

_ No protege las comunicaciones entre aplicación cliente y servidor

_ No cifra  FILESCREAM

_ No impide al DBA ver los datos

_ Puede caer el rendimiento si conviven BD TDE y sin encriptar



NO OLVIDAR QUE:

·         El cifrado seguro suele consumir más recursos de la CPU que un cifrado menos seguro.
·         Las claves largas suelen producir un cifrado más seguro que las claves cortas.
·         El cifrado asimétrico es más seguro que el simétrico con la misma longitud de clave, pero es relativamente lento.
·         Los cifrados en bloque con claves largas son más seguros que los cifrados en secuencia.
·         Las contraseñas largas y complejas son más seguras que las contraseñas cortas.
·         Si cifra una gran cantidad de datos, debe cifrar los datos con una clave simétrica y cifrar la clave simétrica con una clave asimétrica.
·         Los datos cifrados no se pueden comprimir, pero los datos comprimidos se pueden cifrar. Si utiliza compresión, debe comprimir los datos antes de cifrarlos.
·         Claves simétricas en lugar de certificados o claves asimétricas.
·         La clave maestra de servicio se cifra con la API de protección de datos de Windows (DPAPI).
·         EKM mantiene las claves simétricas o asimétricas fuera de SQL Server.
·         TDE debe utilizar una clave de cifrado de base de datos protegido o por un certificado o una clave asimétrica almacenada en una EKM.




AL LÍO.. Picando que es Gerundio


USE AdventureWorks2008R2;

--Si no existe la MasterKey la creamos

IF NOT EXISTS

(SELECT * FROM sys.symmetric_keys

      WHERE symmetric_key_id = 101)

CREATE MASTER KEY ENCRYPTION

     BY PASSWORD = 'Th15i$aS7riN&ofR@nD0m!T3%t'

SELECT  top 5 * FROM  Sales.CreditCard


/*






/*Crear la table cifrada  ‘creditCard_encrypt’  cambiando ‘CardNumber’  por ‘CardNumber_encrypt’*/


SELECT CreditCardID, CardType,
   
    CardNumber_encrypt = CONVERT(varbinary(256), CardNumber),

    ExpMonth, ExpYear, ModifiedDate

INTO Sales.CreditCard_encrypt

FROM Sales.CreditCard

WHERE 1=2

DECLARE @passphrase varchar(128)

SET @passphrase = 'los numeros de tarjeta de credito sin cifrar no son validos’

INSERT Sales.CreditCard_encrypt ( CardType, CardNumber_encrypt, ExpMonth,

ExpYear, ModifiedDate )


SELECT top 5 CardType,
    
     CardNumber_encrypt = EncryptByPassPhrase(@passphrase, CardNumber),
    
     ExpMonth, ExpYear, ModifiedDate


FROM Sales.CreditCard


SELECT  * from Sales.CreditCard_encrypt






DECLARE @passphrase varchar(128)

SET @passphrase = 'los numeros de tarjeta de credito sin cifrar no son validos'

SELECT CreditCardID,
   
    CardType,
    CardNumber = convert(nvarchar(25), DecryptByPassPhrase(@passphrase,

CardNumber_encrypt)),
   
    ExpMonth,
    ExpYear,

ModifiedDate

FROM Sales.CreditCard_encrypt

/*






Ejemplo Cifrar una columna utilizando una clave simétrica simple


USE AdventureWorks2008R2;

GO


--Si no existe MasterKey la creamos


IF NOT EXISTS
   
    (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
   
    CREATE MASTER KEY ENCRYPTION
   
    BY PASSWORD ='23987hxJKL969#ghf0%94467GRkjg5k3fd117r$$#1946kcj$n44nhdlj'

GO

CREATE CERTIFICATE RecursosHumanos10
  
     WITH SUBJECT = 'Numero de la Seguridad Social de Empleado';

GO

CREATE SYMMETRIC KEY SSN_Key_01
   
    WITH ALGORITHM = AES_256

    ENCRYPTION BY CERTIFICATE RecursosHumanos10;

GO

USE [AdventureWorks2008R2];

GO


-- Creamos una columna en la que almacenar los datos cifrados.



ALTER TABLE RecursosHumanos.Empleado
   
    ADD EncryptedNacionalIDNumero varbinary(128);

GO



-- Abrimos la clave simétrica con la que para cifrar los datos.



OPEN SYMMETRIC KEY SSN_Key_01
  
     DECRYPTION BY CERTIFICATE RecursosHumanos10;



-- Ciframos el valor en la columna "NacionalIDNumero con SSN_Key_01.
--Guardamos el resultado en la columna


EncryptedNacionalIDNumero.

UPDATE RecursosHumanos.Empleado

SET EncryptedNacionalIDNumero = EncryptByKey(Key_GUID('SSN_Key_01'), NacionalIDNumero);

GO



-- Verificamos siempre
-- En primer lugar, abrimos la clave simétricapara descifrar los datos.


OPEN SYMMETRIC KEY SSN_Key_01
  
    DECRYPTION BY CERTIFICATE RecursosHumanos10;

GO


-- Ahora listamos el ID original, el ID de cifrado, y el texto cifrado ‘descifrado’.

--Si el descifrado funciona, el ID original y el descifrado coincidirá.



SELECT NacionalIDNumero, EncryptedNacionalIDNumero
    
    AS 'Encrypted ID Numero',
   
    CONVERT(nvarchar, DecryptByKey(EncryptedNacionalIDNumero))

    AS 'Decrypted ID Numero'

    FROM RecursosHumanos.Empleado;

GO

 


CIFRADO Y CERTIFICADO


Evidentemente el cifrado no resuelve los problemas de control de acceso.

Sin embargo, mejora la seguridad debido a que limita la pérdida de datos, incluso en el caso poco probable de que se superen los controles de acceso.

Por ejemplo, si el equipo host de base de datos no está configurado correctamente y un usuario malintencionado obtiene datos confidenciales, como números de tarjetas de crédito, esa información robada podría resultar inservible si está cifrada.

Por ello, nos aliaremos con un ‘amigo’ muy útil en estos casos… Los certificados !! que  son "claves" de software que se comparten entre dos servidores que habilitan las comunicaciones seguras a través de una autenticación segura.


Cómo utilizar los certificados con SQL Server.


Para obtener información acerca de
Vea
Usar un certificado para establecer conexiones seguras
Crear un certificado para utilizarlo con SQL Server.
Usar un certificado con SQL Server Service Broker
Usar un certificado para la creación de reflejo de la base de datos




AUDITANDO SQL SERVER

Para la protección de datos y el cumplimiento de normativos y estándares ISO se debe, de manera obligatoria, pasar auditoría de TODO (lo que puedas o te dejen)

Puedes utilizar SQL Server Management Studio o Transact-SQL para definir una auditoría. 

Te recomiendo que aprendas primero ‘picando’ que ya tendrás tiempo de hacerlo todo gráficamente y así practicas SQL si no lo tienes muy pulido.

Una vez creada y habilitada la auditoría, el destino comenzará a recibir entradas.

Estas entradas pueden leerse en  los registros de eventos de Windows mediante la utilidad Visor de eventos en Windows.

Para los destinos de archivo, puede utilizar tanto el Visor del archivo de registros en SQL Server Management Studio como la función fn_get_audit_file para leer el archivo de destino.
 
 
fn_get_audit_file ( file_pattern, {default | initial_file_name | NULL }, {default | audit_file_offset | NULL } ) fn_get_audit_file 


El proceso general de creación y uso de una auditoría es el siguiente:


  1. Crear una auditoría y defina el destino.

  1. Crear una especificación de auditoría de servidor o una especificación de auditoría de base de datos que se asigne a la auditoría. Habilite la especificación de auditoría.

  1. Habilitar la auditoría.

  1. Leer los eventos de auditoría mediante el Visor de eventos de Windows, el Visor del archivo de registros o la función fn_get_audit_file.


 EJEMPLO


/* Creamos el objeto ‘SQL Server Audit’ y enviamos los resultados al registro de eventos de aplicación de Windows */


USE master;

CREATE SERVER AUDIT NEW_SQL_Server_Audit

      TO APPLICATION_LOG

      WITH ( QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE);



/* Creamos la base de datos de auditoría de objetos mediante un evento de auditoría */


USE AdventureWorks;

CREATE DATABASE AUDIT SPECIFICATION

NEW_Database_Audit_Specification

FOR SERVER AUDIT NEW_SQL_Server_Audit

      ADD (SELECT ON RecursosHumanos.Empleado BY dbo)

      WITH (STATE = ON);




 /*Habilitamos Auditoría. */


USE master;

ALTER SERVER AUDIT NEW_SQL_Server_AuditWITH (STATE = ON);



/* Testeamos si funciona*/


SELECT * FROM  RecursosHumanos.Empleado;



/* Deshabilitar la Auditoría. */


ALTER SERVER AUDIT NEW_SQL_Server_AuditWITH (STATE = OFF);


Fácil y rápido verdad ? Pues con esto ya tenemos otro escalón más en nuestro esquema de seguridad en bases de datos. Continuará…

Referencias:




Un saludo

Live Free Or Die Hacking


Entradas populares de este blog

Proteger ASP.NET de inyecciones SQL How T0? BEST PRACTICES

CERTIFICACIONES DE SEGURIDAD

HACKING MADRID_"EASY" XSS and Cross Site Tracing XST