Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server 2016:sempre criptografado


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.
  1. No SQL Server Management Studio 2016 CTP3 ou posterior, crie um novo banco de dados.
  2. 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);
  3. 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.
  4. Na Seleção de colunas página, expanda as tabelas e selecione as colunas que você deseja criptografar.
  5. 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.
  6. Escolha CEK_Auto1 (New) como a chave de criptografia para cada coluna, que é uma nova chave gerada automaticamente. Escolha Próximo .
  7. 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
  8. Use o Próximo botão para prosseguir para o Resumo página. Escolha Concluir .
  9. 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.
  1. Em uma janela de prompt de comando, digite certmgr , para iniciar o snap-in de certificados.
  2. O novo certificado Always Encrypted estará disponível em Certificados - Usuário atual> Pessoal> Certificados .
  3. 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 .
  4. Escolha Sim, exporte a chave privada .
  5. Aceite os padrões na página Exportar formato de arquivo. Escolha Próximo .
  6. Forneça uma senha quando solicitado. Escolha Próximo .
  7. Nomeie e salve o certificado quando solicitado. Por exemplo, CMK_Auto1.pfx .
  8. 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:
  1. 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 .
  2. 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:$
  3. 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 de My/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:
  1. 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).
  2. 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 usando SQLDescribeParam .

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:
  1. O SQL Server fornece o nome do certificado como metainformações sobre a coluna.
  2. 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