Firewall

Úvod

Linuxové jadro obsahuje podsystém Netfilter, ktorý sa používa na riadenie prevádzky smerujúcej do servera alebo prechádzajúcej cez server. Všetky moderné Linuxové firewally používajú tento systém na filtrovanie paketov.

Systém filtrovania paketov kernelom je pre administrátorov ťažko použiteľný bez používateľského rozhrania, ktoré ho spravuje. Toto je úlohou iptables (ip tabuliek). Keď sa paket dostane na náš server, je odovzdaný do podsystému Netfilter aby ho prijal, spracoval alebo odmietol na základe pravidiel, ktoré mu zadáme pomocou iptables. Tieto ip tabuľky sú všetko, čo potrebujeme pre riadenie firewallu. Kvôli uľahčeniu práce však vznikli aj ďalšie rozhrania.

ufw - nekomplikovaný Firewall

Predvolený konfiguračný nástroj na konfiguráciu firewallu v systéme Ubuntu je ufw. Bol vyvinutý na jednoduché nastavenie iptables firewallu. Nástroj ufw poskytuje používateľsky prívetivý spôsob, ako vytvoriť firevall založený na staniciach typu IPv4 alebo IPv6.

Nástroj ufw je v základnom stave vypnutý. Na man stránkach ufw sa píše:

ufw nie je určený na poskytnutie úplnej funkcionality firewallu cez príkazový riadok, slúži na jednoduché pridávanie a odstraňovanie jednoduchých pravidiel. Je zameraný najmä na firewall na báze staníc.

V ďalšej časti ukážeme niekoľko príkladov použitia ufw:

  • Najskôr je potrebné zapnúť ufw. Do príkazového riadka zadáme:

    sudo ufw enable
    
  • Otvorenie portu (v našom prípade port ssh):

    sudo ufw allow 22
    
  • Pravidlá sa dajú pridávať pomocou číslovaného formátu:

    sudo ufw insert 1 allow 80
    
  • Podobne zatvoríme otvorený port:

    sudo ufw deny 22
    
  • Ak chceme pravidlo odstrániť, zadáme delete a za ním pravidlo:

    sudo ufw delete deny 22
    
  • Je tiež možné povoliť prístup z konkrétnych staníc alebo siete k portu. V nasledujúcom príklade povolíme ssh prístup zo stanice 192.168.0.2 na ktorúkoľvek adresu na tejto stanici:

    sudo ufw allow proto tcp from 192.168.0.2 to any port 22
    

    Ak nahradíme adresu 192.168.0.2 adresou 192.168.0.0/24, povolíme ssh prístup z celej podsiete.

  • Pridaním prepínača --dry-run k príkazu ufw budú vytvorené pravidlá, ale neaplikujú sa. V nasledujúcom príklade môžeme vidieť čo sa stane, ak otvoríme HTTP port:

    sudo ufw --dry-run allow http
    
    *filter
    :ufw-user-input - [0:0]
    :ufw-user-output - [0:0]
    :ufw-user-forward - [0:0]
    :ufw-user-limit - [0:0]
    :ufw-user-limit-accept - [0:0]
    ### RULES ###

    ### tuple ### allow tcp 80 0.0.0.0/0 any 0.0.0.0/0
    -A ufw-user-input -p tcp --dport 80 -j ACCEPT

    ### END RULES ###
    -A ufw-user-input -j RETURN
    -A ufw-user-output -j RETURN
    -A ufw-user-forward -j RETURN
    -A ufw-user-limit -m limit --limit 3/minute -j LOG --log-prefix "[UFW LIMIT]: "
    -A ufw-user-limit -j REJECT
    -A ufw-user-limit-accept -j ACCEPT
    COMMIT
    Rules updated
  • ufw môžeme vypnúť zadaním:

    sudo ufw disable
    
  • Ak chceme vidieť stav firewallu, zadáme:

    sudo ufw status
    
  • Podrobnejšie informácie zobrazíme takto:

    sudo ufw status verbose
    
  • Na zobrazenie v číslovanom formáte použijeme:

    sudo ufw status numbered
    
[Note]

Ak je port, ktorý chcete otvoriť alebo zatvoriť, definovaný v súbore /etc/services, môžete miesto čísla portu použiť jeho názov. V predchádzajúcich príkladoch môžete 22 nahradiť ssh.

Toto bol krátky úvod o používaní nástroja ufw. Viac informácií sa dozviete na man stránkach ufw.

Integrácia aplikácií s ufw

Aplikácie, ktoré otvárajú porty, môžu zahrnúť do ufw profilu, detaily o portoch, ktoré potrebujú ku svojej správnej činnosti. Profily sa uchovávajú v priečinku /etc/ufw/applications.d, v ktorom ich môžeme upravovať ak chceme zmeniť predvolené nastavenie portov.

  • Ak chceme vidieť, ktoré aplikácie majú nainštalovaný profil, zadáme nasledujúci príkaz:

    sudo ufw app list
    
  • Rovnako, ako sme povoľovali port, môžeme povoliť aj profil aplikácie:

    sudo ufw allow Samba
    
  • Rovnako je možné použiť rozšírenú syntax:

    sudo ufw allow from 192.168.0.0/24 to any app Samba
    

    Aplikáciu Samba a adresu 192.168.0.0/24 môžeme nahradiť za profil inej aplikácie a rozsah IP adries našej siete.

    [Note]

    Nie je potrebné pre aplikáciu dodatočne určovať  protokol, pretože tieto informácie sú uložené v profile. Všimnite si, že slovom app môžeme nahradiť port.

  •  Ak chceme zobraziť, ktoré porty, protokoly, atď sú definované pre aplikáciu, zadáme:

    sudo ufw app info Samba
    

Nie všetky aplikácie, pre ktoré je potrebné otvoriť sieťové porty, sa dodávajú s ufw profilom, ale ak si sami vytvoríme profil a chceme aby bol začlenený do inštalačného balíka, môžeme poslať súbor spolu s hlásením chyby k balíku do systému Launchpad.

Zamaskovanie IP adries

Cieľom zamaskovania IP (masquerade) adries je umožnenie pridelenia súkromnej nedosiahnuteľnej IP adresy v našej sieti, z ktorej sa budeme môcť  dostať na Internet prostredníctvom zariadenia, ktoré robí maskovanie. Komunikácia z našej privátnej siete smerujúca do siete Internet musí byť pozmenená tak, aby odpovede dorazili na zariadenie, ktoré si ich vyžiadalo. Aby sa tak stalo, kernel musí upraviť zdrojovú IP adresu každého paketu tak, aby odpoveď dorazila na počítač robiaci maskovanie a nie priamo na súkromnú IP adresu, na ktorú sa nie je možné dostať priamo z Internet. Linux používa Sledovanie spojenia - Connection Tracking (conntrack) aby odsledoval, ktoré spojenie smeruje do ktorého stroja a mohol správne presmerovať vracajúce sa pakety. Komunikácia opúšťa privátnu sieť ako "zamaskovaná" tak, ako keby pochádzala priamo z nášho Ubuntu servera tvoriaceho bránu (gateway). Tento proces je v dokumentácii od firmy Microsoft popísaný ako Zdieľanie internetového pripojenia.

Maskovanie pomocou ufw

Maskovanie IP adries sa dá vytvoriť pomocou vlastných pravidiel ufw. Je to možné vďaka aktuálnemu koncovému rozhraniu ufw s názvom iptables-restore s pravidlami uloženými v súboroch /etc/ufw/*.rules. Tieto súbory sú skvelým miestom, kde sa dajú pridávať pravidlá pre iptables bez ufw a pravidlá, ktoré sú zamerané pre sieťovú bránu alebo premostenia.

Pravidlá sú rozdelené do dvoch rozdielnych súborov. Pravidlá, ktoré by mali byť spustené pred príkazmi ufw zadanými z príkazového riadka a pravidlá, ktoré by mali byť spustené za príkazmi ufw zadanými z príkazového riadka.

  • Najskôr je potrebné zapnúť smerovanie paketov v ufw. Je potrebné upraviť dva konfiguračné súbory. V súbore /etc/default/ufw zmeníme DEFAULT_FORWARD_POLICY na “ACCEPT”:

    DEFAULT_FORWARD_POLICY="ACCEPT"
    

    Potom otvoríme súbor /etc/ufw/sysctl.conf a odkomentujeme:

    net.ipv4.ip_forward=1
    

    Podobne pre IPv6 smerovanie odkomentujeme:

    net.ipv6.conf.default.forwarding=1
    
  • Teraz pridáme pravidlá do súboru /etc/ufw/before.rules. Predvolené pravidlá konfigurujú iba tabuľku filter a ak chceme zapnúť maskovanie, je potrebné nakonfigurovať tabuľku nat. Nasledujúce riadky pridáme na začiatok súboru za komentár hlavičky:

    # pravidlá nat tabuľky
    *nat
    :POSTROUTING ACCEPT [0:0]

    # Presmerovanie komunikácie z eth1 na eth0.
    -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

    # nemažte riadok 'COMMIT' inak sa pravidlá tejto tabuľky nevykonajú
    COMMIT

    Komentáre nie sú povinné, ale je dobrým zvykom okomentovať našu konfiguráciu. Ak upravujeme akékoľvek pravidlá v súboroch v priečinku /etc/ufw je potrebné sa uistiť, či na konci týchto riadkov každej tabuľky sa nachádzajú tieto riadky:

    # don't delete the 'COMMIT' line or these rules won't be processed
    COMMIT

     V každej Tabuľke je potrebný príkaz COMMIT. V tomto článku boli zobrazené len tabuľky nat a filter, ale pravidlá je možné pridať aj do tabuliek raw a mangle.

    [Note]

    V uvedenom príklade nahraďte eth0, eth1 a 192.168.0.0/24 sieťovými rozhraniami a rozsahom IP adries, ktoré používate vo vašej sieti.

  • Nakoniec vypneme a znovu zapneme ufw aby sa prejavili zmeny:

    sudo ufw disable && sudo ufw enable
    

Maskovanie IP adries by teraz malo byť zapnuté. Môžeme pridať ešte niekoľko dodatočných FORWARD pravidiel do súboru /etc/ufw/before.rules. Dodatočné pravidlá je odporúčané pridávať do zreťazenia ufw-before-forward.

Maskovanie pomocou iptables

Na maskovanie IP adries je možné použiť aj iptables.

  • Podobne ako pri ufw, najskôr musíme povoliť smerovanie paketov IPv4 úpravou súboru /etc/sysctl.conf odkomentovaním nasledujúceho riadka

    net.ipv4.ip_forward=1
    

    Ak by sme chelí zapnúť aj IPv6 smerovanie odkomentujeme aj riadok:

    net.ipv6.conf.default.forwarding=1
    
  • Potom spustíme príkaz sysctl, ktorý zapne nové nastavenia v konfigurácii:

    sudo sysctl -p
    
  • IP maskovanie teraz môžeme nastaviť pomocou jedného pravidla iptables, ktoré je potrebné prispôsobiť konfigurácii našej siete:

    sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
    

    Uvedený príkaz považuje za privátne adresy tie, ktoré sú z rozsahu 192.168.0.0/16 a za zariadenie, ktorým sa pripájame na internet považuje ppp0. Význam ďalších častí príkazu je takýto:

    • -t nat -- pravidlo patrí do tabuľky nat

    • -A POSTROUTING -- pravidlo sa pridá (-A) do zreťazenia POSTROUTING

    • -s 192.168.0.0/16 -- pravidlo platí pre komunikáciu pochádzajúcu zo zadaného rozsahu adries

    • -o ppp0 -- pravidlo sa aplikuje iba na komunikáciu, ktorá je nasmerovaná von cez zadané sieťové zariadenie

    • -j MASQUERADE -- komunikácia spĺňajúca toto pravidlo "preskočí" (-j) na cieľ MASQUERADE, ktorý s ňou bude zaobchádzať vyššie uvedeným spôsobom

  • Každé zreťazenie v tabuľke filter (predvolená tabuľka, v ktorej je definovaná väčšina pravidiel filtrujúcich pakety) má v základnom stave nastavenú policy (politiku) na ACCEPT (prijať), ale ak chceme vytvoriť firewall s prídavnou funkciou brány, mali by sme politiky nastaviť na DROP (zahodiť) alebo REJECT (odmietnuť), ktorá spôsobí, že maskovaná komunikácia bude musieť prejsť cez zreťazenie FORWARD, v ktorom zadefinujeme pravidlá pre filtrovanie:

    sudo iptables -A FORWARD -s 192.168.0.0/16 -o ppp0 -j ACCEPT
    sudo iptables -A FORWARD -d 192.168.0.0/16 -m state --state ESTABLISHED,RELATED -i ppp0 -j ACCEPT

    Predchádzajúce príkazy povolia pripojenie prichádzajúce z vnútornej siete do siete Internet a komunikáciu, ktorá súvisí s týmito pripojeniami, presmeruje na počítače, ktoré spojenia nadviazali.

  • Ak chceme, aby bolo maskovanie aktívne aj po reštarte, otvoríme súbor /etc/rc.local a pridáme príkazy, ktoré sme použili vyššie. Napríklad prvý príkaz bez filtrovania:

    iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
    

Záznamy

Záznamy Firewallu slúžia na rozpoznanie útokov, riešenie problémov s pravidlami a upozorňovanie na nezvyčajné aktivity v sieti. Aby bol záznam vygenerovaný, je potrebné ho začleniť do pravidla, pretože pravidlá pre zaznamenávanie musia byť známe pred aplikovaním koncového pravidla (pravidlo, ktoré rozhodne o osude paketu ako ACCEPT (prijať), DROP (zahodiť) alebo REJECT (odmietnuť)).

Ak používame ufw, môžeme zaznamenávanie zapnúť zadaním nasledujúceho príkazu:

sudo ufw logging on

Ak chceme zaznamenávanie vypnúť ufw, jednoducho v príkaze slovo on nahradíme za off.

Ak používame iptables miesto ufw, zadáme:

sudo iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN: "

Požiadavky smerujúce na port 80 z lokálny staníc budú zaznamenané do dmesg a budú vyzerať takto:

[4304885.870000] NEW_HTTP_CONN: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=58288 DF PROTO=TCP SPT=53981 DPT=80 WINDOW=32767 RES=0x00 SYN URGP=0

Predchádzajúci záznam sa objaví v súboroch /var/log/messages, /var/log/syslog a /var/log/kern.log. Toto chovanie sa dá zmeniť v súbore /etc/syslog.conf alebo nainštalovaním a nastavením nástroja ulogd a použitím slova ULOG miesto slova LOG v pravidle. Démon ulogd načúva, logovacím inštrukciám z jadra špeciálne pre firewall a môže ich zaznamenať buď do súboru, aký mu zadáme alebo do databázy PostgreSQL či MySQL. Analýzu záznamov firewallu si môžeme zjednodušiť analyzačnými nástrojmi fwanalog, fwlogwatch alebo lire.

Ostatné nástroje

Existuje mnoho nástrojov, ktoré uľahčujú vytvorenie kompletného firewallu bez toho, aby sme poznali iptables. Pre klientov s grafickým rozhraním sú to:

  • Firestarter je veľmi populárny a ľahko sa používa.

  • fwbuilder je veľmi mocný a priateľsky vyzerajúci program pre administrátorov, ktorí sú zvyknutí používať komerčné nástroje, ako napríklad Checkpoint FireWall-1.

Ak uprednostňujeme nástroje, ktoré sa zadávajú v príkazovom riadku s textovými konfiguračnými súbormi, môžeme použiť:

  • Shorewall je veľmi možný riešenie, ktoré umožňuje nakonfigurovať firewall pre akúkoľvek sieť.

  • ipkungfu nám poskytne funkčný firewall bez nutnosti akejkoľvek konfigurácie a umožní nám jednoducho nastaviť pokročilejší fierewall, pomocou veľmi dobre zdokumentovaných konfiguračných súborov.

  • fireflier je navrhnutý tak, aby bol desktopovou aplikáciou. Skladá sa zo serverovej aplikácie (fireflier-server) a grafického klienta, akého si zvolíte (GTK alebo QT) a chová sa ako väčšina interaktívnych firewall aplikácií pre Windows.

Zdroje

  • Wiki stránka Ubuntu Firewall obsahuje informácie o vývoji ufw.

  • Manuálové stránky ufw tiež obsahujú veľmi užitočné informácie: man ufw.

  • Na stránke packet-filtering-HOWTO sa nachádza viac informácií o použití iptables.

  • Stránka nat-HOWTO obsahuje detaily o maskovaní.

  • Výborným zdrojom je aj IPTables HowTo na Ubuntu wiki.