Logomotion: Sécurité Web, sécurisation du serveur GNU/Linux
This commit is contained in:
parent
4e4cf16e97
commit
de6251fed3
|
@ -299,9 +299,6 @@ Chaque couple **(label, valeur)** est appelée **dimension** de la métrique.
|
||||||
http_total_requests{ method="POST", path="/test" }
|
http_total_requests{ method="POST", path="/test" }
|
||||||
| name | labels |
|
| name | labels |
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Les différents types de métriques (1)
|
## Les différents types de métriques (1)
|
||||||
|
@ -346,10 +343,450 @@ Un histogramme est une métrique répartissant les données dans des "paquets" (
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Exercice: métrologie orienté sécurité d'une application Symfony3
|
## Exercice: métrologie orientée sécurité d'une application Symfony3
|
||||||
|
|
||||||
1. Créer une nouvelle application Symfony3 et configure une authentification de type "Basic Auth" sur une route.
|
1. Créer une nouvelle application Symfony3 et configure une authentification de type "Basic Auth" sur une route.
|
||||||
2. Implémenter une `Listener` pour l'évènement `security.authentication.failure` ([voir ce tutoriel](https://www.brainvire.com/create-authentication-listener-symfony2/))
|
2. Implémenter une `Listener` pour l'évènement `security.authentication.failure` ([voir ce tutoriel](https://www.brainvire.com/create-authentication-listener-symfony2/))
|
||||||
3. Installer et configurer le bundle [tweedegolf/prometheus-bundle](https://github.com/tweedegolf/prometheus-bundle)
|
3. Installer et configurer le bundle [tweedegolf/prometheus-bundle](https://github.com/tweedegolf/prometheus-bundle)
|
||||||
4. Mettre en place une sonde pour détecter les tentatives répétées d'authentification échouées pour une adresse IP donnée.
|
4. Mettre en place une sonde pour détecter les tentatives répétées d'authentification échouées pour une adresse IP donnée.
|
||||||
5. Mettre en place une alerte lorsque le nombre d'authentifications échouées dépasse un certain seuil dans un espace de temps donné.
|
5. Mettre en place une alerte lorsque le nombre d'authentifications échouées dépasse un certain seuil dans un espace de temps donné.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Sécurité de l'infrastructure pour l'hébergement Web
|
||||||
|
|
||||||
|
### Sécurité et configuration du serveur GNU/Linux
|
||||||
|
### Configuration du serveur HTTP
|
||||||
|
### Monitoring
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Sécurité et configuration du serveur GNU/Linux
|
||||||
|
|
||||||
|
### Installation du serveur
|
||||||
|
### Politique d'accès et configuration SSH
|
||||||
|
### Règles de pare-feu
|
||||||
|
### Politique de sauvegarde
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation du serveur
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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_*
|
||||||
|
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
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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, configurer votre serveur pour:
|
||||||
|
|
||||||
|
- Refuser toutes les connexions entrantes/sortantes par défaut
|
||||||
|
- Autoriser la connexion SSH uniquement depuis l'IP de votre poste de travail et celle d'un de vos collègues présent à la formation.
|
||||||
|
- Autoriser les connexions sortantes HTTP/HTTPS vers l'adresse 192.168.0.30 (i.e. un serveur fournissant une API REST utilisée par votre application)
|
||||||
|
- Autoriser les connexions sortantes MongoDB vers l'adresse 192.168.0.45 (i.e. une base de données MongoDB utilisée par votre application)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Politique de sauvegarde
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation de rsync/rsnapshot
|
||||||
|
|
||||||
|
### Sur le serveur
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt install rsync
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sur le client
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Configuration du serveur HTTP
|
||||||
|
|
||||||
|
### Apache2
|
||||||
|
### Certificats TLS/SSL
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Apache2
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt install apache2
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
## Désactivation des entêtes d'informations
|
||||||
|
|
||||||
|
```bash
|
||||||
|
vim /etc/apache2/apache2.conf
|
||||||
|
# ...
|
||||||
|
ServerSignature Off
|
||||||
|
ServerTokens Prod
|
||||||
|
# ...
|
||||||
|
systemctl reload apache2
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
## Désactivation de l'indexation automatique des dossiers
|
||||||
|
|
||||||
|
```bash
|
||||||
|
vim /etc/apache2/apache2.conf
|
||||||
|
# ...
|
||||||
|
<Directory /var/www/html>
|
||||||
|
Options -Indexes
|
||||||
|
</Directory>
|
||||||
|
# ...
|
||||||
|
systemctl reload apache2
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Désactivation des modules inexploités
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Afficher les directives de chargement des modules
|
||||||
|
grep LoadModule /etc/apache2/mods-enabled/*.load
|
||||||
|
# Désactiver un module
|
||||||
|
rm /etc/apache2/mods-enabled/<module>.load
|
||||||
|
# Recharger la configuration Apache2
|
||||||
|
systemctl reload apache2
|
||||||
|
```
|
||||||
|
|
||||||
|
Modules souvent inclus mais peu utilisés: _mod_imap, mod_include, mod_info, mod_userdir, mod_autoindex_
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Activation du module `mod_evasive`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Installation du module
|
||||||
|
apt install apache2-mod-evasive
|
||||||
|
# Activer le module (si non activé par défaut)
|
||||||
|
a2enmod evasive
|
||||||
|
# Configurer le module
|
||||||
|
vim /etc/apache2/mods-enabled/evasive.conf
|
||||||
|
# Recharcher la configuration Apache2
|
||||||
|
systemctl reload apache2
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
## Activation du module `mod_security`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Installation du module
|
||||||
|
apt install libapache2-mod-security2
|
||||||
|
# Activer le module (si non activé par défaut)
|
||||||
|
a2enmod security2
|
||||||
|
# Configurer le module
|
||||||
|
vim /etc/modsecurity/modsecurity.conf-recommended
|
||||||
|
# Activer la configuration recommandée
|
||||||
|
mv /etc/modsecurity/modsecurity.conf-recommended \
|
||||||
|
/etc/modsecurity/modsecurity.conf
|
||||||
|
# Recharcher la configuration Apache2
|
||||||
|
systemctl reload apache2
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
## SSL/TLS
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Générer un certificat autosigné
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openssl req \
|
||||||
|
-x509 \
|
||||||
|
-newkey rsa:4096 \
|
||||||
|
-keyout key.pem \
|
||||||
|
-out cert.pem \
|
||||||
|
-days 365 \
|
||||||
|
-nodes
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Utilisation du certificat avec Apache2
|
||||||
|
|
||||||
|
```apache
|
||||||
|
# /etc/apache2/sites-enabled/my-site.conf
|
||||||
|
|
||||||
|
NameVirtualHost *:80
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerName www.example.com
|
||||||
|
Redirect / https://secure.example.com/
|
||||||
|
</VirtualHost>
|
||||||
|
|
||||||
|
<VirtualHost _default_:443>
|
||||||
|
ServerName secure.example.com
|
||||||
|
DocumentRoot /var/www/html
|
||||||
|
SSLEngine On
|
||||||
|
SSLCertificateFile /path/to/cert.pem
|
||||||
|
SSLCertificateKeyFile /path/to/key.pem
|
||||||
|
# etc...
|
||||||
|
</VirtualHost>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Monitoring
|
||||||
|
|
||||||
|
### Configuration et usage de fail2ban
|
||||||
|
### Configuration et usage de Monit
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation de fail2ban
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Licence
|
||||||
|
|
||||||
|
## CC BY-NC-SA 3.0 FR
|
||||||
|
|
||||||
|
[Creative Commons - Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 France](https://creativecommons.org/licenses/by-nc-sa/3.0/fr/)
|
Loading…
Reference in New Issue