Crittografia delle connessioni a SQL Server in LinuxEncrypting Connections to SQL Server on Linux

QUESTO ARGOMENTO SI APPLICA A: noSQL Server Windows sìSQL Server Linux noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: noSQL Server Windows yesSQL Server Linux noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

SQL ServerSQL Serverin Linux possono usare Transport Layer Security (TLS) per crittografare i dati trasmessi in una rete tra un'applicazione client e un'istanza di SQL ServerSQL Server. on Linux can use Transport Layer Security (TLS) to encrypt data that is transmitted across a network between a client application and an instance of SQL ServerSQL Server. SQL ServerSQL Serversupporta gli stessi protocolli TLS in Windows e Linux: TLS 1.0, 1.1 e 1.2. supports the same TLS protocols on both Windows and Linux: TLS 1.2, 1.1, and 1.0. Tuttavia, i passaggi per configurare TLS sono specifici del sistema operativo in cui SQL ServerSQL Server è in esecuzione.However, the steps to configure TLS are specific to the operating system on which SQL ServerSQL Server is running.

Scenario tipicoTypical Scenario

TLS è utilizzato per crittografare le connessioni da un'applicazione client SQL ServerSQL Server.TLS is used to encrypt connections from a client application to SQL ServerSQL Server. Quando è configurato correttamente, TLS fornisce privacy e l'integrità dei dati per le comunicazioni tra client e il server.When configured correctly, TLS provides both privacy and data integrity for communications between the client and the server.
I passaggi seguenti viene descritto uno scenario tipico:The following steps describe a typical scenario:

  1. Amministratore del database genera una chiave privata e un certificato (CSR) richiesta di firma.Database administrator generates a private key and a certificate signing request (CSR). Nome comune del rappresentante del servizio deve corrispondere al nome di server che i client di specificare nella relativa stringa di connessione di SQL Server.The CSR's Common Name should match the server name that clients specify in their SQL Server connection string. Il nome comune è in genere il nome di dominio completo di SQL ServerSQL Server host.This Common Name is usually the fully qualified domain name of the SQL ServerSQL Server host. Per utilizzare lo stesso certificato per più server, è possibile utilizzare un carattere jolly nel nome comune (ad esempio, "*.contoso.com" anziché "node1.contoso.com").To use the same certificate for multiple servers, you can use a wildcard in the Common Name (for example, "*.contoso.com" instead of "node1.contoso.com").
  2. Il rappresentante del servizio viene inviato a un'autorità di certificazione (CA) per la firma.The CSR is sent to a certificate authority (CA) for signing. L'autorità di certificazione deve essere considerato attendibile da tutti i computer client che si connettono a SQL ServerSQL Server.The CA should be trusted by all client machines that connect to SQL ServerSQL Server. La CA restituisce un certificato firmato all'amministratore del database.The CA returns a signed certificate to the database administrator.
  3. Amministratore del database consente di configurare SQL ServerSQL Server per utilizzare la chiave privata e il certificato firmato per le connessioni TLS.Database administrator configures SQL ServerSQL Server to use the private key and the signed certificate for TLS connections.
  4. I client specifichino "Encrypt=True" e "TrustServerCertificate=False" nelle stringhe di connessione.Clients specify "Encrypt=True" and "TrustServerCertificate=False" in their connection strings. (I nomi di parametro specifici potrebbero essere diversi a seconda di quale driver è in uso).(The specific parameter names may be different depending on which driver is being used). Client ora tentativo di crittografare le connessioni a SQL Server e verificare la validità del certificato di SQL Server per impedire attacchi man-in-the-middle.Clients now attempt encrypt connections to SQL Server and check the validity of SQL Server's certificate to prevent man-in-the-middle attacks.

Configurazione del protocollo TLS su LinuxConfiguring TLS on Linux

Utilizzare mssql-conf a TLS per un'istanza di SQL ServerSQL Server su Linux.Use mssql-conf to configure TLS for an instance of SQL ServerSQL Server running on Linux. Sono supportate le seguenti opzioni:The following options are supported:

OpzioneOption DescriptionDescription
network.forceencryption Se è 1, quindi SQL ServerSQL Server forza tutte le connessioni da crittografare.If 1, then SQL ServerSQL Server forces all connections to be encrypted. Per impostazione predefinita, questa opzione è 0.By default, this option is 0.
network.tlscert Il percorso assoluto per il certificato di file che SQL ServerSQL Server utilizza per TLS.The absolute path to the certificate file that SQL ServerSQL Server uses for TLS. Esempio: /etc/ssl/certs/mssql.pem il file del certificato deve essere accessibile dall'account mssql.Example: /etc/ssl/certs/mssql.pem The certificate file must be accessible by the mssql account. Si consiglia di limitare l'accesso al file usando chown mssql:mssql <file>; chmod 400 <file>.Microsoft recommends restricting access to the file using chown mssql:mssql <file>; chmod 400 <file>.
network.tlskey Il percorso assoluto per la chiave privata del file che SQL ServerSQL Server utilizza per TLS.The absolute path to the private key file that SQL ServerSQL Server uses for TLS. Esempio: /etc/ssl/private/mssql.key il file del certificato deve essere accessibile dall'account mssql.Example: /etc/ssl/private/mssql.key The certificate file must be accessible by the mssql account. Si consiglia di limitare l'accesso al file usando chown mssql:mssql <file>; chmod 400 <file>.Microsoft recommends restricting access to the file using chown mssql:mssql <file>; chmod 400 <file>.
network.tlsprotocols Elenco delimitato da virgole di quali TLS sono consentiti i protocolli da SQL Server.A comma-separated list of which TLS protocols are allowed by SQL Server. SQL ServerSQL Servertenta sempre di negoziazione del protocollo consentito più attendibili. always attempts to negotiate the strongest allowed protocol. Se un client non supporta alcun protocollo consentito, SQL ServerSQL Server rifiuta il tentativo di connessione.If a client does not support any allowed protocol, SQL ServerSQL Server rejects the connection attempt. Per garantire la compatibilità, sono consentiti tutti i protocolli supportati per impostazione predefinita (1.2, 1.1, 1.0).For compatibility, all supported protocols are allowed by default (1.2, 1.1, 1.0). Se i client supportano TLS 1.2, si consiglia di consentire solo TLS 1.2.If your clients support TLS 1.2, Microsoft recommends allowing only TLS 1.2.
network.tlsciphers Specifica le crittografie consentite dal SQL ServerSQL Server per TLS.Specifies which ciphers are allowed by SQL ServerSQL Server for TLS. Questa stringa deve essere formattata formato di elenco di pacchetti di crittografia di OpenSSL.This string must be formatted per OpenSSL's cipher list format. In generale, non è necessario modificare questa opzione.In general, you should not need to change this option.
Per impostazione predefinita, sono consentite le crittografie seguenti:By default, the following ciphers are allowed:
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA

EsempioExample

Questo esempio viene utilizzato un certificato autofirmato.This example uses a self-signed certificate. Negli scenari di produzione normale, il certificato potrebbe essere firmato da un'autorità di certificazione considerata attendibile da tutti i client.In normal production scenarios, the certificate would be signed by a CA that is trusted by all clients.

Passaggio 1: Generare certificati e chiavi privateStep 1: Generate private key and certificate

Aprire un comando terminal nel computer Linux in cui SQL ServerSQL Server è in esecuzione.Open a command terminal on the Linux machine where SQL ServerSQL Server is running. Eseguire i comandi seguenti:Run the following commands:

  • Generare un certificato autofirmato.Generate a self-signed certificate. Verificare che il /CN coincide con il nome di dominio completo di SQL Server host.Make sure the /CN matches your SQL Server host fully-qualified domain name. Facoltativamente è possibile utilizzare caratteri jolly, ad esempio '/CN=*.contoso.com'.You may optionally use wildcards, for example '/CN=*.contoso.com'.

    openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=mssql.contoso.com' -keyout mssql.key -out mssql.pem -days 365 
    
  • Limitare l'accesso amssqlRestrict access to mssql

    sudo chown mssql:mssql mssql.pem mssql.key 
    sudo chmod 400 mssql.pem mssql.key 
    
  • Spostare in directory di sistema SSL (facoltativa)Move to system SSL directories (optional)

    sudo mv mssql.pem /etc/ssl/certs/ 
    sudo mv mssql.key /etc/ssl/private/ 
    

Passaggio 2: configurare SQL ServerSQL ServerStep 2: Configure SQL ServerSQL Server

Utilizzare mssql-conf configurare SQL ServerSQL Server per utilizzare il certificato e la chiave per TLS.Use mssql-conf to configure SQL ServerSQL Server to use the certificate and key for TLS. Per una maggiore sicurezza, è anche possibile impostare TLS 1.2 come l'unico protocollo consentito e forzare tutti i client utilizzino connessioni crittografate.For increased security, you can also set TLS 1.2 as the only allowed protocol and force all clients to use encrypted connections.

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 1 

Passaggio 3: riavviare SQL ServerSQL ServerStep 3: Restart SQL ServerSQL Server

SQL ServerSQL Serverdeve essere riavviato rendere effettive le modifiche. must be restarted for these changes to take effect.
sudo systemctl restart mssql-server

Passaggio 4: Copiare il certificato autofirmato per i computer clientStep 4: Copy self-signed certificate to client machines

Poiché in questo esempio utilizza un certificato autofirmato per il SQL ServerSQL Server host, il certificato (non la chiave privata) deve essere copiato e installato come certificato radice attendibile in tutti i computer client che si connettono a SQL ServerSQL Server.Because this example uses a certificate self-signed by the SQL ServerSQL Server host, the certificate (not the private key) must be copied and installed as a trusted root certificate on all client machines that connect to SQL ServerSQL Server. Se il certificato è firmato da un'autorità di certificazione che è già considerato attendibile da tutti i client, questo passaggio non è più necessario.If the certificate is signed by a CA that is already trusted by all clients, this step is not necessary.

Passaggio 5: Connessione dai client che utilizzano TLSStep 5: Connect from clients using TLS

Connettersi a SQL ServerSQL Server da un client con la crittografia attivata e TrustServerCertificate impostato su False nella stringa di connessione.Connect to SQL ServerSQL Server from a client with encryption enabled and TrustServerCertificate set to False in the connection string. Ecco alcuni esempi di come specificare questi parametri utilizzando diversi strumenti e driver.Here are a few examples of how to specify these parameters using different tools and drivers.

sqlcmdsqlcmd
sqlcmd -N -C -S mssql.contoso.com -U sa -P '<YourPassword>'

SQL Server Management StudioSQL Server Management Studio

Finestra di dialogo connessione SQL Server Management StudioSSMS connection dialog

ADO.NETADO.NET
"Encrypt=true; TrustServerCertificate=true;"

ODBCODBC
"Encrypt=yes; TrustServerCertificate=no;"

JDBCJDBC
"encrypt=true; trustServerCertificate=false;"

Errori di connessione comuniCommon connection errors

Messaggio di erroreError message FixFix
La catena di certificati è stato emesso da un'autorità di cui non è attendibile.The certificate chain was issued by an authority that is not trusted. Questo errore si verifica quando i client sono in grado di verificare la firma sul certificato presentato dal Server SQL durante l'handshake TLS.This error occurs when clients are unable to verify the signature on the certificate presented by SQL Server during the TLS handshake. Verificare che il client considera attendibile uno di SQL ServerSQL Server certificato direttamente oppure l'autorità di certificazione che ha firmato il certificato di SQL Server.Make sure the client trusts either the SQL ServerSQL Server certificate directly, or the CA which signed the SQL Server certificate.
Il nome dell'entità di destinazione non è corretto.The target principal name is incorrect. Assicurarsi che il campo nome comune nel certificato di SQL Server corrisponda al nome di server specificato nella stringa di connessione del client.Make sure that Common Name field on SQL Server's certificate matches the server name specified in the client's connection string.
Una connessione esistente chiusa forzatamente dall'host remoto.An existing connection was forcibly closed by the remote host. Questo errore può verificarsi quando il client non supporta la versione del protocollo TLS richiesta da SQL Server.This error can occur when the client doesn't support the TLS protocol version required by SQL Server. Ad esempio, se SQL ServerSQL Server è configurato per richiedere TLS 1.2, assicurarsi che i client supportano anche il protocollo TLS 1.2.For example, if SQL ServerSQL Server is configured to require TLS 1.2, make sure your clients also support the TLS 1.2 protocol.