
Ce guide détaille la création et la configuration d’une VM Debian sécurisée selon le document ANSSI-BP-028.
1. Création de la VM dans Proxmox
1.1 Configuration matérielle virtuelle
Dans l’interface Proxmox :
# Paramètres VM recommandés :
- OS Type: Linux (6.x - 2.6 Kernel)
- Machine: q35 (plus sécurisé)
- BIOS: OVMF (UEFI) avec Secure Boot
- CPU: host ou x86-64-v3 (selon disponibilité)
- Mémoire: Minimum 2GB, recommandé 4GB+
- Réseau: VirtIO (paravirtualisé)
- Stockage: SCSI avec VirtIO SCSI
1.2 Options de sécurité VM
# Dans l'onglet Options de la VM :
- Protection: Activé (empêche suppression accidentelle)
- Startup/Shutdown order: Configuré selon besoins
- NUMA: Activé si plus de 4 vCPUs
2. Installation Debian dans la VM
2.1 ISO Debian
# Télécharger l'ISO Debian stable
# Upload dans Proxmox : Datacenter > local > ISO Images
# Recommandé : debian-xx.x.x-amd64-netinst.iso
2.2 Partitionnement sécurisé avec chiffrement (R12)
⚠️ CHIFFREMENT OBLIGATOIRE selon ANSSI :
# Schéma de partitionnement ANSSI conforme avec chiffrement :
# === PARTITIONS NON CHIFFRÉES (obligatoirement en clair) ===
/boot/efi 512 MB FAT32 [NON CHIFFRÉ] - Requis pour UEFI boot
/boot 1 GB ext4 [NON CHIFFRÉ] - Requis pour boot kernel
# === PARTITIONS CHIFFRÉES (LUKS2 + AES-256) ===
# Toutes les partitions suivantes DOIVENT être chiffrées :
LVM sur partition chiffrée LUKS2 :
├── / 15-20 GB ext4 [CHIFFRÉ] - Système racine
├── /tmp 2 GB ext4 [CHIFFRÉ] - Fichiers temporaires
├── /var 5 GB ext4 [CHIFFRÉ] - Données variables
├── /var/log 3 GB ext4 [CHIFFRÉ] - Journaux système
├── /var/tmp 1 GB ext4 [CHIFFRÉ] - Temp persistants
├── /home 5+ GB ext4 [CHIFFRÉ] - Données utilisateurs
├── /opt 2 GB ext4 [CHIFFRÉ] - Logiciels optionnels
├── /srv 2 GB ext4 [CHIFFRÉ] - Données services
└── swap 2-4 GB swap [CHIFFRÉ] - Mémoire virtuelle
# Configuration LUKS2 recommandée :
- Algorithme : AES-256
- Mode : XTS
- Taille clé : 512 bits (256 bits pour les données + 256 bits pour XTS)
- Hash : SHA-256
- Passphrase : 20+ caractères complexes
Procédure d’installation avec chiffrement :
# 1. Démarrer l'installateur Debian
# 2. Arriver au partitionnement → Choisir "Manuel"
# 3. Créer le schéma suivant :
# Étape 1 : Partitions non chiffrées
sda1 512 MB EFI System Partition /boot/efi
sda2 1 GB ext4 /boot
# Étape 2 : Partition pour chiffrement
sda3 Reste Espace libre (pour LUKS)
# Étape 3 : Configurer le chiffrement
# → Sélectionner "Configure encrypted volumes"
# → Create encrypted volumes → sda3
# → Encryption method: Device-mapper (dm-crypt)
# → Encryption: aes
# → Key size: 256
# → IV algorithm: xts-plain64
# → Encryption key: Passphrase
# → Passphrase: [20+ caractères complexes]
# Étape 4 : Configurer LVM sur la partition chiffrée
# → Sélectionner "Configure the Logical Volume Manager"
# → Create volume group: vg-system
# → Create logical volumes selon le schéma ci-dessus
2.3 Configuration installation
# Paramètres installation :
- Langue: French (ou English selon préférence)
- Pays: France
- Clavier: French
- Hostname: server-debian-01 (ou selon nomenclature)
- Domaine: votre-domaine.local
- Utilisateur root: MOT DE PASSE FORT (R18)
- Utilisateur standard: Créer un utilisateur dédié
- Miroir APT: France - ftp.fr.debian.org
- Logiciels: SSH server + Standard system utilities UNIQUEMENT
3. Configuration post-installation (Sécurisation ANSSI)
3.1 Vérification du chiffrement et première connexion
# Vérifier que le chiffrement est actif
lsblk -f
# Doit montrer les partitions LUKS (crypto_LUKS)
# Vérifier le statut LUKS
cryptsetup status /dev/mapper/vg--system-root
# Doit afficher : type: LUKS2, cipher: aes-xts-plain64
# Vérifier les options de montage
mount | grep -E "(nosuid|nodev|noexec)"
# Connexion en root (temporaire pour configuration initiale)
# ssh root@IP_VM (si SSH activé) ou console Proxmox
3.2 Mise à jour système et outils de sécurité (R8)
3.2 Mise à jour système et outils de sécurité (R8)
# Connexion en root pour configuration initiale
ssh root@IP_VM
# Mise à jour système (R8)
apt update && apt full-upgrade -y
# Installation des outils de sécurité
apt install -y auditd aide-common fail2ban sudo ufw vim wget curl net-tools cryptsetup
# Vérifier la configuration du chiffrement
cryptsetup luksDump /dev/sda3
# Vérifier : Version 2, aes, xts-plain64, sha256
3.2 Configuration des comptes utilisateur (R18, R19)
# 1. Sécuriser le compte root (R18)
# Le mot de passe root doit être robuste (déjà fait à l'installation)
# 2. Créer un compte administrateur dédié (R19)
useradd -m -s /bin/bash -c "Administrateur Systeme" adminlocal
passwd adminlocal
# Utiliser un mot de passe complexe différent de root
# 3. Ajouter aux groupes sudo
usermod -aG sudo adminlocal
# 4. Désactiver les comptes système inutiles (R26, R27)
for user in daemon bin sys games man lp mail news uucp proxy www-data backup list irc gnats; do
usermod -L $user
usermod -s /bin/false $user
done
3.3 Configuration SSH sécurisée
# Backup de la configuration originale
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# Configuration SSH sécurisée
cat > /etc/ssh/sshd_config << 'EOF'
# Configuration SSH sécurisée ANSSI
Port 2222
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
# Authentification
PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
# Sécurité
X11Forwarding no
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
ClientAliveInterval 300
ClientAliveCountMax 2
# Restrictions d'accès
MaxAuthTries 3
MaxSessions 4
MaxStartups 10:30:60
LoginGraceTime 60
# Utilisateurs autorisés
AllowUsers adminlocal
# Chiffrement
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-512
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
UsePAM yes
EOF
# Redémarrer SSH
systemctl restart sshd
systemctl enable sshd
# Tester la connexion sur le nouveau port AVANT de fermer la console !
3.4 Configuration du pare-feu (R5, défense en profondeur)
# Configuration UFW
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
# Ports essentiels seulement
ufw allow 2222/tcp # SSH personnalisé
ufw allow from 192.168.1.0/24 to any port 2222 # SSH depuis réseau local uniquement
# Si serveur web nécessaire (à adapter selon besoins)
# ufw allow 80/tcp
# ufw allow 443/tcp
# Activer le pare-feu
ufw --force enable
ufw status verbose
3.5 Configuration sysctl sécurisée (R22, R23)
# Créer la configuration sysctl sécurisée
cat > /etc/sysctl.d/99-anssi-security.conf << 'EOF'
# Configuration réseau sécurisée ANSSI (R22)
net.ipv4.ip_forward = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.ip_local_port_range = 32768 65535
net.ipv4.tcp_syncookies = 1
# IPv6 - Désactiver si non utilisé
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# Configuration système sécurisée ANSSI (R23)
kernel.sysrq = 0
fs.suid_dumpable = 0
fs.protected_symlinks = 1
fs.protected_hardlinks = 1
kernel.randomize_va_space = 2
vm.mmap_min_addr = 65536
kernel.pid_max = 65536
kernel.kptr_restrict = 1
kernel.dmesg_restrict = 1
kernel.perf_event_paranoid = 2
kernel.perf_event_max_sample_rate = 1
kernel.perf_cpu_time_max_percent = 1
# Désactivation chargement modules (R24) - Attention aux mises à jour
kernel.modules_disabled = 1
EOF
# Appliquer la configuration
sysctl -p /etc/sysctl.d/99-anssi-security.conf
3.6 Configuration PAM et mots de passe (R32)
# 1. Configuration login.defs pour SHA-512
sed -i 's/^ENCRYPT_METHOD.*/ENCRYPT_METHOD SHA512/' /etc/login.defs
sed -i 's/^#SHA_CRYPT_MIN_ROUNDS.*/SHA_CRYPT_MIN_ROUNDS 65536/' /etc/login.defs
sed -i 's/^#SHA_CRYPT_MAX_ROUNDS.*/SHA_CRYPT_MAX_ROUNDS 65536/' /etc/login.defs
# 2. Installation et configuration PAM cracklib
apt install -y libpam-cracklib
# 3. Configuration PAM pour mots de passe robustes
cat > /etc/pam.d/common-password << 'EOF'
# Configuration PAM sécurisée ANSSI
password requisite pam_cracklib.so retry=3 minlen=12 minclass=3 maxrepeat=2 dcredit=0 ucredit=0 lcredit=0 ocredit=0 difok=3 gecoscheck reject_username enforce_for_root
password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512 rounds=65536
password requisite pam_deny.so
password required pam_permit.so
EOF
# 4. Configuration des délais de session (R29)
echo "export TMOUT=1800" >> /etc/profile
echo "readonly TMOUT" >> /etc/profile
3.7 Configuration auditd (R50)
# Configuration auditd
cat > /etc/audit/rules.d/99-anssi-audit.rules << 'EOF'
# Surveillance des modifications système critiques
-w /etc/ -p wa -k system-config
-w /boot/ -p wa -k boot-config
-w /usr/bin/ -p wa -k binaries
-w /usr/sbin/ -p wa -k binaries
-w /bin/ -p wa -k binaries
-w /sbin/ -p wa -k binaries
# Surveillance des modules
-w /sbin/insmod -p x -k modules
-w /sbin/rmmod -p x -k modules
-w /sbin/modprobe -p x -k modules
# Surveillance des montages
-a exit,always -F arch=b64 -S mount -S umount2 -k mounts
# Surveillance des modifications de fichiers
-a exit,always -F arch=b64 -S unlink -S rmdir -S rename -k delete
-a exit,always -F arch=b64 -S chmod -S fchmod -S fchmodat -k perm_mod
-a exit,always -F arch=b64 -S chown -S fchown -S fchownat -S lchown -k perm_mod
# Surveillance des processus privilégiés
-a exit,always -F arch=b64 -S execve -F euid=0 -k root-commands
# Surveillance des connexions réseau
-a exit,always -F arch=b64 -S socket -F a0=10 -k network-inet
-a exit,always -F arch=b64 -S socket -F a0=2 -k network-inet
# Surveillance des accès aux fichiers sensibles
-w /etc/passwd -p wa -k passwd-changes
-w /etc/shadow -p wa -k passwd-changes
-w /etc/group -p wa -k group-changes
-w /etc/gshadow -p wa -k group-changes
-w /etc/sudoers -p wa -k sudo-changes
-w /var/log/auth.log -p wa -k auth-logs
# Verrouillage de la configuration audit
-e 2
EOF
# Activer et démarrer auditd
systemctl enable auditd
systemctl start auditd
3.8 Configuration des services (R1, R42)
# 1. Lister les services actifs
systemctl list-unit-files --type=service --state=enabled
# 2. Désactiver les services inutiles (à adapter selon besoins)
services_to_disable=(
"bluetooth"
"cups"
"avahi-daemon"
"ModemManager"
"whoopsie"
"snapd"
)
for service in "${services_to_disable[@]}"; do
if systemctl is-enabled "$service" >/dev/null 2>&1; then
systemctl disable "$service"
systemctl stop "$service"
echo "Service $service désactivé"
fi
done
# 3. Services essentiels à conserver
essential_services=(
"ssh"
"ufw"
"auditd"
"fail2ban"
"cron"
"rsyslog"
"systemd-timesyncd"
)
for service in "${essential_services[@]}"; do
systemctl enable "$service"
systemctl start "$service"
done
3.9 Configuration Fail2Ban
# Configuration Fail2Ban pour SSH
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
backend = systemd
[sshd]
enabled = true
port = 2222
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 7200
EOF
systemctl enable fail2ban
systemctl start fail2ban
3.10 Configuration des droits fichiers (R35, R36, R37)
# 1. Configuration umask sécurisé (R35)
echo "umask 0027" >> /etc/profile
echo "umask 0077" >> /etc/bash.bashrc
# 2. Sécurisation des fichiers sensibles (R36)
chmod 600 /etc/shadow /etc/gshadow
chmod 644 /etc/passwd /etc/group
# 3. Audit des fichiers setuid/setgid (R37)
echo "#!/bin/bash" > /usr/local/bin/audit-setuid.sh
echo "find / -type f -perm /6000 -ls 2>/dev/null" >> /usr/local/bin/audit-setuid.sh
chmod +x /usr/local/bin/audit-setuid.sh
# Exécuter l'audit
/usr/local/bin/audit-setuid.sh > /var/log/setuid-audit.log
3.11 Configuration des journaux (R47)
# Configuration rsyslog sécurisée
cat >> /etc/rsyslog.conf << 'EOF'
# Configuration ANSSI pour journalisation
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* /var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
# Rotation des logs
$WorkDirectory /var/spool/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
EOF
systemctl restart rsyslog
4. Finalisation et vérification
4.1 Script de vérification ANSSI
cat > /usr/local/bin/anssi-check.sh << 'EOF'
#!/bin/bash
echo "=== Vérification conformité ANSSI ==="
echo "1. Vérification des services actifs:"
systemctl list-unit-files --type=service --state=enabled --no-pager
echo -e "\n2. Vérification configuration SSH:"
sshd -T | grep -E "permitrootlogin|port|passwordauthentication"
echo -e "\n3. Vérification pare-feu:"
ufw status
echo -e "\n4. Vérification auditd:"
systemctl is-active auditd
echo -e "\n5. Vérification fichiers setuid:"
find /usr /bin /sbin -type f -perm /4000 -ls 2>/dev/null | wc -l
echo -e "\n6. Vérification partitions:"
mount | grep -E "(nosuid|nodev|noexec)"
echo -e "\n7. Vérification fail2ban:"
fail2ban-client status
echo "=== Fin vérification ==="
EOF
chmod +x /usr/local/bin/anssi-check.sh
4.2 Exécution finale
# Exécuter la vérification
/usr/local/bin/anssi-check.sh
# Créer un snapshot Proxmox de la VM configurée
# (à faire depuis l'interface Proxmox)
# Redémarrer pour tester toutes les configurations
reboot
5. Maintenance et surveillance
5.1 Tâches de maintenance régulières
# Créer un script de maintenance hebdomadaire
cat > /etc/cron.weekly/anssi-maintenance << 'EOF'
#!/bin/bash
# Maintenance ANSSI hebdomadaire
# Mise à jour système
apt update && apt upgrade -y
# Audit des fichiers setuid
find / -type f -perm /6000 -ls 2>/dev/null > /var/log/setuid-weekly.log
# Vérification intégrité avec AIDE (si installé)
if command -v aide >/dev/null 2>&1; then
aide --check
fi
# Nettoyage des logs anciens
find /var/log -name "*.log" -mtime +30 -delete
# Rapport de sécurité
/usr/local/bin/anssi-check.sh > /var/log/anssi-weekly-report.log
EOF
chmod +x /etc/cron.weekly/anssi-maintenance
5.2 Monitoring des logs
# Surveiller les tentatives de connexion
tail -f /var/log/auth.log
# Surveiller les événements audit
tail -f /var/log/audit/audit.log
# Surveiller fail2ban
fail2ban-client status sshd
Récapitulatif du chiffrement selon ANSSI
✅ Partitions qui DOIVENT être chiffrées :
- Toutes les partitions contenant des données (R51, R52)
- Système racine (/) - Contient le système et configurations
- Données utilisateurs (/home) - Données personnelles
- Données variables (/var) - Bases de données, mails, etc.
- Journaux (/var/log) - Traces d'activité sensibles
- Fichiers temporaires (/tmp, /var/tmp) - Données temporaires sensibles
- Logiciels (/opt) - Applications et leurs données
- Services (/srv) - Données des services
- Mémoire virtuelle (swap) - Peut contenir des clés/mots de passe
❌ Partitions qui NE PEUVENT PAS être chiffrées :
- /boot/efi - Partition EFI requise pour le boot UEFI
- /boot - Noyau et initramfs requis pour déchiffrer le système
🔐 Configuration LUKS2 recommandée ANSSI :
# Paramètres techniques conformes :
Type de chiffrement : LUKS2
Algorithme : AES-256-XTS
Taille de clé : 512 bits (256+256 pour XTS)
Fonction de dérivation : PBKDF2 ou Argon2i
Hash : SHA-256
Rounds : 4000000+ (PBKDF2) ou Time-cost 4+ (Argon2i)
🔑 Exigences pour la passphrase LUKS :
# Selon R18 et R32 ANSSI :
- Longueur minimale : 20 caractères
- Complexité : Majuscules + minuscules + chiffres + symboles
- Entropie élevée (éviter mots du dictionnaire)
- Unique pour chaque système
- Stockage sécurisé (coffre-fort de mots de passe)
- Créer un snapshot Proxmox après cette configuration
- Tester tous les accès avant de mettre en production
- Documenter les mots de passe de manière sécurisée
- Planifier les mises à jour de sécurité régulières
- Surveiller les logs quotidiennement