quinta-feira, 4 de novembro de 2010

Criptografia Transparente de Dados - Final

Irei mostrar todos os testes que fiz ao desabilitar a TDE de um banco de dados.

Estou utilizando o  SQL Server 2008 Developer Edition com SP2, build 10.0.4000.

Vamos lá...

-- Desabilitando a criptografia do banco de dados   
ALTER DATABASE Criptografia
SET ENCRYPTION OFF
GO
Após executar este comando e desabilitar a TDE vamos executar a consulta:

SELECT DB_NAME(e.database_id) AS DatabaseName,
            e.encryption_state,
    CASE e.encryption_state
                WHEN 0 THEN 'No database encryption key present, no encryption'
                WHEN 1 THEN 'Unencrypted'
                WHEN 2 THEN 'Encryption in progress'
                WHEN 3 THEN 'Encrypted'
                WHEN 4 THEN 'Key change in progress'
                WHEN 5 THEN 'Decryption in progress'
    END AS encryption_state_desc,
   key_algorithm +'_'+ convert(nvarchar,key_length) [Algoritmo],
            c.name [Nome Certificado],
            set_date [Data Criptografia]
    FROM sys.dm_database_encryption_keys AS e
    LEFT JOIN master.sys.certificates AS c
    ON e.encryptor_thumbprint = c.thumbprint

Teremos o seguinte o resultado:


Vemos que a criptografia está desabilitada mas o banco de dados ainda está associado ao certificado, vamos então excluir então a chave de criptografia do banco:

USE Criptografia
GO
DROP DATABASE ENCRYPTION KEY
GO

Executando a consulta novamente veremos que somente o banco tempdb sairá no resultado:


Neste momento se reiniciarmos o serviço do SQL e executarmos a consulta não retornará nada.

Vamos agora desatachar o banco e tentar restaurar em outra instância usando o mesmo SQL Server 2008 Developer Edition com SP2, build 10.0.4000 só que sem nenhuma chave de criptografia ou certificado, teoricamente era para funcionar já que desabilitamos a TDE do banco, mas vamos ver o resultado.

--Desatachando o banco
USE master
GO   
sp_detach_db 'Criptografia'
GO

e agora vamos tentar atachar na outra instância:

EXEC sp_attach_db @dbname = 'Criptografia',
    @filename1 = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Criptografia.mdf',
    @filename2 = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Criptografia_Log.ldf'
GO

Teremos o seguinte retorno:

Msg 33111, Level 16, State 3, Line 1
Cannot find server certificate with thumbprint '0xAA16E63CE30B041330332FA87A4C37E82F8ABC33'.
Msg 1813, Level 16, State 2, Line 1
Could not open new database 'Criptografia'. CREATE DATABASE is aborted.


Neste momento eu não acreditei que não seria possível tirar a criptografia do banco, então fiz um backup da banco e tentei restaurar, tive o seguinte retorno:

Processed 256 pages for database 'Criptografia', file 'Criptografia' on file 1.
Processed 1 pages for database 'Criptografia', file 'Criptografia_log' on file 1.
Msg 33111, Level 16, State 3, Line 1
Cannot find server certificate with thumbprint '0xAA16E63CE30B041330332FA87A4C37E82F8ABC33'.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.


Após alguns dias pesquisando vi que no CU10 do SQL Server 2008 SP1 esse bug (Microsoft assumiu) foi corrigido. Decidi então fazer o teste.
Instalei o SQL Server 2008 SP1 com CU10, build 2799

Fiz os mesmos testes utilizando o SQL Server 2008 SP1 com CU10, build 2799 e realmente conseguir atachar e/ou restaurar o banco após desabilitar a criptografia TDE. Segundo a Microsoft o erro ocorria porque o arquivo .ldf do banco ficava com referências do certificado.

Agora como sabemos o SQL Server 2008 SP2 só inclui o CU1 até CU8, então aconselho que quando for usar TDE utilize o SQL Server 2008 SP1 com CU10 ou então espere mais um tempo até sair o SP3 (se sair, hehehe), agora a outra é opção é NUNCA perder o certificado, assim você pode levar o banco para qualquer servidor utilizando o certificado.

Abraços,
Rodrigo Figueiredo
figueiredo.rodrigo@hotmail.com

Um comentário:

  1. Rodrigo, tem noção do que acontece se você habilitar TDE em uma base que está em mirror? e log shipping?

    deve ser necessário criar o certificado no mirror/secondary antes de habilitar, mas será que funciona? vai dar erro?

    Grato,
    Gabriel

    ResponderExcluir