pingvin1.jpg

GeoIP szűrés Iptables tűzfalon

Írta: Torig on . Beküldve: Linuxos dolgok

Akármit teszel a szerveredet támadni fogják. A támadásokat robot hadseregek tömkelege automatikusan csinálja. Ha megfigyeled a logjaidat, akkor azt tapasztalhatod, hogy bizonyos országok felől igencsak gyakoribbak a támadások, mint más országokból. Sőt! A támadások 90 %-a csak egy-két országból indul. Ez a cikk arról szól, hogy hogyan tilts le bizonyos országokból érkező kapcsolatokat a tűzfalad segítségével. Ez a cikk Ubuntu 12.04 LTS szerver konfigurációra vonatkozik.

Nem minden esetben lehet ország szerint tiltani a kapcsolatokat. Hogy lehet-e, azt mindig az adott szerver funkciója dönti el. Ha például olyan cég szerverét kell védened amelyiknek kínai kapcsolata van, akkor értelemszerűen nem célszerű a kínai kapcsolatokat tiltani. Viszont egy kisebb cég vagy egy otthoni szerver esetében már lehet opció egy egész ország kizárása.

Mivel lehet egy egész országot kizárni? Egyszerű. Ott van az Iptables tűzfalad. Csak egy bökkenő van. Honnan fogja tudni a tűzfal, hogy honnan kapcsolódnak hozzá? Legjobb lenne egy listát használni, amelyben fel vannak sorolva az országokhoz tartozó IP cím tartományok és azokból kellene kimazsolázni azokat a címeket amiket tiltani szeretnél. Jó hírem van! Létezik ilyen lista. Úgy hívják GeoIP.

 

GeoIP telepítése

A következő műveleteket rootként kell végrehajtani. Nyiss egy root konzolt!

sudo su

A GeiIP használatához telepíteni kell a megfelelő kernel modult.

apt-get install xtables-addons-common

Készíts egy könyvtárat a GeoIP fájloknak. 

mkdir /usr/share/xt_geoip

Telepítsd a szükséges Perl modulokat!

apt-get install libtext-csv-xs-perl

Töltsd le a GeoIP adatbázist!

/usr/lib/xtables-addons/xt_geoip_dl
Konvertáld át a GeoIP adatbázist az alábbi paranccsal! 
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv

 

Tűzfal beállítások

Ha eddig eljutottál, akkor már a szerveren vannak a GeoIP adatbázisok. Már csak a tűzfalnak kell megmondani, hogy használja is őket. Az alábbihoz hasonló szabályokkal állíthatod be a tiltásokat. Az egyes sorok funkcióját a szabályok közti kommentekben írtam le. A példában Kínát és Oroszországot és az érvénytelen proxy kapcsolatokat tiltom le. A megoldás amit itt bemutatok lehetővé teszi, hogy az eldobott csomagokat logban rögzítsem. 

#GeoIP tiltasok
#Geoip log es eldobas lanc letrehozasa
iptables -N geoip-log-drop
#Amit visszakuldok a geoip-lod-drop lancra azt loggolom. A forrasa pedig nem input hanem geoip-log-drop mert a szabaly kesobb erre a lancra iranyitja.
#Érvénytelen proxy kapcsolatok logolása
iptables -A geoip-log-drop -m geoip --src-cc A1,A2 -j LOG --log-prefix "GEOIP-Proxy" --log-level info
#Kinai kapcsolatok logolasa.
iptables -A geoip-log-drop -m geoip --src-cc CN -j LOG --log-prefix "GEOIP-Kina" --log-level info
#Orosz kapcsolatok logolasa.
iptables -A geoip-log-drop -m geoip --src-cc RU -j LOG --log-prefix "GEOIP-Orosz" --log-level info
#A geoip-log-drop lanc itt dobja el a csomagot. Ez az a szabaly ami ténylegesen eldobja a csomagokat.
iptables -A geoip-log-drop -j DROP

#Szűrő szabaly. Amire ez teljesul a azt a csomagot visszakuldom (jump) a geoip-log-drop lancra.
iptables -A INPUT -m geoip --src-cc A1,A2,CN,RU -j geoip-log-drop

A logolás nem kötelező. Simán el is dobhatod a csomagot logolás nélkül. Abban az esetben új láncot sem kell létrehozni, hanem simán DROP-al eldobod a csomagot. Lásd a legutolsó szabály. Csak akkor a -j után geoip-lod-drop heylett rögtön DROP-ot vagy REJECT-et kell megadnod. Rajtad múlik, hogy DROP-ot vagy REJECT-et használsz-e. Előbbi esetben semmi választ nem kap a küldő oldal, ezért lehet, hogy többször újrapróbálkozik, utóbbi esetben kap egy üzenetet, hogy el lett utasítva a csomagja. Sok esetben ez utóbbi megoldás haszna az, hogy a robotok értelmezik, hogy el lettek utasítva és nem próbálkoznak többé. A kifelé menő forgalmat is tudod korlátozni. Ebben az esetben a --src-cc helyett --dst-cc kell a szabályban megadni, mégpedig az OUTPUT láncon.

Nézd meg a logokat!

cat /var/log/syslog |grep GEOIP

Valami hasonlókat fogsz találni.

Mar 5 08:18:27 teszt kernel: [1226513.041975] GEOIP-Kina IN=eth1 OUT= MAC=00:0e:0c:a8:05:6b:00:25:9c:d7:ae:99:08:00 SRC=202.46.58.23 DST=192.168.1.90 LEN=60 TOS=0x00 PREC=0x00 TTL=43 ID=36616 DF PROTO=TCP SPT=6191 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0

Ha a logokban támadásra utaló jeleket vélsz felfedezni, akkor parancssorból könnyen ellenőrizheted a támadó forrás országát.

geoiplookup 202.46.58.23
GeoIP Country Edition: CN, China

Maradt még egy fontos feladat. A GeoIP adatbázist időről-időre frissíteni kell. A napi frissítés talán túlzás, de hetente egyszer érdemes frissíteni. Vegyél fel egy feladatot a crontabba. Szerkeszd kedvenc szövegszerkesztőddel a crontabot!

vim /etc/crontab

Vedd fel a következő sorokat!

#GeoIP Update 2 ora 10-kor.
10 2 * * 1 root yes|/usr/lib/xtables-addons/xt_geoip_dl && /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv

 

Geoip beállítása Apache szerveren

Van lehetőséged, hogy a GeoIP adatbázist a Web szervereden is használjad. Telepítsd a GeoIP Apache modult!

apt-get install libapache2-mod-geoip

Indítsd újra az Apache szervert!

/etc/init.d/apache2 restart

Az Apache modul működésének teszteléséhez kell készíteni egy php fájlt az alábbi tartalommal.

vim /var/www/geoiptest.php
<html>
<body>
<?php
$country_name = apache_note("GEOIP_COUNTRY_NAME");
print "Country: " . $country_name;
?>
</body>
</html>

A teszteléshez nyisd meg a böngészőben az alábbi címet.

http://sajátdomain.hu/geoiptest.php

Ha ezt látod, akkor működik az Apache modul.

Country: Hungary

Most el kell készíteni az Apache modulhoz a megfelelő tiltásokat. A Példában szintén Kína és Oroszország, valamint az érvénytelen proxy címek vannak tiltva.

vim /etc/apache2/mods-available/geoip.conf
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
#Tiltasok
<files *>
        Order allow,deny
        SetEnvIf GEOIP_COUNTRY_CODE (A1|A2|CN|RU) BlockCountry
        # ... place more countries here

Deny from env=BlockCountry
allow from all
</files>
</IfModule>

Indítsd újra az Apache szervert!

/etc/init.d/apache2 restart

 

Tesztelés

Hogy működik-e azt könnyen ellenőrizheted egy anonim proxy oldalon keresztül. A tűzfaladat és az Apache konfigurációdat is tudod ezzel a módszerrel tesztelni. Keress egy anonim proxy oldalt és azon keresztül nyisd meg a weboldaladat. A tűzfal logban tudod figyelni a kapcsolódási kísérleteket.

tail -f /var/log/syslog

A logban látod a kapcsolódási kísérletet és ki tudod venni belőle a forrás IP címet. Azonosítsd a forrás országot.

geoiplookup <ip cím amit a logból kivarázsolsz>

Tiltsd le forrás országot a konfigurációban (Tűzfal vagy Apache. HA Apache akkor ne feledd el újraindítani az Apache szervert!) és próbáld ki, hogy az anonim proxy oldala felől újra meg tudod-e nyitni a weboldaladat. Ha mindent jól csináltál, akkor az anonim proxy már nem fogja tudni megnyitni az oldaladat.

Az egyetlen hátulütője a GeoIP adatbázisoknak, hogy néha nagy ritkán produkálhat nem valós tiltásokat is. Hallottam már olyanról, hogy valami kisebb falut is sikerült kizárni Kínával együtt. Ezért fontos időről-időre frissíteni az adatbázist. Még nem találkoztam téves tiltással, de a tapasztalatom szerint Kína, Oroszország és Ukrajna letiltásával a szervert ért támadások száma töredékére esett vissza.

Kifelé menő kapcsolatok tiltása

Mint fentebb írtam lehet tiltani qa kifelé menő kapcsolatokat is. Ha a géped egy vállalati tűzfal, akkor az egyik lehetséges konfigurálási lehetőség, hogy a tűzfaladon tilthatod a kifelé menő anonim proxy kéréseket is. Sajnos (vagy hála isten) ez a funkció a magyarországi anonim proxy oldalakkal kevésbé működik. Annyi a különbség, hogy --src-cc helyett --dst-cc kell a megadni, és geoip-log-drop lánc átirányítását az OUTPUT láncon kell végrehajtani.

Átdolgozva a fenti szabályt OUTPUT irányra így néz ki.

#GeoIP kimeno tiltasok
#Geoip log es eldobas lanc letrehozasa
iptables -N geoip-log-drop
#Amit visszakuldok a geoip-lod-drop lancra azt loggolom. A forrasa pedig nem output hanem geoip-log-drop mert a szabaly kesobb erre a lancra iranyitja.
#Érvénytelen proxy kapcsolatok logolása
iptables -A geoip-log-drop -m geoip --dst-cc A1,A2 -j LOG --log-prefix "GEOIP-Proxy-kimeno" --log-level info
#Kinai kapcsolatok logolasa.
iptables -A geoip-log-drop -m geoip --dst-cc CN -j LOG --log-prefix "GEOIP-Kina-kimeno" --log-level info
#Orosz kapcsolatok logolasa.
iptables -A geoip-log-drop -m geoip --dst-cc RU -j LOG --log-prefix "GEOIP-Orosz-kimeno" --log-level info
#A geoip-log-drop lanc itt dobja el a csomagot. Ez az a szabaly ami ténylegesen eldobja a csomagokat.
iptables -A geoip-log-drop -j DROP

#Kimenő szűrő szabaly. Amire ez teljesul a azt a csomagot visszakuldom (jump) a geoip-log-drop lancra.
iptables -A OUTPUT -m geoip --dst-cc A1,A2,CN,RU -j geoip-log-drop

Természetesen a két szabályt tetszőlegesen kombinálhatod egymással. Remélem sikerül hasznos ötleteket adjak a szervered védelméhez.

UPDATE 2015.11.09

A közelmúltban azt vettem észre, hogy nem működik az Iptablesen a Geoip modul. A következő paranccsal lehetett megjavítani:

sudo module-assistant --verbose --text-mode auto-install xtables-addons