Como usar o IAP para encaminhamento de TCP

Esta página explica como você pode usar o encaminhamento IAP para TCP para habilitar o acesso administrativo às instâncias da VM que não possuem endereços IP públicos ou que 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 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:

  • 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:

    • Name: 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 digite 22,3389 para permitir RDP e SSH.
  • 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 permissões para usar o 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, na sigla em inglês).

Para conceder a um usuário ou grupo acesso a todas as instâncias de VM de um projeto, configure permissões do IAM no nível do projeto:

Console

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

    Abrir a página "IAM e Admin"

  2. Clique em Adicionar e configure o seguinte:

    • Novos membros: 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. Clique em Save.

gcloud

Conceda a função iap.tunnelResourceAccessor ao usuário:

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

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.

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

    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.

    Foi feito o download do seu arquivo JSON de credenciais.

  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 (em inglês). Para isso, execute o seguinte comando:

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

  4. Se esta é a primeira vez que você executa o comando acima, quando solicitado, siga estas etapas:

    1. Consiga 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 aplicativo.
    3. Copie o token do portador retornado.
    4. Exporte uma nova variável atribuída ao valor do token do portador retornado.
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  5. Se já tiver executado esse comando antes, 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 membros modificando o arquivo JSON da política do IAM.

  8. Como opção, adicione restrições de membros 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 vincula 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 membros do grupo de administradores da instância de VM com um endereço IP privado 10.0.0.1 na porta 22 usando o parâmetro 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 o nome de uma política, chame accessPolicies.list:

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  9. Defina seu 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}
    

Como alternativa, também é possível configurar as permissões do IAM individualmente pela VM:

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

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

    • Novos membros: 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. Opcionalmente, clique em Incluir condição e configure 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 ter permissão para usar o encaminhamento de TCP do IAM.

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

    destination.port == 22
    

    Você também pode restringir o acesso por 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 Save.

Como fazer tunelamento de conexões SSH

Você pode conectar-se a instâncias do Linux que não possuem um endereço IP público encapsulando o tráfego SSH por meio do IAP:

Console

Para se conectar à instância, use o botão de SSH no Console do 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 público, a conexão usará automaticamente o tunelamento de TCP do IAP. Se a instância tiver um endereço IP público, a conexão usará o endereço IP público em vez do tunelamento 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.

Como fazer tunelamento de conexões RDP

Você pode conectar-se a instâncias do Windows que não possuem um endereço IP público encapsulando o tráfego RDP por meio do IAP:

Desktop IAP

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.

Desktop IAP

Para mais informações sobre o Desktop IAP, consulte a página de projeto do GitHub.

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

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 1 hora de inatividade. Recomendamos ter lógica nos seus aplicativos para processar o restabelecimento de um túnel se ele for desconectado.

A seguir