Usa IAP para la redirección de TCP

En esta página, se explica cómo puedes usar el reenvío de TCP de Identity-Aware Proxy (IAP) para habilitar el acceso de administrador 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 de TCP de IAP te permite establecer un túnel encriptado a través del cual puedas reenviar tráfico SSH, RDP y otros tipos de tráfico a instancias de VM. El reenvío de TCP de IAP también te brinda un control detallado sobre los usuarios que pueden establecer túneles y a qué instancias de VM se les permite conectarse.

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

Prepara el proyecto para la redirección de IAP de TCP

En esta sección, se explican los pasos necesarios para habilitar el reenvío de TCP de IAP en el proyecto de 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 estas características:

  • se aplica a todas las instancias de VM a las que deseas que se pueda acceder mediante IAP.
  • Permite el tráfico de entrada del 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 que deseas que sean accesibles mediante el reenvío de TCP de IAP. Por ejemplo, el puerto 22 para SSH y el puerto 3389 para RDP.

Console

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

  • Abre la página Reglas de firewall y haz clic en Crear regla de firewall.

    Abrir la página Reglas de firewall

  • Establece la siguiente configuración:

    • Name (Nombre): allow-ingress-from-iap
    • Dirección del tráfico: Ingress
    • Destino: todas las instancias de la red
    • Filtro de fuente: Rangos de IP
    • Rangos de IP de origen: 35.235.240.0/20
    • Protocolos y puertos: Selecciona TCP y, luego, ingresa 22,3389 para permitir RDP y SSH.
  • Haz clic en Crear

gcloud

Para permitir el acceso de RDP a todas las instancias de VM en su red, ejecute el siguiente 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 el acceso mediante 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

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 ejemplo anterior, PORT es el puerto que usa el protocolo.

Otorga permisos para usar el reenvío de TCP de IAP

Para controlar qué usuarios y grupos pueden usar el reenvío de TCP de IAP y a qué instancias de VM se pueden conectar, configura los permisos de la administración de identidades y accesos (IAM).

Recomendamos otorgar todas las siguientes funciones a los administradores de confianza:

Además, si usas el Acceso al SO (recomendado), consulta Configura las funciones del Acceso al SO en cuentas de usuario. Si usas cuentas de servicio, consulta estas instrucciones sobre cómo configurar la función serviceAccountUser.

Puedes otorgar acceso a un usuario o grupo a todas las instancias de VM de un proyecto si configuras los permisos de IAM a nivel de proyecto:

Console

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

    Abrir la página de IAM

  2. Haz clic en Agregar y configura lo siguiente:

    • Miembros nuevos: Especifica el usuario o grupo al que deseas otorgar acceso.
    • Selecciona una función Selecciona Cloud IAP > IAP-Secured Tunnel User.
  3. De manera opcional, haz clic en Agregar condición y configura una restricción de miembros:

    • Título: Ingresa un nombre para la restricción.
    • Expresión: Ingresa una condición que un usuario deba cumplir antes de poder usar IAP para la redirección de TCP.

    Por ejemplo, la siguiente expresión CEL restringe el acceso al puerto 22:

    destination.port == 22
    

    También puedes restringir el 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.

  4. Haz clic en Agregar otra función y configura lo siguiente:

    • Selecciona una función Selecciona Compute Engine > Compute Instance Admin (v1).
  5. Haz clic en Guardar.

gcloud

Otorga las dos funciones 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: Es el ID del proyecto.
  • EMAIL: La dirección de correo electrónico del usuario al que deseas otorgar acceso, por ejemplo, user@example.com.

Si lo deseas, puedes configurar la función iap.tunnelResourceAccessor mediante VM (las otras funciones deben estar en el proyecto):

Console

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

    Abrir la página de administrador de IAP

  2. Selecciona las instancias de VM que deseas configurar.
  3. Haz clic en Mostrar panel de información si no está visible el panel.
  4. Haz clic en Agregar miembro y configura lo siguiente:

    • Miembros nuevos: Especifica el usuario o grupo al que deseas otorgar acceso.
    • Selecciona una función Selecciona Cloud IAP > IAP-Secured Tunnel User.
  5. De manera opcional, haz clic en Agregar condición y configura una restricción de miembros:

    • Título: Ingresa un nombre para la restricción.
    • Expresión: Ingresa una condición que un usuario deba cumplir antes de poder usar IAP para la redirección de TCP.

    Por ejemplo, la siguiente expresión CEL restringe el acceso al puerto 22:

    destination.port == 22
    

    También puedes restringir el 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 la aplicación, sigue el proceso que se indica a continuación. Consulta Administra el acceso a los recursos protegidos por IAP para obtener más información sobre cómo usar la API de IAM a fin de administrar las políticas de acceso.

  1. Descargue el archivo de credenciales de su cuenta de servicio.

    1. Ve a la página Cuentas de servicio.
      Ir a la página Cuentas de servicio

    2. Haz clic en la dirección de correo electrónico de la cuenta de servicio.

    3. Haz clic en Editar

    4. Haz clic en Crear clave.

    5. Seleccione JSON como tipo de clave.

    6. Para crear una clave nueva, haz clic en Crear y cierra la ventana de confirmación que aparece.

    Se descargó tu archivo de credenciales JSON.

  2. Exporta las siguientes variables:

    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. Convierte el archivo JSON de las credenciales de tu cuenta de servicio en un token de acceso OAuth mediante Oauth2l mediante la ejecución del siguiente comando:

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

  4. Si es la primera vez que ejecutas el comando anterior, cuando se te solicite, haz lo siguiente:

    1. Para obtener el código de verificación, haz clic en el vínculo que se muestra y copia el código.
    2. Pega el código de verificación en el mensaje de la app.
    3. Copia el token del portador que se muestra.
    4. Exporta una variable nueva que se asignó al valor del token del portador que se mostró.
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  5. Si ya ejecutaste este comando antes, exporta la siguiente variable.

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

  6. Obtén la política de IAM para la instancia de Compute Engine mediante 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 "${CLOUD_OAUTH_TOKEN}" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

  7. Para otorgar la función iap.tunnelResourceAccessor a los miembros, modifica el archivo JSON de la política de IAM.

  8. De manera opcional, agrega restricciones de miembros según las condiciones de IAM y los niveles de acceso.

    A continuación, se muestra un ejemplo de un archivo policy.json editado que vincula la función iap.tunnelResourceAccessor a un grupo de administradores de instancias de VM y les otorga acceso a recursos de túnel protegidos con IAP. Se agregó una condición de IAM a fin de que solo los miembros del grupo de administradores de instancias de VM con una dirección IP privada de 10.0.0.1 en el puerto 22 puedan acceder a los recursos mediante las condiciones de IAM destination.ip y destination.port. También deben cumplir con los requisitos del nivel de acceso ACCESS_LEVEL_NAME.

    Ten en cuenta que si un miembro tiene la función de Propietario, tiene permiso de usar IAP para la redirección de TCP.


    Ejemplo de archivo 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 el nombre de una política, llama a accessPolicies.list:

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

Detalles de permisos

Los permisos necesarios varían en función de cómo un usuario utilice el reenvío de TCP de IAP:

Situaciones Se requieren permisos
Todos
  • iap.tunnelInstances.accessViaIAP
En uso: gcloud compute [start-iap-tunnel, ssh, scp]
  • compute.instances.get
  • compute.instances.list
En uso: gcloud compute [ssh, scp]
  • compute.projects.get
VM con Acceso al SO Consulte estas instrucciones.
No usar el Acceso al SO
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
De SSH a VM con una cuenta de servicio
  • iam.serviceAccounts.actAs
SSH desde el navegador Consulte 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, el usuario 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 para las conexiones SSH

Puedes conectarte a instancias de Linux que no tengan una dirección IP externa mediante el túnel de tráfico de SSH a través de IAP.

Cuando usas el túnel 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 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 los 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 en la que deseas establecer una conexión SSH.

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

Puedes usar la marca --tunnel-through-iap para que gcloud compute ssh siempre use túneles TCP de IAP.

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

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

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

  3. En la ventana Project Explorer, 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.

PuTTY

Puedes configurar PuTTY para que use el reenvío 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 los permisos de IAM) debe permitir el uso de túneles TCP a través de IAP.

Antes de configurar 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 deseas conectarte.
    • PROJECT_ID: Es el ID del proyecto en el que se encuentra la instancia de VM.
    • ZONE: Es la zona en la que se encuentra la instancia de VM.

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

  2. En la VM, determina tu nombre de usuario mediante la ejecución del siguiente comando:

    whoami
    

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

Ahora puedes configurar PuTTY para que use la redirección de IAP de TCP:

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

    • En Tipo de proxy, seleccione 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: Es 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 Diagnóstico del proxy de impresión en la ventana del terminal, selecciona Solo hasta que comience la sesión.

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

  4. Haga clic en Explorar y pegue el siguiente nombre de archivo y, 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 definiste antes
      • INSTANCE_NAME: 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.

Túnel de conexiones de RDP

Puedes conectarte a instancias de Windows que no tienen una dirección IP externa mediante el túnel de 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 de Google Cloud.

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

  3. En la ventana Project Explorer, 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 debes crear un túnel.

  1. Usa el comando gcloud compute start-iap-tunnel para crear un túnel encriptado en el 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 que se vincule el proxy o usa 0 para que se seleccione de forma automática uno que no se use. 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 y, 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 a Escritorio remoto de Microsoft Windows.

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

    localhost:LOCAL_PORT
    

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

  5. Haz clic en Conectar (Connect).

Uso de túneles para otras conexiones TCP

Puedes usar la redirección 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 conecta el tráfico de datos de la máquina local a 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 también se unen antes de que se envíen al puerto local, donde se separan.

gcloud

Crea un túnel encriptado en 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 deseas vincular 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 y, 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. Para obtener instrucciones sobre cómo instalar NumPy, consulta NumPy.org.

gcloud

Ejecuta el siguiente comando para permitir que gcloud acceda a paquetes externos:

export 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 abusan de este servicio.

Duración de la conexión: IAP desconecta las sesiones automáticamente después de 1 hora de inactividad. Te recomendamos tener lógica en tus aplicaciones para controlar el restablecimiento de un túnel cuando se desconecta.

Próximos pasos