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 puerto3389
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.
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.
- Name (Nombre):
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:
roles/iap.tunnelResourceAccessor
(proyecto o VM)roles/compute.instanceAdmin.v1
(proyecto)
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
Abre la página IAM y administración en Cloud Console.
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.
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 formatoaccessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
.Haz clic en Agregar otra función y configura lo siguiente:
- Selecciona una función Selecciona Compute Engine > Compute Instance Admin (v1).
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
- Abre la página de administrador de IAP y selecciona la pestaña Recursos de SSH y TCP.
- Selecciona las instancias de VM que deseas configurar.
- Haz clic en Mostrar panel de información si no está visible el panel.
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.
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 formatoaccessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
.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.
Descargue el archivo de credenciales de su cuenta de servicio.
Ve a la página Cuentas de servicio.
Ir a la página Cuentas de servicioHaz clic en la dirección de correo electrónico de la cuenta de servicio.
Haz clic en Editar
Haz clic en Crear clave.
Seleccione JSON como tipo de clave.
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.
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
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
Si es la primera vez que ejecutas el comando anterior, cuando se te solicite, haz lo siguiente:
- Para obtener el código de verificación, haz clic en el vínculo que se muestra y copia el código.
- Pega el código de verificación en el mensaje de la app.
- Copia el token del portador que se muestra.
- Exporta una variable nueva que se asignó al valor del token del portador que se mostró.
export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
Si ya ejecutaste este comando antes, exporta la siguiente variable.
export CLOUD_OAUTH_TOKEN="$(oauth2l header --json ${JSON_CREDS} cloud-platform)"
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 solicitudcurl
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 ''
Para otorgar la función
iap.tunnelResourceAccessor
a los miembros, modifica el archivo JSON de la política de IAM.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óniap.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 de10.0.0.1
en el puerto22
puedan acceder a los recursos mediante las condiciones de IAMdestination.ip
ydestination.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
Configura tu nuevo archivo
policy.json
con el métodosetIamPolicy
.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 |
|
|
En uso: gcloud compute [start-iap-tunnel, ssh, scp] |
|
|
En uso: gcloud compute [ssh, scp] |
|
|
VM con Acceso al SO | Consulte estas instrucciones. | |
No usar el Acceso al SO |
|
|
De SSH a VM con una cuenta de servicio |
|
|
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.
En la aplicación, selecciona Archivo > Agregar proyecto de Google Cloud.
Ingresa el ID o el nombre del proyecto y haz clic en Aceptar.
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.
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:
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.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:
- Abre PuTTY y selecciona la categoría Conexión > Proxy.
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.
Selecciona la categoría Conexión > SSH > Autenticación.
Haga clic en Explorar y pegue el siguiente nombre de archivo y, luego, haga 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 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.
Haz clic en Guardar.
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.
En la aplicación, selecciona Archivo > Agregar proyecto de Google Cloud.
Ingresa el ID o el nombre del proyecto y haz clic en Aceptar.
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.
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.
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.
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.
Deja
gcloud
en ejecución y abre la app de Conexión a Escritorio remoto de Microsoft Windows.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.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
Para ver las solicitudes de acceso, habilita los registros de auditoría de Cloud.
Configura los Controles del servicio de VPC a fin de proteger tu proyecto junto con IAP para TCP.