Cloud SQL solo con IP privada: el Bueno, malo y feo

Los datos de son la nueva mina de oro de todas las empresas, y este debe mantenerse seguro y protegido . Por eso, durante muchos años, una buena práctica común de cualquier administrador de base de datos es eliminar todo acceso público a la base de datos , especialmente la IP pública y otorgar solo acceso desde la IP privada.
Esta regla «de oro» es aplicada por todos equipos de seguridad y requieren el mismo patrón para cualquier implementación en la nube.

El servicio Cloud SQL , el servicio de base de datos administrada en Google Cloud, le permite:

Gracias a estas características, puede hacer cumplir los requisitos del equipo de seguridad .

Pero, ¿es un problema cuando trabajamos da ¿No tener una IP pública en las instancias de Cloud SQL hoy?

Revisemos esto en 3 casos de uso:

  1. Compute Engine conectividad
  2. Servicios sin servidor conectividad
  3. Entorno local conectividad

Binario de proxy de Cloud SQL

Antes de profundizar en los casos de uso, me gustaría enfocarme rápidamente en la función principal de Proxy de Cloud SQL

  • Este binario abre un túnel cifrado seguro y de extremo a extremo . En resumen, incluso si su base de datos no tiene certificado SSL, los datos se cifran en tránsito.
  • Antes de abrir el túnel, el binario verifica el API de servicio de IAM si la credencial actual está autorizada para acceder a la instancia de Cloud SQL . Esta es una capa adicional de seguridad, además de la autenticación de base de datos estándar por usuario / contraseña.
  • El túnel puede abrirse en un puerto local (modo de conexión TCP) o en un socket Unix (no es posible en Entorno Windows)

Lo bueno: conectividad de Compute Engine

Porque este «patrón de seguridad de IP privada» se ha creado para la arquitectura heredada (es decir, VM local y red privada), la restricción encaja perfectamente en el mundo IaaS (es decir, Compute Engine + VPC).
Menciono Compute Engine, pero también es cierto con todos los servicios que usan instancias de Compute Engine: Dataflow, Dataproc, GKE,…

  • Implemente su VM en el misma VPC que la IP privada de las instancias de Cloud SQL.
  • Use la IP privada de la instancia de Cloud SQL para acceder a ella desde su aplicación que está implementada en Compute Engine.
  • Abra las reglas de firewall requeridas si necesario.

Eso es “bueno” !!

Nota: en este caso, se puede discutir el uso del proxy de Cloud SQL. Agrega una capa de seguridad adicional al verificar la autorización con los servicios de IAM y la comunicación encriptada, pero también agrega latencia adicional y un punto potencial de falla. Es cuestión de compensaciones.

Lo malo: conectividad de servicios sin servidor

Cuando usamos el “nuevo mundo” de la nube, el paradigma sin servidor , las cosas no son tan agradables con Cloud Run , Cloud Functions y App Engine .

De hecho, cuando implementas en plataformas sin servidor , por definición, usted no tiene que administrar los servidores y, por lo tanto, el los servidores no están en su VPC . Y, por lo tanto, no es posible, de inmediato, alcanzar la IP privada de Cloud SQL conectada a la VPC de su proyecto.

Si profundiza en Cloud Run , Cloud Functions y App Engine , puedes encontrar cómo conectar tu instancia de Cloud SQL a tu servicio sin servidor gracias a una función incorporada:

Agregue el nombre de la conexión de la instancia de Cloud SQL a su configuración y automáticamente se crea un túnel con el inicio de la instancia.

En realidad, es una conexión abierta por proxy de Cloud SQL binario en modo de socket Unix . Pero esta solución solo funciona si la instancia de Cloud SQL tiene una IP pública .
En el caso de IP privada solo , e incluso si es una El modo de conexión IP privada existe con el proxy de Cloud SQL , ¡ no funciona!

Conecte los servicios sin servidor a la IP privada de Cloud SQL

Con suerte, existe una solución. Puedes hacer clic en private IP en los instructivos de conexión de Cloud SQL para esto ( ejemplo para Cloud Functions ).

En resumen, debe:

  • Crear un conector de VPC sin servidor , en la misma región que tu servicio sin servidor. Y, por supuesto, conectado a la misma VPC que su instancia de Cloud SQL.
    Tenga en cuenta que hoy en día, todas las regiones son compatibles con el conector de VPC sin servidor, pero no fue así durante un tiempo.
  • Implemente su servicio sin servidor con este conector de VPC , compatible con Cloud Run , Cloud Functions y App Engine
  • En su aplicación, use la IP privada de Cloud SQL (en lugar de la conexión de socket Unix)

Esta solución funciona pero presenta un nuevo elemento de red , un costo adicional y un posible nuevo punto de falla en la cadena de conectividad.

Eso es “malo” !!

Lo feo: conectividad del entorno local

Cuando desea consultar su base de datos , en algún momento en producción, a través de su IDE de base de datos preferido instalado en su computadora , debe conectar su entorno local a la nube Instancia de SQL y, por lo tanto, a través de la IP privada.

Dado que la instancia de Cloud SQL no tiene una IP pública, no puede acceder a ella directamente desde Internet (tu computadora) y El proxy de Cloud SQL tampoco puede . La solución aquí es crear un bastión host : un puente VM entre el mundo exterior (IP pública) y el mundo interior (IP privada).

Para esto, crea una pequeña instancia de Compute Engine , una f1-micro por ejemplo ( muy asequible, menos de $ 5 por mes), para lograrlo.

Requisito del equipo de seguridad : Toda la VM no debe tener una IP pública. Por supuesto, las reglas de firewall 0.0.0.0/0 no están permitidas, especialmente en el puerto 22 (ssh)

Host Bastion sin IP pública

Nuevas restricciones para tratar ! Pero es consistente: si cierras la puerta, es para dejar que se abra la ventana !!
Así que no hay problema, Google Cloud ofrece una solución excelente y fácil para esto: Identity-Aware Proxy (IAP)

Con IAP, solo tiene que otorgar un Google Cloud IAP Rango de IP

35.235.240.0/20 para acceder a tu Compute Engine en el puerto 22 en tus reglas de firewall . Y, por lo tanto, no es necesario abrir 0.0.0.0/0 (todo Internet) para llegar al puerto ssh de Compute Engine.

Luego, use el gcloud SDK para conectarse a su host bastión Compute Instancia del motor
gcloud compute ssh --zone=
Y ¡ocurre la magia! El SDK de gcloud detecta automáticamente la falta de IP pública de Compute Engine instancia y abre automáticamente un túnel IAP para conectar en SSH la instancia . ¡Es invisible para el usuario!

La credencial (aquí la cuenta de usuario, pero podría ser la cuenta de servicio) necesita tener suficiente permiso para crear un túnel IAP . Los roles son roles / iap.tunnelResourceAccessor para crear el túnel y roles / compute.instanceAdmin.v1 para acceder a la VM

Ahora, está conectado al host bastión, pero aún no has conectado la instancia de Cloud SQL

Túneles IAP, reenvío de puertos SSL y Proxy de Cloud SQL

Y allí, comienza la parte “ugly” . Tenemos 2 cosas que lograr

  1. Conectar el host bastión a la instancia de Cloud SQL a través de la IP privada
  2. Reenviar la solicitud de conexión de la base de datos del entorno local al host bastión a llega a la instancia de Cloud SQL a través del túnel del proxy de Cloud SQL

1. Conectividad de la instancia de Cloud SQL desde el host bastión
Para ello, necesitamos el proxy de Cloud SQL para abrir un túnel entre el host bastión y la instancia de Cloud SQL.

Primer número: Porque usted no tiene una IP pública, no puede acceder a Internet!
Puedes elegir crear un en el rango de IP de instancia de computación de tu host bastión. Pero, la forma más fácil es descargarlo en su entorno local y luego en cópielo en el host bastión . Para lograr esto, puede usar este comando.
gcloud compute scp /local/path/to/cloud_sql_proxy :/tmp
Como puedes abrir una conexión SSH a través de IAP, también puedes usar scp protocolo (copia ssh) para copiar archivos a través de IAP. ¡Magia!

Genial, ahora tienes el binario en la instancia de Compute Engine del host bastión y desea probar si la conexión funciona . Puede ejecutar los comandos

#Connect to bastion host
gcloud compute ssh --zone=
#Change the permission of the Cloud SQL proxy binary (do it only once)
chmod +x /tmp/cloud_sql_proxy
#Connect to your Cloud SQL instance
/tmp/cloud_sql_proxy --instances==tcp:3306

Puede encontrar el connection_name en la página de su instancia de Cloud SQL

Segundo problema: ¡no funciona! ¡Y hay muchas razones!

  • Si creó su host bastión Compute Engine con los parámetros predeterminados , especialmente la parte del alcance de la API, no tiene suficiente alcance para llegar a las API de Cloud SQL.
    Para resolver esto, debes detener Compute Engine , editarlo y personalizar los ámbitos
  • Cuando se crea el túnel de Cloud SQL, los permisos de IAM de las credenciales actuales (aquí las credenciales de Compute Engine ) están marcadas . La cuenta de servicio de Compute Engine no podría tener suficientes permisos.
    Para solucionar esto, asegúrese de que se otorguen las funciones mínimas en la cuenta de servicio: Cloud SQL client, Cloud SQL editor o Cloud SQL admin
    La cuenta de servicio predeterminada de Compute Engine tiene funciones / editor papel. Demasiado amplio pero suficiente para nuestro caso de uso.
  • Por último, de forma predeterminada, cuando solicita una API de Google Cloud, se solicita el DNS público . Ocurre cuando el proxy de Cloud SQL solicita la API de Cloud SQL o el servicio IAM cuando se crea el túnel. Y, como el host bastión Compute Engine no tiene una IP pública, puede acceder a Internet y a la googleapis.com DNS público.
    Para solucionar esto, tienes 2 soluciones. configura un Cloud NAT como se propuso anteriormente, o usa una función complicada de Google Cloud VPC: Permitir la subred actual del host bastión Compute Engine para llamar al

    googleapis.com DNS . Para lograr esto, vaya a su VPC, seleccione la subred correcta y edítela. Luego, seleccione On para el botón de opción Acceso privado a Google y guarde.

¡¡Genial !! Ahora, Compute Engine, el host bastión puede usar el proxy de Cloud SQL para abrir un túnel desde el puerto local 3306 a la instancia de Cloud SQL, a través de la IP privada.

2. Reenvíe el tráfico del entorno local a la instancia de Cloud SQL
Para lograr esto, no usaremos gcloud ssh función incorporada pero una solución alternativa . Además de una conexión directa con ssh a las instancias de Compute, gcloud SDK permite crear un túnel en cualquier puerto .

Entonces, creemos un túnel en el puerto 22 del host bastión instancia de Compute Engine y defina un puerto local arbitrario (aquí 4226)

gcloud compute start-iap-tunnel  22 \
--zone= --local-host-port=localhost:4226

Genial, un túnel es abierto y podemos usarlo para conectar la instancia de Compute Engine del host bastión en ssh.

Deje que el túnel se abra y se ejecute en una terminal y abra uno nuevo.

Ahora, conectemos en ssh a él . En un comando, logrará varias cosas obligatorias para establecer la conexión :

  • Cree un reenvío de puertos desde su entorno local al motor de cálculo del host bastión
    -L 3306:localhost:3306
    “mi puerto local 3306 se reenvía en la VM de destino (aquí el host bastión) para llegar al puerto 3306 abierto en localhost (es decir, la VM de destino) ”
  • Reutiliza la clave ssh creada automáticamente por Google durante el primer ssh conexión al host bastión Compute Engine (o scp). Esta clave privada se almacena en el directorio home del usuario actual ~/.ssh
    -i ~/.ssh/google_compute_engine
  • Abra un ssh conexión a través del túnel IAP existente en el entorno localhost y reenviando el ssh tráfico desde el puerto local 4226
    -p 4226 localhost
  • Cuando se conecta al host bastión Compute Engine, desea ejecutar el proxy de Cloud SQL para crear el túnel a la instancia de Cloud SQL , en el puerto 3306. Para ello, ejecute el comando que desee en el control remoto (el host bastión) después de --
    -- /tmp/cloud_sql_proxy instances==tcp:3306

Y junta todo esto

ssh -L 3306:localhost:3306 \
-i ~/.ssh/google_compute_engine \
-p 4226 localhost \
-- /tmp/cloud_sql_proxy instances==tcp:3306

¡Ya lo tienes! Utilice su IDE de base de datos favorito, conéctelo en localhost:3306 e inicie sesión en su base de datos con el usuario / contraseña.

¡¡Guau !! ¡Todo esto para poder cumplir con un patrón de seguridad ! Aquí un esquema de lo que hemos construido

¡¡Eso es “feo” !!

Efecto secundario adicional

Usando Cloud SQL con una IP privada solo agrega advertencias . De hecho, se crea un intercambio de tráfico entre la VPC del proyecto y la red de Cloud SQL (administrada por Google Cloud).
Y el intercambio de tráfico tiene dos limitaciones:

Este último punto es muy importante y puede ser un bloqueador si desea acceder a la instancia de la base de datos desde otro proyecto . De hecho, desde la VPC de otro proyecto, le gustaría crear un emparejamiento con el proyecto que tiene la instancia de Cloud SQL para alcanzar, a través de la IP privada.

Pero, debido a la limitación de transitividad, puede t: la IP privada de Cloud SQL no se ve desde la VPC del otro proyecto.
La solución alternativa aquí es crear una VPN para emparejar las 2 VPC .
Eso es euh… “más feo” ??

Un efecto secundario adicional es la incapacidad de las aplicaciones de App Script para usar instancias de Cloud SQL si no se define una IP pública.

El patrón de seguridad «inteligente» es importante

La seguridad es importante y los patrones existentes para las bases de datos funciona muy bien … en el mundo heredado.
Ahora, con Cloud SQL y el proxy de Cloud SQL, existen capas de seguridad adicionales que anulan los patrones anteriores.

¿Cuál es el problema de tener una IP pública si no se permiten rangos de IP para conectarse a ella? ?

Es la definición de una regla de firewall en el mundo heredado, no es ¿no? Denegar todas las IP para acceder a este rango / IP donde están alojadas mis bases de datos

Preocupación del equipo de seguridad : ¿Cómo estar seguro de que no se permite ningún rango de IP?

Esta pregunta es legítima y es por eso que puede hacer cumplir una política de la organización ( restringir Redes autorizadas en instancias de Cloud SQL ) para evitar que se agreguen rangos de IP públicos en instancias de Cloud SQL , y esto, para toda la empresa.

Eventualmente, permitir una IP pública en instancias de Cloud SQL evita muchas soluciones alternativas y diseños extraños para tratar, y sin disminuir el nivel de seguridad.
Además, el túnel creado está encriptado y garantiza un alto nivel de seguridad. y confidencialidad.

La nube cambia los paradigmas (ver Beyond Corp ) y el patrón de seguridad debe actualizarse para cumplir con ellos.
¡Los patrones de seguridad inteligentes son mejores que los patrones de seguridad heredados!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *