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
|