So konfigurieren Sie SSL / TLS für MySQL unter Ubuntu 18.04

Einführung

MySQL ist das weltweite Open-Source-Datenbankverwaltungssystem vonmost popular. Während moderne Paketmanager den Aufwand für die Inbetriebnahme von MySQL etwas reduziert haben, gibt es noch einige weitere Konfigurationsschritte, die nach der Installation durchgeführt werden sollten. Einer der wichtigsten Aspekte, für den Sie zusätzliche Zeit aufwenden müssen, ist die Sicherheit.

Standardmäßig ist MySQL so konfiguriert, dass nur lokale Verbindungen oder Verbindungen akzeptiert werden, die von demselben Computer stammen, auf dem MySQL installiert ist. Wenn Sie von einem entfernten Standort aus auf Ihre MySQL-Datenbank zugreifen müssen, ist es wichtig, dass Sie dies sicher tun. In diesem Handbuch wird gezeigt, wie Sie MySQL unter Ubuntu 18.04 so konfigurieren, dass Remoteverbindungen mit SSL / TLS-Verschlüsselung akzeptiert werden.

Voraussetzungen

Um diesen Leitfaden zu vervollständigen, benötigen Sie:

  • Two Ubuntu 18.04 Server. Wir werden einen dieser Server als MySQL-Server verwenden, während wir den anderen als Client-Computer verwenden. Erstellen Sie einen Nicht-Root-Benutzer mit den Berechtigungen vonsudound aktivieren Sie auf jedem dieser Server eine Firewall mitufw. Befolgen Sie unsereUbuntu 18.04 initial server setup guide, um beide Server in den entsprechenden Ausgangszustand zu versetzen.

  • Installieren und konfigurieren Sie aufone of the machines den MySQL-Server. Folgen Sie dazuSteps 1 through 3 unsererMySQL installation guide for Ubuntu 18.04. Stellen Sie beim Befolgen dieser Anleitung sicher, dass Ihr MySQL-Benutzerrooto konfiguriert ist, dass er sich mit einem Kennwort authentifiziert, wie inStep 3 der Anleitung beschrieben, da dies erforderlich ist, um eine Verbindung zu MySQL über TCP und nicht über das lokale Netzwerk herzustellen Unix-Socket.

Bitte beachten Sie, dass in diesem Handbuch der Server, auf dem Sie MySQL installiert haben, alsMySQL server bezeichnet wird und alle Befehle, die auf diesem Computer ausgeführt werden sollen, wie folgt mit einem blauen Hintergrund angezeigt werden:

In ähnlicher Weise wird in diesem Handbuch auf den anderen Server alsMySQL client verwiesen, und alle Befehle, die auf diesem Computer ausgeführt werden müssen, werden mit einem roten Hintergrund angezeigt:

Bitte denken Sie daran, wenn Sie dieses Tutorial durcharbeiten, um Verwirrung zu vermeiden.

[[Schritt-1 - Überprüfung des MySQL-39-s-aktuellen-SSL-TLS-Status]] == Schritt 1 - Überprüfen des aktuellen SSL / TLS-Status von MySQL

Bevor Sie Konfigurationsänderungen vornehmen, können Sie den aktuellen SSL / TLS-Status auf der Instanz vonMySQL serverüberprüfen.

Verwenden Sie den folgenden Befehl, um eine MySQL-Sitzung als MySQL-Benutzer vonrootzu starten. Dieser Befehl enthält die Option-p, mit dermysql angewiesen wird, Sie zur Eingabe eines Kennworts aufzufordern, um sich anzumelden. Es enthält auch die Option-h, mit der der Host angegeben wird, zu dem eine Verbindung hergestellt werden soll. In diesem Fall zeigt es auf127.0.0.1, die IPv4-Loopback-Schnittstelle, die auch alslocalhost bezeichnet wird. Dadurch wird der Client gezwungen, eine Verbindung mitTCP herzustellen, anstatt die lokale Socket-Datei zu verwenden. MySQL versucht standardmäßig, Verbindungen überUnix socket file herzustellen. Dies ist im Allgemeinen schneller und sicherer, da diese Verbindungen nur lokal hergestellt werden können und nicht alle Überprüfungen und Routing-Vorgänge durchlaufen müssen, die TCP-Verbindungen ausführen müssen. Durch die Verbindung mit TCP können wir jedoch den SSL-Status der Verbindung überprüfen:

mysql -u root -p -h 127.0.0.1

Sie werden aufgefordert, das Kennwort für MySQLrooteinzugeben, das Sie bei der Installation und Konfiguration von MySQL ausgewählt haben. Nach der Eingabe werden Sie in eine interaktive MySQL-Sitzung versetzt.

Zeigen Sie den Status der SSL / TLS-Variablen an, die den folgenden Befehl ausgeben:

SHOW VARIABLES LIKE '%ssl%';
Output+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_crl       |          |
| ssl_crlpath   |          |
| ssl_key       |          |
+---------------+----------+
9 rows in set (0.01 sec)

Die Variablenhave_openssl undhave_ssl sind beide alsDISABLED markiert. Dies bedeutet, dass die SSL-Funktionalität auf dem Server kompiliert wurde, jedoch noch nicht aktiviert ist.

Überprüfen Sie den Status Ihrer aktuellen Verbindung, um dies zu bestätigen:

\s
Output--------------
mysql  Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using  EditLine wrapper

Connection id:      9
Current database:
Current user:       root@localhost
SSL:         Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.26-0ubuntu0.18.04.1 (Ubuntu)
Protocol version:   10
Connection:      127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:       3306
Uptime:         40 min 11 sec

Threads: 1  Questions: 33  Slow queries: 0  Opens: 113  Flush tables: 1  Open tables: 106  Queries per second avg: 0.013
--------------

Wie aus der obigen Ausgabe hervorgeht, wird SSL für diese Verbindung derzeit nicht verwendet, obwohl Sie über TCP verbunden sind.

Schließen Sie die aktuelle MySQL-Sitzung, wenn Sie fertig sind:

exit

Nachdem Sie bestätigt haben, dass Ihr MySQL-Server kein SSL verwendet, können Sie mit dem nächsten Schritt fortfahren, in dem Sie mit dem Aktivieren von SSL beginnen, indem Sie einige Zertifikate und Schlüssel generieren. Dadurch können Server und Client sicher miteinander kommunizieren.

[[Schritt-2 - Generieren von SSL-TLS-Zertifikaten und -Schlüsseln]] == Schritt 2 - Generieren von SSL / TLS-Zertifikaten und -Schlüsseln

Um SSL-Verbindungen zu MySQL zu aktivieren, müssen Sie zuerst die entsprechenden Zertifikats- und Schlüsseldateien generieren. MySQL-Versionen 5.7 und höher bieten ein Dienstprogramm namensmysql_ssl_rsa_setup, das diesen Prozess vereinfacht. Die Version von MySQL, die Sie unter Befolgung derprerequisite MySQL tutorial installiert haben, enthält dieses Dienstprogramm. Daher werden wir es hier verwenden, um die erforderlichen Dateien zu generieren.

Der MySQL-Prozess muss in der Lage sein, die generierten Dateien zu lesen. Verwenden Sie daher die Option--uid, ummysql als Systembenutzer zu deklarieren, dem die generierten Dateien gehören sollen:

sudo mysql_ssl_rsa_setup --uid=mysql

Dadurch wird eine Ausgabe erzeugt, die der folgenden ähnelt:

OutputGenerating a 2048 bit RSA private key
.+++
..........+++
writing new private key to 'ca-key.pem'
-----
Generating a 2048 bit RSA private key
........................................+++
............+++
writing new private key to 'server-key.pem'
-----
Generating a 2048 bit RSA private key
.................................+++
............................................................+++
writing new private key to 'client-key.pem'
-----

Diese neuen Dateien werden im Datenverzeichnis von MySQL gespeichert, das sich standardmäßig unter/var/lib/mysql befindet. Überprüfen Sie die generierten Dateien, indem Sie Folgendes eingeben:

sudo find /var/lib/mysql -name '*.pem' -ls
Output   258930      4 -rw-r--r--   1 mysql    mysql        1107 May  3 16:43 /var/lib/mysql/client-cert.pem
   258919      4 -rw-r--r--   1 mysql    mysql         451 May  3 16:43 /var/lib/mysql/public_key.pem
   258925      4 -rw-------   1 mysql    mysql        1675 May  3 16:43 /var/lib/mysql/server-key.pem
   258927      4 -rw-r--r--   1 mysql    mysql        1107 May  3 16:43 /var/lib/mysql/server-cert.pem
   258922      4 -rw-------   1 mysql    mysql        1675 May  3 16:43 /var/lib/mysql/ca-key.pem
   258928      4 -rw-------   1 mysql    mysql        1675 May  3 16:43 /var/lib/mysql/client-key.pem
   258924      4 -rw-r--r--   1 mysql    mysql        1107 May  3 16:43 /var/lib/mysql/ca.pem
   258918      4 -rw-------   1 mysql    mysql        1679 May  3 16:43 /var/lib/mysql/private_key.pem

Diese Dateien sind die Schlüssel- und Zertifikatpaare für die Zertifizierungsstelle (beginnend mit "ca"), den MySQL-Serverprozess (beginnend mit "server") und für MySQL-Clients (beginnend mit "client"). Darüber hinaus werden die Dateienprivate_key.pem undpublic_key.pem von MySQL verwendet, um Kennwörter sicher zu übertragen, wenn kein SSL verwendet wird.

Nachdem Sie über die erforderlichen Zertifikats- und Schlüsseldateien verfügen, können Sie die Verwendung von SSL auf Ihrer MySQL-Instanz weiterhin aktivieren.

[[Schritt 3 - Aktivieren von SSL-Verbindungen auf dem MySQL-Server]] == Schritt 3 - Aktivieren von SSL-Verbindungen auf dem MySQL Server

Moderne Versionen von MySQL suchen beim Starten des Servers nach den entsprechenden Zertifikatdateien im MySQL-Datenverzeichnis. Aus diesem Grund müssen Sie die Konfiguration von MySQL nicht ändern, um SSL zu aktivieren.

Aktivieren Sie stattdessen SSL, indem Sie den MySQL-Dienst neu starten:

sudo systemctl restart mysql

Öffnen Sie nach dem Neustart eine neue MySQL-Sitzung mit dem gleichen Befehl wie zuvor. Der MySQL-Client versucht automatisch, eine Verbindung mit SSL herzustellen, wenn dies vom Server unterstützt wird:

mysql -u root -p -h 127.0.0.1

Schauen wir uns noch einmal dieselben Informationen an, die wir beim letzten Mal angefordert haben. Überprüfen Sie die Werte der SSL-bezogenen Variablen:

SHOW VARIABLES LIKE '%ssl%';
Output+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| have_openssl  | YES             |
| have_ssl      | YES             |
| ssl_ca        | ca.pem          |
| ssl_capath    |                 |
| ssl_cert      | server-cert.pem |
| ssl_cipher    |                 |
| ssl_crl       |                 |
| ssl_crlpath   |                 |
| ssl_key       | server-key.pem  |
+---------------+-----------------+
9 rows in set (0.00 sec)

Die Variablenhave_openssl undhave_ssl lesen jetztYES anstelle vonDISABLED. Darüber hinaus wurden die Variablenssl_ca,ssl_cert undssl_key mit den Namen der jeweiligen Dateien gefüllt, die wir gerade generiert haben.

Überprüfen Sie als Nächstes die Verbindungsdetails erneut:

\s
Output--------------
. . .
SSL:            Cipher in use is DHE-RSA-AES256-SHA
. . .
Connection:      127.0.0.1 via TCP/IP
. . .
--------------

Dieses Mal wird die spezifische SSL-Verschlüsselung angezeigt, die angibt, dass SSL zum Sichern der Verbindung verwendet wird.

Gehe zurück zur Shell:

exit

Ihr Server kann jetzt die Verschlüsselung verwenden, es ist jedoch eine zusätzliche Konfiguration erforderlich, um den Remotezugriff zu ermöglichen und die Verwendung sicherer Verbindungen zu verlangen.

[[Schritt 4 - Konfigurieren sicherer Verbindungen für Remoteclients]] == Schritt 4 - Konfigurieren sicherer Verbindungen für Remoteclients

Nachdem Sie SSL auf dem MySQL-Server aktiviert haben, können Sie den sicheren Remotezugriff konfigurieren. Zu diesem Zweck konfigurieren Sie Ihren MySQL-Server so, dass Remoteverbindungen über SSL hergestellt werden müssen, binden MySQL an die Überwachung einer öffentlichen Schnittstelle und passen die Firewall-Regeln Ihres Systems an, um externe Verbindungen zuzulassen

Derzeit ist der MySQL-Server so konfiguriert, dass SSL-Verbindungen von Clients akzeptiert werden. Es werden jedoch weiterhin unverschlüsselte Verbindungen zugelassen, wenn dies vom Client angefordert wird. Wir können dies ändern, indem wir die Optionrequire_secure_transportaktivieren. Dies erfordert, dass alle Verbindungen entweder mit SSL oder mit einem lokalen Unix-Socket hergestellt werden. Da Unix-Sockets nur vom Server aus zugänglich sind, können Remotebenutzer nur über SSL eine Verbindung herstellen.

Um diese Einstellung zu aktivieren, öffnen Sie die MySQL-Konfigurationsdatei in Ihrem bevorzugten Texteditor. Hier verwenden wirnano:

sudo nano /etc/mysql/my.cnf

Im Inneren befinden sich zwei!includedir-Anweisungen, mit denen zusätzliche Konfigurationsdateien erstellt werden. Sie müssen in diesen Zeilen Ihre eigene Konfigurationbeneathhinzufügen, damit alle widersprüchlichen Einstellungen in diesen zusätzlichen Konfigurationsdateien überschrieben werden.

Erstellen Sie zunächst einen Abschnitt[mysqld], der auf den MySQL-Serverprozess abzielt. Setzen Sie unter dieser Abschnittsüberschriftrequire_secure_transport aufON, wodurch MySQL gezwungen wird, nur sichere Verbindungen zuzulassen:

/etc/mysql/my.cnf

. . .

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
# Require clients to connect either using SSL
# or through a local socket file
require_secure_transport = ON

Standardmäßig ist MySQL so konfiguriert, dass nur Verbindungen überwacht werden, die von127.0.0.1 stammen, der Loopback-IP-Adresse, dielocalhost darstellt. Dies bedeutet, dass MySQL so konfiguriert ist, dass es nur auf Verbindungen wartet, die von dem Computer stammen, auf dem der MySQL-Server installiert ist.

Damit MySQL auf externe Verbindungen warten kann, müssen Sie es so konfigurieren, dass es auf Verbindungen mit der IP-Adresse einesexternalwartet. Dazu können Sie die Einstellungbind-address hinzufügen und auf0.0.0.0 verweisen, eine Platzhalter-IP-Adresse, die alle IP-Adressen darstellt. Im Wesentlichen wird dies MySQL zwingen, auf Verbindungen an jeder Schnittstelle zu warten:

/etc/mysql/my.cnf

. . .

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
# Require clients to connect either using SSL
# or through a local socket file
require_secure_transport = ON
bind-address = 0.0.0.0

[.note] #Note: Sie können alternativbind-address auf die öffentliche IP-Adresse IhresMySQL server’setzen. Sie müssen jedoch daran denken, die Dateimy.cnfzu aktualisieren, wenn Sie Ihre Datenbank jemals auf einen anderen Computer migrieren.
#

Speichern und schließen Sie die Datei, nachdem Sie diese Zeilen hinzugefügt haben. Wenn Sienano zum Bearbeiten der Datei verwendet haben, können Sie dies tun, indem SieCTRL+X,Y und dannENTER drücken.

Starten Sie als nächstes MySQL neu, um die neuen Einstellungen zu übernehmen:

sudo systemctl restart mysql

Stellen Sie sicher, dass MySQL0.0.0.0 anstelle von127.0.0.1 abhört, indem Sie Folgendes eingeben:

sudo netstat -plunt

Die Ausgabe dieses Befehls sieht folgendermaßen aus:

OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:3306      0.0.0.0:*               LISTEN      13317/mysqld
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1293/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1293/sshd

Die in der obigen Ausgabe hervorgehobenen0.0.0.0 zeigen an, dass MySQL auf allen verfügbaren Schnittstellen auf Verbindungen wartet.

Lassen Sie als Nächstes MySQL-Verbindungen durch die Firewall Ihres Servers zu. Fügen Sie eine Ausnahme zu denufw-Regeln hinzu, indem Sie Folgendes eingeben:

sudo ufw allow mysql
OutputRule added
Rule added (v6)

Auf diese Weise können Remote-Verbindungsversuche nun Ihren MySQL-Server erreichen. Derzeit sind jedoch keine Benutzer konfiguriert, die eine Verbindung von einem Remotecomputer aus herstellen können. Im nächsten Schritt erstellen und konfigurieren wir einen MySQL-Benutzer, der eine Verbindung von Ihrem Client-Computer aus herstellen kann.

[[Schritt-5 - Erstellen eines dedizierten MySQL-Benutzers]] == Schritt 5 - Erstellen eines dedizierten MySQL-Benutzers

Zu diesem Zeitpunkt lehnt Ihr MySQL-Server jeden Verbindungsversuch von einem Remote-Client-Computer ab. Dies liegt daran, dass die vorhandenen MySQL-Benutzer nur für die lokale Verbindung vom MySQL-Server konfiguriert sind. Um dies zu beheben, erstellen Sie einen dedizierten Benutzer, der nur eine Verbindung von Ihrem Client-Computer herstellen kann.

Um einen solchen Benutzer zu erstellen, melden Sie sich erneut bei MySQL als Benutzer vonrootan:

mysql -u root -p

Erstellen Sie an der Eingabeaufforderung einen neuen Remotebenutzer mit dem BefehlCREATE USER. Sie können diesen Benutzer beliebig benennen. In diesem Handbuch wird er jedochmysql_user genannt. Stellen Sie sicher, dass Sie die IP-Adresse Ihres Client-Computers im Host-Teil der Benutzerspezifikation angeben, um die Verbindungen zu diesem Computer einzuschränken undpassword durch ein sicheres Kennwort Ihrer Wahl zu ersetzen. Geben Sie für eine gewisse Redundanz für den Fall, dass die Optionrequire_secure_transport in Zukunft deaktiviert wird, an, dass dieser Benutzer SSL benötigt, indem Sie die KlauselREQUIRE SSL einschließen, wie hier gezeigt:

CREATE USER 'mysql_user'@'your_mysql_client_IP' IDENTIFIED BY 'password' REQUIRE SSL;

Gewähren Sie als Nächstes den neuen Benutzern die Berechtigungen für die Datenbanken oder Tabellen, auf die sie Zugriff haben sollen. Erstellen Sie zur Demonstration eineexample-Datenbank:

CREATE DATABASE example;

Dann geben Sie Ihrem neuen Benutzer Zugriff auf diese Datenbank und alle ihre Tabellen:

GRANT ALL ON example.* TO 'mysql_user'@'your_mysql_client_IP';

Entleeren Sie als Nächstes die Berechtigungen, um diese Einstellungen sofort anzuwenden:

FLUSH PRIVILEGES;

Beenden Sie dann wieder die Shell, wenn Sie fertig sind:

exit

Ihr MySQL-Server ist jetzt so eingerichtet, dass Verbindungen von Ihrem Remote-Benutzer zugelassen werden. Um zu testen, ob Sie erfolgreich eine Verbindung zu MySQL herstellen können, müssen Sie das Paketmysql-client aufMySQL client installieren.

Melden Sie sich mitssh bei Ihrem Client-Computer an

ssh sammy@your_mysql_client_ip

Aktualisieren Sie dann den Paketindex des Client-Computers:

sudo apt update

Und installieren Siemysql-client mit dem folgenden Befehl:

sudo apt install mysql-client

Wenn Sie dazu aufgefordert werden, bestätigen Sie die Installation, indem SieENTER drücken.

Führen Sie nach Abschluss der Installation des Pakets durch APT den folgenden Befehl aus, um zu testen, ob Sie eine Verbindung zum Server herstellen können. Dieser Befehl enthält die Benutzeroption-u zur Angabe vonmysql_user und die Option-h zur Angabe der IP-Adresse vonMySQL server’s:

mysql -u mysql_user -p -h your_mysql_server_IP

Nach dem Absenden des Passworts werden Sie beim Remote-Server angemeldet. Verwenden Sie\s, um den Serverstatus zu überprüfen und zu bestätigen, dass Ihre Verbindung sicher ist:

\s
Output--------------
. . .
SSL:         Cipher in use is DHE-RSA-AES256-SHA
. . .
Connection:      your_mysql_server_IP via TCP/IP
. . .
--------------

Gehe zurück zur Shell:

exit

Sie haben bestätigt, dass Sie über SSL eine Verbindung zu MySQL herstellen können. Sie haben jedoch noch nicht bestätigt, dass der MySQL-Server unsichere Verbindungen ablehnt. Um dies zu testen, versuchen Sie erneut, eine Verbindung herzustellen. Fügen Sie diesmal jedoch--ssl-mode=disabled an den Anmeldebefehl an. Dadurch wirdmysql-client angewiesen, eine unverschlüsselte Verbindung herzustellen:

mysql -u mysql_user -p -h mysql_server_IP --ssl-mode=disabled

Nachdem Sie Ihr Passwort eingegeben haben, wird Ihre Verbindung abgelehnt:

OutputERROR 1045 (28000): Access denied for user 'mysql_user'@'mysql_server_IP' (using password: YES)

Dies zeigt, dass SSL-Verbindungen zulässig sind, während unverschlüsselte Verbindungen abgelehnt werden.

Zu diesem Zeitpunkt wurde Ihr MySQL-Server so konfiguriert, dass er sichere Remoteverbindungen akzeptiert. Sie können hier anhalten, wenn dies Ihren Sicherheitsanforderungen entspricht. Es gibt jedoch einige zusätzliche Elemente, die Sie implementieren können, um die Sicherheit und das Vertrauen zwischen Ihren beiden Servern zu verbessern.

[[Schritt 6 - Optionale Konfiguration der Validierung für MySQL-Verbindungen]] == Schritt 6 - (Optional) Konfigurieren der Validierung für MySQL-Verbindungen

Derzeit ist Ihr MySQL-Server mit einem SSL-Zertifikat konfiguriert, das von einer lokal generierten Zertifizierungsstelle signiert wurde. Das Zertifikat und das Schlüsselpaar des Servers reichen aus, um eingehende Verbindungen zu verschlüsseln.

Sie können die Vertrauensbeziehung, die eine Zertifizierungsstelle bereitstellen kann, jedoch noch nicht vollständig nutzen. Durch die Verteilung des CA-Zertifikats an die Clients sowie des Client-Zertifikats und des Schlüssels können beide Parteien nachweisen, dass ihre Zertifikate von einer gegenseitig vertrauenswürdigen Zertifizierungsstelle signiert wurden. Dies kann dazu beitragen, gefälschte Verbindungen von böswilligen Servern zu verhindern.

Um diesen zusätzlichen optionalen Schutz zu implementieren, übertragen wir die entsprechenden SSL-Dateien auf den Client-Computer, erstellen eine Client-Konfigurationsdatei und ändern den MySQL-Remotebenutzer so, dass er ein vertrauenswürdiges Zertifikat benötigt.

[.Hinweis]##

Note: Der in den folgenden Absätzen beschriebene Vorgang zum Übertragen des CA-Zertifikats, des Client-Zertifikats und des Client-Schlüssels auf den MySQL-Client umfasst das Anzeigen des Inhalts jeder Datei mitcat, das Kopieren dieses Inhalts in Ihre Zwischenablage und das Einfügen in eine neue Datei auf dem Client-Computer. Es ist zwar möglich, diese Dateien direkt mit einem Programm wiescp odersftp zu kopieren, dies erfordert jedoch auchset up SSH keys für beide Server, damit sie über SSH kommunizieren können.

Unser Ziel ist es, die Anzahl der möglichen Verbindungswege zu Ihrem MySQL-Server auf ein Minimum zu beschränken. Dieser Vorgang ist zwar etwas mühsamer als das direkte Übertragen der Dateien, aber er ist gleichermaßen sicher und erfordert nicht, dass Sie eine SSH-Verbindung zwischen den beiden Computern herstellen.

Erstellen Sie zunächst ein Verzeichnis fürMySQL client im Ausgangsverzeichnis Ihres Nicht-Root-Benutzers. Rufen Sie dieses Verzeichnisclient-ssl auf:

mkdir ~/client-ssl

Sperren Sie den Zugriff auf dieses Verzeichnis, damit nur der aktuelle Benutzer darauf zugreifen kann, da der Zertifikatschlüssel vertraulich ist:

chmod 700 ~/client-ssl

Zeigen Sie aufMySQL server den Inhalt des CA-Zertifikats an, indem Sie Folgendes eingeben:

sudo cat /var/lib/mysql/ca.pem
Output-----BEGIN CERTIFICATE-----

. . .

-----END CERTIFICATE-----

Kopieren Sie die gesamte Ausgabe einschließlich der ZeilenBEGIN CERTIFICATE undEND CERTIFICATE in Ihre Zwischenablage.

Erstellen Sie auf denMySQL client eine Datei mit demselben Namen im neuen Verzeichnis:

nano ~/client-ssl/ca.pem

Fügen Sie den kopierten Zertifikatsinhalt aus Ihrer Zwischenablage ein. Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Zeigen Sie als Nächstes das Client-Zertifikat aufMySQL serveran:

sudo cat /var/lib/mysql/client-cert.pem
Output-----BEGIN CERTIFICATE-----

. . .

-----END CERTIFICATE-----

Kopieren Sie den Dateiinhalt in Ihre Zwischenablage. Denken Sie auch hier daran, die erste und letzte Zeile einzuschließen.

Öffnen Sie eine gleichnamige Datei aufMySQL client im Verzeichnisclient-ssl:

nano ~/client-ssl/client-cert.pem

Fügen Sie den Inhalt aus Ihrer Zwischenablage ein. Speichern und schließen Sie die Datei.

Zeigen Sie abschließend den Inhalt der Client-Schlüsseldatei aufMySQL serveran:

sudo cat /var/lib/mysql/client-key.pem
Output-----BEGIN RSA PRIVATE KEY-----

. . .

-----END RSA PRIVATE KEY-----

Kopieren Sie den angezeigten Inhalt einschließlich der ersten und letzten Zeile in Ihre Zwischenablage.

Öffnen Sie aufMySQL client eine gleichnamige Datei im Verzeichnisclient-ssl:

nano ~/client-ssl/client-key.pem

Fügen Sie den Inhalt aus Ihrer Zwischenablage ein. Speichern und schließen Sie die Datei.

Der Client-Computer verfügt jetzt über alle Anmeldeinformationen, die für den Zugriff auf den MySQL-Server erforderlich sind. Der MySQL-Server ist jedoch immer noch nicht so eingerichtet, dass er vertrauenswürdige Zertifikate für Clientverbindungen erfordert.

Um dies zu ändern, melden Sie sich erneut beim Konto von MySQLrootunterMySQL serveran:

mysql -u root -p

Ändern Sie von hier aus die Sicherheitsanforderungen für Ihren Remote-Benutzer. Wenden Sie anstelle derREQUIRE SSL-Klausel dieREQUIRE X509-Klausel an. Dies impliziert die gesamte Sicherheit, die durch dieREQUIRE SSL-Klausel bereitgestellt wird, erfordert jedoch zusätzlich, dass der Verbindungsclient ein Zertifikat vorlegt, das von einer Zertifizierungsstelle signiert ist, der der MySQL-Server vertraut.

Verwenden Sie den BefehlALTER USER, um die Benutzeranforderungen anzupassen:

ALTER USER 'mysql_user'@'mysql_client_IP' REQUIRE X509;

Spülen Sie dann die Änderungen, um sicherzustellen, dass sie sofort angewendet werden:

FLUSH PRIVILEGES;

Beenden Sie wieder die Shell, wenn Sie fertig sind:

exit

Überprüfen Sie anschließend, ob Sie beide Teilnehmer beim Herstellen der Verbindung validieren können.

Versuchen Sie auf denMySQL client zunächst, eine Verbindung herzustellen, ohne die Client-Zertifikate anzugeben:

mysql -u mysql_user -p -h mysql_server_IP
OutputERROR 1045 (28000): Access denied for user 'mysql_user'@'mysql_client_IP' (using password: YES)

Wie erwartet lehnt der Server die Verbindung ab, wenn kein Clientzertifikat vorgelegt wird.

Stellen Sie nun eine Verbindung her, während Sie die Optionen--ssl-ca,--ssl-cert und--ssl-keyverwenden, um auf die relevanten Dateien im Verzeichnis~/client-ssl zu verweisen:

mysql -u mysql_user -p -h mysql_server_IP --ssl-ca=~/client-ssl/ca.pem --ssl-cert=~/client-ssl/client-cert.pem --ssl-key=~/client-ssl/client-key.pem

Sie haben dem Client die entsprechenden Zertifikate und Schlüssel zur Verfügung gestellt, sodass dieser Versuch erfolgreich ist:

Melden Sie sich wieder ab, um wieder auf Ihre Shell-Sitzung zuzugreifen:

exit

Nachdem Sie den Zugriff auf den Server bestätigt haben, können Sie eine kleine Verbesserung der Benutzerfreundlichkeit implementieren, um zu vermeiden, dass Sie die Zertifikatdateien bei jeder Verbindung angeben müssen.

Erstellen Sie in Ihrem Home-Verzeichnis auf dem Computer vonMySQL clienteine versteckte Konfigurationsdatei mit dem Namen~/.my.cnf:

nano ~/.my.cnf

Erstellen Sie oben in der Datei einen Abschnitt mit dem Namen[client]. Fügen Sie darunter die Optionenssl-ca,ssl-cert undssl-keyhinzu und verweisen Sie auf die entsprechenden Dateien, die Sie vom Server kopiert haben. Es wird so aussehen:

~/.my.cnf

[client]
ssl-ca = ~/client-ssl/ca.pem
ssl-cert = ~/client-ssl/client-cert.pem
ssl-key = ~/client-ssl/client-key.pem

Die Optionssl-ca weist den Client an, zu überprüfen, ob das vom MySQL-Server vorgelegte Zertifikat von der Zertifizierungsstelle signiert ist, auf die Sie verwiesen haben. Dadurch kann der Client darauf vertrauen, dass er eine Verbindung zu einem vertrauenswürdigen MySQL-Server herstellt. Ebenso verweisen die Optionenssl-cert undssl-key auf die Dateien, die erforderlich sind, um dem MySQL-Server zu beweisen, dass auch er über ein Zertifikat verfügt, das von derselben Zertifizierungsstelle signiert wurde. Sie benötigen dies, wenn der MySQL-Server überprüfen soll, ob der Client auch von der Zertifizierungsstelle als vertrauenswürdig eingestuft wurde.

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Jetzt können Sie eine Verbindung zum MySQL-Server herstellen, ohne die Optionen--ssl-ca,--ssl-cert und--ssl-key in der Befehlszeile hinzuzufügen:

mysql -u remote_user -p -h mysql_server_ip

Ihr Client und Ihr Server zeigen nun beim Aushandeln der Verbindung jeweils Zertifikate an. Jede Partei ist so konfiguriert, dass sie das Remote-Zertifikat mit dem lokal vorhandenen CA-Zertifikat vergleicht.

Fazit

Ihr MySQL-Server ist jetzt so konfiguriert, dass sichere Verbindungen von Remoteclients erforderlich sind. Wenn Sie die Schritte zum Überprüfen von Verbindungen mithilfe der Zertifizierungsstelle ausgeführt haben, wird von beiden Seiten ein gewisses Maß an Vertrauen hergestellt, dass die Remotepartei legitim ist.