Clientzugriff auf MySQL über private IP-Adressen in Compute Engine einrichten


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 Remote-Zugriff 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:

Architektur von zwei bereitgestellten Instanzen

Ziele

  • Compute Engine-Instanz erstellen und MySQL-Server installieren
  • Compute Engine-Instanz erstellen und MySQL-Client installieren
  • MySQL-Server für Remotezugriff konfigurieren
  • Öffentlichen Zugriff auf den MySQL-Server verhindern
  • Remoteverbindung zu MySQL herstellen
  • VPC Service Controls-Firewallregel erstellen

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

  • Compute Engine
  • Cloud Storage

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Compute Engine API aktivieren.

    Aktivieren Sie die API

  5. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  6. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  7. Compute Engine API aktivieren.

    Aktivieren Sie die API

Nach Abschluss dieser Anleitung können Sie weitere Kosten durch Löschen von erstellten Ressourcen vermeiden. Weitere Informationen finden Sie im Abschnitt Bereinigen.

Compute Engine-Instanzen erstellen

Erstellen Sie zwei Instanzen für MySQL – eine Client- und eine Serverinstanz.

Compute Engine-Clientinstanz erstellen

  • Erstellen Sie eine Compute Engine-Instanz: Konfigurieren Sie die Instanz wie folgt:
    • Geben Sie der Instanz den Namen my-client.
    • Legen Sie für das Flag --zone die Zone fest, in der Sie Ihre Instanz erstellen möchten.
    • Legen Sie für das Flag --image-project den Wert ubuntu-os-cloud fest.
    • Legen Sie für das Flag --image-family den Wert ubuntu-1804-lts fest.
    • Legen Sie für das Flag --scopes den Wert https://www.googleapis.com/auth/cloud-platform fest.
    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
  • Compute Engine-Serverinstanz erstellen

  • Erstellen Sie eine Compute Engine-Instanz: Konfigurieren Sie die Instanz wie folgt:
    • Geben Sie der Instanz den Namen my-server.
    • Legen Sie für das Flag --zone die Zone fest, in der Sie Ihre Instanz erstellen möchten.
    • Legen Sie für das Flag --image-project den Wert ubuntu-os-cloud fest.
    • Legen Sie für das Flag --image-family den Wert ubuntu-1804-lts fest.
    • Legen Sie für das Flag --scopes den Wert https://www.googleapis.com/auth/cloud-platform fest.
    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.

    1. Zum Herstellen einer Verbindung zur Instanz my-client verwenden Sie den Befehl ssh.
    2. Aktualisieren Sie den Paketmanager apt-get.
      sudo apt-get update
      
    3. Installieren Sie das MySQL-Clientpaket:
      sudo apt-get -y install mysql-client-5.7

    MySQL-Server installieren

    In den folgenden Schritten wird beschrieben, wie Sie MySQL in einer Compute Engine-Instanz installieren.

    1. Zum Herstellen einer Verbindung zur Instanz my-server verwenden Sie den Befehl ssh.
    2. Aktualisieren Sie den Paketmanager apt-get.
      sudo apt-get update
      
    3. Installieren Sie das MySQL-Serverpaket:
      sudo apt-get -y install mysql-server-5.7

    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.

    1. 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
      
    2. Drücken Sie enter, um die Einrichtung des Plug-ins VALIDATE PASSWORD zu überspringen.

    3. Geben Sie zweimal ein neues Root-Passwort ein.

    4. Geben Sie Y ein und drücken Sie enter, um anonyme Nutzer zu entfernen.

    5. Geben Sie Y ein und drücken Sie enter, um die Remote-Root-Anmeldung zu verhindern.

    6. Geben Sie Y ein und drücken Sie enter, um die Testdatenbank zu entfernen.

    7. Geben Sie Y ein und drücken Sie die enter, um die Rechtetabellen zu aktualisieren.

    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.

    1. Stellen Sie in Cloud Shell eine SSH-Verbindung zur Instanz my-server her.

    2. 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
      
    3. Starten Sie den MySQL-Dienst neu, um die Änderungen auf den laufenden Server anzuwenden:

      sudo service mysql restart
      
    4. 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                |
      +--------------------+
      

    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.

    1. 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)')
      
    2. 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]';"
      
    3. 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]';"
      

    Externe IP-Adresse für my-server entfernen

    Die Instanz my-server benötigt keine externe IP-Adresse, da der Client über eine interne IP-Adresse auf my-server zugreifen kann.

    • 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"
      

    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 auf my-server herstellen.

    1. Stellen Sie in Cloud Shell eine SSH-Verbindung zur Instanz my-client her.
    2. 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                |
      +--------------------+
      

    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-Ports 3306. In Umgebungen ohne Standardkonfiguration, für die bereits Sicherheitseinstellungen festgelegt wurden, müssen Sie unter Umständen eine Firewallregel erstellen, damit die Instanz my-client über das Netzwerk mit der Instanz my-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 und my-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 Port 3306 mit Instanzen kommunizieren können, denen das Tag my-server zugewiesen wurde.

    • Erstellen Sie in Cloud Shell eine Firewallregel, um die Kommunikation von mysql-client zu mysql-server zuzulassen:

      gcloud compute firewall-rules create "mysql-remote-access" \
          --allow tcp:3306 --source-tags "mysql-client" \
          --target-tags "mysql-server"
      

    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:

    • 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.

    Bereinigen

    Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt oder die Instanzen löschen.

    Projekt löschen

    Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.

    So löschen Sie das Projekt:

    1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

      Zur Seite „Ressourcen verwalten“

    2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
    3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

    Instanzen löschen

    So löschen Sie eine Compute Engine-Instanz:

    1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

      Zu Seite „VM-Instanzen“

    2. Klicken Sie auf das Kästchen für die Instanz my-server.
    3. Klicken Sie zum Löschen der Instanz auf Weitere Aktionen, dann auf Löschen, und folgen Sie dann der Anleitung.

    Nächste Schritte