- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 01-02/2001

Konfigurujeme inetd a tcp_wrappers

David Haring, 5. prosince 2000

Tento článek je určený především začínajícím administrátorům. Vysvětlíme zde fungování "super-serveru" inetd a podíváme se jak inetd spolupracuje s tcp_wrappers při omezení přístupu k síťovým službám.

Síťové aplikace jsou zpravidla realizovány na principu klient-server. Server i klient jsou samostatné programy. Server je pak aplikace, která běží bez přerušení a očekává spojení od klientů, jejichž požadavky vyřizuje. Klientský program je naopak zpravidla spouštěn koncovými uživateli a po vyřízení požadavků je ukončen. Příkladem může být služba telnet. Balíček telnetu obsahuje mimo manuálových stránek programy telnetd a telnet. Program telnetd je vlastní server, který se po spuštění naváže na port 23 (což je port vyhrazený pro službu telnet) a čeká na příchozí spojení. Klient telnetu, který může být spuštěn buď na stejném počítači nebo i odjinud, po spuštění kontaktuje server cílového počítače a naváže spojení, které se po ukončení sezení ukončí.

Serverové aplikace, které v Unixových systémech běží nepřetržitě na pozadí se nazývají démony. Pokud systém poskytuje větší množství síťových služeb, běží na něm současně více takových aplikací - serverů. To může vést k plýtvání systémovými prostředky a proto většina UNIXových systémů a distribucí Linuxu používá tzv. "super-server", což bývá zpravidla inetd. Ten funguje tak, že poslouchá na portech všech služeb, které spravuje a teprve podle příchozích požadavků na spojení spouští servery obsluhující jednotlivé služby.

Některé jednoduché služby (echo, discard, chargen, time a daytime) umí inetd obsluhovat sám, bez spouštění externích serverů. Tyto služby ale nejsou zpravidla využívány a je tudíž rozumné je vypnout.

V distribuci Red Hat bývá inetd součástí balíčku netkit-base. Inetd může ke kontrole a omezení přístupu ke službám, které spravuje, využívat balíček tcp_wrappers.

Konfigurace

Konfiguraci inetd čte ze souboru /etc/inetd.conf. Každý řádek obsahuje následující položky (všechny položky musí být vyplněny): "service", "socket type", "protocol", "wait/nowait", "user[.group]", "server program" a "server program arguments".

Položka "service" udává jméno služby (viz soubor /etc/services, případně /etc/rpc).

Položka "socket type" udává typ socketu, což je nejčastěji "stream" (pro protokoly využívající spolehlivá spojení, např. TCP) anebo "dgram" (pro protokoly používající datagramy, např. UDP). Detaily viz např. manuálová stránka socket(2).

Položka "protocol" udává název protokolu ("tcp", "udp" nebo méně často "rpc/tcp" či "rpc/udp").

Položka "wait/nowait" je v případě služby používající protokol TCP vždy "nowait". V případě služby protokolu UDP záleží na tom, zda server uvolní socket a komunikuje s klientem přes nové spojení - v tomto případě může současně běžet více instancí serveru a použijeme volbu "nowait". V opačném případě server čte datagramy tak dlouho, dokud přicházejí a po uplynutí určité doby od přijetí posledního datagramu spojení (timeoutu) se ukončí - v tomto případě použijeme volbu "wait" (takto funguje např. talkd, démon služby talk anebo bootpd, démon služby bootps).

Položka user obsahuje jméno uživatele (případně i skupiny), pod kterým se bude daná služba spouštět.

Položka "server program" udává cestu k serveru dané služby. V případě interních služeb se zde uvádí "internal".

Položka "server program arguments" udává parametry, se kterými bude server dané služby spouštěn, s výjimkou interních služeb, kdy je tato položka prázdná. Uveďme si příklad konfigurace (/etc/inetd.conf - server poskytuje služby ftp, finger, auth, talk, tftp, bootps a time).

# interní služba time 
time          stream  tcp   nowait  root           internal
time          dgram   udp   nowait  root           internal
# protokol TFTP (Trivial File Transfer Protocol), bez autentikace,
# používá se k přenosu dat zpravidla při bootování přes síť 
tftp          dgram   udp   wait    tftp           /usr/sbin/in.tftpd   in.tftpd/boot/diskless
# "Bootstrap Protocol" (BOOTP), slouží k přidělování IP adres a distribuci informací
# potřebných při bootování bezdiskových stanic
bootps        dgram   udp   wait    root           /usr/sbin/bootpd     bootpd
# služba finger
finger        stream  tcp   nowait  root           /usr/sbin/in.fingerd in.fingerd
# IDENT protokol, poskytuje informace o vlastnících spojení
auth          stream  tcp   nowait  nobody.identd  /usr/sbin/in.identd  in.identd -l -e -o
# služba talk
talk          dgram   udp   wait    root           /usr/sbin/in.talkd   in.talkd
# služba FTP
ftp           stream  tcp   nowait  root           /usr/sbin/in.ftpd    in.ftpd -l -a

výpis: /etc/inetd.conf - server poskytuje služby ftp, finger, auth, talk, tftp, bootps a time

Poznámka: Z historických důvodů jména démonů určených pro spouštění přes inetd zpravidla začínají na "in.", na rozdíl od verzí démonů určených pro samostatný ("stand-alone") provoz; proto se někdy můžeme setkat v jednom balíčku se dvěma verzemi démona. Někdy také existuje jen jedna verze démona, u které patřičným parametrem můžeme zvolit, zda budeme službu provozovat přes inetd anebo samostatně.

Omezení přístupu ke službám

Jestliže jsou síťové služby, které náš systém nabízí, určeny pouze pro omezený okruh uživatelů, je žádoucí přístup k těmto službám omezit. Pro kontrolu a omezení přístupu k síťovým službám lze využít utilitu tcpd z balíčku tcp_wrappers. Ta funguje tak, že inetd spouští místo serveru dané služby tcpd, který nejprve dle konfigurace rozhodne, zda požadavek přijmout a teprve potom v kladném případě spustí vlastní server dané služby. Příchozí požadavky, včetně těch odmítnutých zapisuje do systémového logu. Tcpd tedy funguje jako "zástupce démonů".

Přístup k jednotlivým službám se řídí konfiguračními soubory /etc/hosts.deny a /etc/hosts.allow. Syntaxe je jednoduchá, každý řádek je ve tvaru:

daemon_list : client_list [: shell_command]

"daemon_list" je seznam služeb (viz /etc/services). Je také možné použít "ALL", což znamená "všechny služby", případně konstrukci ALL EXCEPT "jméno služby", což znamená všechny služby s výjimkou té uvedené.

"client_list" je seznam jmen počítačů či jejich IP adres. Zde je možné použít klíčové slovo "ALL", "LOCAL" - odpovídá jakémukoliv jménu počítače, které neobsahuje tečku, "KNOWN" - odpovídá jakémukoliv jménu uživatele vlastnícího příchozí spojení na vzdáleném počítači (viz protokol IDENT, RFC 1413), "UNKNOWN" - odpovídá jakémukoliv příchozímu spojení pro které nelze získat informaci o vlastníkovi spojení dle RFC 1413. I zde můžeme použít klíčové slovo "EXCEPT" (příklad: zápis .domena.cz EXCEPT badguy.domena.cz znamená všechny stroje v doméně domena.cz s výjimkou počítače "badguy").

Položka "shell_command" je volitelná a slouží k vykonání zadaného příkazu v příkazovém interpretu. Příkazu lze předat jako argumenty jméno či IP adresu vzdáleného počítače, jméno uživatele vlastnícího příchozí spojení na vzdáleném počítači apod.

Dejme tomu, že náš server má poskytovat v rámci domény "domena.cz" služby ftp a finger. Ostatní služby jsou dostupné pouze lokálním uživatelům serveru. Pak může konfigurace vypadat takto:

Příklad souboru hosts.deny:

# standardně zakázáno všechno, přístup ke službám 
# musíme explicitně povolit v hosts.allow 
ALL:ALL

Příklad souboru hosts.access:

# lokální uživatelé mohou používat všechny služby 
ALL: LOCAL 
# IDENT pouze v rámci domény 
in.identd: .domena.cz 
# FINGER pouze v rámci domény 
in.fingerd: .domena.cz 
# FTP pouze v rámci domény, 
# vyžadujeme identifikaci 
# vzdáleného uživatele dle RFC 931
in.ftpd: KNOWN@.domena.cz 
# TFTP pouze pro bezdiskové stanice 
in.tftpd: 11.22.33.44, 11.22.33.55

Ještě také musíme odpovídajícím způsobem upravit soubor inetd.conf tak, aby pro dané služby spouštěl tcpd. Místo cesty k serveru služby tedy uvedeme cestu k tcpd, viz upravená konfigurace z předchozího příkladu: soubor /etc/inetd.conf - pro kontrolu přístupu používáme tcpd.

[dt]
ftp     stream  tcp  nowait  root          /usr/sbin/tcpd  /usr/sbin/in.ftpd -l -a
finger  stream  tcp  nowait  root          /usr/sbin/tcpd  /usr/sbin/in.fingerd
auth    stream  tcp  nowait  nobody.identd /usr/sbin/tcpd  /usr/sbin/in.identd -l -e -o
tftp    dgram   udp  wait    tftp          /usr/sbin/tcpd  /usr/sbin/in.tftpd /boot/diskless

výpis: /etc/inetd.conf - pro kontrolu přístupu používáme tcpd

Pro kontrolu nastavení přístupu ke službám přes tcp_wrappers slouží utility tcpdcheck a tcpdmatch. Například chceme-li ověřit, zda z počítače s IP adresou 11.22.33.44 je povolen přístup ke službě tftp, kterou obsluhuje přes inetd spouštěný démon in.tftpd, použijeme tcpdmatch:

$ tcpdmatch in.tftpd 11.22.33.44
client:   address  11.22.33.44
server: process  in.tftpd
matched:  /etc/hosts.allow line 12
access:   granted

Alternativy inetd

Často používanou alternativou k inetd se v poslední době stává xinetd, který má proti inetd řadu výhod. Xinetd nabízí například lepší kontrolu přístupu k službám (mimo jiné možnost omezení přístupu ke službám v určitých časových intervalech), ochranu proti útokům odepřením služeb (DoS), přesměrování služeb a lepší logování.

Shrnutí, bezpečnost

Inetd spolu s tcpd umožňuje upravit přístup k některým službám poskytovaných systémem. Protože standardní instalace distribucí většinou velmi benevolentně povolí přístup k řadě služeb, z nichž mnohé zpravidla vůbec nepotřebujeme, je na místě konfiguraci ihned po instalaci prohlédnout, nepotřebné služby vypnout a přístup k používaným službám omezit podle skutečných potřeb. *


- předchozí článek - následující článek - obsah - úvodní stránka -