Uso de IAP para redirección de TCP

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

En esta página, se explica cómo puedes usar la redirección de TCP de Identity-Aware Proxy (IAP) para habilitar el acceso de administrador a las 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 mediante el reenvío IAP de TCP, por ejemplo, el puerto 22 para SSH y el puerto 3389 para RDP.

Consola

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 aparecerán de forma automática en Google Cloud Console.

  2. En la página Reglas de firewall, haz clic en Crear regla de firewall.
  3. 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: Rangos de IP
    • Rangos de IP de origen35.235.240.0/20
    • Protocolos y puertos: Selecciona TCP y, luego, ingresa 22,3389 para permitir RDP y SSH.
  4. 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 funciones para la redirección de TCP de IAP

Para controlar qué usuarios y grupos pueden usar la redirección de TCP de IAP y las instancias de VM a las que pueden conectarse, otorga las funciones de Identity and Access Management (IAM) adecuadas en el proyecto.

Recomendamos otorgar las siguientes funciones a los administradores de confianza:

Además, si usas el Acceso al SO (recomendado), consulta Configura los roles de Acceso al SO en cuentas de usuario. Si usas cuentas de servicio, consulta estas instrucciones para configurar el rol serviceAccountUser.

Puedes otorgar a un usuario o grupo acceso a todas las instancias de VM de un proyecto si otorgas funciones de IAM a nivel de proyecto:

Consola

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

    Abrir la página IAM y administración
    Los pasos restantes aparecerán automáticamente en Google Cloud Console.

  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 en función del nivel de acceso:

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

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

Si lo deseas, puedes otorgar la función roles/iap.tunnelResourceAccessor en una VM específica (las otras funciones deben otorgarse en el proyecto):

Consola

  1. Abre la página del administrador de IAP y selecciona la pestaña Recursos SSH y TCP.

    Abrir la página de administrador de IAP
    Los pasos restantes aparecerán automáticamente 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 "Authentication: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

  3. Otorga la función iap.tunnelResourceAccessor a tus principales mediante la modificación del archivo JSON de la política de IAM.

  4. De forma opcional, otorga la función solo a las principales que cumplan con ciertos criterios, en función de las condiciones de IAM y los niveles de acceso.

    El siguiente es un ejemplo de un archivo policy.json editado que otorga la función iap.tunnelResourceAccessor a un grupo de administradores de instancias de VM y les da acceso a recursos de túnel protegidos con IAP. Se agregó una condición de IAM para hacer que los recursos sean accesibles solo para las principales en el grupo de administradores de instancias de VM con una dirección IP privada de 10.0.0.1 en el puerto 22 mediante 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 una principal tiene la función de Propietario, tiene permiso para usar IAP para la redirección 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 el archivo policy.json nuevo con el método setIamPolicy.

    curl -i -H "Content-Type:application/json" \
              -H "Authentication: 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
Todas
  • 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 que usa el 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 desea conectarse mediante 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

Para conectarte a instancias de Linux que no tienen una dirección IP externa, puedes crear un túnel de tráfico SSH a través de IAP.

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

Consola

Para conectarte a tu instancia, usa el botón SSH en Google Cloud Console. 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 del emulador de la terminal de Windows de PuTTY para que use la redirección de TCP de IAP a fin de conectarse a una instancia de VM. La configuración de acceso de tu instancia (definida mediante los 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 esté publicada 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 deseas generar Llaves 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 aplicación PuTTY para usar la redirección de TCP de IAP:

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

    • En Proxy type, 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. Haga clic en Explorar y pegue el siguiente nombre de archivo. Luego, haga 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 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 utilizar el IAP Desktop para conectarte al escritorio remoto de una o más instancias de VM mediante el reenvío IAP de TCP.

  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 TCP de IAP

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

Linux

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

$(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 instancia nueva 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, debes 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 conexión: IAP desconecta automáticamente las sesiones después de 1 hora de inactividad. Recomendamos administrar con lógica tus aplicaciones para controlar el restablecimiento de un túnel cuando se desconecta.

Próximos pasos