Todos los artículos

Cómo configurar Key Pair Authentication en DataGrip a Snowflake

Snowflake está reforzando la seguridad de la plataforma y estableciendo autenticaciones más seguras por defecto. Si quieres evitar tener que estar continuamente autenticandote con MFA al usar DataGrip, te enseño como puedes usar Key Pair Authentication con DataGrip y Snowflake.

Image showing a key opening a door.

Desde la segunda mitad de 2024 Snowflake lleva anunciando que va a reforzar sus medidas de seguridad en la autenticación de usuarios en la plataforma. Una de esas medidas será requerir el uso de MFA para usuarios o establecer criterios específicos sobre lo que se consideran usuarios “saludables” en cuanto a la autenticación se refiere. Por ejemplo, usando autenticación a través de keypair y añadiendo reglas de seguridad por IP.

¿Por qué usar la autenticación Key Pair?

La autenticación key pair ofrece una capa adicional de seguridad al eliminar la necesidad de almacenar contraseñas en texto plano. En su lugar, utiliza un par de llaves o claves criptográficas: una llave pública y una llave privada. La llave privada se mantiene segura con el usuario, mientras que la llave pública se almacena en Snowflake.

Este método no solo es más seguro, sino que también es más conveniente para la automatización y el acceso programático. Podemos usar este método junto con Network policies de Snowflake como alternativa a la autenticación con MFA. Esto asegurará que el usuario autenticándose de este modo se siga considerando un usuario que cumple con las buenas prácticas de seguridad de Snowflake, al mismo tiempo que evitamos tener que usar MFA si queremos evitar el doble factor de autenticación cada vez que accedemos a Snowflake desde una herramienta como DataGrip.

Cómo usar autenticación por Key Pair según la documentación de Snowflake

El proceso general es el siguiente:

  1. Tendremos que crear las llaves pública y privada.
  2. A continuación actualizaremos en Snowflake la autenticación del usuario que queramos para que pueda autenticarse con dicha clave pública.
  3. Finalmente, tendremos que incluir ciertos parámetros en la conexión por JDBC, que es la que utiliza por ejemplo DataGrip.

Vamos a ver estos pasos en detalle.

Cómo crear las llaves pública y privada de autenticación

Snowflake proporciona un conjunto de comandos en su documentación para generar pares de claves compatibles con su plataforma. Estos comandos aseguran que las claves estén en el formato correcto y contengan todos los parámetros necesarios. Para ello deben ejecutarse estos dos comandos en el terminal o línea de comandos:

  • Con este comando generaremos una llave privada sin contraseña de encriptación:
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
  • Como alternativa, podemos usar este comando para incluir una clave de encriptación:
openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8

Ambas opciones generan una clave RSA de 2048 bits y la convierten a formato PKCS#8. Una vez hemos creado la llave privada con uno de los dos comandos anteriores es hora de crear la llave pública con el siguiente comando:

openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub

Si hemos creado la llave privada con clave de encriptación, tendremos que usarla también al crear la clave pública.

Finalmente, tendremos que abrir la llave pública con un editor de texto y copiar todo el texto que se encuentra entre las líneas “BEGIN PUBLIC KEY” y “END PUBLIC KEY”:

-----BEGIN PUBLIC KEY-----
MIIBIjAPQ.....
-----END PUBLIC KEY-----

Cómo asignar la llave pública un usuario de Snowflake

Ahora que las llaves están generadas es hora de permitir a un usuario concreto utilizar dicha llave. Para ello ejecutaremos el siguiente comando en Snowflake con un rol que sea el dueño del usuario o al menos usando el rol SECURITYADMIN:

ALTER USER mi_usuario SET RSA_PUBLIC_KEY='MIIBIjAPQ.....';

Como he mencionado antes, es importante no incluir todo el texto de la llave pública, sino solo la llave en sí, sin el “BEGIN PUBLIC KEY” ni el “END PUBLIC KEY”.

Usar autenticación Key Pair con conexiones JDBC

Snowflake también cuenta con una documentación muy detallada para usar la autenticación por Key Pair en conexiones a través del conector JDBC. Para ello tendremos que incluir en la cadena de texto de la conexión JDBC ciertos parámetros adicionales:

  • Ruta donde se encuentra la llave pública
  • Clave de encriptación (sólo si hemos creado la llave privada con )

El problema con DataGrip

El problema con el que me he encontrado es que las claves generadas de ese modo no me funcionan al utilizarlas en DataGrip, ya que devuelve el siguiente mensaje de error:

use java.security.interfaces.RSAPrivateCrtKey.class for the private key

Tras preguntarle a Claude ya que no soy un experto en estos temas, al parecer el error indica que la clave privada no está en el formato esperado por el driver JDBC de DataGrip. No obstante, al preguntar a Claude por una solución nos ofrece una forma de evitar este error creando las llaves pública y privada de otro modo que sea compatible con RSAPrivateCrtKey y conteniendo todos los parámetros necesarios.

En este sentido, la alternativa que a mi me ha funcionado es seguir estos pasos:

  1. Generar la llave RSA:
openssl genrsa -out temp_key.pem 2048
  1. Convertir la llave generada a formato PKCS#8:
openssl pkcs8 -topk8 -inform PEM -in temp_key.pem -out rsa_key.p8 -nocrypt
  1. Generar la llave pública:
openssl rsa -in temp_key.pem -pubout -out rsa_key.pub
  1. Eliminar la llave temporal:
rm temp_key.pem

Según parece estos pasos aseguran que la llave privada contenga todos los parámetros necesarios y sea compatible con RSAPrivateCrtKey, resolviendo así el error en DataGrip.

Cómo utilizar Key Pair en DataGrip con Snowflake

A continuación, en la configuración de la conexión de Snowflake, podemos editar la URL del JDBC del siguiente modo:

jdbc:snowflake://micuenta-datos.snowflakecomputing.com? warehouse=miWarehouse&role=miRol&private_key_file= /ruta/de/clave/publica/rsa_key.p8&private_key_pwd=miPassword

En esa cadena de texto del conector JDBC podemos incluir los parámetros que necesitemos como el warehouse a utilizar, el rol con el que queremos entrar en Snowflake, etc. Pero lo que es fundamental es incluir los dos últimos parámetros:

  • private_key_file: La ruta donde se encuentra la llave privada en mi ordenador.
  • private_key_pwd: La clave de encriptación utilizada al crear la llave.

JDBC en DataGrip con Key Pair Authentication

Si probamos de nuevo la conexión, ahora debería funcionar sin problemas y podremos usar DataGrip con autenticación por Key-Pair y así evitarnos el MFA. Recuerda que según las directrices de Snowflake, un usuario se considera seguro si se combina la autenticación Key Pair con Network Policies para limitar el acceso por IP.