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)
  • 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/

https://letsencrypt.org/fr/getting-started/

https://certbot.eff.org/