Anslut till Azure Database for MySQL – flexibel server med krypterade anslutningar

GÄLLER FÖR: Azure Database for MySQL – flexibel server

Azure Database for MySQL – flexibel server stöder anslutning av klientprogram till Azure Database for MySQL – flexibel serverinstans med hjälp av SSL (Secure Sockets Layer) med TLS-kryptering (Transport Layer Security). TLS är ett branschstandardprotokoll som säkerställer krypterade nätverksanslutningar mellan databasservern och klientprogram, så att du kan följa efterlevnadskrav.

Azure Database for MySQL – flexibel server stöder krypterade anslutningar med transportnivåsäkerhet (TLS 1.2) som standard och alla inkommande anslutningar med TLS 1.0 och TLS 1.1 nekas som standard. Konfigurationen av krypterad anslutning eller TLS-version på den flexibla servern kan ändras enligt beskrivningen i den här artikeln.

Följande är de olika konfigurationerna av SSL- och TLS-inställningar som du kan ha för din flexibla Azure Database for MySQL-serverinstans:

Scenario Inställningar för serverparameter beskrivning
Inaktivera SSL-tillämpning require_secure_transport = AV Om ditt äldre program inte stöder krypterade anslutningar till azure database for MySQL – flexibel server kan du inaktivera tillämpningen av krypterade anslutningar till din flexibla Azure Database for MySQL-serverinstans genom att ange require_secure_transport=OFF.
Framtvinga SSL med TLS version < 1.2 require_secure_transport = ON och tls_version = TLS 1.0 eller TLS 1.1 Om ditt äldre program stöder krypterade anslutningar men kräver TLS version < 1.2 kan du aktivera krypterade anslutningar, men konfigurera din azure database for MySQL-instans för flexibel server så att anslutningar med TLS-versionen (1.0 eller 1.1) stöds av ditt program. Stöds endast med Azure Database for MySQL – flexibel serverversion v5.7
Framtvinga SSL med TLS-version = 1.2(standardkonfiguration) require_secure_transport = ON och tls_version = TLS 1.2 Detta är den rekommenderade och standardkonfigurationen för flexibel Azure Database for MySQL-server.
Framtvinga SSL med TLS-version = 1.3 require_secure_transport = ON och tls_version = TLS 1.3 Detta är användbart och rekommenderas för utveckling av nya program. Stöds endast med Azure Database for MySQL – flexibel serverversion v8.0

Kommentar

  • Ändringar i SSL-chiffer i Azure Database for MySQL – flexibel server stöds inte. FIPS-chiffersviter tillämpas som standard när tls_version är inställt på TLS version 1.2 . För andra TLS-versioner än version 1.2 är SSL-chiffer inställt på standardinställningar som medföljer installation av MySQL-communityn.
  • MySQL community-utgåvor med öppen källkod som börjar med versionen av MySQL-versionerna 8.0.26 och 5.7.35, TLS 1.0- och TLS 1.1-protokollen är inaktuella. Dessa protokoll som släpptes 1996 respektive 2006 för att kryptera data i rörelse anses vara svaga, inaktuella och sårbara för säkerhetshot. Mer information finns i Ta bort stöd för TLS 1.0- och TLS 1.1-protokollen. Azure Database for MySQL – flexibel server slutar också att stödja TLS-versioner när communityn stoppar stödet för protokollet för att anpassa sig till moderna säkerhetsstandarder.

I den här artikeln kan du se hur du:

  • Konfigurera en flexibel Azure Database for MySQL-serverinstans
    • Med SSL inaktiverat
    • Med SSL framtvingas med TLS-version
  • Anslut till din flexibla Azure Database for MySQL-serverinstans med hjälp av mysql-kommandoraden
    • Med krypterade anslutningar inaktiverade
    • Med krypterade anslutningar aktiverade
  • Verifiera krypteringsstatus för anslutningen
  • Anslut till din flexibla Azure Database for MySQL-serverinstans med krypterade anslutningar med olika programramverk

Inaktivera SSL-tillämpning på din flexibla Serverinstans för Azure Database for MySQL

Om klientprogrammet inte stöder krypterade anslutningar måste du inaktivera tvingande av krypterade anslutningar på din flexibla Azure Database for MySQL-serverinstans. Om du vill inaktivera tvingande av krypterade anslutningar måste du ställa in require_secure_transport serverparametern på AV enligt skärmbilden och spara konfigurationen av serverparametern så att den börjar gälla. require_secure_transport är en dynamisk serverparameter som börjar gälla omedelbart och inte kräver att serveromstarten börjar gälla.

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

Anslut med hjälp av mysql-kommandoradsklienten med SSL inaktiverat

I följande exempel visas hur du ansluter till servern med hjälp av kommandoradsgränssnittet mysql. Använd inställningen --ssl-mode=DISABLED anslutningssträng för att inaktivera TLS/SSL-anslutning från mysql-klienten. Ersätt värden med ditt faktiska servernamn och lösenord.

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

Viktigt!

Om du ställer in require_secure_transport på AV betyder det inte att krypterade anslutningar inte stöds på serversidan. Om du ställer in require_secure_transport till AV på azure database for MySQL flexibel serverinstans, men om klienten ansluter med den krypterade anslutningen godkänns den fortfarande. Följande anslutning med mysql-klienten till en flexibel Azure Database for MySQL-serverinstans som konfigurerats med require_secure_transport=OFF fungerar också enligt nedan.

 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)

Sammanfattningsvis require_secure_transport=OFF-inställningen minskar tillämpningen av krypterade anslutningar på en flexibel Azure Database for MySQL-server och tillåter okrypterade anslutningar till servern från klienten utöver de krypterade anslutningarna.

Framtvinga SSL med TLS-version

Om du vill ange TLS-versioner på din flexibla Azure Database for MySQL-serverinstans måste du ange *tls_version- serverparameter. Standardinställningen för TLS-protokollet är TLS 1.2. Om programmet stöder anslutningar till MySQL-servern med SSL, men kräver något annat protokoll än TLS 1.2, måste du ange TLS-versionerna i serverparametern. *tls_version – är en statisk serverparameter som kräver en omstart av servern för att parametern ska börja gälla. Följande är protokoll som stöds för de tillgängliga versionerna av Azure Database for MySQL – flexibel server.

Azure Database for MySQL – flexibel serverversion Värden som stöds för tls_version Standardinställningen
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

Anslut med hjälp av mysql-kommandoradsklienten med TLS/SSL

Ladda ned det offentliga SSL-certifikatet

Om du vill använda krypterade anslutningar med dina klientprogram måste du ladda ned det offentliga SSL-certifikatet, som också är tillgängligt i azure-portalens nätverksfönster enligt skärmbilden nedan.

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

Kommentar

Du måste ladda ned det här SSL-certifikatet för dina servrar i Azure Government-molnet.

Spara certifikatfilen på önskad plats. Den här självstudien använder c:\ssl till exempel eller \var\www\html\bin i din lokala miljö eller klientmiljön där programmet finns. På så sätt kan program ansluta säkert till databasen via SSL.

Om du har skapat en flexibel Azure Database for MySQL-serverinstans med privat åtkomst (VNet-integrering) måste du ansluta till servern från en resurs i samma virtuella nätverk som servern. Du kan skapa en virtuell dator och lägga till den i det virtuella nätverk som skapats med din flexibla Azure Database for MySQL-serverinstans.

Om du har skapat en flexibel Azure Database for MySQL-serverinstans med offentlig åtkomst (tillåtna IP-adresser) kan du lägga till din lokala IP-adress i listan över brandväggsregler på servern.

Du kan välja antingen mysql.exe eller MySQL Workbench för> att ansluta till servern från din lokala miljö.

I följande exempel visas hur du ansluter till servern med hjälp av kommandoradsgränssnittet mysql. Använd inställningen --ssl-mode=REQUIRED anslutningssträng för att framtvinga TLS/SSL-certifikatverifiering. Skicka sökvägen till den lokala certifikatfilen till parametern --ssl-ca . Ersätt värden med ditt faktiska servernamn och lösenord.

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

Kommentar

Bekräfta att det värde som skickas till --ssl-ca matchar filsökvägen för det certifikat som du sparade. Om du ansluter till Azure Database for MySQL – Flexibel med SSL och använder ett alternativ för att utföra fullständig verifiering (sslmode=VERTIFY_IDENTITY) med certifikatmottagarens namn använder du <servername.mysql.database.azure.com> i anslutningssträng.

Om du försöker ansluta till servern med okrypterade anslutningar visas ett felmeddelande om att anslutningar som använder osäker transport är förbjudna på liknande sätt som nedan:

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

Verifiera TLS/SSL-anslutningen

Kör mysql-statuskommandot för att kontrollera att du har anslutit till MySQL-servern med TLS/SSL:

mysql> status

Bekräfta att anslutningen är krypterad genom att granska utdata, vilket bör visa: SSL: Chiffer som används är. Den här chiffersviten visar ett exempel och baserat på klienten kan du se en annan chiffersvit.

Hur identifierar du de TLS-protokoll som konfigurerats på servern?

Du kan köra kommandot SHOW GLOBAL VARIABLES LIKE 'tls_version'; och kontrollera värdet för att förstå vad alla protokoll har konfigurerats.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Hur hittar jag vilket TLS-protokoll som används av mina klienter för att ansluta till servern?

Du kan köra kommandot nedan och titta på tls_version för sessionen för att identifiera vilken TLS-version som används för att ansluta.

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;

Anslut till din flexibla Azure Database for MySQL-serverinstans med krypterade anslutningar med olika programramverk

Anslut ionssträngar som är fördefinierade på sidan "Anslut ionssträngar" som är tillgängliga för servern i Azure-portalen innehåller de parametrar som krävs för att vanliga språk ska kunna ansluta till databasservern med hjälp av TLS/SSL. Parametern TLS/SSL varierar beroende på anslutningsappen. Till exempel "useSSL=true", "sslmode=required" eller "ssl_verify_cert=true" och andra varianter.

Information om hur du upprättar en krypterad anslutning till din flexibla Azure Database for MySQL-serverinstans via TLS/SSL från ditt program finns i följande kodexempel:

WordPress

Ladda ned offentligt SSL-certifikat och lägg till följande rader i wp-config.php efter raden // **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 (med hjälp av 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 (MySQL Anslut or 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 (MySQL Anslut or för 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 (MariaDB Anslut eller för 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 (MySql Anslut or)

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;
});

Nästa steg