AndersonPatricio.org v4
Gerenciando Administradores do Exchange com o Exchange Management Shell

AP319 - Segurança de Dados no SQL Server 2005

Autor: Alexandre Lopes
Publicação: 09/03/2008
Compartilhe este artigo: Bookmark and Share

Overview

Neste artigo irei demonstrar uma característica nova do SQL Server 2005: O armazenamento dos dados de forma segura. Tenho notado que os IT Pros e Developers possuem muitas dúvidas sobre esse tema e irei demonstrar como é extremamente simples e seguro. No SQL Server 2005 não se faz mais necessário utilizar soluções de terceiros para encriptar/decriptar dados.

Solução

Infra-Estrutura de segurança
O SQL Server 2005 fornece uma infra-estrutura para encriptação de dados, um nivel de segurança não existente em versões anteriores do SQL Server. Essa nova característica encontra-se disponivel em todas as edições do produto (Express, Standard, Workgroup, Developer e Datacenter). 

Voce pode encriptar dados utilizando chaves simétrica ou assimétrica e certificados. Encriptação de dados é uma nova feature bastante bem vinda pela comunidade que anteriormente, era obrigada a recorrer a software de terceiros ou desenvolver suas próprias stored procedures para encriptar e decriptar os dados. O lado negativo, fica para o alto impacto na performance, devido ao 'overhead' no processo. 

Essa nova feature do SQL Server 2005 trabalha baseado no "service master key" que é uma chave simétrica gerada automáticamente quando a instancia do SQL Server é instalada (instancias default e nomeadas). Ela só pode ser aberta pelo usuário que inicializou o serviço do SQL Server. 

O "engine" do banco de dados utiliza a "service master key" para encriptar senhas no linked server, string de conexões, contas de usuários e a "master key" dos bancos de dados. 

Existe a possibilidade de ter um backup da "service master key" ? Sim, voce pode gerenciar o backup e restore usando as seguintes linhas de código: 

BACKUP SERVICE MASTER KEY TO FILE = ENCRYPTION BY PASSWORD = 'password' 

RESTORE SERVICE MASTER KEY FROM FILE = DECRYPTION BY PASSWORD = 'password'

 Para recriar a chave: 

ALTER SERVICE MASTER KEY REGENERATE

 Lembrando sempre que apenas o SA ou usuários com permissão de sysadmin podem utilizar as linhas de código acima. É extremamente recomendável realizar um backup em mídia e envia-lo para local seguro. 

Como se trata de uma hierarquia de chaves de encriptação, o próximo nível é o "database master key" que, como o próprio nome diz, trabalha a nivel de banco de dados. Voce pode criar uma chave simetrica no nivel do banco de dados para encriptar certificados e chaves. O 'database master key' é criando usando a seguinte linha de código (atente para o fato de estar posicionado no banco de dados no qual deseja trabalhar com os dados encriptados): 

USE ADVENTUREWORKS 

GO 

CREATE MASTER KEY ENCRYPTION BY PASSWORD = ´password´

O armazenamento do 'database master key' é realizado no banco de dados master e a chave é encriptada usando o 'service master key'. A outra cópia é armazenada no banco de dados (no exemplo acima, em 'ADVENTUREWORKS'). 

Segurança à nível de dados

O próximo nivel na hierárquia, é a encriptação a nivel da dados, que fornece duas opções de encriptação: chave simétrica e chave assimétrica. Uma chave simétrica é um mecanismo de encriptação mais rápido para encriptar e decriptar dados. Voce pode utilizar chave simétrica para dados que são constantemente acessados. A linha de código abaixo é um exemplo de criação da chave simétrica: 

CREATE SYMMETRIC KEY WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = 'password'

 O uso da senha não é obrigatório e recomendado, imagine utilizar a linha de código acima em diversas aplicações? A senha ficaria exposta o que poderia causar vulnerabilidade. Utilizarei neste artigo apenas para repassar ao leitor todas as funcionalidades disponiveis e como utiliza-las. O algoritmo utilizado acima (AES_256) não é o unico, voce utilizar o DES e o TRIPLE_DES que fornecem uma chave mais "forte". Para maiores informações sobre algoritmos, consulte o books online do SQL Server 2005. 

A partir do momento que voce criou uma chave a nivel de dados, chegou o momento de encriptar e decriptar seus dados. Utiliza-se as funções EncryptByKey e DecryptByKey no caso de chave simétrica. 

A chave assimétrica é a combinação de uma chave privada com uma chave pública. É considerada muito mais "forte" que uma chave simétrica, mas por outro lado, consome mais recursos do sistema. A linha de código abaixo é um exemplo da criação de chave assimétrica: 

CREATE ASSYMETRIC KEY WITH ALGORITHM = RSA_2048 ENCRYPTION BY PASSWORD = ´password´

 Os algoritmos utilizados podem ser RSA_512, RSA_1024 e RSA_2048. Para encriptar e decriptar dados, utiliza-se as funções EncryptByAsmKey e DecryptByAsmKey. 

Certificado Digital
Certificado Digital é o mecanismo mais "forte" disponivel no SQL Server 2005. Um certificado de chave publica é assinado digitalmente e associado uma uma identidade de usuário, dispositivo ou serviço que armazena a chave privada. Ou seja, a chave publica, como o próprio nome informa é de conhecimento publico e serve para decriptar, a chave privada faz o inverso; decripta. Esse modelo é amplamente utilizado e segue as normas X.509. Por ser extremamente seguro, o impacto na performance também é sentida devido ao overhead quando se encripta e decripta os dados. A linha de código abaixo é um exemplo de criação do certificado:

CREATE CERTIFICATE WITH SUBJECT = 'subject_do_certificado'

Colocando em prática
Pois bem, iremos fazer o seguinte: Encriptar e decriptar uma coluna usando encriptação simétrica. Utilizando o banco de dados de exemplo do SQL Server (AdventureWorks) iremos adicionar uma coluna chamada "Comentarios" na tabela JobCandidates que utiliza o schema 'HumanResources'. O objetivo é manter os dados do campo "Comments" encriptados. Na prática, a coluna será encriptada usando chave simétrica protegida com certificado digital. 

Faremos os seguintes passos: 
1) Criar a infra-estrutura da chave, ou seja, a "database master key", criar o certificado e a chave simétrica; 
2) Encriptar os dados; 
3) Decriptar os dados.

Utilizaremos o SSMS (SQL Server Management Studio) para realizar nos estudos.  Digite o seguinte código para criar a "database master key":  

USE ADVENTUREWORKS

GO

CREATE MASTER KEY ENCRYPTION BY PASSOWRD = '1234567890'

GO

Crie o certificado que iremos utilizar para encriptar a chave simétrica:   

CREATE CERTIFICATE MeuCertificado

WITH SUBJECT = 'Comentarios do candidato'

GO

CREATE SYMMETRIC KEY ChaveComentario

WITH ALGORITHM = DES

ENCRYPTION BY CERTIFICATE MeuCertificado

GO 

 Até o momento, o passo 1 foi realizado com sucesso. Vamos agora encriptar e decriptar os dados. Mas antes precisamos incluir o campo 'Comentarios' na tabela JobCandidates:

ALTER TABLE HumanResources.JobCandidate

ADD Comentarios varbinary(4000)

GO 

O momento agora é crucial, e muitos IT Pros e Developers ficam na dúvida porque não conseguem encriptar seus dados. A solução é simples, antes de se utilizar as funções que citei acima para encriptar e decriptar, é necessário "abrir" a chave utilizando o certificado gerado acima.  

OPEN SYMMETRIC KEY ChaveComentario

DECRYPTION BY CERTIFICATE MeuCertificado

Agora sim iremos fazer uma atualização na coluna 'Comentários' utilizando a função de encriptação: 

UPDATE HumanResources.JobCandidate

SET Comentarios = EncryptByKey(Key_GUID(´ChaveComentario'), 'Esta informacao será encriptada e decriptada')

Consulte a tabela JobCandidate para ver a coluna 'Comentários' encriptada: 

SELECT JobCandidateID, Comentários FROM HumanResources.JobCandidate

Neste momento vem a seguinte pergunta: E agora? como faço para visualizar os dados da coluna 'Comentarios'? Para acessar os dados na coluna encriptada, precisamos decriptar a coluna, mas antes precisamos abrir novamente a chave simetrica usando o certificado:  

OPEN SYMMETRIC KEY ChaveComentario

DECRYPTION BY CERTIFICATE MeuCertificado

Consulte a tabela JobCandidate para ver a coluna 'Comentários' decriptada:

SELECT JobCandidateID, CONVERT(VARCHAR, DecryptByKey(Comentários))

FROM HumanResources.JobCandidate

 Podemos criar uma view para o código acima, tornando mais fácil a sua utilização:

CREATE VIEW vJobCandidate

AS

SELECT JobCandidateID, CONVERT(VARCHAR, DecryptByKey(Comentários))

FROM HumanResources.JobCandidate

 Desta forma, bastaria utilizar:

SELECT * FROM vJobCandidate



Conclusão

Com o SQL Server 2005, tornou-se prático e acessível a utilização de criptografia para tornar seguro os dados armazenados..

Comentários

Neste espaço você pode utilizar sua rede social preferida para adicionar dicas e/ou qualquer informação adicional para ajudar a comunidade relacionado a este Tutorial.

Suporte Tecnico



Clique aqui

Certificados Digitais



Saiba mais