Chapitre 9.1 - Sécurisation des Permissions
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Appliquer le principe du moindre privilège
- Sécuriser les permissions fichiers
- Comprendre les risques des permissions larges
- Auditer les permissions système
- Corriger les permissions incorrectes
Principe du Moindre Privilège
Concept
Donner seulement les permissions nécessaires, rien de plus.
Avantages:
- Réduction surface d'attaque
- Limitation des dégâts
- Conformité sécurité
Permissions Sécurisées
Fichiers Normaux
# Fichiers de configuration
chmod 644 fichier.conf # rw-r--r--
chmod 600 fichier.conf # rw------- (privé)
# Scripts exécutables
chmod 755 script.sh # rwxr-xr-x
chmod 700 script.sh # rwx------ (privé)
# Fichiers sensibles
chmod 600 .ssh/id_rsa # Clé privée
chmod 644 .ssh/id_rsa.pub # Clé publique
chmod 700 .ssh/ # Répertoire SSH
Répertoires
# Répertoires normaux
chmod 755 repertoire/ # rwxr-xr-x
# Répertoires privés
chmod 700 repertoire/ # rwx------
# Répertoires partagés
chmod 775 shared/ # rwxrwxr-x
chmod 1777 /tmp # Sticky bit
Permissions Dangereuses
À Éviter
# 777 - Tous les droits (DANGEREUX!)
chmod 777 fichier # ÉVITER!
# SUID/SGID inutiles
chmod u+s script.sh # Vérifier nécessité
# Répertoires world-writable
chmod 777 repertoire/ # ÉVITER!
Détecter
# Fichiers avec permissions larges
find /home -type f -perm -o+w
find / -type f -perm 777 2>/dev/null
# Répertoires world-writable
find / -type d -perm -o+w ! -path "/proc/*" 2>/dev/null
# Fichiers SUID/SGID
find / -type f -perm /4000 2>/dev/null # SUID
find / -type f -perm /2000 2>/dev/null # SGID
Sécurisation SSH
Permissions Correctes
# Répertoire .ssh
chmod 700 ~/.ssh
# Clés privées
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519
# Clés publiques
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
# Config
chmod 600 ~/.ssh/config
Vérification
# Script de vérification
#!/bin/bash
SSH_DIR="$HOME/.ssh"
if [ -d "$SSH_DIR" ]; then
# Vérifier permissions répertoire
PERMS=$(stat -c "%a" "$SSH_DIR")
if [ "$PERMS" != "700" ]; then
echo "ATTENTION: .ssh devrait être 700, actuellement $PERMS"
fi
# Vérifier clés privées
for key in "$SSH_DIR"/id_*; do
if [ -f "$key" ] && [[ "$key" != *.pub ]]; then
PERMS=$(stat -c "%a" "$key")
if [ "$PERMS" != "600" ]; then
echo "ATTENTION: $key devrait être 600, actuellement $PERMS"
fi
fi
done
fi
Sécurisation Cron
Permissions Crontab
# Crontab utilisateur
chmod 600 ~/.crontab # Si fichier externe
# Vérifier crontab système
ls -l /etc/crontab
ls -l /etc/cron.d/*
Environnement Cron
# Crontab sécurisé
PATH=/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com
# Utiliser chemins absolus
0 2 * * * /usr/local/bin/backup.sh
# Rediriger sortie
0 2 * * * /usr/local/bin/script.sh > /var/log/script.log 2>&1
# Ne pas utiliser variables non définies
Scripts Cron Sécurisés
#!/bin/bash
# Script cron sécurisé
# Options sécurité
set -euo pipefail
# Chemins absolus
SCRIPT_DIR="/usr/local/bin"
LOG_FILE="/var/log/mon-script.log"
# Fonction de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE"
}
# Vérifications
if [ ! -f "$SCRIPT_DIR/config" ]; then
log "ERREUR: Fichier config manquant"
exit 1
fi
# Traitement...
log "Début traitement"
# ...
log "Fin traitement"
Audit des Permissions
Script d'Audit
#!/bin/bash
# Audit des permissions
echo "=== Fichiers world-writable ==="
find /home -type f -perm -o+w 2>/dev/null
echo "=== Répertoires world-writable ==="
find /home -type d -perm -o+w 2>/dev/null
echo "=== Fichiers SUID ==="
find /home -type f -perm /4000 2>/dev/null
echo "=== Fichiers SGID ==="
find /home -type f -perm /2000 2>/dev/null
echo "=== Permissions SSH ==="
if [ -d ~/.ssh ]; then
ls -la ~/.ssh
fi
Correction Automatique
#!/bin/bash
# Corriger permissions SSH
SSH_DIR="$HOME/.ssh"
if [ -d "$SSH_DIR" ]; then
chmod 700 "$SSH_DIR"
# Clés privées
find "$SSH_DIR" -name "id_*" ! -name "*.pub" -exec chmod 600 {} \;
# Clés publiques
find "$SSH_DIR" -name "*.pub" -exec chmod 644 {} \;
# authorized_keys
[ -f "$SSH_DIR/authorized_keys" ] && chmod 600 "$SSH_DIR/authorized_keys"
# config
[ -f "$SSH_DIR/config" ] && chmod 600 "$SSH_DIR/config"
echo "Permissions SSH corrigées"
fi
Bonnes Pratiques
Fichiers
- 644 pour fichiers normaux
- 600 pour fichiers sensibles
- 755 pour scripts exécutables
- 700 pour scripts privés
Répertoires
- 755 pour répertoires normaux
- 700 pour répertoires privés
- 775 pour répertoires partagés (avec groupe)
- 1777 pour /tmp (sticky bit)
Vérifications
- Auditer régulièrement
- Automatiser avec scripts
- Documenter exceptions
- Réviser après changements
Résumé
Dans ce chapitre, vous avez appris:
Moindre privilège: Permissions minimales nécessaires
Sécurisation: Permissions appropriées selon type
Détection: Trouver permissions dangereuses
SSH: Permissions correctes pour clés et config
Cron: Sécurisation scripts et environnement
Audit: Scripts pour vérifier et corriger
Prochaines Étapes
Chapitre 9.2: Configuration sudo
Chapitre 9.3: Pare-feu
Chapitre créé le: Décembre 2024