Configura el acceso de cliente a través de una dirección IP privada a MySQL en Compute Engine

En este instructivo, se explica el proceso de ejecutar una base de datos de MySQL en una red privada en Google Cloud para permitir el acceso remoto y seguro a la base de datos mediante Compute Engine.

Usa este instructivo si deseas instalar tu propia base de datos de MySQL en Compute Engine y quieres que solo tengan acceso los clientes de MySQL autorizados que también se ejecuten en Compute Engine. Se recomienda que administres tu propia instancia de MySQL en lugar de usar el servicio administrado, debido a las instancias entre regiones, el uso avanzado de parámetros y las necesidades de rendimiento específicas.

En este instructivo, se describe cómo configurar tu app del servidor MySQL para aceptar el tráfico remoto de un cliente MySQL instalado en una instancia de Compute Engine en la misma red privada.

Para obtener información sobre cómo elegir la opción de implementación de MySQL adecuada, consulta Cómo instalar MySQL en Compute Engine.

En este instructivo, se supone que estás familiarizado con los siguientes sistemas:

  • Comandos básicos de Linux
  • Ubuntu-server 18.04
  • MySQL 5.7
  • Compute Engine

Arquitectura

En este instructivo, implementarás dos instancias de Compute Engine. Una instancia es el servidor y la otra es el cliente, como se muestra en el siguiente diagrama:

Arquitectura de dos instancias implementadas

Objetivos

  • Crear una instancia de Compute Engine y, luego, instalar el servidor MySQL
  • Crear una instancia de Compute Engine y, luego, instalar el cliente MySQL
  • Configurar el servidor MySQL para el acceso remoto
  • Quitar el acceso público al servidor MySQL
  • Contactarse de forma remota a MySQL
  • Crear una regla de firewall de Controles del servicio de VPC

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

  • Compute Engine
  • Cloud Storage

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  4. Habilita la API Compute Engine.

    Habilita la API

Cuando finalices este instructivo, puedes borrar los recursos creados para evitar que se te siga facturando. Para obtener más detalles, consulta Realiza una limpieza.

Crea instancias de Compute Engine

Crea dos instancias para MySQL: una instancia de cliente y una de servidor.

Crea una instancia de cliente de Compute Engine

  • Crea una instancia de Compute Engine. Configúrala como se indica a continuación:
    • Asígnale el nombre my-client a la instancia.
    • Establece la marca --zone en la zona en la que deseas crear tu instancia.
    • Establece la marca --image-project en ubuntu-os-cloud.
    • Establece la marca --image-family en ubuntu-1804-lts.
    • Establece la marca --scopes en 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 una instancia de servidor de Compute Engine

  • Crea una instancia de Compute Engine. Configúrala como se indica a continuación:
    • Asígnale el nombre my-server a la instancia.
    • Establece la marca --zone en la zona en la que deseas crear tu instancia.
    • Establece la marca --image-project en ubuntu-os-cloud.
    • Establece la marca --image-family en ubuntu-1804-lts.
    • Establece la marca --scopes en 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
  • Instala el cliente MySQL

    Con los siguientes pasos, se describe cómo instalar MySQL en una instancia de Compute Engine.

    1. En Cloud Console, ve a la página Instancias de VM.

      Ir a la página Instancias de VM

    2. En la lista de instancias de máquinas virtuales, haz clic en SSH en la fila de la instancia a la que deseas conectarte.

      Botón SSH junto al nombre de la instancia.

    3. Actualiza el administrador de paquetes apt-get.
      sudo apt-get update
      
    4. Instala el paquete de cliente MySQL.
      sudo apt-get -y install mysql-client-5.7

    Instala el servidor MySQL

    Con los siguientes pasos, se describe cómo instalar MySQL en una instancia de Compute Engine.

    1. En Cloud Console, ve a la página Instancias de VM.

      Ir a la página Instancias de VM

    2. En la lista de instancias de máquinas virtuales, haz clic en SSH en la fila de la instancia a la que deseas conectarte.

      Botón SSH junto al nombre de la instancia.

    3. Actualiza el administrador de paquetes apt-get.
      sudo apt-get update
      
    4. Instala el paquete del servidor MySQL.
      sudo apt-get -y install mysql-server-5.7

    Mejorar la seguridad en la instalación de MySQL

    Debes establecer una contraseña raíz para MySQL y realizar un mantenimiento de seguridad básico en la configuración del servidor MySQL. Para obtener más información, consulta la documentación de MySQL sobre mysql_secure_installation.

    1. En Cloud Shell, mejora la seguridad de la instalación de MySQL.

      sudo mysql_secure_installation
      
    2. Presiona enter para omitir la configuración del complemento VALIDATE PASSWORD.

    3. Ingresa una contraseña raíz nueva dos veces.

    4. Para quitar usuarios anónimos, ingresa Y; luego, presiona enter.

    5. Para evitar el acceso raíz remoto, ingresa Y; luego, presiona enter.

    6. Para quitar la base de datos de prueba, ingresa Y; luego, presiona enter.

    7. Para volver a cargar las tablas de privilegios, ingresa Y; luego, presiona enter.

    Configura el servidor MySQL

    Antes de conectarte de forma remota al servidor MySQL, debes configurarlo para que escuche en su dirección IP interna. Luego, crea una cuenta de usuario no raíz para que el cliente MySQL se conecte al servidor.

    Todos los comandos del cliente MySQL deben incluir ciertas marcas de línea de comandos (por ejemplo, para autenticar). Los comandos de MySQL en esta sección incluyen las siguientes marcas: --user para el nombre de usuario, -p destinado a la contraseña y -e a fin de ejecutar la declaración determinada y salir de inmediato. Para obtener más información, consulta la referencia de opciones de comando de MySQL 5.7.

    1. En Cloud Shell, usa SSH para conectarte a la instancia my-server.

    2. Actualiza el archivo de configuración /etc/mysql/mysql.conf.d/mysqld.cnf con la siguiente información:

      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. Reinicia el servicio de MySQL para aplicar los cambios al servidor en ejecución.

      sudo service mysql restart
      
    4. Verifica que el servidor se ejecute de forma local. Reemplaza [ROOT_PASSWORD] por la contraseña raíz del servidor de MySQL que estableciste en un paso anterior.

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

      El resultado es similar al que se muestra a continuación:

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

    Crea un usuario de MySQL

    La conexión remota como usuario raíz se inhabilitó con el comando mysql_secure_installation anterior. Debes crear un usuario nuevo con los permisos necesarios para permitir conexiones remotas.

    1. En Cloud Shell, crea una variable de entorno para la dirección IP interna my-client.

      CLIENT_IP=$(gcloud compute instances describe my-client \
          --zone=[ZONE] \
          --format='value(networkInterfaces[0].networkIP)')
      
    2. Crea un usuario de MySQL nuevo con una contraseña. Reemplaza [MY_PASSWORD] por la contraseña y [ROOT_PASSWORD] por la contraseña del usuario raíz de MySQL.

      sudo mysql -uroot -p[ROOT_PASSWORD] \
          -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
      
    3. Otorga al usuario de MySQL nuevo permiso para acceder al servidor desde la dirección IP interna de my-client.

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

    Quita la dirección IP externa de my-server

    La instancia my-server no necesita una dirección IP externa porque el cliente puede acceder a my-server a través de una dirección IP interna.

    • Para quitar la dirección IP externa, actualiza los parámetros de configuración en Cloud Shell. Reemplaza [ZONE] por tu zona de Google Cloud.

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

    Verifica el acceso remoto de la instancia de cliente a servidor

    En los siguientes pasos, se describe cómo conectarte al servidor de MySQL en my-server desde la instancia my-client.

    1. En Cloud Shell, usa SSH para conectarte a la instancia my-client.
    2. Para probar tu conexión, enumera las bases de datos.

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

      El resultado es similar al que se muestra a continuación:

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

    Con estos pasos, se verifica que el cliente de MySQL pueda conectarse de forma correcta al servidor de MySQL a través de la dirección IP interna.

    Consideraciones de firewall en entornos de producción

    La configuración de red predeterminada en Google Cloud incluye una regla de firewall, default-allow-internal, que permite el tráfico interno entre instancias de Compute Engine en un rango amplio de puertos, incluido el puerto de MySQL (el puerto 3306). En entornos no predeterminados con una huella de seguridad establecida, es posible que debas crear una regla de firewall para permitir que la instancia my-client se comunique con la instancia my-server a través de la red.

    Puedes basar las reglas de firewall en rangos de direcciones IP o etiquetas. Los rangos de direcciones IP son útiles si deseas otorgar acceso a un rango amplio de direcciones IP internas. Como alternativa, si deseas otorgar acceso a instancias específicas en la red, las etiquetas proporcionan una solución más flexible. Las etiquetas facilitan la incorporación de clientes nuevos sin otorgar acceso a un rango amplio de direcciones IP. Solo debes asignar la etiqueta adecuada a la instancia de cliente MySQL nueva. Por ejemplo, puedes crear una regla de firewall nueva que permita el tráfico desde todas las instancias de cliente con la etiqueta mysql-client.

    Para admitir reglas de firewall mediante etiquetas, puedes asignar las etiquetas adecuadas a las VM my-client y my-server en 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]
    

    Agrega una regla de firewall nueva

    En los siguientes pasos, se describe cómo crear una regla de firewall nueva para permitir que las instancias con la etiqueta my-client se comuniquen con las instancias que tengan la etiqueta my-server mediante el puerto 3306.

    • En Cloud Shell, crea una regla de firewall para permitir las comunicaciones de mysql-client a mysql-server.

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

    Ahora puedes conectarte a MySQL desde my-client.

    Consideraciones de acceso desde clientes externos

    En este instructivo, se describe el acceso de los clientes MySQL a los servidores MySQL que se ejecutan en Compute Engine. En este instructivo, no se trata cómo permitir el acceso de un cliente que no se ejecuta en Compute Engine. Si necesitas permitirlo, realiza las siguientes modificaciones:

    • Agrega una dirección IP externa a my-server para permitir la conectividad externa.
    • Agrega la dirección IP de origen del cliente externo a las reglas de firewall.
    • Modifica la cuenta TESTUSER o crea una cuenta de usuario vinculada a la dirección IP de origen del cliente externo.

    Realiza una limpieza

    Para evitar que se apliquen cargos a la cuenta de Google Cloud por los recursos que usaste en este instructivo, puedes borrar el proyecto o borrar las instancias.

    Borra el proyecto

    La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

    Para borrar el proyecto, sigue estos pasos:

    1. En Cloud Console, ve a la página Administrar recursos.

      Ir a la página Administrar recursos

    2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
    3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar para borrar el proyecto.

    Borra instancias

    Para borrar una instancia de Compute Engine, sigue estos pasos:

    1. En Cloud Console, ve a la página Instancias de VM.

      Ir a la página Instancias de VM

    2. Haz clic en la casilla de verificación para la instancia my-server.
    3. Haz clic en Borrar  para borrar la instancia.

    Próximos pasos