Configurazione dell'accesso client sull'indirizzo IP privato a MySQL su Compute Engine


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

Utilizza questo tutorial se vuoi installare il tuo database MySQL in Compute Engine, ma vuoi limitare l'accesso solo ai client MySQL autorizzati anche in esecuzione su Compute Engine. Ti consigliamo di gestire la tua istanza MySQL invece di utilizzare il servizio gestito, a causa delle istanze tra regioni, dell'utilizzo avanzato dei parametri e di esigenze di prestazioni specifiche.

Questo tutorial descrive come configurare l'app server MySQL in modo che accetti il 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 giusta, consulta Come installare MySQL su Compute Engine.

Questo tutorial presuppone che tu conosca le seguenti nozioni:

  • Comandi Linux di base
  • Ubuntu-server 18.04
  • MySQL 5.7
  • Compute Engine

Architettura

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

Architettura di due istanze di cui è stato eseguito il deployment

Obiettivi

  • Crea un'istanza Compute Engine e installa il server MySQL.
  • Crea un'istanza Compute Engine e installa il client MySQL.
  • Configura il server MySQL per l'accesso remoto.
  • Rimuovi l'accesso pubblico al server MySQL.
  • Connettersi da remoto 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 possono essere idonei a una prova senza costi aggiuntivi.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Attiva l'API Compute Engine.

    Abilita l'API

  5. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Attiva l'API Compute Engine.

    Abilita l'API

Al termine di questo tutorial, puoi evitare di continuare la fatturazione eliminando le risorse che hai creato. Consulta Pulizia per ulteriori dettagli.

Creazione di istanze di Compute Engine

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

Crea un'istanza client di Compute Engine

  • Crea un'istanza Compute Engine. Configura l'istanza come segue:
    • Assegna all'istanza il nome 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 del server Compute Engine

  • Crea un'istanza Compute Engine. Configura l'istanza come segue:
    • Assegna all'istanza il nome 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
  • Installazione del client MySQL

    I passaggi seguenti descrivono come installare MySQL su un'istanza di 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 client MySQL.
      sudo apt-get -y install mysql-client-5.7

    Installazione del server MySQL

    I passaggi seguenti descrivono come installare MySQL su un'istanza di 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 server MySQL.
      sudo apt-get -y install mysql-server-5.7

    Migliora la sicurezza dell'installazione di MySQL

    Devi stabilire una password root per MySQL ed eseguire la manutenzione di base della sicurezza 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 MySQL.

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

    3. Inserisci due volte la nuova password root.

    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.

    Configurazione del server MySQL

    Prima di connetterti da remoto al server MySQL, devi configurarlo per l'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 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 ulteriori informazioni, consulta il riferimento per le opzioni del comando 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 stabilito in un passaggio precedente.

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

      L'output è simile al seguente:

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

    Crea un utente MySQL

    La connessione da remoto 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 una password. Sostituisci [MY_PASSWORD] con la tua password, [ROOT_PASSWORD] con la password dell'utente root 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 ha bisogno di 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 dell'accesso remoto da un'istanza client all'altra in corso...

    I passaggi seguenti descrivono come connetterti al server MySQL su my-server dalla tua istanza my-client.

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

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

      L'output è simile al seguente:

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

    Questi passaggi verificano che il client MySQL sia in grado di connettersi correttamente al server MySQL tramite l'indirizzo IP interno.

    Considerazioni sul 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 di Compute Engine su un'ampia gamma di porte, tra cui la porta MySQL, porta 3306. In ambienti non predefiniti con un livello di sicurezza stabilito, potrebbe essere necessario creare una regola firewall per consentire all'istanza my-client di comunicare con l'istanza my-server sulla rete. In caso contrario, le due istanze non possono comunicare tra loro.

    Puoi basare le regole firewall su intervalli o tag di indirizzi IP. Gli intervalli di indirizzi IP sono utili se vuoi concedere l'accesso a un ampio intervallo 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 ampio intervallo di indirizzi IP. Devi assegnare il tag appropriato solo alla nuova istanza client MySQL. Ad esempio, puoi creare una nuova regola firewall che consente il traffico da tutte le istanze client contrassegnate con mysql-client.

    Per supportare le regole firewall utilizzando 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 descrivono come creare una nuova regola firewall per consentire alle istanze con il tag my-client di comunicare con le istanze che hanno 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 di client esterni

    Questo tutorial illustra l'accesso dai client MySQL ai server MySQL in esecuzione su Compute Engine. Non rientra nell'ambito di questo tutorial per consentire l'accesso da un client non in esecuzione su Compute Engine. Se devi consentire l'accesso non da 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 che hai creato per il tutorial.

    Per eliminare il progetto:

    1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

      Vai a Gestisci risorse

    2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
    3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

    Elimina le istanze

    Per eliminare un'istanza di Compute Engine:

    1. Nella console Google Cloud, vai alla pagina Istanze VM.

      Vai a Istanze VM

    2. Seleziona la casella di controllo per la tua istanza my-server.
    3. Per eliminare l'istanza, fai clic su Altre azioni, quindi su Elimina e segui le istruzioni.

    Passaggi successivi