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


Questo tutorial illustra la procedura per eseguire 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 vuoi installare il tuo database MySQL su Compute Engine, ma vuoi limitare l'accesso solo ai client MySQL autorizzati in esecuzione anche su Compute Engine. Potresti voler gestire la tua istanza MySQL anziché utilizzare il servizio gestito a causa di istanze in più regioni, utilizzo avanzato dei parametri e esigenze di prestazioni specifiche.

Questo tutorial descrive come configurare l'app server MySQL in modo da accettare il traffico remoto da un client MySQL installato su un'istanza Compute Engine nella stessa rete privata.

Per informazioni su come scegliere l'opzione di deployment di MySQL corretta, consulta 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 esegui il deployment di due istanze Compute Engine. Un'istanza è il server e l'altra è il client, come mostrato nel seguente diagramma:

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.
  • Connettiti da remoto a MySQL.
  • Crea una regola firewall dei Controlli di servizio VPC.

Costi

In questo documento utilizzi 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 Google Cloud utenti potrebbero avere diritto a una prova gratuita.

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. Make sure 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. Make sure 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 la fatturazione continua eliminando le risorse che hai creato. Per ulteriori dettagli, consulta la sezione Pulizia.

Creazione di istanze Compute Engine

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

Crea un'istanza client 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 di server 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

        Installazione del client MySQL

        I passaggi riportati di seguito descrivono come installare MySQL su un'istanza Compute Engine.

        1. Per connetterti all'istanza my-client, utilizza il comando ssh.
        2. Aggiorna il gestore dei 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 riportati di seguito descrivono come installare MySQL su un'istanza Compute Engine.

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

        Migliorare la sicurezza dell'installazione di MySQL

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

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

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

        3. Inserisci una nuova password di 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.

        Configurazione del server MySQL

        Prima di poterti connettere da remoto al server MySQL, devi configurarlo in modo che ascolti sul suo indirizzo IP interno. Poi, 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 a 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 maggiori informazioni, consulta la documentazione di riferimento delle opzioni di comando 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 è simile al seguente:

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

        Crea un utente MySQL

        La connessione da remoto come utente root è stata disattivata con il comando mysql_secure_installation precedente. Devi creare un nuovo utente con le autorizzazioni necessarie per consentire le connessioni da remoto.

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

          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 e [ROOT_PASSWORD] con la password dell'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 per 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 cliente 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 Google Cloud zona.

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

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

        I passaggi seguenti descrivono 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 è simile al seguente:

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

        Questi passaggi verificano che il client MySQL possa 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 Compute Engine su una vasta gamma di porte, inclusa la porta MySQL, porta 3306. In ambienti non predefiniti con un'impronta di sicurezza stabilita, potrebbe essere necessario creare una regola firewall per consentire all'istanza my-client di comunicare con l'istanza my-server tramite la rete. In caso contrario, le due istanze non possono comunicare tra loro.

        Puoi basare le regole del firewall su intervalli di indirizzi IP o tag. Gli intervalli di indirizzi IP sono utili se vuoi concedere l'accesso a una vasta gamma di indirizzi IP interni. In alternativa, se vuoi concedere accesso a istanze specifiche sulla tua rete, i tag offrono una soluzione più flessibile. I tag semplificano l'aggiunta di nuovi client senza concedere l'accesso a una vasta gamma di indirizzi IP. Devi solo assegnare il tag appropriato alla nuova istanza del 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 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
        

        Aggiungere una nuova regola firewall

        I passaggi riportati di seguito descrivono come creare una nuova regola firewall per consentire alle istanze 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 un client non in esecuzione su Compute Engine non rientra nell'ambito di questo tutorial. Se devi consentire l'accesso non 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 tuo cliente esterno.
  • Esegui la pulizia

    Per evitare che al tuo Google Cloud account vengano addebitati costi per le 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. 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 di 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