Ipsvd

A Unix/Linux szerverek üzemeltetése wikiből

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:

  1. a.b.c.d
  2. a.b.c
  3. a.b
  4. a
  5. izé.bigyó.valami.bármi
  6. bigyó.valami.bármi
  7. valami.bármi
  8. bármi
  9. 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:

  1. A 192.168.1.17-ről elfogadunk kapcsolatokat.
  2. Sehonnan máshonnan, ahonnan explicit nem engedélyezzük, nem fogadunk kapcsolatokat.
  3. A 192.168.3.0/24-ből elfogadunk kapcsolatokat.
  4. A 10.0.0.0/16-ból explicit tiltjuk a kapcsolatokat.
  5. 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).
  6. 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

Személyes eszközök