Préparation du VPS pour le CI/CD

Informations
- Mainteneur : Louis MEDO
- Date de création : 29/03/2026
Contexte
Ce document décrit les étapes nécessaires pour configurer le serveur VPS afin de recevoir les déploiements automatisés depuis GitHub Actions. L'objectif est de créer un utilisateur système restreint couplé à un script de sécurité (Wrapper) permettant d'utiliser une seule clé SSH d'organisation pour déployer dynamiquement tous les portfolios de la classe, sans compromettre le cloisonnement du serveur.
Sommaire
- Création du compte de service restreint
- Cloisonnement des droits sur les dossiers web
- Création du script Wrapper de sécurité
- Verrouillage de la clé SSH
1. Création du compte de service restreint
-
Créer un utilisateur dédié sans mot de passe. Nous créons un utilisateur nommé
github-deploy-portfolioqui servira uniquement aux automatisations.sudo: Exécute la commande avec les droits d'administrateur.adduser: Utilitaire pour créer un nouvel utilisateur système.--disabled-password: Empêche la connexion par mot de passe, forçant l'utilisation exclusive d'une clé SSH asymétrique pour se connecter.--gecos "": Ignore les questions interactives (nom, numéro de téléphone) lors de la création.
2. Cloisonnement des droits sur les dossiers web
-
Attribuer la propriété des dossiers au compte de service. Le dossier contenant les portfolios doit pouvoir être modifié par l'utilisateur CI/CD, tout en restant lisible par le serveur web Apache (
www-data).chown: Commande pour modifier le propriétaire (Change owner).-R: Applique la modification de manière récursive à tous les sous-dossiers et fichiers.github-deploy-portfolio:www-data: Définitgithub-deploy-portfoliocomme propriétaire principal etwww-datacomme groupe propriétaire. -
Verrouiller les permissions (Principe de moindre privilège).
chmod: Modifie les permissions d'accès aux fichiers.754: Le propriétaire a tous les droits (7 = lire, écrire, exécuter), le groupe web peut lire et exécuter (5), et les autres utilisateurs du système peuvent uniquement lire (4).
3. Création du script Wrapper de sécurité
-
Rédiger le script d'interception. Ce script va récupérer le nom du dépôt envoyé par GitHub et empêcher les attaques par injection de chemin.
su - github-deploy-portfolio: Bascule sur la session de notre nouvel utilisateur.mkdir: Crée le répertoirescripts.nano: Ouvre un éditeur de texte dans le terminal. -
Ajouter la logique de déploiement. Insérez le code suivant dans le fichier
deploy_wrapper.sh:#!/bin/bash ETUDIANT="$SSH_ORIGINAL_COMMAND" if [[ ! "$ETUDIANT" =~ ^[a-zA-Z0-9-]+$ ]]; then exit 1 fi git -C "/var/www/portfolio/$ETUDIANT" pull origin main#!/bin/bash: Indique au système d'utiliser Bash pour exécuter le script.$SSH_ORIGINAL_COMMAND: Variable système contenant le texte exact envoyé par GitHub (ici, le nom du dépôt).=~ ^[a-zA-Z0-9-]+$: Expression régulière (Regex) de sécurité. Elle vérifie que le nom contient uniquement des lettres, chiffres et tirets.exit 1: Arrête immédiatement le script avec une erreur si la validation échoue.git -C ... pull ...: Le flag-Cindique à Git de se déplacer dans le dossier spécifique à l'étudiant avant de télécharger les modifications. -
Rendre le script exécutable.
+x: Ajoute le droit d'exécution au fichier.
4. Verrouillage de la clé SSH
-
Préparer le répertoire SSH de l'utilisateur.
chmod 700: Restreint l'accès au dossier contenant les clés de sécurité au seul propriétaire (lecture, écriture, exécution). -
Ajouter et restreindre la clé publique de l'organisation GitHub. Collez la clé publique Ed25519 dans
authorized_keys.Avant le texte de la clé, ajoutez les options de restriction pour forcer l'utilisation du wrapper :command="/home/github-deploy-portfolio/scripts/deploy_wrapper.sh",no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAAC3...command="...": Redirige de force toute connexion utilisant cette clé vers notre scriptdeploy_wrapper.sh.no-pty: Interdit l'attribution d'un terminal interactif.no-port-forwarding/no-X11-forwarding/no-agent-forwarding: Bloque les fonctionnalités avancées de SSH pour empêcher la création de tunnels réseaux malveillants.