From de6251fed3737111bc85db2b4298c6e5d4d526c3 Mon Sep 17 00:00:00 2001 From: William Petit Date: Tue, 23 Jan 2018 22:46:57 +0100 Subject: [PATCH] =?UTF-8?q?Logomotion:=20S=C3=A9curit=C3=A9=20Web,=20s?= =?UTF-8?q?=C3=A9curisation=20du=20serveur=20GNU/Linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../securite_web/presentation/slides.md | 445 +++++++++++++++++- 1 file changed, 441 insertions(+), 4 deletions(-) diff --git a/developpement/securite_web/presentation/slides.md b/developpement/securite_web/presentation/slides.md index 03e40bd..3798c1c 100644 --- a/developpement/securite_web/presentation/slides.md +++ b/developpement/securite_web/presentation/slides.md @@ -299,9 +299,6 @@ Chaque couple **(label, valeur)** est appelée **dimension** de la métrique. http_total_requests{ method="POST", path="/test" } | name | labels | ``` - - - --- ## Les différents types de métriques (1) @@ -346,10 +343,450 @@ Un histogramme est une métrique répartissant les données dans des "paquets" ( --- -## Exercice: métrologie orienté sécurité d'une application Symfony3 +## Exercice: métrologie orientée sécurité d'une application Symfony3 1. Créer une nouvelle application Symfony3 et configure une authentification de type "Basic Auth" sur une route. 2. Implémenter une `Listener` pour l'évènement `security.authentication.failure` ([voir ce tutoriel](https://www.brainvire.com/create-authentication-listener-symfony2/)) 3. Installer et configurer le bundle [tweedegolf/prometheus-bundle](https://github.com/tweedegolf/prometheus-bundle) 4. Mettre en place une sonde pour détecter les tentatives répétées d'authentification échouées pour une adresse IP donnée. 5. Mettre en place une alerte lorsque le nombre d'authentifications échouées dépasse un certain seuil dans un espace de temps donné. + +--- + +## Sécurité de l'infrastructure pour l'hébergement Web + +### Sécurité et configuration du serveur GNU/Linux +### Configuration du serveur HTTP +### Monitoring + +--- + +## Sécurité et configuration du serveur GNU/Linux + +### Installation du serveur +### Politique d'accès et configuration SSH +### Règles de pare-feu +### Politique de sauvegarde + +--- + +## Installation du serveur + +--- + +## Règles générales de partitionnement (1) + +- Utiliser [LVM](https://wiki.ubuntu.com/Lvm) +- ~300/500M pour `/boot` +- Partition séparée pour `/var` ( via un volume logique) +- Partition séparée pour `/home` (via un volume logique) +- Partition séparée pour `/` (via un volume logique) +- Garder de l'espace pour pouvoir agrandir au besoin une partition LVM + +--- + + +### Règles générales de partitionnement (2) + +**Exemple** Pour 10G de disque + +|Point de montage|Système de fichier|Taille| +|:-|:-|:-| +|`/boot`|ext4 (Primaire)|500M +|`/`|ext4 (LVM)|4G (~30/40%) +|`/home`|ext4 (LVM)|1G (10%)| +|`/var`|ext4 (LVM)|3G (~30/40%)| +|`swap`|swap (LVM)| round(sqrt(RAM) < swap < 2*RAM | + +Et garder ~10% d'espace libre pour pouvoir agrandir un volume logique au besoin. + +--- + +## Activation des mises à jour automatiques + +Si à l'installation l'option n'est pas proposée (sur Debian et dérivées) + +```bash +apt-get install unattended-upgrades apt-listchanges +``` +[Voir la documentation Debian pour plus d'informations](https://wiki.debian.org/UnattendedUpgrades) + +--- + +## Politique d'accès et configuration SSH + +--- + +## Installation du serveur OpenSSH + +```bash +apt install openssh-server +``` +--- + +## Désactivation de l'authentification SSH avec l'utilisateur `root` + +```bash +vim /etc/ssh/sshd_config +# ... +# PermitRootLogin no +# ... +systemctl restart ssh +``` +--- + +## Désactivation de la connexion SSH avec un mot de passe + +```bash +vim /etc/ssh/sshd_config +# ... +# PasswordAuthentication no +# ... +systemctl restart ssh +``` +--- + +## Restreindre les utilisateurs et/ou groupes autorisés à se connecter en SSH + +```bash +vim /etc/ssh/sshd_config +# ... +# AllowUsers jdoe bob +# AllowGroups jdoe bob +# ... +systemctl restart ssh +``` +--- + +## Augmenter la taille des clés SSH du serveur + +```bash +vim /etc/ssh/sshd_config +# ... +# ServerKeyBits 2048 +# ... +rm /etc/ssh/ssh_host_* +systemctl restart ssh +``` +--- + +## Créer des comptes utilisateurs avec un mot de passe expiré (1) + +```bash +adduser +chage -d 0 +``` +Puis penser à copier la clé SSH publique de l'utilisateur dans `/home//.ssh/authorized_keys`. + +--- + +## Créer des comptes utilisateurs avec un mot de passe expiré (2) + +Attention, OpenSSH est très "chatouilleux" avec les droits sur les répertoires `.ssh` et le fichier `.ssh/authorized_keys`. En cas de doute: + +```bash +chmod go-w /.ssh +chmod 600 /.ssh/authorized_keys +chown $HOME/.ssh/authorized_keys +``` + +--- + +## Règles de pare-feu + +--- + +## Installation d'UFW + +> Uncomplicated Firewall + +```bash +apt install ufw +``` +--- + +## Activation du pare-feu + +```bash +iptables -L # Afficher les règles iptables +ufw allow 22/tcp # Pour éviter de perdre la connexion SSH actuelle +ufw enable # Activer le pare-feu +iptables -L # Vérifier l'application des règles +``` +--- + +## Vérifier le statut des règles + +```bash +ufw status verbose +``` +--- + +## Gestion des règles par défaut + +```bash +ufw default deny # Refuser tous les paquets par défaut +ufw default allow # Accepter tous les paquets par défaut +ufw default allow outgoing # Accepter les connexions sortantes par défaut +ufw default allow ingoing # Accepter les connexions entrantes par défaut +``` + +--- + +## Ajouter des règles + +```bash +# Connexions entrantes + +# Autoriser toutes les connexions depuis 192.168.0.4 sur le port 22 +ufw allow from 192.168.0.4 to any port 22 +# Refuser toutes les connexions depuis 207.46.232.182 +ufw deny from 207.46.232.182 + +# Connexions sortantes + +# Autoriser les connexions UDP sur le port 53 (requêtes DNS) +ufw allow out 53/udp +# Autoriser les connexions MySQL (3306/tcp) vers l'adresse 192.168.0.43 +ufw allow out to 192.168.0.43 port mysql +``` + +--- + +## Supprimer une règle + +```bash +ufw status numbered # Afficher les identifiants des règles +ufw delete # Supprimer une règle par son identifiant +``` +--- + +## Exercice + +Avec UFW, configurer votre serveur pour: + +- Refuser toutes les connexions entrantes/sortantes par défaut +- Autoriser la connexion SSH uniquement depuis l'IP de votre poste de travail et celle d'un de vos collègues présent à la formation. +- Autoriser les connexions sortantes HTTP/HTTPS vers l'adresse 192.168.0.30 (i.e. un serveur fournissant une API REST utilisée par votre application) +- Autoriser les connexions sortantes MongoDB vers l'adresse 192.168.0.45 (i.e. une base de données MongoDB utilisée par votre application) + +--- + +## Politique de sauvegarde + +--- + +## Installation de rsync/rsnapshot + +### Sur le serveur + +```bash +apt install rsync +``` + +### Sur le client + +```bash +apt install rsnapshot rsync +``` +--- + +## Configuration de rsnapshot (1) + +### Sur le serveur + +- Créer un utilisateur dédié à la sauvegarde +- S'assurer que le compte de sauvegarde a les droits de lecture sur les répertoires à sauvegarder +- Déployer une clé SSH pour le compte de sauvegarde (à utiliser sur le client) + +--- + +## Configuration de rsnapshot (2) + +### Sur le client + +```bash +# Éditer la configuration +vim /etc/rsnapshot.conf + +# Définition de la rotation des sauvegardes +# +# retain hourly 24 # Une sauvegarde par heure hourly.0 -> hourly.23 +# retain daily 7 # Si le rép. existe, copie hourly.23 vers daily.0 +# retain weekly 4 # Si le rép. existe, copie daily.6 vers weekly.0 +# retain monthly 12 # Si le rép. existe, copie weekly.3 vers monthly.0 + +# Vérifier la configuration +rsnapshot configtest + +# Exécuter un "dry-run" +rsnapshot -t hourly # Ou daily/weekly/monthly + +# Configurer les tâches CRON +crontab -e + +# @hourly rsnapshot hourly +# @daily rsnapshot daily +# @weekly rsnapshot weekly +# @monthly rsnapshot monthly + +``` +--- + +## Restaurer une sauvegarde + +```bash +rsync -av \ + /var/cache/rsnapshot/. \ + user@server-host:/path/to/dest +``` + +--- + +## Configuration du serveur HTTP + +### Apache2 +### Certificats TLS/SSL + +--- + +## Apache2 + +--- + +## Installation + +```bash +apt install apache2 +``` +--- + +## Désactivation des entêtes d'informations + +```bash +vim /etc/apache2/apache2.conf +# ... +ServerSignature Off +ServerTokens Prod +# ... +systemctl reload apache2 +``` +--- + +## Désactivation de l'indexation automatique des dossiers + +```bash +vim /etc/apache2/apache2.conf +# ... + + Options -Indexes + +# ... +systemctl reload apache2 +``` + +--- + +## Désactivation des modules inexploités + +```bash +# Afficher les directives de chargement des modules +grep LoadModule /etc/apache2/mods-enabled/*.load +# Désactiver un module +rm /etc/apache2/mods-enabled/.load +# Recharger la configuration Apache2 +systemctl reload apache2 +``` + +Modules souvent inclus mais peu utilisés: _mod_imap, mod_include, mod_info, mod_userdir, mod_autoindex_ + +--- + +## Activation du module `mod_evasive` + +```bash +# Installation du module +apt install apache2-mod-evasive +# Activer le module (si non activé par défaut) +a2enmod evasive +# Configurer le module +vim /etc/apache2/mods-enabled/evasive.conf +# Recharcher la configuration Apache2 +systemctl reload apache2 +``` +--- + +## Activation du module `mod_security` + +```bash +# Installation du module +apt install libapache2-mod-security2 +# Activer le module (si non activé par défaut) +a2enmod security2 +# Configurer le module +vim /etc/modsecurity/modsecurity.conf-recommended +# Activer la configuration recommandée +mv /etc/modsecurity/modsecurity.conf-recommended \ + /etc/modsecurity/modsecurity.conf +# Recharcher la configuration Apache2 +systemctl reload apache2 +``` +--- + +## SSL/TLS + +--- + +## Générer un certificat autosigné + +```bash +openssl req \ + -x509 \ + -newkey rsa:4096 \ + -keyout key.pem \ + -out cert.pem \ + -days 365 \ + -nodes +``` + +--- + +## Utilisation du certificat avec Apache2 + +```apache +# /etc/apache2/sites-enabled/my-site.conf + +NameVirtualHost *:80 + + ServerName www.example.com + Redirect / https://secure.example.com/ + + + + ServerName secure.example.com + DocumentRoot /var/www/html + SSLEngine On + SSLCertificateFile /path/to/cert.pem + SSLCertificateKeyFile /path/to/key.pem + # etc... + +``` + +--- + +## Monitoring + +### Configuration et usage de fail2ban +### Configuration et usage de Monit + +--- + +## Installation de fail2ban + +--- + +# Licence + +## CC BY-NC-SA 3.0 FR + +[Creative Commons - Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 France](https://creativecommons.org/licenses/by-nc-sa/3.0/fr/) \ No newline at end of file