CESI: Sécurité des entreprises, infrastructure Vagrant avec supervision Prometheus
This commit is contained in:
parent
85d1a97452
commit
56066ac24f
BIN
cesi/securite_entreprise/presentation/img/communicationrules.png
Normal file
BIN
cesi/securite_entreprise/presentation/img/communicationrules.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
BIN
cesi/securite_entreprise/presentation/img/histogram.png
Normal file
BIN
cesi/securite_entreprise/presentation/img/histogram.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 70 KiB |
BIN
cesi/securite_entreprise/presentation/img/jauge.jpg
Normal file
BIN
cesi/securite_entreprise/presentation/img/jauge.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
@ -1,14 +1,12 @@
|
||||
<style>pre, table { font-size: 0.6em !important; }</style>
|
||||
|
||||
# La sécurité informatique en entreprise
|
||||
|
||||
## Le réseau intranet
|
||||
|
||||
William Petit - S.C.O.P. Cadoles - 2017
|
||||
William Petit - S.C.O.P. Cadoles
|
||||
|
||||
---
|
||||
<!-- page_number: true -->
|
||||
|
||||
---
|
||||
|
||||
## Rappel des objectifs de la sécurité informatique
|
||||
|
||||
1. Maintenir l'intégrité des données
|
||||
@ -21,28 +19,647 @@ William Petit - S.C.O.P. Cadoles - 2017
|
||||
|
||||
## Topologie d'exemple
|
||||
|
||||
![center](./img/intranettopologie.png)
|
||||
![center 100%](./img/intranettopologie.png?)
|
||||
|
||||
---
|
||||
|
||||
## Mise en garde
|
||||
|
||||
La topologie de cette exemple est **volontairement simplifiée**.
|
||||
|
||||
Elle n'est là que pour vous présenter les grands principes de séparation en "zones" de l'architecture réseau d'une entreprise, les "rôles" de ces différentes zones et la manière de les traiter d'un point de vue sécurité.
|
||||
|
||||
En réalité, la plupart des réseaux d'entreprise comportent beaucoup plus de ces zones, souvent imbriquées et multiplient les routeurs/pare-feu entre les zones.
|
||||
|
||||
---
|
||||
|
||||
## Démarrage de la maquette
|
||||
|
||||
1. Installer [Vagrant](https://www.vagrantup.com/downloads.html) et [VirtualBox](https://www.virtualbox.org/) sur son poste.
|
||||
2. Récupérer le projet Vagrant `intranet-demo`.
|
||||
3. Se placer dans le répertoire `intranet-demo` et faire dans une invite de commande
|
||||
```
|
||||
vagrant plugin install vagrant-reload vagrant-vbguest
|
||||
vagrant up
|
||||
```
|
||||
4. Lorsque le programme vous le demande (2 fois), sélectionner l'interface réseau à utiliser (votre interface filaire ou wifi branchée au réseau de l'établissement).
|
||||
5. Attendre la fin de l'installation.
|
||||
|
||||
---
|
||||
|
||||
## Le pare feu
|
||||
|
||||
Première et dernière ligne de défense entre le réseau de l'entreprise et Internet. Il est en charge de filtrer les communications entre le réseau de l'entreprise et l'extérieur.
|
||||
|
||||
Dans notre configuration d'exemple, il assure également le rôle de routeur entre les différentes zones de notre intranet. Il assure donc également le filtrage des communications internes.
|
||||
|
||||
---
|
||||
|
||||
## La zone "Services Intranet"
|
||||
|
||||
---
|
||||
Les services "Intranet" sont des services dédiés à l'usage **interne** de l'entreprise. Ce sont souvent des applications "métier", des applications Web de travail collaboratif, des serveurs de fichiers...
|
||||
|
||||
## Les zones "Postes de travail"
|
||||
|
||||
---
|
||||
|
||||
## Sauvegarde des postes
|
||||
Ces services ne sont normalement accessibles que depuis le réseau interne de l'entreprise (notamment les réseaux type "stations de travail").
|
||||
|
||||
---
|
||||
|
||||
## La zone "Services Extranet"
|
||||
|
||||
Les services "Extranet" sont des services dédiés à l'usage **externe** de l'entreprise. Ce sont souvent des sites ou des applications web dédiées à la relation clients et/ou partenaires. Des applications web telles qu'un "webmail" peuvent également être positionnées dans cette zone.
|
||||
|
||||
Ces services sont normalement accessibles depuis Internet, très souvent derrière un "mur" d'authentification spécifique ou de type "Single Sign On" (SSO).
|
||||
|
||||
---
|
||||
|
||||
## Les zones "Stations de travail"
|
||||
|
||||
Les stations de travail devraient **être réparties** dans leur propre zone, et si possible **dans des zones dédiées aux différents "corps de métiers"** de l'entreprise.
|
||||
|
||||
Ainsi, le service "Comptabilité" ne devrait pas être sur le même réseau que le service "Développement".
|
||||
|
||||
Les **règles de communication internes/externes** devraient également être **spécialisées** en fonction des contraintes/besoins des différents corps de métiers.
|
||||
|
||||
**Exemple** Les connexions SSH vers l'extérieur ne devraient pas être possibles depuis la zone "Comptabilité" mais certainement autorisées/nécessaires depuis le réseau "Développement".
|
||||
|
||||
---
|
||||
|
||||
## Règles générales de communication inter-zones
|
||||
|
||||
Chaque zone devrait être **notée suivant le risque d'intrusion** et **le potentiel d'impact d'une intrusion**.
|
||||
|
||||
Une zone avec un risque d'intrusion de **niveau N ne devrait pas pouvoir initier de communication vers une zone de niveau N-1**.
|
||||
|
||||
![center 50%](img/communicationrules.png)
|
||||
|
||||
L'application de cette règle générale n'est pas toujours possible et il faut parfois l'adapter aux contraintes de fonctionnement de l'entreprise.
|
||||
|
||||
---
|
||||
|
||||
## D'autres zones, d'autres usages
|
||||
|
||||
- Imprimantes
|
||||
- Terminaux mobiles (BYOD)
|
||||
- Internet des objets
|
||||
- Invités
|
||||
- etc
|
||||
|
||||
---
|
||||
|
||||
## Sécurité et configuration d'un serveur GNU/Linux
|
||||
|
||||
### Installation du serveur
|
||||
### Politique d'accès et configuration SSH
|
||||
### Règles de pare-feu
|
||||
|
||||
---
|
||||
|
||||
## Installation du serveur
|
||||
|
||||
1. Télécharger l'image ISO Ubuntu Server 16.04.*
|
||||
2. Créer une nouvelle machine dans VirtualBox
|
||||
3. Configurer le réseau de la nouvelle machine pour utiliser une interface de type "bridge" et autoriser toutes les connexions
|
||||
4. Démarrer la machine et sélectionner l'image ISO
|
||||
|
||||
---
|
||||
|
||||
## Règles générales de partitionnement (1)
|
||||
|
||||
- Utiliser [LVM](https://wiki.ubuntu.com/Lvm)
|
||||
- ~300/500M pour `/boot`
|
||||
- Partition séparée pour `/var` ( via un volume logique)
|
||||
- Partition séparée pour `/home` (via un volume logique)
|
||||
- Partition séparée pour `/` (via un volume logique)
|
||||
- Garder de l'espace pour pouvoir agrandir au besoin une partition LVM
|
||||
|
||||
---
|
||||
|
||||
|
||||
### Règles générales de partitionnement (2)
|
||||
|
||||
**Exemple** Pour 10G de disque
|
||||
|
||||
|Point de montage|Système de fichier|Taille|
|
||||
|:-|:-|:-|
|
||||
|`/boot`|ext4 (Primaire)|500M
|
||||
|`/`|ext4 (LVM)|4G (~30/40%)
|
||||
|`/home`|ext4 (LVM)|1G (10%)|
|
||||
|`/var`|ext4 (LVM)|3G (~30/40%)|
|
||||
|`swap`|swap (LVM)| round(sqrt(RAM) < swap < 2*RAM |
|
||||
|
||||
Et garder ~10% d'espace libre pour pouvoir agrandir un volume logique au besoin.
|
||||
|
||||
---
|
||||
|
||||
## Activation des mises à jour automatiques
|
||||
|
||||
Si à l'installation l'option n'est pas proposée (sur Debian et dérivées)
|
||||
|
||||
```bash
|
||||
apt-get install unattended-upgrades apt-listchanges
|
||||
```
|
||||
[Voir la documentation Debian pour plus d'informations](https://wiki.debian.org/UnattendedUpgrades)
|
||||
|
||||
---
|
||||
|
||||
## Politique d'accès et configuration SSH
|
||||
|
||||
---
|
||||
|
||||
## Installation du serveur OpenSSH
|
||||
|
||||
```bash
|
||||
apt install openssh-server
|
||||
```
|
||||
---
|
||||
|
||||
## Désactivation de l'authentification SSH avec l'utilisateur `root`
|
||||
|
||||
```bash
|
||||
vim /etc/ssh/sshd_config
|
||||
# ...
|
||||
# PermitRootLogin no
|
||||
# ...
|
||||
systemctl restart ssh
|
||||
```
|
||||
---
|
||||
|
||||
## Désactivation de la connexion SSH avec un mot de passe
|
||||
|
||||
```bash
|
||||
vim /etc/ssh/sshd_config
|
||||
# ...
|
||||
# PasswordAuthentication no
|
||||
# ...
|
||||
systemctl restart ssh
|
||||
```
|
||||
---
|
||||
|
||||
## Restreindre les utilisateurs et/ou groupes autorisés à se connecter en SSH
|
||||
|
||||
```bash
|
||||
vim /etc/ssh/sshd_config
|
||||
# ...
|
||||
# AllowUsers jdoe bob
|
||||
# AllowGroups jdoe bob
|
||||
# ...
|
||||
systemctl restart ssh
|
||||
```
|
||||
---
|
||||
|
||||
## Augmenter la taille des clés SSH du serveur
|
||||
|
||||
```bash
|
||||
vim /etc/ssh/sshd_config
|
||||
# ...
|
||||
# ServerKeyBits 2048
|
||||
# ...
|
||||
rm /etc/ssh/ssh_host_*
|
||||
ssh-keygen -A # On régénère les clés SSH du serveur
|
||||
systemctl restart ssh
|
||||
```
|
||||
---
|
||||
|
||||
## Créer des comptes utilisateurs avec un mot de passe expiré (1)
|
||||
|
||||
```bash
|
||||
adduser <uid>
|
||||
chage -d 0 <uid>
|
||||
```
|
||||
Puis penser à copier la clé SSH publique de l'utilisateur dans `/home/<uid>/.ssh/authorized_keys`.
|
||||
|
||||
---
|
||||
|
||||
## Créer des comptes utilisateurs avec un mot de passe expiré (2)
|
||||
|
||||
Attention, OpenSSH est très "chatouilleux" avec les droits sur les répertoires `.ssh` et le fichier `.ssh/authorized_keys`. En cas de doute:
|
||||
|
||||
```bash
|
||||
chmod go-w <uid> <uid>/.ssh
|
||||
chmod 600 <uid>/.ssh/authorized_keys
|
||||
chown <uid> $HOME/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Règles de pare-feu
|
||||
|
||||
---
|
||||
|
||||
## Installation d'UFW
|
||||
|
||||
> Uncomplicated Firewall
|
||||
|
||||
```bash
|
||||
apt install ufw # Si il n'est pas déjà installé
|
||||
```
|
||||
---
|
||||
|
||||
## Activation du pare-feu
|
||||
|
||||
```bash
|
||||
iptables -L # Afficher les règles iptables
|
||||
ufw allow 22/tcp # Pour éviter de perdre la connexion SSH actuelle
|
||||
ufw enable # Activer le pare-feu
|
||||
iptables -L # Vérifier l'application des règles
|
||||
```
|
||||
---
|
||||
|
||||
## Vérifier le statut des règles
|
||||
|
||||
```bash
|
||||
ufw status verbose
|
||||
```
|
||||
---
|
||||
|
||||
## Gestion des règles par défaut
|
||||
|
||||
```bash
|
||||
ufw default deny # Refuser tous les paquets par défaut
|
||||
ufw default allow # Accepter tous les paquets par défaut
|
||||
ufw default allow outgoing # Accepter les connexions sortantes par défaut
|
||||
ufw default allow ingoing # Accepter les connexions entrantes par défaut
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Ajouter des règles
|
||||
|
||||
```bash
|
||||
# Connexions entrantes
|
||||
|
||||
# Autoriser toutes les connexions depuis 192.168.0.4 sur le port 22
|
||||
ufw allow from 192.168.0.4 to any port 22
|
||||
# Refuser toutes les connexions depuis 207.46.232.182
|
||||
ufw deny from 207.46.232.182
|
||||
|
||||
# Connexions sortantes
|
||||
|
||||
# Autoriser les connexions UDP sur le port 53 (requêtes DNS)
|
||||
ufw allow out 53/udp
|
||||
# Autoriser les connexions MySQL (3306/tcp) vers l'adresse 192.168.0.43
|
||||
ufw allow out to 192.168.0.43 port mysql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Supprimer une règle
|
||||
|
||||
```bash
|
||||
ufw status numbered # Afficher les identifiants des règles
|
||||
ufw delete <id> # Supprimer une règle par son identifiant
|
||||
```
|
||||
---
|
||||
|
||||
## Exercice
|
||||
|
||||
Avec UFW, dans l'infrastructure Vagrant, configurer le serveur `extranet-wordpress` pour:
|
||||
|
||||
- Refuser toutes les connexions entrantes/sortantes par défaut
|
||||
- Autoriser les connexions entrantes sur le port 22 depuis toutes les interfaces (accès SSH)
|
||||
- Autoriser les connexions entrantes sur le port 80
|
||||
- Autoriser les connexions sortantes sur le port 80/443
|
||||
|
||||
Ressouces:
|
||||
|
||||
- [UFW - Documentation Ubuntu Francophone](https://doc.ubuntu-fr.org/ufw)
|
||||
- [UFW - Documentation Arch Wiki](https://wiki.archlinux.org/index.php/Uncomplicated_Firewall)
|
||||
|
||||
---
|
||||
|
||||
## Détection des tentatives d'intrusions
|
||||
|
||||
## NIDS
|
||||
## HIDS
|
||||
## Exemple: fail2ban
|
||||
|
||||
---
|
||||
|
||||
## NIDS
|
||||
|
||||
Un NIDS ou **Network Intrusion Detection System** est un système informatique dont l'objectif est de detecter les comportements anormaux, souvent synonymes d'intrusions, **sur un réseau**.
|
||||
|
||||
Pour ce faire, il analyse les trames transitant sur le réseau et applique des règles de classification permettant de déclencher automatiquement des actions d'alertes ou préventives.
|
||||
|
||||
---
|
||||
|
||||
## HIDS
|
||||
|
||||
Un HIDS ou **Host Intrusion Detection System** est un système informatique dont l'objectif est de detecter les comportements anormaux, souvent synonymes d'intrusions, **sur une machine**.
|
||||
|
||||
Les HIDS peuvent utiliser des sources d'informations très variables en fonction de leur spécialisation: droits sur le système de fichiers, cycle de vie des processus s'exécutant sur le système, règles de pare-feu, fichiers de journalisation...
|
||||
|
||||
---
|
||||
|
||||
## Exemple: fail2ban
|
||||
|
||||
Le projet [fail2ban](https://github.com/fail2ban/fail2ban) est un HIDS simple à mettre en place qui se base sur les fichiers de journalisation d'un serveur.
|
||||
|
||||
Il utilise des expressions régulières en temps réels sur les fichiers de journalisation pour détecter les tentatives d'intrusion et extraire les informations nécessaires à la mise en place d'actions préventives, par exemple bloquer l'adresse IP de l'attaquant pendant un certain temps.
|
||||
|
||||
**Exemples d'actions détectées** Échecs multiples d'authentification SSH, tentatives d'injections SQL sur une application Web, etc...
|
||||
|
||||
---
|
||||
|
||||
## 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. Créer un filtre 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.
|
||||
|
||||
**Ressources**
|
||||
|
||||
- [Créer des filtres - Documentation fail2ban](https://fail2ban.readthedocs.io/en/latest/filters.html)
|
||||
|
||||
---
|
||||
|
||||
## Supervision de l'infrastructure
|
||||
|
||||
### Les facteurs d'une bonne métrique
|
||||
### Exemple d'outil: Prometheus
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
|
||||
### Téléchargement
|
||||
|
||||
https://prometheus.io/download/#prometheus
|
||||
|
||||
---
|
||||
|
||||
## Configuration générale
|
||||
|
||||
---
|
||||
|
||||
## Instrumentation de l'application
|
||||
|
||||
### Modèle de données
|
||||
### Les différents types de métriques
|
||||
### Les requêtes
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
|
||||
---
|
||||
|
||||
## Compteur (1)
|
||||
|
||||
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
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
|
||||
---
|
||||
|
||||
## Histogramme (1)
|
||||
|
||||
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.
|
||||
|
||||
![center 70%](./img/histogram.png)
|
||||
|
||||
> **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
|
||||
|
||||
---
|
||||
|
||||
## Exercice
|
||||
|
||||
- Sur une des machines virtuelles de la zone "Intranet", 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.
|
||||
- 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 ?)
|
||||
|
||||
**Ressources**
|
||||
|
||||
- [Modifier et créer des fichiers Unit pour systemd - Documentation Red Hat](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files)
|
||||
|
||||
---
|
||||
|
||||
## Politique de sauvegarde
|
||||
|
||||
### La règle générale "3-2-1"
|
||||
### Exemple d'outil: rsnapshot
|
||||
|
||||
---
|
||||
|
||||
## La règle générale "3-2-1"
|
||||
|
||||
- **3 sauvegardes au total** (minimum)
|
||||
- **2 sauvegardes locales** sur des **supports physiques différents**
|
||||
- **1 sauvegarde distante** dans un centre de données éloigné du secteur géographique de la société
|
||||
|
||||
---
|
||||
|
||||
## Installation de rsync/rsnapshot
|
||||
|
||||
### Sur la machine à sauvegarder
|
||||
|
||||
```bash
|
||||
apt install rsync
|
||||
```
|
||||
|
||||
### Sur la machine de sauvegarde
|
||||
|
||||
```bash
|
||||
apt install rsnapshot rsync
|
||||
```
|
||||
---
|
||||
|
||||
## Configuration de rsnapshot (1)
|
||||
|
||||
### Sur le serveur
|
||||
|
||||
- Créer un utilisateur dédié à la sauvegarde
|
||||
- S'assurer que le compte de sauvegarde a les droits de lecture sur les répertoires à sauvegarder
|
||||
- Déployer une clé SSH pour le compte de sauvegarde (à utiliser sur le client)
|
||||
|
||||
---
|
||||
|
||||
## Configuration de rsnapshot (2)
|
||||
|
||||
### Sur le client
|
||||
|
||||
```bash
|
||||
# Éditer la configuration
|
||||
vim /etc/rsnapshot.conf
|
||||
|
||||
# Définition de la rotation des sauvegardes
|
||||
#
|
||||
# retain hourly 24 # Une sauvegarde par heure hourly.0 -> hourly.23
|
||||
# retain daily 7 # Si le rép. existe, copie hourly.23 vers daily.0
|
||||
# retain weekly 4 # Si le rép. existe, copie daily.6 vers weekly.0
|
||||
# retain monthly 12 # Si le rép. existe, copie weekly.3 vers monthly.0
|
||||
|
||||
# Vérifier la configuration
|
||||
rsnapshot configtest
|
||||
|
||||
# Exécuter un "dry-run"
|
||||
rsnapshot -t hourly # Ou daily/weekly/monthly
|
||||
|
||||
# Configurer les tâches CRON
|
||||
crontab -e
|
||||
|
||||
# @hourly rsnapshot hourly
|
||||
# @daily rsnapshot daily
|
||||
# @weekly rsnapshot weekly
|
||||
# @monthly rsnapshot monthly
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
## Restaurer une sauvegarde
|
||||
|
||||
```bash
|
||||
rsync -av \
|
||||
/var/cache/rsnapshot/<level>.<iteration> \
|
||||
user@server-host:/path/to/dest
|
||||
```
|
||||
---
|
||||
|
||||
## Aller plus loin
|
||||
@ -54,21 +671,17 @@ William Petit - S.C.O.P. Cadoles - 2017
|
||||
|
||||
### Supervision
|
||||
|
||||
- [Nagios]()
|
||||
- [Nagios](https://www.nagios.org/)
|
||||
- [Monit](https://mmonit.com/monit/)
|
||||
|
||||
### Centralisation et analyse des journaux
|
||||
|
||||
- [La suite ELK](https://www.elastic.co/fr/products)
|
||||
- [Munin](http://munin-monitoring.org/)
|
||||
|
||||
---
|
||||
### Sauvegarde
|
||||
|
||||
## Le poste de travail
|
||||
|
||||
### Stratégie antivirale
|
||||
### Stratégie de mise à jour
|
||||
### Stratégie de sauvegarde
|
||||
### Confidentialité des communications
|
||||
- [Bareos](https://www.bareos.org/en/)
|
||||
|
||||
---
|
||||
|
||||
@ -84,7 +697,6 @@ William Petit - S.C.O.P. Cadoles - 2017
|
||||
### Cryptographie à clé publique/privée
|
||||
### GPG
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Cryptographie à clé publique/privée (1)
|
||||
|
@ -2,8 +2,7 @@
|
||||
|
||||
Démonstrateur d'un intranet d'entreprise composé de:
|
||||
|
||||
- Un pare-feu
|
||||
- Un réseau "Comptabilité" avec un poste client Linux
|
||||
- Un pare-feu/routeur
|
||||
- Un réseau "Développement" avec un poste client Linux
|
||||
- Un réseau "Services Intranet"
|
||||
- Un réseau "Services Extranet"
|
||||
|
@ -10,8 +10,8 @@ Vagrant.configure("2") do |config|
|
||||
# For a complete reference, please see the online documentation at
|
||||
# https://docs.vagrantup.com.
|
||||
|
||||
config.vbguest.auto_update = false
|
||||
config.vbguest.no_remote = true
|
||||
# config.vbguest.auto_update = false
|
||||
# config.vbguest.no_remote = true
|
||||
|
||||
config.vm.provision :shell,
|
||||
inline: "localectl set-keymap fr"
|
||||
@ -23,9 +23,10 @@ Vagrant.configure("2") do |config|
|
||||
|
||||
firewall.vm.network "public_network"
|
||||
|
||||
firewall.vm.network "private_network", ip: "192.168.200.254", virtualbox_intnet: "accounting"
|
||||
# firewall.vm.network "private_network", ip: "192.168.200.254", virtualbox_intnet: "accounting"
|
||||
firewall.vm.network "private_network", ip: "192.168.201.254", virtualbox_intnet: "developer"
|
||||
firewall.vm.network "private_network", ip: "192.168.202.254", virtualbox_intnet: "intra-services"
|
||||
firewall.vm.network "private_network", ip: "192.168.202.254", virtualbox_intnet: "extranet-services"
|
||||
firewall.vm.network "private_network", ip: "192.168.203.254", virtualbox_intnet: "intranet-services"
|
||||
|
||||
firewall.vm.provision :shell, path: "provisioning/common/disable_predictable_interfaces.sh"
|
||||
firewall.vm.provision :reload
|
||||
@ -35,29 +36,49 @@ Vagrant.configure("2") do |config|
|
||||
|
||||
end
|
||||
|
||||
config.vm.define "intranet-portal" do |portal|
|
||||
portal.vm.box = "ubuntu/xenial64"
|
||||
portal.vm.hostname = "intranet-portal"
|
||||
portal.vm.network "private_network", ip: "192.168.202.10", virtualbox_intnet: "intra-services"
|
||||
portal.vm.provision :shell, :inline => "ip route delete default 2>&1 >/dev/null || true; ip route add default via 192.168.202.254"
|
||||
config.vm.define "extranet-wordpress" do |wordpress|
|
||||
wordpress.vm.box = "ubuntu/xenial64"
|
||||
wordpress.vm.hostname = "extranet-wordpress"
|
||||
wordpress.vm.network "private_network", ip: "192.168.202.10", virtualbox_intnet: "extranet-services"
|
||||
wordpress.vm.provision :shell, :inline => "ip route delete default 2>&1 >/dev/null || true; ip route add default via 192.168.202.254"
|
||||
wordpress.vm.provision :shell, path: "provisioning/wordpress/configure_wordpress.sh"
|
||||
wordpress.vm.provision :shell, path: "provisioning/wordpress/configure_apache_exporter.sh"
|
||||
end
|
||||
|
||||
config.vm.define "workstation1-developer-linux" do |workstation|
|
||||
config.vm.define "intranet-backup" do |intranet|
|
||||
intranet.vm.box = "ubuntu/xenial64"
|
||||
intranet.vm.hostname = "intranet-backup"
|
||||
intranet.vm.network "private_network", ip: "192.168.203.10", virtualbox_intnet: "intranet-services"
|
||||
intranet.vm.provision :shell, :inline => "ip route delete default 2>&1 >/dev/null || true; ip route add default via 192.168.203.254"
|
||||
intranet.vm.provision :shell, path: "provisioning/backup/configure_backup.sh"
|
||||
end
|
||||
|
||||
config.vm.define "intranet-supervision" do |supervision|
|
||||
supervision.vm.box = "ubuntu/xenial64"
|
||||
supervision.vm.hostname = "intranet-supervision"
|
||||
supervision.vm.network "private_network", ip: "192.168.203.20", virtualbox_intnet: "intranet-services"
|
||||
supervision.vm.provision :shell, :inline => "ip route delete default 2>&1 >/dev/null || true; ip route add default via 192.168.203.254"
|
||||
supervision.vm.provision :shell, path: "provisioning/supervision/configure_supervision.sh"
|
||||
supervision.vm.provision :shell, path: "provisioning/supervision/configure_fakesmtp.sh"
|
||||
end
|
||||
|
||||
config.vm.define "workstation-developer-linux" do |workstation|
|
||||
workstation.vm.box = "ubuntu/xenial64"
|
||||
workstation.vm.hostname = "developer-ws1"
|
||||
workstation.vm.network "private_network", ip: "192.168.201.10", virtualbox_intnet: "developer", auto_config: false
|
||||
workstation.vm.network "private_network", ip: "192.168.201.10", virtualbox_intnet: "developer", auto_config: false
|
||||
workstation.vm.provision :shell, path: "provisioning/workstation/configure_desktop.sh"
|
||||
workstation.vm.provision :reload
|
||||
workstation.vm.provision :shell, path: "provisioning/workstation/configure_network.sh"
|
||||
workstation.vm.provision :shell, path: "provisioning/developer/configure_account.sh"
|
||||
end
|
||||
|
||||
config.vm.define "workstation1-accounting-linux" do |workstation|
|
||||
workstation.vm.box = "ubuntu/xenial64"
|
||||
workstation.vm.hostname = "accounting-ws1"
|
||||
workstation.vm.network "private_network", ip: "192.168.200.10", virtualbox_intnet: "accounting", auto_config: false
|
||||
workstation.vm.provision :shell, path: "provisioning/workstation/configure_desktop.sh"
|
||||
workstation.vm.provision :reload
|
||||
workstation.vm.provision :shell, path: "provisioning/workstation/configure_network.sh"
|
||||
end
|
||||
# config.vm.define "workstation1-accounting-linux" do |workstation|
|
||||
# workstation.vm.box = "ubuntu/xenial64"
|
||||
# workstation.vm.hostname = "accounting-ws1"
|
||||
# workstation.vm.network "private_network", ip: "192.168.200.10", virtualbox_intnet: "accounting", auto_config: false
|
||||
# workstation.vm.provision :shell, path: "provisioning/workstation/configure_desktop.sh"
|
||||
# workstation.vm.provision :reload
|
||||
# workstation.vm.provision :shell, path: "provisioning/workstation/configure_network.sh"
|
||||
# end
|
||||
|
||||
end
|
||||
|
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -x
|
||||
|
||||
apt-get update
|
||||
apt-get install rsync rsnapshot
|
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -xe
|
||||
|
||||
ACCOUNT_PASSWORD='$6$gMhMIYtz$tIY5w9xjFOJYgtrP2QY0TYfTPm8NQTh0JXaAL7O3TaJ8fAo8AmARaTwKFZgnUVMZKzMOnQOUVRtMtBKkYIS/U1' // passwd: developer
|
||||
useradd -m -p "$ACCOUNT_PASSWORD" -s /bin/bash developer
|
@ -14,10 +14,10 @@ systemctl disable systemd-resolved
|
||||
cat > /etc/dnsmasq.d/local.conf <<EOF
|
||||
|
||||
interface=$DEVELOPER_IFACE
|
||||
interface=$ACCOUNTING_IFACE
|
||||
#interface=$ACCOUNTING_IFACE
|
||||
|
||||
dhcp-range=$DEVELOPER_IFACE,192.168.201.10,192.168.201.100,4h
|
||||
dhcp-range=$DEVELOPER_IFACE,192.168.200.10,192.168.200.100,4h
|
||||
#dhcp-range=$DEVELOPER_IFACE,192.168.200.10,192.168.200.100,4h
|
||||
EOF
|
||||
|
||||
|
||||
|
@ -23,23 +23,59 @@ ufw allow out 53,67,68/udp\
|
||||
|
||||
# Règles de routage
|
||||
|
||||
# Attention: l'interface MGMT_IFACE est utilisé comme gateway internet par la machine firewall
|
||||
|
||||
ufw route allow in on $DEVELOPER_IFACE out on $MGMT_IFACE to any port 80 from $DEVELOPER_NETWORK\
|
||||
comment "DEVELOPER -> 80 INTERNET"
|
||||
ufw route allow in on $DEVELOPER_IFACE out on $MGMT_IFACE to any port 443 from $DEVELOPER_NETWORK\
|
||||
comment "DEVELOPER -> 443 INTERNET"
|
||||
|
||||
# On autorise les connexions HTTP(S) vers l'exterieur depuis le réseau "accounting"
|
||||
ufw route allow in on $ACCOUNTING_IFACE out on $MGMT_IFACE to any port 80 from $ACCOUNTING_NETWORK\
|
||||
comment "ACCOUNTING -> 80 INTERNET"
|
||||
ufw route allow in on $ACCOUNTING_IFACE out on $MGMT_IFACE to any port 443 from $ACCOUNTING_NETWORK\
|
||||
comment "ACCOUNTING -> 443 INTERNET"
|
||||
# ufw route allow in on $ACCOUNTING_IFACE out on $MGMT_IFACE to any port 80 from $ACCOUNTING_NETWORK\
|
||||
# comment "ACCOUNTING -> 80 INTERNET"
|
||||
# ufw route allow in on $ACCOUNTING_IFACE out on $MGMT_IFACE to any port 443 from $ACCOUNTING_NETWORK\
|
||||
# comment "ACCOUNTING -> 443 INTERNET"
|
||||
|
||||
# On autorise toutes les connexions vers le réseau "services intranet" depuis le réseau "accounting"
|
||||
# On autorise toutes les connexions vers le réseau "services extranet" depuis le réseau "accounting"
|
||||
# et le réseau "developer"
|
||||
ufw route allow in on $ACCOUNTING_IFACE out on $INTRANET_IFACE to any from $ACCOUNTING_NETWORK\
|
||||
comment "ACCOUNTING -> * SERVICES INTRA"
|
||||
ufw route allow in on $DEVELOPER_IFACE out on $INTRANET_IFACE to any from $DEVELOPER_NETWORK\
|
||||
comment "DEVELOPER -> * SERVICES INTRA"
|
||||
# ufw route allow in on $ACCOUNTING_IFACE out on $EXTRANET_IFACE to any from $ACCOUNTING_NETWORK\
|
||||
# comment "ACCOUNTING -> * SERVICES EXTRANET"
|
||||
ufw route allow in on $DEVELOPER_IFACE out on $EXTRANET_IFACE to any from $DEVELOPER_NETWORK\
|
||||
comment "DEVELOPER -> * EXTRANET"
|
||||
|
||||
# On autorise les connexions depuis la machine intranet-supervision vers
|
||||
# la machine extranet-wordpress sur le port 9117
|
||||
ufw route allow in on $INTRANET_IFACE out on $EXTRANET_IFACE to 192.168.202.10 port 9117 from 192.168.203.20\
|
||||
comment "intranet-supervision -> 9117 extranet-wordpress"
|
||||
|
||||
# On autorise les connexions HTTP/S depuis l'extranet vers le web
|
||||
ufw route allow in on $EXTRANET_IFACE out on $MGMT_IFACE to any port 80 from $EXTRANET_NETWORK\
|
||||
comment "EXTRANET -> 80 INTERNET"
|
||||
ufw route allow in on $EXTRANET_IFACE out on $MGMT_IFACE to any port 443 from $EXTRANET_NETWORK\
|
||||
comment "EXTRANET -> 443 INTERNET"
|
||||
|
||||
# On autorise les connexions HTTP/S depuis l'intranet vers le web
|
||||
ufw route allow in on $INTRANET_IFACE out on $MGMT_IFACE to any port 80 from $INTRANET_NETWORK\
|
||||
comment "INTRANET -> 80 INTERNET"
|
||||
ufw route allow in on $INTRANET_IFACE out on $MGMT_IFACE to any port 443 from $INTRANET_NETWORK\
|
||||
comment "INTRANET -> 443 INTERNET"
|
||||
|
||||
# On autorise toutes les connexions vers les réseaux "developer" et "accounting" depuis le réseau "services intranet"
|
||||
# ufw route allow in on $INTRANET_IFACE out on $ACCOUNTING_IFACE to any from $INTRANET_NETWORK\
|
||||
# comment "INTRANET -> * ACCOUNTING"
|
||||
ufw route allow in on $INTRANET_IFACE out on $DEVELOPER_IFACE to any from $INTRANET_NETWORK\
|
||||
comment "INTRANET -> * DEVELOPER"
|
||||
|
||||
# On redirige le flux entrant sur les ports 80/443 vers la machine extranet-wordpress
|
||||
ufw allow in on $PUBLIC_IFACE from any port http comment "* 80 -> PUBLIC"
|
||||
ufw allow in on $PUBLIC_IFACE from any port https comment "* 443 -> PUBLIC"
|
||||
|
||||
ufw route allow in on $PUBLIC_IFACE out on $EXTRANET_IFACE to 192.168.202.10 port http\
|
||||
comment "PUBLIC 80 -> 80 extranet-wordpress"
|
||||
ufw route allow in on $PUBLIC_IFACE out on $EXTRANET_IFACE to 192.168.202.10 port https\
|
||||
comment "PUBLIC 443 -> 443 extranet-wordpress"
|
||||
ufw route allow in on $EXTRANET_IFACE out on $PUBLIC_IFACE
|
||||
ufw allow out on $EXTRANET_IFACE to 192.168.202.10 port https
|
||||
|
||||
# Application des règles
|
||||
ufw --force enable
|
||||
|
@ -15,10 +15,17 @@ sed -i 's/^#net\/ipv6\/conf\/all\/forwarding.*$/net\/ipv6\/conf\/all\/forwarding
|
||||
TMP_FILE=$(mktemp)
|
||||
cat > "$TMP_FILE" <<EOF
|
||||
*nat
|
||||
|
||||
:POSTROUTING ACCEPT [0:0]
|
||||
-A POSTROUTING -s $INTRANET_NETWORK -o $MGMT_IFACE -j MASQUERADE
|
||||
-A POSTROUTING -s $ACCOUNTING_NETWORK -o $MGMT_IFACE -j MASQUERADE
|
||||
#-A POSTROUTING -s $ACCOUNTING_NETWORK -o $MGMT_IFACE -j MASQUERADE
|
||||
-A POSTROUTING -s $DEVELOPER_NETWORK -o $MGMT_IFACE -j MASQUERADE
|
||||
-A POSTROUTING -s $EXTRANET_NETWORK -o $MGMT_IFACE -j MASQUERADE
|
||||
|
||||
:PREROUTING ACCEPT [0:0]
|
||||
-A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.202.10:80
|
||||
-A PREROUTING -i eth1 -p tcp --dport 443 -j DNAT --to-destination 192.168.202.10:443
|
||||
|
||||
COMMIT
|
||||
|
||||
$(cat /etc/ufw/before.rules)
|
||||
|
@ -2,10 +2,12 @@ IFACES=($(ls /sys/class/net))
|
||||
|
||||
MGMT_IFACE="${IFACES[0]}"
|
||||
PUBLIC_IFACE="eth1"
|
||||
DEVELOPER_IFACE="eth2"
|
||||
# ACCOUNTING_IFACE="eth2"
|
||||
EXTRANET_IFACE="eth3"
|
||||
INTRANET_IFACE="eth4"
|
||||
DEVELOPER_IFACE="eth3"
|
||||
ACCOUNTING_IFACE="eth2"
|
||||
|
||||
INTRANET_NETWORK="192.168.202.0/24"
|
||||
EXTRANET_NETWORK="192.168.202.0/24"
|
||||
DEVELOPER_NETWORK="192.168.201.0/24"
|
||||
ACCOUNTING_NETWORK="192.168.200.0/24"
|
||||
# ACCOUNTING_NETWORK="192.168.200.0/24"
|
||||
INTRANET_NETWORK="192.168.203.0/24"
|
||||
|
@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -xe
|
||||
|
||||
apt-get update
|
||||
apt-get install -y nodejs nodejs-legacy git npm
|
||||
|
||||
mkdir -p /opt
|
||||
cd /opt
|
||||
git clone https://github.com/Bornholm/faketools.git faketools
|
||||
|
||||
cd faketools
|
||||
npm install --production
|
||||
|
||||
cat > /etc/systemd/system/fakesmtp.service <<EOF
|
||||
[Unit]
|
||||
Description=FakeSMTP Server
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/opt/faketools/bin/fake-smtp
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl enable fakesmtp
|
||||
systemctl start fakesmtp
|
@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -x
|
||||
|
||||
PROMETHEUS_URL=https://github.com/prometheus/prometheus/releases/download/v2.1.0/prometheus-2.1.0.linux-amd64.tar.gz
|
||||
ALERTMANAGER_URL=https://github.com/prometheus/alertmanager/releases/download/v0.13.0/alertmanager-0.13.0.linux-amd64.tar.gz
|
||||
|
||||
[ ! -f prometheus.tar.gz ] && wget -O- "$PROMETHEUS_URL" > prometheus.tar.gz
|
||||
[ ! -f alertmanager.tar.gz ] && wget -O- "$ALERTMANAGER_URL" > alertmanager.tar.gz
|
||||
|
||||
tar -xzf prometheus.tar.gz
|
||||
tar -xzf alertmanager.tar.gz
|
||||
|
||||
mv prometheus-* /opt/prometheus
|
||||
mv alertmanager-* /opt/alertmanager
|
||||
|
||||
cat > /etc/systemd/system/prometheus.service <<EOF
|
||||
[Unit]
|
||||
Description=Prometheus Server
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/opt/prometheus/prometheus --config.file="/etc/prometheus/config.yml"
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
mkdir -p /etc/prometheus/rules.d
|
||||
|
||||
cat > /etc/prometheus/config.yml <<EOF
|
||||
# Configuration de l'application sur laquelle
|
||||
# Prometheus doit récolter des informations
|
||||
|
||||
scrape_configs:
|
||||
- job_name: extranet-wordpress
|
||||
scrape_interval: 10s
|
||||
metrics_path: /metrics
|
||||
static_configs:
|
||||
- targets: [ "192.168.202.10:9117" ]
|
||||
|
||||
# Configuration de l'alertmanager
|
||||
|
||||
alerting:
|
||||
alertmanagers:
|
||||
- static_configs:
|
||||
- targets: [ "localhost:9093" ]
|
||||
|
||||
# Définition des règles d'alertes
|
||||
rule_files:
|
||||
- "/etc/prometheus/rules.d/*.yml"
|
||||
|
||||
EOF
|
||||
|
||||
systemctl enable prometheus
|
||||
systemctl start prometheus
|
||||
|
||||
cat > /etc/systemd/system/alertmanager.service <<EOF
|
||||
[Unit]
|
||||
Description=Alertmanager Server
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/opt/alertmanager/alertmanager --config.file="/etc/alertmanager/config.yml"
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
cat > /etc/prometheus/rules.d/wordpress-uptime.yml <<EOF
|
||||
groups:
|
||||
- name: wordpress_up
|
||||
interval: 5s
|
||||
rules:
|
||||
- alert: job:extranet_wordpress:up
|
||||
expr: apache_up{job="extranet-wordpress"} == 0 OR up{job="extranet-wordpress"} == 0
|
||||
for: 5s
|
||||
EOF
|
||||
|
||||
mkdir -p /etc/alertmanager
|
||||
|
||||
cat > /etc/alertmanager/config.yml <<EOF
|
||||
global:
|
||||
smtp_smarthost: 'localhost: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'
|
||||
EOF
|
||||
|
||||
systemctl enable alertmanager
|
||||
systemctl start alertmanager
|
@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -xe
|
||||
|
||||
APACHE_EXPORTER_URL=https://github.com/Lusitaniae/apache_exporter/releases/download/v0.5.0/apache_exporter-0.5.0.linux-amd64.tar.gz
|
||||
|
||||
[ ! -f apache_exporter.tar.gz ] && wget -O- "$APACHE_EXPORTER_URL" > apache_exporter.tar.gz
|
||||
|
||||
tar -xzf apache_exporter.tar.gz
|
||||
mv apache_exporter-* /opt/apache_exporter
|
||||
|
||||
cat > /etc/systemd/system/apache_exporter.service <<EOF
|
||||
[Unit]
|
||||
Description=Apache Prometheus Exporter
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/opt/apache_exporter/apache_exporter
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl enable apache_exporter
|
||||
systemctl start apache_exporter
|
@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -x
|
||||
|
||||
function gen_passwd() {
|
||||
< /dev/urandom tr -dc _A-Za-z0-9 | head -c${1:-16};echo;
|
||||
}
|
||||
|
||||
apt-get update
|
||||
|
||||
if [ ! -f /root/.mysql_root_password ]; then
|
||||
MYSQL_ROOT_PASSWORD="$(gen_passwd)"
|
||||
echo "$MYSQL_ROOT_PASSWORD" > /root/.mysql_root_password
|
||||
else
|
||||
MYSQL_ROOT_PASSWORD="$(cat /root/.mysql_root_password)"
|
||||
fi
|
||||
|
||||
if [ ! -f /root/.mysql_wordpress_password ]; then
|
||||
MYSQL_WORDPRESS_PASSWORD="$(gen_passwd)"
|
||||
else
|
||||
MYSQL_WORDPRESS_PASSWORD="$(cat /root/.mysql_wordpress_password)"
|
||||
echo "$MYSQL_WORDPRESS_PASSWORD" > /root/.mysql_wordpress_password
|
||||
fi
|
||||
|
||||
debconf-set-selections <<< "mysql-server mysql-server/root_password password $MYSQL_ROOT_PASSWORD"
|
||||
debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $MYSQL_ROOT_PASSWORD"
|
||||
sudo apt-get -y install mysql-server
|
||||
|
||||
apt-get install -y wordpress mysql-server
|
||||
|
||||
ln -s /usr/share/wordpress /var/www/html/wordpress
|
||||
|
||||
echo "CREATE DATABASE wordpress;" | mysql -p"$MYSQL_ROOT_PASSWORD"
|
||||
echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY '$MYSQL_WORDPRESS_PASSWORD';" | mysql -p"$MYSQL_ROOT_PASSWORD"
|
||||
echo "FLUSH PRIVILEGES;" | mysql -p"$MYSQL_ROOT_PASSWORD"
|
||||
|
||||
CONFIG_FILE=/etc/wordpress/config-default.php
|
||||
cp /usr/share/wordpress/wp-config-sample.php "$CONFIG_FILE"
|
||||
sed -i "s/^define('DB_NAME',.*$/define('DB_NAME', 'wordpress');/" "$CONFIG_FILE"
|
||||
sed -i "s/^define('DB_USER',.*$/define('DB_USER', 'wordpress');/" "$CONFIG_FILE"
|
||||
sed -i "s/^define('DB_PASSWORD',.*$/define('DB_PASSWORD', '$MYSQL_WORDPRESS_PASSWORD');/" "$CONFIG_FILE"
|
||||
|
||||
systemctl restart apache2
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user