Como se conectar a instâncias de VM com segurança

Ao desenvolver projetos no Google Compute Engine, existem diversos cenários em que você quer evitar que as instâncias sejam acessadas pela Internet pública:

  • Como são recursos incompletos ou que ainda não foram configurados com o HTTPS, os serviços da Web ainda estão em desenvolvimento e não estão prontos para ser expostos a usuários externos.
  • Talvez a instância esteja fornecendo serviços projetados para ser consumidos apenas por outras instâncias no projeto.
  • As instâncias só podem ser alcançadas por meio de opções de interconexão dedicada de data centers ou escritórios da empresa.

Mesmo quando um serviço é intencionalmente orientado para a Internet, é importante que a comunicação com o serviço seja restrita aos grupos de usuários de destino e ocorra por canais seguros, como SSH ou HTTPS, para proteger informações confidenciais.

Neste artigo, há diversos métodos de comunicação segura com instâncias do Google Compute Engine com ou sem endereços IP externos.

Como proteger serviços em máquinas com endereços IP externos

Como conectar-se a instâncias sem endereços IP externos

Como proteger serviços em máquinas com endereços IP externos

Quando as instâncias têm um endereço IP público, é importante que somente os serviços e o tráfego a serem expostos fiquem acessíveis. Para aqueles que estão expostos, toda informação confidencial é protegida em trânsito.

Firewalls

A primeira linha de defesa é restringir quem pode chegar à instância usando firewalls. Ao criar regras de firewall, você pode restringir todo o tráfego a uma rede ou máquinas de destino em um determinado conjunto de portas para endereços IP de origem específicos.

Os firewalls não são uma solução autônoma. Restringir o tráfego para IPs de origem específicos não protege informações confidenciais, como credenciais de login, comandos que criam ou destroem recursos, ou arquivos ou registros. Ao executar um serviço da Web em uma máquina acessível publicamente, como uma instância do Compute Engine com um IP externo, você precisa criptografar toda a comunicação entre o host e a instância implantada para garantir a segurança adequada.

Além disso, os firewalls nem sempre são a solução apropriada. Por exemplo, eles não são ideais para ambientes de desenvolvimento que não têm endereços IP estáticos, como laptops em roaming.

HTTPS e SSL

Para sistemas Web de produção, configure o HTTPS/SSL definindo uma instância para encerrar o HTTPS ou ajustando o balanceamento de carga HTTPS. O HTTPS/SSL envolve uma certa complexidade inicial, exigindo que você execute as seguintes tarefas:

  • Registrar um nome de domínio
  • Adquirir um certificado SSL de uma autoridade de certificação
  • Registrar o certificado com o balanceador de carga HTTPS e as instâncias conectadas ou configurar um proxy ou servidor da Web com terminação SSL em uma ou mais instâncias do Compute Engine

Se você configurou os domínios de serviço SSL anteriormente, fazer o mesmo com o Google Compute Engine será um processo direto. Caso contrário, convém usar um método de segurança diferente, como o encaminhamento de portas ou o proxy SOCKS.

Encaminhamento de porta por SSH

Use a ferramenta de linha de comando gcloud para iniciar um servidor em determinada porta local que encaminha todo o tráfego para um host remoto em uma conexão SSH.

Primeiro, anote a instância e a porta que fornecem o serviço a que você gostaria de estabelecer uma conexão segura. Em seguida, execute o seguinte comando:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888

No comando acima, os parâmetros são definidos da forma a seguir:

  • example-instance é o nome da instância a que você quer se conectar.
  • my-project é o ID do projeto do Google Cloud Platform (GCP).
  • us-central1-a é a zona em que sua instância está sendo executada.
  • 2222 é a porta local em que você está escutando.
  • 8888 é a porta remota a que você está se conectando.

Com essas configurações de exemplo, se você abrir http://localhost:2222/ em seu navegador, a conexão HTTP percorrerá o túnel SSH recém-criado para seu host remoto e se conectará à instância especificada usando SSH e, em seguida, conectará à porta 8888 na mesma máquina, mas por meio de uma conexão SSH segura e criptografada.

O comando da gcloud cria e mantém uma conexão SSH. Essa abordagem só funciona enquanto a sessão SSH está ativa. Assim que você sai da sessão SSH que o gcloud cria, o encaminhamento de porta via http://localhost:2222/ para de funcionar.

Para criar mais de uma regra de encaminhamento de porta, especifique várias regras em uma única linha de comando repetindo as sinalizações:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888 -L 2299:localhost:8000

Como alternativa, você pode executar um novo comando gcloud toda vez para criar um túnel separado. Observe que não é possível adicionar ou remover um encaminhamento de porta de uma conexão existente sem sair e restabelecer a conexão a partir do zero.

Proxy SOCKS por SSH

A maneira mais fácil de se conectar a vários hosts diferentes na implantação na nuvem é alterar o navegador para fazer as pesquisas diretamente da rede. Essa abordagem permite usar o nome curto dos hosts em vez de procurar o endereço IP de cada host, abrir portas para cada serviço ou criar um túnel SSH para cada par de host/porta.

A abordagem usada aqui é a seguinte:

  1. Configure um único túnel SSH para um dos hosts na rede e crie um proxy SOCKS nesse host.
  2. Mude a configuração do navegador para fazer todas as pesquisas por meio do host do proxy SOCKS.

Como todo o tráfego está passando por esse host, não convém navegar na Web em geral usando esse navegador ou esse perfil específico, porque você usará a largura de banda do serviço da nuvem para isso. Em geral, pode ser necessário usar um perfil de navegador separado e alternar para ele quando necessário.

Iniciar o proxy SOCKS

Para iniciar o proxy SOCKS, execute o seguinte comando:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    --ssh-flag="-D" \
    --ssh-flag="1080" \
    --ssh-flag="-N"

No comando acima, os parâmetros são definidos da forma a seguir:

  • example-instance é o nome da instância a que você quer se conectar.
  • my-project é seu ID do projeto do GCP.
  • us-central1-a é a zona em que sua instância está sendo executada.
  • 1080 é a porta local em que você está escutando.

Neste caso, você não precisa especificar uma porta remota. Como um proxy SOCKS não se vincula a nenhuma porta remota específica, qualquer conexão feita por meio dele será resolvida em relação ao host ao qual você se conecta.

Ao usar um proxy SOCKS, é possível se conectar a qualquer instância que compartilhe uma rede do Google Compute Engine com a instância de proxy usando o nome curto da instância. Além disso, é possível se conectar a qualquer porta em uma determinada instância.

Essa abordagem é muito mais flexível do que o método simples de encaminhamento de portas, mas também exigirá que você altere as configurações no navegador para utilizar o proxy.

Em seguida, configure o Chrome ou o Firefox para usar o proxy.

Chrome

Por padrão, o Chrome usa configurações de proxy de todo o sistema. Sendo assim, é necessário especificar um proxy diferente usando sinalizações de linha de comando. Por padrão, ao iniciar o Chrome, é criada uma instância de um perfil já em execução. Assim, para que seja possível executar várias cópias do Chrome simultaneamente, uma usando o proxy e outras não, você precisará de um novo perfil.

Inicie o Chrome usando um novo perfil. Ele será criado automaticamente, se ainda não existir.

Linux:

"/usr/bin/google-chrome \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

macOS:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

Windows:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ^
    --user-data-dir="%USERPROFILE%\chrome-proxy-profile" ^
    --proxy-server="socks5://localhost:1080"

Certifique-se de configurar a porta localhost para o mesmo valor usado no comando gcloud anteriormente. No nosso exemplo, o valor é 1080.

Firefox

Antes de alterar essas configurações, talvez convenha criar um novo perfil do Firefox. Caso contrário, o uso desse host como proxy afetará todas as instâncias do Firefox, o que provavelmente não é o que você quer.

Depois de executar o Firefox com um perfil separado, configure o proxy SOCKS:

  1. Abra Preferences.
  2. Clique em Advanced > Networks > Settings para abrir a caixa de diálogo Connection Settings.
  3. Escolha a opção Manual proxy configuration.
    1. Na seção SOCKS Host, preencha localhost como o host e a porta que você selecionou quando o comando da gcloud foi executado anteriormente.
    2. Escolha SOCKS v5.
    3. Marque a caixa Remote DNS.
    4. Deixe todas as outras entradas em branco.
  4. Clique em OK e feche a caixa de diálogo Preferences.

Como conectar-se a instâncias sem endereços IP externos

Quando as instâncias não têm endereços IP externos, só podem ser acessadas por outras instâncias na rede, pelo recurso de encaminhamento de TCP do Cloud Identity-Aware Proxy ou por meio de um gateway VPN gerenciado. Forneça instâncias na rede para atuar como redirecionamentos confiáveis para conexões de entrada (Bastion Hosts) ou saída de rede (gateways NAT). Para uma conectividade mais transparente sem configurar tais conexões, você pode usar um recurso de gateway VPN gerenciado.

Bastion Hosts

Os Bastion Hosts fornecem um ponto de entrada externo em uma rede que contém instâncias de rede particular, conforme ilustrado no diagrama a seguir.

Arquitetura de Bastion Hosts atuando como ponto de entrada externo para uma rede de instâncias particulares.

Esse host pode fornecer um único ponto de fortalecimento ou auditoria e pode ser iniciado e interrompido para ativar ou desativar o SSH de entrada. Usando um Bastion Host, é possível se conectar a uma instância que não tenha um endereço IP externo. Essa abordagem permite que você se conecte a um ambiente de desenvolvimento ou gerencie a instância do banco de dados para o aplicativo externo, por exemplo, sem configurar regras de firewall adicionais.

Uma proteção completa de um Bastion Host está fora do escopo deste artigo, mas algumas etapas iniciais tomadas podem incluir as seguintes ações:

  • Limitar o intervalo CIDR de IPs de origem que podem se comunicar com o Bastion.
  • Configurar as regras de firewall para permitir o tráfego SSH para instâncias particulares apenas do Bastion Host.

Por padrão, o SSH em instâncias está configurado para usar chaves privadas para autenticação. Ao usar um Bastion Host, primeiro é necessário fazer login nele e, depois, na instância particular de destino. Por causa desse login em duas etapas, os Bastion Hosts são às vezes chamados de "jump servers". Use o encaminhamento ssh em vez de armazenar a chave privada da máquina de destino no Bastion Host para acessar essa máquina. Faça isso ainda que esteja usando o mesmo par de chaves para as instâncias de Bastion e destino, porque o Bastion tem acesso direto somente à metade pública do par de chaves.

Para saber como usar uma instância do Bastion Host para se conectar a outras instâncias na rede do GCP e aprender a usar o encaminhamento ssh, consulte Como se conectar a instâncias que não têm endereços IP externos.

Cloud IAP para encaminhamento de TCP

O uso do SSH com o recurso de encaminhamento de TCP do Cloud IAP inclui uma conexão SSH dentro do HTTPS, que é enviada para a instância remota.

Para saber como conectar-se a uma instância remota com o Cloud IAP, consulte Como usar o Cloud IAP para encaminhamento de TCP.

VPN

O Cloud VPN permite que você conecte sua rede atual à sua rede GCP usando uma conexão IPsec com um dispositivo de gateway VPN. Isso permite o roteamento direto do tráfego do local às interfaces IP particulares das instâncias do Compute Engine. Como transita por links públicos para o Google, o tráfego é criptografado.

Para detalhes sobre como configurar e usar a VPN com o Compute Engine, consulte a documentação do Cloud VPN.

Para saber como se conectar a instâncias na sua rede GCP por meio de um VPN atual em vez de endereços IP externos de instâncias, leia Como se conectar a instâncias que não têm endereços IP externos.

Saída de tráfego usando gateways NAT

Quando uma instância não tem um endereço IP externo atribuído, ela não pode estabelecer conexões diretas com serviços externos, incluindo outros serviços do GCP. Para permitir que essas instâncias alcancem serviços na Internet pública, configure uma máquina de gateway NAT, que encaminhará o tráfego em nome de qualquer instância na rede. Esteja ciente de que uma única instância não deve ser considerada altamente disponível e não pode tolerar alta taxa de tráfego para várias instâncias.

Acesso do console serial interativo

Quando uma instância não tem um endereço IP externo, talvez seja necessário interagir com a instância para fins de solução de problemas ou manutenção. A configuração de um Bastion Host, como discutido anteriormente, é uma opção, mas pode exigir mais configuração do que é útil para suas necessidades. Se você quiser solucionar uma instância sem um endereço IP externo, considere ativar o acesso interativo no console serial. Isso permite que você interaja com o console serial de uma instância usando o SSH e execute comandos com o console serial.

Para saber mais, leia Como interagir com o console serial.

Balanceadores de carga de proxy SSL e HTTPS

As instâncias que são back-ends para balanceadores de carga de proxy SSL e HTTPS não precisam ter endereços IP externos para serem acessadas pelo balanceador de carga. Para acessar esses recursos diretamente, é necessário usar os métodos listados em Como conectar-se a instâncias sem endereços IP externos.

Para saber mais, leia a documentação sobre balanceamento de carga.

Teste outros recursos do Google Cloud Platform e Veja os tutoriais.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine