29.2. Az inetd “szuperszerver”

Készítette: Chern Lee. A FreeBSD 6.1-RELEASE változatához igazította: A FreeBSD Dokumentációs Projekt.

29.2.1. Áttekintés

Az inetd(8) démont gyakran csak “internet szuperszerverként” nevezik, mivel a helyi szolgáltatások kapcsolatainak kezeléséért felelős. Amikor az inetd fogad egy csatlakozási kérelmet, akkor eldönti róla, hogy ez melyik programhoz tartozik és elindít egy példányt belőle, majd átadja neki a socketet (az így meghívott program a szabvány bemenetéhez, kimenetéhez és hibajelzési csatornájához kapja meg a socket leíróit). Az inetd használatával úgy tudjuk csökkenteni a rendszerünk terhelését, hogy a csak alkalmanként meghívott szolgáltatásokat nem futtatjuk teljesen független önálló módban.

Az inetd démont elsősorban más démonok elindítására használjuk, de néhány triviális protokollt közvetlenül is képes kezelni, mint például a chargen, auth és a daytime.

Ebben a fejezetben az inetd beállításának alapjait foglaljuk össze mind parancssoros módban, mind pedig az /etc/inetd.conf konfigurációs állományon keresztül.

29.2.2. Beállítások

Az inetd működése az rc(8) rendszeren keresztül inicializálható. Az inetd_enable ugyan alapból a NO értéket veszi fel, vagyis tiltott, de a sysinstall használatával már akár a telepítés során bekapcsolható attól függően, hogy a felhasználó milyen konfigurációt választott. Ha tehát a:

inetd_enable="YES"

vagy

inetd_enable="NO"

sort tesszük az /etc/rc.conf állományba, akkor azzal az inetd démont indíthatjuk el vagy tilthatjuk le a rendszer indítása során. Az

# /etc/rc.d/inetd rcvar

paranccsal lekérdezhetjük a pillanatnyilag érvényes beállítást.

Emellett még az inetd démonnak az inetd_flags változón keresztül különböző parancssori paramétereket is át tudunk adni.

29.2.3. Parancssori paraméterek

Hasonlóan a legtöbb szerverhez, az inetd viselkedését is befolyásolni tudjuk a parancssorban átadható különböző paraméterekkel. Ezek teljes listája a következő:

inetd [-d] [-l] [-w] [-W] [-c maximum] [-C arány] [-a cím | név] [-p állomány] [-R arány] [-s maximum] [konfigurációs állomány]

Ezek a paraméterek az /etc/rc.conf állományban az inetd_flags segítségével adhatóak meg az inetd részére. Alapértelmezés szerint az inetd_flags értéke -wW -C 60, ami az inetd által biztosított szolgáltatások TCP protokollon keresztüli wrappelését kapcsolja be, illetve egy IP-címről nem engedi a felkínált szolgáltatások elérését percenként hatvannál többször.

A kezdő felhasználók örömmel nyugtázhatják, hogy ezeket az alapbeállításokat nem szükséges módosítaniuk, habár a későbbiekben majd fény derül arra, hogy a kiszolgálás gyakoriságának szabályozása remek védekezést nyújthat túlzottan nagy mennyiségű kapcsolódási kérelem ellen. A megadható paraméterek teljes listája az inetd(8) man oldalán olvasható.

-c maximum

Az egyes szolgáltatásokhoz egyszerre felépíthető kapcsolatok alapértelmezett maximális számát adja meg. Alapból ezt a démont nem korlátozza. A max-child beállítással ez akár szolgáltatásonként külön is megadható.

-C arány

Korlátozza, hogy egyetlen IP-címről alapból hányszor hívhatóak meg az egyes szolgáltatások egy percen belül. Ez az érték alapból korlátlan. A max-connections-per-ip-per-minute beállítással ez szolgáltatásonként is definiálható.

-R arány

Megadja, hogy egy szolgáltatást egy perc alatt mennyiszer lehet meghívni. Ez az érték alapértelmezés szerint 256. A 0 megadásával eltöröljük ezt a típusú korlátozást.

-s maximum

Annak maximumát adja meg, hogy egyetlen IP-címről egyszerre az egyes szolgáltatásokat mennyiszer tudjuk elérni. Alapból ez korlátlan. Szolgáltatásonként ezt a max-child-per-ip paraméterrel tudjuk felülbírálni.

29.2.4. Az inetd.conf állomány

Az inetd beállítását az /etc/inetd.conf konfigurációs állományon keresztül végezhetjük el.

Amikor az /etc/inetd.conf állományban módosítunk valamit, az inetd démont a következő paranccsal meg kell kérnünk, hogy olvassa újra:

Példa 29-1. Az inetd konfigurációs állományának újraolvasása

# /etc/rc.d/inetd reload

A konfigurációs állomány minden egyes sora egy-egy démont ír le. A megjegyzéseket egy “#” jel vezeti be. Az /etc/inetd.conf állomány bejegyzéseinek formátuma az alábbi:

szolgáltatás-neve
socket-típusa
protokoll
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
felhasználó[:csoport][/bejelentkezési-osztály]
szerver-program
szerver-program-paraméterei

Az IPv4 protokollt használó ftpd(8) démon bejegyzése például így néz ki:

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l

szolgáltatás-neve

Ez az adott démon által képviselt szolgáltatást nevezi meg, amelynek szerepelnie kell az /etc/services állományban. Ez határozza meg, hogy az inetd milyen porton figyelje a beérkező kapcsolatokat. Ha egy új szolgáltatást hozunk létre, akkor azt először az /etc/services állományba kell felvennünk.

csatlakozás-típusa

Ennek az értéke stream, dgram, raw, vagy seqpacket lehet. A stream típust használja a legtöbb kapcsolat-orientált TCP démon, miközben a dgram típus az UDP szállítási protokollt alkalmazó démonok esetében használatos.

protokoll

Valamelyik a következők közül:

ProtokollMagyarázat
tcp, tcp4TCP IPv4
udp, udp4UDP IPv4
tcp6TCP IPv6
udp6UDP IPv6
tcp46TCP IPv4 és v6
udp46UDP IPv4 és v6

{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]

A wait|nowait beállítás mondja meg, hogy az inetd démonból meghívott démon saját maga képes-e kezelni kapcsolatokat. A dgram típusú kapcsolatok esetében egyértelműen a wait beállítást kell használni, miközben a stream esetén, ahol általában több szálon dolgozunk, a nowait megadása javasolt. A wait hatására általában egyetlen démonnak adunk át több socketet, míg a nowait minden sockethez egy újabb példányt indít el.

Az inetd által indítható példányokat a max-child megadásával korlátozhatjuk. Ha tehát például az adott démon számára legfeljebb példány létrehozását engedélyezzük, akkor a nowait után /10 beállítást kell megadnunk. A /0 használatával korlátlan mennyiségű példányt engedélyezhetünk.

A max-child mellett még további két másik beállítás jöhet számításba az egyes démonok által kezelhető kapcsolatok maximális számának korlátozásában. A max-connections-per-ip-per-minute az egyes IP-címekről befutó lekezelhető kapcsolatok percenkénti számát szabályozza, így például ha itt a tizes értéket adjuk meg, akkor az adott szolgáltatáshoz egy IP-címről percenként csak tízszer férhetünk hozzá. A max-child-per-ip az egyes IP-címekhez egyszerre elindítható példányok számára ír elő egy korlátot. Ezek a paraméterek segítenek megóvni rendszerünket az erőforrások akaratos vagy akaratlan kimerítésétől és a DoS (Denial of Service) típusú támadásoktól.

Ebben a mezőben a wait vagy nowait valamelyikét kötelező megadni. A max-child, max-connections-per-ip-per-minute és max-child-per-ip paraméterek ellenben elhagyhatóak.

A stream típusú több szálon futó démonok a max-child, max-connections-per-ip-per-minute vagy max-child-per-ip korlátozása nélkül egyszerűen csak így adhatóak meg: nowait.

Ha ugyanezt a démont tíz kapcsolatra lekorlátozzuk, akkor a következőt kell megadnunk: nowait/10.

Amikor pedig IP-címenként 20 kapcsolatot engedélyezünk percenként és mindössze 10 példányt, akkor: nowait/10/20.

Az iménti beállítások a fingerd(8) démon alapértelmezett paramétereinél is megtalálhatóak:

finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s

Végezetül engedélyezzük 100 példányt, melyek közül IP-címenként 5 használható: nowait/100/0/5.

felhasználó

Ezzel azt a felhasználót adjuk meg, akinek a nevében az adott démon futni fog. Az esetek túlnyomó részében a démonokat a root felhasználó futtatja. Láthatjuk azonban, hogy biztonsági okokból bizonyos démonok a daemon vagy a legkevesebb joggal rendelkező nobody felhasználóval futnak.

szerver-program

A kapcsolat felépülésekor az itt teljes elérési úttal megadott démon indul el. Ha ezt a szolgáltatást maga az inetd belsőleg valósítja meg, akkor ebben a mezőben az internal értéket adjuk meg.

szerver-program-paraméterei

Ez a szerver-program beállítással együtt működik, és ebben a mezőben a démon meghívásakor alkalmazandó paramétereket tudjuk rögzíteni, amelyet a démon nevével kezdünk. Ha a démont a parancssorból a sajátdémon -d paranccsal hívnánk meg, akkor a sajátdémon -d lesz szerver-program-paraméterei beállítás helyes értéke is. Természetesen, ha a démon egy belsőleg megvalósított szolgáltatás, akkor ebben a mezőben is az internal fog megjelenni.

29.2.5. Védelem

Attól függően, hogy a telepítés során mit választottunk, az inetd által támogatott szolgáltatások egyes része talán alapból engedélyezett is. Amennyiben egy adott démont konkrétan nem használunk, akkor érdemes megfontolni a letiltását. A kérdéses démon sorába tegyünk egy “#” jelet az /etc/inetd.conf állományba, majd olvastassuk újra az inetd beállításait. Egyes démonok, mint például az fingerd használata egyáltalán nem ajánlott, mivel a támadók számára hasznos információkat tudnak kiszivárogtatni.

Más démonok nem ügyelnek a védelemre, és a kapcsolatokhoz rendelt lejárati idejük túlságosan hosszú vagy éppen nincs is. Ezzel a támadónak lehetősége van lassú kapcsolatokkal leterhelni az adott démont, ezáltal kimeríteni a rendszer erőforrásait. Ha úgy találjuk, hogy túlságosan sok az ilyen kapcsolat, akkor jó ötletnek bizonyulhat a démonok számára a max-connections-per-ip-per-minute, max-child vagy max-child-per-ip korlátozások elrendelése.

Alapértelmezés szerint a TCP kapcsolatok wrappelése engedélyezett. A hosts_access(5) man oldalon találhatjuk meg az inetd által meghívható különféle démonok TCP-alapú korlátozásainak lehetőségeit.

29.2.6. Egyéb lehetőségek

A daytime, time, echo, discard, chargen és auth szolgáltatások feladatainak mindegyikét maga az inetd is képes ellátni.

Az auth szolgáltatás a hálózati keresztül azonosítást teszi lehetővé és bizonyos mértékig beállítható. A többit egyszerűen csak kapcsoljuk ki vagy be.

A témában az inetd(8) man oldalán tudunk még jobban elmerülni.

Ha kérdése van a FreeBSD-vel kapcsolatban, a következő címre írhat (angolul): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon: <gabor@FreeBSD.org>.