2. TCP wrapper a obmedzenie prístupu

Posledná zmena: 7/9/2021

2.1 Čo je to TCP wrapper

TCP wrapper je elegantný mechanizmus, ktorý umožňuje riadiť prístup k službám vášho servera na základe adresy, z ktorej prichádza požiadavka klienta. Pôvodne sa používal iba na riadenie prístupu pre služby, ktoré obsluhuje "inetd" (konfiguračný súbor "inetd.conf"), ale existuje viacero programov, ktoré majú zakompilovanú knižnicu "libwrap", čo je práve podpora TCP wrappera (napr. "stunnel", "openssh").

Princíp činnosti TCP wrappera je v tom, že sa namiesto pôvodnej služby z "inetd" spúšťa najprv program "/usr/sbin/tcpd" (samotný TCP wrapper), ktorý rozhoduje o tom, či má alebo nemá spustiť požadovanú službu. Vytvára tak akúsi vrstvu medzi "inetd" a spúšťanou službou. "Wrapper" znamená po anglicky "obal" a presne to aj robí: chráni samotnú službu pred nepovoleným prístupom a prípadne útoky si odnesie najprv on sám.

Ako prezrádza názov, TCP wrapper umožňuje kontrolovať prístup k tým službám, ktoré pracujú na báze protokolu TCP.

2.2 Prečo používať TCP wrapper

Prečo nie?

Na vašom serveri určite používate služby, ktoré by ste radi sprístupnili iba používateľom z vašej lokálnej siete, alebo z iných, vami definovaných adries. Ak napríklad používate na pripájanie sa na server obyčajný telnet a na serveri bezi "telnetd", vystavujete sa riziku, že sa niekomu podarí zistiť heslo niektorého používateľa (telnet nezabezpečuje šifrovanie) a potom sa pripojí z ľubovoľného miesta na tejto planéte a v širšom okolí. Ak sa tak stane cez víkend, čaká vás zrejme zábavný začiatok týždňa...

Ak už musíte použiť telnet, je veľmi rozumné obmedziť jeho použiteľnosť iba z vašej lokálnej siete. Napriek tomu vám však veľmi odporúčam používať ssh ("Secure Shell", šifrované pripojenie). S inštaláciou a konfiguráciou SSH nie sú nejaké významné problémy a na pripájanie sa na server z Windows existuje viacero pekných programov. Napríklad "putty", ktorý je zadarmo a je naozaj veľmi dobrý.

2.3 Ako sa používa TCP wrapper

Ak chcete použiť TCP wrapper na kontrolu prístupu k službám "inetd", musíte najprv upraviť "/etc/inetd.conf". Tu si ukážeme úpravu pre jednu konkrétnu službu (ftp), ale samozrejme postup sa da zovšeobecniť pre ľubovoľnú službu (riadok v "/etc/inetd.conf"), ktorá pracuje na báze protokolu TCP.

Príklad: služba ftp bez TCP wrappera:

ftp    stream   tcp   nowait   root   /usr/sbin/in.ftpd

Príklad: služba ftp s TCP wrapperom:

ftp    stream   tcp   nowait   root   /usr/sbin/tcpd   /usr/sbin/in.ftpd

Ako ste si iste všimli, namiesto cesty k démonovi, ktorý ma obslúžiť požiadavku, sa spustí samotný wrapper ("/usr/sbin/tcpd"), ktorého argumentom je pôvodný démon ("/usr/sbin/in.ftpd"). TCP wrapper skontroluje adresu klienta, z ktorej prichádza požiadavka a v prípade, že mu to vami zvolená konfigurácia umožňuje, povolí prístup, t.j. spustí sa pôvodný obslužný démon.

Ako som už spomínal minule, aby sa uplatnili zmeny v "/etc/inetd.conf", treba reštartovať "inetd" alebo aspoň reloadovať jeho konfiguráciu ("/etc/init.d/inetd reload").

2.4 Ako riadiť prístup

TCP wrapper máte nainštalovaný, "/etc/inetd.conf" zmenený, ale čo ďalej?

Pre prácu TCP wrappera su dôležité dva textové súbory: "/etc/hosts.allow" a "/etc/hosts.deny". Tieto súbory určujú, ktoré služby z ktorých adries budú povolené resp. zakázané. Poradie spracovania súborov je takéto:

  1. ak požiadavka určena dvojicou "démon - adresa klienta" vyhovie niektorému pravidlu v súbore "/etc/hosts.allow", prístup sa umožní
  2. ak požiadavka určená dvojicou "démon - adresa klienta" vyhovie niektorému pravidlu v súbore "/etc/hosts.deny", prístup sa zakáže.
  3. inak sa prístup umožní

Ak súbor neexistuje, považuje sa za prázdny a teda vymazaním konfiguračných súborov automaticky vypnete činnost TCP wrappera a akceptovať sa budú všetky požiadavky.

Pravidlá v súboroch "hosts.allow" a "hosts.deny" sa zapisujú v samostatných riadkoch a vyzerajú asi takto:

DEMON1: adresa.klienta1
DEMON2: adresa.klienta1
DEMON3: adresa.klienta1, adresa.klienta2, adresa.klienta3

kde "DEMON" určuje meno démona, ktorého obmedzenia definujete. V prípade, že používate "inetd", meno démona je meno spúšťaného programu bez určenia cesty, čiže pre "/usr/sbin/in.ftpd" je to iba "in.ftpd". Adresa vyjadruje adresu, z ktorej prichádza požiadavka. Ak treba, môžete zadať viacero adries, ktoré sa oddeľujú medzerou a/alebo čiarkou.

Konkrétny príklad:

in.ftpd: testovaci.example.com, iny.example.com

definuje pravidlo pre démona "in.ftpd" a adresu požiadavky z "testovaci.example.com" alebo "iny.example.com".

Poznámka: používajte radšej IP adresy! Server nemusí robiť preklady na IP adresy a v prípade, ze DNS nefunguje, sú IP adresy na nezaplatenie...

Zatiaľ nie je jasné, či pravidlo hovorí o odmietnutí alebo akceptovaní požiadavky. O tom však hovorí práve súbor, v ktorom sa pravidlo nachádza. "hosts.allow" obsahuje pravidlá, ktoré umožnia akceptovať požiadavky na služby. "hosts.deny" naopak obsahuje pravidlá, ktoré hovoria, ktoré požiadavky sa majú zamietnuť.

Teda ak naše pravidlo doplníme do "/etc/hosts.deny":

in.ftpd: testovaci.example.com, iny.example.com

znamená to, ze požiadavka na prihlásenie sa na službu ftp, ktorú obsluhuje démon "in.ftpd" a ktorá prichádza z adries "testovaci.example.com" alebo "iny.example.com" bude odmietnutá.

Ak však takéto pravidlo doplníme do "/etc/hosts.allow", požiadavka na prihlásenie sa na ftp z daných adries bude akceptovaná.

Pozor: aby sa prejavili zmeny v nastavení TCP wrappera, treba (ako ste si už zvykli) reštartovať "inetd" alebo reloadovať jeho konfiguráciu.

2.4.1 Špeciálne výrazy v konfiguračných súboroch

Text za znakom "#" sa ignoruje (komentár).

Príklad: pravidlo pre akúkoľvek službu, ak požiadavka prichádza z IP adresy začínajúcej "192.168.1"; pravidlo pre "ipop3d" (pop3 server) pre požiadavky prichádzajúce z lokálnej siete a z IP adresy 192.168.10.10

ALL: 192.168.1.
ipop3d: LOCAL 192.168.1. 192.168.10.10

2.4.2 Kombinácia hosts.allow / hosts.deny

Existujú dva spôsoby, ako kombinovať oba súbory na riadenie prístupu:

2.4.2.1 Otvorený systém

Dôverujeme takmer všetkym, ostatným zakážeme explicitne prístup.

V "hosts.allow" je všetko povolené pomocou pravidla:

ALL: ALL

(Podľa manuálu môže v tomto prípade "hosts.allow" pokojne chýbat alebo byť prázdny.)

V "hosts.deny" sa zakazujú konkrétne služby pre konkrétne adresy napr.:

ALL: .example.com
in.ftpd: server.example.com .example.com
ipop3d: server.example.com 192.168.10.

Pozor !!! Čo nie je zakázané, to je povolené !!!

2.4.2.2 Uzatvorený systém

Nedôverujeme takmer nikomu, ak niekomu dôverujeme, explicitne mu povolíme prístup. Toto riešenie odporúčam pre ochranu vašich serverov a myslím, že na Debiane je štandardom.

V "hosts.deny" sa zakazuje všetko:

ALL: ALL

V "hosts.allow" sa povolí len to, čo naozaj treba. Ak niečo zabudnete povoliť, zostáva to zakázané. Napr. v nasledujúcom príklade:

ALL: LOCAL 192.168.1.
in.ftpd: ALL
ipop3d: ALL EXCEPT PARANOID

Pozor !!! Toto bol len príklad !!!

2.4.3 Testovanie TCP wrappera

Testovať TCP wrapper v praxi, čiže nastaviť, uložiť a nechať tak, nech sa ukáže, je trochu nebezpečné. Našťastie, autor(i) wrappera mysleli aj na testovanie pravidiel. Preto existuje program "tcpdmatch". "tcpdmatch" funguje tak, že na príkazovom riadku očakáva ako parametre meno démona a adresu, z ktorej sa akože pripája klient. Potom sa pozrie do konfiguračných súborov "/etc/hosts.allow" a "/etc/hosts.deny" a vyhodnotí prístup, ako keby išlo o skutočné sprístupnenie skutočnej služby. Výsledkom je výstup "granted" (prístup povolený) alebo "denied" (prístup zakazaný) spolu s riadkom, na ktorom sa splnilo pravidlo (v "/etc/hosts.allow" resp. "/etc/hosts.deny").

Napríklad pre otestovanie správania sa pripojenia na ftpd ("in.ftpd") z adresy 192.168.1.7 stačí zadať:

$ tcpdmatch in.ftpd 192.168.1.7

Ak chcete, môžete sa skúsiť pripojiť na niektorú chránenu službu z adresy, z ktorej je prístup zakázaný, napr. pomocou "telnet vasa.adresa 110" (kde 110 je port pre POP3), mali by ste vidieť chybové hlásenie "Connection refused".

Na otestovanie falšovania adries môžete pouziť:

tcpdmatch ipop3d paranoid

Ak treba, pozrite si manuál pre "tcpdmatch" alebo aj trochu skrytý manuál k súborom "hosts.allow" a "hosts.deny": "man 5 hosts_access".

2.4.4 Kompletnejší príklad nastavenia TCP wrappera

/etc/hosts.deny:

ALL:ALL
### koniec suboru hosts.deny

/etc/hosts.allow:

# povolime finger z lub. adresy, ktorá nie je falsovana
in.fingerd: ALL EXCEPT PARANOID

# povolime pop3 IBA z vnutornej siete kvoli moznemu sniffovaniu hesiel
# (pripojenie na pop3 nie je sifrovane)
ipop3d: LOCAL 192.168.1.

# povolime ftp IBA z vnutornej siete kvoli moznemu sniffovaniu hesiel
# (pripojenie na ftp nie je sifrovane)
in.ftpd: LOCAL 192.168.1.

# 'spop3' je akoze meno démona, ktorý zabezpecuje citanie mailov pomocou
# secure pop3 -> povolime ho z lub. adresy, ktorá nie je falsovana
spop3: ALL EXCEPT PARANOID

# ssh sa sice nespusta z inetd, ale v niektorých distribúciách defaultne)
# podporuje TCP wrapper (pomocou knižnice libwrap). Predpokladajme, ze sa TCP
# wrapperu predstavuje ako 'ssh' povolime prístup na ssh iba z lokalnej siete
# a z vybranych adries, kedze ja nemam rad, ked sa v noci hocikto potuluje po
# serveri so shellovskym kontom
sshd: LOCAL 192.168.1. 192.168.10.10

# talk povolime z lub. adresy
in.talkd: ALL
in.ntalkd: ALL

### koniec suboru hosts.allow

2.5 Moje odporúčania

Z predchádzajúcej konfigurácie ste možno dostali pár nápadov, kvôli úplnosti ich trochu zhrniem a chcel by som navrhnúť niekoľko riešení ako odporúčania pre vaše servery:

  1. používajte nastavenie označené ako "uzatvorený systém", teda všetky služby implicitne zakázané a povolené len to, čo naozaj potrebujete
  2. službu telnet vôbec nepoužívajte; ak ju už naozaj musíte použiť, sprístupnite ju iba z lokálnej siete!
  3. služby, ktoré prenášajú údaje (aj heslá!!!) v nezašifrovanom tvare (pop3, imap, ftp), obmedzte na použitie iba z lokálnej siete alebo ich nahraďte šifrovanými variantmi: pop3 -> pop3s = stunnel+pop3, imap -> imaps = stunnel+imap, ftp -> ssh (scp). Namiesto pripájania sa na služby čítania pošty (pop3, imap) môžete tiež s úspechom využiť nejaký webmail, napr. IMP (ak použijete na ochranu spojenia protokol "https")
  4. ak používate ssh pre prístup zvonku, zvážte adresy, z ktorých chcete povoliť prístup
  5. ak chcete obmedzovať službu finger len na lokálnu sieť, zvážte jej úplné odstránenie (pre lokálnu sieť to nemá veľký význam)
  6. pre (všetky ostatné) služby, ktoré chcete mať povolené z ľubovoľných adries, použite pravidlo v "/etc/hosts.allow": ALL EXCEPT PARANOID.

Skrátka a dobre, každý správca servera musí mať zdravú dávku paranoje. S TCP wrapperom si jej doprajte dosýta! Je to výborný pomocník, ale ako všetko na svete, nie je samospasiteľný (neochráni vás napríklad pred útokom, ktorý sa snaží vyradiť niektorú vašu službu ("Denial of Service") z prevádzky opakovaným častým pripojenim).