Logomotion: Volet sécurité des applications Web, métrologie / prometheus

This commit is contained in:
wpetit 2017-12-21 16:55:59 +01:00 committed by Benjamin Bohard
parent 884905c1db
commit c90015ab94
10 changed files with 212 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -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
---

View File

@ -0,0 +1 @@
/node_modules

View File

@ -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'))

View File

@ -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"
}
}

View File

@ -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

View File

@ -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'

View File

@ -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"

View File

@ -0,0 +1,6 @@
groups:
- name: hello-world
rules:
- alert: HelloWorldAlert
expr: demoapp_hello_world > 5
for: 10s