Ipsvd
Tartalomjegyzék |
1 Mire való?
- inetd-jelleggel szolgáltatásokat nyújtani
- a szolgáltatásért felelős programban nincs hálózatkezelés
- és nem fut állandóan, csak ha új kapcsolat érkezik
- az ipsvd tud:
- tcp-t
- udp-t
- ssl-t (tcp fölött)
- amúgy megvalósítja az UCSPI-t
2 A csomag részei
Az ipsvd csomagban három UCSPI-jellegű szerverprogram is van; kliens nincs.
A DJB-féle UCSPI-eszközökhöz hasonlóan ezek szintaxisa is eléggé hasonló:
XXXsvd [-hp] [-l name] [-u user] [-i dir|-x cdb] [-t sec] host port prog
Ezek nagyrészt ismerősek lehetnek az UCSPI-ből.
Újdonságok:
- -i dir: a megadott könyvtárból veszi a konfigurációt (cdb helyett lehet használni). Részletesen l. lejjebb.
- -l name: a helyi hosztnév (ha nem akarjuk, hogy DNS-ből vegye)
- -u user[:group]: ilyen felhasználóként (és csoportként) fusson a szolgáltatás. A kiegészítő csoporttagságokat eldobja.
- -h: oldja fel a DNS-ben a kliens IP-jét
- -p: ezt tegye paranoid módon (dobja el a távoli hosztnevet, ha a hozzá tartozó IP-k közül egy sem egyezik a kliensével)
- -t sec: ha a megadott könyvtárban talál olyan fájlt, ami
- az aktuális kliens nevére vagy IP-jére illeszkedik, ÉS
- van rá írási joga a tulajdonosnak, ÉS
- legalább sec másodperc telt el az utolsó hozzáférés óta (az atime alapján), akkor letörli a fájlt és figyelmen kívül hagyja a tartalmát.
Ezt arra lehet használni, hogy ideiglenesen megnyissunk egy portot egy kliens számára, vagy ideiglenesen a szokásostól eltérő szolgáltatást nyújtsunk neki. Pl. annak az SMTP-kliensnek, aki az előbb spamet küldött nekünk, ideiglenesen "cúna báci, nem kell több spam!" tolhatunk az arcába, vagy annak, aki sikeresen bejelentkezett a POP3-szerverünkre, engedélyezhetjük a kimenő levelezést, s.í.t.
2.1 tcpsvd
Mint a tcpserver. Újdonság, hogy nemcsak teljes kapcsolatszám-korlátozást tud, hanem kliensenkéntit is, a -C paraméterrel. A korlát túllépése miatt elutasított klienseknek még valamilyen üzenetet is küldhetünk, hogy tudják, mi a baj. Az elindított prog (a szerveralkalmazás) a TCPCONCURRENCY változóból megtudhatja, hanyadik konkurrens kapcsolata ez az adott kliensnek.
2.2 sslsvd
Ugyanaz, mint a tcpsvd, csak SSLv3-mal titkosít is és hitelesíti is magát.
Új opciók:
- -/ gyökér: chroot
- -Z cert: honnan vegye a tanúsítványt
- -K key: honnan vegye a titkos kulcsot
- -U user[:group]: az SSL tanúsítvány beolvasása és feldolgozása előtt átvált erre a userre (és esetleg csoportra). A szolgáltatást utána elvileg a -u-val megadott userként fogja futtatni.
Az SSL-es feladatokat igazából egy külön gyermekfolyamat végzi, és ezek az opciók erre a folyamatra vonatkoznak; azért jó más felhasználóként, chrootolva futtatni, mert az SSL elég összetett ahhoz, hogy mindenféle csúf megvalósítási hiba lehessen benne (az OpenSSL-ben már volt is). Ha mezei felhasználóként, chrootolva futunk, azzal korlátozzuk egy ilyen hiba hatókörét.
Sajnos klienstanúsítvány-alapú hitelesítést nem tud, mert a matrixssl library open source változatában ez nincs benne.
2.3 udpsvd
Nagyjából ugyanaz, mint a tcpsvd, csak UDP-re.
- Az elindított alkalmazás standard inputja az UDP socketből olvas, a standard outputja viszont az udpsvd standard errorjára ír.
- Nem indít több példányt az alkalmazásból.
- A gyermekfolyamat disconnected UDP socketet örököl a szülőjétől.
- recvfrom()-mal és sendto()-val kezelhető értelmesen
2.4 ipsvd-cdb
cdb adatbázist készít egy összetett konfigurációt tartalmazó könyvtárból.
ipsvd-cdb cdb cdb.tmp dir
Előnye: gyorsabb benne a keresés.
Hátránya: nem módosítható (pl. nem működik a -t kapcsoló).
2.5 sslio
tcpsvd+sslio ~ sslsvd.
Kis program, ami egy UCSPI-szerver vagy -kliens és az általa indított alkalmazás közé ül be, és SSLv3-as titkosítást nyújt. Kapcsolói kb. mint az sslvsd-nél, azzal a különbséggel, hogy kliens-üzemmódban is tud működni (pl. a tcpclient segítségével), és ilyenkor tudja hitelesíteni a szerver tanúsítványát.
A program elavult; az SSLv3 már hosszú ideje nem elegendően biztonságos.
3 Összetett konfiguráció
A konfiguráció egy könyvtárban található fájlok összessége.
Minden fájl egy hosztnévhez, egy domainhez, egy IP-hez vagy egy subnethez tartozik, és az adott valamire jellemző konfiguráció van benne.
Ha az a.b.c.d IP-jű gép, amely mondjuk az 'izé.bigyó.valami.bármi' névre hallgat, akkor a következő sorrendben próbálkozik a configfájlok beolvasásával:
- a.b.c.d
- a.b.c
- a.b
- a
- izé.bigyó.valami.bármi
- bigyó.valami.bármi
- valami.bármi
- bármi
- 0
Ha talált megfelelő fájlt:
- Megvizsgálja a jogosultságbiteket.
- Ha a tulajdonosnak sem olvasási, sem futtatási joga nincs, a kapcsolatot lezárja.
- Ha a tulajdonosnak van futtatási joga, akkor az XXXsvd a fájl tartalmát futtatja a parancssorban megadott szerveralkalmazás helyett.
- Ha a tulajdonosnak olvasási joga van, akkor a fájl konfigurációs direktívákat tartalmaz.
- Konfigurációs direktívák:
- +VAR=ÉRTÉK: A szerveralkalmazás elindítása előtt a VAR környezeti változót ÉRTÉKre állítja; ha nincs a sorban egyenlőségjel (és persze ÉRTÉK), akkor törli a változót.
- Cn[:üzenet]: Az aktuális kliensIP maximális kapcsolatszámát n-re állítja; a további kapcsolatoknak csak az üzenetet küldi el, majd bontja a kapcsolatot.
- =hosztnév[:forward]: Dinamikus-DNS-alapú konfiguráció. Feloldja hosztnevet a DNS-ben, és ha az így kapott IP-címek bármelyike megegyezik a kliens IP-jével:
- ha nincs megadva :forward, egyszerűen futtatja a szerveralkalmazást;
- ha meg van adva :forward, akkor a forward nevű konfigurációs fájlban leírtak szerint jár el (de abban már nem veszi figyelembe az = parancsot).
- Ha hosztnév 0, akkor minden IP-re illszekedik. Ez azért fontos, mert ha volt = parancs a configban, de egyik se illeszkedett a kliensre, akkor az XXXsvd bezárja a kapcsolatot; ha ezt nem szeretnénk, kell egy =0 sor is.
4 Példák
Futtassunk telnet daemont. A run scriptje lehet ilyesmi:
#!/bin/sh exec 2>&1 exec tcpsvd -v -i./peers 0.0.0.0 23 in.telnetd
A peers könyvtár tartalmazza majd a konfigurációt. Hozzuk létre és töltsük fel:
mkdir peers touch ./peers/192.168.1.17; chmod 644 ./peers/192.168.1.17 touch ./peers/0; chmod 0 ./peers/0 touch ./peers/192.168.3; chmod 644 ./peers/192.168.3 touch ./peers/10.0; chmod 0 ./peers/10.0 echo '+TRUST=true' >./peers/192.168.14.2; chmod 644 ./peers/192.168.14.2 echo 'sshd -i' >./peers/10.2.0.14; chmod 744 ./peers/10.2.0.14
Így most:
- A 192.168.1.17-ről elfogadunk kapcsolatokat.
- Sehonnan máshonnan, ahonnan explicit nem engedélyezzük, nem fogadunk kapcsolatokat.
- A 192.168.3.0/24-ből elfogadunk kapcsolatokat.
- A 10.0.0.0/16-ból explicit tiltjuk a kapcsolatokat.
- A 192.168.14.2-ről jövő kapcsolatokat elfogadjuk, és a telnetd elindítása előtt true értéket adunk a TRUST változónak (a telnetd-re van bízva, hogy mit kezd ezzel).
- A 10.2.0.14-ről jövő kapcsolatokat is fogadjuk, de sshd-t indítunk nekik telnetd helyett.
Ha két dinamikus hosztnevünkről is el akarjuk fogadni a telnetkapcsolatokat, azt így tehetjük meg:
echo '=az.én.egyik.gépem.dyn.hu' >./peers/0 echo '=az.én.másik.gépem.dyn.hu' >>./peers/0 chmod 644 ./peers/0
5 Ajánlott irodalom
- UDP shell scripts with inetd - elég jó programozásközeli magyarázat az inetd-ről és az UDP-socketekről; a végén ír shellben egy nameservert.
- http://smarden.org/ipsvd/ - az ipsvd honlapja