Palomuuri

Varoitus

Tämä ohje on pelkästään henkilöille, joilla on kokemusta dedikoidun palvelimen hallinnoinnista Linux-ympäristössä. Palomuurin konfiguroiminen voi olla erittäin vaarallista. Voit pahimmassa tapauksessa estää pääsysi palvelimelle niin, että ainoana mahdollisuutenasi on asentaa palvelin kokonaan uudestaan.

Mikä palomuuri on?

Se on sovellus, jonka avulla voit sulkea ja avata portteja palvelimellasi. Kuvittele palvelimesi olevan talo. Siinä on etu- ja takaovi. Et käytä takaovea koskaan, joten se kannattaa muurata umpeen. Miksi? Koska muussa tapauksessa murtovaras saattaa tulla sen kautta sisään. Tämä on kärjistetty esimerkki, mutta palomuuri toimii periaatteessa samalla tavalla. Jos et käytä tiettyä porttia, kannattaa se sulkea.

Mitkä portit ovat yleisesti käytössä?

Varoitus: Sinun täytyy olla erityisen tarkkana porttien sulkemisen kanssa. Jos suljet väärän portin, saatat estää käyttäjien pääsyn palveluusi, tai jopa oman pääsysi palvelimelle!

OVH:n palvelimissa ainoa vakiona avoinna oleva portti on 22. Riippuuen palvelimellasi olevasta käyttöjärjestelmästä, avoimia portteja saattaa olla muitakin. Tässä lista yleisimmistä porteista:

21 - FTP (Mahdollistaa salaamattoman tiedostojen siirron).
22 - SSH (Mahdollistaa turvallisen shell-yhteyden)
23 - Telnet (Mahdollistaa salaamattoman shell-yhteyden)
25 - SMTP (Mahdollistaa sähköpostien lähettämisen palvelimeltasi)
53 - DNS (Mahdollistaa palvelimesi toimimisen nimipalvelimena)
80 - HTTP (Mahdollistaa www-sivujen ylläpitämisen palvelimellasi)
110 - POP3 (Mahdollistaa sähköpostien vastaanottamisen palvelimellesi)
143 - IMAP (Vaihtoehto POP:lle)
443 - HTTP (Mahdollistaa salatun HTTP-yhteyden palvelimellesi)
10000 - Webmin (Palvelimen Webmin-hallintapaneeli)


Nämä ovat vain yleisimpiä portteja, joista suuri osa ei ole avoinna palvelimellasi sen asennuksen jälkeen. Riippuen sovelluksista joita palvelimellasi ajat, sinulla saattaa olla muita kuin yllämainittuja portteja auki. On sinun vastuullasi tietää tarvitsemasi avoimet portit.

Iptables

Iptables on Linux-kernelin sisäänrakennetun palomuurin käyttöliittymä. Se on asennettuna jokaiseen OVH:n palvelimeen, jonka käyttöjärjestelmä on Linux. Seuraavassa esimerkissä suljemme muut portit paitsi 22 (SSH) ja 80 (HTTP).

Ensiksi tarkastamme kaikki ketjut:

$ /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


Näemme 3 ketjua: Input, Forward ja Output. Nyt lisäämme Input-ketjuun (sisääntulevalle liikenteelle) säännöt hyväksyä portit 22 ja 80:

$ /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: Luomme säännön vain Input-ketjuun
-i eth0: Luomme säännön ethernet-käyttöliittymälle
-p tcp: Sääntö koskee vain TCP-protokollaa
--dport 22: Sääntö luodaan portille 22
-j ACCEPT: Hyväksymme liikenteen

Tarkastamme kaikki ketjut:

$ /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


Luomamme säännöt ovat tulleet voimaan. Näemme myös, että oletuskäytäntö on hyväksyä kaikki liikenne: Chain INPUT (policy ACCEPT). Haluamme estää kaiken liikenteen mitä emme hyväksyneet edellisessä vaiheessa. Meidän tulee lisätä sääntö, joka sulkee muut portit. Mutta meillä on ongelma:

Kun otamme palvelimelta yhteyden esimerkiksi kernel.org-osoitteeseen ladataksemme uuden kernelin, toimii ulospäin lähtevä yhteys normaalisti. Pyyntö saavuttaa kernel.org:n, mutta miten vastaus pääsee takaisin palvelimelle, kun olemme estäneet kaiken?

Onneksemme Iptables on voimakas työkalu ja tunnistaa erilaiset paketit. Lisäämme seuraavan säännön:

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


Ennen seuraavan komennon suorittamista suosittelemme sinua tarkastamaan, että olet konfiguroinut palomuuri täysin oikein, ettet estä omaa pääsyäsi palvelimellesi. Nyt voimme estää muun liikenteen:

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


Tälle säännölle meillä on kaksi vaihtoehtoa. Ensimmäinen vaihtoehto on pudottaa (DROP) paketit: Paketti saapuu, ja jos sitä ei hyväksytä, palvelin poistaa sen. Paketin lähettäjä odottaa vastausta kunnes saa aikakatkaisun (timeout). Toinen vaihtoehto on hylätä (REJECT) paketti: Paketti saapuu, ja jos sitä ei hyväksytä, lähetämme paketin lähettäjälle negatiivisen vastauksen.

Pakettien hylkääminen on siistimpi tapa, mutta pudottaminen on turvallisempi. Jos joku lähettää sinulle paketteja jatkuvasti väärään porttiin ja sinulla on sääntönä REJECT, joutuu palvelin vastaamaan jokaiseen pakettiin negatiivisesta, mikä taas syö resursseja.

On sinun valintasi kumpaa käytät.

Resetoidaksesi palomuurisi, suorita komento:

$ /sbin/iptables -F INPUT


Se poistaa kaikki säännöt tulevalle liikenteelle (INPUT).

Jos haluat lisätä säännön ensimmäisen ja toisen säännön väliin, voit tehdä sen komennolla:

$ /sbin/iptables -I INPUT 2 ...


Poistaaksesi säännön numero 3, kirjoita komento:

$ /sbin/iptables -D INPUT 3


Estääksesi tietyn IP-osoitteen täydellisesti:

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


Yritä skannata palvelintasi ja sinun pitäisi nähdä vain portit 22 ja 80 avoinna. Jos skannaus on hidasta, johtuu se DROP-säännöstä.

Tärkeät osoitteet

Jos haluat estää ICMP-protokollan (Ping-pyynnöt), tulee sinun sallia ainakin ping.ovh.net, proxy.p19.ovh.net, proxy.rbx.ovh.net, proxy.ovh.net ja proxy.rbx2.ovh.net. OVH tarkastaa palvelimesi tilan näistä osoitteista.

Sinun pitää myös sallia seuraavat IP-osoitteet:

Jos palvelimesi IP-osoite on aaa.bbb.ccc.ddd, tulee sinun hyväksyä aaa.bbb.ccc.250 sekä aaa.bbb.ccc.251. Esimerkiksi 213.186.57.153:n tulee hyväksyä 213.186.57.250 (SLA-palvelin) ja 213.186.57.251 (MRTG-palvelin).

Jos sinulla on HG-palvelin, tulee sinun hyväksyä aaa.bbb.ccc.249.

Jos estät kaiken liikenteen, mukaanlukien OVH:n, emme pysty tarkastamaan palvelimesi tilaa. Mahdollisessa ongelmatapauksessa emme saa siitä tietoa. Salliaksesi ping-pyynnöt OVH:n palvelimilta, suorita seuraavat komennot:

/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 proxy.rbx2.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 xxx.xxx.xxx.250 -j ACCEPT # xxx.xxx.xxx = IP-osoitteen kolme ensimmäistä kenttää
/sbin/iptables -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.249 -j ACCEPT # vain HG-palvelimet


Jos haluat estää pääsyn palvelimellesi SSH:n kautta muualta kuin omalta palvelimeltasi, suosittelemme sinua hyväksymään liikenteen myös cache.ovh.net -osoitteelle. Jos palvelimellasi on ongelma, teknikkomme suorittavat sen kautta huoltotoimenpiteensä.

Salliaksesi SSH-yhteyden OVH:n palvelimelta, suorita komento:

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


Jos sinulla on RAID-filer, älä unohda sallia NFS-yhteyksiä. Voit sallia kaiken liikenteen sisäisestä verkosta 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


Jos sinulla on klusteri-konfiguraatio, sinun tarvitsee sallia portti 79, jotta OCO voi kommunikoida kuormantasaajan kanssa:

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



RPS-palvelin:

Monitoroimme eth0-käyttöliittymää. Jos estät kaikki ping-pyynnöt, emme pysty valvomaan palvelimesi tilaa. Salliaksesi ping-pyynnöt OVH:n palvelimilta, luo seuraavat säännöt:

/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 proxy.rbx2.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 tcp --dport 22 --source cache.ovh.net -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.251 -j ACCEPT # RTM-palvelin
/sbin/iptables -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.251 -j ACCEPT # SLA-palvelin


Sinun pitää myös hyväksyä käyttämäsi SAN. Nähdäksesi sen osoitteen, suorita komento:

r12xxx ~ # netstat -tanpu | grep iscsi
tcp 0 0 91.121.xx.xx:38632 91.121.191.16:3260 ESTABLISHED 3097/iscsid


Käyttämäsi SAN:n IP-osoite on siis 91.121.191.16. Salli liikenne komennolla:

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



Esimerkki valmiista skriptistä

Tässä on esimerkki täydellisestä skriptistä, jolla voit suojata palvelimesi Iptablesin avulla. Se sallii usean portin ja palvelun, mutta voit muokata sitä helposti omiin tarpeisiisi sopivaksi:

/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 xxx.xxx.xxx.xxx -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 xxx.xxx.xxx.xxx -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 proxy.rbx2.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 xxx.xxx.xxx.250 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.251 -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


Sinun tulee vaihtaa xxx.xxx.xxx.xxx tilalle koneesi IP-osoite, josta otat FTP:llä ja SSH:llä yhteyden palvelimellesi, sekä xxx.xxx.xxx tilalle palvelimesi IP-osoitteen kolme ensimmäistä kenttää.

Palomuurin automatisointi

Kun palvelimesi on konfiguroitu onnistuneesti, sinun pitää luoda skripti, joka suoritaan jokaisen käynnistyksen yhteydessä. Tässä on esimerkki, jonka voit kopioida esimerkiksi firewall-tiedostoon /etc/init.d -kansioon:
#!/bin/sh
# chkconfig: 3 21 91
# description: Firewall

IPT=/sbin/iptables

case "$1" in
start)
$IPT -F INPUT
$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.rbx2.ovh.net -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.251 -j ACCEPT
$IPT -A INPUT -i eth0 -p icmp --source xxx.xxx.xxx.250 -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
;;
esac


Anna tiedostolle 700-oikeudet ja kirjoita komento /etc/init.d/firewall start käynnistääksesi sen, ja etc/init.d/firewall stop pysäyttääksesi sen. Käynnistääksesi sen automaattisesti käynnistyksen yhteydessä:

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


HUOMIO! Ennen skriptin suorittamista jokaisen käynnistyksen yhteydessä sinun tulee olla täysin varma, että sen asetukset ovat oikein!