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:
- Crear una auditoría
y defina el destino.
- 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.
- Habilitar la auditoría.
- 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