Logomotion: Sécurité Web, sécurisation du serveur GNU/Linux
This commit is contained in:
parent
171b1e512c
commit
0fe8dd7112
|
@ -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 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