Conectar-se a instâncias de VM com segurança

Ao desenvolver projetos no Google Compute Engine, há diversos cenários em que você quer 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 dedicadas de escritórios ou data centers 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

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 ao público, como uma instância do Google Compute Engine com um IP externo, você tem que criptografar todas as comunicações entre o host e a instância implantada para garantir uma 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 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 servidor ou proxy da Web com terminação SSL em uma ou mais instâncias do Google Compute Engine.

Se você configurou os domínios de serviço SSL anteriormente, fazer o mesmo com o Google Compute Engine deve 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 seguinte forma:

  • example-instance é o nome da instância a que você quer se conectar.
  • my-project é o código do projeto do Google Cloud Platform.
  • 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 o http://localhost:2222/ no navegador, a conexão HTTP passará pelo túnel SSH recém-criado para o host remoto e se conectará à instância especificada via SSH. Depois, se conectará à porta 8888 na mesma máquina, mas em uma conexão SSH protegida e criptografada.

O comando 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.

Observe que, 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 mudar 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 seguinte forma:

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

Observe que, 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, você pode 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, você pode se conectar a qualquer porta em uma determinada instância.

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

Em seguida, configure o navegador para usar o proxy.

Configuração do Chrome para proxy SOCKS

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. Iniciar o Chrome cria uma instância de um perfil já em execução. Assim, para permitir a execução de diversas cópias do Chrome simultaneamente, uma que esteja usando o proxy e outras que não estejam, você precisa 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"

Mac OS X:

"/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.

Configuração do Firefox para o proxy SOCKS

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, você pode configurar o proxy SOCKS:

  1. Abra Preferências.
  2. Clique em Avançado > Redes > Configurações para abrir a caixa de diálogo Configurações de conexão.
  3. Escolha a opção Configuração do proxy manual.
    • Na seção SOCKS Host, preencha localhost como o host e a porta selecionada quando o comando gcloud foi executado anteriormente.
    • Escolha SOCKS v5.
    • Marque a caixa DNS remoto.
    • Deixe todas as outras entradas em branco.
  4. 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 ou por meio de gateway VPN gerenciado. Você pode fornecer instâncias na rede para atuar como transmissões confiáveis para conexões de entrada (hosts Bastion) 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.

Hosts Bastion

Os hosts Bastion fornecem um ponto de entrada externo para uma rede contendo instâncias particulares. Esse host pode fornecer um único ponto de fortificação ou auditoria. Ele pode ser iniciado e parado para ativar ou desativar a comunicação SSH de entrada da Internet.

Arquitetura Bastion

Ao usar um host Bastion, você pode 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 host Bastion está fora do escopo deste artigo, mas algumas etapas iniciais tomadas podem incluir as seguintes ações:

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

Por padrão, o SSH em instâncias está configurado para usar chaves particulares para autenticação. Ao usar um host Bastion, primeiro é necessário fazer login nele e, depois, na instância particular de destino. Esse login em duas etapas é o motivo pelo qual os hosts Bastion são às vezes chamados de "jump servers". Use o encaminhamento do ssh-agent em vez de armazenar a chave particular da máquina de destino no host Bastion como forma de alcançá-la. Faça isso, mesmo 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 de host Bastion para se conectar a outras instâncias na sua rede do Cloud Platform e como fazer uso do encaminhamento de ssh-agent, consulte Como se conectar a instâncias que não têm endereços IP externos.

VPN

O Cloud VPN permite conectar a rede existente à rede do Google Cloud Platform por meio da conexão IPsec a um dispositivo de gateway VPN. Isso permite o roteamento direto do tráfego do local às interfaces IP particulares das instâncias do Google 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 em sua rede do Cloud Platform por meio de uma VPN existente 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 fazer conexões diretas com serviços externos, incluindo outros serviços do Cloud Platform. 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 host Bastion é uma opção, mas pode exigir mais configuração do que valeria a pena 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 Interagir com o console serial.

Conheça outros recursos do Google Cloud Platform. Veja nossos tutoriais.

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

Enviar comentários sobre…

Documentação do Compute Engine