Sécuriser un serveur Linux

Quels sont les ports ouverts ?

nmap -v localhost

Cette liste de ports ouverts sera nécessaire pour concevoir le firewall.

Quel programme utilise un port donné ?

lsof -i tcp:NUMERO_DU_PORT

Une liste de commandes, avec n° PID, utilisateur, etc apparaît.

Que fait le programme de PID donné ?

lsof -p NUMERO_PID

Les dernières lignes de cette longue liste permettent de déterminer précisément ce que fait le programme.

Quels sont les paquets concernés par ce programme ?

dpkg -S UNE_PARTIE_DU_NOM_DU_PROGRAMME

#!/bin/sh
### Firewall ###

case "$1" in

start|restart|reload|force-reload)
# Réinitialise les règles
iptables -t filter -F
iptables -t filter -X

# Bloque tout le trafic
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

# Autorise toute connexion avec l'IP VOTRE_IP_PUBLIQUE_PERSO
iptables -t filter -A INPUT -s VOTRE_IP_PUBLIQUE_PERSO -j ACCEPT
iptables -t filter -A OUTPUT -d VOTRE_IP_PUBLIQUE_PERSO -j ACCEPT

# Limiter les risques de flood (limite à 1 connexion par seconde)
iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
iptables -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT

# Autorise les connexions déjà établies et localhost
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

# ICMP (Ping) On autorise le ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

# SSH (port 22)
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

# DNS sortant
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
# DNS entrant
#iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

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

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

# MySQL
iptables -t filter -A OUTPUT -p tcp --dport 3306 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 3306 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 3306 -j ACCEPT

# MySQL-proxy
#iptables -t filter -A OUTPUT -p tcp --dport 6446 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 6446 -j ACCEPT
#iptables -t filter -A OUTPUT -p udp --dport 6446 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 6446 -j ACCEPT

# FTP
#iptables -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT

# Mail SMTP
#iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

# Mail sSMTP
#iptables -t filter -A INPUT -p tcp --dport 465 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT

# Mail POP3
#iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
#iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT

# Mail sPOP3
#iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
#iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT

# Mail IMAP
#iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
#iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT

# Mail sIMAP
#iptables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
#iptables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT

# NTP (horloge du serveur)
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
;;

stop)
# Réinitialise les règles
iptables -t filter -F
iptables -t filter -X

# Autorise tout le trafic
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P OUTPUT ACCEPT
;;

status)
RES=$(iptables -L | grep INPUT | awk '{print $4}' | sed 's/)//g')
[ "$RES" != "ACCEPT" ] && echo "Firewall actif" || echo "Firewall inactif"
;;

*) echo "Usage: service firewall {start|stop|status|restart|reload|force-reload}"
;;
esac
exit 0

Fignolage

Après installation de fail2ban et paramétrage pour sshd :

Se connecter en root.

Installer, si ce n'est déjà fait le paquet util-linux :

apt install util-linux

Créer le fichier /root/byebye.sh contenant :

#!/bin/bash

for ip in $(lastb -i -s -5min | awk '{print $3}'); do {
	if [[ $ip =~ ^[0-9] ]]; then
		#echo $ip
		/usr/bin/fail2ban-client set sshd banip $ip > /dev/null || true
	fi
}; done
exit 0
Le rendre exécutable :

chmod +x /root/byebye.sh

Éditer la crontab :

crontab -e

Ajouter les lignes :

# Bye bye importuns !
*/5 * * * * /root/byebye.sh

Quitter. La crontab se met en place.

Lister les IP bloquées (et leur nombre) avec :

fail2ban-client status sshd
  • linuxaddict/administrer/securite.txt
  • Dernière modification: 27/02/2019, 23:50
  • par Claude Clerc