Linuxové noviny | 01-02/2001 | ||
| |||
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.
KonfiguraceKonfiguraci 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).
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ámJestliž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.
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čnostInetd 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. |