Sécurisation du service WEB - CardinPatson/SysAdmin GitHub Wiki
Identification des risques
Le serveur Web a accès à internet. Dès lors, il est exposé à toutes les menaces courantes telles que :
- DDos
- Defacing
- Cross-Site Scripting (XSS)
- Injection SQL
- DNS poisoning
- BEAST
- Falsification de requêtes intersites (CSRF)
(Liste non-exhaustive)
Sans oublier les erreurs de configuration typiques.
Contre-mesures contrant les risques identifiés
Sécuriser le site internet avec HTTPS
Le protocole HTTPS utilise le protocole SSL/TLS pour le cryptage et l'authentification.
Installer un pare-feu
De type WAF (Web Application Firewall), il analyse spécifiquement le trafic Web et bloque toute tentative d'exploitation de vulnérabilités. Il fonctionne comme un antivirus et un antimalware.
Configurer le SSL/TLS
ssl_protocols TLSv1.2 TLSv1.3;
La configuration par défaut de ngnix permet d'utiliser les anciennes versions non sécurisées du protocole TLS. Pour éviter des attaques telles que BEAST, il est recommandé de modifier la configuration afin de ne prendre en charge que les versions plus récentes et sécurisées.
À éditer dans le fichier /etc/nginx/default.conf
Désactiver les modules nginx inutilisés
./configure --without-module1 --without-module2 --without-module3
Cela minimise le risques d'attaques potentielles en limitant les opérations autorisées.
Désactiver les server_token nginx
server_tokens off
À éditer dans le fichier /etc/nginx/default.conf
Définir les limites de la taille de la mémoire tampon
client_body_buffer_size : spécifie la taille du tampon d'en-tête
client_max_body_size : spécifie la taille de corps maximale acceptée
large_client_header_buffers : spécifie le nombre et la taille maximum de tampons à utiliser pour les requêtes clients volumineux
À éditer dans le fichier /etc/nginx/default.conf
Etablir une politique de mot de passe
Authentification à deux facteurs, mots de passe complexes, date d'expiration, générateur de mot de passe...
Mettre à jour le serveur régulièrement
Les nouvelles mises à jour contiennent souvent des correctifs pour les vulnérabilités identifiées dans les versions précédentes ainsi que des nouvelles fonctionnalités et améliorations de sécurité.
Désactiver les ports inutilisés
Cela minimise les risques d'attaques potentielles en réduisant les points d'accès.
Installer un logiciel d'analyse des logiciels malveillants
Cela permet le filtrage, le masquage d'identité du serveur et la prévention des attaques par octet nul ainsi qu'une surveillance du trafic en temps réel.
Sécuriser le serveur contre les attaques par force brute
Un logiciel comme fail2ban analyse les logs à la recherche de tentatives répétées de connexions afin de bannir l'adresse ip de la source responsable de ces tentatives.
Vérifier la configuration
Gixy est un outil open source qui permet de vérifier le serveur Web nginx pour les erreurs de configuration typiques.
Utiliser l'authentification par clé publique pour SSH
Une clé ssh comporte plus de bits qu'un mot de passe et est donc plus sécurisée.
Changer le port SSH
En définissant un port différent (22 par défaut), on minimise le risque d'accès non désiré.
À éditer dans /etc/ssh/sshd_config
Choix des contre-mesures et justification.
Sécurisation du site www et du site b2b en mettant en place https
- Pour configurer un serveur https, le paramètre SSL doit être activé sur le port 443.
listen 443 ssl http2;
server_name wwww.m1-3.ephec-ti.be m1-3.ephec-ti.be;
- Pour activer HTTPS il faut obtenir un certificat à partir d'un autorité de certification. Certbot va automatiser la création et l'installation des certificats.
- Installation de certbot
$ sudo snap install --classic certbot - Obtenir un certificat et demander à Certbot de modifier automatiquement la configuration nginx en activant HTTPS
$ sudo certbot --nginx - Test du renouvellement automatique
$ sudo certbot renouveler --dry-run(permet de renouveler automatiquement les certificats avant expiration)
- Installation de certbot
- Les emplacements du certificat du serveur et des fichiers de clé privée doivent être spécifiés
ssl_certificate /etc/nginx/ssl/live/b2b.m1-3.ephec-ti.be/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/b2b.m1-3.ephec-ti.be/privkey.pem;
Installation d'un pare-feu
Dans le vps :
- Installer UFW
$ sudo apt install ufw
- Activation d'IPv6
$ sudo nano /etc/default/ufw s'assurer de la valeur IPv6=Yes
- Valeurs par défaut des règles UFW
$ sudo ufw default deny incoming refus des connexions entrantes
$ sudo ufw default allow outgoing autorisation des connexions sortantes
- Autorisation des connexions SSH
$ sudo ufw allow 22 crée une règle de pare-feu qui autorise toutes les connexions sur le port 22
- Activation d'UFW
$ sudo ufw enable
- Autorisation d'autres connexions
$ sudo ufw allow 443 autorisation des connexions https
$ sudo ufw allow 80 autorisation des connexions http
- Refus de la connexion pour la db MySQl
$ sudo ufw deny 3306
- Vérification de l'état et des règles d'UFW
$ sudo ufw status verbose
La configuration peut être modifiée au fur et à mesure pour intégrer les exigences des autres services.
Configuration du SSL afin de ne prendre en charge que les versions plus récentes et sécurisées.
ssl_protocols TLSv1.2 TLSv1.3 ;
À éditer dans le fichier /etc/nginx/default.conf
Désactivation des servers_tokens nginx
Par défaut, la directive server_tokens affiche le numéro de version de Nginx. C'est directement visible dans les pages d'erreur mais aussi dans les réponses HTTP, dans le header Server.
server_tokens off;
Sécurisation du serveur contre les attaques par force brute
Installation de fail2ban
sudo apt-get install fail2ban
Ce logiciel vérifie les fichiers log, détecte les comportements inhabituels et bloque l'adresse IP des utilisateurs suspects.
Définition des limites de la taille de la mémoire tampon afin de contrôler et limiter les ressources
On spécifie la taille du tampon du corps de la requête du client (valeur par défaut : 8k ou 16k).
client_body_buffer_size 1K;
On spécifie la taille du tampon de l'en-tête de la requête du client.
client_header_buffer_size 1k;
On spécifie la taille maximale acceptée pour une requête client.
client_max_body_size 1k;
On spécifie le nombre et la taille maximum des tampons à utiliser pour lire les en-têtes des requêtes de clients de grande taille.
large_client_header_buffers 2 1k;
À éditer dans le fichier /etc/nginx/default.conf
Sources
https://info.iweb.com/blog/understanding-distributed-denial-of-service-ddos-attacks
https://info.iweb.com/blog/founders-reading-list-5-security-gaps-in-startups
https://developer.mozilla.org/fr/docs/Learn/Server-side/First_steps/Website_security
https://en.wikipedia.org/wiki/DNS_hijacking
https://en.wikipedia.org/wiki/SQL_injection
https://www.oracle.com/fr/security/defacement-attaque-site.html
https://fr.linux-console.net/?p=1196
https://www.linuxtricks.fr/wiki/ssh-installer-et-configurer-un-serveur-ssh
https://blog.jbriault.fr/security-nginx/