Conéctate a instancias de VM de forma segura

Cuando desarrollas proyectos en Google Compute Engine, existe una variedad de situaciones en las que quieres 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 no tienen sus características completas o todavía no se configuraron con HTTPS.
  • Puede que la instancia proporcione servicios diseñados solo para otras instancias en el 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 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 con 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 Google Compute Engine con una IP externa, debes encriptar toda la comunicación entre tu host y la instancia implementada para garantizar la 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

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

Si configuraste dominios de entrega SSL con anterioridad, debería ser sencillo hacer lo mismo con Google 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 reenvíe todo el tráfico a un host remoto mediante 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 tu ID del proyecto de Google Cloud Platform.
  • us-central1-a es la zona en la que se ejecuta su 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 tu navegador, la conexión HTTP pasará por el túnel SSH que acabas de crear hacia tu host remoto, se conectará a la instancia especificada mediante SSH y, luego, se conectará al puerto 8888 en la misma máquina, pero a través de una conexión SSH segura y encriptada.

El comando de gcloud crea y mantiene una conexión SSH. Este método solo funciona mientras la sesión SSH está activa. Tan pronto como salgas de la sesión SSH que crea gcloud, la redirección de puertos a través de http://localhost:2222/ dejará de funcionar.

Si deseas crear más de una regla de redirección de puertos, puedes especificar distintas reglas en una sola línea de comandos. Para ello, repite las siguientes marcas:

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

También puedes ejecutar un nuevo comando de gcloud cada vez para crear un túnel separado. 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 conectarse 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. Este método permite usar el nombre corto de los hosts, en lugar de buscar la dirección IP de cada host, abrir puertos a cada servicio o crear un túnel SSH para cada par de 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 SOCKS.

Ten en cuenta que debido a que encapsulas todo el tráfico a través de ese host, no es conveniente navegar por la Web en general con ese navegador o perfil específico, ya que usarás el ancho de banda de tu servicio de nube para esto. En general, puede 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 us-central1-a \
    --ssh-flag="-D" \
    --ssh-flag="1080" \
    --ssh-flag="-N"

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 tu ID del proyecto de Google Cloud Platform.
  • us-central1-a es la zona en la que se ejecuta su instancia.
  • 1080 es el puerto local que escuchas.

Ten en cuenta que, en este caso, no necesitas especificar un puerto remoto. Debido a que un proxy de SOCKS no se enlaza con ningún puerto remoto específico, cualquier conexión que realices a través del proxy de SOCKS se resolverá según el host al que se conecte.

Con un proxy de SOCKS, te puedes conectar a cualquier instancia que comparta una red de Compute Engine con tu instancia de proxy mediante 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.

A continuación, configura tu navegador para usar el proxy.

Configuración de Chrome para el proxy de SOCKS

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 que ya existente. Para que puedas ejecutar varias copias de Chrome de manera simultánea, una que usa el proxy y otras que no, necesitas un nuevo perfil.

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"

Asegúrate de configurar el puerto localhost con el mismo valor que ya usaste en el comando de gcloud (1080 en nuestro ejemplo).

Configuración de Firefox para el proxy de SOCKS

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

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

  1. Abre Preferencias.
  2. Haz clic en Avanzado > Redes > Configuración para abrir el cuadro de diálogo Configuración de conexión.
  3. Selecciona la opción Configuración manual de proxy
    • En la sección Host de SOCKS, completa localhost como el host y el puerto que seleccionaste cuando ejecutaste el comando de gcloud.
    • Selecciona SOCKS v5.
    • Marca la casilla DNS remoto.
    • 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 en la red o a través de una puerta de enlace VPN administrada. Puedes aprovisionar instancias en tu 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 hacia una red que contiene instancias de red privada. Este host puede proporcionar un único punto de fortificación o auditoría y puede iniciarse y detenerse para habilitar o inhabilitar la comunicación SSH entrante desde Internet.

Arquitectura de bastión

Con un Host de bastión, puedes conectarte a una instancia que no tenga una dirección IP externa. Este enfoque permite conectarte a un entorno de desarrollo o administrar la instancia de base de datos para 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 tu instancia privada de destino. Debido a este acceso en dos pasos, razón por la que a veces los hosts de bastión se denominan “servidores de salto”, debes usar el reenvío ssh-agent en lugar de almacenar la clave privada de la máquina de destino en el host de bastión como una forma de llegar a la máquina de destino. Debes hacerlo incluso si usas el mismo par de claves para las instancias de bastión y destino, ya que el bastión solo tiene acceso directo a la mitad pública del par de claves.

Si quieres aprender a usar una instancia de Host de bastión para conectarte a otras instancias en tu red de Cloud Platform y aprender a usar el reenvío ssh-agent, consulta Cómo conectarte a instancias que no tienen direcciones IP externas

VPN

Cloud VPN permite conectar tu red existente a tu red de Google Cloud Platform a través de una conexión IPsec a un dispositivo de puerta de enlace VPN. Esto permite el enrutamiento directo del tráfico desde tus instalaciones a las interfaces 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.

Para aprender a conectarte a instancias en tu red de Cloud Platform a través de una VPN existente, en lugar de a través de direcciones IP externas de las instancias, consulta Cómo conectarse 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 Cloud Platform. 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. Ten en cuenta que una sola instancia no debe considerarse con alta disponibilidad y no puede admitir una alta capacidad de procesamiento de tráfico 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 es una opción, pero puede que requiera más configuración de la que merece la pena para tus necesidades. 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 contra 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 para los balanceadores de cargas de proxy HTTPS y SSL no tienen que tener direcciones IP externas.

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

Revisa nuestros instructivos y prueba otras funciones de Google Cloud Platform tú mismo.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Documentación de Compute Engine