Hlavní menu:

Kontakt

Telefony:

Objednávky: +420 267 314 267
Technická podpora:
+420 267 314 267

Reklamace, servis:
+420 272 732 827
Zakázkový vývoj: +420 272 732 827

Fax:

+420 267 314 269

Objednávky: obchod@papouch.com
Dotazy: papouch@papouch.com

V našem e-shopu můžete platit také kartami MasterCard®, Maestro®, VISA® a VISA Electron®.

Jak na to? > Linux > Firewall - díl 1. >

Firewall - díl 1.



 

tucnak_button.gif
Setkali jste se již s výrazem firewall? Také se váš správce informačního systému zachmuří, když se o něm zmíníte? Není divu, pojem firewall je jakousi nedílnou "latinou" současných informačních systémů. Ale pojďme hezky popořádku.

 

Výraz "firewall" znamená v překladu "protipožární zeď", nicméně v češtině se neujal a používáme tedy původní anglický výraz. V zásadě se jedná o samostatné zařízení, které odděluje vaši vnitřní síť (v tomto článku mám na mysli datové sítě) od sítě vnější. Tou vnější sítí může být například Internet. Pod pojmem "vnitřní síť" si můžete představit např. vaši vlastní LAN. Ptáte se proč jsou tyto dvě sítě oddělené? Tedy, hlavně proto, abychom nejrůznějším nenechavcům (teď mám na mysli nenechavce z vnější sítě) zabránili v tom, aby se "procházeli" (bez našeho vědomí a svolení) po síti vnitřní. A na druhou stranu, můžeme tak uživatelům vnitřní sítě vytvořit nejrůznější omezení proto, aby nevyváděli "skopičiny" v síti vnější.

V tomto článku se podíváme, jak si postavit takový "malý" firewall pod Linuxem. Nebude to nic velkého. V podstatě si jen vytvoříme paketový filtr (stavové firewally, aplikační proxy a analyzátory paketů zde probírat nebudeme). Je vcelku jedno, jakou distribuci používáte, ale nejspíš se nevyhnete překladu kernelu. Pokud jste tedy ještě "nevyladili" překladač (gcc a věci související), máte nejvyšší čas. Náš "firewall" bude tvořen jedním jediným skriptem, který určí, jak se náš kernel bude chovat k odchozím a příchozím paketům. Pakety můžeme různě zahazovat, zapisovat do logu, přijmout, předat a podobně.

Firewall budeme tvořit na našem domácím počítači, jehož topologie je tato:

A nyní se podívejme na pár užitečných zásad, kterých bychom se měli držet.

Předem si dovolím varovat. Skript jsem uzpůsobil právě této topologii (tedy připojení k Internetu pomocí modemu). Majitelé pevných linek budou muset skriptík poněkud upravit (ale to zvládnete, nebojte se). Na konci článku naleznete odkaz na literaturu a v této knize je podrobný návod.

Tak a co budeme potřebovat?

  1. IP adresní plán
  2. Topologii připojení (to už jsme si řekli, viz obrázek výše)
  3. Jaký firewall budeme stavět (paketový filtr)
  4. Nastavit parametry pro tcp_wrapper
  5. Nastavit parametry pro ssh (pokud budete potřebovat vzdálený přístup)
  6. Odinstalovat všechny nepotřebné služby
  7. Přeložit znovu kernel
  8. Vlastní skriptík pro ipchains si ukážeme příště

 

1. IP adresní plán
Napřed se na Internetu podíváme po jednom dokumentu, který popisuje doporučené IP rozsahy pro privátní sítě. Konkrétně hledáme RFC 1918, jehož hlavička vypadá takto: (www.nexor.com)


1918
"Address Allocation for Private Internets."
Y. Rekhter, B. Moskowitz, D. Karrenberg, G. J. de Groot & E. Lear
(Format: TXT=22270 bytes) (Obsoletes RFC 1627, RFC 1597) (Also BCP0005) (Status: BEST CURRENT PRACTICE)

3. Private Address Space

The Internet Assigned Numbers Authority (IANA) has reserved the
following three blocks of the IP address space for private internets:

10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)


Jinými slovy, jedná se o adresní rozsahy, které jsou určeny výhradně pro privátní sítě (o přidělení adres z těchto rozsahů tedy nemusíte žádat), které by se neměly vyskytovat v Internetu. Vtip je v tom, že tedy pakety s těmito adresami by žádný ISP (Internet Service Provider) neměl "předávat" dále. Pokud vaše interní síť používá rozsahy IP adres podle RFC 1918, pak se k Internetu jednoduše musíte připojit skrze určité zařízení (např. firewall) nebo rozhraní (např. modem). Firewall má hned několik možností, jak "oddělit" vaši interní síť od sítě vnější (v našem případě tedy Internet). Můžete použít např. NAT (Network Address Translation) nebo masquerading, což je vlastně "překlad" IP adres 1:N (všechna spojení z vnitřní sítě budou mít pro vnější síť adresu konkrétního rozhraní na firewallu).

Co se modemu týče - tam je princip poněkud jednodušší. Jedná se totiž o spojení typu ppp (Point to Point Protocol), které využívá samostatné rozhraní pro modem (v Linuxu např. ppp0). Toto rozhraní pak (po navázání spojení s druhou stranou, tedy s ISP) dostane přidělenu jak adresu pro "vaše" rozhraní ppp0, tak pro rozhraní na "vzdálené straně". Nezapomeňte však rozhraní ppp0 zahrnout do pravidel pro firewall (v daném případě určitě do pravidel pro paketový filtr).

Takže, IP adresy pro naši interní síť zvolíme podle RFC 1918 (příklad 10.x.x.x).

2. Topologie připojení

O tom jsem již mluvil výše. Tak tedy, jedná se o samostatné PC připojené modemem (doporučuji externí) k Internetu.

Pokud jste majiteli pevné linky, mám pro vás jeden zajímavý odkaz:
http://www.linuxsecurity.com/docs/
kde obzvláště doporučuji dokument nazvaný Securing and Optimizing Linux: Red Hat Edition.
Pokud se chystáte postavit si paketový filtr pro váš linuxový stroj, pak právě zde máte hezký návod. Kapitola se jmenuje "Networking Firewall with Masquerading and forwarding support". Mějte však na paměti, že skript s pravidly pro paketový filtr je navržen pro stroj s pevným připojením k Internetu. Já vím, že se opakuji, ale je to dost podstatné, věřte mi.

3. Druhy (stupně) firewallů

Ten nadpis by skutečně měl asi znít spíše "stupně" firewallů. Tedy, pokud si náš firewall představíme jako pagodu, pak by stupně měly vypadat asi takto:

  1. Paketový filtr
  2. Aplikační proxy
  3. Stavový firewall
  4. Analyzátor paketů

 

Potíž je ovšem v tom, že naše pagoda nutně nemusí mít všechny stupně. Paketový filtr budeme zřejmě potřebovat vždy, ale o ostatních stupních to říci nelze. Můžeme mít tedy pouze paketový filtr (a říkat mu firewall), můžeme mít též kombinaci 1-2-4, 1-3-4, 1-2, 1-4 apod. Vše záleží na tom, co od našeho firewallu požadujeme.

Pro náš budoucí paketový filtr tedy potřebujeme vědět, že balíčky, s jejichž pomocí lze nastavit pravidla pro paketový filtr se názvově liší a to podle kernelu (jádra), který na vašem linuxu používáte. Jejich "zařazení" vypadá takto:
Kernel 2.0.x 2.2.x 2.4.x
Název balíčku ipfwadm ipchains iptables
Kernely řady 2.4.x navíc umožňují používat skripty pro ipchains nebo ipfwadm, nicméně podporu pro tuto "konverzi" musíte před překladem zahrnout do jádra.

Poznámka:
Stavový firewall (netfilter) má u kernelů řady 2.4.x podporu přímo v kernelu. Pokud se tedy rozhodnete jej používat, musíte zvolit podporu pro iptables a "vzdát" se tak podpory pro ipchains nebo ipfwadm. Na druhou stranu se můžete vzdát podpory pro iptables a zvolit podporu jak pro ipchains tak pro ipfwadm (např. obojí přeložíte jako modul kernelu – viz. např. kernel 2.4.4).
Odkazy na Netfilter naleznete zde:
http://securityportal.com/cover/coverstory20010122.html#2
nebo na
http://netfilter.kernelnotes.org/

Ovšem dříve než se podíváme na vlastní paketový filtr, řekneme si něco o jedné velmi užitečné službě a tou je:
4. tcp_wrapper
Tato služba umožňuje monitorování a filtrování veškerých příchozích "volání" pro následující služby:
SYSTAT, FINGER, FTP, TELNET, RLOGIN, RSH, EXEC, TFTP, TALK

Vlastně si nainstalujete "tiny daemon wrapper programs", přičemž nastavení výše uvedených služeb měnit nemusíte. Vlastní "wrappers" zkontrolují "volajícího" podle určitého seznamu. Pokud "volající" (tedy, myšlen počítač, žádající o tuto službu) je na seznamu, služba je povolena. V opačném případě, nikoliv. Seznam povolených "volajících" je uveden v souboru /etc/hosts.allow , seznam "těch nehodných" pak v souboru /etc/hosts.deny. Určitě nebude na škodu přečíst si uživatelskou příručku, obsaženou v patřičném souboru readme, co říkáte? Dále ještě doporučuji man hosts.allow a man hosts.deny, určitě na tom neproděláte. A, málem bych zapomněl - ještě man tcpd.
Náš milý tcp_wrapper nyní "hlídá" služby spouštěné pomocí tzv. superserveru inetd (novější verze se jmenuje xinetd).

Poznámka:
Pokud nejste v Linuxu zběhlí, pak vězte, že příkaz man !COMPILER-ERROR-TAG-NOT-FOUND-název!, zobrazí "manuálové stránky" tohoto příkazu. Inu, na to je lépe si zvyknout:-)

5. Služba SSH
Jistě jste si všimli, že na výše uvedeném seznamu není uvedena např. služba ssh. Ano, tady pozor. Samozřejmě to vždy záleží na tom, zda byly “binárky” přeloženy s podporou pro tcp wrapper, či nikoliv (nic nového pod sluncem). Asi nejjednodušší bude metoda pokus/omyl. Proveďte zápis patřičných adres do hosts.deny a podívejte se, zda milé ssh bude “reagovat”. Pokud ano, byly jeho binárky přeloženy s podporou tcp wrapperu.
Služba ssh používá (tedy na volané straně) vlastního démona, ten se jmenuje sshd. Podíváte-li se do souboru /etc/services, najdete zde tento záznam:

ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol

Dozvíme se, že ssh standardně používá port 22. Umí použít jak protokol tcp, tak udp. Pokud zadáte man ssh, dozvíte se mimo jiné i toto:

Příkaz ssh (secure shell, bezpečný shell) slouží pro přihlašování na vzdálené počítače a pro spouštění příkazů na vzdálených počítačích. Je navržen jako náhrada příkazů rlogin a rsh a umožňuje bezpečnou zašifrovanou komunikaci mezi dvěma nedůvěryhodnými počítači přes nezabezpečenou síť. Umožňuje také forwardování X11 spojení nebo libovolných TCP/IP portů bezpečným kanálem.

Tedy, ssh představuje jakousi novější "náhražku" za telnet (umí toho samozřejmě daleko více). Spojení pomocí ssh je šifrované, dochází k určité výměně klíčů mezi volaným a volajícím atd. Pokud se tedy chcete spojit s cílovým počítačem pomocí ssh, pak na tomto "cílovém" stroji (pro přehlednost jsem jej označil jako volaného) musí běžet démon sshd. Dále samozřejmě musíte mít platné uživatelské konto, znát heslo a mít povolené spojení s tímto strojem (například vás nesmí odmítnout paketový filtr).

Ptáte se, proč jsem zařadil ssh do kapitoly o firewallech? Právě proto, aby jste věděli, jak se s tímto firewallem máte spojovat na dálku (po síti). Samozřejmě, pokud máte doma jen jeden počítač (u kterého právě sedíte), pak není důvod démona sshd vůbec spouštět. Říkáme tomu "další bod pro klidné spaní".

Mimochodem, jste si jisti, že používáte "bezpečnou" verzi ssh? Opravdu? Nechcete si to raději zkontrolovat v nějaké té konferenci, která se zabývá bezpečnostními otázkami? Zkuste se podívat na http://www.securityfocus.com/ do sekce bugtraq.

Pohled na toto místo také nebude od věci: http://www.linuxsecurity.com/advisories

Tak, to bychom měli tcp_wrapper, ssh a teď přijde jedna velmi užitečná rada, totiž:

6. Odinstalujte všechny nepotřebné služby
Ano, na to se velmi často zapomíná. Tedy, pokud si "nevoláte domů", neprovozujete na svém domácím stroji nějaký ten www server, sambu apod. pak tyto služby hezky odinstalujte. Mám konkrétně na mysli démona inted (novější verze se jmenuje xinetd), www server (např. apache), samba-server, sendmail (poštovní server) a další. Nikdo neříká, že jsou to služby špatné, kdepak. Prostě, odinstalujte všechny služby, které lze volat vzdáleně a které na vašem stroji nepotřebujete provozovat. Pokud už nějakou tu službu potřebujete a musíte ji mít v provozu, to je jiná. Pak ale jejím uživatelům zadejte dostatečně silné heslo, pravidelně sledujte konference (bezpečnostní otázky), provádějte pravidelně updates apod.

Překlad kernelu
Já osobně jsem použil distribuci RedHat (7.1 CZ), dále kernel 2.2.19 (můžete samozřejmě použít i kernel řady 2.4.x, pozor na podporu pro ipchains – nezapomeňte ji přidat do jádra) a pochopitelně - updates v podobě glibc, gcc (to jsou ty hlavní updates, jejich výčet najdete na adrese http://www.redhat.com/). Nenechte se zmást tím, že pro RH 7.1 tam zatím žádné nejsou, časem se určitě objeví:-)
Mimochodem, náš paketový filtr není závislý na distribuci, záleží jen na tom, zda váš kernel podporuje ipchains.
Pokud tedy chceme používat paketový filtr, budeme muset buď použít již předkompilovaný kernel (obvykle je v rpm balíčku), který má paketový fitr "povolen" nebo si kernel budeme muset přeložit sami.

Vlastní soubor s kernelem (v našem případě tedy kernel 2.2.19) se jmenuje linux-2.2.19.tar.gz. Naleznete jej například na ftp.kernel.org nebo na ftp.linux.cz.
Release notes ke kernelu 2.2.19 naleznete na stránce http://www.linux.org.uk/VERSION/relnotes.2219.html. Pozorně si je přečtěte. Jsou zde informace o doporučené verzi překladače gcc, binární kompatibilitě, seznamu podporovaných platforem a seznam opravených chyb.
Tak například pro 2.2.19 se dozvíte, že je již podporován na platformách: Alpha, M68K, PowerPC, S/390, Sparc, X86 (váš Intel a jemu podobní jsou označováni jako X86).
Mimochodem, já osobně jsem k překladu kernelu použil balíček kgcc. Pro jistotu.

Pokud se teď chcete zeptat, proč jsem použil kernel řady 2.2.x a ne již "horkou novinku", tedy řadu 2.4.x (já vím, Netfilter se přímo nabízí) pak vězte, že dávám přednost vyzkoušeným a odladěným věcem. S jádrem 2.4.4 (a podotýkám, že konfigurační parametry pro souborové systémy jsem převzal z konfiguračního souboru z 2.2.19) má např. StarOffice 5.2 (+patches, odkazy např. v archivu konference linux@linux.cz) malý problém se souborovým systémem vfat. Zkrátka, soubor načte, ale na vfat již neuloží. Pod 2.2.19 je vše OK.

Parametry pro překlad kernelu
Pěkně "vybalte" zdrojáky kernelu, přejděte do adresáře linux (právě jste jej vytvořili při vybalování zdrojáků) a pro vlastní překlad máte tři možnosti: make config nebo make menuconfig (obojí z konzole) nebo make xconfig (ale tohle půjde jen z X-Windows). Přiznávám, já rád make xconfig.

Nebudu se zde zabývat tím, jak překládat kernel (mimochodem, návod je v literatuře - 1). Pro vlastní paketový filtr tedy musíte povolit tyto parametry: (kernel 2.2.19)


#
# Networking options
#
CONFIG_PACKET=y
# CONFIG_NETLINK is not set
CONFIG_FIREWALL=y
CONFIG_FILTER=y
CONFIG_UNIX=y
CONFIG_INET=y
# CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not set
# CONFIG_IP_PNP is not set
CONFIG_IP_FIREWALL=y
# CONFIG_IP_TRANSPARENT_PROXY is not set
# CONFIG_IP_MASQUERADE is not set
# CONFIG_IP_ROUTER is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_ALIAS is not set
# CONFIG_SYN_COOKIES is not set


Maškarádu zatím používat nebudeme.

Někteří autoři (viz. 1) doporučují povolit i CONFIG_SYN_COOKIES , ale i bez těch se zatím obejdeme.

Nezapomeňte si konfigurační soubor uložit a čitelně (a jednoznačně) nazvat! Třeba "K6-20010606-2219". Není nad pěkný archiv.

Kernel hezky přeložíme, například takto:
make dep; make clean; make bzImage; make modules; make modules_install; make bzlilo.
Pokud všechny příkazy make napíšete na jednu řádku a oddělíte středníkem, pak je nemusíte zadávat postupně. Výsledný kernel se bude jmenovat vmlinuz a bude se nacházet (spolu se souborem System.map) ve vašem kořenovém adresáři. Hezky tedy oba soubory přesuňte (a nezapomeňte udělat i jejich zálohu!) do adresáře /boot, přejmenujte na vmlinuz-2.2-19 a System.map-2.2.19, upravte /etc/lilo.conf , spusťte /sbin/lilo a ..... Restartovat systém můžete například příkazem init 6. Pokud vše dobře dopadlo, naskočí Váš nový kernel.

Poznámka:
Pokud vám vyhovuje spíše dokumentace "online", podívejte se na http://www.root.cz/ a hledejte seriál zvaný Triky pro začátečníky. Díl 9 je úvodem ke kompilaci vlastního kernelu.

Runlevel
Doporučuji jako výchozí používat runlevel 3. Vlastní X si pak kdykoliv můžete spustit příkazem startx.

Shrnutí
Zatím bychom mohli výše uvedené věci shrnout takto:

  1. Pro naši interní síť budeme používat IP adresy podle RFC 1918.
  2. Samostatné PC, připojené modemem k Internetu, je zvláštním případem interní sítě. Bez obav přidělte jeho ethernetovému rozhraní (eth0) adresu podle RFC 1918.
  3. Odinstalujte služby, které lze volat "zvenčí" a které nepotřebujete.
  4. Používejte tcp_wrapper
  5. Pro své uživatele volte hesla dlouhá alespoň 6-8 znaků.
  6. Sledujte pravidelně tématicky zaměřené konference (jejich seznam najdete např. na www.linux.cz)

 

Odkazy (URL)

 

Použitá literatura:
Securing and Optimizing Linux: Red Hat Edition
(http://www.linuxsecurity.com/docs/)

Michal Vymazal
www.linuxservices.cz






Akce: Otevřít verzi pro tisk Otevřít verzi pro tisk


Soubory: