JGachelin.fr

VPS OVH Debian 8 : Gestion de la sécurité

Cet article est le 3ème d’une série d’articles dédiés à la configuration d’un serveur VPS OVH équipé de Debian 8 (Jessie).

iptables / Netfilter

Netfilter est un framework disponible dans le noyau Linux qui implémente un firewall (pare-feu). iptables est un outil côté utilisateur qui permet de contrôler ce framework, il en existe d’autres mais c’est certainement le plus populaire. Pour procéder à sa configuration, on va créer un fichier bash qui sera lancé à chaque démarrage de l’ordinateur, donc le script devra être dans le répertoire /etc/init.d/. Il faut être assez prudent dans la mise en place des règles du firewall, car en ayant aucun accès physique à la machine, vous pouvez rester bloqué. On commence par l’installation d’iptables si nécessaire, il est dans mon cas installé de base :

sudo apt-get install iptables

Ensuite on va donc créer le script :

sudo nano /etc/init.d/firewall

Voici le script que j’utilise, c’est une configuration de base pour un serveur web, sachant que je n’ai encore rien installé sur le serveur, il changera selon mes besoins. Très important : il ne faut pas oublier d’adapter le numéro du port pour SSH s’il a été modifié.

#!/bin/sh

### BEGIN INIT INFO
# Provides:             firewall
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5 
# Default-Stop:         0 1 6
# Short-Description:    Start iptables rules
# Description:          Start iptables rules
### END INIT INFO

# Vider les tables et règles
sudo iptables -t filter -F
sudo iptables -t filter -X

# Bloquer tout le trafic
sudo iptables -t filter -P INPUT DROP
sudo iptables -t filter -P FORWARD DROP
sudo iptables -t filter -P OUTPUT DROP

# Conserver les connexions en cours
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Localhost
sudo iptables -t filter -A INPUT -i lo -j ACCEPT
sudo iptables -t filter -A OUTPUT -o lo -j ACCEPT

# ICMP
sudo iptables -t filter -A INPUT -p icmp -j ACCEPT
sudo iptables -t filter -A OUTPUT -p icmp -j ACCEPT

# SSH
sudo iptables -t filter -A INPUT -p tcp --dport 4999 -j ACCEPT
sudo iptables -t filter -A OUTPUT -p tcp --dport 4999 -j ACCEPT

# DNS
sudo iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

# HTTP
sudo iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT

# HTTPS
sudo iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT

# SMTP
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

# POP3
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT

# IMAP
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT

# NTP
sudo iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

En l’absence de l’en-tête d’information, deux lignes de warning apparaîtront. Les infos sur cette en-tête sont disponible ici.

insserv: warning: script 'K01firewall' missing LSB tags and overrides
insserv: warning: script 'firewall' missing LSB tags and overrides

Ensuite on rends le fichier exécutable avec :

chmod +x /etc/init.d/firewall

Puis on démarre le script :

/etc/init.d/firewall

On peut voir le résultat des tables correctement appliquées avec la commande suivante :

sudo iptables -v -L

Vous pouvez essayer de vous déconnecter et vous reconnecter en SSH par exemple, et en cas de problème, comme le fichier n’est pas encore défini pour être lancé au démarrage, il est toujours possible en cas de problème de redémarrer le tout depuis le Manager OVH. Si tout est bon, on indique au système de charger le fichier au démarrage :

update-rc.d firewall defaults

On peut maintenant faire un test en redémarrant le serveur puis en listant de nouveau les règles iptables si celles-ci sont bien définies d’après le script.

sudo reboot
sudo iptables -v -L

Fail2ban

Fail2ban est un programme qui va lire dans les fichiers logs des autres programmes (SSH, FTP, serveur web…) et s’il découvre qu’une @IP tente de s’authentifier de manière répétée, il va ajouter une règle iptables pour la bannir. Installation :

sudo apt-get install fail2ban

La première configuration s’effectue dans le fichier de configuration général de Fail2ban :

cd /etc/fail2ban/
sudo nano fail2ban.conf

On peut y définir un niveau de log de 1 à 4 selon la quantité d’information que l’on veut, chaque niveau est décrit dans le fichier, j’ai laissé le niveau 3 qui est par défaut. On peut également modifier là où seront enregistrés les logs, par défaut dans /var/log/fail2ban.log. Ensuite on configure les services qui seront observés dans le fichier jail.conf. Il est cependant déconseillé de modifier ce fichier, mais plutôt d’en faire une copie nommée jail.local qui remplacera automatiquement le fichier jail.conf. Ensuite on pourra commencer à éditer jail.local :

sudo cp jail.conf jail.local
sudo nano jail.local

Parmi les options générales à modifier, il y a l’@ email du destinataire, le nom et l’@ email de l’expéditeur. J’ai choisi fail2ban@vpsxxxxxx.ovh.net. J’ai également augmenter la durée de bannissement d’une IP en la passant de 600s (10min) à 1200s (… 20min !). Autre changement, l’action à exécuter lors du bannissement d’une IP, et dans mon cas il s’agit de l’envoi du rapport par mail.

bantime 1200
destemail = adresse@email.fr
sender = fail2ban@vpsxxxxxx.ovh.net
mta = mail
action = %(action_mwl)s

Ensuite chaque service est individuellement configurable, si vous souhaitez activer (enabled = true) ou désactiver (enabled = false) une surveillance. Par exemple, pour SSH, il faut changer le port du service s’il a été modifié comme indiqué dans le premier article de cette série. Je rajoute également l’ajout de l’envoi de mail spécifiquement à ce service :

[ssh]

enabled  = true
port     = 4999
filter   = sshd
action   = mail[name=ssh, dest=adresse@email.fr]
logpath  = /var/log/auth.log
maxretry = 5

Je ne touche ensuite à rien de plus, car je n’ai pour le moment rien installé sur le serveur.
Ensuite, il faut terminer de configurer l’envoi de mail si vous avez modifié l’action. Pour cela,

On pense à redémarrer le serveur une fois les modifications terminées :

sudo service fail2ban restart

Et on doit normalement recevoir un mail de la part de Fail2ban qui indique que la prison (jail) SSH a bien démarrée.
Les commandes utiles :

fail2ban-client set NOMDELAPRISON unbanip ADRESSEIP

Rkhunter

Cet utilitaire a pour but de détecter la présence éventuelle de rootkits, backdoors et autres exploits. Il compare le hash de fichiers importants avec celui connu dans une base de donnée en ligne et alerte aussi l’utilisateur s’il trouve quelque chose de suspect dans le noyau ou dans des fichiers. Rkhunter renvoi en général beaucoup d’avertissements, une majorité est en général bénin. Il est conseillé de l’installer au plus tôt sur un serveur de manière à ce qu’il puisse voir les modifications, cela n’aura aucun impact s’il est installé après une attaque. On commence donc l’installation du logiciel :

sudo apt-get install rkhunter

Ensuite il faut ajuster le fichier de configuration :

sudo nano /etc/default/rkhunter/

Deux lignes intéressantes à configurer, la première si vous souhaitez un scan journalier (cron) de la part de rkhunter, la seconde qui est l’adresse e-mail à laquelle les rapports seront envoyés :

CRON_DAILY_RUN="true"
REPORT_EMAIL="adresse@email.fr"

S’il existe des faux positifs dans la détection, il est nécessaire de les ajoutés au fichier /etc/rkhunter.conf. Par exemple :

ALLOWHIDDENDIR=/dev/.udev
ALLOWHIDDENDIR=/dev/.static

Voilà, il n’y a pas grand chose de plus à faire dans la configuration.

PortSentry

PortSentry est un programme qui va bloquer en temps-réel le scan des ports sur le serveur. L’installation se fait comme ceci :

sudo apt-get install portsentry

Par défaut, la seule mesure que prend PortSentry contre les attaques, c’est de dupliquer les messages dans /var/log/syslog. Il va donc falloir modifier le fichier /etc/portsentry/portsentry.conf. Les options de démarrage sont à configurer dans /etc/default/portsentry et les interfaces à ignorer dans /etc/portsentry/portsentry.ignore.static.

sudo nano /etc/portsentry/portsentry.conf

Il faut décommenter la ligne KILL_ROUTE qui concerne iptables (si c’est bien le firewall utilisé), commenter (#) la ligne KILL_HOSTS_DENY et ajouter une action en cas de blocage qui prévient par mail.

KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"
#KILL_HOSTS_DENY="ALL: $TARGET$ : DENY"
KILL_RUN_CMD="echo 'Blocage scan de port $TARGET$' | mail -s 'scan port ban $TARGET$' adresse@email.fr

Une fois ceci terminé, on démarre le logiciel pour TCP et UDP.

portsentry –audp
portsentry –atcp

Voilà c’est terminé pour ce qui est de la partie sécurisation du serveur. Il existe de nombreux autres solutions de protection (Snort par exemple), mais il faut savoir s’arrêter et ne pas surcharger son serveur inutilement.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *