Nisamar
1248 palabras
6 minutos
Conexión a CloudSQL de forma segura
TIP

En esta entrada se avisan de posibles gastos e incluye guía de limpieza de assets.

Las bases de datos expuestas son uno de los mayores riesgos dentro de las nubes públicas. Una mala configuración puede acarrear costes excesivos de tráfico de red. O peor, una exposición excesiva o una contraseña sin actualizar puede acabar en una brecha de información.

En esta entrada intentaré mostrar la forma más segura de configurar una conexión entre una base de datos CloudSQL y una máquina virtual de Compute Engine, reduciendo los costos al mínimo, con encriptación punto a punto, autenticación nativa OAuth y rotación de claves automática. No es fantasía, son las propiedades que ofrece Google Cloud Platform y que pocos usan.

Puntos claves iniciales#

Antes de comenzar, a algunos les interesará saber los puntos claves de esta infraestructura. Como algunos puntos son nativos de GCP, como la encriptación punto a punto, no vamos a configurarlo, pero es necesario justificar que se está implementando correctamente.

OAuth 2.0 y E2EE#

La herramienta que vamos a usar para realizar la conexión es el Proxy de autenticación CloudSQL. Tal y como nos dice la documentación oficial, este proxy utiliza encriptación TLS 1.3 para conectarse a la base de datos y, como se encuentra en la misma máquina que nuestra aplicación, la conexión sale de la VM ya encriptada.

Diagrama de conexión de CloudSQL Auth Proxy

Al mismo tiempo, cuando una máquina tiene una cuenta de servicio asociada, Google usa OAuth 2.0 para generar credenciales de corta duración (una hora) para autenticarse en las APIs, también indicado en la documentación. Con estas credenciales podemos autenticarnos en la base de datos y gestionar el acceso usando IAM.

Planificación#

Para este entorno, crearemos una infraestructura con estas características:

  • Una VPC con acceso a los servicios de Google.
  • Una máquina virtual sin IP pública para reducir la exposición.
  • Una cuenta de servicio con permisos mínimos.
  • Una CloudSQL sin IP pública.
  • Una conexión encriptada y sin contraseñas, gestionada por la autenticación de Google.

Ejecución#

API#

Activa la API de Compute Engine: Compute Engine API

gcloud services enable compute.googleapis.com

No es necesario activar una API para crear instancias CloudSQL, pero sí para acceder a ellas con el proxy de autenticación, así que será necesario que actives también la la API de administración de CloudSQL.

gcloud services enable sqladmin.googleapis.com

VPC#

Crea una VPC con acceso privado a los servicios de Google, donde estará la CloudSQL. Configura estos puntos durante la creación. Si no aparecen en la tabla. se pueden dejar vacíos o por defecto:

CampoContenido
Nombresecure-cloudsql
Modo de creación de la subredCustom
Nombre de la subredcloudsql-subnet
Región de la subredeurope-southwest1 (Madrid)
Rango de IP10.0.33.0/24
Private Google AccessOn

Vía terminal se hace de esta forma:

gcloud compute networks create secure-cloudsql --subnet-mode=custom
gcloud compute networks subnets create cloudsql-subnet --range=10.0.33.0/24 --stack-type=IPV4_ONLY --network=secure-cloudsql --region=europe-southwest1 --enable-private-ip-google-access

Ahora se crea el router y el NAT para permitir que la máquina acceda a internet sin exponerla directamente. Accede al apartado de Cloud NAT y crea uno nuevo.

CampoContenido
Gateway namesecure-cloudsql-gtw
Networksecure-cloudsql
Regioneurope-southwest1 (Madrid)
Cloud RouterCreamos uno nuevo con el nombre secure-cloudsql-router y el resto de opciones por defecto
Network Service TierStandard

Cuenta de servicio#

Antes de desplegar la máquina virtual, crea su cuenta de servicio desde la página correspondiente y pinchar en Create Service Account o vía comando.

gcloud iam service-accounts create app-sa --description="Cuenta de servicio para la VM App" --display-name="App Service Account"

Ahora hay que darle permisos a la cuenta para permitir que se pueda conectar a las bases de datos CloudSQL. Como siempre, si seguimos la documentación oficial, debemos darle el rol Cloud SQL Client para permitir que el proxy se conecte a la instancia, y Cloud SQL Instance User para conectarse dentro de la base de datos como usuario.

PROJECT=your-project-id
gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:app-sa@${PROJECT}.iam.gserviceaccount.com --role=roles/cloudsql.instanceUser
gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:app-sa@${PROJECT}.iam.gserviceaccount.com --role=roles/cloudsql.client

VM#

CUIDADO

Esta VM conlleva un gasto de $8.42 mensuales si se deja encendida y $1.20 si se apaga. Aproximadamente $0.01 la hora.

Vamos a crear una VM con estos puntos.

CampoContenido
Nameapp-vm
Regioneurope-southwest1 (Madrid)
Machine typee2-micro
Service AccountApp Service Account

En las opciones avanzadas, apartado de Networking, cambia la IP externa por “None”. VM sin IP externa

PROJECT=your-project-id
gcloud compute instances create app-vm --project=$PROJECT --zone=europe-southwest1-a /
--machine-type=e2-micro --network-interface=stack-type=IPV4_ONLY,subnet=cloudsql-subnet,no-address /
--maintenance-policy=MIGRATE --provisioning-model=STANDARD --service-account=app-sa@${PROJECT}.iam.gserviceaccount.com /
--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/trace.append /
--create-disk=auto-delete=yes,boot=yes,device-name=app-vm,image=projects/debian-cloud/global/images/debian-12-bookworm-v20240709,mode=rw,size=10,type=projects/${PROJECT}/zones/europe-southwest1-a/diskTypes/pd-balanced /
--no-shielded-secure-boot --shielded-vtpm --shielded-integrity-monitoring /
--labels=goog-ec-src=vm_add-gcloud --reservation-affinity=any

Desde VPC networks > Firewall crea una regla que permita el acceso al puerto 22 desde el Proxy de autenticación de Google. Esto servirá para poder acceder a la máquina aunque no tenga IP pública ni conexión a internet.

Desde dónde crear una regla de firewall

Se rellenan estos datos para crear la regla:

CampoContenido
Nameallow-iap
Networksecure-cloudsql
Direction of trafficIngress
TargetsAll instances
Source IPv4 ranges35.235.240.0/20
Protocols22/TCP

Vía terminal se hace así:

gcloud compute firewall-rules create allow-iap --direction=INGRESS --priority=1000 --network=secure-cloudsql --action=ALLOW --rules=tcp:22

CloudSQL#

CUIDADO

Esta CloudSQL conlleva un gasto de $11,10 mensuales si se deja encendida y $0 si se apaga. Aproximadamente $0.02 la hora.

Accede a la página de CloudSQL y crea una nueva instancia. Para la demostración usaremos una PostgreSQL.

Completa estos pasos para crear una base de datos con pocos requisitos.

CampoContenido
CloudSQL EditionEnterprise
PresetSandbox
Database versionSelecciona la última versión
InstanceIDapp-psql
PasswordAutogenera uno y guardalo
Regioneurope-southwest1 (Madrid)
En Customize > Machine configuration > Machine ShapesShared cores y 1vCPU, 0,614 GB
ConnectionsQuita Public IP y añade Private IP Asociado a la red secure-cloudsql

Cuando llegues a este punto, tendrás que configurar el acceso el acceso privado desde un banner. Alt text

Este botón te llevará a un asistente de configuración y te explicará brevemente la infraestructura de CloudSQL. En el paso dos, podrás crear definir un rango de IP para la base de datos. Podemos pedirle que lo cree automáticamente sin problemas.

Con esto, tampoco necesitas añadir el rango de IPs de la subnet como autorizado.

TIP

Es normal que la CloudSQL tarde bastante en crearse, siempre la he visto entre 7 y 20 minutos.

Crear usuario en la DB#

Toca crear el usuario dentro de la base de datos. La opción principal de Google es el típico usuario y contraseña, pero existe la opción de vincular una identidad, crear un usuario para esta y usar la autenticación nativa de GCP para acceder. Dentro del panel de la CloudSQL sigue estos pasos.

Crear conexión#

En la página principal de CloudSQL verás ahora una tabla con una sola máquina. Copia el valor de la columna Instance connection name, lo necesitaremos en el proxy de autenticación, en mi caso se llama your-project-id:europe-southwest1:app-psql.

Ahora, accede a la máquina virtual usando este comando.

gcloud compute ssh --zone "europe-southwest1-a" "app-vm" --tunnel-through-iap

Después,puedes descargar el binario del proxy de autenticación de Google y activarlo, indicándole que vaya por IP privada y que utilice la propia cuenta de servicio para autenticar la conexión.

# Documentación oficial: https://cloud.google.com/sql/docs/mysql/connect-auth-proxy#install
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.11.2/cloud-sql-proxy.linux.amd64
chmod +x cloud-sql-proxy
./cloud-sql-proxy --port 5432 $INSTANCE_CONNECTION_NAME --private-ip --auto-iam-authn &

Por último, comprobamos que la conexión es correcta usando el comando psql para acceder, date cuenta que en ningún momento se le especifica una contraseña.

psql "host=127.0.0.1 dbname=postgres [email protected]"

Limpieza#

Si no quieres sorpresas en la facturación, es recomendable borrar los assets que hemos creado que consumen dinero. Si has creado un proyecto a parte, simplemente asegurate que la máquina virtual y la CloudSQL están apagadas, luego inicia el trámite para borrar el proyecto entero. Puedes hacerlo entrando al gestor de recursos y, en los tres puntitos de la fila del proyecto, seleccionar la opción de borrar.

Si has usado un proyecto con otras cosas, tendrás que seguir estos pasos.

Para borrar la CloudSQL entra en su panel de edición y accede a la sección de Data Protection para verificar que está quitada a protección contra borrado. Cuando lo quites y se apliquen lo cambios, puedes borrar la instancia desde el panel pricipal de CloudSQL.

La máquina virtual puedes borrarla desde el panel de Compute Engine.

Desde este panel puedes borrar el Cloud Router. Se eliminará a la vez el Cloud NAT. Con esto, ya está todo, puedes comprobar que también se te ha borrado la IP pública desde aquí.

Conexión a CloudSQL de forma segura
https://nisamar.com/posts/conexion-segura-cloudsql/
Autor
Nicolás Sariego
Publicado el
2024-07-11
Licencia
CC BY 4.0