Posledná zmena: 7/9/2021
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.
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ý.
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
").
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:
/etc/hosts.allow
", prístup sa
umožní/etc/hosts.deny
", prístup sa
zakáže.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.
ALL EXCEPT in.fingerd: .example.com(Čiže: pre VŠETKY démony OKREM in.fingerd ...)
ALL: .example.com EXCEPT server.example.com(Čiže: pre VŠETKY démony platí pravidlo pre doménu ".example.com" OKREM adresy "server.example.com")
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
Existujú dva spôsoby, ako kombinovať oba súbory na riadenie prístupu:
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é !!!
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 !!!
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
".
/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
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:
https
")/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).