Proteger máquinas virtuais com o IAP

Esta página explica como pode 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 o acesso direto através da Internet.

O encaminhamento TCP do IAP permite-lhe estabelecer um túnel encriptado através do qual pode encaminhar SSH, RDP e outro tráfego para instâncias de VMs. O encaminhamento TCP do IAP também lhe oferece um controlo detalhado sobre que utilizadores têm autorização para estabelecer túneis e a que instâncias de VM os utilizadores têm autorização para se ligarem.

Para saber como funciona o reencaminhamento de TCP da IAP, consulte a vista geral do reencaminhamento de TCP.

Preparar o projeto para o encaminhamento TCP do IAP

Esta secção explica os passos necessários para ativar o encaminhamento de TCP da IAP no seu projeto Google Cloud .

Crie uma regra de firewall

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

  • aplica-se a todas as instâncias de VM às quais quer que seja possível aceder através do IAP.
  • permite o tráfego de entrada do intervalo de IP 35.235.240.0/20. Este intervalo contém todos os endereços IP que o IAP usa para o encaminhamento TCP.

    Para VMs IPv6, use o seguinte intervalo de IP: 2600:2d00:1:7::/64.

  • permite ligações a todas as portas que quer que sejam acessíveis por através do encaminhamento TCP do IAP, por exemplo, a porta 22 para SSH e a porta 3389 para RDP.

Consola

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

    Abra a página Regras de firewall

    Os passos restantes aparecem na Google Cloud consola.

  2. Selecione um Google Cloud projeto. Mostrar-me.
  3. Na página Regras de firewall, clique em Criar regra de firewall.
  4. Configure as seguintes definições:
    • Nome: allow-ingress-from-iap
    • Direção do tráfego: entrada
    • Segmentação: 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 introduza 22,3389 para permitir o RDP e o SSH.
  5. Clique em Criar.

gcloud

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

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 aceder ao SSH, execute o seguinte comando:

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.

Conceda funções para o encaminhamento TCP do IAP

Para controlar que utilizadores e grupos têm autorização para usar o encaminhamento TCP do IAP e a que instâncias de VM têm autorização para se ligarem, conceda as funções da gestão de identidade e de acesso (IAM) adequadas no projeto.

Se estiver a usar o Início de sessão do SO (recomendado), consulte o artigo Configurar funções do Início de sessão do SO em contas de utilizador.

A tabela seguinte mostra as funções predefinidas que tem de conceder aos administradores fidedignos para o encaminhamento TCP e tarefas relacionadas:

Tarefa Funções Mais informações
Encaminhamento TCP Utilizador do túnel protegido por IAP (roles/iap.tunnelResourceAccessor) Consulte Conceda acesso a todas as instâncias de VMs num projeto ou Conceda acesso a uma VM específica.
Acesso SSH Administrador de instâncias do Compute (v1) (roles/compute.instanceAdmin.v1)
Use uma conta de serviço Utilizador da conta de serviço (roles/iam.serviceAccountUser) Consulte o artigo sobre a função serviceAccountUser.

Se quiser criar funções personalizadas apenas com as autorizações específicas necessárias para esta tarefa, consulte os detalhes das autorizações.

Pode conceder a um utilizador ou a um grupo acesso a todas as instâncias de VM num projeto ou a uma VM específica, consoante a forma como concede as funções necessárias.

As etiquetas não são suportadas

A concessão de autorização através de etiquetas para o encaminhamento TCP de IAP não é suportada atualmente.

Conceda acesso a todas as instâncias de VM num projeto

Pode conceder a um utilizador ou a um grupo acesso a todas as instâncias de VM num projeto através da concessão das funções de IAM necessárias ao nível do projeto:

Consola

  1. Abra a página IAM e administrador na Google Cloud consola.

    Abra a página IAM e administrador

    Os passos restantes aparecem na Google Cloud consola.

  2. Na página IAM e administrador, clique em Adicionar e configure o seguinte:
    • Novos principais: especifique o utilizador ou o grupo ao qual quer conceder acesso.
    • Selecionar uma função: selecione Cloud IAP > Utilizador do túnel protegido por IAP.
  3. Opcionalmente, clique em Adicionar condição e configure uma condição:
    • Título: introduza um nome para a condição.
    • Expressão: introduza uma condição que um utilizador tem de cumprir para obter as autorizações na função de utilizador do túnel protegido por IAP.

    Por exemplo, a seguinte expressão de IEC concede acesso apenas à porta 22:

    destination.port == 22

    Também pode 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 outra função e configure o seguinte:
    • Selecione uma função. Selecione Compute Engine > Compute Instance Admin (v1).
  5. Clique em Guardar.

gcloud

Conceda as duas funções ao utilizador 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: ID do projeto
  • EMAIL: endereço de email do utilizador ao qual quer conceder acesso, por exemplo, user@example.com.

Conceda acesso a uma VM específica

Para conceder a um utilizador ou a um grupo acesso a uma VM específica, atribua a função roles/iap.tunnelResourceAccessor nessa VM. As outras funções têm de ser concedidas no projeto.

Consola

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

    Abra a página de administração do Chrome Enterprise Premium

    Os passos restantes aparecem na Google Cloud consola.

  2. No separador Recursos de SSH e TCP da página de administração do IAP, selecione as instâncias de VM que 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 principal e configure o seguinte:

    • Novos principais: especifique o utilizador ou o grupo ao qual quer conceder acesso.
    • Selecionar uma função: selecione Cloud IAP > Utilizador do túnel protegido por IAP.
  5. Opcionalmente, clique em Adicionar condição e configure uma condição:

    • Título: introduza um nome para a condição.
    • Expressão: introduza uma condição que um utilizador tem de cumprir para obter as autorizações na função de utilizador do túnel protegido por IAP.

    Por exemplo, a seguinte expressão de IEC concede acesso apenas à porta 22:

          destination.port == 22

    Também pode 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 Guardar.

API

Para editar o ficheiro policy.json da sua aplicação, siga o processo abaixo. Consulte o artigo Gerir o acesso a recursos protegidos pelo Chrome Enterprise Premium para mais informações sobre a utilização da API IAM para gerir 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. Obtenha a política IAM para a instância do Compute Engine através do método getIamPolicy. O bit de dados vazio no final transforma o pedido 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 a função iap.tunnelResourceAccessor aos seus principais modificando o ficheiro JSON da política de IAM.

  4. Opcionalmente, conceda a função apenas a responsáveis que cumpram critérios específicos, com base nas condições da IAM e nos níveis de acesso.

    Segue-se um exemplo de um ficheiro policy.json editado que concede a função iap.tunnelResourceAccessor a um grupo de administradores de instâncias de VM, dando-lhes acesso a recursos de túneis protegidos do Chrome Enterprise Premium. Foi adicionada uma condição do IAM para tornar os recursos acessíveis apenas aos responsáveis no grupo de administradores de instâncias de VM com um endereço IP privado de 10.0.0.1 na porta 22 através das condições do IAM destination.ip e destination.port. Também têm de cumprir os requisitos do ACCESS_LEVEL_NAME nível de acesso.

    Tenha em atenção que, se um principal tiver a função de proprietário, tem autorização para usar o IAP para encaminhamento de TCP.


    Exemplo de ficheiro 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 , ligue para accessPolicies.list:

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  5. Defina o novo ficheiro policy.json através do 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 autorizações

As autorizações necessárias variam consoante a forma como um utilizador vai usar o encaminhamento TCP do IAP:

Cenários Autorizações necessárias
Tudo
  • iap.tunnelInstances.accessViaIAP
A usar gcloud compute [start-iap-tunnel, ssh, scp]
  • compute.instances.get
  • compute.instances.list
A usar gcloud compute [ssh, scp]
  • compute.projects.get
VM que usa o Início de sessão do SO Consulte estas instruções
Não usar o Início de sessão do SO
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
SSH para VM através de uma conta de serviço
  • iam.serviceAccounts.actAs
SSH a partir do navegador Consulte estas instruções

Por exemplo, se um utilizador quiser estabelecer ligação através de gcloud compute ssh a uma VM que não use o Início de sessão do SO, mas que use uma conta de serviço, o utilizador precisa das seguintes autorizaçõ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

Encaminhamento de ligações SSH

Pode estabelecer ligação a instâncias do Linux que não tenham um endereço IP externo através do encaminhamento do tráfego SSH através do IAP.

Quando usa o tunelamento do IAP, os proxies do IAP estabelecem ligação ao endereço IPv4 interno principal de nic0 na VM.

Consola

Para estabelecer ligação à sua instância, use o botão SSH na Google Cloud consola. A configuração de acesso da sua instância (definida através de autorizações da IAM) tem de permitir o encaminhamento TCP através do IAP.

gcloud

Para estabelecer ligação à sua instância, use o comando gcloud compute ssh. A configuração de acesso da instância (definida através das autorizações da IAM) tem de permitir o encaminhamento TCP através do IAP.

gcloud compute ssh INSTANCE_NAME

Substitua INSTANCE_NAME pelo nome da instância na qual quer usar o SSH.

Se a instância não tiver um endereço IP externo, a ligação usa automaticamente o túnel TCP do IAP. Se a instância tiver um endereço IP externo, a ligação usa o endereço IP externo em vez do túnel TCP do IAP.

Pode usar a flag --tunnel-through-iap para que o gcloud compute ssh use sempre o túnel TCP da IAP.

Use a flag --internal-ip para que o gcloud compute ssh nunca use o túnel TCP do IAP e, em vez disso, se ligue diretamente ao IP interno da VM. Isto é útil para clientes que estão ligados à mesma rede VPC que a VM de destino.

IAP Desktop

Pode usar o IAP Desktop para estabelecer ligação a uma instância de VM através do SSH e do encaminhamento TCP do IAP.

  1. Na aplicação, selecione Ficheiro > Adicionar projeto do Google Cloud.

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

  3. Na janela Project Explorer, clique com o botão direito do rato na instância de VM à qual quer ligar-se e selecione Ligar.

IAP Desktop

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

App PuTTY

Pode configurar a app do emulador de terminal do Windows PuTTY para que use o encaminhamento TCP do IAP para estabelecer ligação a uma instância de VM. A configuração de acesso da instância (definida através das autorizações da IAM) tem de permitir o túnel TCP através do IAP.

Antes de configurar a app PuTTY, use o comando gcloud compute ssh uma vez para garantir que tem uma chave SSH privada no seu computador local e que a sua chave SSH pública está publicada no Compute Engine:

  1. Abra uma linha de comandos e execute o seguinte comando para se ligar à instância de VM:

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

    Substitua o seguinte:

    • INSTANCE_NAME: nome da instância à qual estabelecer ligação
    • PROJECT_ID: ID do projeto no qual a instância de VM está localizada
    • ZONE: zona onde a instância de VM está localizada

    Se necessário, confirme que quer gerar chaves SSH premindo Y.

  2. Na VM, determine o seu nome de utilizador executando o seguinte comando:

    whoami

    Vai precisar deste nome de utilizador mais tarde.

Agora, pode configurar a app PuTTY para usar o encaminhamento TCP do IAP:

  1. Abra a app PuTTY e selecione a categoria Ligação > Proxy.
  2. Configure as seguintes definições de proxy:

    • Para Tipo de proxy, selecione Local.
    • No campo Comando Telnet ou comando de proxy local, introduza o seguinte:

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

      Substitua o seguinte:

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

  3. Selecione a categoria Ligação > SSH > Autenticação.

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

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

  6. Configure as seguintes definições de proxy:

    • No campo Nome do anfitrião (ou endereço IP), introduza o seguinte:

      USERNAME@INSTANCE_NAME

      Substitua o seguinte:

      • USERNAME: o nome de utilizador do Linux que determinou anteriormente
      • INSTANCE_NAME: o nome da instância de VM à qual quer estabelecer ligação
    • Sessões guardadas: introduza um nome para a sessão.

  7. Clique em Guardar.

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

ssh

Pode usar diretamente o comando ssh com uma opção ProxyCommand que usa gcloud para iniciar o túnel. Use isto para gerar o comando ssh completo:

gcloud compute ssh INSTANCE_NAME --dry-run

Encaminhamento de ligações RDP

Pode estabelecer ligação a instâncias do Windows que não tenham um endereço IP externo encaminhando o tráfego RDP através do IAP:

IAP Desktop

Pode usar o IAP Desktop para estabelecer ligação ao Ambiente de Trabalho Remoto de uma ou mais instâncias de VM através do encaminhamento TCP do IAP.

  1. Na aplicação, selecione Ficheiro > Adicionar projeto do Google Cloud.

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

  3. Na janela Project Explorer, clique com o botão direito do rato na instância de VM à qual quer ligar-se e selecione Ligar.

IAP Desktop

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

gcloud

Para se ligar ao ambiente de trabalho remoto de uma instância de VM, primeiro cria um túnel.

  1. Use o comando gcloud compute start-iap-tunnel para criar um túnel encriptado para a porta RDP da instância da 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 quer estabelecer ligação. Substitua LOCAL_PORT pela porta localhost onde quer que o proxy seja associado ou use 0 para que seja selecionada automaticamente uma porta não usada. Substitua ZONE pela zona onde a instância de VM está localizada.

  2. gcloud faz um teste de conetividade com a instância de VM e, em seguida, 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 de VM. A porta só está acessível a aplicações em execução no seu computador local.

  3. Deixe o gcloud em execução e abra a app Ligação ao Ambiente de Trabalho Remoto do Microsoft Windows.

  4. Introduza o ponto final do túnel como nome do computador:

    localhost:LOCAL_PORT

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

  5. Clique em Ligar.

Encaminhamento de outras ligações TCP

Pode usar o encaminhamento TCP da IAP para outros protocolos baseados em TCP usando o comando gcloud compute start-iap-tunnel para atribuir uma porta local. A porta local encaminha o tráfego de dados da máquina local para a máquina remota numa stream HTTPS. Em seguida, o IAP recebe os dados, aplica controlos de acesso e encaminha os dados não processados para a porta remota. Por outro lado, todos os dados da porta remota também são envolvidos antes de serem enviados para a porta local, onde são posteriormente desembrulhados.

gcloud

Crie um túnel encriptado 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 quer estabelecer ligação. Substitua LOCAL_PORT pela porta do anfitrião local onde quer que o proxy seja associado. Substitua ZONE pela zona onde a instância de VM está localizada.

gcloud faz um teste de conetividade com a instância de VM e, em seguida, 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 de VM. A porta só está acessível a aplicações executadas no seu computador local.

Aumentar a largura de banda de carregamento TCP do IAP

Para aumentar a largura de banda de carregamento de TCP da IAP, considere instalar o NumPy na mesma máquina onde a CLI gcloud está instalada.

Linux

Para instalar o NumPy através do pip em plataformas Unix, execute o seguinte comando numa 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, conclua o seguinte passo: Execute o seguinte comando para permitir que o gcloud aceda a pacotes externos:

export CLOUDSDK_PYTHON_SITEPACKAGES=1

Windows

Para instalar o NumPy através do pip em plataformas Windows, execute o seguinte comando numa 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 persistir após a instalação do NumPy, é necessário outro passo. Execute o seguinte comando para permitir que o gcloud aceda a pacotes externos:

$env:CLOUDSDK_PYTHON_SITEPACKAGES="1"

Limitações conhecidas

Largura de banda: a funcionalidade de encaminhamento TCP do IAP não se destina à transferência em massa de dados. O IAP reserva-se o direito de limitar a taxa de utilizadores que abusam deste serviço.

Duração da ligação: o IAP desliga automaticamente as sessões após uma hora de inatividade. Atualmente, o gcloud compute start-iap-tunnel tenta restabelecer o túnel se a ligação for interrompida.

Passos seguintes