O SQL Server 2016 inclui um recurso de segurança de banco de dados chamado Always Encrypted. Como adicionamos o suporte Always Encrypted ao driver ODBC do SQL Server, nossos clientes poderão aproveitar esse recurso.
O Always Encrypted protege os dados do SQL Server no ponto em que são mais suscetíveis a ataques:quando esses dados estão sendo usados. Por exemplo, durante transações e cálculos. Isso difere dos recursos de criptografia existentes do SQL Server, pois eles exigem que os dados sejam descriptografados antes que as operações possam ser executadas neles.
A chave de criptografia que protege as colunas Always Encrypted é armazenada no computador do aplicativo. Isso significa que o SQL Server não pode descriptografar os dados Always Encrypted. Se a máquina do SQL Server estiver comprometida, o invasor só poderá acessar os dados Always Encrypted na forma de cifra.
Para a maioria dos usuários, o recurso Always Encrypted será transparente, ou seja, eles são isolados do funcionamento do Always Encrypted e não precisam alterar o que estão fazendo para se beneficiar do recurso.
No final do aplicativo, a criptografia é feita pelo driver de software que fornece a interface do cliente para o SQL Server. No Linux e UNIX, este é um driver ODBC, que criptografa ou descriptografa dados de forma transparente, dependendo da direção da viagem. No caso do driver Easysoft, Always Encrypted é habilitado definindo um parâmetro de cadeia de conexão.
Como as pessoas estão cada vez mais preocupadas com a segurança de seus dados na nuvem, o Always Encrypted estará disponível no Azure SQL, a versão paga conforme o uso baseada em nuvem do SQL Server. O driver ODBC da Easysoft para Azure SQL também dará suporte ao Always Encrypted, portanto.
Passo a passo:trabalhando com dados de coluna Always Encrypted no Linux
O driver ODBC do SQL Server da Easysoft permite atualizar e consultar dados mantidos em colunas Always Encrypted.
Crie a tabela e gere as chaves de criptografia
Essas etapas são feitas na máquina do SQL Server.
- No SQL Server Management Studio 2016 CTP3 ou posterior, crie um novo banco de dados.
- No novo banco de dados, crie uma tabela que contenha uma ou mais colunas cujo conteúdo você deseja criptografar. Por exemplo:
CREATE TABLE dbo.EncryptedTable( ID INT IDENTITY(1,1) PRIMARY KEY, LastName NVARCHAR(32), Salary INT NOT NULL);
- Clique com o botão direito do mouse no banco de dados. No menu pop-up, escolha Tarefas> Criptografar colunas .
O Assistente Always Encrypted é iniciado.
- Na Seleção de colunas página, expanda as tabelas e selecione as colunas que você deseja criptografar.
- Escolha um tipo de criptografia para cada coluna.
Determinístico - sempre criptografa para o mesmo texto cifrado, permitindo que pesquisas de igualdade, junções e agrupamento por sejam realizadas.
Aleatório gera um valor de texto cifrado diferente para o mesmo texto simples, que é mais seguro, mas não oferece suporte a nenhuma operação.
- Escolha
CEK_Auto1 (New)
como a chave de criptografia para cada coluna, que é uma nova chave gerada automaticamente. Escolha Próximo . - Na página Configuração da chave mestra, aceite as configurações padrão:
Campo Valor Selecione a chave mestra da coluna Gerar automaticamente a chave mestra de coluna Selecione o provedor de armazenamento de chaves Repositório de certificados do Windows Selecione a chave mestra da coluna Usuário atual - Use o Próximo botão para prosseguir para o Resumo página. Escolha Concluir .
- Aguarde a conclusão do assistente e escolha Fechar .
Exportando os Certificados
Para transferir os certificados para a máquina Linux, primeiro você precisa exportá-los no Windows.
- Em uma janela de prompt de comando, digite
certmgr
, para iniciar o snap-in de certificados. - O novo certificado Always Encrypted estará disponível em Certificados - Usuário atual> Pessoal> Certificados .
- Clique com o botão direito do mouse no certificado (que será chamado de algo como
Always Encrypted Auto Certificate1
). No menu pop-up, escolha Todas as tarefas> Exportar .
O Assistente de exportação de certificados é iniciado. Escolha Próximo .
- Escolha Sim, exporte a chave privada .
- Aceite os padrões na página Exportar formato de arquivo. Escolha Próximo .
- Forneça uma senha quando solicitado. Escolha Próximo .
- Nomeie e salve o certificado quando solicitado. Por exemplo,
CMK_Auto1.pfx
. - Use o Próximo e Concluir botões para concluir o assistente.
Instalando os certificados no Linux
Transfira os certificados exportados para a máquina Linux da qual você deseja acessar as colunas Always Encrypted:
- Copie o certificado que você acabou de exportar para
~/ssl/private
na máquina Linux ou UNIX em que você instalou o driver ODBC do SQL Server.
~
é o diretório inicial do usuário que executará o aplicativo que se conecta ao SQL Server por meio do driver ODBC do Easysoft.~/ssl/private
é o local de onde a camada OpenSSL incorporada ao driver tentará carregar um certificado pessoal. Crie o diretório se ele não existir. Por exemplo:
$ mkdir -p ~/ssl/private$ cd ~/ssl/private$ mv /tmp/CMK_Auto1.pfx .
- Para usar o certificado com o driver ODBC do SQL Server, você precisa remover a senha que ele contém. Para fazer isso, o OpenSSL deve estar instalado na máquina. (Isso só é necessário para remover a senha, para outras operações, o driver ODBC do SQL Server usa uma camada interna do OpenSSL.) Remova a senha com os comandos a seguir. Quando a senha for solicitada após o segundo comando, pressione RETURN sem digitar nada. Isso definirá a senha como nada.
$ openssl pkcs12 -in CMK_Auto1.pfx -nodes -out temp.pemEnter Senha de importação:*******MAC verificado OK$ openssl pkcs12 -export -in temp.pem -out nopassphrase.p12Enter Senha de exportação:Verificando - Digite a senha de exportação:$
- Para carregar o certificado, o driver ODBC do SQL Server usa as informações meta que recebe do SQL Server sobre a coluna criptografada. O nome do certificado que o driver recebe do SQL Server está no formato
my/thumbprint
. Você precisa usar esta convenção de nomenclatura para o certificado. Use o OpenSSL para exibir a impressão digital do certificado e renomeie o certificado em um subdiretório chamado my:$ openssl x509 -in temp.pem -fingerprint -noout | tr -d ":"SHA1 Impressão digital=EFC1940E545941D6C05C763361403F55A5DEF0E8$ mkdir meu$ cp nopassphrase.p12 meu/EFC1940E545941D6C05C763361403F55A5DEF0E8$ ln -s meu
Observação Durante os testes, notamos que o SQL Server às vezes chamava o certificado deMy/thumbprint
. O link simbólico no exemplo acima contorna essa inconsistência.
Instalando o driver ODBC do SQL Server
O driver ODBC do SQL Server não apenas fornece a camada de conectividade entre o aplicativo e o SQL Server, mas também lida com a criptografia/descriptografia de dados armazenados em colunas Always Encrypted.
Instale e licencie o driver ODBC do SQL Server. Para obter instruções sobre como fazer isso, consulte a documentação do driver ODBC do SQL Server. Se seu aplicativo for de 64 bits, baixe a versão de 64 bits do driver ODBC. Caso contrário, use a versão de 32 bits do driver, independentemente da arquitetura do sistema operacional.
Uma fonte de dados ODBC contém as informações da cadeia de conexão que permitem que o driver ODBC do SQL Server se conecte à instância do SQL Server de destino. Em nossa máquina, as fontes de dados ODBC são armazenadas em
/etc/odbc.ini
. Esta extração de fonte de dados mostra as configurações relevantes para colunas Always Encrypted:[SQLSERVER_2016]Driver=Easysoft ODBC-SQL Server SSL # Deve usar a versão SSL de driverServer=machine\sqlserver_instanceDatabase=database_with_always_encrypted_dataUser=usuário # Pode ser um login do Windows ou SQL Server.Password=passwordTrusted_Connection=Yes # Defina como Não para um loginColumnEncryption=Habilitado do SQL Server # Para exibir dados Always Encrypted ou para # inserir em uma coluna Always Encrypted definida como Enabled
Observação Se sua conexão falhar com o erro "Falha na conexão SSL no syscall", seu sistema não possui um "dispositivo de aleatoriedade". Veja a
Entropy
atributo no manual do driver ODBC do SQL Server para obter informações sobre o que fazer sobre isso. Inserindo dados em uma coluna sempre criptografada
Agora, criamos uma tabela vazia com colunas Always Encrypted e configuramos nosso computador cliente Linux para que o driver ODBC do SQL Server possa funcionar com dados Always Encrypted. Em seguida, precisamos preencher a tabela com dados.
Para inserir dados em uma coluna Always Encrypted, um aplicativo deve:
- Use uma inserção parametrizada, ou seja, INSERT INTO EncryptedTable VALUES (?, ?).
Isso permite que o driver ODBC do SQL Server diferencie os valores da coluna (que ele precisa criptografar) e o texto da instrução SQL (que deve permanecer em texto simples; com Always Encrypted, lembre-se, o SQL Server não faz nenhuma descriptografia).
- Descreva explicitamente o tipo de dados dos parâmetros.
O SQL Server não fornece as informações necessárias sobre uma coluna Always Encrypted para o driver ODBC do SQL Server para descobrir o tipo de dados usandoSQLDescribeParam
.
Aqui está um exemplo Perl que mostra como fazer isso:
# Use Perl DBI / DBD:ODBC para inserir dados em colunas Always Encrypted.use strict;use warnings;use DBI;my $data_source =q/dbi:ODBC:SQLSERVER_2016/;my $h =DBI->connect( $data_source) ou die "Não é possível conectar a $data_source:$DBI::errstr";$h->{RaiseError} =1;my $s =$h->prepare(q/insert into EncryptedTable values(?, ?)/);my $lastname='Smith';my $salary=25000;# Defina o tipo de dados das colunas de destino.# Não é possível usar SQLDescribeParam com colunas Always Encrypted.$s->bind_param(1, $lastname, DBI ::SQL_WVARCHAR);$s->bind_param(2, $salário, DBI::SQL_INTEGER);$s->execute($sobrenome,$salário);$h->desconectar;
Aqui está um exemplo C que mostra como fazer isso:
#include#include #include #include #include #include #include #define LASTNAME_LEN 6SQLHENV henv =SQL_NULL_HENV; // AmbienteSQLHDBC hdbc =SQL_NULL_HDBC; // Handle de conexãoSQLHSTMT hstmt =SQL_NULL_HSTMT; // Instrução handleSQLRETURN retcode;SQLCHAR strLastName[]="Jones";SQLINTEGER pSalary=25000;SQLLEN lenLastName=0;int main () { // Alocar ambiente retcode =SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); // Definir retcode da versão ODBC =SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); // Alocar retcode de conexão =SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); // Conectar ao DSN retcode =SQLConnect(hdbc, (SQLCHAR*) "MyDSN", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0); // Alocar identificador de instrução retcode =SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); // Associa parâmetros a todos os campos retcode =SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_WVARCHAR, LASTNAME_LEN, 0, strLastName, LASTNAME_LEN, &lenLastName); retcode =SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &pSalary, 0, NULL); retcode =SQLPrepare(hstmt, (SQLCHAR*)"INSERT INTO [dbo].[EncryptedTable] ([LastName],[Salary]) VALUES (?,?)", SQL_NTS); lenLastName=strlen((char*)strLastName); retcode =SQLExecute(hstmt);exit:printf ("\nCompleto.\n"); // Manipuladores livres // Instrução if (hstmt !=SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hstmt); // Conexão if (hdbc !=SQL_NULL_HDBC) { SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } // Ambiente if (henv !=SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0;}
Agora que as colunas estão preenchidas, podemos usar o isql para recuperar os dados:
$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016SQL> selecione * from EncryptedTable+----+----------+-------- ----+| ID | Sobrenome | Salário |+----+----------+----------------+| 1 | Smith | 25000 |+----+----------+------------+
Tínhamos o registro de driver ativado em nossa fonte de dados. O seguinte extrato do log do driver mostra que:
- O SQL Server fornece o nome do certificado como metainformações sobre a coluna.
- Os dados da coluna são criptografados no final do SQL Server e, portanto, permanecem criptografados em trânsito. O driver ODBC do SQL Server no cliente descriptografa os valores da coluna e os retorna em texto simples para o aplicativo.
1. M.S.S.Q.L._.C.E.R.T.I.F.I.C.A.T.E._.S.T.O.R.E.7.C.u.r.r.e.n.t.U.s.e.r./.m.y./.7.2.8.8.1.8.C.5.F.B.2.C.6.E.B.F.C.2.5.3.D.B.C.91.2.C.6.E.B.F.C.2.5.3.D.B.C.91.2. .8.9.0.8.3.E..R.S.A._.O.A.E.P.......8.I.D.................@......... L.a.s.t.N.a.m.e........Q......8....S.a.l.a.r.y...........2. PKTDUMP:Coluna criptografada.);...'A..zs..I..N.]r..p.-..$....S;.].km6.....3cr.OhR ..j*.....fj....ARN{V.F.....DETAIL:EVP_DecryptInit retorna 1DETAIL:EVP_DecryptUpdate retorna 1, 0DETAIL:EVP_DecryptUpdate retorna 1, 16DETAIL:EVP_DecryptFinal retorna 1, 0PKTDUMP:dataS.m.i.t.h.Veja também
- Usando dados protegidos com um Azure Key Vault do Linux
- Uso de dados protegidos com um armazenamento de chaves personalizado do Linux