Configura l'accesso client tramite un indirizzo IP privato a MySQL su Compute Engine


Questo tutorial spiega il processo di esecuzione di un database MySQL su una rete privata in Google Cloud per consentire l'accesso remoto sicuro al database utilizzando Compute Engine.

Utilizza questo tutorial se intendi installare il tuo database MySQL su Compute Engine, ma vuoi limitare l'accesso ai soli client MySQL autorizzati eseguiti ugualmente su Compute Engine. Invece di utilizzare il servizio gestito, potresti voler gestire la tua istanza MySQL a causa della presenza di istanze in più regioni, dell'utilizzo avanzato dei parametri e di specifiche esigenze riguardo alle prestazioni.

Questo tutorial descrive come configurare l'app MySQL Server per l'accettazione del traffico remoto da un client MySQL installato su un'istanza Compute Engine sulla stessa rete privata.

Per informazioni su come scegliere l'opzione di deployment di MySQL corretta, vedi Come installare MySQL su Compute Engine.

Questo tutorial presuppone che tu abbia familiarità con quanto segue:

  • Comandi Linux di base
  • Ubuntu Server 18.04
  • MySQL 5.7
  • Compute Engine

Architettura

In questo tutorial eseguirai il deployment di due istanze Compute Engine. Un'istanza è il server e l'altra è il client, come illustrato dal seguente diagramma:

Architettura di due istanze di cui è stato eseguito il deployment

Obiettivi

  • Creare un'istanza Compute Engine e installare il server MySQL.
  • Creare un'istanza Compute Engine e installare il client MySQL.
  • Configurare il server MySQL per l'accesso remoto.
  • Rimuovere l'accesso pubblico al server MySQL.
  • Stabilire una connessione remota a MySQL.
  • Creare una regola firewall per i Controlli di servizio VPC.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

  • Compute Engine
  • Cloud Storage

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine API.

    Enable the API

Al termine di questo tutorial, puoi evitare l'addebito di ulteriori costi eliminando le risorse create. Per maggiori dettagli, vedi Esegui la pulizia.

Crea istanze Compute Engine

Crea due istanze per MySQL: un'istanza client e un'istanza server.

Crea un'istanza client di Compute Engine

  • Create a Compute Engine instance. Configure the instance as follows:
    • Name the instance my-client.
    • Imposta il flag --zone sulla zona in cui vuoi creare l'istanza.
    • Imposta il flag --image-project su ubuntu-os-cloud.
    • Imposta il flag --image-family su ubuntu-1804-lts.
    • Imposta il flag --scopes su https://www.googleapis.com/auth/cloud-platform.
    • 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

      Crea un'istanza server di Compute Engine

    • Create a Compute Engine instance. Configure the instance as follows:
      • Name the instance my-server.
      • Imposta il flag --zone sulla zona in cui vuoi creare l'istanza.
      • Imposta il flag --image-project su ubuntu-os-cloud.
      • Imposta il flag --image-family su ubuntu-1804-lts.
      • Imposta il flag --scopes su https://www.googleapis.com/auth/cloud-platform.
      • 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

        Installa il client MySQL

        I passaggi seguenti spiegano come installare MySQL su un'istanza Compute Engine.

        1. Per connetterti all'istanza my-client, utilizza il comando ssh.
        2. Aggiorna il gestore di pacchetti apt-get.
          sudo apt-get update
          
        3. Installa il pacchetto del client MySQL.
          sudo apt-get -y install mysql-client-5.7

        Installa il server MySQL

        I passaggi seguenti spiegano come installare MySQL su un'istanza Compute Engine.

        1. Per connetterti all'istanza my-server, utilizza il comando ssh.
        2. Aggiorna il gestore di pacchetti apt-get.
          sudo apt-get update
          
        3. Installa il pacchetto del server MySQL.
          sudo apt-get -y install mysql-server-5.7

        Migliora la sicurezza dell'installazione di MySQL

        Devi impostare una password root per MySQL ed eseguire una manutenzione di sicurezza di base sulla configurazione del server MySQL. Per ulteriori informazioni, consulta la documentazione di MySQL per mysql_secure_installation.

        1. Nella sessione SSH per l'istanza my-server, utilizza il seguente comando per migliorare la sicurezza dell'installazione di MySQL.

          sudo mysql_secure_installation
          
        2. Premi enter per ignorare la configurazione del plug-in VALIDATE PASSWORD.

        3. Inserisci una nuova password root due volte.

        4. Per rimuovere gli utenti anonimi, inserisci Y e premi enter.

        5. Per impedire l'accesso root remoto, inserisci Y e premi enter.

        6. Per rimuovere il database di test, inserisci Y e premi enter.

        7. Per ricaricare le tabelle dei privilegi, inserisci Y e premi enter.

        Configura il server MySQL

        Per connetterti da remoto al server MySQL, devi prima configurarlo in modo che rimanga in ascolto sul suo indirizzo IP interno. Quindi, crea un account utente non root per consentire al client MySQL di connettersi al server.

        Tutti i comandi del client MySQL devono includere determinati flag della riga di comando (ad esempio, per l'autenticazione). I comandi MySQL a cui si fa riferimento in questa sezione includono i seguenti flag: --user per il nome utente, -p per la password e -e per eseguire l'istruzione specificata e uscire immediatamente. Per maggiori informazioni, consulta la documentazione di riferimento per le opzioni dei comandi di MySQL 5.7.

        1. In Cloud Shell, utilizza SSH per connetterti all'istanza my-server.

        2. Aggiorna il file di configurazione /etc/mysql/mysql.conf.d/mysqld.cnf con le seguenti informazioni:

          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. Riavvia il servizio MySQL per applicare le modifiche al server in esecuzione.

          sudo service mysql restart
          
        4. Verifica che il server sia in esecuzione localmente. Sostituisci [ROOT_PASSWORD] con la password root del server MySQL che hai impostato in un passaggio precedente.

          sudo mysql --user=root -p[ROOT_PASSWORD] -e "show databases"
          

          L'output visualizzato è simile al seguente:

          +--------------------+
          | Database           |
          +--------------------+
          | information_schema |
          | mysql              |
          | performance_schema |
          | sys                |
          +--------------------+
          

        Crea un utente MySQL

        La connessione remota come utente root è stata disabilitata con il comando mysql_secure_installation precedente. Devi creare un nuovo utente con le autorizzazioni necessarie per consentire le connessioni remote.

        1. In Cloud Shell, crea una variabile di ambiente per l'indirizzo IP interno my-client.

          CLIENT_IP=$(gcloud compute instances describe my-client \
              --zone=ZONE \
              --format='value(networkInterfaces[0].networkIP)')
          
        2. Crea un nuovo utente MySQL con password. Sostituisci [MY_PASSWORD] con la tua password e [ROOT_PASSWORD] con la password utente root di MySQL.

          sudo mysql -uroot -p[ROOT_PASSWORD] \
              -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
          
        3. Concedi al nuovo utente MySQL l'autorizzazione ad accedere al server dall'indirizzo IP interno di my-client.

          sudo mysql -uroot -p[ROOT_PASSWORD] -e \
              "GRANT ALL PRIVILEGES ON *.* TO 'TESTUSER'@'${CLIENT_IP}' \
              IDENTIFIED BY '[MY_PASSWORD]';"
          

        Rimuovi l'indirizzo IP esterno per my-server

        L'istanza my-server non richiede un indirizzo IP esterno perché il client può accedere a my-server tramite un indirizzo IP interno.

        • Per rimuovere l'indirizzo IP esterno, aggiorna le impostazioni di configurazione in Cloud Shell. Sostituisci [ZONE] con la tua zona Google Cloud .

          gcloud compute instances delete-access-config my-server \
              --access-config-name "external-nat" \
              --zone="ZONE"
          

        Verifica l'accesso remoto dal client all'istanza del server

        I passaggi seguenti spiegano come connettersi al server MySQL su my-server dall'istanza my-client.

        1. In Cloud Shell, utilizza SSH per connetterti all'istanza my-client.
        2. Testa la connessione elencando i database.

          sudo mysql --host=my-server --user=TESTUSER \
              --password=[MY_PASSWORD] -e "SHOW DATABASES;"
          

          L'output visualizzato è simile al seguente:

          +--------------------+
          | Database           |
          +--------------------+
          | information_schema |
          | mysql              |
          | performance_schema |
          | sys                |
          +--------------------+
          

        Questi passaggi consentono di verificare che il client MySQL possa connettersi al server MySQL tramite l'indirizzo IP interno.

        Considerazioni sui firewall negli ambienti di produzione

        La configurazione di rete predefinita in Google Cloud include una regola firewall, default-allow-internal, che consente il traffico interno tra le istanze Compute Engine su una vasta gamma di porte, inclusa la porta MySQL (porta 3306). Negli ambienti non predefiniti con un assetto di sicurezza consolidato potrebbe essere necessario creare una regola firewall per consentire all'istanza my-client di comunicare con l'istanza my-server attraverso la rete. In caso contrario, le due istanze non possono comunicare tra loro.

        Puoi basare le regole firewall su intervalli di indirizzi IP o tag. Gli intervalli di indirizzi IP sono utili se vuoi concedere l'accesso a un'ampia gamma di indirizzi IP interni. In alternativa, se vuoi concedere l'accesso a istanze specifiche sulla tua rete, i tag forniscono una soluzione più flessibile. I tag semplificano l'aggiunta di nuovi client senza concedere l'accesso a un'ampia gamma di indirizzi IP. Devi solo assegnare il tag appropriato alla nuova istanza client MySQL. Ad esempio, puoi creare una nuova regola firewall che consenta il traffico da tutte le istanze client contrassegnate dal tag mysql-client.

        Per supportare le regole firewall che utilizzano i tag, puoi assegnare i tag appropriati alle VM my-client e my-server in Cloud Shell.

        gcloud compute instances add-tags my-client --tags mysql-client --zone=ZONE
        
        gcloud compute instances add-tags my-server --tags mysql-server --zone=ZONE
        

        Aggiungi una nuova regola firewall

        I passaggi seguenti spiegano come creare una nuova regola firewall per consentire alle istanze contrassegnate con il tag my-client di comunicare con le istanze con il tag my-server utilizzando la porta 3306.

        • In Cloud Shell, crea una regola firewall per consentire le comunicazioni da mysql-client a mysql-server.

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

        Ora puoi connetterti a MySQL da my-client.

        Considerazioni sull'accesso da client esterni

        Questo tutorial illustra l'accesso dai client MySQL ai server MySQL, entrambi in esecuzione su Compute Engine. L'autorizzazione dell'accesso da parte di un client che non è in esecuzione su Compute Engine non rientra nell'ambito di questo tutorial. Se devi consentire l'accesso al di fuori di Compute Engine, modifica quanto segue:

        • Aggiungi un indirizzo IP esterno a my-server per consentire la connettività esterna.
        • Aggiungi l'indirizzo IP di origine del client esterno alle regole firewall.
        • Modifica l'account TESTUSER o crea un account utente associato all'indirizzo IP di origine del client esterno.
  • Esegui la pulizia

    Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, puoi eliminare il progetto o eliminare le istanze.

    Elimina il progetto

    Il modo più semplice per eliminare la fatturazione è eliminare il progetto creato per il tutorial.

    Per eliminare il progetto:

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Elimina le istanze

    Per eliminare un'istanza Compute Engine:

    1. In the Google Cloud console, go to the VM instances page.

      Go to VM instances

    2. Select the checkbox for your my-server instance.
    3. To delete the instance, click More actions, click Delete, and then follow the instructions.

    Passaggi successivi