Lighty (lighttpd) telepítése (Wheezy)

Innen: AdminWiki

Ebben a leírásban a Lighty (Light HTTPd, lighttpd) webszervert egyfajta "web kijelzőként", kizárólag statikus weboldalak (pl. háttérben generált Munin, MRTG grafikonok) megjelenítésére alkalmas módon telepítjük. Noha a Lighty képes lenne publikus, virtualhostolt, nagy forgalmú, dinamikus weboldalak kiszolgálására is, házirendünkben (szubjektív döntésként) ilyen feladatokra az Apache webszervert illetve a wsm2 környezetet írjuk elő (részletesen ld. itt).

Házirend

Csak akkor telepítünk Lighty-t, ha a szervergép funkciója nem webszerver, azaz publikus webtartalmat nem, csak webfelületen megjelenített technikai jellegű adatokat szolgáltat:

  • a tartalom csak olvasható (nincs szerver oldali interaktivitás, nincs CGI - TODO!);
  • a tartalom statikus, vagy a háttérben aszinkron módon generált, azaz nem szükséges szerkesztői hozzáférés;
  • nem szükséges virtualhost kezelés;
  • nem szükséges látogatási statisztika.

A megjelenített, általában technikai jellegű tartalom védelme érdekében:

  • a releváns tartalmakat basic authentikációhoz kötjük;
  • az authentikáció titkosítása érdekében minden lekérést https-re irányítunk.

Technikailag:

  • a tartalom a szervergép /var/www könyvtárában helyezkedik el, amely a www-data:www-data Linux rendszerfelhasználó és -csoport birtokában van;
  • a lighthttpd a www-data nevében fut és a tárterületet a csoport jogán olvassa;
  • TODO!

Telepítés

Rendszergazdaként, Debian csomagból telepíthető a https kiszolgálásához szükséges openssl csomaggal és néhány egyéb függőséggel együtt:

apt-get install lighttpd lighttpd-doc openssl # + néhány függőség

A telepítés után a webszerver azonnal elindul. Gyorstesztként egy, a telepítés alatti szervert webkapcsolaton elérő munkaállomás grafikus web böngészőjében tekinsük meg a http://IP.IP.IP.IP weboldalt, amely az alapértelmezett /var/www/index.lighttpd.html tartalmát mutatja meg. Ezután, a további beállításig állítsuk le a webszervert:

service lighttpd stop

Alapbeállítások

A webszerver közvetlen konfigurálása mellett készítünk egy self-signed tanúsítványt a https kiszolgálás számára, és egy jelszóállományt, amivel hozzáférhetünk a majdani Munin statisztikák könyvtárához, valamint lecseréljük az alapértelmezett indexlapot is. A Munin előkészítése részben példaként szolgál, másfelől reális haszna is van, mert a legtöbb szervergépen telepítünk standalone Munin megjelenítőt.

A webszerver beállításai

A webszerver saját beállításait a /etc/lighttpd/conf-available/99-local.conf modulban adjuk meg, az alábbiak szerint:

  • függőségként bekapcsoljuk az access log-ot, az authentikációs modult, az https támogatást és a webszerver saját monitorát;
  • a webszerver azonosítójában (Server HTTP header) eltitkoljuk a verziószámot :-);
  • minden, nem a localhostról érkező http lekérést https-re irányítunk;
  • bekapcsoljuk, de csak a localhost-ról tesszük elérhetővé a webszerver saját terhelési mutatóit megadó technikai weboldalt (/server-status);
  • egyszerű szövegfájlban tárolt, jelszavas authentikációt állítunk be a (még nem létező) /munin könyvtár számára.
-rw-r--r-- root root /etc/lighttpd/conf-available/99-local.conf


# -*- depends: accesslog, auth, ssl, status -*-
# Local policies and settings.

server.tag = "lighttpd"

# We provide HTTPs only, except for localhost.
$HTTP["scheme"] == "http" {
    # Excluding localhost.
    $HTTP["remoteip"] !~ "^127\.0\." {
        # From: http://redmine.lighttpd.net/projects/lighttpd/wiki/HowToRedirectHttpToHttps
        # capture vhost name with regex conditional -> %0 in redirect pattern
        # must be the most inner block to the redirect rule
        $HTTP["host"] =~ ".*" {
            url.redirect = (".*" => "https://%0$0")
            url.redirect-code = 302
        }
    }
}

# Server status for localhost only (monitoring).
$HTTP["remoteip"] !~ "^127\.0\." {
    $HTTP["url"] =~ "^/server-" {
        url.access-deny = ("")
    }
}
$HTTP["remoteip"] =~ "^127\.0\." {
    status.status-url = "/server-status"
    status.enable-sort = "disable"
}

# Munin results folder is password-protected.
$HTTP["url"] =~ "^/munin($|/)" {
    auth.backend = "plain"
    auth.backend.plain.userfile = "/etc/lighttpd/lighttpd-munin.user"
    auth.require = ( "" =>
        ( "method" => "basic", "realm" => "Munin", "require" => "valid-user" )
    )
}

# That's all, folks!

Ezen kívül szigorítsuk meg a https (ssl modul) beállításokat:

Ehhez sajnos bele kell nyúlnunk a /etc/lighttpd/conf-available/10-ssl.conf állományba:

-rw-r--r-- root root /etc/lighttpd/conf-available/10-ssl.conf

[...]

        ssl.use-sslv2 = "disable"
        ssl.use-sslv3 = "disable"
        ssl.use-compression = "disable"
        ssl.cipher-list = "ECDHE-RSA-AES256-SHA384:AES256-SHA256:!RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM"
[...]

Engedélyezzük a local modult, ezzel egyben a függőségeket is:

lighty-enable-mod local

Az engedélyezéssel nem kapcsoltuk vissza a webszervert, ami nem is baj, mert még nem készült el a https tanúsítvány.

A https szervertanúsítvány elkészítése

Egy önaláírt tanúsítványt készítünk, amelyet a /etc/lighttpd/conf-available/10-ssl.conf állományban alapértelmezett néven és helyre telepítünk (így ahhoz emiatt nem kell hozzányúlni). Ha már van érvényes szervertanúsítványunk, természetesen használhatjuk azt is - ez esetben a generálás nem szükséges, csak az elhelyezés.

cd /root/tmp
export DAYS=360 FQHN=$(hostname --fqdn)
echo $FQHN $DAYS # ha $FQHN nem megfelelő, definiáljuk felül manuálisan!

openssl genrsa -out $FQHN.key 2048 # 2K RSA private key - ez lesz a szerverkulcs
chmod 600 $FQHN.key

openssl req -new -key $FQHN.key -sha256 -out $FQHN.csr # Aláírandó tanúsítvány - töltsük ki az alábbiak szerint (csak példa!):
#   Country Name (2 letter code) [AU]:HU
#   State or Province Name (full name) [Some-State]:Budapest
#   Locality Name (eg, city) []:Budapest
#   Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
#   Organizational Unit Name (eg, section) []:Web Services
#   Common Name (eg, YOUR name) []:FULLY.QUALIFIED.HOSTNAME
#   Email Address []:sysadmin@mydomain.hu
#   Extra attributumok üresen hagyhatóak.

openssl x509 -req -days $DAYS -in $FQHN.csr -signkey $FQHN.key -sha256 -out $FQHN.crt # Írassuk alá

cat $FQHN.key $FQHN.crt > /etc/lighttpd/server.pem  # Kombinált kulcs + cert alapértelmezett helyre
chmod 600 /etc/lighttpd/server.pem                  # Mert privát kulcsot tartalmaz

mv $FQHN.key /etc/ssl/private/
mv $FQHN.crt /etc/ssl/certs/   # Megőrizzük a komponenseket
rm $FQHN.csr                   # Ez már nem kell

Ezzel a tanúsítványt elkészítettük és elhelyeztük. A házirend szerint telepített /etc/cron.daily/check-active-certs felügyelő script fel van készülve az így elhelyezett tanúsítvány érvényességének napi egyszeri ellenőrzésére, így annak lejáratáról időben értesítést fogunk kapni.

A Munin jelszóállomány elkészítése

A Munin grafikonok eléréséhez készítünk egy jelszóállományt, amelybe felvesszük az auditor virtuális (csak a Lighty számára létező) felhasználót és beállítunk számára egy véletlen jelszót:

echo -e "auditor:$(/usr/bin/pwgen -c -n -s 12 1)" >/etc/lighttpd/lighttpd-munin.user
chown root:www-data /etc/lighttpd/lighttpd-munin.user  # A webszervernek olvasnia kell
chmod 640 /etc/lighttpd/lighttpd-munin.user            # Jelszó van benne, más ne olvassa

A generált jelszót olvassuk ki és jegyezzük fel.

Az alapértelmezett weboldal cseréje

A web tárhelyet adó /var/www könyvtár jogait változtassuk meg úgy, hogy minden itt létrehozott állomány csoportja legyen www-data - ez biztosítja a webszerver olvasási jogát ezekre az állományokra. Mindenki mástól vegyük el az írás-olvasás jogát:

chown root:www-data /var/www
chmod 2751 /var/www

Opcionálisan a kicsit bőbeszédű alapértelmezett weboldalt az alábbi, lényegesen egyszerűbbre cserélhetjük:

touch /var/www/index.html
chmod 640 /var/www/index.html
mcedit /var/www/index.html
-rw-r----- root www-data /var/www/index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>
<HEAD>
        <TITLE>Empty page</TITLE>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF8">
</HEAD>

<BODY BGCOLOR="#ffffff" STYLE='margin: 0;' MARGINWIDTH=0 MARGINHEIGHT=0 TOPMARGIN=0 LEFTMARGIN=0>
    <P>FULLY.QUALIFIED.HOSTNAME</P>
</BODY>
</HTML>

Ne felejtsük el a FULLY.QUALIFIED.HOSTNAME-et a szervertanúsítvány elkészítésénél megadottal lehetőleg azonosan kitölteni!

A maintainer által biztosított, alapértelmezett weboldalt egyszerűen letörölhetjük, vagy el is rejthetjük, pl. az alábbi módon:

chown root:www-data /var/www/index.lighttpd.html
chmod 600 /var/www/index.lighttpd.html           # elvesszük az olvasási jogot a webszervertől

Ezután már elindíthatjuk a webszervert:

service lighttpd start; service lighttpd status; tail -f /var/log/lighttpd/error.log

Gyorsteszt

Gyorstesztként egy, a telepítés alatti szervert webkapcsolaton elérő munkaállomás grafikus web böngészőjében nézzük meg az alábbiakat (IP cím helyett az URL-ben használhatunk bármilyen hostnevet, amelynek DNS feloldása erre a szervergépre mutat):

  • http://IP.IP.IP.IP - automatikus https-re váltás és az önaláírt szervertanúsítvány elfogadása után az imént elkészített, puritán alapértelmezett weboldalt kell látnunk.
  • http://IP.IP.IP.IP/munin - az authentikáció elutasítása esetén 401-es, az auditor felhasználóval és az imént beállított jelszóval történő authentikáció után 404-es HTTP hibát kapunk (még nincs Munin tartalom);
  • lekéréseink megfelelően megjelennek a /var/log/lighttpd/access.log és /var/log/lighttpd/error.log naplókban.

Fentiek sikere esetén a web megjelenítő szolgáltatást valószínűleg jól beállítottuk :-). A https biztonságot a Qualsys tesztjével ellenőrizhetjük (itt önaláírt tanúsítvánnyal "T(A-)", megbízható tanúsítvánnyal "A-" minősítést tudunk elérni, mert a Wheezy-ben használt OpenSSL még nem teljesen támogatja a forward secrecy funkciót).

Egyéb beállítások

Ebben a szakaszban a webszerverhez kapcsolódó egyéb, külső beállításokat végezzük el.

A lighttpd bejegyzése a Tiger által ismert démonok közé

A web megjelenítő démonja(i) állandóan fut(nak), így a biztonsági figyelmeztetések elkerülése érdekében be kell jegyezni a lighttpd-t a tigerrc állományba:

-rw-r--r-- root root /etc/tiger/tigerrc

[...]
Tiger_Listening_ValidUsers='[...]|www-data|[...]'
[...]
Tiger_Listening_ValidProcs='[...]|lighttpd|[...]'
[...]
Tiger_Running_Procs='[...] /usr/sbin/lighttpd [...]'
[...]

A lighttpd monitorozása a Muninnal

Amennyiben telepítve van a munin-addons csomag, a monitorozás az alábbi parancsokkal vehető használatba:

cp -p /usr/local/share/munin/plugin-conf.d/lighttpd /etc/munin/plugin-conf.d/lighttpd

ln -s /usr/local/share/munin/plugins/lighttpd_ /etc/munin/plugins/lighttpd_accesses
ln -s /usr/local/share/munin/plugins/lighttpd_ /etc/munin/plugins/lighttpd_kbytes

# Ezek is léteznek, de nekünk valószínűleg nem kellenek:
#ln -s /usr/local/share/munin/plugins/lighttpd_ /etc/munin/plugins/lighttpd_busyservers
#ln -s /usr/local/share/munin/plugins/lighttpd_ /etc/munin/plugins/lighttpd_idleservers
#ln -s /usr/local/share/munin/plugins/lighttpd_ /etc/munin/plugins/lighttpd_uptime

/etc/init.d/munin-node restart  # érvényesítsük a beállításokat

A munin-addons-ban szereplő beállító állomány a fenti házirendünkkel kompatibilis, így a munin-node újraindítása után a monitorozás már működik:

telnet localhost 4949
[...]
fetch lighttpd_accesses
>  data.value 11
>  .
fetch lighttpd_kbytes
>  data.value 1
>  .
quit

Irodalom