Como proteger máquinas virtuais com IAP

Esta página explica como usar o encaminhamento TCP do Identity-Aware Proxy (IAP) para ativar o acesso administrativo a instâncias de VM que não têm endereços IP externos ou não permitem acesso direto pela Internet.

O encaminhamento IAP para TCP permite estabelecer um túnel criptografado sobre o qual você pode encaminhar SSH, RDP e outro tráfego para instâncias de VM. O encaminhamento IAP para TCP também fornece controle refinado sobre quais usuários têm permissão para estabelecer túneis e em quais instâncias de VM os usuários têm permissão para se conectar.

Para saber mais sobre como o encaminhamento TCP para IAP funciona, consulte a Visão geral do encaminhamento TCP.

Como preparar seu projeto para encaminhamento TCP para IAP

Esta seção mostra as etapas necessárias para ativar o encaminhamento IAP para TCP no seu projeto do Google Cloud.

Criar uma regra de firewall

Para permitir que o IAP se conecte às suas instâncias da VM, crie uma regra de firewall que:

  • aplica-se a todas as instâncias da VM que você quer que sejam acessíveis usando o IAP.
  • permite o tráfego de entrada do intervalo de IP 35.235.240.0/20. Esse intervalo contém todos os endereços IP que o IAP usa para o encaminhamento de TCP.
  • permite conexões com todas as portas que você quer que sejam acessíveis usando o encaminhamento IAP para TCP, por exemplo, porta 22 para SSH e porta 3389 para RDP.

Console

Para permitir acesso RDP e SSH a todas as instâncias de VM na sua rede, faça o seguinte:

  1. Abra a página "Regras de firewall".

    Abrir a página "Regras de firewall"

    As etapas restantes aparecem no console do Google Cloud.

  2. Selecione um projeto do Google Cloud. Mostrar.
  3. Na página "Regras de firewall", clique em Criar regra de firewall.
  4. Defina as configurações a seguir:
    • Nome: allow-ingress-from-iap
    • Direção do tráfego: entrada
    • Destino: todas as instâncias na rede
    • Filtro de origem: IP ranges
    • Intervalos de IP de origem: 35.235.240.0/20
    • Protocolos e portas: selecione TCP e insira 22,3389 para permitir RDP e SSH.
  5. Clique em Criar.

gcloud

Para permitir acesso RDP a todas as instâncias de VM na sua rede, execute:

gcloud compute firewall-rules create allow-rdp-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:3389 \
  --source-ranges=35.235.240.0/20

Para acesso SSH, execute:

gcloud compute firewall-rules create allow-ssh-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20

Para outros protocolos, execute

gcloud compute firewall-rules create allow-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:PORT \
  --source-ranges=35.235.240.0/20

onde PORT é a porta usada pelo protocolo.

Conceder papéis para encaminhamento de TCP do IAP

Para controlar quais usuários e grupos têm permissão para usar TCP do IAP e a quais instâncias de VM eles podem se conectar, conceda papéis apropriados do Identity and Access Management (IAM) no projeto.

Se você estiver usando o Login do SO (recomendado), consulte Como configurar papéis de Login do SO em contas de usuário.

A tabela a seguir mostra os papéis predefinidos que você precisa conceder a administradores confiáveis para encaminhamento TCP e tarefas relacionadas:

Tarefa Papéis Mais informações
Encaminhamento do TCP Usuário do túnel protegido pelo IAP (roles/iap.tunnelResourceAccessor) Consulte Conceder acesso a todas as instâncias de VM em um projeto ou Conceder acesso a uma VM específica.
Acesso SSH Administrador de instâncias do Compute (v1) (roles/compute.instanceAdmin.v1)
Usar uma conta de serviço Usuário da conta de serviço (roles/iam.serviceAccountUser) Consulte O papel serviceAccountUser.

Se você quiser criar papéis personalizados com apenas as permissões específicas necessárias para essa tarefa, consulte Detalhes das permissões.

Você pode conceder a um usuário ou grupo acesso a todas as instâncias de VM em um projeto ou a uma VM específica, dependendo de como você concede os papéis necessários.

As tags não são compatíveis

Conceder permissão usando tags para No momento, o encaminhamento de TCP do IAP não é compatível.

Conceder acesso a todas as instâncias de VM em um projeto

É possível conceder a um usuário ou grupo acesso a todas as instâncias de VM de um projeto concedendo os papéis do IAM necessários para envolvidos no projeto:

Console

  1. Abra a página IAM e administrador no console do Google Cloud.

    Abrir a página "IAM e Admin"

    As etapas restantes aparecem no console do Google Cloud.

  2. Na página IAM e administrador, clique em Adicionar e configure o seguinte:
    • Novos principais: especifique o usuário ou grupo que você quer conceder acesso.
    • Selecione uma função: selecione Cloud IAP > Usuário de túnel protegido por IAP.
  3. Também é possível clicar em Adicionar condição e configurar uma condição:
    • Título: digite um nome para a condição.
    • Expressão: insira uma condição que um usuário precise atender para receber as permissões no papel de usuário do túnel protegido pelo IAP.

    Por exemplo, a expressão CEL a seguir concede acesso apenas à porta 22:

    destination.port == 22

    Também é possível conceder acesso com base no nível de acesso:

    destination.port == 22 &&
    "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels

    Em que FULL_ACCESS_LEVEL_NAME é um nível de acesso existente e usa o formato a seguir:

    accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME

  4. Clique em Adicionar outro papel e faça as seguintes configurações:
    • Selecionar um papel Selecione Compute Engine > Administrador da instância do Compute (v1).
  5. Clique em Save.

gcloud

Execute os seguintes comandos para conceder os dois papéis ao usuário:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL \
    --role=roles/iap.tunnelResourceAccessor
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL \
    --role=roles/compute.instanceAdmin.v1

Substitua:

  • PROJECT_ID: ID do projeto
  • EMAIL: endereço de e-mail do usuário ao qual você quer conceder acesso, por exemplo user@example.com.

Conceder acesso a uma VM específica

Para conceder a um usuário ou grupo acesso a uma VM específica, conceda roles/iap.tunnelResourceAccessor na VM. Os outros papéis precisam ser concedidas no projeto.

Console

  1. Abra a página de administração do IAP e selecione a guia Recursos SSH e TCP.

    Abrir a página de administrador do Chrome Enterprise Premium

    As etapas restantes aparecem no console do Google Cloud.

  2. Na guia Recursos de SSH e TCP da página de administrador do IAP, selecione as instâncias de VM que você quer configurar.
  3. Clique em Mostrar painel de informações se ele não estiver visível.
  4. Clique em Adicionar principal e configure o seguinte:

    • Novos principais: especifique o usuário ou grupo que você quer conceder acesso.
    • Selecione uma função: selecione Cloud IAP > Usuário de túnel protegido por IAP.
  5. Também é possível clicar em Adicionar condição e configurar uma condição:

    • Título: digite um nome para a condição.
    • Expressão: insira uma condição que um usuário precise atender para receber as permissões no papel de usuário do túnel protegido pelo IAP.

    Por exemplo, a expressão CEL a seguir concede acesso apenas à porta 22:

          destination.port == 22

    Também é possível conceder acesso com base no nível de acesso:

        destination.port == 22 &&
        "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels

    Onde FULL_ACCESS_LEVEL_NAME é um nível de acesso existente e usa o formato accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME.

  6. Clique em Salvar.

API

Para editar o arquivo policy.json do aplicativo, siga o processo abaixo. Consulte Como gerenciar o acesso a recursos protegidos pelo Chrome Enterprise Premium para mais informações sobre como usar a API IAM para gerenciar políticas de acesso.

  1. Exporte as seguintes variáveis.

    export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel
    # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
    export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  2. Consiga a política do IAM para a instância do Compute Engine usando o método getIamPolicy. O bit de dados vazio no final transforma a solicitação curl em POST em vez de GET.

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

  3. Conceda o papel iap.tunnelResourceAccessor aos seus administradores modificando o arquivo JSON da política do IAM.

  4. Opcionalmente, conceda o papel apenas a participantes que atendam a critérios específicos, com base nas condições do IAM e nos níveis de acesso.

    Confira a seguir um exemplo de um arquivo policy.json editado que concede o papel iap.tunnelResourceAccessor a um grupo de administradores da instância de VM, concedendo acesso a recursos de túnel protegidos pelo Chrome Enterprise Premium. Uma condição do IAM foi adicionada para tornar os recursos acessíveis apenas aos principais no grupo de administradores da instância de VM com um endereço IP privado 10.0.0.1 na porta 22 usando as condições do IAM destination.ip e destination.port. Eles também precisam atender aos requisitos do nível de acesso ACCESS_LEVEL_NAME.

    Se um principal tiver o Proprietário, a pessoa tem permissão para usar o IAP para encaminhamento de TCP.


    Exemplo de arquivo policy.json

    {
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["group:instance-admins@example.com"],
            "condition": {
              "expression": "\"accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME\" in request.auth.access_levels && destination.ip == \"10.0.0.1\" && destination.port == 22",
              "title": "CONDITION_NAME"
            }
          }
        ]
      }
    }

    Para encontrar o nome de uma política, chame accessPolicies.list:

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  5. Defina seu novo arquivo policy.json usando o método setIamPolicy.

    curl -i -H "Content-Type:application/json" \
              -H "Authorization: Bearer $(gcloud auth print-access-token)" \
              ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:setIamPolicy \
              -d @${JSON_NEW_POLICY}

Detalhes das permissões

As permissões necessárias variam dependendo de como um usuário usará o encaminhamento de TCP do IAP:

Cenários Permissões necessárias
Tudo
  • iap.tunnelInstances.accessViaIAP
Como usar o gcloud compute [start-iap-tunnel, ssh, scp]
  • compute.instances.get
  • compute.instances.list
Como usar o gcloud compute [ssh, scp]
  • compute.projects.get
VM que usa o Login do SO Consulte estas instruções
Sem usar o Login do SO
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
SSH para VM usando uma conta de serviço
  • iam.serviceAccounts.actAs
SSH do navegador Consulte estas instruções

Por exemplo, se um usuário quiser se conectar usando gcloud compute ssh a uma VM que não usa o login do SO, mas usa uma conta de serviço, ele precisará das seguintes permissões:

  • iap.tunnelInstances.accessViaIAP
  • compute.instances.get
  • compute.instances.list
  • compute.projects.get
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
  • iam.serviceAccounts.actAs

Como fazer tunelamento de conexões SSH

É possível conectar-se a instâncias do Linux que não têm um endereço IP externo encapsulando o tráfego SSH por meio do IAP.

Ao usar o encapsulamento do IAP, os proxies do IAP conectam-se ao endereço IPv4 interno principal de nic0 na VM.

Console

Para se conectar à sua instância, use o botão SSH na Console do Google Cloud. A configuração de acesso da instância (definida por meio de permissões do IAM) precisa permitir o tunelamento de TCP por meio do IAP.

gcloud

Para se conectar à instância, use o comando gcloud compute ssh. A configuração de acesso da instância (definida por meio de permissões do IAM) precisa permitir o tunelamento de TCP por meio do IAP.

gcloud compute ssh INSTANCE_NAME

Substitua INSTANCE_NAME pelo nome da instância para o SSH.

Se a instância não tiver um endereço IP externo, a conexão usará automaticamente o encapsulamento de TCP do IAP. Se a instância tiver um endereço IP externo, a conexão usará o endereço IP externo em vez do encapsulamento de TCP do IAP.

Você pode usar o sinalizador --tunnel-through-iap para que gcloud compute ssh sempre use o encapsulamento IAP para TCP.

Use a sinalização --internal-ip para que gcloud compute ssh nunca use o tunelamento de TCP do IAP e, em vez disso, se conecte diretamente ao IP interno da VM. Isso é útil para clientes que estão conectados à mesma rede VPC que a VM de destino.

IAP Desktop

É possível usar o IAP Desktop para se conectar a uma instância de VM usando o encaminhamento de SSH e TCP do IAP.

  1. No aplicativo, selecione Arquivo > Adicionar projeto do Google Cloud.

  2. Digite o ID ou nome do seu projeto e clique em OK.

  3. Na janela Project Explorer, clique com o botão direito do mouse na instância da VM à qual você quer se conectar e selecione Connect.

IAP Desktop

Para mais informações sobre o IAP Desktop, consulte a página do projeto no GitHub (em inglês).

App PuTTY

Você pode configurar o app do emulador de terminal do Windows PuTTY para que ele use Encaminhamento de TCP do IAP para se conectar a uma instância de VM. A configuração de acesso da instância (definida por permissões do IAM) precisa permitir o tunelamento de TCP por meio do IAP.

Antes de configurar o app PuTTY, use o comando gcloud compute ssh uma vez para garantir que você tenha uma chave SSH particular no seu computador local e que sua chave SSH pública seja publicada no Compute Engine:

  1. Abra um prompt de comando e execute o seguinte comando para se conectar à instância de VM:

    gcloud compute ssh INSTANCE_NAME `
      --tunnel-through-iap `
      --project PROJECT_ID `
      --zone ZONE

    Substitua:

    • INSTANCE_NAME: nome da instância a ser conectada
    • PROJECT_ID: ID do projeto em que a instância de VM está localizada
    • ZONE: zona em que a instância de VM está localizada

    Se necessário, confirme se você quer gerar chaves SSH pressionando Y.

  2. Na VM, determine seu nome de usuário executando o comando a seguir:

    whoami

    Esse nome de usuário será necessário mais tarde.

Agora configure o app PuTTY para usar o encaminhamento de TCP do IAP:

  1. Abra o app PuTTY e selecione a categoria Conexão > Proxy.
  2. Defina as configurações de proxy a seguir:

    • Em Tipo de proxy, selecione Local.
    • No campo Comando Telnet ou comando proxy local, digite isto:

      gcloud.cmd compute start-iap-tunnel %host %port --listen-on-stdin --project PROJECT_ID --zone ZONE

      Substitua:

      • PROJECT_ID: ID do projeto em que a instância de VM está localizada
      • ZONE: zona em que a instância de VM está localizada
    • Para Imprimir o diagnóstico do proxy na janela do terminal, selecione Apenas até o início da sessão.

  3. Selecione a categoria Conexão > SSH > Auth.

  4. Clique em Procurar, cole o seguinte nome de arquivo e, em seguida, clique em Abrir:

    %USERPROFILE%\.ssh\google_compute_engine.ppk
  5. Selecione a categoria Sessão.

  6. Defina as configurações de proxy a seguir:

    • No campo Nome de host (ou endereço IP), digite isto:

      USERNAME@INSTANCE_NAME

      Substitua:

      • USERNAME: o nome de usuário do Linux que você determinou anteriormente
      • INSTANCE_NAME: o nome da instância de VM a que você quer se conectar
    • Sessões salvas: insira um nome para a sessão.

  7. Clique em Save.

  8. Clique em Abrir para iniciar a sessão SSH.

ssh

É possível usar o comando ssh diretamente com uma opção ProxyCommand que usa gcloud para iniciar o túnel. Use isso para gerar o comando ssh completo:

gcloud compute ssh INSTANCE_NAME --dry-run

Como fazer tunelamento de conexões RDP

É possível conectar-se a instâncias do Windows que não têm um endereço IP externo encapsulando o tráfego RDP por meio do IAP:

IAP Desktop

Você pode usar o IAP para computadores para se conectar à área de trabalho remota de uma ou mais instâncias de VM usando o encaminhamento de TCP do IAP.

  1. No aplicativo, selecione Arquivo > Adicionar projeto do Google Cloud.

  2. Digite o ID ou nome do seu projeto e clique em OK.

  3. Na janela Project Explorer, clique com o botão direito do mouse na instância da VM à qual você quer se conectar e selecione Connect.

IAP Desktop

Para mais informações sobre o IAP Desktop, consulte a página do projeto no GitHub (em inglês).

gcloud

Para conectar-se à Área de Trabalho Remota de uma instância de VM, primeiro crie um túnel.

  1. Use o comando gcloud compute start-iap-tunnel para criar um túnel criptografado para a porta RDP da instância de VM.

    gcloud compute start-iap-tunnel INSTANCE_NAME 3389 \
        --local-host-port=localhost:LOCAL_PORT \
        --zone=ZONE

    Substitua INSTANCE_NAME pelo nome da instância de VM à qual você quer se conectar. Substitua LOCAL_PORT pela porta localhost em que você quer que o proxy seja vinculado ou use 0 para que um não usado seja selecionado automaticamente. Substitua ZONE pela zona em que a instância de VM está localizada.

  2. gcloud executa um teste de conectividade com a instância de VM, abre um túnel e mostra um número de porta.

    Listening on port [LOCAL_PORT].

    Todo o tráfego enviado para o localhost:LOCAL_PORT é encaminhado para a instância da VM. A porta é acessível apenas por aplicativos em execução no seu computador local.

  3. Deixe o gcloud em execução e abra o aplicativo Conexão de Área de Trabalho Remota do Microsoft Windows.

  4. Digite o endpoint do túnel como nome do computador:

    localhost:LOCAL_PORT

    Substitua LOCAL_PORT pelo número da porta mostrado quando o túnel foi aberto por gcloud.

  5. Clique em Connect.

Como fazer tunelamento de outras conexões TCP

É possível usar o encaminhamento de TCP do IAP para outros protocolos baseados em TCP usando o comando gcloud compute start-iap-tunnel para alocar uma porta local. A porta local encapsula o tráfego de dados da máquina local para a máquina remota em stream HTTPS. O IAP então recebe os dados, aplica os controles de acesso e encaminha os dados não encapsulados para a porta remota. Por outro lado, todos os dados da porta remota também são encapsulados antes de serem enviados para a porta local em que são desencapsulados.

gcloud

Crie um tunelamento criptografado para uma porta da instância da VM:

gcloud compute start-iap-tunnel INSTANCE_NAME INSTANCE_PORT \
    --local-host-port=localhost:LOCAL_PORT \
    --zone=ZONE

Substitua INSTANCE_NAME e INSTANCE_PORT pelo nome e pela porta da instância de VM a que você quer se conectar. Substitua LOCAL_PORT pela porta do localhost onde você quer que o proxy seja vinculado. Substitua ZONE pela zona em que a instância de VM está localizada.

gcloud executa um teste de conectividade com a instância de VM, abre um túnel e mostra um número de porta.

Listening on port [LOCAL_PORT].

Todo o tráfego enviado para o localhost:LOCAL_PORT é encaminhado para a instância da VM. A porta é acessível apenas por aplicativos em execução no seu computador local.

Como aumentar a largura de banda de upload de TCP do IAP

Para aumentar a largura de banda de upload do TCP do IAP, instale o NumPy na mesma máquina em que a CLI gcloud está instalada.

Linux

Para instalar o NumPy usando o pip em plataformas Unix, execute o seguinte comando em uma nova instância de terminal:

$(gcloud info --format="value(basic.python_location)") -m pip install numpy
Para mais informações, consulte: NumPy.org

Se a mensagem de erro persistir após a instalação do NumPy, siga esta etapa: Execute o comando a seguir para permitir que o gcloud acesse pacotes externos:

export CLOUDSDK_PYTHON_SITEPACKAGES=1

Windows

Para instalar o NumPy usando o pip em plataformas Windows, execute o seguinte comando em uma nova instância do PowerShell:

start (gcloud info --format="value(basic.python_location)") "-m pip install numpy"
Para mais informações, consulte: NumPy.org

Se a mensagem ainda persistir após a instalação do NumPy, será necessário realizar outra etapa. Execute o seguinte comando para permitir que a gcloud acesse pacotes externos:

$env:CLOUDSDK_PYTHON_SITEPACKAGES="1"

Limitações conhecidas

Largura de banda: o recurso de encaminhamento de TCP do IAP não se destina à transferência em massa de dados. O IAP se reserva o direito de limitar a taxa dos usuários que abusam desse serviço.

Comprimento da conexão: o IAP desconecta automaticamente as sessões. após uma hora de inatividade. Atualmente, o gcloud compute start-iap-tunnel tenta restabelecer o túnel se ele for desconectado.

Próximas etapas