Hardening ANSSI-BP028¶
Contexte et objectifs¶
Qu'est-ce que l'ANSSI ?¶
L'ANSSI (Agence Nationale de la Securite des Systemes d'Information) est l'autorite nationale francaise en matiere de cybersecurite. Rattachee au SGDSN (Secretariat General de la Defense et de la Securite Nationale), elle definit les referentiels de securite applicables aux systemes d'information en France.
Pourquoi ANSSI-BP028 ?¶
Le referentiel ANSSI-BP028 (Recommandations de configuration d'un systeme GNU/Linux) est le guide de reference pour le durcissement des systemes Linux. Il fournit des recommandations concretes, classees par niveau de priorite, pour reduire la surface d'attaque d'un systeme.
Pertinence pour le projet
Toutes les VMs de l'infrastructure tournent sous Rocky Linux 9. Appliquer ANSSI-BP028 garantit un socle de securite conforme aux standards nationaux, indispensable pour une infrastructure hebergeant un SOC.
CIS Benchmark vs ANSSI-BP028¶
| Critere | CIS Benchmark | ANSSI-BP028 |
|---|---|---|
| Origine | Center for Internet Security (USA) | ANSSI (France) |
| Portee | Specifique a chaque OS/application | Generique GNU/Linux |
| Niveaux | Level 1 (basique), Level 2 (avance) | Minimal, Intermediaire, Renforce |
| Format | Checklist detaillee avec scoring | Recommandations argumentees |
| Audit | Wazuh SCA, OpenSCAP | Wazuh SCA (regles custom) |
| Recouvrement | ~70% des mesures se recoupent | ~70% des mesures se recoupent |
Approche complementaire
Nous appliquons les deux referentiels. ANSSI-BP028 pour les recommandations specifiques au contexte francais, CIS Benchmark pour le scoring automatise. Les mesures se recoupent largement, avec des specificites propres a chacun.
Mesures par categorie¶
Comptes et authentification¶
Politique de mots de passe¶
Les mots de passe locaux sont soumis a des contraintes strictes via PAM (Pluggable Authentication Modules) :
| Parametre | Valeur | Fichier |
|---|---|---|
| Longueur minimale | 12 caracteres | /etc/security/pwquality.conf |
| Complexite | minclass=4 (majuscule, minuscule, chiffre, special) | /etc/security/pwquality.conf |
| Historique | remember=5 (5 derniers mots de passe interdits) | /etc/pam.d/system-auth |
| Age maximal | 90 jours | /etc/login.defs |
| Age minimal | 1 jour | /etc/login.defs |
Verrouillage de compte (faillock)¶
Apres des tentatives d'authentification echouees, le compte est verrouille pour prevenir le brute force :
| Parametre | Valeur | Description |
|---|---|---|
deny |
5 | Nombre de tentatives avant verrouillage |
unlock_time |
900 | Duree du verrouillage (15 min) |
fail_interval |
900 | Fenetre de comptage des echecs |
even_deny_root |
yes | Le compte root est aussi verrouille |
Timeout de session¶
Les sessions inactives sont automatiquement deconnectees :
- TMOUT=300 dans
/etc/profile.d/: deconnexion apres 5 minutes d'inactivite shell - ClientAliveInterval 300 dans sshd_config : deconnexion SSH apres 5 min sans activite
- readonly TMOUT : l'utilisateur ne peut pas desactiver le timeout
Restriction su/sudo¶
| Mesure | Configuration | Objectif |
|---|---|---|
Restriction su |
pam_wheel.so requis, groupe wheel limite |
Seuls les membres du groupe wheel peuvent utiliser su |
| Sudo avec mot de passe | Defaults timestamp_timeout=5 |
Redemande le mot de passe apres 5 min |
| Pas de NOPASSWD | Interdit sauf comptes de service Ansible | Empeche l'utilisation de sudo sans authentification |
| Logging sudo | Defaults logfile=/var/log/sudo.log |
Toutes les commandes sudo sont tracees |
Banniere legale¶
Un avertissement est affiche avant toute connexion (SSH, console) pour informer que le systeme est surveille et que l'acces non autorise est interdit. Configure dans /etc/issue, /etc/issue.net et la banniere SSH.
Configuration systeme¶
Partitionnement securise¶
Chaque point de montage sensible est isole sur une partition separee avec des options restrictives :
| Point de montage | Options | Justification |
|---|---|---|
/tmp |
noexec,nosuid,nodev |
Empeche l'execution de binaires depuis /tmp |
/var |
nosuid,nodev |
Isole les logs et donnees variables |
/var/log |
noexec,nosuid,nodev |
Protege les journaux contre la manipulation |
/var/log/audit |
noexec,nosuid,nodev |
Isole specifiquement les logs d'audit |
/var/tmp |
noexec,nosuid,nodev |
Memes restrictions que /tmp |
/home |
noexec,nosuid,nodev |
Empeche l'execution depuis les repertoires utilisateurs |
/dev/shm |
noexec,nosuid,nodev |
Protege la memoire partagee |
Impact du partitionnement
L'option noexec sur /tmp et /home peut bloquer certains installeurs ou scripts. Le role Ansible gere les exceptions necessaires (ex. Ansible lui-meme utilise /tmp pour ses scripts temporaires, configure via remote_tmp).
Services desactives¶
Tous les services non necessaires sont desactives et masques :
Configuration systeme supplementaire¶
| Mesure | Valeur | Objectif |
|---|---|---|
| Umask | 027 | Fichiers crees lisibles uniquement par le proprietaire et le groupe |
| SUID/SGID audit | Inventaire regulier | Detection de binaires SUID/SGID non autorises |
| Core dumps | Desactives (* hard core 0) |
Empeche la fuite de donnees en memoire via core dumps |
| ASLR | Active (kernel.randomize_va_space=2) |
Randomisation de l'espace d'adressage contre les exploits memoire |
| Ctrl+Alt+Del | Desactive | Empeche le redemarrage physique non autorise |
Securite reseau¶
Firewall deny-by-default¶
flowchart LR
IN["Trafic entrant"] --> FW{"firewalld"}
FW -->|Regle explicite| ACCEPT["Autorise"]
FW -->|Pas de regle| DROP["Rejete (DROP)"]
style DROP fill:#D32F2F,color:#fff
style ACCEPT fill:#2E7D32,color:#fff
Chaque VM utilise firewalld en zone drop par defaut. Seuls les ports explicitement necessaires sont ouverts. Exemples :
| Service | Port autorise | Source |
|---|---|---|
| SSH | 22/TCP | VLAN administration uniquement |
| Wazuh agent | 1514/TCP | VIP SOC 10.15.80.50 |
| Zabbix agent | 10050/TCP | Serveur Zabbix |
| Node exporter | 9100/TCP | Serveur Prometheus |
Durcissement reseau (sysctl)¶
| Parametre | Valeur | Objectif |
|---|---|---|
net.ipv6.conf.all.disable_ipv6 |
1 | IPv6 desactive (non utilise) |
net.ipv4.conf.all.accept_redirects |
0 | ICMP redirect desactive (previent le MitM) |
net.ipv4.conf.all.send_redirects |
0 | Empeche l'envoi de redirections ICMP |
net.ipv4.ip_forward |
0 | IP forwarding desactive (pas un routeur) |
net.ipv4.tcp_syncookies |
1 | SYN cookies contre les attaques SYN flood |
net.ipv4.conf.all.rp_filter |
1 | Reverse path filtering (anti-spoofing) |
net.ipv4.conf.all.log_martians |
1 | Log des paquets avec adresses impossibles |
Modules noyau blacklistes¶
Les protocoles reseau non utilises sont desactives au niveau du noyau pour reduire la surface d'attaque :
| Module | Protocole | Raison du blocage |
|---|---|---|
dccp |
Datagram Congestion Control | Non utilise, vulnerabilites connues |
sctp |
Stream Control Transmission | Non utilise, surface d'attaque inutile |
tipc |
Transparent Inter-Process Communication | Non utilise, risque d'exploitation locale |
rds |
Reliable Datagram Sockets | Non utilise, CVE multiples |
Durcissement SSH¶
Configuration sshd¶
| Parametre | Valeur | Justification |
|---|---|---|
PermitRootLogin |
prohibit-password |
Login root uniquement par certificat Vault CA |
PasswordAuthentication |
no |
Seules les cles et certificats sont acceptes |
Protocol |
2 | SSH-2 uniquement (SSH-1 est vulnerable) |
Ciphers |
chacha20-poly1305, aes256-gcm@openssh.com, aes256-ctr |
Chiffrement fort uniquement |
MACs |
hmac-sha2-512-etm, hmac-sha2-256-etm |
Integrite forte (Encrypt-then-MAC) |
KexAlgorithms |
curve25519-sha256, diffie-hellman-group16-sha512 |
Echange de cles robuste |
ClientAliveInterval |
300 | Deconnexion apres 5 min d'inactivite |
ClientAliveCountMax |
0 | Pas de tentative de keep-alive |
MaxAuthTries |
3 | Limite les tentatives d'authentification |
MaxSessions |
2 | Limite le nombre de sessions simultanees |
AllowAgentForwarding |
no |
Desactive le forwarding d'agent SSH |
X11Forwarding |
no |
Desactive le forwarding X11 |
Exception root via Vault CA
Le login root est autorise uniquement par certificat SSH signe par Vault CA. Cela permet l'administration d'urgence sans mot de passe, tout en maintenant la tracabilite complete (chaque certificat est nominatif et a une duree de vie limitee).
Audit et journalisation¶
Regles auditd¶
Le systeme d'audit Linux (auditd) enregistre les evenements de securite critiques :
| Categorie | Fichiers/Syscalls surveilles | Objectif |
|---|---|---|
| Authentification | /etc/passwd, /etc/shadow, /etc/group |
Modification des comptes |
| Privileges | execve avec UID change, /etc/sudoers |
Escalade de privileges |
| Reseau | connect, accept, bind |
Connexions reseau suspectes |
| Fichiers critiques | /etc/ssh/, /etc/pam.d/, /boot/ |
Modification de configuration |
| Modules noyau | init_module, delete_module |
Chargement/dechargement de modules |
| Temps | adjtimex, settimeofday |
Manipulation de l'horloge (anti-forensic) |
Centralisation des logs¶
flowchart LR
VM["VM Rocky 9<br/>auditd + rsyslog"] -->|514/UDP + 1514/TCP| VIP["VIP SOC<br/>10.15.80.50"]
VIP --> LS["Logstash"]
LS --> ES["Elasticsearch"]
ES --> KIB["Kibana"]
ES --> EA["ElastAlert2"]
style VIP fill:#1565C0,color:#fff
Tous les logs sont envoyes au SOC via rsyslog vers la VIP 10.15.80.50. La retention locale est assuree par logrotate (rotation quotidienne, compression, retention 30 jours sur disque local).
Wazuh FIM¶
En complement d'auditd, le FIM Wazuh fournit une couche supplementaire de surveillance de l'integrite. Contrairement a auditd qui trace les appels systeme, Wazuh FIM compare les hash SHA256 des fichiers et detecte tout ecart par rapport a la baseline.
Automatisation Ansible¶
Role hardening-anssi¶
Le durcissement est entierement automatise via le role Ansible hardening-anssi :
| Propriete | Detail |
|---|---|
| Nom | hardening-anssi |
| Idempotence | Oui -- peut etre relance sans effet de bord |
| Phase | Phase 2 du site.yml (apres common, avant services) |
| Cible | Toutes les VMs de l'infrastructure |
| Variables | Parametrables par groupe ou par hote |
| Tags | accounts, network, ssh, audit, sysctl, services |
flowchart TB
PLAY["site.yml -- Phase 2"]
PLAY --> R1["Task: Politique mots de passe (PAM)"]
PLAY --> R2["Task: faillock"]
PLAY --> R3["Task: Timeout session"]
PLAY --> R4["Task: Partitionnement (fstab)"]
PLAY --> R5["Task: Sysctl reseau"]
PLAY --> R6["Task: Firewalld deny-by-default"]
PLAY --> R7["Task: SSH hardening"]
PLAY --> R8["Task: Auditd rules"]
PLAY --> R9["Task: Services desactives"]
PLAY --> R10["Task: Modules blacklistes"]
style PLAY fill:#E65100,color:#fff
Idempotence
Le role est concu pour etre idempotent : chaque execution produit le meme resultat, qu'elle soit la premiere ou la dixieme. Cela permet de le relancer regulierement comme outil de remise en conformite sans risque d'effet de bord.
Conformite continue¶
Wazuh CIS Benchmark Scans¶
Wazuh execute periodiquement des scans SCA (Security Configuration Assessment) qui evaluent chaque VM contre les referentiels CIS et ANSSI-BP028 :
| Metrique | Detail |
|---|---|
| Frequence | Toutes les 12 heures |
| Referentiels | CIS Rocky Linux 9, ANSSI-BP028 custom |
| Score cible | > 95% de conformite |
| Alertes | Score < 90% = alerte warning, < 80% = alerte critique |
Detection de derive¶
Le drift detection compare l'etat actuel de chaque VM avec l'etat attendu :
- Scan SCA : Wazuh verifie la conformite selon les regles CIS/ANSSI
- FIM : toute modification des fichiers de configuration est detectee en temps reel
- Alerte : l'equipe est notifiee via Shuffle SOAR + ntfy
- Remediation : le role Ansible
hardening-anssiest relance pour corriger la derive
Derive de configuration
Une derive de configuration (modification manuelle d'un fichier durci, desactivation d'une regle auditd, ouverture d'un port non autorise) est traitee comme un incident de securite. Elle peut indiquer une compromission ou une erreur humaine -- dans les deux cas, elle doit etre investiguee et corrigee.