Sécuriser son serveur dédié

Dans l'article précédent, on a vu comment installer son VPS et on a commencé à optimiser ses performances. Dans cet article je vais tenter de compiler la liste des démarches à entreprendre pour bien sécuriser son serveur, afin qu'il soit au maximum à l'abri des attaques.

Installer Webmin

En tout premier lieu, je vais installer Webmin: il s'agit d'une interface graphique libre permettant d'administrer son serveur. La ligne de commande c'est sympa, mais en mode graphique c'est pas mal non plus ! Ce que j'aime bien chez webmin, c'est qu'il fonctionne avec une autre serveur web qu'apache (lighthttpd je crois), et cela nous permet d'arrêter ou de redémarrer apache depuis l'interface webmin sans problème.

Sécurisez votre serveur

Webmin permet de gérer ses bases de données, les utilisateurs du serveurs, de programmer des sauvegardes, de gérer la RAM, l'espace disque, etc. 

Pour installer webmin, je suis allé voir sur Mémo-linux.

On édite le fichier sources.list

vi /etc/apt/sources.list

On colle les informations suivantes dans le fichier sources.list:

deb http://download.webmin.com/download/repository sarge contrib
deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib

On importe la clé :

wget http://www.webmin.com/jcameron-key.asc
apt-key add jcameron-key.asc
apt-get update

On installe webmin :

apt-get install webmin

Une fois webmin installé, on y accède comme ceci: https://vpsxxxxx.ovh.net:10000/

Pour éviter des scans inutiles de bots en tous genres, je vous conseille de changer le port par défaut de webmin, en editant le fichier /etc/webmin/miniserv.conf et en modifiant la ligne port=10000 (remplacer par le port de votre choix, par exemple 10022) 

Empêcher root de se connecter en ssh

Lorsque j'ai commandé mon VPS chez OVH, j'ai demandé une distribution Ubuntu, car c'est celle que je préfère, surtout grâce à la documentation extraordinaire dont bénéficie cette distribution. En principe, le compte root n'est pas accessible sur ce type de distribution: il faut passer par sudo pour effectuer ses tâches d'administration.

Or, lors de la réception de mon VPS, j'ai eu droit à un joli compte root. Par sécurité, je vais donc faire en sorte qu'il ne puisse pas prendre la main en ssh. Mais avant bien sûr, je vais créer un utilisateur qui me permettra d'ouvrir mes connections en ssh et effectuer l'administration du serveur.

Pour créer cet utilisateur, je me réfère à ce site, qui contient une tonne d'informations très intéressantes.

useradd -m -d /home/nomUtilisateur/ -s /bin/bash nomUtilisateur 
 

On crée un mot de passe pour ce nouvel utilisateur:

[email protected]:~# passwd nomUtilisateur 
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

 On teste si cet utilisateur peut bien ce connecter:

ssh -l nomUtilisateur vpsxxxxx.ovh.net
 

A l'aide de webmin, je place mon utilisateur dans le groupe sudo afin qu'il puisse faire partie de la liste des sudoers et soit en mesure d'effectuer des tâches d'administration.

Pour être sûr j'effectue une action quelconque précédée de sudo: si mon mot de passe est demandé, c'est que tout est ok.

Pour empêcher root de se connecter en SSH :

sudo vi /etc/ssh/sshd_config
 

Dans la section Athentication, chercher le texte

PermitRootLogin yes 
 

puis le remplacer par:

PermitRootLogin no
 

Ensuite redémarrer SSH:

sudo service ssh restart
 

Tenter de se connecter en SSH via root pour constater que c'est refusé.

Modifier le port par défaut de SSH

Même si ce n'est pas le summum en matière de sécurité, le fait de modifier le port par défaut du serveur SSH permet d'éviter un très grand nombre de tentatives d'attaques provenant de robots qui scannent en permanence les ports connus afin de tenter d'y trouver une faille.

Pour modifier le port de votre SSH, éditez votre fichier sshd_config

sudo vi /etc/ssh/sshd_config
 

Remplacer la section :

Port 22
 

par :

port NumeroDePort
 

Redémarrez votre service SSH, déconnectez vous et reconnectez vous de cette façon:

ssh -l NomUtilisateur -p NumeroDePort vpsxxxxx.ovh.net
 

 Configurer le pare-feu Iptables

Il est absolument indispensable d'installer un pare-feu sur votre serveur afin de le mettre à l'abri des attaques. Pour configurer Iptables, je me suis simplement servi de la doc ubuntu et j'ai suivi leurs préconisations. 

Pour vérifier la liste des règles actives je fais :

iptables -L

Par défaut aucune règle n'est définie. Je ne vais pas décrire pas à pas tout ce que j'ai fait, la doc Ubuntu est suffisament claire pour ça. Voilà la liste des commandes que j'ai passées:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport MonPortSSH -j ACCEPT 
iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
iptables -P INPUT DROP
iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -I INPUT 2 -i lo -j ACCEPT   
   

 Au final, le mieux est de récupérer un script existant et de l'adapter (mettre les bon n° de ports par exemple), puis de faire en sorte qu'il se lance au démarrage de votre machine. Celui que j'ai récupéré se trouve ici.

Pour que le script se lance au démarrage de votre système, le placer dans :

/etc/init.d/
chmod +x /etc/init.d/nomduscript
update-rc.d nomduscript defaults

Installer et configurer Fail2Ban 

Fail2Ban est un programme qui lit les divers logs d'accès de votre serveur (ssh, apache,...) et qui va automatiquement bannir les adresses ip suspectes (plusieurs tentatives de connexions infructueuses sur votre SSH par exemple).

Autant dire que c'est une soupape de sécurité supplémentaire pour votre serveur ! Dans mon cas, vu que j'utilise Iptables, les adresses suspectes y seront automatiquement ajoutées.

Installer Fail2ban:

sudo apt-get install fail2ban

A noter que lors de l'installation, le script est automatiquement placé dans /etc/init.d, Fail2ban redémarrera automatiquement à chaque redémarrage de votre serveur. Le script de configuration de Fail2Ban est le fichier /etc/fail2ban/jail.conf.

Par sécurité, il est vivement recommandé d'effectuer une copie de ce fichier en jail.local. C'est ce dernier qui sera pris par défaut lors de l'exécution de fail2ban.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local 

Protéger ses accès SSH

Pour ma config, vu que j'ai changé le port par défaut de SSH, je dois le préciser dans mon jail.local, à la secction SSH

[ssh]
enabled = true
port = ssh,sftp,NumeroDePort
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

 Je relance mon service fail2ban

service fail2ban restart
 

 Ensuite je vais quelques tentatives infructueuses à mon SSH (depuis une autre ip, histoire de ne pas m'auto-bannir) pour vérifier que la règle de bannissement fonctionne correctement.

Envoyer les w00tw00t en enfer

Il existe un scanner de vulnérabilités qui a une signature du genre w00tw00t.at.ISC.SANS.DFind. Je crée donc une règle pour fail2ban qui va me permettre d'éradiquer ce genre de tentative. Dans mon fichier jail.local j'entre ces lignes:

 

[apache-w00tw00t]
enabled = true
filter = apache-w00tw00t
action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp]
logpath = /var/log/apache2/access*.log
maxretry = 1
 

 

Ensuite je crée le filtre correspondant (voir la ligne filter ci-dessus, qui appelle un fichier de configuration spécifique):

sudo vi /etc/fail2ban/filter.d/apache-w00tw00t.conf
 

Dans ce fichier, j'indique ces informations:

 

[Definition]
failregex = ^<HOST> -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*
ignoreregex =

 

Et voilà, quelques intrus de moins sur mon serveur !

Installer Logwatch

Logwatch est un programme qui permet de vous envoyer régulièrement par mail une liste de ce qu'il s'est passé récemment sur votre serveur, et notamment toute tentative d'attaque. Je vous conseille de l'installer, ça vous évitera d'aller regarder vous-même au petit bonheur la chance dans vos logs.

Avant d'installer logwatch, j'ai installé sur mon serveur le programme postfix, qui me permet d'envoyer et recevoir des mails

sudo apt-get install postfix mailutils sasl2-bin
vi /etc/default/saslauthd
  

Mettre START=yes au début du fichier saslauthd (permet la sécurisation smtp). Je fais ensuite un test d'envoi de mails

mail [email protected] -s test
Taper entrée
Taper votre message + entrée
CTRL+D pour sortir
   

Installer Logwatch

sudo apt-get install logwatch
sudo mkdir /var/cache/logwatch
sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/

 Editer le fichier de configuration

sudo vi /etc/logwatch/conf/logwatch.conf
 

Dans ce fichier, vous devez entrer l'adresse mail qui recevra les mails, modifiez la section MailTo et remplacez root par votre propre adresse mail. Je vous conseille également de modifier la section Format et de mettre html au lieu de text, ce sera plus lisible lorsque vous recevrez vos mails.

Installer Monit

Monit est un utilitaire bien sympathique qui va vous permettre de monitorer facilement les services critiques fonctionnant sur votre serveur. Une interface web vous permet de vérifier en un clin d'oeil si tous les services que vous monitorez (apache, mysql, postfix, etc) sont up.

En outre, monit vous envoie automatiquement un mail pour vous prévenir lorsque quelque chose ne va pas. Et même encore mieux, il peut automatiquement redémarrer un service qui est tombé ! J'ai fait l'eesai en arrêtant apache: j'ai immédiatement reçu un mail m'informant que le service est tombé. Et quelques secondes plus tard il a automatiquement redémarré !

Installation de monit:

sudo apt-get install monit

Vous devez ensuite créer un fichier de configuration (vous pouvez choisir le nom qui vous plait, ici nous choisiront simplement "config"). Ci-dessous le fichier que j'utilise. Vous devez l'adapter pour votre propre environnement (port ssh, nom de votre site, partition de disque). Petit souci d'affichage dans le script ci-dessous: remplacez les &gt; par le signe > (supérieur)

vi /etc/monit/conf.d/config
set daemon  60                         # On vérifie toutes les 60 secondes
set logfile syslog facility log_daemon
set mailserver localhost
set mail-format {
  subject: [Monit] $HOST - $SERVICE $EVENT
}
set alert [email protected]                     # Destinataire
set httpd port 8123 and                # Port pour l'accès à l'interface web
    allow user:password                # login et mot de passe de connexion

# Scripts de surveillance des services
# Apache2
check process apache with pidfile /var/run/apache2.pid
group apache
start program = "/etc/init.d/apache2 start"
stop program = "/etc/init.d/apache2 stop"
if failed host www.votresite.fr port 80
protocol http then restart
if 5 restarts within 5 cycles then timeout
if cpu > 80% for 2 cycles then alert
if cpu > 90% for 5 cycles then restart
if children > 250 then restart
# MySQL
check process mysqld with pidfile /var/run/mysqld/mysqld.pid  # a adapter au serveur
group database
start program = "/etc/init.d/mysql start"
stop program = "/etc/init.d/mysql stop"
if failed host 127.0.0.1 port 3306 then restart
if 5 restarts within 5 cycles then timeout

# SSH
check process sshd with pidfile /var/run/sshd.pid
group ssh
start program "/etc/init.d/ssh start"
stop program "/etc/init.d/ssh stop"
if failed host 127.0.0.1 port 1234 protocol ssh then restart
if 5 restarts within 5 cycles then timeout

# Postfix
check process postfix with pidfile /var/spool/postfix/pid/master.pid
group mail
start program = "/etc/init.d/postfix start"
stop  program = "/etc/init.d/postfix stop"
if failed port 25 protocol smtp then restart
if 5 restarts within 5 cycles then timeout

# BIND
#check process bind9 with pidfile /var/run/named/named.pid
#group bind
#start program = "/etc/init.d/bind9 start"
#stop  program = "/etc/init.d/bind9 stop"
#if failed port 53 then restart
#if 5 restarts within 5 cycles then timeout

# Disk
check device sda2 with path /dev/sda2
if space usage > 85% then alert
group system 

Vous pouvez également utiliser le service gratuit de Pingdom pour monitorer l'état de votre site.

Conclusion

Voilà pour la partie sécurité du serveur ! Je suis loin d'être un expert en sécurité, mais si vous appliquez ces quelques principes, vous partez déjà du bon pied :) 

Pour aller plus loin, je vous conseille d'appliquer les recommandations ici.

Il y a d'autres petites choses que vous pouvez faire pour améliorer la sécurité de votre site, telles que changer le chemin par défaut de phpmyadmin ou encore modifier le nom du script d'accès à APC. 

 

 

 

Catégories: