Como usar o IAP para encaminhamento de TCP

Nesta página, explicamos como usar o encaminhamento de TCP do Identity-Aware Proxy (IAP) para ativar o acesso administrativo a instâncias de VM que não têm endereços IP externo 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 os acessos 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 serão exibidas automaticamente no console do Google Cloud.

  2. Selecione um projeto do Google Cloud.
  3. Na página "Regras de firewall", clique em Criar regra de firewall.
  4. Defina as seguintes configurações:
    • Name: allow-ingress-from-iap
    • Direção do tráfego: entrada
    • Destino: todas as instâncias na rede
    • Filtro de origem: intervalos de IP
    • 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 o encaminhamento de TCP do IAP e a quais instâncias de VM eles podem se conectar, conceda os papéis apropriados do Identity and Access Management (IAM) no projeto.

A tabela a seguir mostra os papéis predefinidos que você precisa conceder a administradores confiáveis para encaminhamento de 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 da instância do Compute (v1) (roles/compute.instanceAdmin.v1)
Login do SO (recomendado) Vários Consulte Como configurar papéis de Login do SO em contas de usuário.
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 apenas com as permissões específicas necessárias para a tarefa, consulte Detalhes das permissões.

É possível 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.

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 administrador"

    As etapas restantes serão exibidas automaticamente 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 seguinte formato:

    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 Salvar.

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 o papel roles/iap.tunnelResourceAccessor nessa VM. Os outros papéis precisam ser concedidos no projeto.

Console

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

    Abra a página de administração do IAP

    As etapas restantes serão exibidas automaticamente 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 IAP para mais informações sobre como usar a API do 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 principais modificando o arquivo JSON da política do IAM.

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

    Veja 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 IAP. 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 particular de 10.0.0.1 na porta 22 usando as Condições de 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 papel Proprietário, ele terá 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 o 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 no 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 SSH e 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).

App PuTTY

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

Antes de configurar o aplicativo PuTTY, use o comando gcloud compute ssh uma vez para garantir que você tenha uma chave SSH privada em 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 aplicativo 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 Salvar.

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

ssh

É possível usar diretamente o comando ssh com uma opção ProxyCommand que usa gcloud para iniciar o túnel. Use-o 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 Desktop para se conectar à Área de Trabalho Remota de uma ou mais instâncias da VM usando o encaminhamento IAP para TCP.

  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.

Aumentar a largura de banda de upload de TCP do IAP

Para aumentar a largura de banda de upload 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 nas plataformas Unix, execute o seguinte comando em uma nova instância do 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, execute o seguinte comando para permitir que a gcloud acesse pacotes externos:

export CLOUDSDK_PYTHON_SITEPACKAGES=1

Windows

Para instalar o NumPy usando o pip nas 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, outra etapa será necessária. 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.

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

Próximas etapas