Connect to Cloud SQL instance using Cloud SQL Auth proxy

La gran mayoría de nosotros nos hemos enfrentado, alguna que otra vez, a esa incomoda situación en la que se despliega una base de datos en la nube, y se quiere otorgar acceso a un conjunto de desarrolladores desde su maquina local.

Cuando se exploran las distintas opciones disponibles, las dudas y suspicacias entorno a la gestión de los accesos, las reglas de firewall a configurar o la confidencialidad de los datos que viajan a través de la red tienden a monopolizar la conversación. ¿Os resulta familiar esta anécdota?

Cómo bien deja entrever el título, una de las soluciones pasa por hacer uso Cloud SQL Auth proxy, y, como no podía ser de otra forma, en el presente artículo se pretende describir que es y cómo utilizarlo para dar solución al caso de uso presentado.

Caso de uso

Se dispone de un instancia privada de PostgreSQL corriendo sobre Cloud SQL, el servicio gestionado de bases de datos relacionales de Google Cloud, y se quiere acceder a ella de forma segura a través de la maquina local de un desarrollador.

What is the Cloud SQL Auth proxy

Tal y como define la documentación oficial de Google, SQL Auth proxy es un servicio gestionado que proporciona un acceso seguro a las instancias de Cloud SQL, sin necesidad de redes autorizadas o de configurar SSL. Curiosamente da solución las problemáticas descritas en la introducción, ahora bien, ¿Cómo consigue llevarlo a cabo?

En primer lugar, el proxy encripta automáticamente todo el tráfico hacia y desde la base de datos mediante TLS 1.3, con un algoritmo de cifrado AES de 256 bits, salvaguardando así la confidencialidad e integridad de los datos. Los certificados SSL requeridos son gestionados por el propio servicio junto a la API de Cloud SQL, quien en última instancia es la encargada de emitirlos y renovarlos, pues disponen de un tiempo de vida máximo de 60 minutos. Todo ello de forma completamente transparente para el usuario.

Por otro lado, SQL Auth proxy se apoya el servicio de IAM de Google Cloud para autorizar quien puede y quien no puede conectarse a las instancias de Cloud SQL, dejando de lado el tradicional filtrado de accesos basado en direcciones IP. Basta con que el usuario en cuestión disponga del permiso cloudsql.instances.connect y acceso a la red (indispensable, ya que el proxy no establece una nueva ruta de conectividad como tal), para poder interactuar con la base de datos.

De esta forma, se aligeran notablemente las tareas de gestión al evitar tener que actualizar las reglas del firewall cada vez que se añade un nuevo integrante al equipo o cambia una dirección IP, en otros.

Finalmente, señalar que también se integra con el IAM para autenticar a los usuarios contra la base de datos. Es decir, en lugar de emplear la clásica autenticación integrada en la propia BD, en el que se proporciona un nombre de usuario y una contraseña, se apoya de nuevo en el IAM para autenticar a las personas correspondientes mediante un token de acceso OAuth 2.0.

Este modelo de gobierno centralizado garantiza que los usuarios automáticamente pierden el acceso a la base de datos, cuando abandona la empresa o el proyecto en cuestión, por ejemplo. O al menos debería hacerlo si la organización gestiona de forma adecuada el IAM.

How it works

Una vez descrito que es el SQL Auth proxy y sus principales características, llegó el momento de explicar cómo funciona.

Bien, toda la magia sucede gracias a un cliente que se ejecuta en el entorno local, para el caso de uso descrito, en la computadora del afortunado desarrollador, que se encarga de establecer un túnel seguro con la instancia de Cloud SQL. Es decir, y cómo su propio nombre indica, genera un proxy con el que los aplicativos locales deberán interactuar para acceder a la base de datos.

Cuando eso ocurre, el cliente SQL Auth proxy verifica si se dispone de una conexión previa existente con la instancia de Cloud SQL en cuestión, con el animo de reutilizarla. Si no fuera así, llama a la API de Cloud SQL Admin para obtener un certificado SSL y conectarse a la base de datos.

Recordar que estos certificados son efímeros y disponen de un tiempo de vida máximo de una hora, pero no hay nada de qué preocuparse, ya que el propio proxy se encarga de renovar automáticamente dichos certificados antes de que venzan.

También es importante recordar que es indispensable habilitar la API de Administración de Cloud SQL y disponer de conectividad con la red en la que aloja la base de datos, ya que, aunque el proxy puede gestionar las reglas de acceso apoyado en el IAM, no es capaz de conectarse mágicamente a una IP privada a la que no se tiene acceso.

Finalmente, la instancia de Cloud SQL verifica si el desarrollador dispone del permiso cloudsql.instances.connect en IAM para poder autorizar la conexión, y posteriormente autentica al usuario, ya sea mediante user/password o un token de acceso OAuth 2.0.

How to use it

Lo primero de todo es asegurarse por enésima vez que uno cumple con los prerrequisitos previamente descritos:

  • Conectividad con la red en la que aloja la base de datos.
  • Un usuario o service account con el permiso cloudsql.instances.connect.

Una vez cerciorado que se cumple ambas precondiciones, se deberá instalar e inicializar el cliente de gcloud. En caso de que lo tuvieras de antemano, puedes obviar este paso.

brew install --cask google-cloud-sdk

Paciencia, el proceso de instalación puede llevar algunos minutos.

==> Installing Cask google-cloud-sdk
==> Running installer script 'google-cloud-sdk/install.sh'
Welcome to the Google Cloud CLI!
Beginning update. This process may take several minutes.


Your current Google Cloud CLI version is: 382.0.0
Installing components from version: 382.0.0

┌─────────────────────────────────────────────────────────────────────────────┐
│                     These components will be installed.                     │
├─────────────────────────────────────────────────────┬────────────┬──────────┤
│                         Name                        │  Version   │   Size   │
├─────────────────────────────────────────────────────┼────────────┼──────────┤
│ BigQuery Command Line Tool                          │     2.0.74 │  1.0 MiB │
│ BigQuery Command Line Tool (Platform Specific)      │     2.0.73 │  < 1 MiB │
│ Cloud Storage Command Line Tool                     │        5.9 │ 19.4 MiB │
│ Cloud Storage Command Line Tool (Platform Specific) │        5.6 │  < 1 MiB │
│ Google Cloud CLI Core Libraries (Platform Specific) │ 2022.01.28 │  < 1 MiB │
│ anthoscli                                           │     0.2.26 │ 47.8 MiB │
│ gcloud cli dependencies                             │ 2021.04.16 │  < 1 MiB │
└─────────────────────────────────────────────────────┴────────────┴──────────┘

For the latest full release notes, please visit:
  https://cloud.google.com/sdk/release_notes

╔════════════════════════════════════════════════════════════╗
╠═ Creating update staging area                             ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Installing: BigQuery Command Line Tool                   ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Installing: BigQuery Command Line Tool (Platform Spec... ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Installing: Cloud Storage Command Line Tool              ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Installing: Cloud Storage Command Line Tool (Platform... ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Installing: Default set of gcloud commands               ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Installing: Google Cloud CLI Core Libraries (Platform... ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Installing: anthoscli                                    ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Installing: anthoscli                                    ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Installing: gcloud cli dependencies                      ═╣
╚════════════════════════════════════════════════════════════╝
╔════════════════════════════════════════════════════════════╗
╠═ Creating backup and activating new installation          ═╣
╚════════════════════════════════════════════════════════════╝

Performing post processing steps...
.............................................................................done.

Update done!

Una vez instalado, el cliente debe ser inicializado.

gcloud init

Al inicializarse, se nos preguntará si deseamos logearnos, algo imprescindible para poder interactuar con las APIs de Google Cloud.

Welcome! This command will take you through the configuration of gcloud.

Your current configuration has been set to: [default]

You can skip diagnostics next time by using the following flag:
  gcloud init --skip-diagnostics

Network diagnostic detects and fixes local network connection issues.
Checking network connection...done.                                                                                                                                                                                                                          
Reachability Check passed.
Network diagnostic passed (1/1 checks passed).

You must log in to continue. Would you like to log in (Y/n)?  Y

Acto seguido se abrirá una pestaña en nuestro navegador predeterminado para introducir las credenciales oportunas.

Con el cliente de gcloud instalado e inicializado, es buen momento para activar la API de Cloud SQL, en aquel proyecto que albergue la susodicha instancia de PostgreSQL sobre Cloud SQL. Para ello, haga click en el siguiente enlace.

Si no estuviéramos logueados, se nos solicitaría introducir las credenciales mediante una pantalla similar a la del paso anterior.

Una vez dentro, lo primero es confirmar que el proyecto sobre el que se quiere activar la API es el adecuado. Basta con hacer click sobre el botón NEXT para ello.

Para habilitar la API, basta con hacer click sobre el botón ENABLE.

Con todo listo, es hora de instalar el cliente de SQL Auth proxy.

gcloud components install cloud_sql_proxy

En esta ocasión, el proceso de instalación tan solo se demorará unos pocos segundos.

Your current Google Cloud CLI version is: 382.0.0
Installing components from version: 382.0.0

┌─────────────────────────────────────────────────────────────────────────┐
│                   These components will be installed.                   │
├─────────────────────────────┬─────────────────────┬─────────────────────┤
│             Name            │       Version       │         Size        │
├─────────────────────────────┼─────────────────────┼─────────────────────┤
│ Cloud SQL Proxy             │              1.27.0 │             7.6 MiB │
└─────────────────────────────┴─────────────────────┴─────────────────────┘

For the latest full release notes, please visit:
  https://cloud.google.com/sdk/release_notes

Do you want to continue (Y/n)?  Y

╔════════════════════════════════════════════════════════════╗
╠═ Creating update staging area                             ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud SQL Proxy                              ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud SQL Proxy                              ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Creating backup and activating new installation          ═╣
╚════════════════════════════════════════════════════════════╝

Performing post processing steps...done.                                                                                                                                                                                                                     

Update done!

¡Listo! Con todo instalado, no queda mas que iniciar el proxy para poder interactuar con la base de datos. Para ello, basta con ejecutar los siguientes comando:

INSTANCE_CONNECTION=$(gcloud sql instances \
    describe {REPLACE_WITH_INSTANCE_NAME} --format 'value(connectionName)')
cloud_sql_proxy -instances=INSTANCE_CONNECTION=tcp:5432 --enable_iam_login

Tal y como se puede observar, es necesario sustituir la parte “{REPLACE_WITH_INSTANCE_NAME}” con el nombre de la instancia de la base de datos. Un ejemplo real, podría ser tal que así.

INSTANCE_CONNECTION=$(gcloud sql instances \
    describe customers --format 'value(connectionName)')
cloud_sql_proxy -instances=INSTANCE_CONNECTION=tcp:5432 --enable_iam_login

Si todo ha funcionado de la forma esperada, el cliente debería mostrar el siguiente log por consola.

2022/04/24 12:52:07 Listening on 127.0.0.1:5432 for sandbox:europe-west1:customers
2022/04/24 12:52:07 Ready for new connections
2022/04/24 12:52:07 Generated RSA key in 293.1838ms

Solo queda conectarse a la base de datos, ya sea mediante user/password tradicional o el usuario IAM.

psql "host=127.0.0.1 port=5432 sslmode=disable dbname=customers user=postgre"
 
psql "host=127.0.0.1 port=5432 sslmode=disable dbname=customers user=you_gloud_email@gmail.com"

Conclusiones

En conclusión, SQL Auth proxy no solo es un servicio gestionado que proporciona un acceso seguro a las instancias de Cloud SQL, sin necesidad de redes autorizadas o de configurar SSL, sino también el método recomendado por Google para acceder a las bases de datos.

A lo largo del articulo se han detallado uno por uno todos los pasos a ejecutar para poder hacer uso de él, y desde este caso solo esperamos que os hayan sido de ayuda.

Referencias

Se recomienda encarecidamente leer los siguientes artículos que han servido de base para el escrito:

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s