Leitfaden zur MySQL -Verschlüsselung in Transit- und obligatorischen Verschlüsselungseinstellungen

Leitfaden zur MySQL -Verschlüsselung in Transit- und obligatorischen Verschlüsselungseinstellungen
Standardmäßig findet die MySQL -Datenübertragung zwischen dem Client und dem Server ohne Verschlüsselung statt. Die unverschlüsselte Datenübertragung ist nur dann zu akzeptabel. Die Daten sind jedoch potenziellem Risiko ausgesetzt, wenn sich beide Parteien in einem separaten Netzwerk befinden. Die mangelnde Verschlüsselung führt ein schwerwiegendes Risiko für das Abfangen von Daten durch MAN-in-the-Middle (MITM) -Angriff ein.

Um dieses Risiko zu überwinden, unterstützt MySQL die Verschlüsselung im Transport zwischen dem Client und dem Server über das TLS/SSL -Protokoll. Der Artikel konzentriert sich auf die manuelle Generierung von SSL -Zertifikaten und Schlüsseldateien in MySQL, um SSL zu konfigurieren. Später konzentriert sich der Artikel auch darauf, obligatorische Verschlüsselungsanforderungen von Kunden zu ermöglichen.

Einstieg

Mysql Versionen 5.7.28+ bietet ein praktisches Tool, das als MySQL_SSL_RSA_SETUP bekannt ist, das sich auf OpenSSL -Binärdateien stützt, um die erforderlichen SSL -Zertifikate und -tasten automatisch zu generieren, um eine sichere Verbindung zu unterstützen.

Überprüfen Sie daher vor Beginn vor Beginn den Standard -SSL -Verbindungsstatus des MySQL -Servers. Geben Sie den folgenden Befehl ein, um den SSL -Sitzungswert zu überprüfen:

MySQL> Zeigen Sie globale Variablen wie '%SSL%';
+---------------+-----------------+
| Variable_name | Wert |
+---------------+-----------------+
| HABE_OPENSSSL | Deaktiviert |
| HABE_SSL | Deaktiviert |
| SSL_CA | |
| ssl_capath | |
| SSL_CERT | |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | |
+---------------+-----------------+
9 Zeilen im Set (0.53 Sek.)

Die obige Ausgabe zeigt, dass MySQL die Verschlüsselung im Transport für die aktuelle Sitzung nicht unterstützt.

Verwenden Sie OpenSSL, um SSL -Zertifikat und Schlüssel zu erstellen

Um eine Verschlüsselung beim Transit bereitzustellen, erfordert MySQL clientseitige und serverseitige X509-Zertifikate, die von der Zertifikatberechtigung unterzeichnet wurden. Wir generieren selbstsignierte Zertifikate sowie Server- und clientseitige Zertifikate über Befehlszeilen-Dienstprogramme OpenSSL. Es handelt sich um ein OpenSSL -Bibliotheks -Tool, das private Schlüssel generiert, X509 -Zertifikatanfragen erstellt, sie als CA unterzeichnet und sie überprüft.

Erstellen Sie vor Beginn ein Verzeichnis, um alle Dateien zu speichern:

Ubuntu@Ubuntu: ~ $ mkdir/var/lib/mysql/transit
Ubuntu@Ubuntu: ~ $ cd/var/lib/mysql/transit

Der folgende Befehlssatz erzeugt mehrere Eingabeaufforderungen, die nicht leere Antworten haben müssen.

Schlüssel- und Zertifikaterzeugung Zertifikatautorität

Erstellen eines selbstsignierten Zertifikats erfordert ein Zertifikat (Certificate Authority) über eine private Schlüsseldatei. Verwenden Sie den OpenSSL.

Ubuntu@Ubuntu: ~ $ OpenSSL Genrsa 2048> Ca-Key.Pem

Verwenden Sie den oben genannten Schlüssel mit einem OpenSSL REQ -Befehl, um ein Zertifikat für Ihre eigene CA mit einem Ablauf von 3000 Tagen zu generieren.

Ubuntu@Ubuntu: ~ $ openssl req -New -x509 -nodes -days 3000 -key ca -key.pem -out ca.Pem

Die obigen Befehle erstellen neue Dateien CA-Key.Pem und ca.PEM, um die X509-Zertifikate von MySQL Server und Client selbst zu unterzeichnen.

Generieren Sie einen privaten Schlüssel- und selbstsignierten Zertifikat für MySQL Server

Verwenden Sie OpenSSL, um MySQL Server RSA -Schlüssel- und Zertifikat -Signieranforderung (CSR) zu generieren:

Ubuntu@Ubuntu: ~ $ OpenSSL Genrsa 2048> Serverschlüssel.Pem
Ubuntu@Ubuntu: ~ $ openssl req -New -key Server -Key.PEM -out Server -REQ.Pem

Entfernen Sie nun die Passphrase aus der Serverschlüssel:

Ubuntu@Ubuntu: ~ $ openssl rsa -in Server -Key.PEM -out -Serverschlüssel.Pem

Generieren Sie das selbstsignierte Zertifikat von MySQL Server aus der Zertifikatanforderung mithilfe von CA Private Key und Certificate.

Ubuntu@Ubuntu: ~ $ OpenSSL X509 -REQ -IN Server -Req.PEM -Tage 3600 -ca ca.PEM -Cakey Ca -Key.PEM -Set_Serial 01 -out -Server -Cert.Pem

Jetzt erfordert die SSL -Konfiguration für MySQL keine CSR.

Generieren Sie den Kundenschlüssel und das selbstsignierte Zertifikat

Generieren Sie in ähnlicher Weise die Schlüssel- und Zertifikatanforderung für den Client.

Ubuntu@Ubuntu: ~ $ OpenSSL Req -NewKey RSA: 2048 -days 3600 -nodes -keeout Client -Key -Key.PEM -out Client -Req.Pem

Entfernen Sie die Passphrase aus dem Schlüssel und generieren Sie ein Client -Zertifikat aus der Zertifikatanforderung mit den CA -Dateien.

Ubuntu@Ubuntu: ~ $ openssl rsa -in Kundenschlüssel.PEM -out -Kunden -Key.Pem
Ubuntu@Ubuntu: ~ $ OpenSSL X509 -RQ -in Client -req.PEM -Tage 365000 -ca ca.PEM -Cakey Ca -Key.PEM -Set_Serial 01 -out -Client -Cert -Cert.Pem

Der Server akzeptiert nur Remoteverbindungen von den Clients mit diesen Dateien.

Überprüfen Sie zuletzt die Client- und serverseitigen Zertifikate mit dem CA-Zertifikat.

ubuntu@ubuntu: ~ $ opensensl verifizieren -cafile ca.PEM Server-Cert.PEM-Client-Cert.Pem
Server-Cert.Pem: OK
Client-Cert.Pem: OK

Der OK -Wert zeigt an, dass die Zertifikate korrekt generiert wurden und verwendet werden können.

Konfigurieren von MySQL Server

Um den TLS/SSL -Dienst für MySQL Server zu aktivieren Mysqld.Conf, wie zum Beispiel:

  • Verwenden SSL_CERT Und ssl_key So setzen Sie den Pfad zum Zertifikat des Servers und zum privaten Schlüssel.
  • Benutze die SSL_CA Variable, um den Pfad auf das CA-Zertifikat auf der Serverseite festzulegen.

Verwenden Sie Ihren bevorzugten Editor, um die Konfigurationsdatei im Inneren zu bearbeiten /etc/mysql/mysql.Conf.D Verzeichnis.

Ubuntu@Ubuntu: ~ $ vim/etc/mysql/mysql.Conf.D/Mysqld.CNF
[Mysqld]
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

Ändern Sie zuletzt die SSL -Schlüsseln und die Besitzer des Zertifikats sowie die Berechtigungen.

Ubuntu@Ubuntu: ~ $ chown -r mysql: mysql/var/lib/mysql/new_certs/
Ubuntu@Ubuntu: ~ $ chmod 600 Client-Schlüssel.PEM-Serverschlüssel.PEM CA-Key.Pem

Starten Sie die Datenbank neu, um die letzten Änderungen zu laden.

Ubuntu@Ubuntu: ~ $ sudo Service MySQL Neustart

Melden Sie sich nach dem Neustart beim Server an und überprüfen Sie den aktuellen Status der MySQL SSL -Sitzung.

Client-Seite-Konfiguration

Die Erstellung einer sicheren Fernverbindung aus dem Client erfordert die Übertragung der oben generierten clientseitigen OpenSL-Zertifikatdateien. 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/

Während des Erstellens einer verschlüsselten Remoteverbindung benötigt der Client nun kundenseitige Optionen, mit denen die Client-Seite-Tasten und -zertifikate überprüft werden können. Die mitgelieferten Optionen ähneln den serverseitigen Systemvariablen, aber die, die, die -SSL-Key Und -SSL-Cert Optionen identifizieren Pfade zum privaten Schlüssel und Zertifikat des Kunden. Benutze die -SSL-CA Option, den Pfad zum CA -Zertifikat hinzuzufügen. Diese Datei muss dem serverseitigen CA-Zertifikat übereinstimmen.

Verwenden Sie den folgenden Befehl mit allen erforderlichen Optionen, um eine sichere Remote -Verbindung mit dem MySQL -Datenbankserver herzustellen.

Ubuntu@ubuntu: ~ $ mySQL -u Benutzer -p -h --ssl-ca = ~/client-cert/ca.PEM-SSL-CERT = ~/Client-Cert/Client-Cert.PEM-SSL-Key = unter ~/client-cert/client-key.Pem

Konfigurieren Sie obligatorische verschlüsselte Verbindungen

Für einige MySQL -Server ist es nicht nur erforderlich, dass der Client über eine verschlüsselte Verbindung mit dem Server verbindet, sondern ist jedoch obligatorisch. Mit MySQL kann der Serveradministrator obligatorische verschlüsselte Verbindungen konfigurieren. Es wird ermöglicht, indem drei verschiedene Kontrollstufen platziert werden:

  • Konfigurieren Sie MySQL, bei dem der Client nur über eine verschlüsselte Verbindung auf die Datenbank zugreifen muss.
  • Rufen Sie Client -Programme auf, um eine verschlüsselte Verbindung zu benötigen, auch wenn MySQL dies zulässt, aber nicht unbedingt eine erfordert.
  • Konfigurieren Sie bestimmte Benutzerkonten, um nur über einen verschlüsselten Kanal auf die Datenbank zugreifen zu können.

Lassen Sie uns jeden von ihnen beschreiben:

required_secure_transport

Aktivieren Sie die Kunden, die eine verschlüsselte Verbindung verwenden, das required_secure_transport Variable in der MySQL -Konfigurationsdatei in/etc/mysql/mySQL.CNF.D Verzeichnis:

Ubuntu@Ubuntu: ~ $ sudo vim/etc/mysql/mysql.Conf.D/Mysqld.CNF
[Mysqld]
required_secure_transport = on

Die obige Systemvariable stellt sicher. Daher lehnt der Server eine Client -Verbindungsanforderung ohne sicheren Transport ab und gibt eine Fehlerausgabe von ER_SECURE_TRANSPORT_REQUE an das Programm des Clients zurück.

Darüber hinaus deaktiviert die obige Serverkonfiguration auch die Remote -Clientverbindung mit a -SSL-Mode = deaktiviert Saite.

Aufrufen des Client -Programms

Diese Steuerung ermöglicht das Aufrufen des Client -Programms unabhängig von den Servereinstellungen eine sichere verschlüsselte Kommunikation. Das heißt, auch wenn der Server nicht so konfiguriert ist, dass er einen SSL/TLS -Transport festlegt, kann er eine sichere Verbindung zum Wunsch des Kunden aufrechterhalten.

Es ist durch die Verwendung eines möglich -SSL-Modus Option in MySQL 5 verfügbar.7.11 zusammen mit seinen verschiedenen Werten. Es ist hilfreich, den gewünschten Sicherheitszustand der Clientverbindung zum Server anzugeben. Die Optionswerte werden basierend auf dem zunehmenden Grad der Strenge angewendet.

  • BEHINDERTE: Der Wert stellte eine unsichere Verbindung her.
  • BEVORZUGT: Der Modus ähnelt, wenn keine solche Option -sl -Mode -Option angegeben ist. Es wird nur die Verschlüsselung festgelegt, wenn der Server sie ansonsten unterstützt. Er fällt auf die nicht verkürzte Verbindung zurück.
  • ERFORDERLICH: Der Wert sorgt für eine verschlüsselte Kommunikation, wenn der Server aktiviert ist, um eine zu unterstützen. Der Client scheitert den Verbindungsversuch, wenn MySQL TLS/SSL nicht unterstützt.
  • Verify_ca: die Wertfunktionen ähnlich wie ERFORDERLICH, Darüber hinaus überprüft es auch das CA -Zertifikat des Servers des Servers. Der Client kann bei keinen gültigen Übereinstimmungszertifikaten eine Verbindung herstellen.
  • Verify_identity: ähnlich zu Verify_ca, Aber für eine OpenSSL Version 1.0.2+ können Clients auch den Hostnamen überprüfen, den sie verwenden, um eine Verbindung mit der Identität im Serverzertifikat herzustellen. Die Verbindung bricht bei einem Missverhältnis.

Es ist jedoch wichtig zu beachten. Dazu gehören automatisch generierte Zertifikate vom Server oder manuell über das Tool von MySQL_SSL_RSA_SETUP.

Abgesehen von der Standardverschlüsselung ermöglicht MySQL dem Client, zusätzliche Sicherheitseinstellungen einzuschließen, indem ein CA -Zertifikat wie der Server gesendet wird und die Überprüfung der Hostnamen -Identität aktiviert wird. Diese Einstellungen ermöglichen es beiden Parteien, einer gemeinsamen Einheit zu vertrauen, und der Kunde 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 -SL -CA -Option mit -SL -Modus = verify_ca an.
  • aktivieren
  • Ein anderer-SSL-Modus-Wert als Verify_identity oder verify_ca mit -SL-CA generiert eine Warnung, in der die Nonverifizierung des Serverzertifikats angegeben ist.

Benutzerkonten konfigurieren

Konfigurieren Sie ein bestimmtes Benutzerkonto, um die verschlüsselte Kommunikation durch den Client zu aktivieren, um über SSL auf den MySQL -Server zuzugreifen. Erstellen Sie ein Benutzerkonto Benutzer erstellen mit dem ERFORDERN Klausel Erklärung. Oder benutze die Benutzer ändern Anweisung, um die Erforderungsklausel hinzuzufügen. Diese Steuerung beendet die Clientverbindungsversuche zum Server, wenn sie keine verschlüsselte Verbindung unterstützt.

Die Forderungsklausel ist hilfreich, um eine Verschlüsselungskonfiguration auszuführen, die strenge Sicherheitsanforderungen erzwingt. Es ermöglicht die Angabe eines oder mehr als eines tls_option Wert.

Lassen Sie uns in die Details der erforderlichen Befehlsoptionen der Clients eingehen, die mit verschiedenen Erforderungswerten konfiguriert sind:

KEINER: erfordert keine SSL -Verbindung
SSL: Der Server ermöglicht nur eine verschlüsselte Verbindung von SSL-fähigen Konten.
X509: Fordert den Kunden den privaten Schlüssel und das Zertifikat vor. Dieser Wert erfordert nicht die Notwendigkeit, das CA -Zertifikat, das Thema und den Emittenten anzuzeigen.

Die Klausel gibt die erforderlichen Verschlüsselungseigenschaften so an, dass die SSL -Option nicht einbezogen werden muss.

MySQL> Benutzer erstellen 'Benutzer'@'localhost' benötigt x509;

Jetzt muss der Kunde -sl -Key- und -SSL -Cert -Optionen angeben, um eine Verbindung herzustellen, während -SSL -CA nicht erforderlich ist (dies gilt auch für die Aussteller Und Thema Werte).

Ubuntu@ubuntu: ~ $ mySQL -u Benutzer -p -h --SSL-CERT = Client-Cert.PEM-SSL-Key = Client-Key.Pem

AUSSTELLER: Das mit der Erfordernisse erstellte Konto muss der Client -SSL -Key- und -SL -Cert -Optionen mit einem gültigen Zertifikat angeben, das vom CA 'Emittenten' ausgestellt wurde, angeben. Erstellen Sie das Benutzerkonto wie folgt:

MySQL> Benutzer erstellen 'user' '@' localhost 'Erforderliche Issuer'/c = se/st = stockholm/l = stockholm/o = mysql/cn = ca/Emailaddress = [email protected] ';

Wenn das Zertifikat bei einem anderen Emittenten gültig ist, schlägt der Verbindungsversuch fehl.

THEMA: verlangen, dass der Kunde das Zertifikat mit a vorlegt Thema Wert bereitgestellt beim Erstellen seines Kontos. Eine Verbindung mit einem gültigen Zertifikat, jedoch ein anderes Thema in Verbindungsterminationen.

MySQL> Benutzer erstellen 'Benutzer'@'localhost' Erfordert Betreff '/c = se/st = stockholm/l = stockholm/o = MySQL Demo Client -Zertifikat/CN = Client/Emailaddress = [email protected] ';

CHIFFRE: Das mit der Anweisung erstellte Konto erfordert, dass der Client die Cipher -Methode zum Verschlüsseln der Kommunikation einbezieht. Es ist notwendig, sicherzustellen, ob Chiffren und Schlüssellängen ausreichend stark sind.

MySQL> Benutzer erstellen 'Benutzer'@'localhost' Erfordert Cipher 'edh-rsa-Des-cbc3-sha';

Abschluss

Der Artikel zeigt, wie die Kommunikation zwischen MySQL Server und Clients sichern kann, indem das SSL -Protokoll aktiviert wird. Wir lernen, ein manuell selbst signiertes Zertifikat zu erstellen, während wir dem Host im Netzwerk vertrauen. Wir wenden auch die Verschlüsselung im Transit für die Kommunikation von MySQL Server außerhalb des Netzwerks an und lernen Möglichkeiten, den Server für obligatorische Verschlüsselungsanforderungen zu konfigurieren.