Conéctate a instancias de VM de forma segura

Cuando se desarrollan proyectos en Compute Engine, existe una variedad de situaciones en las que querrás evitar que se pueda acceder a las instancias desde la Internet pública:

  • Los servicios web, aún en desarrollo, no están listos para ser expuestos a usuarios externos porque sus características no están completas o todavía no se configuraron con HTTPS.
  • Es posible que la instancia proporcione servicios diseñados para que solo los consuman otras instancias del proyecto.
  • Solo se debe acceder a las instancias a través de opciones de interconexión dedicadas desde las oficinas de la empresa o los centros de datos.

Incluso cuando un servicio está orientado a Internet de forma intencional, es importante que la comunicación con el servicio esté restringida a los grupos de usuarios de destino y que se produzca a través de canales seguros, como SSH o HTTPS, para proteger la información sensible.

En este artículo, se muestran varios métodos para proteger las comunicaciones mediante instancias de Compute Engine con o sin direcciones IP externas.

Protege servicios en máquinas con direcciones IP externas

Conéctate a instancias sin direcciones IP externas

Protege servicios en máquinas con direcciones IP externas

Cuando las instancias tienen una dirección IP pública, es importante que solo se pueda acceder a los servicios y el tráfico que pretendes exponer, y que para aquellos que están expuestos, toda la información sensible esté protegida durante el tránsito.

Firewalls

La primera línea de defensa es restringir quién puede acceder a la instancia mediante firewalls. Mediante la creación de reglas de firewall, puedes restringir todo el tráfico a una red o puedes orientar máquinas en un conjunto dado de puertos a direcciones IP de origen específicas.

Los firewalls no son una solución independiente. La restricción del tráfico a direcciones IP de origen específicas no protege la información sensible como las credenciales de acceso, los comandos que crean o destruyen recursos y archivos o los registros. Cuando ejecutas un servicio web en una máquina de acceso público, como una instancia de Compute Engine con una IP externa, debes encriptar toda la comunicación entre el host y la instancia implementada para garantizar una seguridad adecuada.

Además, los firewalls no son siempre la mejor solución. Por ejemplo, los firewalls no son la opción ideal para los entornos de desarrollo que no tienen direcciones IP estáticas, como las laptops que cambian de lugar constantemente.

HTTPS y SSL

En los sistemas web de producción, debes configurar HTTPS/SSL. Puedes hacerlo mediante la configuración de una instancia para que finalice con HTTPS o del balanceo de cargas de HTTPS. HTTPS/SSL posee cierta complejidad inicial, lo que requiere que realices las siguientes tareas:

Si ya configuraste dominios de entrega SSL, debería ser sencillo hacer lo mismo con Compute Engine. De lo contrario, puede que te resulte más fácil usar un método de seguridad diferente, como la redirección de puertos o el proxy de SOCKS.

Redirección de puertos mediante SSH

Puedes usar la herramienta de línea de comandos de gcloud para iniciar un servidor en un puerto local determinado que redireccione todo el tráfico a un host remoto a través de una conexión SSH.

Primero, toma nota de la instancia y el puerto que proporcionan el servicio con el que deseas establecer una conexión segura. A continuación, ejecuta el siguiente comando:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888

En el comando anterior, los parámetros se definen de la siguiente manera:

  • example-instance es el nombre de la instancia a la que deseas conectarte.
  • my-project es el ID del proyecto de Google Cloud.
  • us-central1-a es la zona en la que se ejecuta la instancia.
  • 2222 es el puerto local que escuchas.
  • 8888 es el puerto remoto al que te conectas.

Con esta configuración de ejemplo, si abres http://localhost:2222/ en el navegador, la conexión HTTP usa el túnel SSH que creaste para conectarte desde tu host remoto a la instancia especificada mediante SSH. La conexión HTTP usará el túnel SSH para conectarse al puerto 8888 en la misma máquina, pero a través de una conexión SSH encriptada y segura.

El comando de gcloud crea y mantiene una conexión SSH; este enfoque solo funciona mientras la sesión SSH está activa. En cuanto salgas de la sesión SSH que crea gcloud, la redirección de puertos mediante http://localhost:2222/ deja de funcionar.

Para crear más de una regla de redirección de puertos, puedes especificar varias reglas en una sola línea de comandos mediante la repetición de las siguientes marcas:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888 -L 2299:localhost:8000

Como alternativa, puedes ejecutar un comando de gcloud nuevo cada vez para crear un túnel independiente. Ten en cuenta que no puedes agregar o quitar la redirección de puertos de una conexión existente sin salir y restablecer la conexión desde cero.

Proxy de SOCKS mediante SSH

Si deseas conectarte a una serie de hosts diferentes en tu implementación en la nube, la forma más sencilla de hacerlo es cambiar tu navegador para realizar las búsquedas directamente desde tu red. Mediante este método, puedes usar el nombre corto de los hosts en lugar de buscar la dirección IP de cada uno, abrir puertos en cada servicio o crear un túnel SSH para cada par host-puerto.

El enfoque que debes usar es el siguiente:

  1. Configura un único túnel SSH para uno de los hosts en la red y crea un proxy de SOCKS en ese host.
  2. Cambia la configuración del navegador para realizar todas las búsquedas a través de ese host del proxy de SOCKS.

Ten en cuenta que, como usas túneles para todo el tráfico mediante ese host, debes evitar usar ese navegador o ese perfil específico cuando navegues por la Web, ya que debes dedicar ese ancho de banda al servicio en la nube. En general, es posible que quieras usar un perfil de navegador independiente cuando sea necesario.

Inicia el proxy de SOCKS

Para iniciar tu proxy de SOCKS, ejecuta el siguiente comando:

gcloud compute ssh example-instance \
    --project my-project \
    --zone zone \
    --ssh-flag="-D" \
    --ssh-flag="NNNN" \
    --ssh-flag="-N"

Reemplaza los siguientes elementos:

  • example-instance es el nombre de la instancia a la que deseas conectarte.
  • my-project es el ID de tu proyecto de Google Cloud.
  • zone es la zona en la que se ejecuta la instancia, por ejemplo, us-central1-a.
  • NNNN es el puerto local que escuchas, por ejemplo, 1080.

Ten en cuenta que, en este caso, no necesitas especificar un puerto remoto. Debido a que un proxy de SOCKS no se vincula a ningún puerto remoto específico, cualquier conexión que hagas mediante el proxy de SOCKS se resolverá según el host al que te conectes.

Mediante un proxy de SOCKS, puedes conectarte a cualquier instancia que comparta una red de Compute Engine con tu instancia de proxy si usas el nombre corto de la instancia. Además, te puedes conectar a cualquier puerto en una instancia determinada.

Este enfoque es mucho más flexible que el método simple de redirección de puertos, pero también deberás cambiar la configuración en tu navegador web para usar el proxy.

Luego, configura Chrome o Firefox para usar el proxy.

Chrome

Chrome usa la configuración del proxy en todo el sistema de forma predeterminada, por lo que debes especificar un proxy diferente mediante las marcas de la línea de comandos. Cuando inicias Chrome de forma predeterminada, se crea una instancia de un perfil en ejecución, por lo que, para poder ejecutar varias copias de Chrome de forma simultánea, una que usa el proxy y otras que no, necesitas un perfil nuevo.

Inicia Chrome con un perfil nuevo. Si no existe, se creará de forma automática.

Linux:

/usr/bin/google-chrome \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

macOS:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

Windows:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ^
    --user-data-dir="%USERPROFILE%\chrome-proxy-profile" ^
    --proxy-server="socks5://localhost:1080"

Configura el puerto localhost con el mismo valor que usaste en el comando de gcloud antes (1080 en nuestro ejemplo).

Firefox

Antes de cambiar esta configuración, puedes crear un perfil de Firefox nuevo. De lo contrario, usar ese host como un proxy afectará a todas las instancias de Firefox, lo que no es muy conveniente.

Después de configurar Firefox para que se ejecute con un perfil independiente, puedes configurar el proxy de SOCKS:

  1. Abre Preferencias.
  2. Haz clic en Advanced > Networks > Settings para abrir el cuadro de diálogo Connection Settings.
  3. Selecciona la opción Manual proxy configuration.
    1. En la sección SOCKS Host, ingresa localhost como el host y el puerto que seleccionaste cuando ejecutaste el comando de gcloud con anterioridad.
    2. Selecciona SOCKS v5.
    3. Marca la casilla DNS remoto.
    4. Deja todas las demás entradas en blanco.
  4. Haz clic en Aceptar y cierra el cuadro de diálogo Preferencias.

Conéctate a instancias sin direcciones IP externas

Cuando las instancias no tienen direcciones IP externas, solo se puede acceder a ellas mediante otras instancias de la red, la función de redirección de TCP de Identity-Aware Proxy o una puerta de enlace de VPN administrada. Puedes aprovisionar instancias en la red de modo que actúen como retransmisores de confianza para conexiones entrantes (hosts de bastión) o salidas de red (puertas de enlace NAT). Para obtener una conectividad más transparente sin configurar esas conexiones, puedes usar un recurso de puerta de enlace VPN administrado.

Hosts de bastión

Los hosts de bastión proporcionan un punto de entrada externo a una red que contiene instancias de red privadas, como se ilustra en el siguiente diagrama.

Arquitectura de hosts de bastión que actúan como el punto de entrada externo de una red de instancias privadas.

Este host puede proporcionar un único punto de fortificación o auditoría y puede iniciarse y detenerse para habilitar o inhabilitar la conexión SSH entrante. Mediante un host de bastión, puedes conectarte a una instancia que no tenga una dirección IP externa. Con este enfoque, puedes conectarte a un entorno de desarrollo o administrar la instancia de base de datos de tu aplicación externa, por ejemplo, sin configurar reglas de firewall adicionales.

Aunque el endurecimiento completo de un host de bastión está por fuera del alcance de este artículo, te presentamos algunos pasos iniciales que se pueden tomar:

  • Limitar el rango CIDR de las IP de origen que se pueden comunicar con el bastión.
  • Configurar las reglas de firewall para permitir el tráfico SSH a instancias privadas solo desde el Host de bastión.

De forma predeterminada, el SSH en instancias está configurado de modo que use claves privadas para la autenticación. Cuando usas un host de bastión, primero debes iniciar sesión en él y, luego, en la instancia privada de destino. Debido a este acceso en dos pasos, que es la razón por la que los hosts de bastión se denominan “servidores de salto”, debes usar la redirección de ssh en lugar de almacenar la clave privada de la máquina de destino en el host de bastión como forma de llegar a la máquina de destino. Debes hacer esto incluso si usas el mismo par de claves para las instancias de bastión y de destino porque el bastión tiene acceso directo solo a la mitad pública del par de claves.

Si deseas obtener información sobre cómo usar una instancia de host de bastión para conectarte a otras instancias en tu red de Google Cloud, consulta Conéctate a través de un host de bastión.

Si deseas obtener información sobre cómo usar la redirección de ssh y otros métodos para conectarte a instancias que no tienen una dirección IP externa, consulta Conéctate a instancias que no tienen direcciones IP externas.

IAP para la redirección de TCP

Mediante el uso de SSH con la función de redireccionamiento de TCP de IAP, se establece una conexión SSH dentro de HTTPS. La función de redireccionamiento de TCP de IAP la envía a la instancia remota.

A fin de obtener información sobre cómo conectarse a una instancia remota con IAP, consulta Usa IAP para la redirección de TCP.

VPN

Cloud VPN te permite conectar la red existente a la red de Google Cloud mediante una conexión IPsec a un dispositivo de puerta de enlace de VPN. Esto permite el enrutamiento directo del tráfico desde tus instalaciones a las interfaces de IP privadas de las instancias de Compute Engine. El tráfico se encripta a medida que pasa por los vínculos públicos hasta Google.

Para obtener detalles sobre la configuración y el uso de VPN con Compute Engine, consulta la documentación de Cloud VPN.

Si quieres aprender a conectarte a instancias en la red de Google Cloud mediante una VPN existente en lugar de mediante direcciones IP externas de instancias, lee Conéctate a instancias que no tienen direcciones IP externas.

Salida de tráfico mediante puertas de enlace NAT

Cuando una instancia no tiene una dirección IP externa asignada, no puede hacer conexiones directas a servicios externos, incluidos otros servicios de Google Cloud. Para permitir que estas instancias alcancen los servicios en la Internet pública, puedes configurar una máquina de puerta de enlace NAT que puede enrutar el tráfico en nombre de cualquier instancia en la red. Una única instancia no debe considerarse con alta disponibilidad y no puede admitir una capacidad de procesamiento de tráfico elevada para varias instancias.

Acceso interactivo a la consola en serie

Cuando una instancia no tiene una dirección IP externa, puede que aún debas interactuar con la instancia para solucionar problemas o con fines de mantenimiento. La configuración de un host de bastión, como se explicó con anterioridad, es una opción, pero es posible que requiera más configuración de la que merece la pena en tu caso. Si deseas solucionar los problemas de una instancia sin una dirección IP externa, considera habilitar el acceso interactivo en la consola en serie, lo que te permite interactuar con la consola en serie de una instancia mediante SSH y ejecutar comandos en la consola en serie.

Para obtener más información, consulta Interactúa con la consola en serie.

Balanceadores de cargas de proxy HTTPS y SSL

Las instancias que son backends de balanceadores de cargas de proxy SSL y HTTPS no necesitan tener direcciones IP externas a las que se pueda acceder a través del balanceador de cargas. Para acceder a estos recursos directamente, se requiere el uso de los métodos mencionados en la sección Conéctate a instancias sin direcciones IP externas.

Si quieres obtener más información, consulta la documentación sobre balanceo de cargas para esos balanceadores de cargas.

Prueba otras características de Google Cloud. Consulta nuestros instructivos.