{{tag>sécurité serveur Linux Fail2ban bash firewall}} ====== Sécuriser un serveur Linux ====== ===== Commandes (très) utiles ===== ==== 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. Pour obtenir le PID (//Process IDentifier//) de tout ce qui tourne sur votre machine : ps auxwww Par exemple, pour trouver le PID de geany (qui est affiché à l'écran) : ps auxwww | grep geany retourne : 4967 0.6 0.8 103446360 136824 ? Sl déc.20 5:00 geany Le PID de geany est donc actuellement de 4967. Il changera à chaque lancement de geany. ==== Quels sont les paquets concernés par ce programme ? ==== dpkg -S UNE_PARTIE_DU_NOM_DU_PROGRAMME ===== Firewall ===== #!/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 ===== Fail2ban ===== * [[https://doc.ubuntu-fr.org/fail2ban]] ==== 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 ===== Liens ===== * [[https://openclassrooms.com/courses/securiser-son-serveur-linux|Sécuriser un serveur Linux (OpenClassRooms)]] * [[https://doc.ubuntu-fr.org/fail2ban|Bannir des IP avec fail2ban - v2020]] * [[https://manpages.ubuntu.com/manpages/bionic/fr/man1/last.1.html|last, lastb - Afficher une liste des derniers utilisateurs connectés]] * [[https://blog.bandinelli.net/index.php?post/2015/01/02/Entretenir-et-s%C3%A9curiser-ownCloud-avec-logrotate-et-fail2ban|Entretenir et sécuriser Nextcloud/ownCloud avec logrotate et fail2ban]] ---- {{counter|today| personne a visité cette page aujourd'hui| personnes ont visité cette page aujourd'hui}} et {{counter}} en tout.