Logomotion: maj formation Sécurité Web
This commit is contained in:
@ -34,7 +34,7 @@ https://forge.cadoles.com/wpetit/epicfaild
|
||||
|
||||
### Lancer avec Docker
|
||||
```
|
||||
docker run -it --rm -p 8888:8080 bornholm/epicfaild
|
||||
docker run -it --rm -p 8888:8080 bornholm/epicfaild
|
||||
|
||||
# Puis ouvrir l'URL http://localhost:8888/
|
||||
# dans votre navigateur
|
||||
@ -210,7 +210,7 @@ WebGoat: Insecure communication, Client Side/Client side filtering
|
||||
|
||||
## Risques
|
||||
|
||||
Les risques dépendent du composant faillible...
|
||||
Les risques dépendent du composant faillible...
|
||||
|
||||
---
|
||||
|
||||
@ -244,7 +244,7 @@ Les risques dépendent du composant faillible...
|
||||
|
||||
## La modélisation de menace
|
||||
|
||||
- Identification des **dépendances externes**.
|
||||
- Identification des **dépendances externes**.
|
||||
Exemple: _serveur GNU/Linux, base de données_
|
||||
- Identification des **points d'entrées**
|
||||
Exemple: _formulaire de contact, port de la base de données_
|
||||
@ -252,8 +252,8 @@ Les risques dépendent du composant faillible...
|
||||
Exemple: _Comptes utilisateurs de l'application, données personnelles, droits d'accès_
|
||||
- Identification des **niveaux de confiance**
|
||||
Exemple: _Utilisateur anonyme, administrateur_
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
### Identification des flux de données
|
||||
|
||||
@ -264,7 +264,7 @@ Les risques dépendent du composant faillible...
|
||||
## Les facteurs d'une bonne métrique
|
||||
|
||||
- **Concision** _Le domaine de mesure est il correctement défini ? La métrique n'essaye t-elle pas de mesurer trop de choses ?_
|
||||
- **Fidélité** _La mesure est elle reproductible ? Mesure t-elle toujours la même chose ?_
|
||||
- **Fidélité** _La mesure est elle reproductible ? Mesure t-elle toujours la même chose ?_
|
||||
- **Intégrité** _Le processus de mesure est il vulnérable à la falsification ?_
|
||||
- **Utilité** _La métrique apporte elle une information utile au processus décisionnel ?_
|
||||
|
||||
@ -272,6 +272,10 @@ Les risques dépendent du composant faillible...
|
||||
|
||||
## Exemple d'outil: Prometheus
|
||||
|
||||
### Téléchargement
|
||||
|
||||
https://prometheus.io/download/#prometheus
|
||||
|
||||
---
|
||||
|
||||
## Configuration générale
|
||||
@ -282,8 +286,7 @@ Les risques dépendent du composant faillible...
|
||||
|
||||
### Modèle de données
|
||||
### Les différents types de métriques
|
||||
### Visualiser les métriques
|
||||
### Effectuer des requêtes sur les métriques
|
||||
### Les requêtes
|
||||
|
||||
---
|
||||
|
||||
@ -301,9 +304,11 @@ Chaque couple **(label, valeur)** est appelée **dimension** de la métrique.
|
||||
```
|
||||
---
|
||||
|
||||
## Les différents types de métriques (1)
|
||||
## Les différents types de métriques
|
||||
|
||||
### Compteur
|
||||
---
|
||||
|
||||
## Compteur (1)
|
||||
|
||||
Un compteur est une métrique dont la valeur ne peut faire qu'augmenter au cours du temps.
|
||||
|
||||
@ -311,9 +316,7 @@ Un compteur est une métrique dont la valeur ne peut faire qu'augmenter au cours
|
||||
|
||||
---
|
||||
|
||||
## Les différents types de métriques (2)
|
||||
|
||||
### Jauge
|
||||
## Jauge
|
||||
|
||||
Une jauge est une métrique dont la valeur peut augmenter ou diminuer au cours du temps.
|
||||
|
||||
@ -323,20 +326,101 @@ Une jauge est une métrique dont la valeur peut augmenter ou diminuer au cours d
|
||||
|
||||
---
|
||||
|
||||
## Les différents types de métriques (3)
|
||||
## Histogramme (1)
|
||||
|
||||
### Histogramme
|
||||
|
||||
Un histogramme est une métrique répartissant les données dans des "paquets" (ou "buckets" en anglais) configurables et comptant le nombre total et par "paquet" d'échantillons ainsi que leur somme.
|
||||
Un histogramme est une métrique répartissant les données dans des "seaux" (ou "buckets" en anglais) configurables et comptant le nombre total et par "paquet" d'échantillons ainsi que leur somme.
|
||||
|
||||

|
||||
|
||||
> **Exemple** Le temps de réponse des requêtes HTTP
|
||||
|
||||
---
|
||||
|
||||
## Histogramme (2)
|
||||
|
||||
### Scénario d'exemple
|
||||
|
||||
Soit la métrique `http_request_duration_seconds` un histogramme avec les "buckets" suivants: 0.5, 1, 2, 3, 5.
|
||||
|
||||
3 requêtes sont effectuées sur l'application avec des temps de 1s, 2s et 3s respectivements.
|
||||
|
||||
On aura sur `/metrics`:
|
||||
|
||||
```
|
||||
http_request_duration_seconds_bucket{le="0.5"} 0
|
||||
http_request_duration_seconds_bucket{le="1"} 1
|
||||
http_request_duration_seconds_bucket{le="2"} 2
|
||||
http_request_duration_seconds_bucket{le="3"} 3
|
||||
http_request_duration_seconds_bucket{le="5"} 3
|
||||
http_request_duration_seconds_bucket{le="+Inf"} 3
|
||||
http_request_duration_seconds_sum 6
|
||||
http_request_duration_seconds_count 3
|
||||
```
|
||||
---
|
||||
|
||||
## Les requêtes
|
||||
|
||||
---
|
||||
|
||||
## Types de données
|
||||
|
||||
- `scalar` _Un nombre à virgule flottante_
|
||||
Exemple: `5.1`
|
||||
|
||||
- `instant vector` _Un ensemble de séries temporelles contenant un seul échantillon pour chaque série temporelle, toutes partageant le même horodatage._
|
||||
Exemple: `http_request_duration_seconds`
|
||||
|
||||
- `range vector` _Un ensemble de séries temporelles contenant une gamme de points de données au fil du temps pour chaque série temporelle._
|
||||
Exemple: `http_request_duration_seconds[5m]`
|
||||
|
||||
- `string` _Une chaine de caratères._
|
||||
Exemple: `"hello world"`
|
||||
---
|
||||
|
||||
## Les opérateurs
|
||||
|
||||
### Opérateurs arithmétiques
|
||||
|
||||
`+`, `-`, `*`, `/`, `%` (modulo), `^` (puissance)
|
||||
|
||||
### Opérateurs de comparaison
|
||||
|
||||
`==`, `!=`, `>`, `>=`, `<`, `<=`
|
||||
|
||||
### Opérateurs d'aggrégation
|
||||
|
||||
`sum`, `min`, `max`, `avg`, `stddev`, `stdvar`, `count`, `count_values`, `bottomk`, `topk`, `quantile`
|
||||
|
||||
### Opérateurs logiques
|
||||
|
||||
`and`, `or`, `unless`
|
||||
|
||||
|
||||
_[Voir la documentation du projet](https://prometheus.io/docs/prometheus/latest/querying/operators/)_
|
||||
|
||||
---
|
||||
|
||||
## Fonctions
|
||||
|
||||
### Quelques exemples
|
||||
|
||||
- `rate(range vector)` Retourne la fréquence moyenne d'augmentation par seconde de la série temporelle dans l'espace de temps donné. À utiliser uniquement avec les compteurs.
|
||||
- `time()` Retourne le nombre de secondes depuis l'Epoch Unix.
|
||||
- `increase(range vector)` Retourne l'augmentation de la série temporelle dans l'interval de temps donné. À utiliser uniquement avec les compteurs.
|
||||
|
||||
Et aussi [histogram_quantile()](https://prometheus.io/docs/prometheus/latest/querying/functions/#histogram_quantile), [predict_linear()](https://prometheus.io/docs/prometheus/latest/querying/functions/#predict_linear()),...
|
||||
|
||||
_[Voir la documentation du projet](https://prometheus.io/docs/prometheus/latest/querying/functions/)_
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Configuration de l'`alertmanager`
|
||||
|
||||
### Téléchargement
|
||||
|
||||
https://prometheus.io/download/#alertmanager
|
||||
|
||||
---
|
||||
|
||||
## Écriture de règles d'alertes
|
||||
@ -466,7 +550,7 @@ vim /etc/ssh/sshd_config
|
||||
# ServerKeyBits 2048
|
||||
# ...
|
||||
rm /etc/ssh/ssh_host_*
|
||||
systemctl restart ssh
|
||||
systemctl restart ssh
|
||||
```
|
||||
---
|
||||
|
||||
@ -590,7 +674,7 @@ apt install rsync
|
||||
apt install rsnapshot rsync
|
||||
```
|
||||
---
|
||||
|
||||
|
||||
## Configuration de rsnapshot (1)
|
||||
|
||||
### Sur le serveur
|
||||
@ -692,8 +776,10 @@ systemctl reload apache2
|
||||
```bash
|
||||
# Afficher les directives de chargement des modules
|
||||
grep LoadModule /etc/apache2/mods-enabled/*.load
|
||||
|
||||
# Désactiver un module
|
||||
rm /etc/apache2/mods-enabled/<module>.load
|
||||
|
||||
# Recharger la configuration Apache2
|
||||
systemctl reload apache2
|
||||
```
|
||||
@ -721,13 +807,17 @@ systemctl reload apache2
|
||||
```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
|
||||
|
||||
# Activer la configuration recommandée
|
||||
mv /etc/modsecurity/modsecurity.conf-recommended \
|
||||
/etc/modsecurity/modsecurity.conf
|
||||
|
||||
# Recharcher la configuration Apache2
|
||||
systemctl reload apache2
|
||||
```
|
||||
@ -766,7 +856,7 @@ NameVirtualHost *:80
|
||||
ServerName secure.example.com
|
||||
DocumentRoot /var/www/html
|
||||
SSLEngine On
|
||||
SSLCertificateFile /path/to/cert.pem
|
||||
SSLCertificateFile /path/to/cert.pem
|
||||
SSLCertificateKeyFile /path/to/key.pem
|
||||
# etc...
|
||||
</VirtualHost>
|
||||
@ -774,19 +864,104 @@ NameVirtualHost *:80
|
||||
|
||||
---
|
||||
|
||||
## Monitoring
|
||||
## Tester la configuration TLS/SSL
|
||||
|
||||
### Configuration et usage de fail2ban
|
||||
### Configuration et usage de Monit
|
||||
Avec le projet [TestSSL](https://testssl.sh/)
|
||||
|
||||
```bash
|
||||
# Récupération du script
|
||||
wget -O- https://testssl.sh/ > testssl.sh
|
||||
|
||||
# Rendre exécutable le script
|
||||
chmod +x ./testssl.sh
|
||||
|
||||
# Tester une URL
|
||||
./testssl.sh <URL>
|
||||
```
|
||||
---
|
||||
|
||||
## Supervision du système
|
||||
|
||||
### Installation, configuration et usage de fail2ban (NIDS)
|
||||
### Supervision du système avec Prometheus
|
||||
|
||||
---
|
||||
|
||||
## Installation de fail2ban
|
||||
|
||||
```bash
|
||||
apt install fail2ban
|
||||
```
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
### Principaux fichiers et répertoires
|
||||
|
||||
- `/etc/fail2ban/fail2ban.conf` - Fichier de configuration général
|
||||
- `/etc/fail2ban/jail.conf` - Définition des "jails" par défaut
|
||||
- `/etc/fail2ban/jail.d` - Définitions de "jails" additionnelles
|
||||
- `/etc/fail2ban/filter.d` - Filtres d'activation des "jails"
|
||||
- `/etc/fail2ban/action.d` - Définition des actions potentielles à exécuter en cas d'activation d'une "jail".
|
||||
|
||||
_La personnalisation de la configuration se fait en créant des fichiers `<nom_fichier>.local`._
|
||||
|
||||
---
|
||||
|
||||
## Exercice
|
||||
|
||||
Configurer fail2ban pour bannir les IP à l'origine de tentatives de connexion échouées sur un site Wordpress.
|
||||
|
||||
1. Installer et configurer Wordpress sur votre serveur (voir page suivante)
|
||||
2. Créer une `failregex` pour détecter les tentatives échouées de connexion à votre Wordpress. Quelle est la différence dans les logs entre un échec et un succès ?
|
||||
3. Créer votre filtre `/etc/fail2ban/filter.d/wordpress.conf` avec votre expression régulière. Pour tester:
|
||||
```
|
||||
fail2ban-regex --print-all-match <logfile> \
|
||||
/etc/fail2ban/filter.d/<filter>.conf
|
||||
```
|
||||
4. Créer votre propre section "wordpress" dans le fichier `/etc/fail2ban/jail.local` en vous inspirant des exemples déjà présents.
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Préparation
|
||||
|
||||
- Sur votre machine virtuelle, installer Wordpress et MySQL
|
||||
```bash
|
||||
apt install wordpress mysql-server
|
||||
```
|
||||
- Activer Wordpress
|
||||
```bash
|
||||
ln -s /usr/share/wordpress /var/www/html/wordpress
|
||||
```
|
||||
- Copier la configuration Wordpress par défaut
|
||||
```bash
|
||||
cp /usr/share/wordpress/wp-config-sample.php \
|
||||
/etc/wordpress/config-<votre_ip>.php
|
||||
```
|
||||
- Créer un compte utilisateur dans la base de données MySQL
|
||||
```bash
|
||||
mysql -u root -p
|
||||
mysql> CREATE DATABASE wordpress;
|
||||
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost'
|
||||
IDENTIFIED BY '<password>';
|
||||
mysql> quit
|
||||
```
|
||||
- Modifier la configuration pour que Wordpress utilise sa base de données (fichier `/etc/wordpress/config-<votre_ip>.php`)
|
||||
---
|
||||
|
||||
## Supervision du système avec Prometheus
|
||||
|
||||
## Exercice
|
||||
|
||||
- Sur votre machine virtuelle, installer l'exporteur de métriques [`Node Exporter`](https://github.com/prometheus/node_exporter/) et créer un nouveau service [`systemd`](https://doc.ubuntu-fr.org/creer_un_service_avec_systemd) pour celui ci.
|
||||
- Installer et configurer un serveur Apache2 avec un VirtualHost exposant via la directive `ProxyPass` du module [`mod_proxy`](https://httpd.apache.org/docs/current/mod/mod_proxy.html).
|
||||
- Mettre en place une règle d'alerte sur votre instance Prometheus locale afin de prévenir le remplissage du disque de votre serveur via la fonction [`predict_linear()`](https://prometheus.io/docs/prometheus/latest/querying/functions/#predict_linear()) (par exemple 4 heures ?)
|
||||
|
||||
---
|
||||
|
||||
# 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/)
|
||||
[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/)
|
||||
|
Reference in New Issue
Block a user