Como usar o IAP para encaminhamento de TCP

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

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

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

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

Como preparar seu projeto para encaminhamento de TCP do IAP

Nesta seção, você vê as etapas necessárias para ativar o encaminhamento de TCP do IAP no seu projeto do Google Cloud.

Criar regra de firewall

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

  • aplica-se a todas as instâncias de VM que você quer acessar 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 acessar usando o encaminhamento de TCP do IAP, por exemplo, porta 22 para SSH e porta 3389 para RDP.

Console

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

  • Abra a página "Regras de firewall" e clique em Criar regra de firewall

    Abrir a página "Regras de firewall"

  • 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.
  • Clique em Criar.

gcloud

Para permitir o 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

em que PORT é a porta usada pelo protocolo.

Conceder permissões para usar o encaminhamento de TCP do IAP

Para controlar quais usuários e grupos podem usar o encaminhamento de TCP do IAP e a quais instâncias de VM eles podem se conectar, configure as permissões de gerenciamento de identidade e acesso (IAM).

Recomendamos que você conceda todas as funções a seguir a administradores confiáveis:

Além disso, se você estiver usando o Login do SO (recomendado), consulte Como configurar papéis de Login do SO em contas de usuário. Se você estiver usando contas de serviço, consulte estas instruções sobre como configurar o papel serviceAccountUser.

Conceda a um usuário ou grupo acesso a todas as instâncias de VM em um projeto configurando permissões do IAM no nível do projeto:

Console

  1. Abra a página IAM & Admin no Console do Cloud.

    Abrir a página Administrador do IAM &amp

  2. Clique em Adicionar e configure o seguinte:

    • Novos membros: especifique o usuário ou o grupo a que você quer conceder acesso.
    • Selecione um papel Selecione Cloud IAP > Usuário de túnel protegido por IAP.
  3. Também é possível clicar em Adicionar condição e configurar uma restrição de membro:

    • Título: digite um nome para a restrição.
    • Expressão: insira uma condição que um usuário precisa atender antes de poder usar o IAP para encaminhamento de TCP.

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

    destination.port == 22
    

    Também é possível restringir o acesso por 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 atual e usa o formato accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME.

  4. Clique em Adicionar outro papel e configure o seguinte:

    • Selecionar um papel Selecione Compute Engine > Compute Instance Admin (v1).
  5. Clique em Save.

gcloud

Conceda os dois papéis ao usuário executando os seguintes comandos:

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 o seguinte:

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

Se preferir, configure o papel iap.tunnelResourceAccessor por VM (os outros papéis precisam estar no projeto):

Console

  1. Abra a página de administrador do IAP e selecione a guia Recursos SSH e TCP.

    Abrir a página de administrador do IAP

  2. Selecione as instâncias de VM que você quer configurar.
  3. Clique em Mostrar painel de informações se o painel não estiver visível.
  4. Clique em Adicionar membro e configure o seguinte:

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

    • Título: digite um nome para a restrição.
    • Expressão: insira uma condição que um usuário precisa atender antes de poder usar o IAP para encaminhamento de TCP.

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

    destination.port == 22
    

    Também é possível restringir o acesso por 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 atual e usa o formato accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME.

  6. Clique em Save.

API

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

  1. Faça o download do arquivo de credenciais da sua conta de serviço.

    1. Acesse a página Contas de serviço.
      Acessar a página "Contas de serviço"

    2. Clique no endereço de e-mail da sua conta de serviço.

    3. Clique em Edit.

    4. Clique em Criar chave.

    5. Selecione JSON como o tipo de chave.

    6. Crie uma nova chave clicando em Criar e fechando a janela de confirmação exibida.

    O download do arquivo de credenciais JSON foi feito.

  2. Exporte as seguintes variáveis:

    export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel
    # Replace with the path to your local service account's downloaded JSON file
    export JSON_CREDS=EXAMPLE.IAM.GSERVICEACCOUNT.COM.JSON
    # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
    export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  3. Converta o arquivo JSON de credenciais da sua conta de serviço em um token de acesso OAuth usando o Oauth2l. Para isso, execute o seguinte comando:

    oauth2l header --json ${JSON_CREDS} cloud-platform

  4. Se esta for a primeira vez que você executa o comando acima, quando solicitado:

    1. Acesse o código de verificação clicando no link exibido e copiando o código.
    2. Cole o código de verificação no prompt do app.
    3. Copie o token do portador retornado.
    4. Exporte uma nova variável que é atribuída ao valor do token do portador retornado.
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  5. Se você já tiver executado esse comando, exporte a seguinte variável:

    export CLOUD_OAUTH_TOKEN="$(oauth2l header --json ${JSON_CREDS} cloud-platform)"

  6. 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 "${CLOUD_OAUTH_TOKEN}" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

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

  8. Opcionalmente, adicione restrições de membros com base em Condições do IAM e níveis de acesso.

    Veja a seguir um exemplo de arquivo policy.json editado que vincula o papel iap.tunnelResourceAccessor a um grupo de administradores de instâncias de VM, concedendo a eles acesso a recursos de túnel protegidos pelo IAP. Uma condição de IAM foi adicionada para tornar os recursos acessíveis apenas para membros do grupo de administradores da instância de VM com um endereço IP privado 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 membro 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 um nome de política, chame accessPolicies.list:

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

    curl -i -H "Content-Type:application/json" \
              -H "$(oauth2l header --json ${JSON_CREDS} cloud-platform)" \
              ${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
Todos
  • 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.
Não 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 que usar 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 estabelecer túnel de conexões SSH

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

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

Console

Para se conectar à instância, use o botão SSH no Console do Cloud. 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.

gcloud

Para se conectar à instância, use o comando gcloud compute ssh. 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.

gcloud compute ssh INSTANCE_NAME

Substitua INSTANCE_NAME pelo nome da instância conectada ao SSH.

Se a instância não tiver um endereço IP externo, a conexão usará automaticamente o tunelamento 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 tunelamento TCP do IAP.

É possível usar a sinalização --tunnel-through-iap para que gcloud compute ssh sempre use o tunelamento TCP do IAP.

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

IAP Desktop

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

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

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

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

IAP Desktop

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

PuTTY.

Configure o 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 PuTTY, use o comando gcloud compute ssh uma vez para garantir que você tenha uma chave SSH privada 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 da VM:

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

    Substitua o seguinte:

    • INSTANCE_NAME: nome da instância a ser conectada
    • PROJECT_ID: o 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 é possível configurar o PuTTY para usar o encaminhamento de TCP do IAP:

  1. Abra o PuTTY e selecione a categoria Connection > 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 o seguinte:

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

      Substitua o seguinte:

      • PROJECT_ID: o 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 diagnósticos de proxy na janela de terminal, selecione Apenas até o início da sessão.

  3. Selecione a categoria Connection > SSH > Auth.

  4. Clique em Procurar e cole o seguinte nome de arquivo e 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 o seguinte:

      USERNAME@INSTANCE_NAME
      

      Substitua o seguinte:

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

  7. Clique em Save.

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

Como estabelecer túnel de conexões RDP

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

IAP Desktop

É possível usar o IAP Desktop (em inglês) para se conectar à rea de trabalho remota de uma ou mais instâncias de VM usando o encaminhamento TCP do IAP.

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

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

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

IAP Desktop

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

gcloud

Para se conectar à 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 do host local onde 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, depois abre um túnel e mostra um número de porta.

    Listening on port [LOCAL_PORT].
    

    Todo o tráfego enviado para localhost:LOCAL_PORT é encaminhado para a instância da VM. A porta só pode ser acessada por aplicativos executados no computador local.

  3. Deixe o gcloud em execução e abra o app Conexão de rea de Trabalho Remota da Microsoft.

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

    localhost:LOCAL_PORT
    

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

  5. Clique em Connect.

Como fazer o 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 encaminha o tráfego de dados da máquina local para a máquina remota em um stream HTTPS. Em seguida, o IAP recebe os dados, aplica os controles de acesso e encaminha os dados desagrupados para a porta remota. Por outro lado, todos os dados da porta remota são agrupados antes de serem enviados para a porta local em que são desagrupados.

gcloud

Crie um túnel criptografado para uma porta da instância de 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 à qual você quer se conectar. Substitua LOCAL_PORT pela porta do localhost a que você quer vincular o proxy. 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, depois abre um túnel e mostra um número de porta.

Listening on port [LOCAL_PORT].

Todo o tráfego enviado ao localhost:LOCAL_PORT é encaminhado para a instância de VM. A porta só pode ser acessada por aplicativos executados no computador local.

Como aumentar a largura de banda de upload TCP do IAP

Para aumentar a largura de banda de upload TCP do IAP, considere a instalação do NumPy. Para instruções sobre como instalar o NumPy, consulte: NumPy.org.

gcloud

Execute o seguinte comando para permitir que a gcloud acesse pacotes externos:

export CLOUDSDK_PYTHON_SITEPACKAGES=1.

Limitações conhecidas

Largura de banda: o recurso de encaminhamento de TCP não é destinado à transferência em massa de dados. O IAP reserva-se o direito de limitar a taxa de 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. Recomendamos ter a lógica nos seus aplicativos para lidar com o restabelecimento de um túnel quando ele é desconectado.

A seguir