In dieser Anleitung erfahren Sie, wie Sie eine MySQL-Datenbank in einem privaten Netzwerk in Google Cloud ausführen, um mithilfe von Compute Engine sicheren Remotezugriff auf die Datenbank zu ermöglichen.
Verwenden Sie diese Anleitung, wenn Sie eine eigene MySQL-Datenbank in Compute Engine installieren, aber den Zugriff auf autorisierte MySQL-Clients beschränken möchten, die auch in Compute Engine ausgeführt werden. Vielleicht möchten Sie Ihre eigene MySQL-Instanz verwalten und den verwalteten Dienst nicht verwenden, weil Sie es mit Instanzen aus verschiedenen Regionen zu tun haben, erweiterte Parameter verwenden und bestimmte Leistungsanforderungen haben.
In dieser Anleitung wird beschrieben, wie Sie Ihre MySQL-Serveranwendung konfigurieren, damit sie Remotetraffic von einem MySQL-Client annimmt, der in einer Compute Engine-Instanz im selben privaten Netzwerk installiert ist.
Informationen zur Auswahl der richtigen MySQL-Bereitstellungsoption finden Sie unter MySQL in Compute Engine installieren.
Für diese Anleitung wird vorausgesetzt, dass Sie mit folgenden Themen vertraut sind:
- Grundlegende Linux-Befehle
- Ubuntu-Server 18.04
- MySQL 5.7
- Compute Engine
Architektur
In dieser Anleitung stellen Sie zwei Compute Engine-Instanzen bereit. Eine Instanz ist der Server und die andere ist der Client. Dies wird in der folgenden Abbildung veranschaulicht:
Compute Engine-Instanzen erstellen
Erstellen Sie zwei Instanzen für MySQL – eine Client- und eine Serverinstanz.
Compute Engine-Clientinstanz erstellen
-
Name the instance
my-client
. -
Legen Sie das Flag
--zone
auf die Zone fest, in der Sie Ihre Instanz erstellen möchten. -
Legen Sie für das Flag
--image-project
den Wertubuntu-os-cloud
fest. -
Legen Sie für das Flag
--image-family
den Wertubuntu-1804-lts
fest. -
Legen Sie für das Flag
--scopes
den Werthttps://www.googleapis.com/auth/cloud-platform
fest. -
Create a Compute Engine instance. Configure the instance as follows:
-
Name the instance
my-server
. -
Legen Sie das Flag
--zone
auf die Zone fest, in der Sie Ihre Instanz erstellen möchten. -
Legen Sie für das Flag
--image-project
den Wertubuntu-os-cloud
fest. -
Legen Sie für das Flag
--image-family
den Wertubuntu-1804-lts
fest. -
Legen Sie für das Flag
--scopes
den Werthttps://www.googleapis.com/auth/cloud-platform
fest. - Zum Herstellen einer Verbindung zur Instanz
my-client
verwenden Sie den Befehlssh
. - Aktualisieren Sie den Paketmanager
apt-get
.sudo apt-get update
- Installieren Sie das MySQL-Clientpaket:
sudo apt-get -y install mysql-client-5.7
- Zum Herstellen einer Verbindung zur Instanz
my-server
verwenden Sie den Befehlssh
. - Aktualisieren Sie den Paketmanager
apt-get
.sudo apt-get update
- Installieren Sie das MySQL-Serverpaket:
sudo apt-get -y install mysql-server-5.7
Verwenden Sie in der SSH-Sitzung auf Ihrer
my-server
-Instanz den folgenden Befehl, um die Sicherheit Ihrer MySQL-Installation zu erhöhen.sudo mysql_secure_installation
Drücken Sie
enter
, um die Einrichtung des Plug-insVALIDATE PASSWORD
zu überspringen.Geben Sie zweimal ein neues Root-Passwort ein.
Geben Sie
Y
ein und drücken Sieenter
, um anonyme Nutzer zu entfernen.Geben Sie
Y
ein und drücken Sieenter
, um die Remote-Root-Anmeldung zu verhindern.Geben Sie
Y
ein und drücken Sieenter
, um die Testdatenbank zu entfernen.Geben Sie
Y
ein und drücken Sie dieenter
, um die Rechtetabellen zu aktualisieren.Stellen Sie in Cloud Shell eine SSH-Verbindung zur Instanz
my-server
her.Aktualisieren Sie die Konfigurationsdatei
/etc/mysql/mysql.conf.d/mysqld.cnf
mit den folgenden Informationen:LOCAL_IP=$(curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \ -H "Metadata-Flavor: Google") sudo sed -i "s|bind-address.*|bind-address = $LOCAL_IP|" /etc/mysql/mysql.conf.d/mysqld.cnf
Starten Sie den MySQL-Dienst neu, um die Änderungen auf den laufenden Server anzuwenden:
sudo service mysql restart
Prüfen Sie, ob der Server lokal ausgeführt wird. Ersetzen Sie
[ROOT_PASSWORD]
durch das Root-Passwort des MySQL-Servers, das Sie in einem vorherigen Schritt eingerichtet haben:sudo mysql --user=root -p[ROOT_PASSWORD] -e "show databases"
Die Ausgabe sieht in etwa so aus:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
Erstellen Sie in Cloud Shell eine Umgebungsvariable für die interne IP-Adresse
my-client
:CLIENT_IP=$(gcloud compute instances describe my-client \ --zone=ZONE \ --format='value(networkInterfaces[0].networkIP)')
Erstellen Sie einen neuen MySQL-Nutzer mit einem Passwort. Ersetzen Sie dabei
[MY_PASSWORD]
durch Ihr Passwort und[ROOT_PASSWORD]
durch das Passwort des MySQL-Root-Nutzers:sudo mysql -uroot -p[ROOT_PASSWORD] \ -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
Erteilen Sie dem neuen MySQL-Nutzer die Berechtigung, sich über die interne IP-Adresse von
my-client
beim Server anzumelden:sudo mysql -uroot -p[ROOT_PASSWORD] -e \ "GRANT ALL PRIVILEGES ON *.* TO 'TESTUSER'@'${CLIENT_IP}' \ IDENTIFIED BY '[MY_PASSWORD]';"
Zum Entfernen der externen IP-Adresse aktualisieren Sie die Konfigurationseinstellungen in Cloud Shell. Ersetzen Sie
[ZONE]
durch Ihre Google Cloud Zone.gcloud compute instances delete-access-config my-server \ --access-config-name "external-nat" \ --zone="ZONE"
- Stellen Sie in Cloud Shell eine SSH-Verbindung zur Instanz
my-client
her. Testen Sie die Verbindung. Listen Sie dafür die Datenbanken auf:
sudo mysql --host=my-server --user=TESTUSER \ --password=[MY_PASSWORD] -e "SHOW DATABASES;"
Die Ausgabe sieht in etwa so aus:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
Erstellen Sie in Cloud Shell eine Firewallregel, um die Kommunikation von
mysql-client
zumysql-server
zuzulassen:gcloud compute firewall-rules create "mysql-remote-access" \ --allow tcp:3306 --source-tags "mysql-client" \ --target-tags "mysql-server"
- Fügen Sie
my-server
eine externe IP-Adresse hinzu, um externe Verbindungen zuzulassen. - Fügen Sie die Quell-IP-Adresse des externen Clients den Firewallregeln hinzu.
- Ändern Sie das
TESTUSER
-Konto oder erstellen Sie ein Nutzerkonto, das an die Quell-IP-Adresse des externen Clients gebunden ist.
gcloud compute instances create my-server --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform
MySQL-Client installieren
In den folgenden Schritten wird beschrieben, wie Sie MySQL in einer Compute Engine-Instanz installieren.
MySQL-Server installieren
In den folgenden Schritten wird beschrieben, wie Sie MySQL in einer Compute Engine-Instanz installieren.
Sicherheit der MySQL-Installation verbessern
Sie müssen ein Root-Passwort für MySQL einrichten und grundlegende Schritte zur Verbesserung der Sicherheit für Ihre MySQL-Serverkonfiguration ausführen. Weitere Informationen finden Sie in der MySQL-Dokumentation zu
mysql_secure_installation
.MySQL-Server konfigurieren
Bevor Sie eine Remoteverbindung zum MySQL-Server herstellen können, müssen Sie ihn so konfigurieren, dass er seine interne IP-Adresse überwacht. Dann erstellen Sie ein Nutzerkonto ohne Root-Berechtigung für den MySQL-Client, um eine Verbindung zum Server herzustellen.
Alle MySQL-Clientbefehle müssen bestimmte Befehlszeilen-Flags enthalten (z. B. zur Authentifizierung). Die MySQL-Befehle in diesem Abschnitt umfassen folgende Flags:
--user
für den Nutzernamen,-p
für das Passwort und-e
, um die angegebene Anweisung auszuführen und die Shell danach sofort zu verlassen. Weitere Informationen finden Sie in der Referenz zu den MySQL 5.7-Befehlsoptionen.MySQL-Nutzer erstellen
Die Remote-Verbindung als Root-Nutzer wurde mit dem vorherigen Befehl
mysql_secure_installation
deaktiviert. Sie müssen einen neuen Nutzer mit den erforderlichen Berechtigungen erstellen, um Remoteverbindungen zuzulassen.Externe IP-Adresse für
my-server
entfernenDie Instanz
my-server
benötigt keine externe IP-Adresse, da der Client über eine interne IP-Adresse aufmy-server
zugreifen kann.Remotezugriff des Clients auf die Serverinstanz prüfen
In den folgenden Schritten wird beschrieben, wie Sie von Ihrer
my-client
-Instanz aus eine Verbindung zum MySQL-Server aufmy-server
herstellen.Mit diesen Schritten wurde bestätigt, dass Ihr MySQL-Client über die interne IP-Adresse erfolgreich eine Verbindung zum MySQL-Server herstellen kann.
Überlegungen zur Firewall in Produktionsumgebungen
Die standardmäßige Netzwerkkonfiguration in Google Cloud umfasst die Firewallregel
default-allow-internal
, die internen Traffic zwischen Compute Engine-Instanzen über einen breiten Bereich von Ports zulässt, einschließlich des MySQL-Ports3306
. In Umgebungen ohne Standardkonfiguration, für die bereits Sicherheitseinstellungen festgelegt wurden, müssen Sie unter Umständen eine Firewallregel erstellen, damit die Instanzmy-client
über das Netzwerk mit der Instanzmy-server
kommunizieren kann. Andernfalls können die beiden Instanzen nicht miteinander kommunizieren.Firewallregeln können auf IP-Adressbereichen oder Tags basieren. IP-Adressbereiche sind nützlich, wenn Sie einem breiten Bereich von internen IP-Adressen Zugriffsberechtigungen erteilen möchten. Soll der Zugriff dagegen auf bestimmte Instanzen im Netzwerk gewährt werden, stellen Tags eine flexiblere Lösung dar. Mit Tags können neue Clients einfacher hinzugefügt werden, ohne Zugriff auf einen breiten Bereich von IP-Adressen gewähren zu müssen. Sie müssen der neuen MySQL-Clientinstanz nur das entsprechende Tag zuweisen. Sie können beispielsweise eine neue Firewallregel erstellen, die Traffic von allen Clientinstanzen zulässt, die mit
mysql-client
getaggt sind.Damit sich Tags mit Firewallregeln verwenden lassen, können Sie den VMs
my-client
undmy-server
die entsprechenden Tags in Cloud Shell zuweisen:gcloud compute instances add-tags my-client --tags mysql-client --zone=ZONE gcloud compute instances add-tags my-server --tags mysql-server --zone=ZONE
Neue Firewallregel hinzufügen
In den folgenden Schritten wird beschrieben, wie Sie eine neue Firewallregel erstellen, damit Instanzen mit dem Tag
my-client
über Port3306
mit Instanzen kommunizieren können, denen das Tagmy-server
zugewiesen wurde.Sie können jetzt von
my-client
aus eine Verbindung zu MySQL herstellen.Überlegungen zum Zugriff externer Clients
Diese Anleitung behandelt den Zugriff von MySQL-Clients auf MySQL-Server, die beide auf Compute Engine ausgeführt werden. Im Rahmen dieser Anleitung kann nicht behandelt werden, wie der Zugriff von einem Client zugelassen wird, der nicht auf Compute Engine ausgeführt wird. Wenn Sie einen derartigen Zugriff zulassen müssen, ändern Sie Folgendes:
-
Name the instance
gcloud compute instances create my-client --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform