Paieška


print PDF

Ugniasienė



Įspėjimas

Šis gidas skirtas žmonėms, kurie turi patirties Linux serverių administravimo srityje. Ugniasienės diegimas gali būti pavojingas. Galite užblokuoti savo serverį ir turėsite jį perkrauti nutraukdami maitinimo tiekimą. Jeigu padarysite klaidą galutiniame scenarijuje, visai negalėsite prisijungti prie savo serverio! Būkite atsargūs ir, jeigu šiame gide ko nors nesuprasite, nediekite ugniasienės į savo serverį!

Kas yra ugniasienė?

Tai yra programinė įranga, kuri blokuoja tam tikrus jūsų serverio prievadus. Kad geriau suprastumėte, įsivaizduokime namą: jame yra priekinės ir galinės durys. Jeigu niekada nenaudojate galinių durų, galite jas užblokuoti ir taip sumažinti potencialią riziką, kad per jas gali įsibrauti vagis. Panašiai vyksta ir su serveriu: uždaromi visi nereikalingi prievadai.

Kurie prievadai dažniausiai naudojami?


Dėmesio!

Prieš ką nors darydami būkite labai atsargūs, nes galite uždaryti ne tą prievadą. Įsivaizduokite, jeigu uždarysite SSH prievadą, turėsite jungtis telnet ryšiu, naudodami webmin sąsają arba perkrauti serverį.



Pagal nutylėjimą OVH atidaromi serverių prievadai yra:


21 - ftp (FTP serveris).

22 - ssh (šifruota vartotojo prieiga).

23 - telnet (nešifruota vartotojo prieiga).

25 - smtp (SMTP serveris).

53 - dns (DNS serveris).

80 - http (žiniatinklio serveris).

110 - pop3 (pašto prieigos serveris).

143 - imap (pašto prieiga, jeigu nenaudojamas POP3).

443 - https (šifruota žiniatinklio prieiga).

1000 - webmin (serverio konfigūravimo sąsaja).


Šie prievadai atidaromi pagal nutylėjimą, tačiau tai priklauso nuo įdiegtos programinės įrangos: gali būti atidaryti ne visi išvardinti prievadai, gali būti atidaryti ir kiti. Jūs patys sprendžiate, kuriuos prievadus palikti atvirus. Kai pasirinksite, galime pradėti.


Iptables


Iptables yra galinga ugniasienė, diegiama į visus OVH serverius. Iptables konfigūravimo pavyzdys: atidarysime kai kuriuos prievadus, o likusius uždarysime. Šiame pavyzdyje paliksime atvirus tik 22 (SSH) ir 80 (HTTP) prievadus.
Tai tik pavyzdys, savo serverio ugniasienę konfigūruokite pagal savo poreikius.

Prisijunkite per SSH kaip root.


Pirmiausiai patikriname Iptables versiją:


$ /sbin/iptables -V

iptables v1.2.4


Versija per sena. Įdiegsime 1.2.9:


$ cd /root

$ wget http://www.netfilter.org/files/iptables-1.2.9.tar.bz2

$ tar xvfj iptables-1.2.9.tar.bz2

$ cd iptables-1.2.9

$ make KERNEL_DIR=/usr/src/linux

$ make install KERNEL_DIR=/usr/src/linux

$ cd /sbin

$ mv iptables iptables.old

$ mv iptables-restore iptables-restore.old

$ mv iptables-save iptables-save.old

$ ln -s /usr/local/sbin/iptables iptables

$ ln -s /usr/local/sbin/iptables-restore iptables-restore

$ ln -s /usr/local/sbin/iptables-save iptables-save

$ /sbin/iptables -V

iptables v1.2.9


Baigta, iptables atnaujintos, galime tęsti.


Peržiūrime taisykles:



$ /sbin/iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination



Chain FORWARD (policy ACCEPT)

target prot opt source destination



Chain OUTPUT (policy ACCEPT)

target prot opt source destination


Matome 3 grandines: Input, Forward ir Output.
Pirmiausiai dirbsime su Input grandine (įeinančio srauto).

Autorizuosime 22 ir 80 prievadus:



$ /sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

$ /sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT


-A INPUT: nustatome Input taisyklę.

-i eth0: nurodome, kad dirbame tik su ethernet sąsaja.

-p tcp: nurodome, kad dirbame su TCP protokolu (šiuo metu tik su juo ir dirbsime).

--dport 22: taisyklė bus taikoma SSH (22) prievadui.

-j ACCEPT: priimsime šį srautą.



Peržiūrime taisykles:



$ /sbin/iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

ACCEPT tcp — anywhere anywhere tcp dpt:ssh

ACCEPT tcp — anywhere anywhere tcp dpt:www



Chain FORWARD (policy ACCEPT)

target prot opt source destination



Chain OUTPUT (policy ACCEPT)

target prot opt source destination


Skyrius Input šiek tiek užpildytas, tai geras ženklas ;).



Matome, kad numatytoji taisyklė yra viską priimti Chain INPUT(policy ACCEPT). Mes norime užblokuoti visą nepageidaujamą srautą. Todėl įtrauksime taisyklę, kuri užblokuos visus prievadus. Tačiau susiduriame su problema:


Pavyzdžiui, jūsų serveris susijings su kernel.org serveriu, kad parsiųstų naują branduolį, todėl sukurs naują jungtį su svetaine, kuri lauks jūsų serverio atsako. Kitaip sakant, užklausa pasieks kernel.org, tačiau kaip ji grįš, jeigu mes viską blokuojame?



Laimei, iptables yra pakankamai galinga programa ir gali atrinkti paketus pagal jų būseną. Taigi įtraukiame taisyklę:



$ /sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT


Dabar galime užblokuoti visa kita (DĖMESIO: toliau ugniasienė pradės pilnai veikti, įsitikinkite, kad įtraukiate teisingas taisykles, antraip užblokuosite savo serverį!):



$ /sbin/iptables -A INPUT -i eth0 -j DROP


Šiai taisyklei yra 2 pasirinkimai. Pirmasis sprendimas yra trinti visus nepageidaujamus paketus, t.y. kai būtų gautas toks paketas, jis būtų nepriimtas ir iškart ištrintas. Klientas lauks serverio atsako, kol baigsis užklausai skirtas laikas. Antrasis pasirinkimas - tai visų nepageidaujamų paketų atmetimas (vietoje DROP naudojama REJECT taisyklė). Jeigu gaunamas nelauktas paketas, klientui atgal siunčiamas klaidos pranešimas ir jam nereikia laukti, kol baigsis užklausai skirtas laikas.



Paketų atmetimas yra švaresnis metodas, o trynimas - saugesnis. Įsivaizduokite, kad kas nors cikliškai siunčia nelauktus paketus į jūsų serverį. Kai paketai ištrinami, serveris tiesiog neapdoros jų, o jeigu paketai atmetami, neigiamo atsakymo siuntimui bus naudojami serverio resursai ir laikas.



Jūs patys sprendžiate, kurį metodą naudoti ;)


Norėdami panaikinti visas ugniasienės taisykles, rašykite:



$ /sbin/iptables -F INPUT


Šį komanda pašalins visas Input dalies taisykles.
Jeigu norite įtraukti taisyklę tarp pirmos ir antros, rašykite:



$ /sbin/iptables -I INPUT 2 ... jūsų taisyklė


Norėdami ištrinti 3 taisyklę:



$ /sbin/iptables -D INPUT 3


Norėdami visiškai užblokuoti IP adresą:



$ /sbin/iptables -I INPUT 1 -s -j DROP


Dabar ugniasienė pilnai veikis. Bandykite skanuoti savo serverį ir matysite, kad atviri tik 22 ir 80 prievadai. Jeigu skanavimas labai lėtas, vadinasi, naudojama DROP taisyklė.



IP adresų autorizavimas ir blokavimas


Jeigu norite užblokuoti ICMP protokolą (Ping užklausas), turite praleisti bent ping.ovh.net, proxy.p19.ovh.net, proxy.rbx.ovh.net ir proxy.ovh.net užklausas į savo serverį. Tai leis OVH komandoms stebėti jūsų serverio buseną.



Tam tikrų IP ir serverių ICMP užklausų praleidimo pavyzdys:



Jūsų serverio IP adresas yra aaa.bbb.ccc.ddd
Turite praleisti: aaa.bbb.ccc.250
Pavyzdžiui, 213.186.57.153 turi praleisti 213.186.57.250



Jeigu naudojatės HG serveriu, praleiskite IP aaa.bbb.ccc.249 (laikina taisyklė).



Jeigu užblokuosite visas PING užklausas, įskaitant ir OVH, mes negalėsime tikrinti jūsų serverio būsenos ir, kai atsiras problema, nebūsime apie ją informuoti. Norėdami praleisti PING užklausas iš mūsų serverių, rašykite:




/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.sbg.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.bhs.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.250 -j ACCEPT # IP = aaa.bbb.ccc, pagal ankstesnę taisyklę
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.249 -j ACCEPT # laikinai, tik HG serveriams
/sbin/iptables -A INPUT -i eth0 -p icmp --source IP.251 -j ACCEPT # Stebėjimo sistemos IP


Kalbant apie SSH, jeigu norite apriboti prieigą tik iki savo IP, rekomenduojame leisti prisijungti ir iš cache.ovh.net. Tokiu atveju, kilus problemoms, mes galėsime prisijungti prie serverio ir pašalinti problemą. Jeigu uždarysite 22 prievadą OVH technikams, negalėsime padėti, kadangi serveris blokuos mūsų prieigą.



SSH prieigą iš mūsų serverio autorizuosite įvedę taisyklę:



/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT


Jeigu turite RAID pildytoją, nepamirškite autorizuoti NFS jungčių. Mes galime autorizuoti viską, kas ateina iš vidinio mūsų tinklo 192.168.0.0/16:



/sbin/iptables -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT

/sbin/iptables -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT


Jeigu naudojate serverių grupės konfigūraciją, turite atidaryti 79 prievadą, kad OCO susijungtų su apkrovos skirstytuvu.



/sbin/iptables -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT


Pilnos konfigūracijos pavyzdys


Toliau pateikiamas pilnas scenarijus, skirtas apsaugoti serverį su Iptables. Tai nėra būtina, kadangi visos jūsų serverio paslaugos ir taip pasiekiamos, tačiau vis tiek galite naudoti savąją konfigūraciją:

/sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 21 --source xx.xx.xx.xx -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 --source xx.xx.xx.xx -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.sbg.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source proxy.bhs.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -j REJECT


Šiose taisyklėse pakeiskite xx.xx.xx.xx atitinkamais IP adresais.

Ugniasienės automatizavimas



Kai gerai sukonfigūruosite savo ugniasienę, galėsite sukurti scenarijų, kuris bus vykdomas kiekvieno serverio įkrovimo metu. Toliau pateikiamas pavyzdys, kaip išsaugoti failą, pavadinimu "firewall", kataloge /etc/init.d/:

#!/bin/sh



1. chkconfig: 3 21 91

2. description: Firewall





IPT=/sbin/iptables


case "$1" in
start)
$IPT -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 21 --source xx.xx.xx.xx -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 22 --source cache.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 22 --source xx.xx.xx.xx -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.p19.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.rbx.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.sbg.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source proxy.bhs.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source ping.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --source 192.168.0.0/16 -j ACCEPT
$IPT -A INPUT -i eth0 -p udp --source 192.168.0.0/16 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --dport 79 -j ACCEPT
$IPT -A INPUT -i eth0 -j REJECT
exit 0
;;


stop)
$IPT -F INPUT
exit 0
;;
*)
echo "Usage: /etc/init.d/firewall {start|stop}"
exit 1
;;
esc


Suteikite 700 teises ir įvykdykite komandą "/etc/init.d/firewall start", kad paleistumėte ugniasienę ir "/etc/init.d/firewall stop", kad ją išjungtumėte. Jeigu norite, kad ugniasienė automatiškai pasileistų kiekvieno įkrovimo metu:


$ /sbin/chkconfig --level 3 firewall on
$ /sbin/chkconfig --level 06 firewall off

Prieš nustatydami scenarijaus paleidimą kiekvieno krovimo metu įsitikinkite, kad jis sukurs teisingą konfigūraciją, antraip galite visiškai užblokuoti prieigą prie savo serverio!