Forense SQL Server
Porque utilizar a Análise Forense
Como parte da Ciência digital Forense, a análise forense de banco de dados passou a ganhar proporções em meados de 2009. Incluída dentro da parte da computação forense, essa nova ramificação veem ganhado grande espaço dentro do mercado atualmente. Essa ciência consiste na análise e investigação de informações relacionais nas quais foram alteradas, modificados ou excluídas de seu estado normal.
Todo banco de dados contem metadados das informações, tendo isso a investigação forense parte dessa premisa. A análise dos metadados faz com que os dados alterados sejam analisados, sabendo assim quem, quando e em que data essa informação foi alterada / modificada.
Vamos supor o seguinte cenário.Uma empresa de vendas de produtos tem um valor de um produto modificado, fazendo assim com que a loja perca dinheiro. O valor não era para ser alterado, isso aconteceu porque alguém em algum momento invadiu o sistema e trocou esse valor. Depois do acontecido, como é possível identificar o causador desse problema? É nesse problema que a análise forense entra, descobrir o ocorrido do problema. Quando possuímos um banco de dados, possuímos dois arquivos principais .MDF (arquivo de dados) e .LDF (arquivo de Log). Com isso é evidente que o LOG guarda todas as informações que foram feitas dentro do banco de dados, e com isso podemos obter diversas informações do ocorrido.
Aplicação da Análise Forense em um Banco de Dados
Aplicando isso no banco de dados SQL Server vemos que:
Vamos realizar a criação de um banco de dados para exemplo.
CREATE DATABASE ForensicsSQLServerCSI
Quando realizamos a criação de um banco de dados, possúimos 3 tipos de recuperação.
FULL – É armazenado todas as modificações das informações no arquivo de LOG.
BULK – LOGGED – Mesmo que o modo de recuperação FULL, porém dependendo da inserção essas informações seram armazenadas em blocos no Log e não registro a registro, evitando assim grande tamanho do arquivo.
SIMPLE – Não é armazenado Log do banco de dados, logo após inserção da informação no arquivo de dados esse registro é retirado do log automaticamente.
Ou seja até agora temos 2 premissas para a verificação de uma informação alterada no banco de dados.
1 – Possuir acesso ao banco de dados.
2 – Estar com o banco de dados em modo de recupração FULL ou Bulk-Logged.
Logo após a criação do banco de dados iremos alterar o modo de recuparação do mesmo para FULL, para que assim seja possível realizar a análise do LOG.
ALTERDATABASE ForensicsSQLServerCSI
SET RECOVERY FULL
Porém quando realizamos a criação de um banco de dados e não realizamos o primeiro backup de LOG do mesmo o banco de dados permanece em um estado chamado de : TRUNCATE LOG ON CHECKPOINT.
Para que o banco possa armazenar os logs de tudo o que acontece, devemos realizar o backup do arquivo de Dados e de LOG.
BACKUP DATABASE ForensicsSQLServerCSI
TO DISK=‘C:\temp\ForensicsSQLServerCSI.BAK’
WITH INIT,COMPRESSION
BACKUP LOG ForensicsSQLServerCSI
TO DISK=‘C:\temp\ForensicsSQLServerCSI_Log.BAK’
WITH INIT,COMPRESSION
Agora iremos realizar a criação de uma tabela para testes e com isso iremos ver o que o Log nos gera de informação.
CREATE TABLE ClientesDepartamento
(
ID INTIDENTITY(1,1),
Nome VARCHAR(100)NOTNULL,
DataNascimento DATETIMENOTNULL,
Sexo CHAR(1)NOTNULL
)
Consultando o Log vemos que:
SELECT *
FROMsys.fn_dblog(NULL,NULL)
http://www.crazytechguys.com/wp-content/uploads/2012/08/image_thumb.png
O banco de dados realizou diversas operações para realizar a criação de uma simples tabela, mais o que seria isso:
Bem nese momento o SQL Server tem que realizar diversas operações como alterar páginas de controle, pedir permissão e criar a tabela, realizar o mapeamento das informações, realizar a inserção das informações e por final realizar o COMMIT da transação.
Log após isso, iremos realizar a inserção de um registro dentro dessa tabela.
INSERT INTO dbo.ClientesDepartamento
( Nome, DataNascimento, Sexo )
VALUES (‘Georgio Clay Silva’,’1944-12-01′,‘M’)
Procurando internamente essa informação no LOG…..
SELECT *
FROM sys.fn_dblog(NULL,NULL)
WHERE AllocUnitName =‘dbo.ClientesDepartamento’
http://www.crazytechguys.com/wp-content/uploads/2012/08/image_thumb1.png
Entendendo melhor esse bando de BIT…
***Current LSN ***= LSN (Log Sequence Number) = Esse número é a sequência do Log do banco de dados, esse LSN é usado para saber qual a sequencia do Log atual do banco de dados. Para cada registro cadastrado dentro do banco de dados esse ém identificado pelo LSN, além de ser o responsável pela construção correta de restores do banco de dados.
***Operation =
LOP_MODIFY_ROW = A página de PFS (Page Free Space) = Foi realizada uma alteração interna na página de controle do banco de dados.LOP_FORMAT_PAGE e LOP_MODIFY_ROW = Foi realizada uma formatação na IAM (Index Allocation Map) para que os registros possam ser inseridos.
LOP_FORMAT_PAGE = A tabela que será inserida será formatada para os dados serem inseridos.
LOP_INSERT_ROWS = Inserção dos registros.
TransactionID = ***ID da transação que realizou a inserção dos registros.
Realizando backup do LOG, limpamos a informações que estava no mesmo, por isso o backup do log de um banco de dados é tão importante.
BACKUP LOG ForensicsSQLServerCSI
TO DISK=‘C:\temp\ForensicsSQLServerCSI_Log.BAK’
WITH INIT,COMPRESSION
SELECT *
FROM sys.fn_dblog(NULL,NULL)
WHERE AllocUnitName =‘dbo.ClientesDepartamento’
http://www.crazytechguys.com/wp-content/uploads/2012/08/image_thumb2.png
INSERT INTO dbo.ClientesDepartamento
( Nome, DataNascimento, Sexo )
VALUES (‘Luan Moreno Medeiros Maciel’,’1988-07-20′,‘M’),
(‘Gabriel Farias Gomes’,’1980-01-10′,‘M’),
(‘Daniela Abreu da Silva’,’1999-01-10′,‘F’),
(‘Patrícia Albuquerque’,’1986-12-11′,‘F’)
SELECT *
FROM sys.fn_dblog(NULL,NULL)
WHERE AllocUnitName =‘dbo.ClientesDepartamento’
Inserindo mais dados vemos que:
http://www.crazytechguys.com/wp-content/uploads/2012/08/image_thumb3.png
Novos registros são colocados dentro do LOG, assim temos a rastreabilidade de todas as informações. Supondo a exclusão da tabela que acabamos de criar….
DROP TABLE ClientesDepartamento
SELECT [Transaction Name],*
FROMsys.fn_dblog(NULL,NULL)
WHERE [Transaction Name] =‘DROPOBJ’
http://www.crazytechguys.com/wp-content/uploads/2012/08/image_thumb4.png
Como já previamos, o LOG não nos esconde nada, temos o LSN atual do LOG, assim como a operação de EXCLUSÃO e o ID da transação. Indo mais internamente, e pegando o TRANSACTION ID vemos que:
SELECT TOP (1) [Lock Information]
FROM::fn_dblog(NULL,NULL)
WHERE [Transaction Id] =’0000:000002d9′
AND [Lock Information] LIKE‘%SCH_M OBJECT%’;
GO
HoBt 0:ACQUIRE_LOCK_SCH_M OBJECT: 18:2105058535:0
É nos mostrado as seguintes informações:
18: = Database ID (ForensicsSQLServerCSI)
245575913: = OBJECT ID (ClientesDepartamento)
Sendo assim temos a rastreabilidade completa do que ocorreu no banco de dados.