Sécurité: initier proprement iptables

Sécurité: initier proprement iptables

Quand on installe un serveur, il y a une chose, très souvent négligée, qu'il faut prendre en compte: la sécurité.
la base commence par un iptables bien initié et dédié au rôle du serveur.
Si par la suite votre serveur ne rempli plus son rôle, par exemple un serveur web, apache, nginx, sur le ou les port(s) standards 80 et ou 443, mais sur d'autres ports cela fonctionne également, il suffira de gérer le ou les flux correspondant(s).

Pourquoi ? quand on part de chez soi on ferme la maison à clé (le serveur avec iptable) mais la maison continue de remplir son rôle (esthétique, protéger vos données, vos bien, etc ...)
Par contre si on laisse la ou les porte(s) autant tout donner sur les forums underground de suite, vous gagnerez du temps.

comment on fait cela ?
Simplement en définissant ses besoin des le début, commencez pas à dire: oui mais moi mon serveur il fait DHCP, Serveur Web, base de données, et partage réseau pour la maison etc ...

Un serveur c'est pas le garage ni le tiroir fourre-tout de la maison, celui ou on range la pile usagé mais on la garde au cas ou, des clés mais on sait plus à quoi elle servent, le jeu de 32 carte ou il en manque 3 , etc...
ou alors je m'adresse pas au bon public
Un serveur => un rôle

Ceci n'est pas dédié à Debian, mais c'est simplement une distribution que j'affectionne particulièrement.

pour commencer on va vider les tables, si le besoin en était

#!/bin/bash

iptables -t filter -F

puis on va enlever toute les règles perso

#!/bin/bash

iptables -t filter -F

iptables -t filter -X

ensuite on va interdire toutes les connexions, entrantes et sortantes O_o
heu ... comment on va faire on pourra plus se connecter via ssh par exemple ?
ben on va rajouter ce qu'il faut pour ne pas casser les connexions établies

#!/bin/bash

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 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

ensuite on va autoriser le loopback
car il est quand même essentiel que le serveur puisse communiquer avec ses propres services locaux sans soucis.

#!/bin/bash

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 -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

Ensuite on va autoriser icmp (full dans l'exemple du script) mais sinon avec juste le ping request voir ci-dessous

#!/bin/bash

# ICMP (full)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

# ICMP (ping request)
# source: https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol
iptables -t filter -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -t filter -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT

Ce qui donne dans notre script

#!/bin/bash

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 -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

iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

Puis pour commencer à bosser un peu on va gérer les connexions ssh, par défaut sur le port 22, je vous recommande vivement de changer ceci et d'en choisir un autre, garder le port 22 pour votre honeypot

#!/bin/bash

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 -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

iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

Enfin, une liste non exhaustive de ports et ou services, qui peuvent avoir besoin d'être en place quand même.

#!/bin/bash

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 -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

iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

##########################################################
# DHCP In (For DHCP server)
sudo iptables -A INPUT -p udp --dport 67 -j ACCEPT

# DHCP Out (For DHCP client)
sudo iptables -A OUTPUT -p udp --dport 68 -j ACCEPT

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

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

# HTTP In & Out
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT

# HTTPS In & Out
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT

Avant de passer à la suite, on le teste notre script
chmod +x firewall
./firewall

et depuis un autre terminal on test ssh, par exemple
mais on teste également le ou les services que l'on a décider de gérer
si on perd la main on a juste a rebooter le serveur et corriger le script

Une fois que l'on a validé nos règles nous allons le rendre persistent et cela dès le boot, sur Debian par exemple.
en ce qui me concerne je le place dans /etc/init.d/firewall
mais ailleurs cela marche tout aussi bien.

Ensuite on va créer un script /etc/systemd/system/iptables.service
Dans le quel on va mettre cela, rien de plus rien de moins.

[Unit]
Description=Firewall
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/init.d/firewall
 
[Install]
WantedBy=multi-user.target

Enfin

chmod +x /etc/systemd/system/iptables.service
sudo systemctl enable iptables.service
sudo  systemctl restart iptables.service

Votre iptable sera lancé à chaque reboot et vos règles chargées.

Voilà nous sommes prêt, ce n'est pas du définitif, et il vous faudra affiner les règles, mais cela vous donne une base de départ, assez solide (je l'espère).

Que vous soyez, SysOps, DevOps, utilisateur d'un service, Architecte, pensé toujours à l'aspect sécurité.
Cela n'arretera pas, jamais un hacker, mais cela peut lui compliquer la vie, si vous multipliez les bonnes pratiques.

La question à se poser n'est pas:
- est-ce que je vais me faire pirater ?
Mais plutôt,
quand (et comment) est-ce que je vais me faire pirater ?