Classique de l’administration système et de la sécurité d’un serveur dédié, voici comment utiliser la fonction GeoIP avec notre pare-feu natif à Linux, IpTables 😀
Je vais vous décrire comment bloquer tout le trafic, que ce soit des connexions SSH, des pings, des connexions à vos sites web, ou autre, provenant d’un pays, ou de plusieurs.
Ceci ne vous permettra pas de combler d’éventuelles failles, mais sera pratique pour énormément diminuer l’exposition de votre serveur dédié aux problèmes de hacks provenant de certains pays.
En effet, peu d’entre nous ont réellement besoin que nos services, web ou autre, soit disponible hors de la France, ou dans des pays tel que la Chine, la Russie, l’Algérie, ou autre …
L’exemple de ces pays est très simple, une grosse majorité des tentatives de piratages provenant d’ip hébergées sur leur territoire.
Celà peut ce constater aussi sur vos hébergements web, par exemple sur WordPress, avec un plugin tel que Wordfence, on constate facilement des dizaines et des dizaines de tentatives de login bizarre, ou de brute-force …
Donc voyons voir comment coupler un module “GeoIP” avec IpTables, le parefeu natif à linux.
1> Installation et pré-réglages
Dans un premier temps, il est nécessaire d’installer les prérequis :
La méthode simple avec dkms qui ce charge de compiler l’ensemble
# apt-get install dkms # apt-get install libtext-csv-xs-perl # apt-get install xtables-addons-common xtables-addons-dkms geoip-database libgeoip1 unzip[output]
On vérifie que l’addons est bien installé
# dkms status xtables-addons xtables-addons, 1.42, 3.2.0-4-amd64, x86_64: installed xtables-addons, 1.42, 3.2.0-4-rt-amd64, x86_64: installed
La seconde méthode, si vous rencontrez des problèmes avec dkms, procéder à la compilation autrement
# apt-get install xtables-addons-common xtables-addons-source dkms libtext-csv-xs-perl geoip-database libgeoip1 unzip
Si vous rencontrez une erreur lors de la compilation :
Il vous faudra impérativement changer le kernel, merci OVH …
Voici un petit article vous expliquant la démarche =>
http://www.wolwx.net/changer-de-kernel-serveur-ovh-soyoustart-kimsufi/
Après avoir installé l’addons, il vous faut télécharger le script de récupération GeoIP en la plaçant dans notre répertoire de fonctionnement :
# mkdir /usr/share/xt_geoip; cd /usr/share/xt_geoip; wget http://www.wolwx.net/wp-content/uploads/2015/01/geoip-dl-build.tar.gz; tar xvf geoip-dl-build.tar.gz; rm geoip-dl-build.tar.gz; --2015-01-27 22:22:58-- http://www.wolwx.net/wp-content/uploads/2015/01/geoip-dl-build.tar.gz Résolution de www.wolwx.net... 37.59.46.137 Connexion vers www.wolwx.net|37.59.46.137|:80...connecté. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 1463 (1,4K) [application/x-gzip] Sauvegarde en : «geoip-dl-build.tar.gz» 100%[======================================>] 1 463 --.-K/s ds 0s 2015-01-27 22:22:58 (243 MB/s) - «geoip-dl-build.tar.gz» sauvegardé [1463/1463] xt_geoip_dl xt_geoip_build
Puis on exécute le téléchargement de la base de donnée geoip de maxmind.com :
# ./xt_geoip_dl --2015-01-27 22:23:35-- http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz Résolution de geolite.maxmind.com... 141.101.114.190, 141.101.115.190, 2400:cb00:2048:1::8d65:73be, ... Connexion vers geolite.maxmind.com|141.101.114.190|:80...connecté. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 432763 (423K) [application/octet-stream] Sauvegarde en : «GeoIP.dat.gz» 100%[======================================>] 432 763 --.-K/s ds 0,05s 2015-01-27 22:23:35 (7,96 MB/s) - «GeoIP.dat.gz» sauvegardé [432763/432763] --2015-01-27 22:23:35-- http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz Réutilisation de la connexion existante vers geolite.maxmind.com:80. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 947425 (925K) [application/octet-stream] Sauvegarde en : «GeoIPv6.csv.gz» 100%[======================================>] 947 425 --.-K/s ds 0,1s 2015-01-27 22:23:35 (7,80 MB/s) - «GeoIPv6.csv.gz» sauvegardé [947425/947425] --2015-01-27 22:23:35-- http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip Réutilisation de la connexion existante vers geolite.maxmind.com:80. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 1551827 (1,5M) [application/zip] Sauvegarde en : «GeoIPCountryCSV.zip» 100%[======================================>] 1 551 827 3,82M/s ds 0,4s 2015-01-27 22:23:36 (3,82 MB/s) - «GeoIPCountryCSV.zip» sauvegardé [1551827/1551827] Terminé --2015-01-27 22:23:36-- Téléchargé(s): 3 fichiers, 2,8M en 0,6s (5,04 MB/s) Archive: GeoIPCountryCSV.zip inflating: GeoIPCountryWhois.csv
Et on peut ensuite exporter cette base de manière à l’utiliser avec IpTable :
# ./xt_geoip_build -D . *.csv 146238 entries total 0 IPv6 ranges for A1 Anonymous Proxy 94 IPv4 ranges for A1 Anonymous Proxy 0 IPv6 ranges for A2 Satellite Provider 335 IPv4 ranges for A2 Satellite Provider [...] 0 IPv6 ranges for WF Wallis and Futuna 6 IPv4 ranges for WF Wallis and Futuna 5 IPv6 ranges for WS Samoa 17 IPv4 ranges for WS Samoa 5 IPv6 ranges for YE Yemen 28 IPv4 ranges for YE Yemen 0 IPv6 ranges for YT Mayotte 29 IPv4 ranges for YT Mayotte 142 IPv6 ranges for ZA South Africa 703 IPv4 ranges for ZA South Africa 11 IPv6 ranges for ZM Zambia 65 IPv4 ranges for ZM Zambia 10 IPv6 ranges for ZW Zimbabwe 61 IPv4 ranges for ZW Zimbabwe
2> Utilisation de règles GeoIP pour IpTable
Enfin, vous pourrez utiliser la fonction GeoIP avec IpTables :
# iptables -A INPUT -m geoip --src-cc CN -j DROP
Cette ligne résultant par un blocage des connexions provenant de la Chine.
Je vous conseil d’ailleurs de faire une règle par Pays afin de pouvoir désactiver les règles plus facilement au besoin.
Au cas ou, sachez que pour faire une règle sur plusieurs pays, il suffit de séparer par une virgule de cette manière (exemple fait avec la Chine, Taiwan, la Russie, et l’Algérie) : CN,TW,RU,DZ
On peut pousser le réglage et ainsi mieux filtrer en ne bloquant que certains port pour les pays choisis.
Avec cette règle en exemple, les connexions provenant de Chine seront autorisées en navigation web, ou en connexion sur des serveurs de jeux ou vocaux entre autre, mais bloquées sur les ports de connexion SSH et FTP.
# iptables -A INPUT -p tcp --dport 22,21 -m geoip --src-cc CN -j DROP
Contre exemple, refuser toutes les connexions port SSH qui ne sont pas du pays choisi (ici la France) :
# iptables -A INPUT -p tcp -m geoip ! --src-cc FR --dport 22 -j DROP
Et pour vérifier la bonne existante des réglages que l’on vient de faire :
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination fail2ban-ssh tcp -- anywhere anywhere multiport dports ssh fail2ban-ssh tcp -- anywhere anywhere multiport dports ssh DROP all -- anywhere anywhere -m geoip --source-country CN DROP all -- anywhere anywhere -m geoip --source-country RU DROP all -- anywhere anywhere -m geoip --source-country TW DROP all -- anywhere anywhere -m geoip --source-country DZ Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain fail2ban-ssh (2 references) target prot opt source destination RETURN all -- anywhere anywhere RETURN all -- anywhere anywhere
On y retrouve ici, des blocages sur les pays que sont la Chine (CN), la Russie (RU), Taiwan (TW) et l’Algérie (DZ).
D’autre part, voici quelques commandes utiles :
Comme la commande pour supprimer une règle
# iptables -D INPUT -m geoip --src-cc CN -j DROP
On supprime ici la règle de blocage correspondante à la Chine.
Et au besoin, voici simplement la commande permettant de lister les fonctions disponibles :
# iptables -m geoip --help iptables v1.4.14 Usage: iptables -[ACD] chain rule-specification [options] iptables -I chain [rulenum] rule-specification [options] iptables -R chain rulenum rule-specification [options] iptables -D chain rulenum [options] iptables -[LS] [chain [rulenum]] [options] iptables -[FZ] [chain] [options] iptables -[NX] chain iptables -E old-chain-name new-chain-name iptables -P chain target [options] iptables -h (print this help information) Commands: Either long or short options are allowed. --append -A chain Append to chain --check -C chain Check for the existence of a rule --delete -D chain Delete matching rule from chain --delete -D chain rulenum Delete rule rulenum (1 = first) from chain --insert -I chain [rulenum] Insert in chain as rulenum (default 1=first) --replace -R chain rulenum Replace rule rulenum (1 = first) in chain --list -L [chain [rulenum]] List the rules in a chain or all chains --list-rules -S [chain [rulenum]] Print the rules in a chain or all chains --flush -F [chain] Delete all rules in chain or all chains --zero -Z [chain [rulenum]] Zero counters in chain or all chains --new -N chain Create a new user-defined chain --delete-chain -X [chain] Delete a user-defined chain --policy -P chain target Change policy on chain to target --rename-chain -E old-chain new-chain Change chain name, (moving any references) Options: --ipv4 -4 Nothing (line is ignored by ip6tables-restore) --ipv6 -6 Error (line is ignored by iptables-restore) [!] --proto -p proto protocol: by number or name, eg. `tcp' [!] --source -s address[/mask][...] source specification [!] --destination -d address[/mask][...] destination specification [!] --in-interface -i input name[+] network interface name ([+] for wildcard) --jump -j target target for rule (may load target extension) --goto -g chain jump to chain with no return --match -m match extended match (may load extension) --numeric -n numeric output of addresses and ports [!] --out-interface -o output name[+] network interface name ([+] for wildcard) --table -t table table to manipulate (default: `filter') --verbose -v verbose mode --line-numbers print line numbers when listing --exact -x expand numbers (display exact values) [!] --fragment -f match second or further fragments only --modprobe=<command> try to insert modules using this command --set-counters PKTS BYTES set the counter during insert/append [!] --version -V print package version. geoip match options: [!] --src-cc, --source-country country[,country...] Match packet coming from (one of) the specified country(ies) [!] --dst-cc, --destination-country country[,country...] Match packet going to (one of) the specified country(ies) NOTE: The country is inputed by its ISO3166 code.
Enfin, très pratique, sachez que la liste des pays ainsi que leurs codes associés, est au format ISO 3166, elle est disponible sur ce lien :
http://fr.wikipedia.org/wiki/ISO_3166-1
3> Vérification du fonctionnement des règles GeoIP
Afin de nous assurer que tout est ok, il suffit de vérifier le auth.log, ou un log de serveur (apache, mail, ou autre)
Voici l’exemple des “drop” effectués, dans le syslog, par IpTable depuis l’application de ces nouvelles règles GeoIP :
[…]Jan 31 16:38:13 mondedie kernel: [ 6538.094771] DROP-RUSSIE: IN=eth0 OUT= MAC=e0:cb:4e:8c:a7:b4:6c:9c:ed:bb:bd:80:08:00 SRC=195.88.208.131 DST=xx.xx.xx.xx LEN=42 TOS=0x00 PREC=0x00 TTL=244 ID=21067 PROTO=UDP SPT=28155 DPT=9987 LEN=22
[…]
Jan 31 16:38:14 mondedie kernel: [ 6539.396250] DROP-CHINE: IN=eth0 OUT= MAC=e0:cb:4e:8c:a7:b4:6c:9c:ed:bb:6f:80:08:00 SRC=123.125.71.96 DST=xx.xx.xx.xx LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=29431 DF PROTO=TCP SPT=43345 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0
Jan 31 16:38:15 mondedie kernel: [ 6540.391375] DROP-CHINE: IN=eth0 OUT= MAC=e0:cb:4e:8c:a7:b4:6c:9c:ed:bb:6f:80:08:00 SRC=123.125.71.96 DST=xx.xx.xx.xx LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=29432 DF PROTO=TCP SPT=43345 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0
4> Sauvegarder les réglages geoip dans IpTable
Effectivement, les réglages fait en l’état sauterons au moindre redémarrage de votre serveur dédié … 🙁
Afin d’avoir en permanence vos réglages sauvegardés, et rechargés en cas de reboot, voici la manipulation à faire.
Il faut dans un premier temps exporter les règles :
# iptables-save > /etc/iptables-geoip
Puis les inclure en importation automatique au redémarrage :
# nano /etc/network/interfaces
Rajouter
post-up iptables-restore < /etc/iptables-geoip
Après la dernière ligne du paragraphe “auto eth0”, de cette manière
auto eth0 iface eth0 inet static address xx.xx.xx.xx netmask 255.255.255.0 network xx.xx.xx.0 broadcast xx.xx.xx.255 gateway xx.xx.xx.254 post-up iptables-restore < /etc/iptables-geoip
Après reboot, vous pourrez revérifier immédiatement la présence des règles et constater par vous mêmeavec la commande citée plus haut :
# iptables -L
Voilà donc comment sécuriser un peu plus son serveur dédié 🙂
Sources :
http://www.how-to.ovh/viewtopic.php?t=11&p=15
http://debian-facile.org/viewtopic.php?id=7185