Objavljeno:

Preprost nadzor lokalnega omrežja z RaspberryPi

Znanec, ki na osnovni šoli vodi tečaj računalništva, je naletel na precej zoprno težavo. Zaradi napačne konfiguracije omrežja prihaja do tega, da si učenci lahko spreminjajo IP naslove v lokalnem omrežju, v omrežje se lahko prijavljajo neznani računalniki, pogosto prihaja do IP konfliktov. Da bi lahko dobili vsaj približno sliko o viru težav in stanju omrežja, bi bilo potrebno vzpostaviti nek osnoven sistem monitoringa naprav na omrežju. Ker šola za nakup dodatne opreme nima denarja, on pa ne veliko časa, mora biti rešitev poceni, hitra in enostavna.

Če ste ob branju zgornjega odstavka pomislili na RaspberryPi in Linux, ste na pravi poti. Kako konkretno, pa si bomo pogledali v nadaljevanju. Hkrati bo spodnji sestavek tudi dober prikaz hekersko-inženirskega pristopa k zgoraj opisanemu problemu.

Prvo orodje, ki ga bomo uporabili je netdiscover. Gre za orodje, ki s pomočjo pošiljanja ARP paketkov v lokalnem omrežju poišče vse omrežne naprave in njihove IP naslove.

Orodje najprej namestimo:

sudo apt-get install netdiscover

Nato si ogledamo aktivne omrežne vmesnike. Vpišemo ukaz:

ifconfig

…in dobimo približno takle izpis:

eth0 Link encap:Ethernet HWaddr b8:xx:yy:xx:yy:76 
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: xxxx::da22:6aa4:xxxx:a21/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:212299 errors:0 dropped:3594 overruns:0 frame:0
TX packets:299870 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000 
RX bytes:60471427 (57.6 MiB) TX bytes:34263234 (32.6 MiB)

lo Link encap:Local Loopback 
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:63716 errors:0 dropped:0 overruns:0 frame:0
TX packets:63716 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1 
RX bytes:10039793 (9.5 MiB) TX bytes:10039793 (9.5 MiB)

Kot vidimo, ima ethernet omrežni priključek (eth0) v lokalnem omrežju IP naslov 192.168.1.12. Glede na omrežno masko lahko ugotovimo, da se v lokalnem omrežju uporabljajo IP naslovi od 192.168.1.1 do 192.168.1.254. Oziroma v drugačnem zapisu: 192.168.1.0/24.

Sedaj poženemo netdiscover, in sicer s parametrom -r, ki mu podamo omrežje, ki naj ga preišče. Parameter smo uporabili zato, ker smo z ukazom ifconfig že ugotovili nekaj malega o omrežju in želimo iskanje omrežnih naprav pospešiti. Ker netdiscover za delovanje potrebuje skrbniške pravice, rečemo:

sudo netdiscover -r 192.168.1.0/24

Dobimo približno takle izpis:

Currently scanning: Finished! | Screen View: Unique Hosts 
21 Captured ARP Req/Rep packets, from 20 hosts. Total size: 1260 
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor 
----------------------------------------------------------------------------- 
192.168.1.1   xx:5e:xx:f7:xx:07 01 060 Unknown vendor 
...
192.168.1.50  xx:1e:xx:14:xx:dc 01 060 Apple, Inc 
...
192.168.1.100 xx:18:xx:1b:xx:44 01 060 FON 
...
192.168.1.200 xx:11:xx:19:xx:97 01 060 Synology Incorporated

Iz izpisa vidimo kateri računalniki oziroma omrežne naprave, so bile v času skeniranja povezane v omrežje. Žal je izpis “živ”, torej se periodično samodejno obnavlja. Zato uporabimo parameter -P, ki podatke izpiše na standardni izhod (stdout, po domače: na zaslon):

sudo netdiscover -r 192.168.1.0/24 -P 

Izpis je sedaj statičen, vendar pa vsebuje nekaj uvodnih in zaključnih vrstic. Nas pa zanimajo samo podatki na sredini. Zato iz izpisa odrežemo zgornje tri in spodnji dve vrstici. Uporabimo ukaz:

sudo netdiscover -r 192.168.1.0/24 -P | tail -n +4 | head -n -2

Izpis podatkov je sedaj že precej lepši oz. bolj uporaben za naš namen. Vendar pa v resnici potrebujemo samo prva dva stolpca (IP naslov in MAC naslov). Pa morda še datum in čas skeniranja. Zdaj se ukaz že nekoliko bolj zaplete:

sudo netdiscover -r 192.168.1.0/24 -P | tail -n +4 | head -n -2 | column -t | awk -v date="$(date +"%Y-%m-%d %H:%M:%S")" '{print $1, $2, date}'

Zdaj smo na zaslon dobili štiri stolpce, in sicer: IP naslov, MAC naslov, datum skeniranja in čas skeniranja. Približno takole:

192.168.1.1 xx:5e:xx:f7:xx:07 2016-10-21 23:05:02
...
192.168.1.200 xx:11:xx:19:xx:97 2016-10-21 23:05:02

Izpis je sedaj že skoraj točno tak, kakršnega želimo. Potrebno je le še malce poliranja in sicer bi podatke radi shranili v tab-delimited CSV datoteko. Dodamo še dva končna ukaza:

sudo netdiscover -r 192.168.1.0/24 -P | tail -n +4 | head -n -2 | column -t | awk -v date="$(date +"%Y-%m-%d %H:%M:%S")" '{print $1, $2, date}' | tr [:blank:] \\t  > /tmp/machines.csv

Ko sedaj ukaz poženemo, se v podimeniku /tmp pojavi CSV datoteka machines.csv. To pa bi sedaj radi uvozili v bazo.

Bazo? PostgreSQL, seveda.

Najprej ga namestimo (da, na RaspberryPi):

sudo apt-get install postgresql

Nato nastavimo osnovne nastavitve ter ustvarimo bazo network (z lastnikom pi):

sudo su
su - postgres
psql

UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
DROP DATABASE template1;
CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';
UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

CREATE ROLE pi WITH LOGIN;
CREATE DATABASE network WITH OWNER pi;

Ko se vrnemo v račun uporabnika pi, vstopimo v bazo in ustvarimo ustrezno tabelo:

psql network
create table machines (ip text, mac text, discover_date date, discover_time time);

Sedaj v bazo uvozimo podatke iz CSV datoteke:

psql network -c "\COPY machines from '/tmp/machines.csv' delimiter E'\t';"

… in datoteko pobrišemo:

rm /tmp/machines.csv

S tem smo si ustvarili celoten postopek. Zdaj ustvarimo preprosto skripto, ki bo izvedla skeniranje omrežja in podatke takoj za tem samodejno uvozila v bazo:

nano skeniraj_omrezje.sh

Vanjo vpišemo:

sudo netdiscover -r 192.168.1.0/24 -P | tail -n +4 | head -n -2 | column -t | awk -v date="$(date +"%Y-%m-%d %H:%M:%S")" '{print $1, $2, date}' | tr [:blank:] \\t > /tmp/machines.csv
psql network -c "\COPY machines from '/tmp/machines.csv' delimiter E'\t';"
rm /tmp/machines.csv

Sedaj nastavimo pravice izvajanja skripte:

chmod +x skeniraj_omrezje.sh

…nato pa jo poskusno zaženemo:

./skeniraj_omrezje.sh

Če smo vse nastavili kot je treba, bi morali z vstopom v bazo:

psql network

…in ukazom:

select * from machines;

…dobiti seznam vseh omrežnih naprav, ki so bile najdene ob skeniranju.

Za konec dodamo še češnjico na torto. Odpremo crontab:

crontab -e

…in na konec dodamo ukaz, s katerim določimo samodejno izvajanje skripte vsakih 5 minut:

*/5 * * * * /home/pi/skeniraj_omrezje.sh

Nato vstopimo v bazo, počakamo 5 minut in z ukazom:

select count(*) from machines;

…pogledamo koliko zapisov je v bazi. Če se število vsakih nadaljnjih 5 minut veča, vemo, da skripta deluje, RaspberryPi pa samodejno zbira podatke o omrežnih napravah v lokalnem omrežju.

Kar sledi, je čisti užitek. Poizvedbe na bazi, iskanje anomalij (MAC naslovi z različnimi IP naslovi,..), risanje grafov – kar nam srce poželi.

Odpremo pivo in pokličemo znanca, kdaj pride iskat Raspberry Pi.

Naloga opravljena.

Kategorije: Digitalna forenzika, Informacijska varnost, Odprta koda
Ključne besede: omrežja, Raspberry Pi