Sécurité du cycle DevOps
Sécurisation des processus d'intégration et de déploiement dans un environnement DevOps
Notions théoriques
L'intégration de la sécurité dans le cycle DevOps est une approche appelée DevSecOps.
Elle vise à intégrer des pratiques de sécurité dès les premières étapes du développement logiciel, plutôt que d'ajouter des contrôles de sécurité à la fin du processus.
Principes du DevSecOps
Le DevSecOps repose sur plusieurs principes fondamentaux :
- Automatisation de la sécurité : Intégrer des outils de sécurité dans les pipelines CI/CD.
- Détection précoce des vulnérabilités : Analyser le code et les dépendances dès le développement.
- Collaboration entre équipes : Développeurs, administrateurs système et experts en sécurité travaillent ensemble.
- Surveillance continue : Mettre en place des outils de monitoring pour détecter les menaces en temps réel.
Sécurité dans le pipeline CI/CD
Un pipeline CI/CD (Intégration Continue / Déploiement Continu) est un ensemble d'étapes automatisées permettant de tester et déployer une application. L'intégration de la sécurité dans ce pipeline passe par :
- Analyse statique du code (SAST) : Outils comme SonarQube ou Snyk pour détecter les failles dans le code source.
- Analyse dynamique des applications (DAST) : Tests de sécurité sur l'application en cours d'exécution.
- Gestion des dépendances : Vérification des bibliothèques utilisées pour identifier les vulnérabilités connues.
- Contrôle des accès et gestion des secrets : Utilisation de coffres-forts numériques comme HashiCorp Vault.
- Tests d'intrusion automatisés : Simulation d'attaques pour identifier les faiblesses du système.
Bonnes pratiques du DevSecOps
- Éviter les secrets en dur : Ne pas stocker de mots de passe ou de clés API dans le code source.
- Utiliser des images Docker sécurisées : Privilégier des images officielles et régulièrement mises à jour.
- Activer les logs et audits : Conserver une traçabilité des événements pour détecter les anomalies.
- Appliquer le principe du moindre privilège : Limiter les permissions des utilisateurs et des services.
Exemple pratique
Il est possible d'intégrer la s écurité dans un pipeline CI/CD en utilisant GitHub Actions et Trivy pour analyser les vulnérabilités d'une image Docker avant son déploiement.
Étape 1 : Création d'un fichier de workflow GitHub Actions
Créer un fichier .github/workflows/security-scan.yml
dans un dépôt GitHub contenant :
name: Security Scan
on:
push:
branches:
- main
jobs:
scan:
runs-on: ubuntu-latest
steps:
- name: Récupération du code
uses: actions/checkout@v3
- name: Installation de Trivy
run: |
sudo apt-get install -y wget
wget https://github.com/aquasecurity/trivy/releases/latest/download/trivy_0.44.0_Linux-64bit.tar.gz
tar -xvf trivy_0.44.0_Linux-64bit.tar.gz
sudo mv trivy /usr/local/bin/
- name: Analyse de l'image Docker
run: trivy image mon-image:latest
Étape 2 : Exécution du pipeline
Pousser le fichier dans le dépôt et observer l'exécution du workflow dans l'onglet "Actions" de GitHub.
Étape 3 : Analyse des résultats
Si des vulnérabilités sont détectées, elles seront affichées avec leur niveau de gravité (faible, moyen, critique).
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Objectif du TP
L'objectif de ce TP est de sécuriser un pipeline CI/CD en mettant en place une analyse des vulnérabilités sur le code source et les dépendances d'un projet Node.js.
Ce TP utilise GitHub Actions et Snyk pour détecter les failles de sécurité dans le code et les bibliothèques utilisées.
Étape 1 : Création d'un projet Node.js et initialisation d'un dépôt Git
Créer un projet Node.js et l'ajouter à un dépôt GitHub.
- Ouvrir un terminal et exécuter les commandes suivantes :
mkdir projet-securise
cd projet-securise
npm init -y
- Initialiser un dépôt Git et créer un fichier
.gitignore
:
git init
echo "node_modules/" > .gitignore
git add .
git commit -m "Initialisation du projet"
- Créer un dépôt GitHub et le lier au projet local :
git remote add origin https://github.com/utilisateur/projet-securise.git
git branch -M main
git push -u origin main
Cette étape permet de mettre en place un projet Node.js et de l'envoyer sur GitHub.
npm init -y
génère un fichierpackage.json
avec les paramètres par défaut..gitignore
empêche l'envoi du dossiernode_modules/
dans le dépôt.git remote add origin
lie le dépôt local au dépôt distant sur GitHub.git push -u origin main
envoie les fichiers sur la branche principale du dépôt GitHub.
Une fois terminé, vérifier sur GitHub que le projet est bien en ligne.
Étape 2 : Installation de Snyk pour l'analyse des vulnérabilités
Snyk est un outil permettant d'identifier les failles de sécurité dans les dépendances d'un projet.
- Installer Snyk en tant que dépendance de développement :
npm install --save-dev snyk
- Ajouter un script dans le fichier
package.json
pour exécuter l'analyse de sécurité :
"scripts": {
"test": "echo \"No test specified\" && exit 0",
"security-check": "snyk test"
}
- Tester l'analyse de sécurité localement :
npx snyk test
L'installation de Snyk permet d’analyser les dépendances du projet.
npm install --save-dev snyk
installe Snyk en tant que dépendance de développement.- Le script
"security-check": "snyk test"
permet d'exécuter l'analyse avecnpm run security-check
. npx snyk test
lance Snyk et affiche les vulnérabilités détectées.
Si des vulnérabilités sont trouvées, elles apparaissent avec leur niveau de gravité.
Étape 3 : Création d'un workflow GitHub Actions pour exécuter Snyk
Créer un fichier .github/workflows/security.yml
pour automatiser l'analyse des vulnérabilités à chaque push.
- Créer les dossiers nécessaires et le fichier de workflow :
mkdir -p .github/workflows
nano .github/workflows/security.yml
- Ajouter le contenu suivant dans
security.yml
:
name: Security Scan
on:
push:
branches:
- main
jobs:
security:
runs-on: ubuntu-latest
steps:
- name: Récupération du code
uses: actions/checkout@v3
- name: Installation de Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Installation des dépendances
run: npm install
- name: Analyse des vulnérabilités avec Snyk
run: npx snyk test
- Ajouter et pousser le fichier dans le dépôt :
git add .github/workflows/security.yml
git commit -m "Ajout du workflow de sécurité"
git push origin main
Ce workflow GitHub Actions exécute Snyk à chaque push sur la branche main
.
actions/checkout@v3
récupère le code source.actions/setup-node@v3
installe Node.js.npm install
installe les dépendances du projet.npx snyk test
exécute l'analyse de sécurité.
Une fois le fichier poussé, vérifier dans l'onglet "Actions" de GitHub que le workflow s'exécute correctement.
Étape 4 : Vérification des résultats et correction des vulnérabilités
- Aller dans l'onglet "Actions" du dépôt GitHub et ouvrir le workflow "Security Scan".
- Vérifier les résultats de l'analyse de Snyk.
- Si des vulnérabilités sont détectées, mettre à jour les dépendances avec :
npm audit fix
- Relancer l'analyse pour vérifier que les failles ont été corrigées :
npx snyk test
L'analyse de Snyk signale les vulnérabilités présentes dans les dépendances du projet.
npm audit fix
tente de corriger automatiquement les failles en mettant à jour les bibliothèques concernées.npx snyk test
permet de vérifier si les vulnérabilités ont bien été corrigées.
Si certaines failles persistent, il peut être nécessaire de mettre à jour manuellement certaines dépendances.
Étape 5 : Ajout d'un badge de sécurité dans le README
Ajouter un badge GitHub Actions dans le fichier README.md
pour afficher le statut du workflow.
- Ouvrir le fichier
README.md
et ajouter la ligne suivante en haut du fichier :

- Ajouter et pousser les modifications :
git add README.md
git commit -m "Ajout du badge de sécurité"
git push origin main
L'ajout d'un badge permet de voir rapidement si le workflow de sécurité est en succès ou en échec.
- Le badge est généré automatiquement par GitHub Actions.
- Il affiche le statut du dernier run du workflow
security.yml
.
Une fois le fichier poussé, vérifier sur GitHub que le badge s'affiche bien dans le README.md
.