Nuevo en Symfony 4.4: Encriptación de secretos

Almacenar información sensible como contraseñas, tokens y certificados es algo complicado. No puedes almacenarlos en archivos de configuración tradicionales y tampoco puedes usar variables de entorno, ya que es demasiado fácil acceder a su valor en claro. Por eso en Symfony 4.4 hemos añadido una nueva funcionalidad para gestionar información secreta y encriptada.

Imagina que en tu aplicación quieres mantener en secreto el valor de la variable de entorno DATABASE_URL para no mostrar los datos de conexión con la base de datos. El proceso sería el siguiente:

Paso 1. Genera las claves usadas para encriptar/desencriptar secretos (esta funcionalidad utiliza la criptografía asimétrica mediante la librería libsodium):

$ php bin/console secrets:generate-keys

Este comando genera un par de claves en config/secrets/dev/ (or config/secrets/prod/). La clave pública se usa para encriptar secretos y debes añadirla al repositorio de código. La clave privada se usa para desencriptar y por tanto, no debe ser subida al repositorio ni compartida de ninguna manera.

Paso 2. Sube la clave privada al servidor mediante SSH o cualquier otro método seguro. Almacénala en el mismo directorio config/secrets/<entorno>/.

Paso 3. Crea un nuevo secreto para almacenar los contenidos de DATABASE_URL:

$ php bin/console secrets:set DATABASE_URL
 
 Please type the secret value:
 > **************
 
[OK] Secret "DATABASE_URL" encrypted in "config/secrets/dev/"; you can commit it.

Cada secreto se guarda en su propio archivo dentro del directorio config/secrets/<entorno>/. Puedes subir estos archivos al repositorio porque su contenido no es accesible a menor que tengas la clave privada.

Y eso es todo. Ya puedes usar este secreto en tus archivos de configuración como si fuera cualquier otra variable de entorno. Symfony desencriptará su valor de forma transparente cuando sea necesario:

.. code-block:: yaml

# config/packages/doctrine.yaml
doctrine:
    dbal:
        url: "%env(DATABASE_URL)%"
        # ...

Ahora repite el paso 3 para cada opción de configuración que quieras convertir en un secreto. También puedes usar el resto de comandos relacionados con los secretos: secrets:remove para borrar secretos, secrets:list para mostrar todos los secretos disponibles en la aplicación, generate-keys --rotate para cambiar las claves y re-encriptar todos los secretos automáticamente, etc.

Esta funcionalidad fue contribuida por Tobias Schultze, Jérémy Derussé y Nicolas Grekas en el pull request #33997.


Fuente: New in Symfony 4.4: Encrypted Secrets Management

Comentarios

Publicada el

30 de octubre de 2019

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.