Aller au contenu principal

Hardening et sécurité système


Table des matières

  1. Principes de sécurité
  2. Hardening du système
  3. Gestion des utilisateurs et accès
  4. SELinux et AppArmor
  5. Audit et conformité
  6. Exercices pratiques


1 - Principes de sécurité

Defense in Depth

Principe du moindre privilège

ConceptApplication
UtilisateursDroits minimums nécessaires
ServicesComptes dédiés non-root
FichiersPermissions restrictives
RéseauPorts ouverts au minimum

Surface d'attaque

# Réduire la surface d'attaque

# 1. Services inutiles
systemctl list-unit-files --type=service --state=enabled

# 2. Ports ouverts
ss -tlnp

# 3. Packages installés
dpkg -l | wc -l # Debian
rpm -qa | wc -l # RHEL
Règle d'or

Si ce n'est pas nécessaire, désactivez-le ou supprimez-le.

🔝 Retour à la table des matières



2 - Hardening du système

Mises à jour de sécurité

# Debian/Ubuntu
apt update && apt upgrade -y
apt install unattended-upgrades
dpkg-reconfigure unattended-upgrades

# RHEL/CentOS
yum update -y
yum install yum-cron
systemctl enable --now yum-cron

Configuration sysctl

# /etc/sysctl.d/99-hardening.conf

# Désactiver le forwarding IP (sauf si routeur)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# Protection contre les attaques réseau
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Protection contre SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048

# Désactiver IPv6 si non utilisé
net.ipv6.conf.all.disable_ipv6 = 1

# Protection kernel
kernel.randomize_va_space = 2
kernel.exec-shield = 1
# Appliquer
sysctl -p /etc/sysctl.d/99-hardening.conf

Sécurisation du bootloader

# GRUB - Définir un mot de passe
grub2-setpassword

# Permissions
chmod 600 /boot/grub2/grub.cfg

# Désactiver le boot USB/CD dans le BIOS

Sécurisation SSH

# /etc/ssh/sshd_config

# Désactiver root login
PermitRootLogin no

# Authentification par clé uniquement
PasswordAuthentication no
PubkeyAuthentication yes

# Limiter les utilisateurs
AllowUsers admin deploy

# Port non standard (optionnel)
Port 2222

# Autres options de sécurité
Protocol 2
MaxAuthTries 3
LoginGraceTime 20
PermitEmptyPasswords no
X11Forwarding no
AllowTcpForwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
# Vérifier et redémarrer
sshd -t && systemctl restart sshd

Firewall avec iptables/nftables

# UFW (Ubuntu)
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

# iptables basique
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

🔝 Retour à la table des matières



3 - Gestion des utilisateurs et accès

Politique de mots de passe

# /etc/login.defs
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_MIN_LEN 12
PASS_WARN_AGE 14

# PAM - /etc/pam.d/common-password (Debian)
password requisite pam_pwquality.so retry=3 \
minlen=12 \
dcredit=-1 \
ucredit=-1 \
ocredit=-1 \
lcredit=-1

Verrouillage après échecs

# /etc/pam.d/common-auth
auth required pam_tally2.so deny=5 unlock_time=900 onerr=fail

# Vérifier les tentatives
pam_tally2 --user=username

# Débloquer un utilisateur
pam_tally2 --user=username --reset

Comptes système et services

# Créer un compte service
useradd -r -s /usr/sbin/nologin -d /nonexistent myservice

# Vérifier les shells
grep -v '/sbin/nologin\|/bin/false' /etc/passwd

# Désactiver les comptes inutilisés
usermod -L -e 1 olduser

Configuration sudo

# /etc/sudoers.d/admins
# Groupe admin avec tous les droits
%admins ALL=(ALL:ALL) ALL

# Utilisateur spécifique avec commandes limitées
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

# Logger toutes les commandes sudo
Defaults log_output
Defaults!/usr/bin/sudoreplay !log_output

🔝 Retour à la table des matières



4 - SELinux et AppArmor

SELinux (RHEL/CentOS)

# Vérifier le statut
getenforce
sestatus

# Modes
# Enforcing : Applique les règles
# Permissive : Log sans bloquer
# Disabled : Désactivé

# Changer temporairement
setenforce 0 # Permissive
setenforce 1 # Enforcing

# Configuration permanente
# /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted

Commandes SELinux courantes

# Voir les contextes
ls -Z /var/www/html

# Restaurer les contextes par défaut
restorecon -Rv /var/www/html

# Modifier un contexte
chcon -t httpd_sys_content_t /var/www/html/index.html

# Gérer les booléens
getsebool -a | grep httpd
setsebool -P httpd_can_network_connect on

# Analyser les logs
audit2why < /var/log/audit/audit.log
audit2allow -a # Générer une politique

AppArmor (Debian/Ubuntu)

# Statut
aa-status
apparmor_status

# Modes par profil
# enforce : Applique
# complain : Log sans bloquer

# Mettre en mode complain
aa-complain /etc/apparmor.d/usr.bin.firefox

# Mettre en mode enforce
aa-enforce /etc/apparmor.d/usr.bin.firefox

# Recharger les profils
apparmor_parser -r /etc/apparmor.d/usr.bin.firefox

Exemple de profil AppArmor

# /etc/apparmor.d/usr.local.bin.myapp
#include <tunables/global>

/usr/local/bin/myapp {
#include <abstractions/base>

/usr/local/bin/myapp mr,
/var/log/myapp/** rw,
/etc/myapp/** r,
/tmp/myapp-* rw,

network inet tcp,

deny /etc/passwd r,
deny /etc/shadow r,
}

🔝 Retour à la table des matières



5 - Audit et conformité

Auditd - Audit système

# Installer
apt install auditd # Debian
yum install audit # RHEL

# Règles d'audit
# /etc/audit/rules.d/audit.rules

# Surveiller les modifications de fichiers sensibles
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers

# Surveiller les commandes privilégiées
-a always,exit -F path=/usr/bin/sudo -F perm=x -k privileged

# Surveiller les modifications système
-w /etc/sysctl.conf -p wa -k sysctl

# Charger les règles
auditctl -R /etc/audit/rules.d/audit.rules

Analyser les logs d'audit

# Rechercher par clé
ausearch -k identity

# Rapport des événements
aureport --summary
aureport --login
aureport --auth

# Événements récents
ausearch -ts recent

Outils de scan de sécurité

# Lynis - Audit système
apt install lynis
lynis audit system

# OpenSCAP - Conformité
apt install libopenscap8 ssg-debian
oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_standard \
--results results.xml /usr/share/xml/scap/ssg/content/ssg-debian10-ds.xml

# Nmap - Scan réseau
nmap -sV -O localhost

# Rkhunter - Rootkit
rkhunter --check

Checklist de hardening

#!/bin/bash
# Script de vérification de sécurité basique

echo "=== Vérification de sécurité ==="

echo -n "SSH root login: "
grep -q "^PermitRootLogin no" /etc/ssh/sshd_config && echo "OK" || echo "FAIL"

echo -n "Password auth SSH: "
grep -q "^PasswordAuthentication no" /etc/ssh/sshd_config && echo "OK" || echo "WARN"

echo -n "Firewall actif: "
ufw status | grep -q "active" && echo "OK" || echo "FAIL"

echo -n "Mises à jour auto: "
dpkg -l | grep -q unattended-upgrades && echo "OK" || echo "WARN"

echo -n "Comptes sans mot de passe: "
awk -F: '($2 == "" ) { print $1 }' /etc/shadow | wc -l

🔝 Retour à la table des matières



6 - Exercices pratiques

Exercice 1 : Hardening SSH

Sécurisez la configuration SSH de votre serveur :

  • Désactiver le login root
  • Authentification par clé uniquement
  • Limiter à certains utilisateurs
Solution
# Générer une clé sur le client
ssh-keygen -t ed25519

# Copier sur le serveur
ssh-copy-id user@server

# Modifier /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers admin

# Tester et redémarrer
sshd -t && systemctl restart sshd

Exercice 2 : Configuration auditd

Configurez auditd pour surveiller :

  • Les modifications de /etc/passwd
  • L'exécution de sudo
Solution
# /etc/audit/rules.d/custom.rules
-w /etc/passwd -p wa -k passwd_changes
-a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_exec

# Recharger
auditctl -R /etc/audit/rules.d/custom.rules

# Vérifier
ausearch -k passwd_changes
ausearch -k sudo_exec

Quiz

Q1. Quelle commande active SELinux en mode Enforcing ?

Réponse

setenforce 1

Q2. Quel paramètre sysctl protège contre les attaques SYN flood ?

Réponse

net.ipv4.tcp_syncookies = 1

🔝 Retour à la table des matières



Points clés à retenir

  • Defense in Depth : plusieurs couches de sécurité
  • Moindre privilège : donner uniquement les droits nécessaires
  • Hardening SSH : clés, pas de root, utilisateurs limités
  • SELinux/AppArmor : contrôle d'accès obligatoire
  • Auditd : traçabilité des actions
  • Mises à jour automatiques : patches de sécurité

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Gestion des logs →