Configurar o acesso de cliente através do endereço IP privado ao MySQL no Compute Engine

Este tutorial explica o processo de execução de uma base de dados MySQL numa rede privada no Google Cloud para permitir o acesso remoto seguro à base de dados através do Compute Engine.

Use este tutorial se quiser instalar a sua própria base de dados MySQL no Compute Engine, mas quiser restringir o acesso apenas a clientes MySQL autorizados que também estejam a ser executados no Compute Engine. Pode querer gerir a sua própria instância do MySQL em vez de usar o serviço gerido, devido a instâncias entre regiões, utilização avançada de parâmetros e necessidades de desempenho específicas.

Este tutorial descreve como configurar a sua app de servidor MySQL para aceitar tráfego remoto de um cliente MySQL instalado numa instância do Compute Engine na mesma rede privada.

Para obter informações sobre como escolher a opção de implementação do MySQL certa, consulte o artigo Como instalar o MySQL no Compute Engine.

Este tutorial pressupõe que conhece o seguinte:

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

Arquitetura

Neste tutorial, implementa duas instâncias do Compute Engine. Uma instância é o servidor e a outra instância é o cliente, conforme representado no seguinte diagrama:

Arquitetura de duas instâncias implementadas

Criar instâncias do Compute Engine

Crie duas instâncias para o MySQL: uma instância de cliente e uma instância de servidor.

Crie uma instância de cliente do Compute Engine

  • Create a Compute Engine instance. Configure the instance as follows:
    • Name the instance my-client.
    • Defina a flag --zone para a zona na qual quer criar a sua instância.
    • Defina a flag --image-project como ubuntu-os-cloud.
    • Defina a flag --image-family como ubuntu-1804-lts.
    • Defina a flag --scopes como 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

      Crie uma instância de servidor do Compute Engine

    • Create a Compute Engine instance. Configure the instance as follows:
      • Name the instance my-server.
      • Defina a flag --zone para a zona na qual quer criar a sua instância.
      • Defina a flag --image-project como ubuntu-os-cloud.
      • Defina a flag --image-family como ubuntu-1804-lts.
      • Defina a flag --scopes como 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

        Instalar o cliente MySQL

        Os passos seguintes descrevem como instalar o MySQL numa instância do Compute Engine.

        1. Para se ligar à instância my-client, use o comando ssh.
        2. Atualize o gestor de pacotes apt-get.
          sudo apt-get update
          
        3. Instale o pacote do cliente MySQL.
          sudo apt-get -y install mysql-client-5.7

        Instalar o servidor MySQL

        Os passos seguintes descrevem como instalar o MySQL numa instância do Compute Engine.

        1. Para se ligar à instância my-server, use o comando ssh.
        2. Atualize o gestor de pacotes apt-get.
          sudo apt-get update
          
        3. Instale o pacote do servidor MySQL.
          sudo apt-get -y install mysql-server-5.7

        Melhore a segurança da instalação do MySQL

        Tem de estabelecer uma palavra-passe de raiz para o MySQL e realizar a manutenção de segurança básica na configuração do servidor MySQL. Para mais informações, consulte a documentação do MySQL para mysql_secure_installation.

        1. Na sessão SSH para a sua instância do my-server, use o seguinte comando para melhorar a segurança da sua instalação do MySQL.

          sudo mysql_secure_installation
          
        2. Prima enter para ignorar a configuração do plugin VALIDATE PASSWORD.

        3. Introduza uma nova palavra-passe de raiz duas vezes.

        4. Para remover utilizadores anónimos, introduza Y e prima enter.

        5. Para impedir o início de sessão de raiz remoto, introduza Y e prima enter.

        6. Para remover a base de dados de teste, introduza Y e prima enter.

        7. Para recarregar as tabelas de privilégios, introduza Y e prima enter.

        Configurar o servidor MySQL

        Antes de poder estabelecer ligação remotamente ao servidor MySQL, tem de o configurar para ouvir no respetivo endereço IP interno. Em seguida, cria uma conta de utilizador não raiz para o cliente MySQL se ligar ao servidor.

        Todos os comandos do cliente MySQL têm de incluir determinados sinalizadores da linha de comandos (por exemplo, para autenticar). Os comandos MySQL nesta secção incluem as seguintes flags: --user para o nome de utilizador, -p para a palavra-passe e -e para executar a declaração fornecida e sair imediatamente. Para mais informações, consulte a referência das opções de comando do MySQL 5.7.

        1. No Cloud Shell, use SSH para estabelecer ligação à instância my-server.

        2. Atualize o ficheiro de configuração /etc/mysql/mysql.conf.d/mysqld.cnf com as seguintes informações:

          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. Reinicie o serviço MySQL para aplicar as alterações ao servidor em execução.

          sudo service mysql restart
          
        4. Verifique se o servidor está a ser executado localmente. Substitua [ROOT_PASSWORD] pela palavra-passe de raiz do servidor MySQL que estabeleceu num passo anterior.

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

          O resultado é semelhante ao seguinte:

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

        Crie um utilizador do MySQL

        A ligação remota como utilizador root foi desativada com o comando mysql_secure_installation anterior. Tem de criar um novo utilizador com as autorizações necessárias para permitir ligações remotas.

        1. No Cloud Shell, crie uma variável de ambiente para o my-client endereço IP interno.

          CLIENT_IP=$(gcloud compute instances describe my-client \
              --zone=ZONE \
              --format='value(networkInterfaces[0].networkIP)')
          
        2. Crie um novo utilizador do MySQL com uma palavra-passe. Substitua [MY_PASSWORD] pela sua palavra-passe e [ROOT_PASSWORD] pela palavra-passe do utilizador root do MySQL.

          sudo mysql -uroot -p[ROOT_PASSWORD] \
              -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
          
        3. Conceda ao novo utilizador do MySQL autorização para iniciar sessão no servidor a partir do endereço IP interno do my-client.

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

        Remova o endereço IP externo de my-server

        A instância my-server não precisa de um endereço IP externo porque o cliente pode aceder a my-server através de um endereço IP interno.

        • Para remover o endereço IP externo, atualize as definições de configuração no Cloud Shell. Substitua [ZONE] pela sua Google Cloud zona.

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

        Validar o acesso remoto do cliente à instância do servidor

        Os passos seguintes descrevem como estabelecer ligação ao servidor MySQL em my-server a partir da sua instância do my-client.

        1. No Cloud Shell, use SSH para estabelecer ligação à instância my-client.
        2. Teste a sua ligação listando as bases de dados.

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

          O resultado é semelhante ao seguinte:

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

        Estes passos validam se o seu cliente MySQL consegue estabelecer ligação com êxito ao servidor MySQL através do endereço IP interno.

        Considerações sobre a firewall em ambientes de produção

        A configuração de rede predefinida Google Cloud inclui uma regra de firewalldefault-allow-internal que permite o tráfego interno entre instâncias do Compute Engine numa vasta gama de portas, incluindo a porta do MySQL, a porta 3306. Em ambientes não predefinidos com uma pegada de segurança estabelecida, pode ter de criar uma regra de firewall para permitir que a sua instância my-client comunique com a sua instância my-server através da rede. Caso contrário, as duas instâncias não podem comunicar entre si.

        Pode basear as regras de firewall em intervalos de endereços IP ou etiquetas. Os intervalos de endereços IP são úteis se quiser conceder acesso a um vasto intervalo de endereços IP internos. Em alternativa, se quiser conceder acesso a instâncias específicas na sua rede, as etiquetas oferecem uma solução mais flexível. As etiquetas facilitam a adição de novos clientes sem conceder acesso a uma vasta gama de endereços IP. Só tem de atribuir a etiqueta adequada à nova instância do cliente MySQL. Por exemplo, pode criar uma nova regra de firewall que permita o tráfego de todas as instâncias de cliente etiquetadas com mysql-client.

        Para suportar regras de firewall com etiquetas, pode atribuir as etiquetas adequadas às VMs my-client e my-server no 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
        

        Adicione uma nova regra de firewall

        Os passos seguintes descrevem como criar uma nova regra de firewall para permitir que as instâncias com a etiqueta my-client comuniquem com as instâncias que têm a etiqueta my-server através da porta 3306.

        • No Cloud Shell, crie uma regra de firewall para permitir comunicações de mysql-client para mysql-server.

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

        Já pode estabelecer ligação ao MySQL a partir do my-client.

        Considerações de acesso de clientes externos

        Este tutorial aborda o acesso de clientes MySQL a servidores MySQL executados no Compute Engine. Permitir o acesso a partir de um cliente que não esteja em execução no Compute Engine está fora do âmbito deste tutorial. Se precisar de permitir o acesso que não seja do Compute Engine, modifique o seguinte:

        • Adicione um endereço IP externo a my-server para permitir a conetividade externa.
        • Adicione o endereço IP de origem do seu cliente externo às regras de firewall.
        • Modifique a conta TESTUSER ou crie uma conta de utilizador associada ao endereço IP de origem do seu cliente externo.