Le blog de Dju - Mot-clé - firewallUn peu de moto, un zeste de geek, et un brin d'autres trucs ;-)2024-03-22T17:50:26+01:00Djuurn:md5:5e61426dd704534f4aef077f5b82260bDotclearUtiliser tarpit avec iptables sous ubuntu server 10.04urn:md5:30eb0be1f5eef657a63a44d1b66db3012010-06-16T00:05:00+02:002011-07-20T15:44:59+02:00DjuServeurfirewalliptablesserveursécuritétarpitubuntuxtables<p><img src="https://blog.crifo.org/public/201006/.firewall_t.jpg" alt="firewall.gif" style="float:left; margin: 0 1em 1em 0;" title="firewall.gif, juin 2010" />
Lorsqu'on a une machine sous linux qu'on souhaite protéger, la première qu'on fait est d'établir des règles de firewall.<br />
On va autoriser juste ce que l'on souhaite, et "dropper" le reste, c'est à dire ne pas répondre aux autres connexions, afin de ne pas trop perdre de bande passante et de ressouces.<br />
Et pour ce faire, un module particulièrement pratique existe pour iptables, j'ai nommé TARPIT. <img src="/themes/BlueSky/smilies/wink.gif" alt=";)" class="smiley" /></p> <p>Pour savoir ce que fait tarpit, je vous invite à aller lire <a href="http://www.wikigento.com/securite/tarpit-iptables-les-armes-fatales-anti-ddos/">cet article de Philippe Humeau</a> qui explique très bien la chose.</p>
<p>Maintenant, il s'agit de l'installer. ici, l'install' est faite sous US 10.04, avec un kernel récent >= 2.6.32</p>
<p>Tout d'abord, on aura besoin de quelques packages :</p>
<blockquote><p>aptitude install build-essential pkg-config linux-headers-$(uname -r)</p></blockquote>
<p>Si vous avez un ubuntu 9.04/9.10 ou une debian, il vous faudra également une version récente d'iptables :</p>
<blockquote><p>wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.8.tar.bz2<br />
tar xvjf ./iptables-1.4.8.tar.bz2<br />
cd iptables-1.4.8<br />
./configure<br />
make<br />
make install</p></blockquote>
<p>Ensuite, il nous faut récupérer les sources de la dernière version de xtables, et les compiler pour avoir tous les modules nécessaires :</p>
<blockquote><p>wget http://freefr.dl.sourceforge.net/project/xtables-addons/Xtables-addons/1.27/xtables-addons-1.27.tar.xz<br />
tar xvJf ./xtables-addons-1.27.tar.xz<br />
cd xtables-addons-1.27<br />
./configure<br />
make<br />
make install</p></blockquote>
<p>EDIT: et pour debian squeeze :</p>
<blockquote><p>aptitude install xtables-addons-common xtables-addons-source<br />
module-assistant auto-install xtables-addons-source</p></blockquote>
<p>walaaa, maintenant on a tout ce qu'il faut pour jouer avec tarpit :p</p>
<p>une très bonne manière de l'utiliser est à la fin de notre script de firewall.<br />
On a fait successivement toutes nos déclaration pour accepter tel ou tel port/destination/source etc....%
A la fin, on met généralement une ligne droppant les paquets non désirés :</p>
<blockquote><p>iptables -A INPUT -i eth0 -j DROP</p></blockquote>
<p>et juste avant cette ligne, on va mettre notre tarpit :</p>
<blockquote><p>iptables -A INPUT -i eth0 -p tcp -j TARPIT</p></blockquote>
<p>(notez que le tarpit ne fonctionne QUE en tcp, pas en udp)</p>
<p>Une fois la règle ajoutée et votre script de firewall relancé, on fait un petit test pour voir comment notre machine est vue de l'exterieur.<br />
On peut par exemple utiliser <strong>nmap ip.de.votre.serveur</strong> pour voir le résultat: tous les ports semblent ouverts !<br />
Mais bien sur, si on tente de faire une connexion sur un de ces ports, rien.</p>
<p>En regardant en même temps sur notre serveur avec un <strong>tcpdump</strong>, on peut voir que notre serveur réduit la taille de la fenêtre tcp à zero, ce qui est le résultat souhaité<br />
Désormais, tous les petits malins lancant des scans de ports, se feront tarpiter, et verront leurs misérables tentatives ne pas aboutir, bien sur, mais également saturer :D</p>
<p>Maintenant, cette règle ci dessus ne sert qu'à dissuader les scanneurs de ports. On peut bien sur l'adapter à un contenu spécifique afin de se proteger plus efficacement d'attaques ddos, ou des woot-woot-at-isc.sans.dfind http par exemple.</p>https://blog.crifo.org/post/2010/06/15/Utiliser-tarpit-sur-ubuntu-server-10.04#comment-formhttps://blog.crifo.org/feed/atom/comments/58Un zotac mag comme routeururn:md5:77e2871adf572aa761e304708fccfe0a2010-04-22T20:40:00+02:002010-04-22T20:40:00+02:00DjuServeurfirewallfreeboxiptablesnettoprouteurserveurzotac mag<p><img src="https://blog.crifo.org/public/200911/.zotac_mag_s_t.jpg" alt="ZotacMag" style="float:left; margin: 0 1em 1em 0;" title="ZotacMag, nov. 2009" />
Youpi, le zotac mag est enfin arrivé et remplace désormais mon routeur.<br />
Il s'agit donc d'un zotac mag NS-01 avec un processeur Atom N230 et 1go de ram.<br />
Le système installé dessus est finalement Ubuntu Server 9.10 en version 64 bits</p> <p>Le hardware est identique <a href="https://blog.crifo.org/post/2010/01/01/Zotac-mag-enfin-recu">au zotac précédemment reçu</a>, un ND-01 à part le processeur et la ram (ici 2 x 512 Mo).<br />
On peut donc obtenir les températures du processeur et de la carte graphique de la même manière.<br />
Le disque dur étant également un 160 go, 2 partition sont créées :<br />
- une première de 2 go pour le swap (qui ne servira surement pas...)<br />
- une 2è formée en ext4, montée en /</p>
<p>Concernant le réseau, l'integrée en gigabit servira pour la connexion au réseau local, et une 2è interface réseau sera ajoutée <a href="https://blog.crifo.org/post/2010/01/19/Une-carte-r%C3%A9seau-USB">grâce à une carte USB précédemment achetée</a>, et sera reliée à la freebox (en mode bridge, donc en simple modem avec la partie routeur désactivée).</p>
<p>Une fois le système fonctionnel, et le réseau (local uniquement pour le moment) configuré, on va se définir un script de firewall ne permettant d'autoriser que ce que l'on souhaite, et refuser le reste.<br />
On édite (en root) le fichier /etc/init.d/firewall:</p>
<pre>
#!/bin/bash
### BEGIN INIT INFO
# Provides: firewall
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 1
# Description: IPtables security
### END INIT INFO
. /lib/lsb/init-functions
## interfaces
ILAN=eth0
ILAN_IP=192.168.1.1
ILAN_MASK=192.168.1.0/24
IWAN=eth1
IWAN_IP=xxx.xxx.xxx.xxx
IPT=$(which iptables)
fw_stop()
{
echo 0 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
modprobe -r ip_nat_ftp
modprobe -r ip_conntrack_ftp
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -P INPUT ACCEPT
$IPT -A INPUT -i $IWAN -j DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
}
fw_start()
{
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
## chains
$IPT -N wan-me
$IPT -A INPUT -i $IWAN -j wan-me
$IPT -N lan-me
$IPT -A INPUT -i $ILAN -s $ILAN_MASK -j lan-me
$IPT -N lan-wan
$IPT -A FORWARD -i $ILAN -s $ILAN_MASK -o $IWAN -j lan-wan
$IPT -N wan-lan
$IPT -A FORWARD -i $IWAN -o $ILAN -j wan-lan
## defaults
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD DROP
## autorise le local
$IPT -A INPUT -i lo -j ACCEPT
## autorise le lan
$IPT -A lan-me -j ACCEPT
## drope les invalides et tcp ne commencant pas par un syn
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A INPUT -m state --state NEW -p tcp ! --tcp-flags ALL SYN -j DROP
## refuse les connections venant d'ip privées sur la publique
$IPT -A wan-me -s 127.0.0.0/8 -j DROP
$IPT -A wan-me -s 10.0.0.0/8 -j DROP
$IPT -A wan-me -s 169.254.0.0/16 -j DROP
$IPT -A wan-me -s 172.16.0.0/12 -j DROP
$IPT -A wan-me -s 192.168.0.0/16 -j DROP
# accepte les connexions entrantes directes relatives et etablies
$IPT -A wan-me -d $IWAN_IP -m state --state RELATED,ESTABLISHED -j ACCEPT
## connections entrantes directes
$IPT -A wan-me -d $IWAN_IP -p icmp -s 1.2.3.4 -j ACCEPT
$IPT -A wan-me -d $IWAN_IP -p tcp --dport 22 -j ACCEPT
## nat entrant
$IPT -A wan-lan -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A wan-lan -p tcp -d 192.168.1.2 --dport 22 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IWAN -d $IWAN_IP -p TCP --dport 222 -j DNAT --to-destination 192.168.1.2:22
$IPT -A wan-lan -p tcp -d 192.168.1.20 --dport 6883 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IWAN -d $IWAN_IP -p TCP --dport 6883 -j DNAT --to-destination 192.168.1.20
## nat sortant
$IPT -A lan-wan -j ACCEPT
$IPT -t nat -A POSTROUTING -o $IWAN -j SNAT --to-source $IWAN_IP
## drop les input restants
$IPT -A INPUT -p tcp -j TARPIT
$IPT -A INPUT -j DROP
## drop les forward restants
$IPT -A FORWARD -j DROP
}
case "$1" in
start)
log_begin_msg "Starting firewall ... "
fw_start
log_end_msg 0
;;
stop)
log_begin_msg "Stopping firewall ... "
fw_stop
log_end_msg 0
;;
restart)
$0 stop
sleep 1
$0 start
;;
test)
$0 start
echo "APPUYEZ SUR CTRL+C POUR ANNULER LE REBOOT DANS 30 SECONDES"
sleep 30
reboot
;;
status)
log_action_msg "----------------- [FILTER] ------------------"
echo ""
$IPT -L -v
echo ""
log_action_msg "----------------- [NAT] ------------------"
echo ""
$IPT -t nat -L -v
echo ""
;;
*)
log_action_msg "Usage: /etc/init.d/firewall {start|stop|restart|test|status}"
exit 1
;;
esac
exit 0
</pre>
<p>Vous pouvez télécharger directement ce script <a href="https://blog.crifo.org/public/201004/firewall.zip">en cliquant ici</a> <img src="/themes/BlueSky/smilies/wink.gif" alt=";)" class="smiley" /></p>
<p><ins>Explications :</ins>
- Dans la partie "interfaces", on déclare les interfaces réseau et leur adresse IP.<br />
- Ensuite on bloque par défaut les input et les forward<br />
- on autorise l'interface locale (lo) et le réseau local (sur eth0) à se connecter au firewall<br />
- on définit des protections de base pour rejetter des paquets n'ayant rien à faire la<br />
- on passe aux<strong> connexions entrantes directes</strong><br />
- on autorise l'ip source 1.2.3.4 à pinger notre machine<br />
- on autorise la connexion sur le port 22 pour le ssh<br />
- maintenant le<strong> NAT entrant</strong>, c'est à dire les connections venant de l'exterieur qui vont être redirigées vers des machines sur le réseau local<br />
- on redirige le port 222 vers la machine interne 192.168.1.2 sur le port 22<br />
- on redirige le port 6883 vers la machine interne 192.168.1.20<br />
- puis on autorise les machines du réseau local à sortir, en utilisant en adresse IP source notre ip publique définie précédemment<br />
- enfin, on fait un TARPIT et DROP sur tout le reste :D</p>
<p>Pour le DROP, cela indique que la connexion est fermée, et surtout qu'on n'y répond pas (afin d'éviter le flood...)<br />
Pour le TARPIT, il faut avoir installé une version récente d'iptables et xtables. c'est une règle très sympathique, valable uniquement en TCP, indiquant à l'émetteur qu'il ne peut plus émettre vers notre IP et doit ré-essayer plus tard, ce qui le ralentit considérablement ! :p <br />
Pour plus d'explications la dessus, voire <a href="http://www.wikigento.com/securite/tarpit-iptables-les-armes-fatales-anti-ddos/">cet article de Philippe Humeau sur wikigento.com</a> <br />
Tarpit n'étant pas installé de base sur ubuntu 9.10 vous pouvez commenter cette ligne.</p>
<p>Afin d'installer ce script de firewall, téléchargez le puis mettez le dans <strong>/etc/init.d/firewall</strong>, et rendez le executable.</p>
<p>Le Firewall étant maintenant configuré, on peut alors brancher notre freebox sur notre raccord usb/rj45, puis activer le firewall</p>
<blockquote><p>/etc/init.d/firewall start</p></blockquote>
<p><br />
On fait en sorte que le module asix et le firewall se chargent automatiquement au démarrage de la machine</p>
<blockquote><p>echo asix >> /etc/modules<br />
update-rc.d -f firewall defaults</p></blockquote>
<p><br />
Pour arreter le firewall si besoin :</p>
<blockquote><p>/etc/init.d/firewall stop</p></blockquote>
<p><br />
Pour afficher le status des règles :</p>
<blockquote><p>/etc/init.d/firewall status</p></blockquote>
<p>(c'est toujours intéressant de noter combien de paquets ont été acceptés ou tarpités/droppés lol )</p>
<p><br />
On peut alors profiter du net sereinement <img src="/themes/BlueSky/smilies/smile.gif" alt=":)" class="smiley" /></p>https://blog.crifo.org/post/2010/04/21/Un-zotac-mag-comme-routeur#comment-formhttps://blog.crifo.org/feed/atom/comments/49Plusieurs connections internet sur un routeururn:md5:9e880c6ec5818bd3781e90171c904b472010-04-17T11:30:00+02:002010-04-22T01:11:14+02:00DjuServeurfirewallip routeip ruleiptablesroutagerouterouteur<p><img src="https://blog.crifo.org/public/201004/.reseaux-informatique_t.jpg" alt="reseaux-informatique.jpg" style="float:left; margin: 0 1em 1em 0;" title="reseaux-informatique.jpg, avr. 2010" />
Un petit reminder pour indiquer comment gérer plusieurs connection internet à partir d'un seul routeur, sous debian, en fonction de la source.<br />
On va pour cela faire joujou avec <strong>ip route</strong> et <strong>ip rule</strong></p> <p><br />
<br />
Notre routeur a 3 interfaces réseau :<br />
- eth0 pour le réseau local, configurée en 192.168.1.1 avec un masque à 255.255.255.0 (ou 192.168.1.0/24)<br />
- eth1: la première connexion internet, ADSL, en 1.2.3.4, avec une passerelle en 1.2.3.1<br />
- eth2: une 2è connexion internet par fibre optique, plus rapide que l'ADSL, en 2.3.4.5 avec une passerelle en 2.3.4.1</p>
<p>On a défini initialement une route par défaut pour faire sortir toutes les données par eth1 :</p>
<blockquote><p>route add default gw 1.2.3.1 dev eth1<br /></p></blockquote>
<p>(ou avec la commande ip route)</p>
<blockquote><p>ip route add default via 1.2.3.1 dev eth1</p></blockquote>
<p>dans notre script de firewall, on a une règle de nat en sortie, de type postrouting, dans ce genre :</p>
<blockquote><p>iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 1.2.3.4</p></blockquote>
<p>Ainsi toutes les connexions sortantes passent par cette 1è connexion internet.</p>
<p>Mettons maintenant qu'on a 2 geeks/gamers/téléchargeurs fous (rayer la mention inutile) qui ont un gros besoin de bande passante, et que l'on veut faire sortir par fibre optique sur eth2.<br />
Pour ce faire on va définir une table de routage, dans laquelle on va définir une route par défaut en eth2, et enfin associer quelques ip internes à cette table.</p>
<p>On commence par créer la table, en éditant le fichier <strong>/etc/iproute2/rt_tables</strong>.<br />
le fichier se présente en 2 colonnes, la 1è indiquant le numéro de tables, et la 2è son nom.</p>
<pre>
255 local
254 main
253 default
0 unspec
</pre>
<p>On ne touche pas à celles déjà existantes et on en créé une nouvelle, dont le numéro peut être entre 1 et 252, que l'on va appeler "fibre"</p>
<blockquote><p>echo 20 fibre >> /etc/iproute2/rt_tables</p></blockquote>
<p>on ajoute maintenant dans cette table la route vers eth2</p>
<blockquote><p>ip route add default via 2.3.4.1 dev eth2 table fibre</p></blockquote>
<p>puis on associe nos utilisateurs à cette table :</p>
<blockquote><p>ip rule add from 192.168.1.10 table fibre<br />
ip rule add from 192.168.1.11 table fibre</p></blockquote>
<p>et on n'oublie surtout pas d'ajouter une règle iptables pour la sortie sur eth2 :</p>
<blockquote><p>iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 2.3.4.5</p></blockquote>
<p>dorénavant, depuis une des 2 ips en .10 ou .11, on sortira par eth2, et sinon par défaut par eth1 <img src="/themes/BlueSky/smilies/smile.gif" alt=":)" class="smiley" /></p>
<p>par la suite, si on souhaite automatiser cela afin de configurer ces routes lorsqu'on lance notre script de firewall peut mettre ceci dans un fichier routes.sh :</p>
<pre>
#!/bin/bash
ip route flush table fibre
ip route add default via 2.3.4.1 dev eth2 table fibre
ip rule add from 192.168.1.10 table fibre
ip rule add from 192.168.1.11 table fibre
</pre>
<p>et on appelle ce fichier routes.sh dans le script du firewall <img src="/themes/BlueSky/smilies/wink.gif" alt=";)" class="smiley" /></p>
<p>ha.... Un dernier détail qui peut vous faire perdre du temps</p>
<p>Si sur votre routeur, vous n'avez qu'un seul réseau local (ici le 192.168.1.0/24) pas de problème.<br />
Supposons maintenant que vous ayez un 2è réseau local, en 192.168.2.0/24, sur une interface eth3, et qu'il est censé communiquer avec 192.168.1.0/24<br />
Le firewall est configuré pour, mais Il faut alors, dans notre table fibre rajouter une route prioritaire vers ce réseau. sinon toutes les connection autres qu'en 192.168.1.0/24 partiront par eth2 :p <br />
Donc si on reprend notre exemple ci dessus avec le fichier fibre.sh on aura :</p>
<pre>
ip route flush table fibre
ip route add prio 1 to 192.168.2.0/24 dev eth3 table fibre
ip route add prio 2 default via 2.3.4.1 dev eth2 table fibre
ip rule add from 192.168.1.10 table fibre
ip rule add from 192.168.1.11 table fibre
</pre>
<p>si on souhaite router un sous réseau entier vers une connection, on peut bien sur faire</p>
<blockquote><p>ip rule add from 192.168.2.0/24 table fibre</p></blockquote>
<p>ce qui fera sortir tout le sous réseau 192.168.2.0/24 par la fibre sur l'interface eth2<br />
Et ainsi de suite...</p>
<p>Et une dernière possibilité pour les maniaques du gros débit : faire du load balancing sur les 2 connexions sortantes simultanément.<br />
Au lieu de se créer une table de routage associée à certaines ip internes, on définit une route par défaut ainsi :</p>
<blockquote><p>ip route add default scope global nexthop via 1.2.3.1 dev eth1 weight 1 nexthop via 2.3.4.1 dev eth2 weight 1 <br /></p></blockquote>
<p>Tout se joue avec le paramètre weight. Ici j'ai un poids de 1 à chacune pour équilibrer.
Mais dans la mesure ou la fibre optique est plus rapide, on pourrait faire passer plus de données par la fibre, en mettant un poids de 2:</p>
<blockquote><p>ip route add default scope global nexthop via 1.2.3.1 dev eth1 weight 1 nexthop via 2.3.4.1 dev eth2 weight 2 <br /></p></blockquote>
<p>On aura de cette manières 2 connexions sortante par eth2 pour 1 sortant par eth1</p>
<p>Amusez vous bien :D</p>https://blog.crifo.org/post/2010/04/17/Plusieurs-connections-internet-sur-un-routeur#comment-formhttps://blog.crifo.org/feed/atom/comments/48Un nettop comme routeururn:md5:31f4328e5b9f5ab7f82e354cbb76746c2010-04-17T00:50:00+02:002010-04-19T20:33:05+02:00DjuServeurdebianfirewallfreeboxiptablesnatserverubuntuzotac mag<p><img src="https://blog.crifo.org/public/200911/.zotac_mag_s_t.jpg" alt="ZotacMag" style="float:left; margin: 0 1em 1em 0;" title="ZotacMag, nov. 2009" />
Mon routeur actuel (un vieux machin au format "boite à pizza" avec un celeron 500) que j'utilisais comme routeur avec des règles iptables et routes aux petits oignons est en train de me lâcher, je ne sais pas combien de temps (de jours... d'heures ?) il va encore tenir !<br />
Les ventilos commencent à faire du bruit façon turbine de boing 747 malgré plusieurs nettoyages, de en plus d'erreurs de hardware viennent polluer le logs... bref il est temps de changer !<br />
Le but est d'acheter une machine la plus petite et la moins gourmande possible qui se fait oublier en se posant n'importe ou.</p> <p>Pour les nostalgiques, voici mon routeur actuel, un vieux dell gx 150 qui tourne sous ubuntu server (non je n'ai pas laissé le logo MS)</p>
<p><img src="https://blog.crifo.org/public/201004/.dell_pizza_s.jpg" alt="dell gx 150" title="dell gx 150, avr. 2010" /></p>
<p>Après avoir fait la liste des nettops actuels sur le marché, et comme j'aime bien mon zotac mag, j'ai commandé... un 2è zotac mag. Notemment parcequ'il n'est pas cher, et qu'il est livré sans OS.<br /></p>
<p>Cette fois ci, c'est le zotac mag HD NS-01 (avec un atom N230 et 1 Go de ram) au lieu du précédent, un HD ND01 (atom 330 dual-core et 2 Go de ram)<br />
Il sera plus que suffisant pour faire du routage et quelques autres petites choses ici et la, comme du dns, du mail...<br />
il est actuellement trouvable sur <a href="http://www.rueducommerce.fr/Ordinateurs/PC/PC-de-bureau-Grand-Public/ZOTAC/3009118-PC-Zotac-Mag-MAG-HD-NS01-E-N230-Ion-1Go-160Go-Wifi.htm">rueducommerce</a> à <strong>215 euros</strong>, moins 6 avec le code de réduction <strong>REDUCRDCS</strong> (valable dès 180€ d'achat), soit <strong>209 euros</strong></p>
<p>Comme il n'a qu'une seule interface réseau, j'ai acquis précédemment <a href="https://blog.crifo.org/post/2010/01/19/Une-carte-r%C3%A9seau-USB">une carte réseau USB/RJ45</a> qui sera utile pour le relier à la freebox.</p>
<p>Pour l'OS, j'hésite beaucoup entre Debian, que j'apprécie et utilise beaucoup professionnellement, et Ubuntu Server.<br />
Les 2 sont très stables et tout à fait convenables pour faire un serveur, mais Ubuntu a des paquets plus récents et supporte mieux le hardware récent..<br />
What do you think about ? <img src="/themes/BlueSky/smilies/smile.gif" alt=":)" class="smiley" /></p>
<p>Bref, une fois reçu, je vous ferai un petit topo de l'install et surtout la manière de se faire un bon firewall nat, permettant de relier un LAN à internet. <img src="/themes/BlueSky/smilies/wink.gif" alt=";)" class="smiley" /></p>https://blog.crifo.org/post/2010/04/17/Un-nettop-comme-routeur#comment-formhttps://blog.crifo.org/feed/atom/comments/47Protéger son acces SSHurn:md5:4896f9f6d515953299bfe1be0f7a9bc62010-03-10T22:30:00+01:002010-11-03T23:56:47+01:00DjuServeurfirewallhackprotectionsshsyn flood<p><img title="pirate.jpg, mar. 2010" style="float: left; margin: 0 1em 1em 0;" alt="" src="https://blog.crifo.org/public/201003/.pirate_t.jpg" /></p>
<p>Lorsqu'on a un serveur en ligne 24h/24, il est obligatoire d'avoir un accès SSH pour pouvoir s'y connecter à distance et intervenir dessus.<br />
De fait, il y aura toujours des petits malins pour s'amuser à aller scanner vos ports et essayer d'entrer sur votre machine.<br />
La plupart du temps, la technique n'est pas très évoluée et les tentatives sont faites en brute-force, c'est à dire en essayant successivement des logins et mots de passe différents jusqu'à trouver le bon.<br />
On se retrouve donc avec un fichier log de 3 km de long, ainsi qu'une certaine utilisation des ressources de la machine ainsi que de sa bande passante...<br />Bref, pas glop !</p> <p>En premier lieu, on change généralement le port. il est par défaut à 22, et donc facile à identifier. Beaucoup de softs tels que nmap le detecteront.<br />On peut le changer pour un autre à 5 chiffres, on sera deja un peu plus tranquille.<br />Pour ce faire, on peut éditer le fichier <strong>/etc/ssh/sshd_config</strong><br />Toujours dans ce même fichier, on peut indiquer les utilisateurs autorisés à se connecter, via la commande AllowUsers.<br />Exemple, on veut autoriser juste titi et toto :</p>
<pre>AllowUsers titi toto</pre>
<p>Encore mieux, on peut donner un user@ip.<br />On peut ainsi autoriser les acces root pour le reseau local, et un utilisateur pour le reste:</p>
<pre>AllowUsers titi toto@192.168.1.1 root@192.168.2.0/24</pre>
<p>Maintenant, il y a toutes sortes d'attaques utilisant des techniques différentes, je ne vous parlerai ici que de la brute-force.</p>
<p>Lors de ce type d'attaque, le hacker établit plusieurs connexions par secondes, chacune avec un couple login/pass différents.
Afin de s'en protéger et de bannir l'adresse ip de l'attaquant, on va rajouter ces 3 lignes dans notre firewall iptables :</p>
<pre>iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --set<br />iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 90 --hitcount 3 -j LOG --log-prefix="SSH BRUTEFORCE BANNED"<br />iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 90 --hitcount 3 -j DROP</pre>
<p><ins>Explication :</ins><br />- La 1è ligne indique que lorsqu'une connexion arrive sur le port 22 (port ssh par défaut, à adapter suivant vos besoins), on va la marquer comme "à surveiller"<br />- La 2è va logger l'adresse IP et la date si il y a 3 nouvelles connexions venant de la meme adresse IP en 90 secondes<br />- Enfin la 3è va bannir cette adresse IP, et ne plus répondre à ces requêtes.</p>
<p>Ici ces 3 règles sont faites pour des connexions entrantes arrivant sur l'interface eth1, à adapter également <img src="/themes/BlueSky/smilies/wink.gif" alt=";)" class="smiley" /></p>
<p>L'avantage de ces règles est que toutes les tentatives de brute-force vont être loggées, et les ip bannies.<br />(on peut d'ailleurs dé-commenter la 2è ligne si on ne veut pas de log)<br />
Mais l'inconvénient est que si vous vous plantez de login ou mot de passe lors de la connexion, plus de 3 fois en 90 secondes, ou que vous vous connectez puis deconnectez 3 fois en 90 secondes, vous êtes mort ! :D <br />
Il vous faudra donc être trèèèèès prudent (surtout quand vous êtes à l'extérieur et que vous accédez en ssh à votre machine depuis votre iphone jailbreaké, on peut facilement se planter de touche, vécu inside... lol ) et adapter le nombre de connexions et le temps suivant vos besoins.<br />Dans l'exemple ci dessus, c'est assez drastique, suite à de très nombreuses tentatives. Dans un contexte courant, on pourrait mettre par exemple 5 connexions sur 5 minutes.</p>
<p>Pour faire mieux, on peut également configurer son firewall pour n'autoriser l'accès à SSH que depuis une adresse IP en particulier, comme ça plus de problème <img src="/themes/BlueSky/smilies/wink.gif" alt=";)" class="smiley" /></p>
<pre>iptables -A INPUT -i eth1 -p tcp --dport 22 -s 1.2.3.4 -j ACCEPT</pre>
<p>Par contre, il faut penser à autoriser autant d'adresses ip que vous avez de connexions extérieures; sinon vous serez coincé aussi.</p>
<p>Au passage, si vous avez installé <a href="https://blog.crifo.org/post/2010/01/12/Monitorer-son-serveur-avec-Munin">Munin</a> sur votre machine, <a href="http://muninexchange.projects.linpro.no/?search=&cid=0&os[4]=on&os[7]=on&os[3]=on&os[2]=on&os[5]=on&os[8]=on&os[1]=on&os[6]=on&pid=420">il y a un plugin</a> pour monitorer les accès. cela peut donner une bonne idées de la quantité de tentatives <img src="/themes/BlueSky/smilies/wink.gif" alt=";)" class="smiley" /></p>
<p>Enfin, pendant qu'on est dans les règles firewall, en voici également une pour se protéger du "syn-flood", technique consistant à initier massivement des connexions TCP, donc envoyer des paquets syn à un serveur sans y répondre, rendant ainsi à terme la machine distante non-communicante, voire figée si trop de ressources utilisées.<br />Testé et approuvé !</p>
<pre>echo 1 > /proc/sys/net/ipv4/tcp_syncookies<br />iptables -A INPUT -m state --state NEW -p tcp --tcp-flags ! ALL SYN -j DROP</pre>
<p>La 1è ligne active la protection anti syn-flood au niveau du kernel, et la 2è indique à iptables de bloquer toutes les nouvelles connexions tcp ne commençant pas par un syn.</p>
<p>Longue vie à votre serveur <img src="/themes/BlueSky/smilies/smile.gif" alt=":)" class="smiley" /></p>https://blog.crifo.org/post/2010/03/10/Proteger-son-acces-SSH#comment-formhttps://blog.crifo.org/feed/atom/comments/33