diff --git a/developpement/securite_web/img/histogram.png b/developpement/securite_web/img/histogram.png new file mode 100644 index 0000000..8534862 Binary files /dev/null and b/developpement/securite_web/img/histogram.png differ diff --git a/developpement/securite_web/img/jauge.jpg b/developpement/securite_web/img/jauge.jpg new file mode 100644 index 0000000..2a14329 Binary files /dev/null and b/developpement/securite_web/img/jauge.jpg differ diff --git a/developpement/securite_web/presentation/slides.md b/developpement/securite_web/presentation/slides.md new file mode 100644 index 0000000..ff55597 --- /dev/null +++ b/developpement/securite_web/presentation/slides.md @@ -0,0 +1,110 @@ + + +# Sécurité des applications Web +## William Petit - S.C.O.P. Cadoles + +--- + +## Métrologie appliquée à la sécurité + +### Méthodologie générale +### Les facteurs d'une bonne métrique +### Exemple d'outil: Prometheus + +--- + + +## Méthodologie générale + +1. Définir le modèle de menace +2. Identifier et isoler les scénarios d'attaque pour les différentes menaces +3. Trouver les indicateurs "clés" pour ces scénarios i.e. identifier les métriques pertinentes pour la détection des comportements suspects +4. Mettre en place les sondes pour les métriques +5. Définir les seuils d'alerte et les réponses à apporter + +--- + +## 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 ?_ +- **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 ?_ + +--- + +## Exemple d'outil: Prometheus + +--- + +## Configuration générale + +--- + +## Instrumentation de l'application + +### Modèle de données +### Les différents types de métriques +### Visualiser les métriques +### Effectuer des requêtes sur les métriques + +--- + +## Modèle de données + +Prometheus stocke des échantillons (mesures) sous la forme de **séries temporelles**. Il créait une nouvelle série pour chaque association **(nom_métrique, label1=value, label2=value, ...)**. + +Chaque couple **(label, valeur)** est appelée **dimension** de la métrique. + + +**Représentation** +``` + http_total_requests{ method="POST", path="/test" } + | name | labels | +``` + + + +--- + +## Les différents types de métriques (1) + +### Compteur + +Un compteur est une métrique dont la valeur ne peut faire qu'augmenter au cours du temps. + +> **Exemple** Nombre total de connexions d'un compte sur un site + +--- + +## Les différents types de métriques (2) + +### Jauge + +Une jauge est une métrique dont la valeur peut augmenter ou diminuer au cours du temps. + +![center 50%](../img/jauge.jpg) + +> **Exemple** La température d'une pièce + +--- + +## Les différents types de métriques (3) + +### 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. + +![center 70%](../img/histogram.png) + +> **Exemple** Le temps de réponse des requêtes HTTP + +--- + +## Configuration de l'`alertmanager` + +--- + +## Écriture de règles d'alertes + +--- diff --git a/developpement/securite_web/ressources/demo-app/.gitignore b/developpement/securite_web/ressources/demo-app/.gitignore new file mode 100644 index 0000000..07e6e47 --- /dev/null +++ b/developpement/securite_web/ressources/demo-app/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/developpement/securite_web/ressources/demo-app/app.js b/developpement/securite_web/ressources/demo-app/app.js new file mode 100644 index 0000000..9138a70 --- /dev/null +++ b/developpement/securite_web/ressources/demo-app/app.js @@ -0,0 +1,28 @@ +// Voir https://github.com/siimon/prom-client +const client = require('prom-client'); +// Voir http://expressjs.com/ +const express = require('express') + +// Création de notre application Web +const app = express() + +// On collecte les métriques proposées par défaut par le module 'prom-client' +const collectDefaultMetrics = client.collectDefaultMetrics; +collectDefaultMetrics({ timeout: 5000 }); // Récolte toutes les 5s + +// Définition des métriques +const helloWorldCounter = new client.Counter({ + name: 'demoapp_hello_world', + help: 'Total de requêtes sur la page "Hello World"' +}); + +app.get('/', (req, res) => { + helloWorldCounter.inc() + res.send('Hello World!') +}) + +// On expose les métriques de notre récolteur sur /metrics +app.get('/metrics', (req, res) => res.send(client.register.metrics())) + +// On écoute sur le port 0.0.0.0:3000 +app.listen(3000, () => console.log('listening on port 3000')) diff --git a/developpement/securite_web/ressources/demo-app/package.json b/developpement/securite_web/ressources/demo-app/package.json new file mode 100644 index 0000000..e332e00 --- /dev/null +++ b/developpement/securite_web/ressources/demo-app/package.json @@ -0,0 +1,15 @@ +{ + "name": "demo-app", + "version": "0.0.0", + "description": "", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "William Petit ", + "license": "AGPL-3.0", + "dependencies": { + "express": "^4.16.2", + "prom-client": "^10.2.2" + } +} diff --git a/developpement/securite_web/ressources/prometheus/docker-compose.yml b/developpement/securite_web/ressources/prometheus/docker-compose.yml new file mode 100644 index 0000000..a04c9af --- /dev/null +++ b/developpement/securite_web/ressources/prometheus/docker-compose.yml @@ -0,0 +1,18 @@ +version: '2' +services: + prometheus: + image: prom/prometheus + volumes: + - ./etc/prometheus:/etc/prometheus + ports: + - 9090:9090 + alertmanager: + image: prom/alertmanager + volumes: + - ./etc/alertmanager:/etc/alertmanager + ports: + - 9093:9093 + faketools: + image: bornholm/faketools + ports: + - 8080:8080 diff --git a/developpement/securite_web/ressources/prometheus/etc/alertmanager/config.yml b/developpement/securite_web/ressources/prometheus/etc/alertmanager/config.yml new file mode 100644 index 0000000..eec8517 --- /dev/null +++ b/developpement/securite_web/ressources/prometheus/etc/alertmanager/config.yml @@ -0,0 +1,14 @@ +global: + smtp_smarthost: 'faketools:2525' + smtp_from: 'alertmanager@my.org' + smtp_auth_username: 'alertmanager' + smtp_auth_password: 'password' + smtp_require_tls: false + +route: + receiver: dev-team + +receivers: + - name: 'dev-team' + email_configs: + - to: 'dev-team@my.org' diff --git a/developpement/securite_web/ressources/prometheus/etc/prometheus/prometheus.yml b/developpement/securite_web/ressources/prometheus/etc/prometheus/prometheus.yml new file mode 100644 index 0000000..51f8d28 --- /dev/null +++ b/developpement/securite_web/ressources/prometheus/etc/prometheus/prometheus.yml @@ -0,0 +1,20 @@ +# Configuration de l'application sur laquelle +# Prometheus doit récolter des informations + +scrape_configs: + - job_name: demoapp + scrape_interval: 10s + metrics_path: /metrics + static_configs: + - targets: [ "172.17.0.1:3000" ] + +# Configuration de l'alertmanager + +alerting: + alertmanagers: + - static_configs: + - targets: [ "alertmanager:9093" ] + +# Définition des règles d'alertes +rule_files: + - "/etc/prometheus/rules.d/*.yml" diff --git a/developpement/securite_web/ressources/prometheus/etc/prometheus/rules.d/hello-world.yml b/developpement/securite_web/ressources/prometheus/etc/prometheus/rules.d/hello-world.yml new file mode 100644 index 0000000..fe12f87 --- /dev/null +++ b/developpement/securite_web/ressources/prometheus/etc/prometheus/rules.d/hello-world.yml @@ -0,0 +1,6 @@ +groups: + - name: hello-world + rules: + - alert: HelloWorldAlert + expr: demoapp_hello_world > 5 + for: 10s