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:

  • Por serem 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 serem expostos a usuários externos.
  • É possível que a instância esteja fornecendo serviços projetados para serem 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.

Proteger serviços em máquinas com endereços IP externos

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, é necessário 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 da Web de produção, configure o HTTPS/SSL. O HTTPS/SSL pode ser configurado ao definir uma instância para encerrar o HTTPS ou ao ajustar o balanceamento de carga HTTPS. O HTTPS/SSL envolve alguma 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

É possível usar a ferramenta de linha de comando gcloud para iniciar um servidor em uma determinada porta local que encaminha todo o tráfego para um host remoto por meio de 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.
  • us-central1-a é a zona em que a instância está em execução.
  • 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/ no navegador, a conexão HTTP usará o túnel SSH criado para que o host remoto se conecte à instância especificada usando SSH. A partir daí, a conexão HTTP usará o túnel SSH para se conectar à porta 8888 na mesma máquina, mas por meio de uma conexão SSH criptografada e segura.

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

Para criar mais de uma regra de encaminhamento de portas, é possível especificar várias regras em uma única linha de comando repetindo estas sinalizações:

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

Como alternativa, é possível executar um novo comando gcloud sempre que 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 abreviado dos hosts em vez de procurar o endereço IP de cada um deles, 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 você está fazendo o tunelamento de todo o tráfego usando esse host, evite usar esse navegador ou esse perfil específico para navegar na Web, porque você precisa dedicar a largura de banda ao serviço de nuvem. Em geral, talvez seja 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 zone \
    --ssh-flag="-D" \
    --ssh-flag="NNNN" \
    --ssh-flag="-N"

Substitua:

  • example-instance: o nome da instância a que você quer se conectar.
  • my-project: é o ID do projeto do Google Cloud.
  • zone: a zona em que a instância está sendo executada, por exemplo us-central1-a.
  • NNNN: a porta local em que você está ouvindo, como 1080.

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"

No Windows:

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

Defina a porta localhost com o mesmo valor que você usou no comando gcloud anteriormente (1080, no nosso exemplo).

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.
  4. Na seção Host SOCKS, preencha localhost como o host e a porta que você selecionou ao executar o comando gcloud anteriormente.
  5. Escolha SOCKS v5.
  6. Marque a caixa Remote DNS.
  7. Deixe todas as outras entradas em branco.
  • Clique em OK e feche a caixa de diálogo Preferências.
  • Conectar-se a instâncias sem endereços IP externos

    Quando as instâncias não têm endereços IP externos, elas só podem ser acessadas por outras instâncias na rede, pelo recurso de encaminhamento de TCP do Identity-Aware Proxy ou usando o gateway de 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.

    Além de fornecer um ponto único de fortalecimento ou auditoria, esse host pode ser iniciado e interrompido para ativar ou desativar o SSH de entrada. Ao usar um Bastion Host, é possível se conectar a uma instância sem 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. Devido a esse login de duas etapas, razão pela qual os Bastion Hosts são às vezes são chamados de "servidores jump", use o encaminhamento ssh em vez de armazenar a chave privada da máquina de destino no Bastion Host como uma maneira de alcançar essa máquina. Você precisa fazer isso mesmo se estiver usando o mesmo par de chaves para instâncias de Bastion e de destino, porque o Bastion tem acesso direto apenas à 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 Google Cloud, consulte Como se conectar por meio de um Bastion Host.

    Para saber como usar o encaminhamento ssh e outros métodos para se conectar às instâncias que não têm endereços IP externos, consulte Como se conectar às instâncias que não têm endereços IP externos.

    IAP para encaminhamento de TCP

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

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

    VPN

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

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

    Para saber como se conectar às instâncias na rede do Google Cloud por meio de uma VPN atual, e não por meio de endereços IP externos de instâncias, leia Como se conectar às 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 se conectar diretamente aos serviços externos, incluindo outros serviços do Google Cloud. 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. Não suponha que uma única instância seja altamente disponível ou capaz de suportar uma alta capacidade 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 resolver problemas de uma instância sem um endereço IP externo, considere ativar o acesso interativo no console serial. Isso permite interagir com o console serial de uma instância usando o SSH e executar comandos nesse console.

    Para saber mais, leia 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. Veja nossos tutoriais.