Logomotion: Volet sécurité des applications Web, métrologie / prometheus
This commit is contained in:
parent
03faa7a663
commit
4d76474d99
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
|
@ -0,0 +1,110 @@
|
||||||
|
<style>pre, table { font-size: 0.6em !important; }</style>
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
---
|
|
@ -0,0 +1 @@
|
||||||
|
/node_modules
|
|
@ -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'))
|
|
@ -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 <william.petit@cadoles.com>",
|
||||||
|
"license": "AGPL-3.0",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.16.2",
|
||||||
|
"prom-client": "^10.2.2"
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -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'
|
|
@ -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"
|
|
@ -0,0 +1,6 @@
|
||||||
|
groups:
|
||||||
|
- name: hello-world
|
||||||
|
rules:
|
||||||
|
- alert: HelloWorldAlert
|
||||||
|
expr: demoapp_hello_world > 5
|
||||||
|
for: 10s
|
Loading…
Reference in New Issue