Linux/Windows Serveur de Sécurisation : Guide étape par étape pour les Configurations de Sécurité
Rudra Chauhan, Senior Systems Architect
Linux/Windows Serveur de Sécurisation : Guide étape par étape pour les Configurations de Sécurité
La sécurisation des serveurs est un processus continu qui commence par une configuration de base solide et évolue avec l'intelligence de menace. Ce guide vous guide à travers la sécurisation des surfaces d'attaque les plus critiques — SSH, TLS, pare-feu, et en-têtes de sécurité HTTP — sur les deux plateformes Linux et Windows, et relie ensuite tout cela avec un flux de travail de mitigation de risque répétable.
Configuration du Serveur SSH - Meilleures Pratiques pour les Connexions Sécurisées
Réponse directe : Sécurisez sshd en désactivant les protocoles legacy, en imposant l'authentification basée sur les clés, en limitant l'accès, et en appliquant des paramètres cryptographiques solides.
Étapes de Sécurisation de Base (Linux)
bash# /etc/ssh/sshd_config – remplacez le fichier entier ou ajoutez ces lignes Port 2222 # port non standard réduit les scans automatiques Protocol 2 PermitRootLogin no PubkeyAuthentication yes PasswordAuthentication no ChallengeResponseAuthentication no UsePAM yes AuthenticationMethods publickey AllowUsers alice bob@192.0.2.0/24 # restreint par utilisateur et par CIDR source MaxAuthTries 3 LoginGraceTime 20 ClientAliveInterval 300 ClientAliveCountMax 2 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com
Rechargez : systemctl reload sshd
Serveur OpenSSH Windows (Win32-OpenSSH)
powershell# C:\ProgramData\ssh\sshd_config Port 2222 PermitRootLogin no PubkeyAuthentication yes PasswordAuthentication no AuthenticationMethods publickey AllowUsers alice,bob MaxAuthTries 3 LoginGraceTime 20 ClientAliveInterval 300 ClientAliveCountMax 2 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Redémarrez le service : Restart-Service sshd
Tableau de Référence Rapide – Paramètres de Sécurisation SSH
| Paramètre | Valeur recommandée | Raison |
|---|---|---|
Port | 2222 (ou tout >1024) | Réduit le bruit des scanners de bots |
PermitRootLogin | no | Prévient la compromission directe de la racine |
PasswordAuthentication | no | Force l'authentification basée sur les clés |
AuthenticationMethods | publickey | Garantit un contrôle MFA-style |
Ciphers | chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com | Ciphers AEAD modernes uniquement |
KexAlgorithms | curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 | Échange de clés sécurisé à l'avance |
AllowUsers | alice bob@192.0.2.0/24 | Segment de réseau de moindre privilège |
Aide en surplomb : Générez un
sshd_configprêt à coller avec le Générateur de Config SSH et validez la syntaxe viasshd -t.
Configuration SSL/TLS Sécurisée – Mise en œuvre des Meilleures Pratiques pour l'Encryption
Réponse directe : Déployez TLS 1.2 + 1.3 uniquement, utilisez des ensembles de ciphers solides, activez HSTS, OCSP stapling, et imposez la transparence de certificat.
Exemple Nginx (Linux)
nginx# /etc/nginx/conf.d/ssl-hardening.conf server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Protocole & Ensemble de ciphers ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'; ssl_prefer_server_ciphers off; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; resolver 1.1.1.1 8.8.8.8 valid=300s; resolver_timeout 5s; # HSTS (1 an, inclure les sous-domaines, précharger) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" toujours; # En-têtes de sécurité (voir la section suivante) include /etc/nginx/security-headers.conf; }
IIS (Windows) – Hardening PowerShell
powershell# Désactivez TLS 1.0/1.1, activez 1.2/1.3 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -Name 'Enabled' -Value 0 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -Name 'Enabled' -Value 0 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'Enabled' -Value 1 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Name 'Enabled' -Value 1 # Limitez les ensembles de ciphers (exemples : seuls AES-GCM & CHACHA20) $ciphers = @( 'TLS_AES_256_GCM_SHA384', 'TLS_CHACHA20_POLY1305_SHA256', 'TLS_AES_128_GCM_SHA256' ) Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers' -Name 'Functions' -Value ($ciphers -join ',') # Activez HSTS via web.config (ajoutez à la racine du site) <configuration> <system.webServer> <httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload" /> </customHeaders> </httpProtocol> </system.webServer> </configuration>
Référence
- RFC 7519 de l'IETF – Jeton Web JSON (JWT) utilisé pour l'authentification sans état ; assurez-vous que les jetons sont transmis uniquement sur des canaux TLS protégés.
Règles de Pare-feu – Configuration de iptables, nftables, ufw, et Pare-feu Windows pour un Accès Réseau Sécurisé
Réponse directe : Adoptez une posture de refus par défaut, autorisez uniquement les ports d'entrée requis (SSH, HTTPS, gestion), et enregistrez les paquets rejetés pour audit.
Linux – nftables (moderne, atomique)
bash#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority 0; policy drop; iif "lo" accept ct state established,related accept # SSH (port non standard) tcp dport 2222 ct state new limit rate 5/minute accept # HTTP/HTTPS tcp dport {80,443} accept # ICMP (taux limité) icmp type echo-request limit rate 1/second accept # Enregistrez & rejetez log prefix "DROP_IN: " level info } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } }
Linux – UFW (Ubuntu/Debian amical)
bashufw default deny incoming ufw default allow outgoing ufw allow 2222/tcp comment 'SSH port sécurisé' ufw allow 80,443/tcp comment 'Traffic web' ufw limit 2222/tcp comment 'Taux limité SSH' ufw enable
Pare-feu Windows – PowerShell (profils Domaine/Privé)
powershell# Réinitialisez à la configuration de base Set-NetFirewallProfile -All -DefaultInboundAction Block -DefaultOutboundAction Allow -NotifyDisplayEnabled False # Autorisez SSH (port non standard) New-NetFirewallRule -DisplayName "Allow SSH 2222" -Direction Inbound -Protocol TCP -LocalPort 2222 -Action Allow -Profile Domain,Private -Enabled True # Autorisez HTTP/HTTPS New-NetFirewallRule -DisplayName "Allow HTTP/HTTPS" -Direction Inbound -Protocol TCP -LocalPort 80,443 -Action Allow -Profile Domain,Private -Enabled True # Activez l'enregistrement des paquets rejetés Set-NetFirewallProfile -All -LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log" -LogMaxSizeKilobytes 4096 -LogAllowed False -LogBlocked True -LogIgnored True
Aide en surplomb : Utilisez le Générateur de Règles de Pare-feu pour produire les commandes exactes
iptables,nftables,ufw, ou Pare-feu Windows pour votre environnement.
En-têtes de Sécurité – Mise en œuvre de CSP, HSTS, et Autres En-têtes Essentiels pour les Applications Web Sécurisées
Réponse directe : Déployez un ensemble d'en-têtes de défense en profondeur sur chaque réponse HTTP : Content-Security-Policy, Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy, et Cross-Origin-Opener-Policy.
Exemple Nginx (/etc/nginx/security-headers.conf)
nginx# Politique de Sécurité du Contenu – ajustez les sources à vos actifs add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-$request_id' https://cdn.example.com; style-src 'self' 'nonce-$request_id' https://fonts.googleapis.com; img-src 'self' data: https://cdn.example.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self';" toujours; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" toujours; add_header X-Content-Type-Options "nosniff" toujours; add_header X-Frame-Options "DENY" toujours; add_header Referrer-Policy "strict-origin-when-cross-origin" toujours; add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" toujours; add_header Cross-Origin-Opener-Policy "same-origin" toujours; add_header Cross-Origin-Resource-Policy "same-origin" toujours;
Apache (/etc/apache2/conf-available/security-headers.conf)
apacheHeader toujours set Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-%{UNIQUE_ID}e' https://cdn.example.com; style-src 'self' 'nonce-%{UNIQUE_ID}e' https://fonts.googleapis.com; img-src 'self' data: https://cdn.example.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self';" Header toujours set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Header toujours set X-Content-Type-Options "nosniff" Header toujours set X-Frame-Options "DENY" Header toujours set Referrer-Policy "strict-origin-when-cross-origin" Header toujours set Permissions-Policy "geolocation=(), microphone=(), camera=()" Header toujours set Cross-Origin-Opener-Policy "same-origin" Header toujours set Cross-Origin-Resource-Policy "same-origin"
IIS – web.config (ajoutez sous <system.webServer>)
xml<httpProtocol> <customHeaders> <add name="Content-Security-Policy" value="default-src 'self'; script-src 'self' 'nonce-{RANDOM}' https://cdn.example.com; style-src 'self' 'nonce-{RANDOM}' https://fonts.googleapis.com; img-src 'self' data: https://cdn.example.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self';" /> <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload" /> <add name="X-Content-Type-Options" value="nosniff" /> <add name="X-Frame-Options" value="DENY" /> <add name="Referrer-Policy" value="strict-origin-when-cross-origin" /> <add name="Permissions-Policy" value="geolocation=(), microphone=(), camera=()" /> <add name="Cross-Origin-Opener-Policy" value="same-origin" /> <add name="Cross-Origin-Resource-Policy" value="same-origin"