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 puerto3389
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.
Abrir la página Reglas de firewall
Los pasos restantes aparecen en la consola de Google Cloud.
- Selecciona un proyecto de Google Cloud.
- En la página Reglas de firewall, haz clic en
Crear regla 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.
- Nombre:
- 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
- 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.
- 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.
- 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
- Haz clic en Agregar otro rol y configura la siguiente información:
- Selecciona un rol: selecciona Compute Engine > Administrador de instancias de procesamiento (v1).
- 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 proyectoEMAIL
: Dirección de correo electrónico del usuario al que deseas otorgar acceso, por ejemplouser@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
- 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.
- 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.
- Haz clic en Mostrar panel de información si el panel de información no está visible.
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.
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_levelsEn el ejemplo anterior,
FULL_ACCESS_LEVEL_NAME
es un nivel de acceso existente y usa el formatoaccessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
.- 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.
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
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 solicitudcurl
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 ''
Otorga el rol
iap.tunnelResourceAccessor
a tus principales modificando el archivo JSON de la política de IAM.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 roliap.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 de10.0.0.1
en el puerto22
con las condiciones de IAMdestination.ip
ydestination.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
Configura tu nuevo archivo
policy.json
con el métodosetIamPolicy
.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 |
|
|
Usa gcloud compute [start-iap-tunnel, ssh, scp] |
|
|
Usa gcloud compute [ssh, scp] |
|
|
VM con Acceso al SO | Consulta estas instrucciones. | |
No se usa el Acceso al SO |
|
|
SSH a VM con una cuenta de servicio |
|
|
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.
En la aplicación, selecciona Archivo > Agregar proyecto Google Cloud.
Ingresa el ID o el nombre del proyecto y haz clic en Aceptar.
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.
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:
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.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:
- Abre la app de PuTTY y selecciona la categoría Connection > Proxy.
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.
Selecciona la categoría Conexión > SSH > Auth.
Haz clic en Explorar, pega el siguiente nombre de archivo y, luego, haz clic en Abrir:
%USERPROFILE%\.ssh\google_compute_engine.ppk
Selecciona la categoría Sesión.
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.
Haz clic en Guardar.
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.
En la aplicación, selecciona Archivo > Agregar proyecto Google Cloud.
Ingresa el ID o el nombre del proyecto y haz clic en Aceptar.
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.
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.
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.
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.
Deja
gcloud
en ejecución y abre la app de Conexión de escritorio remoto de Microsoft Windows.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.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
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"
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
Para ver las solicitudes de acceso, habilita los Registros de auditoría de Cloud.
Configura los Controles del servicio de VPC para proteger tu proyecto con IAP para TCP.