Gestion des secrets avec Symfony

Biig
3 min readDec 5, 2019

--

Chez Biig nous utilisons beaucoup d’API tierces. Elles ont souvent des credentials que nous devons partager entre développeurs mais également avec les environnements de production, pré-production, et staging (déployés à la volée). Il y a plusieurs solutions, l’une d’entre elle fonctionne bien pour les environment locaux : mocker vos APIs externes, mais cela ne suffit pas toujours. Et avoir des stagings n’utilisant pas les vraies APIs n’est pas très logique.

Chez Biig nous avons opté depuis quelque temps pour une solution à base de secrets. Nous chiffrons nos secrets à l’aide d’openssl. Mais dans la nouvelle version de Symfony (4.4) fraîchement release, on nous propose une nouvelle méthode bien plus simple et efficace pour arriver à nos fins. Cette méthode utilise la nouvelle librairie de chiffrement libsodium. Voyons en détail comment nous y prendre.

Générer vos secrets

Utilisez la commande `secret:generate-keys` pour créer vos clés :

$ bin/console secret:generate-keys
$ APP_ENV=prod bin/console secret:generate-keys

Le fonctionnement est simple et astucieux. Ceci va vous générer des clés en dev et en prod. Dans le but de chiffrer vos secrets dans l’un ou l’autre des environnements. (en toute logique vous devriez avoir des credentials différents pour votre environnement de développement)

À chaque fois, c’est deux clés qui seront générée. La clé publique vous permet de chiffrer les secrets. La clé privée vous permet de les déchiffrer.

⚠️ Vous ne devez en aucun cas commiter la clé privée de production. Ajoutez tout de suite `/prod.decrypt.private.php` à votre fichier .gitignore — si ce n’est pas déjà le cas (dans le bootstrap de projet de Symfony ce fichier est ignoré).

Créez vos secrets (le nom est le même que la variable d’environnement correspondante).

$ bin/console secret:set AWS_KEY_ID
$ bin/console secrets:set AWS_SECRET_ACCESS_KEY

Des fichiers sont générés, n’hésitez pas à les commiter. Naturellement pour spécifier vos credentials de production, vous pouvez utiliser ces commandes préfixées de APP_ENV=prod, et toujours commiter les fichiers chiffrés générés.

Utiliser vos secrets

En développement

Libre à vous le choix, mais vous n’êtes pas obligé de commiter vos clés non plus. Un outil tel que 1password pour enregistrer votre clé privée sera probablement au top et vous évitera d’avoir secrets et clés de déchiffrement au même endroit.

Quoi qu’il en soit, autant en environnement de développement que production, il vous faudra cette clé présente dans le projet pour pouvoir déchiffrer les secrets.

Afin de rapatrier les secrets, la première commande à lancer est la suivante :

$ bin/console secrets:decrypt-to-local

Si vous spécifiez des valeurs par défaut pour vos variables dans le fichier `.env`, cette commande ne fera rien et conservera les valeurs par défaut.

En production

Rappelez-vous qu’il est hors de question de commit la clé privée de production. Vous devrez trouver un moyen sécurisé pour faire arriver la clé privée dans le bon dossier. La suite est la même :

$ bin/console secrets:decrypt-to-local

Et pour finir, en environnement de production il est recommandé d’utiliser ensuite la commande `composer dump-env` pour enregistrer tout votre environnement sous forme de fichier optimisé (et sécurisé par rapport à certains types d’attaques).

Bonus

Ne partez pas encore, nous avons une dernière astuce à vous dévoiler. Symfony fourni une commande qui permet de générer de nouvelles clés en modifiant automatiquement tous les secrets, pratique !

--

--

Biig

Conseil, conception et réalisation de stratégies digitales. we think _ we build — https://biig.fr/