Standardmäßig erfolgt die MySQL-Datenübertragung zwischen dem Client und dem Server ohne Verschlüsselung. Eine unverschlüsselte Datenübertragung ist nur dann akzeptabel, wenn sich Client und Server im selben Netzwerk befinden, das Sicherheit gewährleistet. Die Daten sind jedoch potenziell gefährdet, wenn sich beide Parteien in einem separaten Netzwerk befinden. Das Fehlen einer Verschlüsselung birgt ein hohes Risiko des Abfangens von Daten durch Man-in-the-Middle-Angriffe (MITM).

Um dieses Risiko zu vermeiden, unterstützt MySQL die Verschlüsselung bei der Übertragung zwischen Client und Server über das TLS//SSL-Protokoll. Der Artikel konzentriert sich auf die manuelle Erstellung von SSL-Zertifikaten und Schlüsseldateien in MySQL zur Konfiguration von SSL. Später befasst sich der Artikel auch mit der Aktivierung obligatorischer Verschlüsselungsanforderungen von Clients.

Erste Schritte MySQL-Versionen ab 5.7.28 bieten ein praktisches Werkzeug namens mysql_ssl_rsa_setup, das sich auf OpenSSL-Binärdateien stützt, um automatisch die erforderlichen SSL-Zertifikate und -Schlüssel zur Unterstützung einer sicheren Verbindung zu erzeugen. Bevor Sie beginnen, sollten Sie daher den Standard-SSL-Verbindungsstatus des MySQL-Servers überprüfen.

Leitfaden zur MySQL-Verschlüsselung bei der Übertragung und zu den obligatorischen Verschlüsselungseinstellungen

Geben Sie den folgenden Befehl ein, um den Wert der SSL-Sitzung zu überprüfen: mysql> show global variables like %ssl%; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | Leitfaden zur MySQL-Verschlüsselung bei der Übertragung und zu den obligatorischen Verschlüsselungseinstellungen | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | | ssl_key | | +---------------+-----------------+ 9 rows in set (0.53 sec) Die obige Ausgabe zeigt, dass MySQL keine Verschlüsselung im Transit für die aktuelle Sitzung unterstützt.

OpenSSL verwenden, um SSL-Zertifikat und -Schlüssel zu erstellen Um die Verschlüsselung bei der Übertragung zu ermöglichen, benötigt MySQL clientseitige und serverseitige X509-Zertifikate, die von der Zertifizierungsstelle signiert sind, um den Domänenbesitz zu bestätigen.

Wir werden selbstsignierte Zertifikate sowie Server- und Client-seitige Zertifikate mit dem Befehlszeilenprogramm OpenSSL erzeugen. Dabei handelt es sich um ein Tool der OpenSSL-Bibliothek, das private Schlüssel generiert, X509-Zertifikatsanforderungen erstellt, sie als CA signiert und verifiziert. Bevor Sie beginnen, erstellen Sie ein Verzeichnis, in dem alle Dateien gespeichert werden: ubuntu@ubuntu:~$ mkdir //var//lib//mysql//transit ubuntu@ubuntu:~$ cd //var//lib//mysql//transit Die folgenden Befehle generieren mehrere Aufforderungen, die nicht leere Antworten enthalten müssen.

Schlüssel der Zertifizierungsstelle und Zertifikatsgenerierung Das Erstellen eines selbstsignierten Zertifikats erfordert ein Zertifikat der Zertifizierungsstelle (CA) über eine private Schlüsseldatei. Verwenden Sie den OpenSSL-Befehl, um einen privaten RSA-Schlüssel mit 2048 Bit für die CA zu erzeugen. ubuntu@ubuntu:~$ openssl genrsa 2048 > ca-key.pem Verwenden Sie den obigen Schlüssel mit einem OpenSSL req-Befehl, um ein Zertifikat für Ihre eigene CA mit einer Gültigkeitsdauer von 3000 Tagen zu erzeugen.

ubuntu@ubuntu:~$ openssl req -new -x509 -nodes -days 3000 -key ca-key.pem -out ca.pem Die obigen Befehle erzeugen neue Dateien ca-key.pem und ca.pem, um die X509-Zertifikate von MySQL-Server und -Client selbst zu signieren.

Privaten Schlüssel und selbstsigniertes Zertifikat für den MySQL-Server erzeugen Verwenden Sie OpenSSL, um den RSA-Schlüssel des MySQL-Servers und die Certificate Signing Request (CSR) zu erzeugen: ubuntu@ubuntu:~$ openssl genrsa 2048 > server-key.pem ubuntu@ubuntu:~$ openssl req -new -key server-key.pem -out server-req.pem Entfernen Sie nun die Passphrase aus dem Serverschlüssel: ubuntu@ubuntu:~$ openssl rsa -in server-key.pem -out server-key.pem Erzeugen Sie das selbstsignierte Zertifikat des MySQL-Servers aus der Zertifikatsanforderung unter Verwendung des privaten CA-Schlüssels und des Zertifikats.

ubuntu@ubuntu:~$ openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem Die SSL-Konfiguration für MySQL erfordert nun keine CSR. Client-Schlüssel und selbstsigniertes Zertifikat erzeugen Erzeugen Sie auf ähnliche Weise den Schlüssel und die Zertifikatsanforderung für den Client.

ubuntu@ubuntu:~$ openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem Entfernen Sie die Passphrase aus dem Schlüssel und erzeugen Sie ein Client-Zertifikat aus der Zertifikatsanforderung unter Verwendung der CA-Dateien. ubuntu@ubuntu:~$ openssl rsa -in client-key.pem -out client-key.pem ubuntu@ubuntu:~$ openssl x509 -req -in client-req.pem -days 365000 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem Der Server wird nur Remote-Verbindungen von Clients mit diesen Dateien akzeptieren.

Überprüfen Sie abschließend die client- und serverseitigen Zertifikate mit dem CA-Zertifikat. ubuntu@ubuntu:~$ openssl verify -CAfile ca.pem server-cert.pem client-cert.pem server-cert.pem: OK client-cert.pem: OK Der Wert OK zeigt an, dass die Zertifikate korrekt generiert wurden und einsatzbereit sind. Konfiguration des MySQL-Servers Um den TLS//SSL-Dienst für den MySQL-Server zu aktivieren, müssen Sie eine Reihe von Systemvariablen in der MySQL-Hauptkonfigurationsdatei mysqld.conf setzen, wie z.B.: Verwenden Sie ssl_cert und ssl_key, um den Pfad zum Zertifikat und zum privaten Schlüssel des Servers festzulegen.

Verwenden Sie die Variable ssl_ca, um den Pfad zum Zertifikat der CA auf der Serverseite zu setzen. Verwenden Sie Ihren bevorzugten Editor, um die Konfigurationsdatei im Verzeichnis //etc//mysql//mysql.conf.d zu bearbeiten. ubuntu@ubuntu:~$ vim //etc//mysql//mysql.conf.d//mysqld.cnf ssl_ca= //var//lib//mysql//new_certs//ca.pem ssl_cert=//var//lib//mysql//new_certs// server-cert.pem ssl_key=//var//lib//mysql//new_certs//server-key.pem Zuletzt ändern Sie die Eigentumsrechte an SSL-Schlüsseln und -Zertifikaten sowie die Berechtigungen.

ubuntu@ubuntu:~$ chown -R mysql:mysql //var//lib//mysql//new_certs// ubuntu@ubuntu:~$ chmod 600 client-key.pem server-key.pem ca-key.pem Starten Sie die Datenbank neu, um die letzten Änderungen zu laden. ubuntu@ubuntu:~$ sudo service mysql restart Melden Sie sich nach dem Neustart am Server an und überprüfen Sie den aktuellen Status der MySQL SSL-Sitzung.

Client-seitige Konfiguration Der Aufbau einer sicheren Remote-Verbindung vom Client aus erfordert die Übertragung der oben generierten Client-seitigen OpenSSL-Zertifikatsdateien. Erstellen Sie ein neues Verzeichnis und verwenden Sie das SCP-Dienstprogramm für die sichere Dateiübertragung.

ubuntu@ubuntu:~$ mkdir ~//client-cert ubuntu@ubuntu:~$ scp user@[IP_Address]://var//lib//mysql//transit//ca-cert.pem ~//client-cert// ubuntu@ubuntu:~$ scp user@[IP_Address]://var//lib//mysql//transit//client-cert.pem ~//client-cert// ubuntu@ubuntu:~$ scp user@[IP_Address]://var//lib//mysql//transit//client-key.pem ~//client-cert// Beim Aufbau einer verschlüsselten Remote-Verbindung muss der Client nun clientseitige Optionen hinzufügen, die clientseitige Schlüssel und Zertifikate verifizieren.

Die enthaltenen Optionen ähneln den serverseitigen Systemvariablen, aber die Optionen -ssl-key und -ssl-cert geben die Pfade zum privaten Schlüssel und zum Zertifikat des Clients an.

Verwenden Sie die Option -ssl-ca, um den Pfad zum CA-Zertifikat hinzuzufügen. Diese Datei muss mit dem server-seitigen CA-Zertifikat identisch sein. Verwenden Sie den folgenden Befehl mit allen erforderlichen Optionen, um eine sichere Remoteverbindung mit dem MySQL-Datenbankserver herzustellen.

ubuntu@ubuntu:~$ mysql -u user -p -h --ssl-ca= ~//client-cert//ca.pem --ssl-cert=~//client-cert//client-cert.pem --ssl-key=unter ~//client-cert//client-key.pem Obligatorische verschlüsselte Verbindungen konfigurieren Bei einigen MySQL-Servern ist es nicht nur erforderlich, dass sich der Client über eine verschlüsselte Verbindung mit dem Server verbindet, sondern es ist sogar obligatorisch.

MySQL ermöglicht es dem Serveradministrator, obligatorische verschlüsselte Verbindungen zu konfigurieren. Dies ist möglich, indem drei verschiedene Ebenen der Kontrolle eingerichtet werden: Konfigurieren Sie MySQL so, dass der Client nur über eine verschlüsselte Verbindung auf die Datenbank zugreifen muss.

Aufrufen von Client-Programmen, die eine verschlüsselte Verbindung benötigen, auch wenn MySQL eine solche zulässt, aber nicht unbedingt verlangt. Konfigurieren Sie bestimmte Benutzerkonten so, dass sie nur über einen verschlüsselten Kanal auf die Datenbank zugreifen. Um sicherzustellen, dass Clients eine verschlüsselte Verbindung verwenden, aktivieren Sie die Variable require_secure_transport in der MySQL-Konfigurationsdatei, die sich im Verzeichnis //etc//mysql//mysql.cnf.d Verzeichnis: ubuntu@ubuntu:~$ sudo vim //etc//mysql//mysql.conf.d//mysqld.cnf [mysqld] require_secure_transport=ON Die obige Systemvariable stellt sicher, dass der Client einen sicheren Transport für die Verbindung mit Leitfaden zur MySQL-Verschlüsselung bei der Übertragung und zu den obligatorischen Verschlüsselungseinstellungen Server verwendet und der Server nur TCP-Verbindungen über SSL zulässt.

Daher lehnt der Server jede Client-Verbindungsanfrage ohne sicheren Transport ab und gibt eine Fehlerausgabe von ER_SECURE_TRANSPORT_REQUIRED an das Client-Programm zurück. Darüber hinaus deaktiviert die obige Serverkonfiguration auch die Remote-Client-Verbindung zum Server mit der Zeichenfolge -ssl-mode=DISABLED.

Aufrufen des Client-Programms Diese Kontrollebene ermöglicht das Aufrufen des Client-Programms, um eine sichere verschlüsselte Kommunikation einzurichten, unabhängig von den Servereinstellungen. Das heißt, selbst wenn der Server nicht so konfiguriert ist, dass er zwingend einen SSL//TLS-Transport aufbaut, kann er auf Wunsch des Clients eine sichere Verbindung aufrechterhalten.

Dies ist durch die Verwendung der Option -ssl-mode möglich, die in MySQL 5.7.11 zusammen mit ihren verschiedenen Werten verfügbar ist.

Sie ist hilfreich, um den gewünschten Sicherheitsstatus der Client-Verbindung zum Server anzugeben. Die Optionswerte werden auf der Grundlage der zunehmenden Strenge angewendet.

DISABLED: Der Wert stellt eine unsichere Verbindung her. PREFERRED: Der Modus ähnelt dem, wenn keine der Optionen -ssl-mode angegeben ist. Er stellt die Verschlüsselung nur dann her, wenn der Server sie unterstützt, andernfalls fällt er auf die unverschlüsselte Standardverbindung zurück.

REQUIRED: Der Wert stellt eine verschlüsselte Kommunikation sicher, wenn der Server eine solche Unterstützung bietet. Der Client schlägt den Verbindungsversuch fehl, wenn MySQL TLS//SSL nicht unterstützt. VERIFY_CA: Der Wert funktioniert ähnlich wie REQUIRED, überprüft aber zusätzlich auch das CA-Zertifikat des Servers.

Der Client kann keine Verbindung herstellen, wenn kein gültiges passendes Zertifikat vorhanden ist. VERIFY_IDENTITY: ähnlich wie VERIFY_CA, aber bei einer OpenSSL-Version 1.0.2+ können Clients auch den Hostnamen, den sie für die Verbindung verwenden, mit der Identität im Serverzertifikat abgleichen.

Im Falle einer Nichtübereinstimmung wird die Verbindung unterbrochen. Es ist jedoch wichtig zu beachten, dass die Überprüfung des Hostnamens nicht für selbst signierte Zertifikate funktioniert.

Dazu gehören automatisch vom Server generierte Zertifikate oder manuell mit dem Tool mysql_ssl_rsa_setup erstellte Zertifikate. Abgesehen von der Standardverschlüsselung erlaubt MySQL dem Client, zusätzliche Sicherheitseinstellungen vorzunehmen, indem er ein CA-Zertifikat bereitstellt, das dem des Servers entspricht, und die Überprüfung der Hostnamenidentität aktiviert.

Diese Einstellungen ermöglichen es beiden Parteien, einer gemeinsamen Instanz zu vertrauen, und der Client kann überprüfen, ob er sich mit dem richtigen Host verbindet. Wir verstehen nun, wie der obige Modus mit den CA-Zertifikatsoptionen interagiert: Geben Sie das CA-Zertifikat mit der Option -ssl-ca mit -ssl-mode=VERIFY_CA an.

Aktivieren Sie die Überprüfung der Hostnamen-Identität mit -ssl-mode=VERIFY_IDENTITY. Ein anderer -ssl-mode-Wert als VERIFY_IDENTITY oder VERIFY_CA mit -ssl-ca erzeugt eine Warnung, die besagt, dass das Serverzertifikat nicht überprüft wurde. Benutzerkonten konfigurieren Um eine verschlüsselte Kommunikation durch den Client zu ermöglichen, konfigurieren Sie ein bestimmtes Benutzerkonto für den Zugriff auf den MySQL-Server über SSL.

Erstellen Sie ein Benutzerkonto CREATE USER mit der Anweisung REQUIRE clause. Oder verwenden Sie die ALTER USER-Anweisung, um die REQUIRE-Klausel hinzuzufügen. Dieses Steuerelement bricht Verbindungsversuche des Clients zum Server ab, wenn dieser keine verschlüsselte Verbindung unterstützt. Die REQUIRE-Klausel ist hilfreich, um eine verschlüsselungsbezogene Konfiguration auszuführen, die strenge Sicherheitsanforderungen durchsetzt.

Sie erlaubt die Angabe von einem oder mehreren tls_option-Werten. Im Folgenden werden die erforderlichen Befehlsoptionen von Clients, die mit verschiedenen REQUIRE-Werten konfiguriert sind, im Detail beschrieben: NONE: erfordert keine SSL-Verbindung SSL: der Server lässt nur verschlüsselte Verbindungen von SSL-aktivierten Konten zu.

X509: Der Client muss den privaten Schlüssel und das Zertifikat vorlegen. Bei diesem Wert müssen das CA-Zertifikat, der Betreff und der Aussteller nicht angegeben werden. Die Klausel legt die erforderlichen Verschlüsselungsmerkmale fest, so dass die SSL-Option nicht erforderlich ist.

mysql> CREATE USER user@localhost REQUIRE X509; Jetzt muss der Client die Optionen -ssl-key und -ssl-cert angeben, um eine Verbindung herzustellen, während -ssl-ca nicht erforderlich ist (dies gilt auch für die Werte für Aussteller und Betreff). ubuntu@ubuntu:~$ mysql -u user -p -h --ssl-cert=client-cert.pem --ssl-key=client-key.pem ISSUER: Das Konto, das mit der Anweisung REQUIRE ISSUER erstellt wird, erfordert, dass der Client die Optionen -ssl-key und -ssl-cert mit einem gültigen Zertifikat angibt, das von der CA issuer ausgestellt wurde.

Erstellen Sie das Benutzerkonto wie folgt: mysql> CREATE USER user@localhost REQUIRE ISSUER //C=SE//ST=Stockholm//L=Stockholm// O=MySQL//CN=CA//emailAddress=ca@example.com; Wenn das Zertifikat mit einem anderen Aussteller gültig ist, schlägt der Verbindungsversuch fehl. SUBJECT: Der Client muss das Zertifikat mit einem Betreff vorlegen, der bei der Erstellung seines Kontos angegeben wurde. Eine Verbindung mit einem gültigen Zertifikat, aber einem anderen Betreff führt zu Verbindungsabbrüchen.

mysql> CREATE USER user@localhost REQUIRE SUBJECT //C=SE//ST=Stockholm//L=Stockholm// O=MySQL-Demo-Client-Zertifikat// CN=client//emailAddress=client@example.com; CIPHER: Das mit der Anweisung erstellte Konto erfordert, dass der Client die zur Verschlüsselung der Kommunikation verwendete Verschlüsselungsmethode angibt. Es muss sichergestellt werden, dass die Chiffren und Schlüssellängen ausreichend stark sind. mysql> CREATE Leitfaden zur MySQL-Verschlüsselung bei der Übertragung und zu den obligatorischen Verschlüsselungseinstellungen user@localhost REQUIRE CIPHER EDH-RSA-DES-CBC3-SHA; Fazit Der Artikel veranschaulicht, wie die Kommunikation zwischen MySQL-Server und Clients durch die Aktivierung des SSL-Protokolls gesichert werden kann.

Wir lernen, ein manuelles selbstsigniertes Zertifikat zu erstellen, da wir dem Host im Netzwerk vertrauen. Wir wenden auch die Transitverschlüsselung für die MYSQL-Server-Kommunikation außerhalb des Netzwerks an und lernen, wie man den Server für obligatorische Verschlüsselungsanforderungen konfiguriert.


6 11 15