So aktivieren Sie SSL und Remote-Verbindungen für MySQL unter CentOS 7
MySQL ist ein relationales Open-Source-Datenbanksystem, das auf vielen Betriebssystemen wie Windows, Linux, MacOS und FreeBSD funktioniert. Es ist wahrscheinlich das beliebteste OpenSource-RDBMS und eine zentrale Komponente der LAMP- und LEMP-Stacks. Es gibt viele Anwendungen, die auf MySQL angewiesen sind, wie WordPress, Joomla, TYPO3, phpBB und viele mehr.
In diesem Tutorial werde ich Ihnen Schritt für Schritt zeigen, wie Sie MySQL sicher für Remote-Verbindungen konfigurieren können. Wenn Sie auf MySQL aus der Ferne zugreifen müssen, ist es entweder erforderlich, ein VPN zu verwenden, da MySQL die übertragenen Daten nicht verschlüsselt, oder Sie können MySQL für die Verwendung von SSL konfigurieren, wie ich Ihnen in diesem Tutorial zeigen werde. In dieser Konfiguration dürfen sich nur Benutzer mit den richtigen SSL-Zertifikatsdateien mit dem MySQL-Server verbinden, und der Datenverkehr wird verschlüsselt. Wir werden die neueste Version von MySQL installieren und dann SSL für die Remote-Verbindung konfigurieren. Für das Basissystem werde ich einen CentOS 7 Server verwenden.
Was wir tun werden:
- MySQL installieren.
- Konfigurieren Sie das MySQL Root-Passwort.
- Neue selbstsignierte SSL-Zertifikatsdateien erzeugen.
- SSL für MySQL aktivieren.
- Fernverbindung aktivieren.
- Test.
Voraussetzung
- CentOS 7 Server
- Root-Rechte
Schritt 1 – MySQL installieren
In diesem Tutorial verwenden wir MySQL 5.7, die aktuellste Version. Es wird aus dem MySQL-Repository installiert, daher müssen wir zuerst ein neues CentOS-Repository zum System hinzufügen.
Fügen Sie das neue Repository für MySQL mit dem Befehl yum unten hinzu.
yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
Sie werden nach der Installation eines neuen Pakets gefragt, geben Sie ‚y‚ ein und drücken Sie ‚Enter‚ zur Bestätigung.
Jetzt können Sie die MySQL neueste Version 5.7 auf dem Server wie folgt installieren:
yum -y install mysql-community-server
Wenn die Installation abgeschlossen ist, starten Sie den MySQL-Dienst und aktivieren Sie ihn mit dem Befehl systemctl automatisch zum Startzeitpunkt.
systemctl start mysqld systemctl enable mysqld
Stellen Sie sicher, dass MySQL läuft, indem Sie den von MySQL verwendeten Port (3306) überprüfen. Überprüfen Sie dies mit dem Befehl netstat unten.
netstat -plntu
MySQL wurde auf CentOS 7 aus dem MySQL-Repository installiert.
Schritt 2 – Konfigurieren des MySQL Root-Passworts
Standardmäßig generiert MySQL 5.7 beim ersten Start des Dienstes ein Standard-Root-Passwort für Sie. Das Passwort wird in der MySQL-Logdatei ‚/var/log/mysqld.log‘ gespeichert.
Um das standardmäßige MySQL-Root-Passwort anzuzeigen, können Sie den folgenden grep-Befehl verwenden.
grep 'temporary' /var/log/mysqld.log
Du wirst ein ähnliches Ergebnis wie unten sehen, mein Standardpasswort ist’wxtX8Te&Uh1K‚.
A temporary password is generated for root@localhost: wxtX8Te&Uh1K
Verbinden Sie sich mit der MySQL-Shell mit dem Standardpasswort und ersetzen Sie das Passwort durch Ihr eigenes Passwort.
mysql -u root -p TYPE IN DEFAULT PASSWORD
Ersetzen Sie nun das Standardpasswort durch Ihr eigenes Passwort. In diesem Tutorial werde ich ‚Hakase-labs123@‚ als neues MySQL-Rootpasswort verwenden. Führen Sie untenstehende MySQL-Abfragen aus.
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Hakase-labs123@'; flush privileges; exit;
Jetzt können Sie sich wieder mit dem neuen Passwort’Hakase-labs123@‘ anmelden.
mysql -u root -p TYPE NEW PASSWORD 'Hakase-labs123@'
Schritt 3 – Erstellen neuer selbstsignierter Zertifikatsdateien
Standardmäßig hat MySQL 5.7 seine eigenen SSL-Zertifikatsdateien im Verzeichnis’/var/lib/mysql‘. Aber in diesem Tutorial werde ich Ihnen zeigen, wie Sie Ihre eigenen SSL-Zertifikatsdateien mit OpenSSL erzeugen und dann mit MySQL konfigurieren können.
In diesem Schritt werden wir neue selbstsignierte Zertifikatsdateien generieren. Wir benötigen 3 Zertifikate, CA-Zertifikat, Server-Zertifikat und Schlüssel, Client-Zertifikat und Schlüssel. Wir werden sie mit OpenSSL erstellen.
Erstellen Sie ein neues Verzeichnis für die SSL-Zertifikatsdateien ‚/etc/certs/‘ und wechseln Sie in dieses Verzeichnis.
mkdir -p /etc/certs cd /etc/certs
Generieren Sie eine neue CA-Zertifikat ca.pem-Datei.
openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
Als nächstes müssen wir die serverseitigen Zertifikate erstellen. Erstellen Sie neue Serverzertifikate server-cert.pem und server-key.pem Dateien. Erzeugen Sie neue Zertifikatsdateien, entfernen Sie die Passphrase und signieren Sie sie mit dem CA-Zertifikat.
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem openssl rsa -in server-key.pem -out server-key.pem openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Erzeugen Sie nun Zertifikatsdateien für den Client. Der MySQL-Server akzeptiert nur Remote-Verbindungen von dem Client, der diese Zertifikatsdateien hat. Erzeugen Sie neue Client-Zertifikatsdateien, entfernen Sie die Passphrase und signieren Sie sie mit dem CA-Zertifikat.
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem openssl rsa -in client-key.pem -out client-key.pem openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Hinweis:
Die CA-Zertifikat-Info muss sich von der Client- und Server-Info unterscheiden.
Alle Zertifikate, die wir für dieses Setup benötigen, wurden generiert. Jetzt können wir Zertifikatsdateien mit dem folgenden Befehl überprüfen.
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
Stellen Sie sicher, dass kein Fehler vorliegt, die Ergebnisse wie unten beschrieben.
Alle Zertifikatsdateien wurden verifiziert. Ändern Sie den Besitzer des certs-Verzeichnisses auf den Benutzer’mysql‘ und die Berechtigungen aller Schlüsseldateien.
chown -R mysql:mysql /etc/certs/ chmod 600 client-key.pem server-key.pem ca-key.pem
Schritt 4 – SSL für MySQL aktivieren
In diesem Schritt werden wir SSL für MySQL aktivieren. Bevor wir mit der Konfiguration und Aktivierung von SSL auf MySQL beginnen, müssen wir die Standard-Zertifikatsdateien in das neue Backup-Verzeichnis sichern.
Erstellen Sie ein neues Backup-Verzeichnis ‚mysql-certs‚ für alle Zertifikate.
mkdir -p ~/mysql-certs/
Gehen Sie in das Verzeichnis’/var/lib/mysql‘ und verschieben Sie alle Standardzertifikate in das Backup-Verzeichnis.
cd /var/lib/mysql/ mv ca.pem ca-key.pem ~/mysql-certs/ mv server-key.pem server-cert.pem ~/mysql-certs/ mv client-key.pem client-cert.pem ~/mysql-certs/ mv private_key.pem public_key.pem ~/mysql-certs/
Starten Sie nun den MySQL-Dienst neu.
systemctl restart mysqld
Als nächstes überprüfen Sie SSL in der MySQL-Shell. Melden Sie sich mit dem neuen Passwort bei mysql an:
mysql -u root -p TYPE NEW PASSWORD 'Hakase-labs123@'
Führen Sie die folgende Abfrage aus, damit wir den SSL-Status für MySQL sehen können.
SHOW GLOBAL VARIABLES LIKE '%ssl%'; STATUS;
Sie werden sehen, dass der SSL-Status‘DISABLED‚ lautet und der Root-Benutzer ohne SSL verbunden wurde.
Als nächstes werden wir die SSL-Verbindung für MySQL aktivieren. Wir müssen die MySQL-Konfigurationsdatei ‚my.cnf‚ Datei mit vim bearbeiten.
vim /etc/my.cnf
Fügen Sie im Abschnitt [mysqld]‚ die folgende Konfiguration ein.
# Type your own certificates directory ssl-ca=/etc/certs/ca.pem ssl-cert=/etc/certs/server-cert.pem ssl-key=/etc/certs/server-key.pem
Speichern Sie die Datei und beenden Sie vim, den MySQL-Dienst neu starten.
systemctl restart mysqld
Melden Sie sich nun erneut am MySQL an und überprüfen Sie das SSL.
mysql -u root -p TYPE NEW PASSWORD 'Hakase-labs123@'
Führen Sie die folgende Abfrage durch, um sicherzustellen, dass der Wert des SSL-Abschnitts JA“ ist.
SHOW VARIABLES LIKE '%ssl%'; STATUS;
Sie werden sehen, dass SSL for MySQL aktiviert ist, aber der Root-Benutzer immer noch nicht über die SSL-Verbindung verbunden ist.
Um die gesamte lokale Benutzerverbindung mit SSL zu erzwingen, bearbeiten Sie die mysql-Konfigurationsdatei ‚my.cnf‚ erneut.
vim /etc/my.cnf
Fügen Sie die Konfiguration unten an das Ende der Zeile ein.
[client] ssl-ca=/etc/certs/ca.pem ssl-cert=/etc/certs/client-cert.pem ssl-key=/etc/certs/client-key.pem
Speichern und beenden Sie MySQL und starten Sie es dann neu.
systemctl restart mysqld
Verbinden Sie sich erneut mit dem MySQL und überprüfen Sie die Verbindung und SSL aktiviert.
mysql -u root -p TYPE NEW PASSWORD 'Hakase-labs123@'
SHOW VARIABLES LIKE ‚%ssl%‘;
STATUS;
SSL wurde aktiviert und die lokale Verbindung verwendet ebenfalls SSL.
Schritt 5 – Aktivieren von Remote-Verbindungen
In den obigen Schritten haben wir bereits SSL für den MySQL-Server aktiviert, und lokale Verbindungen sind gezwungen, SSL zu verwenden. In diesem Schritt werden wir Remote-Verbindungen für MySQL aktivieren, aber wir erlauben nur Clients, die von unserer CA signierte Zertifikatsdateien haben, sich mit dem MySQL-Server zu verbinden.
MySQL-Konfigurationsdatei mit vim bearbeiten.
vim /etc/my.cnf
Fügen Sie diese Konfiguration unten am Ende des Abschnitts ‚[mysqld]‚ ein.
bind-address = * require_secure_transport = ON
Speichern Sie die Datei und beenden Sie den Editor, den Neustart von MySQL.
systemctl restart mysqld
Erstellen Sie anschließend einen neuen Benutzer für die Remote-Verbindung. Ich werde einen neuen Benutzer namens‘hakase‚ mit dem Passwort‘Hakase-labs123@‚ erstellen und dem‘hakase‚-Benutzer alle Rechte gewähren. Der Benutzer „hakase“ kann sich nur mit dem Zertifikatsschlüssel verbinden.
mysql -u root -p TYPE NEW PASSWORD 'Hakase-labs123@'
create user ‚hakase’@’%‘ identified by ‚Hakase-labs123@‘ REQUIRE X509;
grant all privileges on *.* to ‚hakase’@’%‘ identified by ‚Hakase-labs123@‘ REQUIRE X509;
flush privileges;
Es wurde ein neuer Benutzer für die Remote-Verbindung angelegt.
Hinweis:
Möglicherweise sehen Sie‘1 Warnung‚ im Ergebnis der mysql-Abfrage. Es ist nur eine Warnung, ALTER USER-Abfrage anstelle eines GRANT zu verwenden, da die’GRANT‘-Abfrage im nächsten Release veraltet sein wird.
Schritt 6 – Prüfung
Im letzten Abschnitt dieses Tutorials werden wir testen, ob der neue Benutzer namens’hakase‘ in der Lage ist, sich mit Zertifikatsdateien remote mit dem MySQL-Server zu verbinden. Es müssen drei Zertifikate für den Client heruntergeladen werden.
- CA-Zertifikat – ca.pem
- Kundenzertifikat – client-cert.pem
- Kundenschlüssel – client-key.pem
Ich habe mich in ein anderes Linux-System eingeloggt und dort die mysql-client Pakete installiert. Dann habe ich alle Client-Zertifikatsdateien mit SCP heruntergeladen. Jetzt werde ich mich mit dem MySQL-Server mit den Zertifikatsdateien verbinden.
mysql -h 10.0.15.11 -u hakase \ --ssl-ca=ca.pem \ --ssl-cert=client-cert.pem \ --ssl-key=client-key.pem -p
10.0.15.11 = IP-Adresse des MySQL-Servers.
Sie können den Verbindungsstatus mit dieser Abfrage unten sehen.
STATUS;
Benutzer hakase mit IP-Adresse 10.0.15.10.10 Verbunden mit dem MySQL-Server mit IP-Adresse 10.0.15.11, die Verbindung über TCP/IP auf Port 3306 und über SSL.
Wenn Sie versuchen, eine Verbindung ohne Zertifikatsdateien herzustellen, wird der Fehler wie folgt angezeigt.
Als nächstes werde ich mit der MySQLWorkbench GUI von meinem Host aus testen.
Unten ist meine Konfiguration – Parameter einstellen.
SSL-Konfiguration – Einstellung von SSL.
Und unten die Ergebnisse der Verbindung mit SSL Client Zertifikatsdateien.
Ein neuer Benutzer hat sich erfolgreich per Fernzugriff mit dem MySQL-Datenbankserver über eine SSL-Verbindung verbunden. Wenn ein Benutzer versucht, sich ohne die Zertifikatsdateien zu verbinden, wird das Ergebnis als‘abgelehnt‚ angezeigt. Die Installation und Konfiguration von MySQL mit SSL-Verbindung wurde erfolgreich durchgeführt.