Compartilhar via


Conecte-se ao Banco de Dados do Azure para MySQL – Servidor Flexível com conexões criptografadas

APLICA-SE A: Banco de Dados do Azure para MySQL – Servidor flexível

O servidor flexível do Banco de Dados do Azure para MySQL dá suporte à conexão de seus aplicativos cliente à instância de servidor flexível do Banco de Dados do Azure para MySQL usando o protocolo SSL com criptografia TLS. O TLS é um protocolo padrão do setor que garante conexões de rede criptografadas entre o servidor de banco de dados e os aplicativos cliente, permitindo que você atenda aos requisitos de conformidade.

O servidor flexível do Banco de Dados do Azure para MySQL dá suporte a conexões criptografadas usando o protocolo TLS 1.2 por padrão e todas as conexões de entrada com TLS 1.0 e TLS 1.1 são negadas por padrão. A configuração de imposição de conexão criptografada ou de TLS em seu servidor flexível pode ser alterada conforme discutido neste artigo.

A seguir estão as diferentes configurações de configurações de SSL e TLS que você pode ter para sua instância de servidor flexível do Banco de Dados do Azure para MySQL:

Importante

De acordo com a Remoção do Suporte para os Protocolos TLS 1.0 e TLS 1.1, a partir do início de setembro de 2024, novos servidores não poderão mais usar o TLS 1.0 ou 1.1 e os servidores existentes não poderão fazer downgrade para essas versões. A partir de meados de setembro de 2024, iniciaremos uma atualização obrigatória de todos os servidores que atualmente usam o TLS 1.0 ou 1.1 para o TLS 1.2. Espera-se que esse processo de atualização seja concluído até o final de setembro de 2024. É altamente recomendável que os clientes garantam que seus aplicativos sejam totalmente compatíveis com o TLS 1.2 antes do final de setembro.

Cenário Configurações de parâmetro do servidor Descrição
Desabilitar a imposição de SSL require_secure_transport = OFF Se o aplicativo herdado não der suporte a conexões criptografadas ao servidor flexível do Banco de Dados do Azure para MySQL, você poderá desabilitar a imposição de conexões criptografadas à instância do servidor flexível do Banco de Dados do Azure para MySQL definindo require_secure_transport=OFF.
Impor o SSL com a versão do TLS < 1.2 (será preterido em setembro de 2024) require_secure_transport = ON e tls_version = TLS 1.0 or TLS 1.1 Se o seu aplicativo herdado der suporte a conexões criptografadas, mas exigir o TLS versão < 1.2, você poderá habilitar conexões criptografadas, mas configurar a sua instância de servidor flexível do Banco de Dados do Azure para MySQL para permitir conexões com a versão TLS (1.0 ou 1.1) compatível com o seu aplicativo. Compatível somente com a versão v5.7 do servidor flexível do Banco de Dados do Azure para MySQL.
Impor SSL com a versão do TLS = 1.2 (configuração padrão) require_secure_transport = ON e tls_version = TLS 1.2 Essa é a configuração recomendada e padrão para o servidor flexível do Banco de Dados do Azure para MySQL.
Impor SSL com a versão do TLS = 1.3 require_secure_transport = ON e tls_version = TLS 1.3 Essa configuração é útil e recomendada para desenvolvimento de novos aplicativos. Compatível somente com a versão v8.0 do servidor flexível do Banco de Dados do Azure para MySQL.

Observação

Não há suporte para alterações na criptografia do SSL Cipher no servidor flexível do Banco de Dados do Azure para MySQL. Os conjuntos de criptografia FIPS são impostos por padrão quando tls_version é definido como TLS versão 1.2. Para versões de TLS diferentes da versão 1.2, a codificação SSL é definida com as configurações padrão que vêm com a instalação da comunidade do MySQL.

Neste artigo, você aprenderá como:

  • Configurar sua instância do servidor flexível do Banco de Dados do Azure para MySQL
    • Com SSL desabilitado
    • Com o SSL aplicado com a versão do TLS
  • Conectar-se à instância de servidor flexível do Banco de Dados do Azure para MySQL usando a linha de comando do MySQL
    • Com conexões criptografadas desabilitadas
    • Com conexões criptografadas habilitadas
  • Verificar o status de criptografia para sua conexão
  • Conecte-se à instância de servidor flexível do Banco de Dados do Azure para MySQL com conexões criptografadas usando várias estruturas de aplicativo

Desabilitar a imposição de SSL na instância do servidor flexível do Banco de Dados do Azure para MySQL

Se o aplicativo cliente não der suporte a conexões criptografadas, você precisará desabilitar a imposição de conexões criptografadas em sua instância de servidor flexível do Banco de Dados do Azure para MySQL. Para desabilitar a imposição de conexões criptografadas, você precisará definir o parâmetro de servidor require_secure_transport como OFF, conforme mostrado na captura de tela, e salvar a configuração de parâmetro do servidor para que ele entre em vigor. require_secure_transport é um parâmetro de servidor dinâmico que entra em vigor imediatamente e não requer que a reinicialização do servidor entre em vigor.

Captura de tela mostrando como desabilitar o SSL com o servidor flexível do banco de dados do Azure para MySQL.

Conectar-se usando o cliente de linha de comando do MySQL com SSL desabilitado

O exemplo a seguir mostra como se conectar ao servidor usando a interface de linha de comando do MySQL. Use a --ssl-mode=DISABLED configuração cadeia de conexão para desabilitar a conexão TLS/SSL do cliente MySQL. Substitua os valores por um nome do servidor e uma senha que sejam reais.

 mysql.exe -h mydemoserver.mysql.database.azure.com -u myadmin -p --ssl-mode=DISABLED

Importante

A definição de require_secure_transport como OFF não significa que não há suporte para conexões criptografadas no lado do servidor. Se você definir require_secure_transport como OFF na instância do servidor flexível do Banco de Dados do Azure para MySQL, mas o cliente se conectar com a conexão criptografada, ele ainda será aceito. A conexão a seguir usando o cliente MySQL para uma instância de servidor flexível do Banco de Dados do Azure para MySQL configurada com require_secure_transport=OFF também funciona conforme mostrado abaixo.

 mysql.exe -h mydemoserver.mysql.database.azure.com -u myadmin -p --ssl-mode=REQUIRED
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.7.29-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show global variables like '%require_secure_transport%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| require_secure_transport | OFF |
+--------------------------+-------+
1 row in set (0.02 sec)

Em resumo, a configuração require_secure_transport=OFF relaxa a imposição de conexões criptografadas no servidor flexível do Banco de Dados do Azure para MySQL e permite conexões não criptografadas com o servidor do cliente, além das conexões criptografadas.

Impor SSL com a versão do TLS

Para definir versões do TLS em sua instância de servidor flexível do Banco de Dados do Azure para MySQL, você precisa definir o parâmetro do servidor *tls_version-. A configuração padrão do protocolo TLS é TLSv1.1.2. Se o aplicativo der suporte a conexões com o servidor MySQL com o SSL, mas exigir qualquer protocolo diferente do TLS 1.2, você precisará definir as versões do TLS no parâmetro do servidor. *tls_version- é um parâmetro de servidor estático que exige uma reinicialização do servidor para que o parâmetro entre em vigor. A seguir estão os protocolos com suporte para as versões disponíveis do servidor flexível do Banco de Dados do Azure para MySQL.

Versão do servidor flexível do Banco de Dados do Azure para MySQL Valores com suporte de tls_version Configuração padrão
MySQL 5.7 TLS 1.0, TLS 1.1 (será preterido em setembro de 2024) TLS 1.2 TLS 1.2
MySQL 8.0 TLS 1.2, TLS 1.3 TLS 1.2

Conectar-se usando um cliente de linha de comando cm TLS/SSL

Baixar o certificado SSL público

Para usar conexões criptografadas com seus aplicativos cliente, baixe o certificado SSL público que também está disponível no painel Rede do portal do Azure, conforme mostrado na captura de tela abaixo.

Captura de tela mostrando como baixar o certificado SSL público do portal do Azure.

Observação

É necessário baixar este certificado SSL para os servidores na nuvem do Azure Governamental.

Salve o arquivo do certificado em seu local de preferência. Por exemplo, este tutorial usa c:\ssl ou \var\www\html\bin em seu ambiente local ou o ambiente do cliente onde seu aplicativo está hospedado. Isso permite que os aplicativos se conectem com segurança ao banco de dados por meio do SSL.

Se você criou sua instância de servidor flexível do Banco de Dados do Azure para MySQL com Acesso privado (Integração da VNet), será necessário se conectar ao servidor a partir de um recurso dentro da mesma VNet que o seu servidor. Você pode criar uma máquina virtual e adicioná-la à VNet criada com sua instância de servidor flexível do Banco de Dados do Azure para MySQL.

Se você criou sua instância de servidor flexível do Banco de Dados do Azure para MySQL com Acesso público (endereços IP permitidos), é possível adicionar o seu endereço IP local à lista de regras de firewall em seu servidor.

Você pode escolher mysql.exe ou Workbench do MySQL--> para se conectar ao servidor do ambiente local.

O exemplo a seguir mostra como se conectar ao servidor usando a interface de linha de comando do MySQL. Use the --ssl-mode=REQUIRED configuração de cadeia de conexão para impor a verificação de certificado TLS/SSL. Passe o caminho do arquivo de certificado local para o parâmetro --ssl-ca. Substitua os valores por um nome do servidor e uma senha que sejam reais.

sudo apt-get install mysql-client
wget --no-check-certificate https://dl.cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem
mysql -h mydemoserver.mysql.database.azure.com -u mydemouser -p --ssl-mode=REQUIRED --ssl-ca=DigiCertGlobalRootCA.crt.pem

Observação

Confirme se o valor passado para --ssl-ca corresponde ao caminho do arquivo para o certificado que você salvou. Se você estiver se conectando ao Banco de Dados do Azure para MySQL – flexível com SSL e estiver usando uma opção para executar a verificação completa (sslmode=VERTIFY_IDENTITY) com o nome da entidade do certificado, use <servername>.mysql.database.azure.com na sua cadeia de conexão.

Se você tentar se conectar ao seu servidor com conexões não criptografadas, verá um erro ao indicar que as conexões que usam o transporte inseguro são proibidas de forma semelhante à seguinte:

ERROR 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.

Verifique a conexão TSL/SSL

Execute o comando de mysql status para verificar se você se conectou ao servidor MySQL usando o TLS/SSL:

mysql> status

Confirme que a conexão é criptografada revisando a saída, que deve mostrar a seguinte mensagem: SSL: a criptografia em uso é. Esse conjunto de codificação mostra um exemplo e, com base no cliente, você pode ver um conjunto de codificação diferente.

Como identificar os protocolos TLS configurados em seu servidor?

Você pode executar o comando SHOW GLOBAL VARIABLES LIKE 'tls_version'; e verifique o valor para entender o que todos os protocolos estão configurados.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Como localizar o protocolo TLS que está sendo usado pelos meus clientes para se conectar ao servidor?

Você pode executar o comando abaixo e observar tls_version para ver a sessão a fim de identificar a versão do TLS que é usada para se conectar.

SELECT sbt.variable_value AS tls_version,  t2.variable_value AS cipher,
processlist_user AS user, processlist_host AS host
FROM performance_schema.status_by_thread  AS sbt
JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id
JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id
WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher' ORDER BY tls_version;

Conecte-se à instância de servidor flexível do Banco de Dados do Azure para MySQL com conexões criptografadas usando várias estruturas de aplicativo

Cadeias de conexão previamente definidas na página "Cadeias de Conexão" disponível em seu servidor no portal do Azure incluem os parâmetros necessários para linguagens comuns a fim de se conectar ao seu servidor de banco de dados usando TSL/SSL. O parâmetro TLS/SSL varia de acordo com o conector. Por exemplo, "useSSL=true", "sslmode=required" ou "ssl_verify_cert=true" e outras variações.

Para estabelecer uma conexão criptografada com sua instância de servidor flexível do Banco de Dados do Azure para MySQL por meio do TLS/SSL do seu aplicativo, confira os seguintes exemplos de código:

WordPress

Baixe o certificado público SSL e adicione as linhas a seguir em wp-config. php após a linha // **MySQL settings - You can get this info from your web host** //.

//** Connect with SSL ** //
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
//** SSL CERT **//
define('MYSQL_SSL_CERT','/FULLPATH/on-client/to/DigiCertGlobalRootCA.crt.pem');

PHP

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/DigiCertGlobalRootCA.crt.pem", NULL, NULL);
mysqli_real_connect($conn, 'mydemoserver.mysql.database.azure.com', 'myadmin', 'yourpassword', 'quickstartdb', 3306, MYSQLI_CLIENT_SSL);
if (mysqli_connect_errno()) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}

PHP (usando PDO)

$options = array(
    PDO::MYSQL_ATTR_SSL_CA => '/var/www/html/DigiCertGlobalRootCA.crt.pem'
);
$db = new PDO('mysql:host=mydemoserver.mysql.database.azure.com;port=3306;dbname=databasename', 'myadmin', 'yourpassword', $options);

Python (MySQLConnector Python)

try:
    conn = mysql.connector.connect(user='myadmin',
                                   password='<password>',
                                   database='quickstartdb',
                                   host='mydemoserver.mysql.database.azure.com',
                                   ssl_ca='/var/www/html/DigiCertGlobalRootCA.crt.pem')
except mysql.connector.Error as err:
    print(err)

Python (PyMySQL)

conn = pymysql.connect(user='myadmin',
                       password='<password>',
                       database='quickstartdb',
                       host='mydemoserver.mysql.database.azure.com',
                       ssl={'ca': '/var/www/html/DigiCertGlobalRootCA.crt.pem'})

Django (PyMySQL)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'quickstartdb',
        'USER': 'myadmin',
        'PASSWORD': 'yourpassword',
        'HOST': 'mydemoserver.mysql.database.azure.com',
        'PORT': '3306',
        'OPTIONS': {
            'ssl': {'ca': '/var/www/html/DigiCertGlobalRootCA.crt.pem'}
        }
    }
}

Ruby

client = Mysql2::Client.new(
        :host     => 'mydemoserver.mysql.database.azure.com',
        :username => 'myadmin',
        :password => 'yourpassword',
        :database => 'quickstartdb',
        :sslca => '/var/www/html/DigiCertGlobalRootCA.crt.pem'
    )

Golang

rootCertPool := x509.NewCertPool()
pem, _ := ioutil.ReadFile("/var/www/html/DigiCertGlobalRootCA.crt.pem")
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
    log.Fatal("Failed to append PEM.")
}
mysql.RegisterTLSConfig("custom", &tls.Config{RootCAs: rootCertPool})
var connectionString string
connectionString = fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?allowNativePasswords=true&tls=custom",'myadmin' , 'yourpassword', 'mydemoserver.mysql.database.azure.com', 'quickstartdb')
db, _ := sql.Open("mysql", connectionString)

Java (conector do MySQL para Java)

# generate truststore and keystore in code

String importCert = " -import "+
    " -alias mysqlServerCACert "+
    " -file " + ssl_ca +
    " -keystore truststore "+
    " -trustcacerts " +
    " -storepass password -noprompt ";
String genKey = " -genkey -keyalg rsa " +
    " -alias mysqlClientCertificate -keystore keystore " +
    " -storepass password123 -keypass password " +
    " -dname CN=MS ";
sun.security.tools.keytool.Main.main(importCert.trim().split("\\s+"));
sun.security.tools.keytool.Main.main(genKey.trim().split("\\s+"));

# use the generated keystore and truststore

System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
System.setProperty("javax.net.ssl.trustStorePassword","password");

url = String.format("jdbc:mysql://%s/%s?serverTimezone=UTC&useSSL=true", 'mydemoserver.mysql.database.azure.com', 'quickstartdb');
properties.setProperty("user", 'myadmin');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

Java (conector do MariaDB para Java)

# generate truststore and keystore in code

String importCert = " -import "+
    " -alias mysqlServerCACert "+
    " -file " + ssl_ca +
    " -keystore truststore "+
    " -trustcacerts " +
    " -storepass password -noprompt ";
String genKey = " -genkey -keyalg rsa " +
    " -alias mysqlClientCertificate -keystore keystore " +
    " -storepass password123 -keypass password " +
    " -dname CN=MS ";
sun.security.tools.keytool.Main.main(importCert.trim().split("\\s+"));
sun.security.tools.keytool.Main.main(genKey.trim().split("\\s+"));

# use the generated keystore and truststore

System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
System.setProperty("javax.net.ssl.trustStorePassword","password");

url = String.format("jdbc:mariadb://%s/%s?useSSL=true&trustServerCertificate=true", 'mydemoserver.mysql.database.azure.com', 'quickstartdb');
properties.setProperty("user", 'myadmin');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

.NET (MySqlConnector)

var builder = new MySqlConnectionStringBuilder
{
    Server = "mydemoserver.mysql.database.azure.com",
    UserID = "myadmin",
    Password = "yourpassword",
    Database = "quickstartdb",
    SslMode = MySqlSslMode.VerifyCA,
    SslCa = "DigiCertGlobalRootCA.crt.pem",
};
using (var connection = new MySqlConnection(builder.ConnectionString))
{
    connection.Open();
}

Node.js

var fs = require('fs');
var mysql = require('mysql');
const serverCa = [fs.readFileSync("/var/www/html/DigiCertGlobalRootCA.crt.pem", "utf8")];
var conn=mysql.createConnection({
    host:"mydemoserver.mysql.database.azure.com",
    user:"myadmin",
    password:"yourpassword",
    database:"quickstartdb",
    port:3306,
    ssl: {
        rejectUnauthorized: true,
        ca: serverCa
    }
});
conn.connect(function(err) {
  if (err) throw err;
});

Próximas etapas