Segurança de Dados no SQL Server 2005 Por Alexandre Rodrigues Lopes Data de criação: 23/07/2007 Resumo O SQL Server 2005 fornece uma infra-estrutura para segurança de dados, uma característica não existente em versões anteriores. Disponivel em todas as edições (Express, Standard, Workgroup, Developer e Datacenter). Observação importante Este artigo técnico foi escrito por um membro da comunidade brasileira e não é um documento oficial Microsoft. A Microsoft Corporation e a Microsoft Brasil não fornecem quaisquer garantias, explícitas ou expressas, sobre o conteúdo deste documento, nem concorda necessariamente com opiniões pessoais dos colunistas, bem como não se responsabiliza por danos causados por procedimentos técnicos descritos nestas colunas. Coluna escrita por membro da comunidade TechNet - Página 1 de 6 Este artigo aplica-se aos seguintes produtos e tecnologias: SQL Server 2005 (Express, Standard, Workgroup, Developer e Datacenter). Introdução 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. 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 Coluna escrita por membro da comunidade TechNet - Página 2 de 6 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. Coluna escrita por membro da comunidade TechNet - Página 3 de 6 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' As funções utilizadas são EncryptByCert e DecryptByCert. 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 Coluna escrita por membro da comunidade TechNet - Página 4 de 6 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 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 Coluna escrita por membro da comunidade TechNet - Página 5 de 6 Links Relacionados http://www.microsoft.com/sql/default.mspx http://technet.microsoft.com/en-us/sqlserver/default.aspx http://msdn2.microsoft.com/pt-br/sql/default.aspx 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. Para completar o conteúdo deste artigo, recomendo enfáticamente a leitura no Books Online dos seguintes tópicos: BACKUP SERVICE MASTER KEY RESTORE SERVICE MASTER KEY ALTER SERVICE MASTER KEY CREATE MASTER KEY CREATE CERTIFICATE CREATE SYMMETRIC KEY OPEN SYMMETRIC KEY Alexandre Lopes atua como consultor especialista em SQL Server em projetos da Y2K-TI. Possui mais de 10 anos de experiência na área de TI, sendo certificado Microsoft com os títulos MCT, MCSE e MCDBA. Como instrutor MCT (Microsoft Certified Trainer) possui cerca de 4.200 horas ministrando treinamento oficial Microsoft. http://arodrigueslopes.spaces.live.com Coluna escrita por membro da comunidade TechNet - Página 6 de 6