Sécuriser le déploiement de vos clés privée en production avec Symfony

Sécurisez vos secrets avec PHP
,

La sécurisation de la clé privée lors du déploiement en production est cruciale pour garantir la confidentialité et l’intégrité de vos secrets. Voici un rapide guide pour sécuriser ce processus dans un environnement de déploiement continu (CI/CD) via Azure, AWS, GCP ou même Gitlab CI/CD sur une app Symfony.

Initialisation du système des secrets

Pour commencer, vous devez initialiser le système de secrets dans votre projet Symfony. Exécutez la commande suivante :

php bin/console secrets:generate-keys

Cette commande crée deux fichiers de clés (public.pem et private.pem) dans le répertoire config/secrets/{env}. Quelques rappels de sécurité importants :

  • Séparation des environnements : Gardez vos secrets distincts entre les environnements de développement, de test et de production.
  • Sécurité des clés : Protégez les clefs privées private.pem et évitez de les inclure dans votre système de contrôle de version. (Sinon Gitleaks va pas être content.)
  • Rotations de secrets : Mettez en place un processus régulier pour la rotation des secrets afin de minimiser les risques en cas de compromission.

La première chose à faire est d’ajouter la clef privée dans le .gitignore et la stocker dans un de vos environnements de gestion de secrets préférés.

Pour rappel ensuite pour créer des secrets :

php bin/console secrets:set DATABASE_URL
Pour ajouter un secret, utilisez la commande secrets:set. Par exemple, pour ajouter un secret nommé DATABASE_URL :

Utiliser votre service de gestion des secrets

Utilisez des services de gestion des secrets proposés, par exemple, par les principaux fournisseurs de cloud pour stocker et gérer vos clés privées :

  • AWS Secrets Manager,
  • Azure Key Vault,
  • Google Secret Manager

Ainsi dans votre configuration de CI/CD (exemple avec gitlab) la récupération de la clef est très simple !

stages:
- build
- deploy

build:
stage: build
script:
- aws secretsmanager get-secret-value --secret-id YOUR_SECRET_ID --query 'SecretString' --output text > config/secrets/prod/private.pem
- php bin/console secrets:decrypt-to-local --env=prod
Avec AWS Secrets Manager

Pour en savoir plus, lien vers la doc du CLI AWS.

stages:
- build
- deploy

build:
stage: build
script:
- az keyvault secret show --name YOUR_SECRET_NAME --vault-name YOUR_VAULT_NAME --query 'value' -o tsv > config/secrets/prod/private.pem
- php bin/console secrets:decrypt-to-local --env=prod
Avec Azure Key Vault

Pour en savoir plus, lien vers la docu du CLI Azure.

stages:
- build
- deploy

build:
stage: build
script:
- gcloud secrets versions access latest --secret=YOUR_SECRET_NAME > config/secrets/prod/private.pem
- php bin/console secrets:decrypt-to-local --env=prod
Avec Google Secret Manager

Pour en savoir plus, lien vers la doc du CLI Google Cloud.

Bien sûr si vous avez votre propre gestion de secrets vous pouvez utiliser votre propre solution pour acheminer la clé privée sur vos environnements de prod. Par exemple, si vous les définissez temporairement dans des variables d’environnements

stages:
- build
- deploy

build:
stage: build
script:
- echo "$PRIVATE_KEY" > config/secrets/prod/private.pem
- php bin/console secrets:decrypt-to-local --env=prod

Chiffrer vos clefs privées

D’aucun dirait il n’y a pas de bonnes ou de mauvaises solutions. Mais ici il y a beaucoup de mauvaises solutions. D’ailleurs je vous déconseille de stocker vos secrets non chiffré. Que ce soit dans les services cloud dédiés, ou vos propres solutions.

Il est important de chiffrer tout cela avec une clef privée maître par projet ou par déploiement, en fonction de votre usage. Voir ci-dessous pour le faire simplement.

openssl aes-256-cbc -in private.pem -out private.pem.enc -k YOUR_ENCRYPTION_PASSWORD
Chiffrement AES via openssl

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *