Criptografar conexões para o SQL Server no Linux
Aplica-se a: SQL Server – Linux
O SQL Server no Linux pode usar o protocolo TLS para criptografar os dados transmitidos por uma rede entre um aplicativo cliente e uma instância do SQL Server. O SQL Server é compatível com os mesmos protocolos TLS no Windows e no Linux: TLS 1.2, 1.1 e 1.0. No entanto, as etapas para configurar o TLS são específicas para o sistema operacional no qual o SQL Server está em execução.
Requisitos para certificados
Certifique-se de que seus certificados sigam estes requisitos:
A hora do sistema atual deve ser posterior à propriedade
Valid from
do certificado e anterior à propriedadeValid to
para do certificado.O certificado deve ser significativo para a autenticação do servidor. Isso requer que a propriedade
Enhanced Key Usage
do certificado especifiqueServer Authentication (1.3.6.1.5.5.7.3.1)
.O certificado deve ser criado usando a opção
KeySpec
deAT_KEYEXCHANGE
. Normalmente, a propriedade de uso de chave do certificado (KEY_USAGE
) também inclui a codificação de chaves (CERT_KEY_ENCIPHERMENT_KEY_USAGE
).A propriedade
Subject
do certificado deve indicar que o nome comum (CN) é igual ao nome do host ou ao nome de domínio totalmente qualificado (FQDN) do computador servidor.Observação
Há suporte para certificados curinga.
Como configurar bibliotecas OpenSSL para uso (opcional)
Você pode criar links simbólicos no diretório /opt/mssql/lib/
que fazem referência a quais bibliotecas libcrypto.so
e libssl.so
devem ser usadas para criptografia. Isso será útil se você quiser forçar o SQL Server a usar uma versão específica do OpenSSL diferente da versão padrão fornecida pelo sistema. Se esses links simbólicos não estiverem presentes, o SQL Server carregará as bibliotecas do OpenSSL padrão configuradas no sistema.
Esses links simbólicos devem se chamar libcrypto.so
e libssl.so
e ser colocados no diretório /opt/mssql/lib/
.
Observação
Para obter um exemplo de como usar o Let's Encrypt para gerar um certificado, consulte a postagem no blog Desbloquear o poder dos dados no Azure com o SQL Server no Linux, VMs do Azure e pesquisa de IA do Azure.
Visão geral
O TLS é usado para criptografar conexões de um aplicativo cliente para o SQL Server. Quando configurado corretamente, o TLS fornece privacidade e integridade de dados para comunicações entre o cliente e o servidor. As conexões TLS podem ser iniciadas pelo cliente ou iniciadas pelo servidor.
A seção a seguir descreve a configuração da criptografia iniciada pelo cliente.
Gerar certificado
/CN
deve corresponder ao nome de domínio totalmente qualificado do host do SQL Server.
Cuidado
Este exemplo usa um certificado autoassinado. Os certificados autoassinados não devem ser usados para cenários de produção. Você deve usar certificados de autoridade de certificação.
Verifique se as pastas em que você salva os seus certificados e as suas chaves privadas podem ser acessadas pelo usuário/grupo mssql
e têm a permissão definida como 700
(drwx-----
). É possível criar pastas manualmente que tenham a permissão definida como 700
(drwx------
) e pertençam ao usuário/grupo mssql
ou que tenham a permissão definida como 755
(drwxr-xr-x
) e pertençam a outro usuário, mas ainda sejam acessíveis ao usuário/grupo mssql
. Por exemplo, você pode criar uma pasta chamada sslcert
no caminho /var/opt/mssql/
e salvar o certificado e a chave privada com as permissões nos arquivos definidas como 600
, conforme mostrado no exemplo a seguir.
openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=mssql.contoso.com' -keyout mssql.key -out mssql.pem -days 365
sudo chown mssql:mssql mssql.pem mssql.key
sudo chmod 600 mssql.pem mssql.key
#Saving the certificate to the certs folder under /etc/ssl/ which has the following permission 755(drwxr-xr-x)
sudo mv mssql.pem /etc/ssl/certs/ drwxr-xr-x
#Saving the private key to the private folder under /etc/ssl/ with permissions set to 755(drwxr-xr-x)
sudo mv mssql.key /etc/ssl/private/
Configurar o SQL Server
systemctl stop mssql-server
sudo cat /var/opt/mssql/mssql.conf
sudo /opt/mssql/bin/mssql-conf set network.tlscert /etc/ssl/certs/mssql.pem
sudo /opt/mssql/bin/mssql-conf set network.tlskey /etc/ssl/private/mssql.key
sudo /opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2
sudo /opt/mssql/bin/mssql-conf set network.forceencryption 0
systemctl restart mssql-server
Registrar o certificado no computador cliente (Windows, Linux ou macOS)
Se você estiver usando um certificado assinado por AC, precisará copiar o certificado de Autoridade de Certificação (AC), em vez do certificado do usuário para o computador cliente.
Se você estiver usando o certificado autoassinado, copie o arquivo
.pem
para as pastas a seguir respectivas à distribuição e execute os comandos para habilitá-lo:Ubuntu: copie o certificado para
/usr/share/ca-certificates/
, renomeie sua extensão para.crt
e usedpkg-reconfigure ca-certificates
para habilitá-lo como o Certificado de Autoridade de Certificação do sistema.RHEL: copie o certificado para
/etc/pki/ca-trust/source/anchors/
e useupdate-ca-trust
para habilitá-lo como Certificado de Autoridade de Certificação do sistema.SUSE: copie o certificado para
/usr/share/pki/trust/anchors/
e useupdate-ca-certificates
para habilitá-lo como Certificado de Autoridade de Certificação do sistema.Windows: importe o arquivo
.pem
como um certificado em Usuário Atual > Autoridades de Certificação Raiz Confiáveis > Certificados.macOS:
Copie os dados do certificado para
/usr/local/etc/openssl/certs
.Execute o seguinte comando para obter o valor de hash:
/usr/local/Cellar/openssl/1.0.2l/openssl x509 -hash -in mssql.pem -noout
Altere o nome do certificado para o valor. Por exemplo:
mv mssql.pem dc2dd900.0
. Verifique sedc2dd900.0
está em/usr/local/etc/openssl/certs
.
Cadeias de conexão de exemplo
Cuidado
Sempre use uma senha forte. Para obter mais informações, consulte Password Policy.
SQL Server Management Studio
sqlcmd
sqlcmd -S <sqlhostname> -N -U sa -P '<password>'
ADO.NET
"Encrypt=True; TrustServerCertificate=False;"
ODBC
"Encrypt=Yes; TrustServerCertificate=no;"
JDBC
"encrypt=true; trustServerCertificate=false;"
Erros de conexão comuns
Mensagem de erro | Fix |
---|---|
The certificate chain was issued by an authority that is not trusted. |
Esse erro ocorre quando os clientes não conseguem verificar a assinatura no certificado apresentado por SQL Server durante o handshake de TLS. Verifique se o cliente confia no certificado do SQL Server diretamente ou na AC que assinou o certificado do SQL Server. |
The target principal name is incorrect. |
Verifique se o campo nome comum no certificado do SQL Server corresponde ao nome do servidor especificado na cadeia de conexão do cliente. |
An existing connection was forcibly closed by the remote host. |
Esse erro pode ocorrer quando o cliente não é compatível com a versão do protocolo TLS exigida pelo SQL Server. Por exemplo, se SQL Server estiver configurado para exigir o TLS 1.2, verifique se os clientes também são compatíveis com o protocolo TLS 1.2. |
Ubuntu 20.04 e outras versões de distribuição recentes do Linux
Sintoma
Quando um SQL Server em uma instância do Linux carrega um certificado que foi criado com um algoritmo de assinatura usando menos de 112 bits de segurança (exemplos: MD5, SHA-1), você pode observar um erro de falha de conexão, como neste exemplo:
Uma conexão com o servidor foi estabelecida com êxito, mas ocorreu um erro durante o processo de logon. (provedor: Provedor SSL, erro: 0 – Uma conexão existente foi fechada à força pelo host remoto) (Microsoft SQL Server, Erro: 10054)
O erro ocorre porque o nível de segurança 2 do OpenSSL está habilitado por padrão no Ubuntu 20.04 e versões posteriores. O nível de segurança 2 proíbe que conexões TLS com menos de 112 bits de segurança sejam estabelecidas.
Solução
Instale um certificado com um algoritmo de assinatura usando pelo menos 112 bits de segurança. Os algoritmos de assinatura que atendem a esse requisito incluem SHA-224, SHA-256, SHA-384 e SHA-512.