Como mantener tus contraseñas y claves seguras en Drupal

Puerta de seguridad con cerradura de 4 enclajes.

Cuando estamos desarrollando un sitio web, este siempre se conecta a algún punto externo, por ejemplo, la base de datos, y mantener las contraseñas o claves de acceso seguros o no exponerlos es algo muy importante, ya que, si nos las roban, estaríamos en serios aprietos.

Desde siempre se ha intentado mantener estos datos fuera de las aplicaciones y que vegan desde sitios externos, un buen ejemplo son las variables de entorno, y es que nos permiten separar de la aplicación ciertos datos como usuarios, contraseñas, claves... Y es que si las usamos nos evitaremos problemas graves como tener que poner esos datos sensibles directamente en el código, y por consecuente subirlo a un repositorio git y que se queden ahi por la eternidad.

En Drupal esto es algo que sucede de manera bastante asidua, y resulta que en muchas ocasiones el desarrollador del sitio no es consciente de que, al poner alguna clave en la configuración, cuando esta se exporte y se añada al repositorio ya se quedará ahi en el histórico y no podremos borrarla.

Como mantener las claves seguras

Existen multiples maneras de mantener las claves seguras en nuestro Drupal o en cualquier otro proyecto, lo más sencillo y habitual es usar las variables de entorno, el cómo aplicarlas en nuestro entorno de desarrollo o producción depende precisamente de nuestro entorno.

Aunque la mejor manera de almacenar estos datos sensibles son las variables de entorno, realmente se deberían usar para la configuración o claves dependientes de los entornos, para los datos que necesitamos mantener seguros otra manera es utilizar los secrets, que no son más que los datos encriptados y que durante el proceso de ejecución se desencriptan para poder acceder a ellos, pero esto de nuevo depende del entorno. Aunque como ejemplo podéis tomar el de Symfony, que provee un sistema para la gestión de secretos.

Evitando guardar las claves en la configuración de Drupal

Como ya hemos dicho, lo peor que podemos hacer es guardar estos datos en la configuración. De modo que hay que buscar alguna alternativa, y por suerte Drupal nos ofrece un sistema para poder modificar la configuración. Este sistema es muy simple, pero requiere que sepamos que configuración especifica necesitamos modificar, y es que en el archivo settings.php podemos sobrescribir la configuración para cambiarla de la siguiente manera:

$config['social_auth_google.settings']['client_id'] = getenv('GOOGLE_CLIENT_ID');
$config['social_auth_google.settings']['client_secret'] = getenv('GOOGLE_CLIENT_SECRET');

En ese ejemplo estamos obteniendo de las variables de entorno la ID de google y la clave para poder utilizarlas para la autenticación en la web con Google, si nos fijamos primero le indicamos cual es la configuración y después elemento de la misma que vamos a sobrescribir.

Si usamos ese sistema podemos modificar la configuración que necesitemos y no expondremos nuestros datos, de modo que, aunque un atacante consiga ver el código, no podrá ver cuáles son nuestras claves y robarlas.

Aunque la opción de sobrescribir la configuración de esa manera es muy válida y por lo general la mejor para la gran mayoría de los proyectos, si estamos en sistemas de alta seguridad, el hecho de que se vean los nombres de las variables de entorno puede considerarse un problema de seguridad en sí mismo, no solo por le echo de que se vea el nombre, si no que el atacante sabe que la información viene de las variables de entorno.

El módulo Key al rescate

Como hemos visto podemos modificar la configuración sin necesidad de tenerla en el repositorio, pero como también se ha comentado, en sistemas muy seguros esto puede considerarse incluso un problema de seguridad, y en este punto es donde entra en juego el módulo Key.

Y es que este módulo de Drupal nos permite crear una capa de abstracción entre nuestro sitio y el punto de donde vengan nuestros datos. De esa manera si un atacante consigue el código de nuestra web no podrá saber cuál es el origen de nuestra información de una manera tan sencilla como nos ocurría en el caso anterior.

La manera de usarlo es muy sencilla y en este caso veremos cómo usarlo con las variables de entorno ya que es lo más habitual. Pero antes de nada tenemos que descargarlo, y para ello usaremos composer:

$ composer require drupal/key

Una ver descargado ya podemos instalarlo he ir a su configuración en /admin/config/system/keys, y veremos un listado de las claves que se hayan creado, en este caso ninguna porque está recién instalado.

Listado de claves del modulo Key.

Cuando vayamos a añadir alguna clave tendremos que ponerle un nombre y a continuación seleccionar el tipo de clave, este punto puede ser un poco confuso, pero lo mejor es que si no lo tenemos claro escojamos la primera, la de autenticación.

Después indicarle el proveedor, por defecto disponemos de 3, desde la configuración, por variable de entorno o por archivo, lo mejor es por variable de entorno y es lo que usaremos en este caso. Aunque hay que tener en cuenta que el proveedor es un tipo de plugin, de modo que podemos encontrarnos más proveedores por parte de la comunidad o incluso escribir el nuestro propio.

Y por último indicarle cual es la variable de entorno que se utilizará para obtener la información.

Formulario para añadir una nueva clave en el modulo Key.

Y listo, cuando guardemos ya tendremos nuestra clave lista para se usará, pero debemos tener en cuenta que la clave por sí misma no hará nada, nosotros tenemos que usarla en algún punto de nuestra web.

La clave de Key recién creada.

Y aquí es donde llega el siguiente punto, el poder sobrescribir la configuración con la clave que acabamos de usar. El módulo Key nos provee además un formulario para que podamos sobrescribir la configuración que necesitemos, podemos localizarlo en /admin/config/development/configuration/key-overrides.

Formulario para sobrescribir la configuración del modulo Key.

En ese formulario podremos indicarle que configuración queremos sobrescribir y que clave usaremos, es bastante intuitivo y fácil de rellenar, en este ejemplo he usado la clave que hemos creado para modificar el nombre del sitio, pero realmente se puede aplicar a cualquier configuración, como en el primer ejemplo las claves de acceso a la autenticación de Google.

Pero no nos podemos olvidar del código, y es que desde código también podemos obtener la información que necesitemos de las claves que hayamos creado, y es muy sencillo, únicamente tenemos que utilizar el servicio que nos provee, y obtener la información de la clave correspondiente:

$value = \Drupal::service('key.repository')->getKey('clave_de_escueladrupal')->getKeyValue();

Y listo, con eso ya podremos tener toda la información segura y completamente abstraída de nuestro sitio, sin que ningún atacante nos pueda robar nada y complicándole localizar nuestros datos y mantenerlos seguros.

Comparte este artículo:
Publicado por Borja
Image

Me metí en la aventura de Drupal con la versión 6, y aquí estoy, 10 años después, escribiendo articulos y haciendo videos sobre Drupal, quien me lo iba a decir. Aunque he probado otros framworks y cms, me quedo con Drupal de lejos, pero Symfony y Django estan entre mis favoritos. Aficionado a la montaña, la bicicleta, y el comer, de eso que no falte.