Passer au contenu principal

Sécurité (Linux)

Moindre privilège

Le principe du moindre privilège : chaque processus, utilisateur ou service ne dispose que des droits strictement nécessaires à sa fonction. Appliqué concrètement, il réduit l'impact d'une compromission : un processus limité ne peut pas escalader vers root même s'il est exploité.

sudo granulaire

Plutôt que d'accorder un accès sudo complet, restreindre à des commandes précises. La configuration se fait dans /etc/sudoers via visudo, qui vérifie la syntaxe avant de sauvegarder.

visudo                               # éditer sudoers avec vérification
visudo -f /etc/sudoers.d/romain      # fichier spécifique (recommandé)

Règles fine-grained

# Autoriser romain à redémarrer nginx uniquement
romain ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

# Autoriser le groupe "deployers" à lancer un script de déploiement
%deployers ALL=(ALL) NOPASSWD: /usr/local/bin/deploy.sh

# Interdire l'accès à un shell via sudo
romain ALL=(ALL) ALL, !/bin/bash, !/bin/sh

Utilisateurs dédiés par service

Chaque service doit tourner sous son propre utilisateur système, sans shell de connexion et sans répertoire home accessible.

adduser --system --no-create-home --shell /usr/sbin/nologin mon-service
# /etc/systemd/system/mon-service.service
[Service]
User=mon-service
Group=mon-service

Nginx, PostgreSQL, Redis font cela par défaut à l'installation. Pour les services maison, c'est à configurer explicitement.

Fichiers setuid et setgid

Un fichier setuid s'exécute avec les droits de son propriétaire, pas de l'utilisateur qui le lance. passwd et sudo en font partie légitimement. Tout setuid root inattendu est suspect.

find / -perm -4000 -type f 2>/dev/null    # fichiers setuid
find / -perm -2000 -type f 2>/dev/null    # fichiers setgid

Linux Capabilities

Les capabilities permettent d'accorder un privilège précis à un binaire sans lui donner tous les droits root. Exemple : écouter sur un port < 1024 sans être root.

getcap /usr/bin/ping                                    # voir les capabilities d'un binaire
setcap cap_net_bind_service=ep /usr/bin/mon-serveur     # donner NET_BIND_SERVICE
getcap -r / 2>/dev/null                                 # scanner tous les binaires

En pratique

Deux réflexes à ancrer : tout service installé manuellement a son utilisateur dédié, et tout accès sudo est restreint à la commande précise nécessaire plutôt qu'accordé en ALL. Sur un parc, auditer régulièrement les droits sudo (sudo -l -U username) et les binaires setuid (find / -perm -4000). Une escalade de privilèges exploite presque toujours un setuid oublié, un sudo trop permissif ou un service qui tourne en root par habitude.