Logomotion: Sécurité Web, sécurisation du serveur GNU/Linux

This commit is contained in:
wpetit 2018-01-23 22:46:57 +01:00
parent 171b1e512c
commit 0fe8dd7112
1 changed files with 441 additions and 4 deletions

View File

@ -299,9 +299,6 @@ Chaque couple **(label, valeur)** est appelée **dimension** de la métrique.
http_total_requests{ method="POST", path="/test" }
| name | labels |
```
---
## 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.
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)
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é.
---
## 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 dUtilisation Commerciale - Partage dans les Mêmes Conditions 3.0 France](https://creativecommons.org/licenses/by-nc-sa/3.0/fr/)