Nous allons maintenant voir comment sécurisé notre serveur web afin qu'il soit moins vulnérable aux attaques.
Dans ce tutoriel nous allons voir comment sécurisé
- Le ssh : En changeant le port par défaut et en ne permettant qu'à certains utilisateur de s'y connecter.
- le ftp : En cryptant la connexion et en ne permettant qu'à certains utilisateur de s'y connecter.
- Apache : En créant un utilisateur différent par site (via le module userdir) et en bloquant l'accès ftp à tout autre dossier que le /home des utilisateur.
- le serveur en générale en utilisant des IpTables pour bloquer tout les ports du serveur sauf ceux que l'on va avoir besoin.
ssh
Nous allons tout d'abord créer un groupe ssh_allowed_user qui contiendra tout les utilisateur ayant accès au serveur via ssh.
$ sudo addgroup ssh_allowed_users
On va maintenant y ajouter l'utilisateur amp (utilisateur créer pour installer et gerer notre serveur dans le tutoriel précédent)
$ sudo adduser amp ssh_allowed_users
Et on va modifier la configuration de ssh
$ sudo nano /etc/ssh/sshd_config
Nous allons en profiter pour modifier le port par défaut de ssh. Il faudra modifier (ou ajouter suivant les cas) les lignes suivant
Port 5896 (Ou n'importe quel autre port situé en 1024 et 49151)
AllowGroups ssh_allowed_users
Pour valider nos modification il va falloir redémarrer le ssh.
$ sudo service ssh restart
ATTENTION
Dés que vous allez redemmarer le ssh vous allez être déconnecté. Et si vous n'avez pas ajouter l'utilisateur amp dans le groupe ssh_allowed_users vous ne pourrez plus vous connecter à votre machine. il va donc falloir demander une reinstallation (si vou sn'avez pas accès physiquement au serveur) ou aller se connecter physiquement à la machine pour régler le soucis.
Lorsque vous allez vous reconnecter n'oublier de spécifié le numéro de port. Sur Mac et Linux il faudra ajouter -p NumDePort et sur windows il faudra le spécifié dans le programme que vous utilisé (ex: Putty)
ftp
Comment pour le ssh nous allons restreindre la liste des utilisateurs qui peuvent se connecter en ftp à notre serveur.
$ sudo addgroup ftp_allowed_users
$ sudo adduser amp ftp_allowed_users
On va maintenant aller dans le fichier de configuration pour limiter l'accès au groupe que l'on vient de créer et pour y activer le cryptage.
ATTENTION
Il est posible que l'activation du tls ralentisse TRES FORTEMENT les vitesses de transfert du ftp. J'ai le soucis en utilisant FileZila sous windows, je n'ai pas encore tester avec d'autre OS/programme.
$ sudo nano /etc/proftpd/proftpd.conf
Décommenter la ligne (en retirant le # devant):
Include /etc/proftpd/tls.conf
Et ajouter le bloc :
<Limit LOGIN>
DenyGroup !ftp_allowed_users
</Limit>
On va modifier la configuration tls de proftpd, mais tout d'abord on va créer une sauvegarde du fichier original, puis vider le fichier et enfin écrire notre configuration
$ sudo cp /etc/proftpd/tls.conf /etc/proftpd/tls.conf.original
$ sudo -i
# cat /dev/null > /etc/proftpd/tls.conf
# exit
Quelques explications :
- sudo -i : On se reconnecte en root pour vider le contenu du fichier (ne marche pas avec sudo)
- cat /dev/null > /etc/proftpd/tls.conf : On remplace le contenu du fichier de configuration par celui de /dev/null (qui est vide)
- exit : on quitte root
Modifier le fichier
$ sudo nano /etc/proftpd/tls.conf
Et ajoutez-y les lignes suivantes.
<IfModule mod_tls.c>
TLSEngine on
TLSLog /var/log/proftpd/tls.log
TLSProtocol SSLv23
TLSOptions NoCertRequest
TLSRSACertificateFile /etc/proftpd/ssl/proftpd.cert.pem
TLSRSACertificateKeyFile /etc/proftpd/ssl/proftpd.key.pem
TLSVerifyClient off
TLSRequired on
</IfModule>
On y spécifie le fichier de log, le type de protocole à utilisé, où se trouve les clés RSA, ... (plus d'info dans /etc/proftpd/tls.conf.original).
On va maintenant créer le dossier ssl et y ajouter nos clés RSA
$ sudo mkdir /etc/proftpd/ssl
$ sudo openssl req -new -x509 -days 365 -nodes -out /etc/proftpd/ssl/proftpd.cert.pem -keyout /etc/proftpd/ssl/proftpd.key.pem
Suite à cette commande une série de questions vont apparaitres, libre à vous d'y répondre ou non.
On va restreindre l'accès de la clef à amp et on redemmare le ftp pour que les modifications prennent effets
$ sudo chmod 660 /etc/proftpd/ssl/proftpd.key.pem
$ sudo service proftpd restart
apache2
Vous vous demandez peut-être en quoi créer un utilisateur par site va sécurisé notre seveur ?
C'est fort simple, via le module userdir chaque utilisateur pourra héberger un site web en créant un dossier public_hmtl dans son dossier /home. Ce qui veut dire que si quelqu'un hack notre site, il se trouvera dans le dossier home d'un utilisateur n'ayant aucun droit, et ne pourra donc rien casser sur le serveur (autre que le site web).
On va donc activer userdir et créer un utilisateur pour notre site.
Je vais utiliser mon site web comme exemple pour avoir un cas concret
Afin que l'utilisateur gerant mon site puisse se connecter en ftp et en ssh au serveur on va devoir l'ajouter aux groupes ssh et ftp_allowed_users
$ sudo a2enmod userdir
$ sudo adduser elhebert
$ sudo adduser elhebert ftp_allowed_users
$ sudo adduser elhebert ssh_allowed_users
On va maintenant se connecter en tant qu'Elhebert pour créer les dossiers (public_hmtl et logs) et fichiers nécessaires (error.log et access.log)
$ sudo su elhebert
$ mkdir ~/public_html
$ mkdir ~/logs
$ touch ~/logs/error.log
$ touch ~/logs/access.log
Et ensuite on retourne sur amp pour continuer notre configuration via un
$ exit
On va maintenant créer un nouveau site dans apache.
$ sudo nano /etc/apache2/sites-available/elhebert.conf
Je vous ai mis ici la configuration de base que j'utilise, libre à vous de la copier ou de la modifier. Je vous invite à lire la doc d'apache pour plus d'infos
<VirtualHost *:80>
ServerAdmin contact@elhebert.be
ServerName www.elhebert.be
ServerAlias elhebert.be
DocumentRoot /home/elhebert/public_html
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/elhebert/public_html>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /home/elhebert/logs/error.log
CustomLog /home/elhebert/logs/access.log combined
</VirtualHost>
Afin de rendre le site disponible il faudra l'activer et recharger la configuration d'apache via :
$ sudo a2ensite elhebert
$ sudo service apache2 reload
On va maintenant restreindre l'accès ftp des utilisateurs. Lorsqu'ils se connecterons en ftp, ils seront confiné dans leurs répertoire /home (/home/Elhebert dans le cas de mon utilisateur)
$ sudo nano /etc/proftpd/proftpd.conf
et on décommente la ligne
DefaultRoot ~
IpTable
Maintenant que les différents services sont sécurisés on va sécurisé l'accès au serveur en général grâce aux IpTables.
Les IpTables sont le système de firewall de Linux. Grâce à elles ont va donc pouvoir filtrer le trafic entrant et sortant de notre serveur.
Je vous donne ici encore une fois ma configuration, mais je vous invite à lire ce tutoriel afin de mieux comprendre ce qui se passe.
On va commencer par créer un nouveau script contenant nos iptables
$ sudo nano /etc/init.d/iptable.sh
Et on va y mettre l'ensemble des règles suivantes :
#!/bin/sh
### BEGIN INIT INFO
# Provides: my iptable
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start:
# Default-Stop:
# X-Interactive: false
# Short-Description: my iptable
### END INIT INFO
iptables -t filter -F
iptables -t filter -X
echo "Reset"
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
echo "On interdit tout"
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo "Loopback autorisé"
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo "Ping Autorisé"
iptables -t filter -A INPUT -p tcp --dport 5896 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 5896 -j ACCEPT
echo "Connexion en ssh sur le port 5896 autorisée"
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
echo "Trafic entrant et sortant du dns sur le port 53 en tcp et udp autorisé"
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo "Connexion à un serveur temps (ntp) sur le port 123 autorisé"
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT
echo "Trafic entrant et sortant http sur les ports 80,443 et 8443 autorisé"
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "Trafic entrant et sortant du ftp sur les ports 20 et 21 autorisé"
#Les règles qui suivent sont utile UNIQUEMENT pour serveur mail
#Ne les ajouter pas dans le cas contraire !
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
echo "Trafic smtp sur le port 25 autorisé"
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
echo "trafic POP3 sur le port 110 autorisé"
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
echo "trafic IMAP sur le port 143 autorisé"
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT
echo "trafic POP3S sur le port 995 autorisé "
On rend le script exécutable et on l'ajoute au démarrage de la machine afin qu'a chaque reboot il soit exécuté.
$ sudo chmod +x /etc/init.d/iptable.sh
$ sudo update-rc.d iptable.sh defaults
Fail2ban
On va maintenant installer un système pour se prémunir des attaques de type brute force : Fail2ban. Ce système va empêcher un utilisateur d’accéder aux serveur après un certain nombre de tentative échouée.
$ sudo apt-get install fail2ban
Une fois installé on va se rendre dans le fichier de configuration pour y activer certaines règles. Dans ce même fichier vous pouvez aussi bien entendu y modifier la configuration du système fail2ban en changeant le nombre d'essais autorisé, le temps de ban et le port
$ sudo nano /etc/fail2ban/jail.conf
Pour activer une règle il faudra changer le
enabled = false
en
enabled = true
Personnellement j'utilise les règles suivantes : ssh, ssh-dos, apache, apache-multiport, apache-noscript, apache-overflows et proftpd.
Vous pouvez en activer d'autre et même ajouter vos propres règles.
Le mot de la fin
Le tutoriel est maintenant fini, si vous avez suivit jusqu'ici vous disposez maintenant d'un serveur web sécurisé.
Bien entendu il est toujours possible d'augmenter la sécurité de votre serveur, mais je pense que dans le cas d'un site à faible et moyen trafic, la configuration présentée dans ce tutoriel est suffisante. Mais n'hésitez pas à réagir en commentaire.