La gestion des fichiers et des répertoires sous Shell Bash¶
1. Objectif du cours¶
Comprendre les bonnes pratiques de gestion des fichiers et répertoires en Bash et appliquer des mesures de sécurité pour prévenir les attaques Web Shell. Acquérir des habitudes de codage sûres et efficaces pour écrire des scripts robustes.
2. Notions et définitions essentielles¶
- Web Shell : script installé dans un serveur Web exploitant des vulnérabilités pour exécuter du code à distance.
- Least privilege (moindre privilège) : donner uniquement les droits nécessaires aux services/utilisateurs.
- Globbing : expansion de motifs par le shell pour générer des listes de fichiers.
- Null-delimited output : sortie où les noms sont séparés par un caractère NUL afin de gérer espaces et nouvelles lignes.
3. Fonctionnement et principes¶
- Sécurité préventive : mises à jour régulières, scannage des vulnérabilités, désactivation des services inutiles, DMZ et contrôle d’accès au panneau d’administration.
- Sanitation des entrées : toute donnée utilisateur doit être contrôlée et nettoyée ; rejeter les caractères non alphanumériques ou caractères interdits.
- Confiance minimale dans l’environnement : ne pas invoquer d’utilitaires uniquement par leur nom (risque de trojan via PATH), éviter de stocker les mots de passe en clair dans les scripts.
- Performance et robustesse : préférer les builtins Bash quand possible, limiter les pipes inutiles, utiliser les mécanismes sûrs (quoting, tableaux, substitution de processus, sorties délimitées par NUL) pour traiter correctement les noms de fichiers complexes.
4. Commandes et manipulations¶
Regroupe les commandes/techniques réellement citées dans le document, par procédure.
- Prévenir les trojans / invocations sûres :
- Utiliser le chemin absolu pour les commandes (ex. /bin/ls $HOME) et soigner la variable PATH (éviter “.”).
-
Exemple de PATH problématique : PATH=".:/bin:...".
-
Entrée utilisateur et exécution sûre :
- Lister en protégeant l’argument : /bin/ls -l "$name".
-
Éviter les évaluations non contrôlées (eval, backticks).
-
CGI minimal (exemple d’entête) :
-
echo "Content-type: text/html"; echo "" et commande système pour affichage (ex. uptime -a).
-
Pipes et redirections optimisées :
- Remplacer cat file | command par command < file.
- Préférer awk/sed adaptés plutôt que grep | awk ou grep | sed.
-
Remplacer command | sort | uniq par command | sort -u, et command | grep pattern | wc -l par command | grep -c pattern.
-
Traitement sûr des noms de fichiers complexes :
- Utiliser find -print0 | xargs -0 rm -f.
-
Exemple de boucle sécurisée : find . -type f -print0 | while IFS= read -r -d $'' filename; do …; done
-
Substitution et temporaires :
- $(command) plutôt que
command; substitution de processus <(command). -
Utiliser mktemp pour créer des répertoires/fichiers temporaires et les supprimer ensuite.
-
Structuration et tests :
- Définir des fonctions et gérer les arguments avec shift (ex. process_file() { local -r input_file="$1"; shift; ... }).
- Préférer [[ ... ]] et (( ... )) pour les conditions plus sûres et expressives.
- Placer set -e en haut du script pour arrêter en cas d’erreur.
5. Sécurité et bonnes pratiques¶
- Mettre à jour régulièrement OS et applications hébergées.
- Appliquer la politique du moindre privilège pour les comptes et les répertoires Web.
- Isoler (DMZ) l’hôte exposé d’Internet du réseau interne.
- Désactiver services inutiles, désactiver l’indexation des répertoires, restreindre l’accès aux consoles d’administration et changer les identifiants par défaut.
- Valider strictement toutes les entrées utilisateur et rejeter les caractères suspects.
- Utiliser un pare-feu d’application Web / reverse proxy pour améliorer sécurité, performances et fiabilité.
- Ne pas stocker les mots de passe en clair dans les scripts ; si impossible, rendre le nom de la variable difficile à repérer et envisager des alternatives (outils dédiés).
6. Points essentiels à retenir pour le TSSR¶
- Un Web Shell permet l’exécution distante ; la prévention repose sur mises à jour, contrôle d’accès et validation des entrées.
- Ne jamais faire confiance à l’environnement : préciser le chemin des exécutables et éviter “.” dans PATH.
- Ne pas mettre de mots de passe en clair dans les scripts.
- Toujours citer/mettre entre guillemets les expansions de variables pour éviter le word-splitting.
- Préférer les fonctions, shift pour gérer les arguments et localiser les variables (local -r).
- Limiter les pipes inutiles et privilégier les builtins du Shell pour les petites opérations.
- Gérer correctement les noms de fichiers contenant espaces/nouvelles lignes via sorties null-delimited.
- Utiliser $(...) au lieu de backticks et la substitution de processus pour éviter fichiers temporaires.
- Utiliser mktemp pour créer des répertoires temporaires sûrs et les supprimer après usage.
- Mettre set -e au début des scripts pour arrêter en cas d’erreur non gérée.
7. Tableau récapitulatif¶
| Problème | Mauvaise pratique | Alternative recommandée |
|---|---|---|
| Invocation de commande (trojan) | Appeler juste "ls" | Appeler avec chemin absolu (/bin/ls) |
| Traitement de fichiers | ls pour parser listes | find -print0 + xargs -0 ou globbing |
| Pipes inutiles | cat file | command < file |
| Substitution de commande | cmd (backticks) |
$(cmd) |
| Variables d’environnement | variables normales en MAJUSCULE | Réserver MAJUSCULE aux variables d’environnement |
8. Vérifications pratiques¶
- Vérifier qu’un script s’arrête automatiquement si une commande échoue (comportement de set -e).
- Tester la suppression/traitement de fichiers avec find -print0 | xargs -0 pour confirmer gestion correcte des noms avec espaces.
- Vérifier l’existence et l’accès du répertoire/fichier créé par mktemp après sa création.
- Contrôler que l’appel d’une commande dans une condition if s’exécute et retourne correctement avant d’enchaîner l’action.
9. Flashcards Anki¶
Qu'est-ce qu'un Web Shell ? :: Un script implanté sur un serveur Web permettant l'exécution de commandes à distance.
Pourquoi éviter d'avoir "." dans PATH ? :: Parce que cela permet l'exécution d'un binaire malveillant présent dans le répertoire courant.
Que recommande-t-on pour stocker un mot de passe si absolument nécessaire ? :: Utiliser un nom de variable compliqué et préférer une alternative logique plutôt que le stocker en clair.
Quelle politique réduire le risque d'élévation d'autorité sur un serveur Web ? :: La politique du moindre privilège.
Que faut-il faire systématiquement sur les entrées utilisateur ? :: Effectuer une validation stricte et nettoyer les entrées en rejetant caractères non autorisés.
Quelle option mettre en tête d'un script pour quitter sur toute erreur ? :: set -e force la sortie du script dès qu'une commande retourne un code non nul.
Quel mécanisme utiliser pour gérer correctement les noms de fichiers avec espaces ou nouvelles lignes ? :: Utiliser une sortie délimitée par NUL (print0) et xargs -0 ou lecture délimitée par NUL.
Pourquoi préférer $(command) à command ? :: Parce que $(...) est plus lisible et permet une meilleure imbrication des commandes.
Quelle pratique évite les pipes inutiles comme cat file | command ? :: Rediriger l'entrée avec command < file.
Quand utiliser mktemp ? :: Pour créer de manière sûre un répertoire ou fichier temporaire à utiliser puis supprimer.