Ligar à Base de Dados do Azure para MySQL – Servidor Flexível com ligações encriptadas

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 flexível do servidor do Banco de Dados do Azure para MySQL usando SSL (Secure Sockets Layer) com criptografia TLS (Transport layer security). O TLS é um protocolo padrão da indústria que garante ligações de rede encriptadas entre o servidor de bases de dados e as aplicações cliente, o que lhe permite cumprir os requisitos de conformidade.

O servidor flexível do Banco de Dados do Azure para MySQL dá suporte a conexões criptografadas usando o Transport Layer Security (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 imposição de conexão criptografada ou a configuração da versão TLS em seu servidor flexível pode ser alterada conforme discutido neste artigo.

A seguir estão as diferentes 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:

Cenário Configurações de parâmetros do servidor Description
Desativar a imposição de SSL require_secure_transport = DESLIGADO Se seu aplicativo herdado não oferecer suporte a conexões criptografadas com o Banco de Dados do Azure para servidor flexível MySQL, você poderá desabilitar a imposição de conexões criptografadas à sua instância de servidor flexível do Banco de Dados do Azure para MySQL definindo require_secure_transport=OFF.
Impor SSL com TLS versão < 1.2 require_secure_transport = ON e tls_version = TLS 1.0 ou TLS 1.1 Se seu aplicativo herdado dá suporte a conexões criptografadas, mas requer TLS versão 1.2, você pode habilitar conexões criptografadas, mas configurar seu Banco de Dados do Azure para instância de servidor flexível MySQL para permitir conexões com a versão < TLS (1.0 ou 1.1) suportada pelo seu aplicativo. Suportado apenas com a Base de Dados do Azure para MySQL versão de servidor flexível v5.7
Impor SSL com TLS versão = 1.2 (configuração padrão) require_secure_transport = ON e tls_version = TLS 1.2 Esta é a configuração recomendada e padrão para o Banco de Dados do Azure para o servidor flexível MySQL.
Impor SSL com TLS versão = 1.3 require_secure_transport = ON e tls_version = TLS 1.3 Isso é útil e recomendado para o desenvolvimento de novas aplicações. Suportado apenas com a Base de Dados do Azure para MySQL, versão de servidor flexível v8.0

Nota

  • Não há suporte para alterações na Cifra SSL no Banco de Dados do Azure para o servidor flexível MySQL. Os pacotes de codificação FIPS são impostos por padrão quando tls_version está definido como TLS versão 1.2. Para versões TLS diferentes da versão 1.2, SSL Cipher é definido para as configurações padrão que vem com a instalação da comunidade MySQL.
  • As edições da comunidade de código aberto do MySQL a partir do lançamento das versões 8.0.26 e 5.7.35 do MySQL, os protocolos TLS 1.0 e TLS 1.1 foram preteridos. Esses protocolos lançados em 1996 e 2006, respectivamente para criptografar dados em movimento, são considerados fracos, desatualizados e vulneráveis a ameaças à segurança. Para obter mais informações, consulte Remoção do suporte para os protocolos TLS 1.0 e TLS 1.1. O servidor flexível do Banco de Dados do Azure para MySQL também deixa de oferecer suporte a versões TLS quando a comunidade interrompe o suporte ao protocolo, para se alinhar aos padrões de segurança modernos.

Neste artigo, vai aprender a:

  • Configurar seu Banco de Dados do Azure para instância de servidor flexível do MySQL
    • Com SSL desativado
    • Com SSL aplicado com a versão TLS
  • Conecte-se à sua instância de servidor flexível do Banco de Dados do Azure para MySQL usando a linha de comando mysql
    • Com ligações encriptadas desativadas
    • Com conexões criptografadas habilitadas
  • Verificar o estado da encriptação da sua ligação
  • Conecte-se à sua 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 em seu Banco de Dados do Azure para instância de servidor flexível do MySQL

Se seu aplicativo cliente não oferecer 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ê precisa definir require_secure_transport parâmetro do servidor como OFF, conforme mostrado na captura de tela, e salvar a configuração do 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 a reinicialização do servidor para entrar em vigor.

Screenshot showing how to disable SSL with Azure Database for MySQL flexible server.

Conecte-se usando o cliente de linha de comando mysql com SSL desativado

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

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

Importante

Definir o require_secure_transport como OFF não significa que conexões criptografadas não sejam suportadas no lado do servidor. Se você definir require_secure_transport como OFF na instância flexível do servidor do Banco de Dados do Azure para MySQL, mas se o cliente se conectar com a conexão criptografada, ela ainda será aceita. A seguinte conexão usando o cliente mysql com uma instância de servidor flexível do Banco de Dados do Azure para MySQL configurada com require_secure_transport=OFF também funciona como 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 Banco de Dados do Azure para o servidor flexível MySQL e permite conexões não criptografadas com o servidor a partir do cliente, além das conexões criptografadas.

Impor SSL com a versão TLS

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

Banco de Dados do Azure para versão flexível do servidor MySQL Valores suportados de tls_version Configuração padrão
MySQL 5.7 TLS 1.0, TLS 1.1, TLS 1.2 TLS 1.2
MySQL 8.0 TLS 1.2, TLS 1.3 TLS 1.2

Conecte-se usando o cliente de linha de comando mysql com TLS/SSL

Faça o download do certificado SSL público

Para usar conexões criptografadas com seus aplicativos cliente, você precisa baixar 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.

Screenshot showing how to download public SSL certificate from Azure portal.

Nota

Você deve baixar este certificado SSL para seus servidores na nuvem do Azure Government.

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

Se você criou sua instância de servidor flexível do Banco de Dados do Azure para MySQL com acesso privado (Integração VNet), precisará se conectar ao servidor a partir de um recurso dentro da mesma VNet que o 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), poderá adicionar seu endereço IP local à lista de regras de firewall em seu servidor.

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

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

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

Nota

Confirme que o valor transmitido a --ssl-ca corresponde ao caminho do ficheiro para o certificado que guardou. 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 do assunto do certificado, use <servername.mysql.database.azure.com> em sua cadeia de conexão.

Se você tentar se conectar ao servidor com conexões não criptografadas, verá um erro informando que as conexões que usam transporte inseguro são proibidas, semelhante a uma abaixo:

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

Verifique a conexão TLS/SSL

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

mysql> status

Confirme se a conexão está criptografada revisando a saída, que deve mostrar: SSL: Cifra em uso é. Esta suíte de codificação mostra um exemplo e, com base no cliente, você pode ver uma suíte de codificação diferente.

Como identificar os protocolos TLS configurados no 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 encontrar qual protocolo TLS está sendo usado por meus clientes para se conectar ao servidor?

Você pode executar o comando abaixo e examinar tls_version sessão para identificar qual versão TLS é 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 à sua instância de servidor flexível do Banco de Dados do Azure para MySQL com conexões criptografadas usando várias estruturas de aplicativo

As cadeias de conexão predefinidas na página "Cadeias de Conexão" disponíveis para seu servidor no portal do Azure incluem os parâmetros necessários para que idiomas comuns se conectem ao servidor de banco de dados usando TLS/SSL. O parâmetro TLS/SSL varia com base no 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 sobre TLS/SSL de seu aplicativo, consulte os seguintes exemplos de código:

WordPress

Faça o download do certificado público SSL e adicione as seguintes linhas 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 DOP)

$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='yourpassword',
                                   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='yourpassword',
                       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 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 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óximos passos