Maintenant que nous avons un accès SSH au serveur, la première chose à faire est de sécuriser celui-ci. Il est fortement recommandé de s’en occuper le plus vite possible. Entendons-nous bien, un serveur non sécurisé équivaut à partir en vacances sans verrouiller votre porte d’entrée…
Dans ce billet nous allons : changer le mot de passe du compte root, créer un compte utilisateur, changer le port SSH par défaut, interdire la connexion du compte root via SSH, configurer le firewall Netfilter via Iptables, mettre en place Fail2ban.
Mot de passe Root
La première chose à faire est de modifier le mot passe du compte utilisateur Root qui a été attribué par défaut. Veiller à ce que le mot de passe employé pour ce compte soit complexe (au moins 8 caractères mêlant lettres et chiffres) et surtout différent des autres mots de passe. Pour cela :
root@serveur:$ passwd rootCréation d’un compte utilisateur
Sur un serveur, on ne travail jamais sous le compte root, sauf lorsque c’est nécessaire (problème de permissions) ! Celui-ci servant uniquement à la maintenance. Pour l’exemple j’utiliserais le nom d’utilisateur « miku »
root@serveur:$ adduser mikuAjout de l'utilisateur « miku »...
Ajout du nouveau groupe « miku » (1001)...
Ajout du nouvel utilisateur « miku » (1001) avec le groupe « miku »...
Création du répertoire personnel « /home/miku »...
Copie des fichiers depuis « /etc/skel »...
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd : le mot de passe a été mis à jour avec succès
Modification des informations relatives à l'utilisateur miku
Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée
Nom complet []: Miku
N° de bureau []:
Téléphone professionnel []:
Téléphone personnel []:
Autre []:
Ces informations sont-elles correctes ? [O/n] o
Dorénavant on se connecte uniquement sur ce compte.
Si besoin de passer en root :
[sudo] password for miku:
root@serveur:~# echo "Je suis en root ! Et maintenant je me déconnecte..."
Je suis en root ! Et maintenant je me déconnecte...
root@serveur:~# exit
exit
miku@serveur:~$ echo "Je suis revenu sous le compte miku"
Je suis revenu sous le compte miku
miku@serveur:~$
Configuration SSH
Afin d’éviter les brutes forces et autres tentatives de connexions sur le serveur, il est recommandé de changer le port par défaut (22) et d’interdire la connexion du compte root. Pour cela, éditer le fichier de configuration avec Vim (comment utiliser Vim ?) ou tout autre éditeur de texte :
root@serveur:$ vi /etc/ssh/sshd_config# Package generated configuration file # See the sshd(8) manpage for details # What ports, IPs and protocols we listen for Port 8008 # Authentication: LoginGraceTime 120 PermitRootLogin no
Attention ! Il faut également veiller à ce que le port modifié (ici 8008) soit ouvert dans le pare-feu ou bien vous n’aurez plus accès au serveur.
On redémarre le service :
root@serveur:$ /etc/init.d/ssh restartFirewall – Iptables / Netfilter
Pense-bête des commandes (devant être tapées en root)
Réinitialiser la configuration :
root@serveur:$ iptables -t filter -Froot@serveur:$ iptables -t filter -X
Lister les règles actives :
root@serveur:$ iptables -v –LPermettre à une connexion déjà ouverte de recevoir du trafic :
root@serveur:$ iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTroot@serveur:$ iptables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Bannir l’adresse IP 10.14.20.26 :
root@serveur:$ iptables -t filter -A INPUT -s 10.14.20.26 -j DROPAjouter une règle :
iptables -t filter -A INPUT/OUPUT -p PROTOCOLE -i INTERFACE –dport XX -j ACCEPT/DROP
INPUT désignant une connexion entrante.
OUTPUT désignant une connexion sortante.
PROTOCOLE TCP, UDP, ICMP…
INTERFACE représente l’interface réseau concernée : lo, eth0, eth1
XX représente le numéro de port.
ACCEPT autorise la connexion.
DROP refuse la connexion.
Donc pour autoriser le trafic entrant sur le port 8008 de eth0 :
root@serveur:$ iptables -t filter -A INPUT -p tcp -i eth0 --dport 8008 -j ACCEPTBloquer tout le trafic entrant/sortant :
root@serveur:$ iptables -t filter -P INPUT DROProot@serveur:$ iptables -t filter -P FORWARD DROP
root@serveur:$ iptables -t filter -P OUTPUT DROP
Autoriser loopback
root@serveur:$ iptables -t filter -A INPUT -i lo -j ACCEPTroot@serveur:$ iptables -t filter -A OUTPUT -o lo -j ACCEPT
Autoriser le protocole ICMP
root@serveur:$ iptables -t filter -A INPUT -p icmp -j ACCEPTroot@serveur:$ iptables -t filter -A OUTPUT -p icmp -j ACCEPT
Maintenant il va falloir procéder a la création d’un script servant à appliquer les règles au démarrage du serveur.
root@serveur:$ vi /etc/init.d/firewall1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#!/bin/sh iptables -t filter -F iptables -t filter -X iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT DROP iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -t filter -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #Loopback iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT #ICMP iptables -t filter -A INPUT -p icmp -j ACCEPT iptables -t filter -A OUTPUT -p icmp -j ACCEPT #SSH iptables -t filter -A INPUT -p tcp --dport 8008 -j ACCEPT
Attention à ne pas bloquer le protocole ICMP, celui-ci servant aux systèmes de monitoring d’OVH (et probablement des autres hébergeurs)
Rendre le script exécutable :
root@serveur:$ chmod +x /etc/init.d/firewallAvant d’en faire un script de démarrage, il est impératif de vérifier le bon fonctionnement des règles ! Pour cela, exécuter le script en ligne de commande :
root@serveur:$ ./etc/init.d/firewallEt pour que le système l’exécute au démarrage :
root@serveur:$ vi /etc/rc.local1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. /etc/init.d/firewall exit 0
Terminé ! Le système chargera la configuration à chaque démarrage.
Je ne donnerais pas de script de configuration Iptables complet. Tout simplement parce qu’il en existe déjà un bon nombre mais aussi et surtout parce que j’estime que la configuration doit se faire au cas par cas, et qu’il ne sert à rien de prendre les règles du voisins.
Fail2ban
Fail2ban est un deamon qui s’occupe de lire les fichiers journaux (logs) tel que /var/log/pwdfail ou /var/log/apache/error_log et bannit les adresses IP qui ont obtenu un trop grand nombre d’échecs lors de l’authentification. Il met à jour les règles du pare-feu pour rejeter cette adresse IP pendant un certains laps de temps. Fail2ban peut lire plusieurs fichiers de log comme ceux de sshd ou du serveur Apache.
Installation de Fail2ban (depôts universe)
root@serveur:$ aptitude install fail2banÉditer le fichier de configuration :
root@serveur:$ vi /etc/fail2ban/jail.conf[DEFAULT] # "ignoreip" can be an IP address, a CIDR mask or a DNS host ignoreip = 127.0.0.1 #<-- Adresse IP qui ne sera jamais bannie par Fail2ban. bantime = 3600 #<-- temps du bannissement par défaut en secondes. maxretry = 3 #<-- nombre d'échecs par défaut avant le ban. [ssh] enabled = <strong>true</strong> port = ssh,sftp filter = sshd logpath = /var/log/auth.log maxretry = 6 #<-- nombre d'échecs d'authentification avant le ban.
Redémarrer le service :
root@serveur:$ fail2ban-client reloadVous pouvez tester Fail2ban mais pensez à régler le bantime à 5-10min (300-600 secondes). Ca évitera de poiroter 1 heure…