Como configurar o acesso do cliente por meio do endereço IP privado ao MySQL no Compute Engine

Neste tutorial, explicamos o processo de execução de um banco de dados MySQL em uma rede privada no Google Cloud para permitir acesso remoto seguro ao banco de dados usando o Compute Engine.

Use este tutorial se quiser instalar seu próprio banco de dados MySQL no Compute Engine, mas quiser restringir o acesso somente a clientes MySQL autorizados que também estão em execução no Compute Engine. Talvez você queira gerenciar sua própria instância do MySQL em vez de usar o serviço gerenciado, em decorrência de instâncias entre regiões, uso mais avançado de parâmetros e necessidades específicas de desempenho.

Neste tutorial, descrevemos como configurar o aplicativo do servidor MySQL para aceitar o tráfego remoto de um cliente MySQL instalado em uma instância do Compute Engine na mesma rede privada.

Para informações sobre como escolher a opção de implantação correta do MySQL, consulte Como instalar o MySQL no Compute Engine.

Neste tutorial, presumimos que você esteja familiarizado com estes produtos e serviços:

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

Arquitetura

Neste tutorial, você implantará duas instâncias do Compute Engine. Uma instância é o servidor, e a outra é o cliente, conforme mostrado no diagrama a seguir:

Arquitetura de duas instâncias implantadas

Objetivos

  • Criar uma instância do Compute Engine e instalar o servidor MySQL.
  • Criar uma instância do Compute Engine e instalar o cliente MySQL.
  • Configurar o servidor MySQL para acesso remoto.
  • Remover o acesso público ao servidor MySQL.
  • Conectar-se remotamente ao MySQL.
  • Criar uma regra de firewall do VPC Service Controls.

Custos

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:

  • Compute Engine
  • Cloud Storage

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem ser qualificados para uma avaliação gratuita.

Antes de começar

  1. Faça login na sua conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  2. No Console do Cloud, na página do seletor de projetos, selecione ou crie um projeto do Cloud.

    Acessar a página do seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud. Saiba como confirmar se a cobrança está ativada para o seu projeto.

  4. Ative a API Compute Engine.

    Ative a API

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Veja mais detalhes em Como limpar.

Como criar instâncias do Compute Engine

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

Criar uma instância de cliente do Compute Engine

  • Crie uma instância do Compute Engine. Configure a instância da seguinte maneira:
    • Nome da instância my-client.
    • Defina a sinalização --zone com a zona onde será criada a instância.
    • Defina a sinalização --image-project como ubuntu-os-cloud.
    • Defina a sinalização --image-family como ubuntu-1804-lts.
    • Defina a sinalização --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
  • Criar uma instância de servidor do Compute Engine

  • Crie uma instância do Compute Engine. Configure a instância da seguinte maneira:
    • Nome da instância my-server.
    • Defina a sinalização --zone com a zona onde será criada a instância.
    • Defina a sinalização --image-project como ubuntu-os-cloud.
    • Defina a sinalização --image-family como ubuntu-1804-lts.
    • Defina a sinalização --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
  • Como instalar o cliente MySQL

    As etapas a seguir descrevem como instalar o MySQL em uma instância do Compute Engine.

    1. No Console do Cloud, acesse a página Instâncias de VM.

      Acessar a página Instâncias de VM

    2. Na lista de instâncias de máquina virtual, clique em SSH na linha da instância à qual você quer se conectar.

      Botão

    3. Atualize o gerenciador de pacotes apt-get.
      sudo apt-get update
      
    4. Instale o pacote do cliente MySQL.
      sudo apt-get -y install mysql-client-5.7

    Como instalar o servidor MySQL

    As etapas a seguir descrevem como instalar o MySQL em uma instância do Compute Engine.

    1. No Console do Cloud, acesse a página Instâncias de VM.

      Acessar a página Instâncias de VM

    2. Na lista de instâncias de máquina virtual, clique em SSH na linha da instância à qual você quer se conectar.

      Botão

    3. Atualize o gerenciador de pacotes apt-get.
      sudo apt-get update
      
    4. Instale o pacote do servidor MySQL.
      sudo apt-get -y install mysql-server-5.7

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

    É necessário estabelecer uma senha raiz para o MySQL e realizar manutenção básica de segurança na configuração do servidor MySQL. Para mais informações, consulte a documentação do MySQL para mysql_secure_installation.

    1. No Cloud Shell, aumente a segurança da instalação do MySQL.

      sudo mysql_secure_installation
      
    2. Pressione enter para pular a configuração do plug-in VALIDATE PASSWORD.

    3. Digite uma nova senha raiz duas vezes.

    4. Para remover usuários anônimos, insira Y e pressione enter.

    5. Para impedir o login raiz remoto, insira Y e pressione enter.

    6. Para remover o banco de dados de teste, insira Y e pressione enter.

    7. Para recarregar as tabelas de privilégios, insira Y e pressione enter.

    Como configurar o servidor MySQL

    Antes de se conectar remotamente ao servidor MySQL, você precisa configurá-lo para escutar no endereço IP interno. Em seguida, crie uma conta de usuário não raiz para o cliente MySQL se conectar ao servidor.

    Todos os comandos do cliente MySQL precisam incluir determinadas sinalizações de linha de comando (por exemplo, para autenticação). Os comandos do MySQL nesta seção incluem as seguintes sinalizações: --user para o nome de usuário, -p para a senha e -e para executar a instruçã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 o SSH para se conectar à instância my-server.

    2. Atualize o arquivo 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á sendo executado localmente. Substitua [ROOT_PASSWORD] pela senha raiz do servidor MySQL que você estabeleceu em uma etapa anterior.

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

      A saída será semelhante a esta:

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

    Criar um usuário do MySQL

    Conecte-se remotamente já que o usuário raiz foi desativado com o comando mysql_secure_installation anterior. É preciso criar um novo usuário com as permissões necessárias para autorizar conexões remotas.

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

      CLIENT_IP=$(gcloud compute instances describe my-client \
          --zone=[ZONE] \
          --format='value(networkInterfaces[0].networkIP)')
      
    2. Crie um novo usuário MySQL com uma senha. Substitua [MY_PASSWORD] pela sua senha, e [ROOT_PASSWORD] pela sua senha de usuário raiz do MySQL.

      sudo mysql -uroot -p[ROOT_PASSWORD] \
          -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
      
    3. Conceda ao novo usuário do MySQL permissão para fazer login no servidor do endereço IP interno de my-client.

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

    Remover 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 acessar my-server por meio de um endereço IP interno.

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

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

    Como verificar o acesso remoto do cliente para a instância do servidor

    As etapas a seguir descrevem como se conectar ao servidor MySQL em my-server a partir da instância my-client.

    1. No Cloud Shell, use o SSH para se conectar à instância my-client.
    2. Teste sua conexão listando os bancos de dados.

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

      A saída é semelhante a esta:

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

    Estas etapas verificam se o cliente MySQL pode se conectar ao servidor MySQL por meio do endereço IP interno.

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

    A configuração de rede padrão no Google Cloud inclui uma regra de firewall, default-allow-internal, que permite o tráfego interno entre instâncias do Compute Engine em uma ampla variedade de portas, incluindo a porta MySQL 3306. Em ambientes não padrão com uma abrangência de segurança estabelecida, talvez seja necessário criar uma regra de firewall para permitir que a instância my-client se comunique com a instância my-server pela rede.

    As regras de firewall podem ser baseadas em tags ou intervalos de endereço IP. Esses intervalos são úteis quando o objetivo é conceder acesso a vários endereços IP internos. As tags oferecem uma solução mais flexível quando se trata de conceder acesso a instâncias específicas na rede. Elas facilitam a inclusão de novos clientes sem conceder acesso a vários endereços IP. Você só precisa atribuir a marca apropriada à nova instância do cliente MySQL. Por exemplo, é possível criar uma nova regra de firewall que permita o tráfego de todas as instâncias do cliente com a tag mysql-client.

    Para acomodar regras de firewall usando tags, atribua as tags apropriadas à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]
    

    Adicionar uma nova regra de firewall

    As etapas a seguir descrevem como criar uma nova regra de firewall para permitir que instâncias com a tag my-client se comuniquem com instâncias que tenham a tag my-server usando a porta 3306.

    • No Cloud Shell, crie uma regra de firewall para permitir a comunicação 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"
      

    Agora é possível se conectar ao MySQL de my-client.

    Considerações de acesso de clientes externos

    Neste tutorial, abrangemos o acesso de clientes MySQL a servidores MySQL em execução no Compute Engine. Está fora do escopo deste tutorial permitir o acesso de um cliente que não está sendo executado no Compute Engine. Se você precisar permitir acesso que não seja do Compute Engine, modifique isto:

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

    Como limpar

    Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua o projeto ou exclua as instâncias.

    Excluir o projeto

    O jeito mais fácil de evitar cobranças é excluir o projeto que você criou para o tutorial.

    Para excluir o projeto:

    1. No Console do Cloud, acesse a página Gerenciar recursos:

      Acessar a página "Gerenciar recursos"

    2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
    3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

    Excluir instâncias

    Para excluir uma instância do Compute Engine:

    1. No Console do Cloud, acesse a página Instâncias de VM.

      Acessar a página "Instâncias de VMs"

    2. Marque a caixa de seleção para da sua instância my-server.
    3. Clique em Excluir para remover a instância.

    A seguir