Uso de IAP para redirección de TCP

En esta página, se explica cómo puedes utilizar el reenvío de TCP de Identity-Aware Proxy (IAP) para habilitar el acceso administrativo a instancias de VM que no tienen direcciones IP externas o que no permiten el acceso directo a través de Internet.

El reenvío IAP de TCP te permite establecer un túnel encriptado sobre el cual puedes reenviar SSH, RDP y otro tráfico a las instancias de VM. El reenvío IAP de TCP también te proporciona un control detallado sobre qué usuarios pueden establecer túneles y a qué instancias de VM pueden conectarse los usuarios.

Para obtener más información sobre cómo funciona el reenvío IAP de TCP, consulte la Descripción general del reenvío de TCP.

Prepara el proyecto para el reenvío IAP de TCP

En esta sección, se te guía a través de los pasos necesarios para habilitar el reenvío IAP de TCP en el proyecto Google Cloud.

Crea una regla de firewall

Para permitir que IAP se conecte a tus instancias de VM, crea una regla de firewall que cumpla con lo siguiente:

  • Se aplica a todas las instancias de VM a las que deseas acceder mediante IAP.
  • Permite el tráfico de entrada desde el rango de IP 35.235.240.0/20. Este rango contiene todas las direcciones IP que IAP usa para el reenvío de TCP.
  • Permite conexiones a todos los puertos a los que deseas acceder a través del reenvío IAP de TCP, por ejemplo, el puerto 22 para SSH y el puerto 3389 para RDP.

Console

Para permitir el acceso de RDP y SSH a todas las instancias de VM en tu red, haz lo siguiente:

  1. Abre la página Reglas de firewall.

    Abrir la página Reglas de firewall

    Los pasos restantes aparecen en la consola de Google Cloud.

  2. Selecciona un proyecto de Google Cloud.
  3. En la página Reglas de firewall, haz clic en Crear regla de firewall.
  4. Establece la siguiente configuración:
    • Nombre: allow-ingress-from-iap
    • Dirección del tráfico:Entrada
    • Destino: Todas las instancias de la red
    • Filtro de origen: IP ranges
    • Rangos de IP de origen35.235.240.0/20
    • Protocolos y puertos: Selecciona TCP y, luego, ingresa 22,3389 para permitir RDP y SSH.
  5. Haz clic en Crear.

gcloud

Para permitir el acceso de RDP a todas las instancias de VM en la red, ejecuta lo siguiente:

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 acceso SSH, ejecuta lo siguiente:

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 otros protocolos, ejecuta lo siguiente

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

en el que PORT es el puerto utilizado por el protocolo.

Otorga roles para la redirección de TCP de IAP

Para controlar qué usuarios y grupos pueden usar la redirección de TCP de IAP y a qué instancias de VM se pueden conectar, otorga los roles de Identity and Access Management (IAM) adecuados en el proyecto.

Si usas el Acceso al SO (recomendado), consulta Configura los roles de Acceso al SO en cuentas de usuario.

En la siguiente tabla, se muestran los roles predefinidos que debes otorgar a los administradores de confianza para el reenvío de TCP y las tareas relacionadas:

Tarea Funciones Más información
Redirección de TCP Usuario de túnel protegido con IAP (roles/iap.tunnelResourceAccessor) Consulta Otorga acceso a todas las instancias de VM de un proyecto o Otorga acceso a una VM específica.
Acceso SSH Administrador de instancias de Compute (v1) (roles/compute.instanceAdmin.v1)
Usa una cuenta de servicio Usuario de la cuenta de servicio (roles/iam.serviceAccountUser) Consulta La función serviceAccountUser.

Si deseas crear roles personalizados con solo los permisos específicos necesarios para esta tarea, consulta Detalles de los permisos.

Puedes otorgar a un usuario o grupo acceso a todas las instancias de VM de un proyecto o a una VM específica, según cómo otorgues los roles requeridos.

No se admiten etiquetas

Actualmente, no se admite otorgar permisos con etiquetas para el reenvío de TCP de IAP.

Otorga acceso a todas las instancias de VM de un proyecto

Puedes otorgar a un usuario o grupo acceso a todas las instancias de VM de un proyecto otorgando los roles de IAM necesarios a nivel del proyecto:

Console

  1. Abre la página IAM y administración en la consola de Google Cloud.

    Abrir la página IAM y administración

    Los pasos restantes aparecen en la consola de Google Cloud.

  2. En la página IAM y administración, haz clic en Agregar y configura la siguiente información:
    • Principales nuevas: Especifica el usuario o grupo al que quieres otorgar acceso.
    • Selecciona un rol: Selecciona Cloud IAP > Usuario de túnel protegido con IAP.
  3. De manera opcional, haz clic en Agregar condición y configura una condición:
    • Título: Ingresa un nombre para la condición.
    • Expresión: ingresa una condición que un usuario debe cumplir para obtener los permisos en el rol de usuario de túnel protegido con IAP.

    Por ejemplo, la siguiente expresión CEL otorga acceso solo al puerto 22:

    destination.port == 22

    También puedes otorgar acceso según el nivel de acceso:

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

    En el ejemplo anterior, FULL_ACCESS_LEVEL_NAME es un nivel de acceso existente y usa el siguiente formato:

    accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME

  4. Haz clic en Agregar otro rol y configura la siguiente información:
    • Selecciona un rol: selecciona Compute Engine > Administrador de instancias de procesamiento (v1).
  5. Haz clic en Guardar.

gcloud

Otorga los dos roles al usuario mediante la ejecución de los siguientes 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

Reemplaza lo siguiente:

  • PROJECT_ID: El ID del proyecto
  • EMAIL: Dirección de correo electrónico del usuario al que deseas otorgar acceso, por ejemplo user@example.com.

Otorga acceso a una VM específica

Para otorgar a un usuario o grupo acceso a una VM específica, debes otorgar el rol roles/iap.tunnelResourceAccessor en esa VM. Los otros roles se deben otorgar en el proyecto.

Console

  1. Abre la página de administración de IAP y selecciona la pestaña Recursos SSH y TCP.

    Abrir la página de administración de IAP

    Los pasos restantes aparecen en la consola de Google Cloud.

  2. En la pestaña Recursos de SSH y TCP de la página de administración de IAP, selecciona las instancias de VM que quieres configurar.
  3. Haz clic en Mostrar panel de información si el panel de información no está visible.
  4. Haz clic en Agregar principal y configura lo siguiente:

    • Principales nuevas: Especifica el usuario o grupo al que quieres otorgar acceso.
    • Selecciona un rol: Selecciona Cloud IAP > Usuario de túnel protegido con IAP.
  5. De manera opcional, haz clic en Agregar condición y configura una condición:

    • Título: Ingresa un nombre para la condición.
    • Expresión: ingresa una condición que un usuario debe cumplir para obtener los permisos en el rol de usuario de túnel protegido con IAP.

    Por ejemplo, la siguiente expresión CEL otorga acceso solo al puerto 22:

          destination.port == 22

    También puedes otorgar acceso según el nivel de acceso:

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

    En el ejemplo anterior, FULL_ACCESS_LEVEL_NAME es un nivel de acceso existente y usa el formato accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME.

  6. Haz clic en Guardar.

API

Para editar el archivo policy.json de tu aplicación, sigue el proceso que aparece a continuación. Consulta Administra el acceso a los recursos protegidos por IAP a fin de obtener más información sobre cómo usar la API de IAM para administrar las políticas de acceso.

  1. Exporta las siguientes variables.

    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. Obtén la política de IAM para la instancia de Compute Engine con el método getIamPolicy. El bit de datos vacío al final convierte la solicitud curl en POST en lugar 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. Otorga el rol iap.tunnelResourceAccessor a tus principales modificando el archivo JSON de la política de IAM.

  4. De forma opcional, otorga el rol solo a las principales que cumplan con criterios específicos, según las condiciones de IAM y los niveles de acceso.

    El siguiente es un ejemplo de un archivo policy.json editado que otorga el rol iap.tunnelResourceAccessor a un grupo de administradores de instancias de VM y les brinda acceso a recursos de túneles protegidos con IAP. Se agregó una condición de IAM para que solo los principales del grupo de administradores de instancias de VM puedan acceder a los recursos mediante una dirección IP privada de 10.0.0.1 en el puerto 22 con las condiciones de IAM destination.ip y destination.port. También deben cumplir con los requisitos de nivel de acceso ACCESS_LEVEL_NAME.

    Ten en cuenta que si un principal tiene el rol de Propietario, tiene permiso para usar IAP para el reenvío de TCP.


    Archivo policy.json de ejemplo

    {
      "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 buscar un nombre de política, llama a accessPolicies.list:

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  5. Configura tu nuevo archivo policy.json con el 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}

Detalles de los permisos

Los permisos necesarios varían según la forma en que un usuario utilice el reenvío de TCP de IAP:

Situaciones Permisos necesarios
Todos
  • iap.tunnelInstances.accessViaIAP
Usa gcloud compute [start-iap-tunnel, ssh, scp]
  • compute.instances.get
  • compute.instances.list
Usa gcloud compute [ssh, scp]
  • compute.projects.get
VM con Acceso al SO Consulta estas instrucciones.
No se usa el Acceso al SO
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
SSH a VM con una cuenta de servicio
  • iam.serviceAccounts.actAs
SSH desde el navegador Consulta estas instrucciones.

Por ejemplo, si un usuario quiere conectarse con gcloud compute ssh a una VM que no usa el Acceso al SO, pero que usa una cuenta de servicio, necesitará los siguientes permisos:

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

Uso de túneles de conexiones SSH

Puedes conectarte a instancias de Linux que no tienen una dirección IP externa mediante la creación de un túnel del tráfico SSH a través de IAP.

Cuando usas el tunelización de IAP, los proxies de IAP se conectan a la dirección IPv4 interna principal de nic0 en la VM.

Console

Para conectarte a tu instancia, usa el botón SSH en la consola de Google Cloud. La configuración de acceso de tu instancia (definida a través de los permisos de IAM) debe permitir el uso de túneles TCP a través de IAP.

gcloud

Para conectarte a tu instancia, usa el comando gcloud compute ssh. La configuración de acceso de tu instancia (definida a través de permisos de IAM) debe permitir el uso de túneles TCP a través de IAP.

gcloud compute ssh INSTANCE_NAME

Reemplaza INSTANCE_NAME por el nombre de la instancia para establecer una conexión SSH.

Si la instancia no tiene una dirección IP externa, la conexión utilizará túneles de TCP de IAP de forma automática. Si la instancia tiene una dirección IP externa, la conexión usará la dirección IP externa en lugar de los túneles de TCP de IAP.

Puedes usar el indicador --tunnel-through-iap para que gcloud compute ssh siempre use el túnel IAP de TCP.

Usa la marca --internal-ip para que gcloud compute ssh nunca use túneles TCP de IAP y, en su lugar, se conecte directamente a la IP interna de la VM. Esto es útil para los clientes que están conectados a la misma red de VPC que la VM de destino.

IAP Desktop

Puedes usar IAP Desktop para conectarte a una instancia de VM mediante el reenvío de TCP de IAP y SSH.

  1. En la aplicación, selecciona Archivo > Agregar proyecto Google Cloud.

  2. Ingresa el ID o el nombre del proyecto y haz clic en Aceptar.

  3. En la ventana Explorador de proyectos, haz clic con el botón derecho en la instancia de VM a la que deseas conectarte y selecciona Conectar.

IAP Desktop

Para obtener más información sobre IAP Desktop, consulta la página del proyecto de GitHub.

App de PuTTY

Puedes configurar la app de emulador de terminal de Windows PuTTY para que use el reenvío de TCP de IAP a fin de conectarse a una instancia de VM. La configuración de acceso de tu instancia (definida a través de permisos de IAM) debe permitir el uso de túneles TCP a través de IAP.

Antes de configurar la app de PuTTY, usa el comando gcloud compute ssh una vez para asegurarte de tener una llave SSH privada en tu computadora local y de que tu llave SSH pública se publique en Compute Engine:

  1. Abre un símbolo del sistema y ejecuta el siguiente comando para conectarte a la instancia de VM:

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

    Reemplaza lo siguiente:

    • INSTANCE_NAME: Es el nombre de la instancia a la que te conectarás
    • PROJECT_ID: El ID del proyecto en el que se encuentra la instancia de VM
    • ZONE: La zona en la que se encuentra la instancia de VM

    Si es necesario, presiona Y para confirmar que quieres generar claves SSH.

  2. En la VM, ejecuta el siguiente comando para determinar tu nombre de usuario:

    whoami

    Necesitarás este nombre de usuario más adelante.

Ahora puedes configurar la app de PuTTY para usar el reenvío de TCP de IAP:

  1. Abre la app de PuTTY y selecciona la categoría Connection > Proxy.
  2. Establece la siguiente configuración de proxy:

    • En Tipo de proxy, selecciona Local.
    • En el campo Comando de Telnet o comando de proxy local, ingresa lo siguiente:

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

      Reemplaza lo siguiente:

      • PROJECT_ID: El ID del proyecto en el que se encuentra la instancia de VM
      • ZONE: La zona en la que se encuentra la instancia de VM
    • En Imprimir diagnóstico de proxy en la ventana de terminal, selecciona Solo hasta que se inicie la sesión.

  3. Selecciona la categoría Conexión > SSH > Auth.

  4. Haz clic en Explorar, pega el siguiente nombre de archivo y, luego, haz clic en Abrir:

    %USERPROFILE%\.ssh\google_compute_engine.ppk
  5. Selecciona la categoría Sesión.

  6. Establece la siguiente configuración de proxy:

    • En el campo Nombre de host (o dirección IP), ingresa lo siguiente:

      USERNAME@INSTANCE_NAME

      Reemplaza lo siguiente:

      • USERNAME: El nombre de usuario de Linux que determinaste antes
      • INSTANCE_NAME: Es el nombre de la instancia de VM a la que deseas conectarte.
    • Sesiones guardadas: Ingresa un nombre para la sesión.

  7. Haz clic en Guardar.

  8. Haz clic en Abrir para iniciar la sesión de SSH.

ssh

Puedes usar directamente el comando ssh con una opción ProxyCommand que use gcloud para iniciar el túnel. Usa esto para generar el comando ssh completo:

gcloud compute ssh INSTANCE_NAME --dry-run

Túnel de conexiones de RDP

Puedes conectarte a instancias de Windows que no tienen una dirección IP externa si creas un túnel del tráfico de RDP a través de IAP:

IAP Desktop

Puedes usar IAP Desktop para conectarte al escritorio remoto de una o más instancias de VM mediante el reenvío de TCP de IAP.

  1. En la aplicación, selecciona Archivo > Agregar proyecto Google Cloud.

  2. Ingresa el ID o el nombre del proyecto y haz clic en Aceptar.

  3. En la ventana Explorador de proyectos, haz clic con el botón derecho en la instancia de VM a la que deseas conectarte y selecciona Conectar.

IAP Desktop

Para obtener más información sobre IAP Desktop, consulta la página del proyecto de GitHub.

gcloud

Para conectarte al escritorio remoto de una instancia de VM, primero crea un túnel.

  1. Usa el comando gcloud compute start-iap-tunnel para crear un túnel encriptado al puerto RDP de la instancia de VM.

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

    Reemplaza INSTANCE_NAME por el nombre de la instancia de VM a la que deseas conectarte. Reemplaza LOCAL_PORT por el puerto localhost en el que deseas vincular el proxy o usa 0 para que se seleccione uno sin usar de forma automática. Reemplaza ZONE por la zona en la que se encuentra la instancia de VM.

  2. gcloud realiza una prueba de conectividad con la instancia de VM. Luego, abre un túnel y muestra un número de puerto.

    Listening on port [LOCAL_PORT].

    Todo el tráfico enviado a localhost:LOCAL_PORT se reenvía a la instancia de VM. Solo las aplicaciones que se ejecutan en tu computadora local pueden acceder al puerto.

  3. Deja gcloud en ejecución y abre la app de Conexión de escritorio remoto de Microsoft Windows.

  4. Ingresa el punto final del túnel como nombre de la computadora:

    localhost:LOCAL_PORT

    Reemplaza LOCAL_PORT por el número de puerto que se mostró cuando gcloud abrió el túnel.

  5. Haz clic en Conectar.

Crea túneles de otras conexiones de TCP

Puedes usar el reenvío de TCP de IAP para otros protocolos basados en TCP con el comando gcloud compute start-iap-tunnel a fin de asignar un puerto local. El puerto local envía el tráfico de datos a través de un túnel desde la máquina local hasta la máquina remota en una transmisión HTTPS. Luego, IAP recibe los datos, aplica controles de acceso y reenvía los datos separados al puerto remoto. Por el contrario, todos los datos del puerto remoto se unen antes de enviarse al puerto local, donde luego se separan.

gcloud

Crea un túnel cifrado a un puerto de la instancia de VM:

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

Reemplaza INSTANCE_NAME y INSTANCE_PORT por el nombre y el puerto de la instancia de VM a la que deseas conectarte. Reemplaza LOCAL_PORT por el puerto localhost en el que quieres que se vincule el proxy. Reemplaza ZONE por la zona en la que se encuentra la instancia de VM.

gcloud realiza una prueba de conectividad con la instancia de VM. Luego, abre un túnel y muestra un número de puerto.

Listening on port [LOCAL_PORT].

Todo el tráfico enviado a localhost:LOCAL_PORT se reenvía a la instancia de VM. Solo las aplicaciones que se ejecutan en tu computadora local pueden acceder al puerto.

Aumenta el ancho de banda de carga de TCP de IAP

Para aumentar el ancho de banda de carga de TCP de IAP, considera instalar NumPy en la misma máquina en la que está instalada gcloud CLI.

Linux

Para instalar NumPy con pip en plataformas Unix, ejecuta el siguiente comando en una nueva instancia de la terminal:

$(gcloud info --format="value(basic.python_location)") -m pip install numpy
Para obtener más información, consulta NumPy.org.

Si el mensaje de error persiste después de instalar NumPy, completa el siguiente paso: Ejecuta el siguiente comando para permitir que gcloud acceda a paquetes externos:

export CLOUDSDK_PYTHON_SITEPACKAGES=1

Windows

Para instalar NumPy con pip en plataformas de Windows, ejecuta el siguiente comando en una nueva instancia de PowerShell:

start (gcloud info --format="value(basic.python_location)") "-m pip install numpy"
Para obtener más información, consulta NumPy.org.

Si el mensaje persiste después de instalar NumPy, es necesario realizar otro paso. Ejecuta el siguiente comando para permitir que gcloud acceda a paquetes externos:

$env:CLOUDSDK_PYTHON_SITEPACKAGES="1"

Limitaciones conocidas

Ancho de banda: La función de redireccionamiento de TCP de IAP no está diseñada para la transferencia masiva de datos. IAP se reserva el derecho de limitar la cantidad de usuarios que abusen de este servicio.

Longitud de la conexión: IAP desconecta automáticamente las sesiones después de una hora de inactividad. Actualmente, gcloud compute start-iap-tunnel intenta restablecer el túnel si se desconecta.

Próximos pasos