Configurer un accès client à MySQL via une adresse IP privée sur Compute Engine


Ce tutoriel vous explique comment exécuter une base de données MySQL sur un réseau privé dans Google Cloud pour permettre un accès à distance et sécurisé à la base de données à l'aide de Compute Engine.

Utilisez ce tutoriel si vous souhaitez installer votre propre base de données MySQL sur Compute Engine, tout en limitant l’accès aux seuls clients MySQL autorisés qui s'exécutent également sur Compute Engine. Vous voudrez peut-être gérer votre propre instance MySQL au lieu d'utiliser le service géré, par exemple si vous déployez des instances interrégionales, si vous souhaitez utiliser des paramètres avancés ou si vous avez des besoins spécifiques en termes de performances.

Ce tutoriel explique comment configurer votre application de serveur MySQL pour accepter le trafic distant provenant d'un client MySQL installé sur une instance Compute Engine exécutée sur le même réseau privé.

Pour savoir comment choisir la bonne option de déploiement MySQL, reportez-vous à la page Comment installer MySQL sur Compute Engine.

Pour ce tutoriel, nous partons du principe que vous connaissez bien les éléments suivants :

  • Commandes Linux de base
  • Ubuntu-server 18.04
  • MySQL 5.7
  • Compute Engine

Architecture

Dans ce tutoriel, vous allez déployer deux instances Compute Engine. Une instance correspond au serveur et l'autre instance correspond au client, comme illustré dans le diagramme suivant :

Architecture de deux instances déployées

Objectifs

  • Créer une instance Compute Engine et installer le serveur MySQL
  • Créer une instance Compute Engine et installer le client MySQL
  • Configurer le serveur MySQL pour l'accès à distance
  • Supprimer l'accès public au serveur MySQL
  • Se connecter à distance à MySQL
  • Créer une règle de pare-feu VPC Service Controls

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

  • Compute Engine
  • Cloud Storage

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activez l'API Compute Engine

    Activer l'API

  5. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  6. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  7. Activez l'API Compute Engine

    Activer l'API

Une fois que vous avez terminé ce tutoriel, évitez de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez Effectuer un nettoyage.

Créer des instances Compute Engine

Créez deux instances pour MySQL : une instance de serveur et une instance de client.

Créer une instance de client Compute Engine

  • Créez une instance Compute Engine. Configurez l'instance comme suit :
    • Nommez l'instance my-client.
    • Définissez l'indicateur --zone sur la zone dans laquelle vous souhaitez créer votre instance.
    • Définissez l'option --image-project sur ubuntu-os-cloud.
    • Définissez l'option --image-family sur ubuntu-1804-lts.
    • Définissez l'option --scopes sur 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
  • Créer une instance de serveur Compute Engine

  • Créez une instance Compute Engine. Configurez l'instance comme suit :
    • Nommez l'instance my-server.
    • Définissez l'indicateur --zone sur la zone dans laquelle vous souhaitez créer votre instance.
    • Définissez l'option --image-project sur ubuntu-os-cloud.
    • Définissez l'option --image-family sur ubuntu-1804-lts.
    • Définissez l'option --scopes sur 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
  • Installer un client MySQL

    La procédure décrite ci-dessous permet d'installer MySQL sur une instance Compute Engine.

    1. Pour vous connecter à l'instance my-client, utilisez la commande ssh.
    2. Mettez à jour le gestionnaire de packages apt-get.
      sudo apt-get update
      
    3. Installez le package client MySQL.
      sudo apt-get -y install mysql-client-5.7

    Installer un serveur MySQL

    La procédure décrite ci-dessous permet d'installer MySQL sur une instance Compute Engine.

    1. Pour vous connecter à l'instance my-server, utilisez la commande ssh.
    2. Mettez à jour le gestionnaire de packages apt-get.
      sudo apt-get update
      
    3. Installez le package serveur MySQL.
      sudo apt-get -y install mysql-server-5.7

    Améliorer la sécurité de l'installation de MySQL

    Vous devez définir un mot de passe racine pour MySQL et effectuer une maintenance de sécurité de base sur la configuration de votre serveur MySQL. Pour en savoir plus, consultez la documentation MySQL sur mysql_secure_installation.

    1. Dans la session SSH de votre instance my-server, exécutez la commande suivante pour améliorer la sécurité de votre installation MySQL.

      sudo mysql_secure_installation
      
    2. Appuyez sur enter pour ignorer la configuration du plug-in VALIDATE PASSWORD.

    3. Saisissez un nouveau mot de passe racine deux fois.

    4. Pour supprimer des utilisateurs anonymes, saisissez Y et appuyez sur enter.

    5. Pour empêcher la connexion racine à distance, saisissez Y et appuyez sur enter.

    6. Pour supprimer la base de données de test, saisissez Y et appuyez sur enter.

    7. Pour actualiser les tables de privilèges, saisissez Y et appuyez sur enter.

    Configurer le serveur MySQL

    Avant de pouvoir vous connecter à distance au serveur MySQL, vous devez le configurer pour écouter sur son adresse IP interne. Ensuite, vous devez créer un compte utilisateur non racine pour que le client MySQL se connecte au serveur.

    Toutes les commandes client MySQL doivent inclure certains indicateurs de ligne de commande (par exemple, pour s'authentifier). Les commandes MySQL de cette section incluent les options suivantes : --user pour le nom d'utilisateur, -p pour le mot de passe et -e pour exécuter l'instruction donnée et quitter immédiatement. Pour en savoir plus, consultez la documentation de référence sur les options de commande MySQL 5.7.

    1. Dans Cloud Shell, utilisez SSH pour vous connecter à l'instance my-server.

    2. Mettez à jour le fichier de configuration /etc/mysql/mysql.conf.d/mysqld.cnf avec les informations suivantes :

      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. Redémarrez le service MySQL pour appliquer les modifications au serveur en cours d'exécution.

      sudo service mysql restart
      
    4. Vérifiez que le serveur s'exécute localement. Remplacez [ROOT_PASSWORD] par le mot de passe racine du serveur MySQL défini précédemment.

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

      La sortie se présente comme suit :

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

    Créer un utilisateur MySQL

    La connexion à distance en tant qu'utilisateur racine a été désactivée à l'aide de la commande mysql_secure_installation précédente. Vous devez créer un utilisateur avec les autorisations nécessaires pour autoriser les connexions à distance.

    1. Dans Cloud Shell, créez une variable d'environnement pour l'adresse IP interne my-client.

      CLIENT_IP=$(gcloud compute instances describe my-client \
          --zone=ZONE \
          --format='value(networkInterfaces[0].networkIP)')
      
    2. Créez un utilisateur MySQL avec un mot de passe. Remplacez [MY_PASSWORD] par votre mot de passe et [ROOT_PASSWORD] par votre mot de passe utilisateur racine MySQL.

      sudo mysql -uroot -p[ROOT_PASSWORD] \
          -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
      
    3. Accordez au nouvel utilisateur MySQL l'autorisation de se connecter au serveur à partir de l'adresse IP interne de my-client.

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

    Supprimer l'adresse IP externe de my-server

    L'instance my-server n'a pas besoin d'une adresse IP externe, car le client peut accéder à my-server via une adresse IP interne.

    • Pour supprimer l'adresse IP externe, mettez à jour les paramètres de configuration dans Cloud Shell. Remplacez [ZONE] par votre zone Google Cloud.

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

    Vérifier l'accès à distance du client à l'instance de serveur

    Les étapes suivantes décrivent comment se connecter au serveur MySQL sur my-server depuis votre instance my-client.

    1. Dans Cloud Shell, utilisez SSH pour vous connecter à l'instance my-client.
    2. Testez votre connexion en répertoriant les bases de données.

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

      La sortie se présente comme suit :

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

    Ces étapes permettent de vérifier que votre client MySQL peut se connecter au serveur MySQL via l'adresse IP interne.

    Considérations relatives au pare-feu dans les environnements de production

    La configuration réseau par défaut dans Google Cloud inclut une règle de pare-feu, default-allow-internal, qui autorise le trafic interne entre les instances Compute Engine sur de nombreux ports, y compris le port MySQL (3306). Dans les environnements autres que ceux par défaut dotés d'une empreinte numérique établie, vous devrez peut-être créer une règle de pare-feu pour permettre à votre instance my-client de communiquer avec votre instance my-server sur le réseau. Sinon, les deux instances ne peuvent pas communiquer entre elles.

    Vous pouvez baser les règles de pare-feu sur des plages d'adresses IP ou des tags. Les plages d'adresses IP sont utiles si vous souhaitez accorder l'accès à un groupe d'adresses IP internes spécifique. Notez que si vous souhaitez autoriser l'accès à certaines instances spécifiques de votre réseau, les tags constituent une solution plus flexible. Les tags vous permettent d'ajouter facilement de nouveaux clients, car vous n'avez pas besoin d'octroyer l'accès à chaque adresse IP individuellement. Il vous suffit d'attribuer le tag approprié à la nouvelle instance de client MySQL. Par exemple, vous pouvez créer une règle de pare-feu qui autorise le trafic depuis toutes les instances de client portant le tag mysql-client.

    Afin de prendre en charge les règles de pare-feu utilisant des tags, vous pouvez attribuer les tags appropriés aux VM my-client et my-server dans 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
    

    Ajouter une règle de pare-feu

    Les étapes ci-dessous expliquent comment créer une règle de pare-feu pour permettre aux instances portant le tag my-client de communiquer avec les instances portant le tag my-server à l'aide du port 3306.

    • Dans Cloud Shell, créez une règle de pare-feu pour autoriser les communications entre mysql-client et mysql-server.

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

    Vous pouvez maintenant vous connecter à MySQL à partir de my-client.

    Considérations relatives à l'accès des clients externes

    Ce tutoriel traite de l’accès des clients MySQL aux serveurs MySQL fonctionnant tous deux sur Compute Engine. Il n'a pas pour objectif d'autoriser l'accès d'un client ne s'exécutant pas sur Compute Engine. Si vous devez autoriser un accès non-Compute Engine, modifiez les éléments suivants :

    • Ajoutez une adresse IP externe à my-server pour autoriser la connectivité externe.
    • Ajoutez l'adresse IP source de votre client externe aux règles de pare-feu.
    • Modifiez le compte TESTUSER ou créez un compte d'utilisateur lié à l'adresse IP source de votre client externe.

    Nettoyer

    Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, vous pouvez supprimer le projet ou supprimer les instances.

    Supprimer le projet

    Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

    Pour supprimer le projet :

    1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

      Accéder à la page Gérer les ressources

    2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
    3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

    Supprimer des instances

    Pour supprimer une instance Compute Engine, procédez comme suit :

    1. Dans la console Google Cloud, accédez à la page Instances de VM.

      Accéder à la page Instances de VM

    2. Cochez la case correspondant à votre instance my-server.
    3. Pour supprimer l'instance, cliquez sur Autres actions , cliquez sur Supprimer, puis suivez les instructions.

    Étape suivante