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