Compartilhar via


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.