Tulemüür - iptables
Tulemüüri abil on võimalik filtreerida võrguliidese kaudu liikuvaid pakette. See võimaldab lubada või keelata teatud portide, protokollide või teenuste kasutamist. Antud praktikumis vaatame, kuidas on võimalik iptables abil Linuxi kernelisse sisseehitatud tulemüüri seadistada.
Ettevalmistus
Selle nädala praktikum toimub Linux Mint virtuaalmasinas. Hoolitsege selle eest, et virtuaalmasin oleks lokaalses arvutiklassi võrgus (192.168.10.1/24, vihje: Bridged Adapter). Ettevalmistuseks paigaldame praktikumis vajaminevad programmid.
sudo apt install nmap netcat iptables conntrack telnet postfix ssh
Valige paigaldamisel vaikeväärtused. Samuti pange enda Apache uuesti tööle, et kuulavaid porte oleks rohkem. Apache taaskäivitamisel küsitakse sertifikaadi parooli (vaikimisi oli selleks: "serveriparool
")
sudo service apache2 restart sudo service apache2 status
Selgitage välja (ja jätke meelde) oma arvuti IP aadress (peaksite olema lokaalses võrgus: 192.168.10.1/24)
ip addr ls
Seda praktikumi saab läbida ka väljaspool arvutiklassi, aga siis on teil vaja kloonida enda virtuaalmasinaid, et simuleerida klassis olevat keskkonda (VirtualBox-s valige linked clone). Kui te praktikumis ei osale, siis tuleb teil võimalike probleemidega iseseisvalt hakkama saada.
Tulemüüri testimine
Käsu 'netstat'
abil on võimalik uurida, millised TCP/UDP pordid on avatud ja millised võrguühendused on hetkel aktiivsed. Uuri järgmise kahe käsu väljundit.
sudo netstat -tua sudo netstat -tulpn
Teine programm, millega saab leida avatud porte on võrguskänner nmap
. Kasutage seda oma virtuaalmasina IP aadressi peal:
sudo nmap -sV oma_masina_ip
Nmap eelis on see, et seda saab kasutada teiste arvutite skänneerimiseks. Proovige nmap
käsku mõne teise tudengi virtuaalmasina IP peal, et uurida, mis pordid on neil avatud.
sudo nmap kaas_tudengi_ip sudo nmap -v -O kaas_tudengi_ip sudo nmap -v -A kaas_tudengi_ip
Iptables
Iptables on tööriist, mis võimaldab kasutajal manipuleerida Linuxi kernelisse ehitatud pakettide filtreerimise mehhanismiga. Meie kasutame seda lihtsa personaalse tulemüüri ehitamiseks.
Nii nagu Iptables nimi ütleb, toimub filtreerimine tabelite põhiselt. Vaikimisi kasutatakse tabelit filter, mis on mõeldud tavaliste tulemüüriga seotud filtreerimiste jaoks. Tabelid omakorda koosnevad ahelatest, mida mööda paketid liiguvad ja kus neid filtreeritakse. Meil huvitavad vaikimisi kasutatavad ahelad: INPUT, OUTPUT ja FORWARD.
Väga lihtsustatult (tegelikult on iptables palju keerulisem) võime ette kujutada, et arvutis on kaks ahelat, mida paketid läbivad: INPUT sisse tulevate pakettide jaoks ja OUTPUT väljuvate pakettide jaoks.
Ahelaid on võimalik ka juurde luua ning pakette erinevate ahelate vahel suunata. Iga ahelaga saame seostada pakettide filtreerimise reegleid. Reegli juures kirjeldame, milliste pakettide kohta see reegel kehtib ja mida paketiga teha, kui see vastab sellele reeglile. Tuleb aru saada, et reeglite järjekord on oluline ning sellest sõltub, kunas pakett välja filtreeritakse.
Tulemüüri toime sõltub sellest, kuidas ahelad ja reeglid on seadistatud. Kui sissetulev pakett suunatakse INPUT ahelasse, siis hakatakse sellele järjest reegelid rakendama (vastavalt reeglite järjestusele) ning kui reegel ütleb, et pakett on keelatud, siis visatakse see minema ning järgmiste reegliteni see pakett enam ei jõua (see on välja filtreeritud).
Iptables filtreerimiskäsu näide:
See reegel on seotud INPUT ahelaga (sissetulevad paketid), kehtib ainult pakettide kohta, mis tulevad eth0 võrguliidesesse ning määrab, et need paketid lükatakse tagasi. Teisisõnu blokeerib antud reegel kogu sissetuleva võrguliikluse eth0 võrguliidesel.
Tulemüüri skripti loomine
Selle praktikumi ülesandeks on kirjutada käsurea skript, mis sisaldab kõiki vajalikke käske iptables tulemüüri seadistamiseks. Iga kord, kui me soovime tulemüüri ümber seadistada, saame me muudatused kirjutada skripti ning siis selle uuesti käivitada.
Alustuseks looge uus skripti fail nimega skript.sh (lihtne tekstifail) ning kirjutage selle skripti algusesse järgmised read:
#!/bin/sh iptables -F
Käsu iptables -F
tulemusena eemaldatakse kõik olemasolevad reeglid ning see aitab meil taastada esialgne olukord. Kõik iptables reeglite muutmise käsud peab edaspidi kirjutama sellese skripti. Iga kord kui soovite tulemüüri ümber seadistada, tuleb see skript käivitada nii:
sudo sh skript.sh
Selleks, et aru saada iptables käsu parameetritest uurige vastavat man lehte: man iptables
. Järgmiseks lisage logimisreeglid:
iptables -A INPUT -j LOG --log-prefix="input " iptables -A OUTPUT -j LOG --log-prefix="output "
Nende reeglite põhjal kirjutatakse iga vastuvõetud paketi kohta kirje /var/log/kern.log
failis asuvasse logisse.
Iptables'i kasutamise juures on filtreerimise käskude järjekord väga tähtis! Kui te soovite näha juba lisatud filtreerimise reegleid, siis saate selleks kasutada järgmist käsku:
sudo iptables -L -nv --line-numbers
Kasutage seda käsku edaspidi, et kontrollida kas tulemüür on seadistatud korrektselt.
Proovige naabri masinasse logida kasutades ssh
'd, ning otsige iptablesi logist ssh'ga seotud pakette:
sudo tail -f /var/log/kern.log
Juhul kui ssh-ga ühendamine ei õnnestu, siis küsige naabrilt kas tema ssh teenus töötab (sudo service ssh status
). Kui see ei aita, siis kontrollige, et te pole iptables abil enda ühendusi ära blokeerinud ja vajadusel tehke iptables -F
.
Nüüd eemaldage praegused logimisreeglid ning keelake skriptis väljastpoolt masinasse uute ühenduste loomine kasutades järgmist nelja filtreerimise käsku:
1. Esimene reegel lubab kõik paketid, mis liiguvad läbi lo ehk loopback liidese. See on võrguliides, mida arvuti kasutab iseendale (localhost'le) pakettide saatmiseks.
iptables -A INPUT -i lo -j ACCEPT
2.Teine reegel lubab kõik paketid, mis on seotud juba varasemalt lubatud ühendustega ehk aktiivsete sessioonidega. Antud reegel lubab meil vältida varasemalt lubatud sessioonidega seotud pakettide filtreerimist. Sellest on oluline aru saada ning teil läheb seda reeglit vaja ka hiljem skripti koostamiseks!
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3. Kolmas reegel logib kõik ülejäänud paketid. Varasemate reeglite põhjal juba lubatud või keelatud pakettide kohta midagi logisse enam ei kirjutata.
iptables -A INPUT -j LOG --log-prefix "input-reject "
4. Neljas reegel keelab kõik ülejäänud paketid.
iptables -A INPUT -j REJECT
Aktiveerige muudatused ja pärast seda uurige hetkel tulemüürile teada olevate seansside tabeli conntrack -L
sisu ja proovige sellest aru saada (tehke seda ka hiljem) - küsige, kui aru ei saa. Vihjeks niipalju, et see on seotud eelmise punkti 2. reegliga. Rohkem infot conntrack kohta leiab siit: http://www.faqs.org/docs/iptables/theconntrackentries.html.
Veenduge, et pärast seda ei saa enam kõrvalmasinast teie masinasse logida.
Proovige muuta ühenduste keelamise viisi ja üritage aru saada kuidas need üksteisest erinevad. Kuna praktikumis on palju ülesandeid, siis võib erinevuse kontrollimine jääda iseseisvaks lisaülesandeks (paketi tasemel saab seda uurida näiteks wiresharki abil). Ühenduse keelamise viisi asendamiseks / täpsustamiseks muutke viimast keelamisrida, nii et REJECT asemel kasutataks ühte järgnevatest:
-j REJECT -p tcp --reject-with tcp-reset -j DROP
Lugege iptables manuaali ja vaadake, missuguseid teisi valikuid saab kasutada koos --reject-with
.
Proovige erinevate keelamisviiside mõju nmap
'i väljundile. (vajalik -Pn
, kuna ping
on meie reeglite järgi keelatud)
Nüüd modifitseerige skripti ning lubage ssh
porti (22) saabuvad paketid. Pange järgnev reegel ise õigesse kohta skriptis!
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
Tekitage sisenevate ssh
ühenduste logimiseks eraldi reegel. Veenduge, et logimine töötab. Kontrollige nüüd, et naabri masinast õnnestub teie arvutisse ssh abil sisse logida. Kontrollimiseks sai kasutada käske w
ja finger
. Juhul kui teil vastavad paketid puuduvad, siis paigaldage need:
sudo apt install procps finger
Tekitage reegel ping
(ICMP echo
) lubamiseks:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Täiendage ssh
ja icmp
reegleid nii, et nad lubaksid ühendusi ainult 2 kahest naaberarvutist (soovitatavalt teie vasakpoolne ja parempoolne naaber, aga võite proovida ka kedagi teist kui nemad pole veel valmis) nende IP aadresside põhjal. IP aadressi põhjal filtreerimiseks saab kasutada iptables käsu --source
või -s
lippu. Lisage veel juurde ka HTTP
, HTTPS
ja SMTP
serveri portide lubamine naaberarvutitest. Iptables oleku kontrollimiseks kasutage käsku sudo iptables -L -nv --line-numbers
.
NB! Testige, et lubatud arvutist saab teie masinat pingida ning ssh kaudu sisse logida, aga teistest arvutitest seda teha ei saa (eemaldage varasemalt lubatud arvuti IP skriptist ja proovige uuesti). Testimise lihtsustamiseks võite kasutada ka enda arvutit või teist virtuaalmasinat. Olemasolevast virtuaalmasinast on võimalik kergesti luua lingitud koopia (linked clone).
NB! Enne järgmise ülesande juurde minemist võiks teha koopia praegusest skriptist, et teil oleks võimalik praegust olukorda taastada, kui hiljem kogemata skripti ära lõhute.
Uute ahelate loomine
Sellisel viisil IP põhiste reeglite lisamine on tihti vajalik, aga mis juhtub, kui naabreid on väga palju? Suure arvu lubatud IP aadresside ja protokollide korral kasvab iptables reeglite arv väga kiiresti. Kümne protokolli ja pordi avamine 10 naabri jaoks nõuaks meilt 100 filtreerimise reeglit.
Selliste olukordade lihtsustamiseks saab kasutada uusi filtreerimise ahelaid. Kasutaja poolt defineeritud iptables ahelaid võib käsitleda sarnaselt funktsioonide või meetodite kasutamisele programmeerimises. Nendesse saab kokku koguda kõik teatud olukorras vajalikud reeglid ning selle olukorra tekkimisel saab paketid sinna ahelasse suunata, kus neid reegleid siis rakendatakse. Iptables ahelate kohta saate lugeda iptables manuaalist või näiteks viidatud blogipostitusest.
Meie soovime teatud hulgale naabriarvutitele lubada SSH, ICMP, HTTP, HTTPS ja SMTP protokolle. Selleks saame me luua uue NAABRID ahela ning sinna panna kõik nende protokollidega seotud filtreerimise reeglid. Edaspidi, kui pakett tuli naabri IP aadressilt, saame selle paketi lihtsalt suunata sinna ahelasse (sarnaselt funktsiooni välja kutsumisega programmeerimises).
Modifitseerige iptables skripti nii, et koondada naabrite jaoks mõeldud reeglid eraldi ühisesse NAABRID ahelasse, ning suunake kõik naabrite IP aadressilt saabuvad paketid sinna ahelasse.
Järgmine reegel loob uue naabrite ahela (paigutage see õigesse kohta skriptis):
iptables -N naabrid
Lisage skripti algusesse peale iptables -F
rida ka reegel, mis eemaldab naabrid
ahela, et teie skript saaks selle uuesti luua.
iptables -X naabrid
Liigutage kõik naabritele kehtivad reeglid (SSH, ICMP, HTTP, HTTPS ja SMTP) NAARBID ahelasse ning lisage ahela lõppu reegel, mis suunab paketid tagasi eelmisesse ahelasse (-j RETURN
abil):
iptables -A naabrid ... iptables -A naabrid ... iptables -A naabrid ... iptables -A naabrid ... iptables -A naabrid -j RETURN
Seejärel lisage INPUT ahelasse filtreerimise reeglid naabrite arvutitest pärit (IP järgi) pakettide suunamiseks NAABRID ahelasse:
iptables -A INPUT ... -j naabrid
Lisage logimise reegel, mis logib kõik naabrite ahelasse saabunud paketid nii, et logimise teade oleks kujul: "Eesnimi Perenimi - NAABRITELT LUBATUD PAKETID"
, kus siis "Eesnimi Perenimi" on asendatud teie nimega.
NB! Testige kindlasti üle, et loodud skript töötab korrektselt. Kontrollige, et lubatud arvutist saab teie masinat pingida ning ssh kaudu sisse logida ja teisest arvutitest ei saa (Eemaldage varasemalt lubatud arvuti IP skriptist ja proovige uuesti). Testimise lihtsustamiseks võite jälle kasutada enda arvutit või teist virtuaalmasinat.
Arvestus 1: Tehke ekraanitõmmis nii, et kahes kõrvutiolevas terminaliaknas oleks näha tegevused nii nagu need on järgnevas tabelis kirjeldatud.
Vasak terminaliaken | Parem terminaliaken |
---|---|
Iseenda masin | sõbra masin |
teie ip aadress käsuga ip -o addr | grep "inet 192.168.10." | |
käsk, mis eemaldab olemasolevad iptables reeglid sudo iptables -F | |
uurige millised pordid on kuulamas teie masinas sudo nmap -sV -O localhost | |
käivitage enda iptables skript sudo sh skript.sh | |
Kirjuta terminali käsureale enda eesnimi ja perenimi | |
tehke ssh ühendus naabri ahelas olevasse IP-ga arvutisse X ssh kasutaja@naabri-ahela-IP | |
kasutage nmap-i, et skänneerida arvutist X enda IP-ga seotud porte sudo nmap enda-ip-aadress | |
logige naabri ahela arvutist välja exit | |
tehke ssh ühendus arvutisse Z , mis pole teie naabrite hulgas | |
kasutage nmap-i, et skänneerida arvutist Z enda IP-ga seotud porte sudo nmap enda-ip-aadres | |
logige arvutist Z välja exit | |
Arvestus 2: Esitage oma skript.sh
, mis sisaldab naabrite jaoks ühise ahela kasutamist. Täpsed skriptile seatud nõuded on kirjeldatud praktikumi ülesande esitamise juures. Skript ei tohi käivitamisel anda veateateid. Selgelt vigase ja testimata skripti esitamise eest on tulemuseks 0 punkti!
Tagasiside
Praktikumi lõpus palume anda tagasisidet, sest see võimaldab meil antud praktikumi ja ka järgmisi praktikume paremaks muuta. Tagasiside on anonüümne ja tagasiside vormi leiate järgneva lingi abil: tagasiside ankeet.
Praktikumi ülesanded
Praktikumi ülesannete lahendamine annab kaks punkti. Praktikumi ülesanne võiks valmis saada praktikumi lõpuks, aga juhul kui see ei õnnestu, siis esitage lahendus ühe nädala jooksul (hiljemalt järgmise nädala praktikumile vastava päeva jooksul).
- Praktikumist arvestuse saamiseks esitage:
Arvestus 1: Tehke ekraanitõmmis nii, et kahes kõrvutiolevas terminaliaknas oleks näha tegevused nii nagu need on järgnevas tabelis kirjeldatud.
Vasak terminaliaken | Parem terminaliaken |
---|---|
Iseenda masin | sõbra masin |
teie ip aadress käsuga ip -o addr | grep "inet 192.168.10." | |
käsk, mis eemaldab olemasolevad iptables reeglid sudo iptables -F | |
uurige millised pordid on kuulamas teie masinas sudo nmap -sV -O localhost | |
käivitage enda iptables skript sudo sh skript.sh | |
Kirjuta terminali käsureale enda eesnimi ja perenimi | |
tehke ssh ühendus naabri ahelas olevasse IP-ga arvutisse X ssh kasutaja@naabri-ahela-IP | |
kasutage nmap-i, et skänneerida arvutist X enda IP-ga seotud porte sudo nmap enda-ip-aadress | |
logige naabri ahela arvutist välja exit | |
tehke ssh ühendus arvutisse Z , mis pole teie naabrite hulgas | |
kasutage nmap-i, et skänneerida arvutist Z enda IP-ga seotud porte sudo nmap enda-ip-aadres | |
logige arvutist Z välja exit | |
Arvestus 2: Esitage oma skript.sh
, mis sisaldab naabrite jaoks ühise ahela kasutamist. Täpsed skriptile seatud nõuded on kirjeldatud praktikumi ülesande esitamise juures. Skript ei tohi käivitamisel anda veateateid. Selgelt vigase ja testimata skripti esitamise eest on tulemuseks 0 punkti!
Arvestus 2: oma skript.sh
, mis sisaldab naabrite jaoks ühise ahela kasutamist.
- INPUT ahel peab sisaldama lokaalsete ühenduste (-i lo) ning varasemalt juba lubatud ühenduste (-state ESTABLISHED,RELATED) reegleid.
- INPUT ahelas peavad olema reeglid naabrite IP'de järgi suunamiseks Naabrite ahelasse.
- Naabrite ahelas peavad olema reeglid ICMP, SSH, HTTP, HTTPS ja SMTP lubamise kohta.
- Skriptis peab olema logimise reegel, mis logib kõik naabrite ahelasse saabunud paketid nii, et logimise teade oleks kujul:
"Eesnimi Perenimi - NAABRITELT LUBATUD PAKETID"
, kus siis "Eesnimi Perenimi" on asendatud teie nimega. - Kõik teised ühendused/paketid peavad olema keelatud.
- NB! Testige kindlasti, et skript töötab. Selgelt vigase ja testimata skripti esitamise eest on tulemuseks 0 punkti!
Lahendusi võtame vastu järgmistes failiformaatides: .txt, .sh, .pdf, .zip.
10. 10. Tulemüürid (iptables) - praktikumi ülesanneKodune ülesanne
Koduse ülesande lahendamine annab ühe punkti. Lahenduse esitamiseks on aega üks nädal. Küsimustele vastuste leidmiseks võib vaja minna lisamaterjalide.
- Windowsi tulemüür piirab vaikimisi sissetulevaid ühendusi, kuid väljuvaid mitte.
- Miks piiratakse ainult sissetulevaid ühendusi?
- Mis olukorras võiks olla vaja ka väljuvaid ühendusi piirata?
Koduse ülesande lahendus tuleks esitada aine kodulehelt. Korraga saab esitada ainult ühe faili, korduv lahenduse esitamine kirjutab eelmise lahenduse üle ning seetõttu tuleb vajaduse korral lahendus kokku pakkida üheks failiks. Lahendusi võtame vastu järgmistes failiformaatides: .txt, .pdf, .zip.
25. 10. Tulemüür - kodune ülesanneLisaülesanne - Väljuvate ühenduste piiramine
Kui te soovite piirata mingi kindla arvuti kasutaja pakette, siis saab kasutada sellist reeglit:
iptables -A OUTPUT -m state --state NEW -m owner --uid-owner=kasutaja -j DROP
Tekitage reeglid, et "kasutaja" saaks ainult veebi sirvida. (Millised erinevad võimalused selleks on? Nende puudused?)
NB! Veebisirvimise jaoks on vajalik ka nimelahenduse (DNS) lubamine - UDP port 53. Vaadake erinevate teenuste pordinumbreid failist /etc/services
Lisainfo - Tulemüüri seadistamine üle võrgu.
Praktikas tuleb tihti tulemüüri konfigureerida üle võrgu. Et vältida sellises olukorras kogemata enda süsteemist väljalukustamist (nagu ülevalolev käsk teeb), on mõistlik enne sellise reegli sisestamist paika panna varuvariant, mis eelneva olukorra automaatselt taastab.
Näiteks võib tekitada endale käivitatava skripti, sisuga iptables -F
, mis kõik olemas olevad iptables reeglid kustutab ning siis käivitada see viitega:
# at -f /täis/tee/skriptini.sh now+10 minutes
Sel juhul kui te ennast kogemata süsteemist välja lukustate, taastatakse esialgne olukord automaatselt 10 minuti möödudes.
Praktikumi masinates käsku at
ei ole, aga vastava paketi võib sinna paigaldada:
sudo apt install at