Uso de IAP para redirección de TCP

En esta página, se explica cómo puedes utilizar el reenvío IAP TCP para habilitar el acceso administrativo a instancias de VM que no tienen direcciones IP públicas 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.

Console

Para permitir el acceso de RDP y SSH a todas las instancias de VM en tu 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:

    • 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 origen: 35.235.240.0/20
    • Protocolos y puertos: Selecciona TCP y, luego, ingresa 22,3389 para permitir RDP y SSH.
  • Haga 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 permisos para usar 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, configura los permisos de administración de identidades y accesos (IAM).

Puedes otorgar a un usuario o a un grupo acceso 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 y administrador

  2. Haz clic en Agregar y configura lo siguiente:

    • Nuevos miembros: especifica el usuario o grupo al que deseas otorgar acceso.
    • Selecciona un rol Selecciona Cloud IAP > Usuario de túnel protegido por IAP.
  3. Haga clic en Save.

gcloud

Otorga el rol iap.tunnelResourceAccessor al usuario:

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

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.

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. Descarga el archivo de credenciales de tu 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 tu cuenta de servicio.

    3. Haz clic en Editar.

    4. Haz clic en Crear clave.

    5. Selecciona JSON como tu tipo de clave.

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

    Se descargará 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 de credenciales JSON de tu cuenta de servicio en un token de acceso OAuth mediante Oauth2l ejecutando el siguiente comando:

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

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

    1. Obtén el código de verificación. Para ello, haz clic en el vínculo mostrado y copia el código.
    2. Pega el código de verificación en la solicitud de tu aplicación.
    3. Copia el token del portador que se muestra.
    4. Exporta la nueva variable que se asigne al valor del token de portador que se muestra.
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  5. Si ya ejecutaste este comando anteriormente, 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 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 "${CLOUD_OAUTH_TOKEN}" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

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

  8. Otra opción es agregar restricciones de miembros basadas en las condiciones de IAM y los niveles de acceso.

    El siguiente es 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 para que solo los miembros 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 miembro tiene la función Propietario, tiene permiso para usar IAP para el redireccionamiento 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
    
  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}
    

Como alternativa, también puedes configurar los permisos de IAM de forma individual por VM:

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

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

    • Nuevos miembros: especifica el usuario o grupo al que deseas otorgar acceso.
    • Selecciona un rol Selecciona Cloud IAP > Usuario de túnel protegido por IAP.
  5. Opcionalmente, haz clic en Agregar condición y configura una restricción de miembro:

    • Título: ingresa un nombre para la restricción.
    • Expresión: ingresa una condición que debe cumplir un usuario para poder usar el reenvío de TCP de IAM.

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

    destination.port == 22
    

    También puedes restringir el acceso por 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. Haga clic en Save.

Uso de túneles de conexiones SSH

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

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 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 pública, la conexión utilizará túneles TCP de IAP de forma automática. Si la instancia tiene una dirección IP pública, la conexión usará la dirección IP pública en lugar de los túneles 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.

Túnel de conexiones de RDP

Puedes conectarte a instancias de Windows que no tienen una dirección IP pública 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 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 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 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.

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