Configurazione dell'accesso client a MySQL su Compute Engine a partire da un indirizzo IP privato


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

Utilizza questo tutorial se vuoi installare il tuo database MySQL su Compute Engine, ma vuoi limitare l'accesso solo a MySQL autorizzato in esecuzione su Compute Engine. Ti consigliamo di gestire la tua istanza MySQL, anziché utilizzare servizio gestito, a causa delle istanze tra regioni, dell'uso avanzato di parametri e di servizi in termini di prestazioni.

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 istanza è il client, come illustrato nel 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 basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per 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 su zona in cui creare per 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

    • Create a Compute Engine instance. Configure the instance as follows:
      • Name the instance my-server.
      • Imposta il flag --zone su zona in cui creare per 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 in corso...

        I seguenti passaggi descrivono come installare MySQL su un Compute Engine in esecuzione in un'istanza Compute Engine.

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

        Installazione del server MySQL in corso...

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

        1. Per connetterti all'istanza my-server, usa 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 stabilire una password root per MySQL ed eseguire la manutenzione di base della sicurezza sul server MySQL configurazione. Per ulteriori informazioni, consulta la documentazione documentazione di mysql_secure_installation

        1. Nella sessione SSH per l'istanza my-server, utilizza il comando seguente 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.

        Configurare il server MySQL

        Prima di poterti connettere da remoto al server MySQL, devi configurarlo in modo che ascolti sul suo indirizzo IP interno. Quindi, creerai un account utente non root per il client MySQL per la connessione al server.

        Tutti i comandi client MySQL devono includere 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 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 stabilito in un passaggio precedente.

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

          L'output sarà simile al seguente:

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

        Crea un utente MySQL

        La connessione da remoto come utente root è stata disattivata con la precedente Comando mysql_secure_installation. 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 my-client all'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, [ROOT_PASSWORD] con la tua password 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 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 di 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 zona Google Cloud.

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

        Verifica dell'accesso remoto dall'istanza client a server in corso...

        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. Verifica 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 sia in grado di connettersi correttamente a MySQL il server web all'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 una sicurezza consolidata di progettazione interna, potrebbe essere necessario creare una regola firewall per consentire a my-client per comunicare con la tua istanza my-server sulla 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 un ampio intervallo 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 clienti senza concedere l'accesso a un un ampio intervallo di indirizzi IP. È sufficiente assegnare il tag appropriato al nuovo un'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 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 seguenti spiegano come creare una nuova regola firewall da attivare con il tag my-client per comunicare con le istanze che hanno 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 in esecuzione su in Compute Engine. Consentire l'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 alla 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 account Google Cloud vengano addebitati costi relativi alle risorse usata in questo tutorial, puoi elimina il progetto o elimina 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