Pour être honnête avec vous, j’avais pensé intitulé ce billet « Ouvrez, ouvrez la cage aux oiseaux… ».
Mais après avoir osé « PKI, PKI, oh ! PKI, PKI, ah! » sur l’air de « Rosalie », je me se suis dit que vous alliez sûrement vous poser de sérieuses questions sur ma santé mentale et surtout sur mes goûts musicaux (bien que je n’ai rien de personnel contre Carlos et Pierre Perret)
Bref, donc le but de ce billet est de résoudre un problème fréquent.
Vous avez un beau serveur dédié Linux (ou un pote vous en prête un) et vous contrôler bien entendu dessus les accès réseau via Iptables.
D’ailleurs, vous utilisez peut-être même un superbe script déjà tout fait dans le genre de KHARON (comment cela je fais de la pub ???)
Vous disposez a votre domicile d’une adresse IP dynamique et bien entendu, pour fixer cela en dur dans Iptables, bah c’est la cata…
Vous jonglez donc avec Fail2ban et/ou des règles du style :
Iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP |
Voici donc une petite bidouille bien proprette pour insérer votre ip dynamique dans iptables (oublier les résolutions DNS en règles Iptables, cela ne marche pas…) et autoriser l’accès en SSH depuis votre ip dynamique.
Je suppose bien évidemment que vous utilisez déja un service comme DYNDNS ou une entrée de type DYNHOST chez OVH par exemple (ou autre hein, je suis pas sectaire).
Bref, un service permettant d’avoir un nom d’hôte pour votre ip dynamique et qui est mis à jour à intervalle régulier.
Tout d’abord, il faut créer une chaine que nous appelerons « mon_ip_maison » par exemple et l’insérer au début de la chaine INPUT d’iptables.
A rajouter donc dans votre script Iptables ou à la main comme ceci :
iptables -N mon_ip_maison iptables -I INPUT 1 -j mon_ip_maison |
Reste à écrire le joli script de mise à jour que j’appellerais ici : Wesh_Gros_C_est_moi.sh
(euh vous pouvez changer le nom hein…)
#!/bin/bash # # variables generales dyndns=guiguiabloc.dyndns.com ipfile=/root/ipfile # Recuperation de l'ip IP=`/usr/bin/dig +short $dyndns | /usr/bin/tail -n 1` if [ "${#IP}" = "0" ]; then echo "Echec de la recuperation de l'ip" exit fi ANCIENNEIP="" if [ -a $ipfile ]; then ANCIENNEIP=`cat $ipfile` fi # on enregistrer la nouvelle ip echo $IP>$ipfile echo "Mise a jour d'iptables" if [ "${#ANCIENNEIP}" != "0" ]; then echo "Suppression de l'ancienne règle ($ANCIENNEIP)" /sbin/iptables -D mon_ip_maison -s $ANCIENNEIP/32 --dport 22 -j ACCEPT fi echo "Insertion de la nouvelle règle ($IP)" /sbin/iptables -A mon_ip_maison -s $IP/32 --dport 22 -j ACCEPT |
Ne reste qu’a le lancer toutes les 10 minutes via la crontab :
*/10 * * * * /root/Wesh_Gros_C_est_moi.sh 2>&1 |
Magique 😀
Vous trouverez le script de Dave Horner ICI
juste une petite erreur apres le /32 il faut ajouter « -p tcp » :
echo « Mise a jour d’iptables »
if [ « ${#ANCIENNEIP} » != « 0 » ]; then
echo « Suppression de l’ancienne règle ($ANCIENNEIP) »
/sbin/iptables -D mon_ip_maison -s $ANCIENNEIP/32 -p tcp –dport 22 -j ACCEPT
fi
echo « Insertion de la nouvelle règle ($IP) »
/sbin/iptables -A mon_ip_maison -s $IP/32 -p tcp –dport 22 -j ACCEPT
sinon merci pour le script
yep, bien vu 🙂
merci 😀
Pingback: GuiguiAbloc, un blog qui merite d'être connu, technique, reseau, linux, système - linux - geek
Bien l’astuce 🙂
Par contre c’est peut être une réflexion de parano mais si le serveur effectue une résolution de l’IP (dig) tous les x temps. Un pirate peut voir ça en écoutant le port DNS (je crois) et donc connaître le Dynhost de l’admin du serveur ?
Alors que si il écoute le port 22 je ne crois pas qu’il puisse connaitre l’IP de l’admin du serveur puisque la communication est crypté ?
Il vaut peut être mieux utiliser ta règle :
Iptables -I INPUT -p tcp –dport 22 -i eth0 -m state –state NEW -m recent –update –seconds 60
–hitcount 4 -j DROP
et couplé à du port knocking ?
Que ce soit en sniffant les requètes DNS en provenance du serveur ou en sniffant le port 22, le « pirate » connaitra de toutes facons l’ip de l’admin du serveur. (c’est la communication qui est cryptée, l’échange tcp au début est en clair, regarde un tcpdump).
La technique de ce billet n’est pas fait pour être une solution de protection du port ssh mais uniquement pour mettre a jour une entrée dynamique. Bien évidemment le reste des options iptables doivent être appliquer comme dans toutes protection du service 22.