Usar IAP para reenviar 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 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 de TCP de IAP te permite establecer un túnel cifrado a través del cual puedes reenviar tráfico SSH, RDP y de otro tipo a instancias de VM. El reenvío de TCP de IAP también te ofrece un control detallado sobre qué usuarios pueden establecer túneles y a qué instancias de máquina virtual pueden 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.

Preparar un proyecto para el reenvío de TCP de IAP

En esta sección se describen los pasos necesarios para habilitar el reenvío de TCP de IAP en tu proyecto de Google Cloud .

Crear una regla de cortafuegos

Para permitir que IAP se conecte a tus instancias de VM, crea una regla de cortafuegos que cumpla los siguientes requisitos:

  • Se aplica a todas las instancias de VM a las que quieras acceder mediante IAP.
  • Permite el tráfico de entrada del intervalo de IP 35.235.240.0/20. Este intervalo contiene todas las direcciones IP que usa IAP para el reenvío de TCP.

    En el caso de las VMs IPv6, usa el siguiente intervalo de IPs: 2600:2d00:1:7::/64.

  • Permite establecer conexiones con todos los puertos a los que quieras acceder mediante el reenvío de TCP de IAP. Por ejemplo, el puerto 22 para SSH y el puerto 3389 para RDP.

Consola

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

  1. Abre la página Reglas de cortafuegos.

    Abrir la página Reglas de cortafuegos

    Los pasos restantes aparecen en la Google Cloud consola.

  2. Selecciona un Google Cloud proyecto.
  3. En la página Reglas de cortafuegos, haz clic en Crear regla de cortafuegos.
  4. Configure los siguientes ajustes:
    • Nombre: allow-ingress-from-iap
    • Sentido del tráfico: Entrada
    • Destino: Todas las instancias de la red
    • Filtro de origen: intervalos de IP
    • Intervalos de IPs de origen: 35.235.240.0/20
    • Protocolos y puertos: selecciona TCP e introduce 3389,22 para permitir tanto RDP como SSH.
  5. Haz clic en Crear.

gcloud

Para permitir el acceso RDP a todas las instancias de VM de tu red, ejecuta 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 acceder por SSH, ejecuta el siguiente 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 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

donde PORT es el puerto que usa el protocolo.

Asignar roles para 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 pueden conectarse, concede los roles de gestión de identidades y accesos (IAM) adecuados en el proyecto.

Si usas OS Login (opción recomendada), consulta Configurar roles de OS Login en cuentas de usuario.

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

Tarea Roles Más información
Reenvío del protocolo de control de la transmisión (TCP) Usuario de túneles protegidos mediante IAP (roles/iap.tunnelResourceAccessor) Consulta Conceder acceso a todas las instancias de VM de un proyecto o Conceder acceso a una VM específica.
Acceso SSH Administrador de instancias de Compute (v. 1) (roles/compute.instanceAdmin.v1)
Usar una cuenta de servicio Usuario de cuenta de servicio (roles/iam.serviceAccountUser) Consulta el artículo sobre el rol serviceAccountUser.

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

Puedes conceder acceso a un usuario o a un grupo a todas las instancias de VM de un proyecto o a una VM específica, en función de cómo concedas los roles necesarios.

No se admiten etiquetas

Actualmente, no se pueden conceder permisos mediante etiquetas para el reenvío de TCP de IAP.

Conceder acceso a todas las instancias de VM de un proyecto

Para dar acceso a un usuario o grupo a todas las instancias de VM de un proyecto, debes asignar los roles de gestión de identidades y accesos necesarios a nivel de proyecto:

Consola

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

    Abre la página IAM y administración

    Los pasos restantes aparecen en la Google Cloud consola.

  2. En la página IAM y administración, haga clic en Añadir y configure lo siguiente:
    • Nuevas entidades principales: especifica el usuario o el grupo al que quieras conceder acceso.
    • Selecciona un rol: Cloud IAP > Usuario de túneles protegidos mediante IAP.
  3. También puedes hacer clic en Añadir condición y configurar una condición:
    • Título: introduce un nombre para la condición.
    • Expresión: introduce una condición que debe cumplir un usuario para obtener los permisos del rol Usuario de túneles protegidos mediante IAP.

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

    destination.port == 22
  4. Haz clic en Añadir otro rol y configura lo siguiente:
    • Selecciona un rol: elige Compute Engine > Administrador de instancias de Compute (v1).
  5. Haz clic en Guardar.

gcloud

Asigna los dos roles al usuario ejecutando 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

Haz los cambios siguientes:

  • PROJECT_ID: ID del proyecto
  • EMAIL: dirección de correo del usuario al que quieres conceder acceso, por ejemplo, user@example.com.

Conceder acceso a una VM específica

Para conceder acceso a un usuario o grupo a una VM específica, debes concederle el rol roles/iap.tunnelResourceAccessor en esa VM. Los demás roles deben concederse en el proyecto.

Consola

  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 Google Cloud consola.

  2. En la pestaña Recursos SSH y TCP de la página de administrador de IAP, selecciona las instancias de VM que quieras configurar.
  3. Haz clic en Mostrar panel de información si no lo ves.
  4. Haz clic en Añadir principal y configura lo siguiente:

    • Nuevas entidades principales: especifica el usuario o el grupo al que quieras conceder acceso.
    • Selecciona un rol: Cloud IAP > Usuario de túneles protegidos mediante IAP.
  5. También puedes hacer clic en Añadir condición y configurar una condición:

    • Título: introduce un nombre para la condición.
    • Expresión: introduce una condición que debe cumplir un usuario para obtener los permisos del rol Usuario de túneles protegidos mediante IAP.

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

          destination.port == 22

    También puedes conceder 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 que ya existe y tiene el siguiente 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 se indica a continuación. Consulta Gestionar el acceso a recursos protegidos por IAP para obtener más información sobre cómo usar la API IAM para gestionar 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 gestión de identidades y accesos de 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 "Authorization: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

  3. Asigna el rol iap.tunnelResourceAccessor a tus principales modificando el archivo JSON de la política de IAM.

  4. Opcionalmente, puedes conceder el rol solo a los principales que cumplan criterios específicos, en función de las condiciones de gestión de identidades y accesos (IAM) y los niveles de acceso.

    A continuación, se muestra un ejemplo de un archivo policy.json editado que asigna el rol iap.tunnelResourceAccessor a un grupo de administradores de instancias de VM, lo que les da acceso a recursos de túnel protegidos por IAP. Se ha añadido una condición de gestión de identidades y accesos (IAM) para que los recursos solo sean accesibles para las cuentas principales del grupo de administradores de instancias de VM con una dirección IP privada 10.0.0.1 en el puerto 22 mediante las condiciones de IAM destination.ip y destination.port. También deben cumplir los requisitos del ACCESS_LEVEL_NAME nivel de acceso.

    Ten en cuenta que, si una entidad tiene el rol 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 el nombre de una política , llama a accessPolicies.list:

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  5. Define 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 en función de cómo vaya a usar un usuario el reenvío de TCP de IAP:

Situaciones Los permisos que requiere
Todo
  • iap.tunnelInstances.accessViaIAP
Estás usando gcloud compute [start-iap-tunnel, ssh, scp]
  • compute.instances.get
  • compute.instances.list
Estás usando gcloud compute [ssh, scp]
  • compute.projects.get
Máquina virtual que usa OS Login Consulta estas instrucciones.
No usar OS Login
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
Acceder a una máquina virtual mediante SSH con una cuenta de servicio
  • iam.serviceAccounts.actAs
SSH desde el navegador Consulta estas instrucciones.

Por ejemplo, si un usuario quiere conectarse mediante gcloud compute ssh a una VM que no usa OS Login, 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

Creación de túneles para conexiones SSH

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

Cuando usas la creación de túneles de 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 de la consolaGoogle Cloud . La configuración de acceso de tu instancia (definida mediante permisos de gestión de identidades y accesos) debe permitir el túnel 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 mediante permisos de gestión de identidades y accesos) debe permitir el túnel TCP a través de IAP.

gcloud compute ssh INSTANCE_NAME

Sustituye INSTANCE_NAME por el nombre de la instancia a la que quieras acceder mediante SSH.

Si la instancia no tiene una dirección IP externa, la conexión usará automáticamente el túnel TCP de IAP. Si la instancia tiene una dirección IP externa, la conexión usa la dirección IP externa en lugar del túnel TCP de IAP.

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

Usa la marca --internal-ip para que gcloud compute ssh nunca use el túnel 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 SSH y el reenvío de TCP de IAP.

  1. En la aplicación, selecciona Archivo > Añadir proyecto de Google Cloud.