Installer un parefeu (iptables)
Il va falloir maintenant installer un pare feu pour contrer certaines attaques contre votre serveur. Autant vous dire que paramétrer un parefeu en ligne de commande nécessite d'être attentif car sinon vos sites web peuvent être rendus inaccessibles ou pire encore vous pourrez ne plus vous connecter à votre serveur en SSH...
On va procéder comme suit :
- installer le parfeu
- définir les ports autorisés à entrer vers le serveur
- bloquer tout les autres ports entrants
- (on ne bloque pas les données sortantes)
Nous allons maintenant installer un parfeu nommé iptables.
apt-get install iptables
Note :iptables existe aussi pour l'ipv6, pour cela il suffit d'utiliser la commande ip6tables au lieu de iptables
Par précaution on va scanner tout les ports de notre serveur pour savoir quels ports sont ouverts afin de ne pas faire de bêtises et de ne pas bloquer des services (il ne faut scanner uniquement votre propre machine car sinon c'est considéré comme une attaque pour chercher des ports ouverts)
Not shown: 1707 closed ports
PORT STATE SERVICE
21/tcp open ftp ---> le serveur FTP
22/tcp open ssh ---> l’accès au shell crypté (connexion au serveur)
25/tcp open smtp ---> le serveur de courrier sortant
53/tcp open domain ---> le serveur DNS
80/tcp open http ---> le serveur web
110/tcp open pop3 ---> l’accès aux mails
111/tcp open rpcbind ---> portmap daemon
143/tcp open imap ---> l’accès aux mails
On voit tout les ports ouverts et notamment le port 22/tcp ouvert et en écoute par ssh (connexion au serveur depuis un poste distant), il ne faudra surtout pas bloquer ce port !
pour tester on va afficher la liste de vos règles actuelles. Si vous n'avez encore jamais configurer iptables, vous devriez voir :
Chain INPUT (policy ACCEPT 3624 packets, 354K bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 4763 packets, 4383K bytes)
num pkts bytes target prot opt in out source destination
La colonne num est le numéro de la réglé, car si vous voulez supprimer une règle il faut connaître son numero (pour l'instant il n'y a pas de règles)
Pour créer des règles iptables vous allez devoir faire très attention, notamment pour le port de SSH (22 par défaut) car si vous désactivez ce port vous ne pourrez plus vous connecter à distance à votre serveur.
Notes :INPUT, OUTPUT, FORWARD.
INPUT : Si le paquet est adressé au poste, il est confronté au filtre INPUT.
OUTPUT : Si le paquet sort du poste, il passera donc par la chaine OUTPUT.
FORWARD : Si une quelconque règle autorise le paquet à entrée, le paquet passera la barrière de INPUT, si il n'y a pas de règle spécifique qui autorise le paquet à entrer, et à condition qu'il soit actif (FORWARDÉ), la trame passera par le filtre FORWARD.
ACCEPT signifie que le paquet est autorisé à passer.
REJECT est utilisé pour renvoyer un paquet erroné en réponse au paquet qui correspond . (donc il y a une trace que tu existes sur le net)
DROP signifie que le paquet est détruit. (ici tu es en mode furtif).
Autoriser le trafic local :
iptables -I INPUT -i lo -j ACCEPT
On autorise les ports nécessaires à notre configuration serveur :
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 143 -j ACCEPT
-A INPUT : on place notre règle en entrée du firewall.
-i eth0 : ici c'est l'interface ethernet qui nous intéresse.
-p tcp : le protocole traité est le TCP (on ne traite que celui-là pour le moment).
--dport 22 : la règle va être appliquée sur le port SSH (n° 22).
-j ACCEPT : on accepte ce trafic.
On autorise les pings :
iptables -A INPUT -p icmp -j ACCEPT
Autoriser les connexions déjà établies (Pour permettre à une connexion déjà ouverte de recevoir du trafic : ):
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
On bloque tout le reste :
iptables -A INPUT -i eth0 -j DROP
On veut voir la liste de nos règles :
Chain INPUT (policy ACCEPT 8494 packets, 845K bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
2 3468 147K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
3 184 13852 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
4 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25
5 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
6 416 53480 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
7 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:110
8 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:111
9 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:143
10 14 1080 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
11 0 0 ACCEPT all -- eth0 * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
12 43 6246 DROP all -- eth0 * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 16167 packets, 11M bytes)
num pkts bytes target prot opt in out source destination
Par exemple pour supprimer la règle INPUT de la ligne 2 vous devrez faire :
iptables -D INPUT 2
Pour réinitialiser le parfeu :
iptables -F
En cas de problème comme par exemple « vous ne pouvez plus accédez à votre serveur en ssh » il y a toujours la possibilité de faire un hard reboot depuis le manager de ovh (si vous louez votre serveur chez ovh), par contre si vos règles de filtrages sont chargées au démarrage de la machine et qu'elles bloquent tout, il n'y aura plus grand chose à faire à part demander une réinstallation du serveur...
Charger les règles du parefeu au démarrage du serveur :
Avant de laisser le système charge les règles de votre parefeu au démarrage, je vous conseille de le laisser fonctionner un moment pour voir si cela marche...
On va créer un fichier bash, un programme en mode console si vous voulez...la 1ere ligne d'un fichier bash doit être
#!/bin/bash
on va créer ce fichier dans le repertoire /etc/init.d/ comme ca il sera chargé au démarrage du serveur
#!/bin/bash
## note: mieux vaut eviter les accents dans un fichier bash
## on reinitialise le firewall
iptables -F
## Autoriser le trafic local
iptables -I INPUT -i lo -j ACCEPT
## On autorise les ports necessaires a notre configuration serveur :
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 143 -j ACCEPT
## On autorise les pings entrants
iptables -A INPUT -p icmp -j ACCEPT
## autoriser les connexions deja etablies
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
## on bloque tout les reste
iptables -A INPUT -i eth0 -j DROP
On donne les droits 700 au fichier /etc/init.d/mon_firewall pour le rendre exécutable et on lance l’exécutable pour voir si c'est ok
chmod 700 /etc/init.d/mon_firewall
/etc/init.d/mon_firewall
Remarque : mieux vaut ouvrir le port 53 (dns) en tcp et udp, car j'ai eu des soucis de validation des dns avec un .fr de la art de l'afnic
Bannir une IP précise
iptables -I INPUT 1 -s 111.222.111.222 -j DROP