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

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ára alatt helyezkedik el, amely a webadmin:www-data Linux (rendszer)felhaszná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!

Kompatibilitási megjegyzés:

  • Igyekszünk úgy kialakítani a webszolgáltatást, hogy szükség esetén (a Lighty lecserélésével) könnyen lehessen wsm2-kompatibilis kiszolgálásra továbblépni.

Web adminisztrátor felhasználó elkészítése

Opcionális lépés, de érdemes megtenni minden esetben, ha felmerül a későbbiekben a Lighty Apache2 wsm2-re cserélése. Házirendünkben (béna hagyomány miatt) a web adminisztrátor az UID 1001 felhasználó, és ezt az azonosítót az esetleges migrációk miatt érdemes kőbe vésni.

A web adminisztrátor felhasználó jellegét tekintve rendszer felhasználó, csak neki van írásjoga a filerendszerben tárolt webdokumentumokra. Jogosultságait rendszerprogramok (pl. Apache DAV modul) használják, azonban kivételesen szükséges lehet a nevében dolgozni, ezért ennek a felhasználónak belépési joggal és valid shell-lel kell rendelkeznie:

useradd -c Webadminisztrator -g www-data -d /home/webadmin -m -s /bin/bash webadmin # alap csoportja a www-data!
chmod 750 /home/webadmin
passwd webadmin

Mivel ez a felhasználó a teljes webtartalomhoz hozzáfér, számára kellően erős jelszót érdemes beállítani. Relatív megjegyezhető, mégis erős jelszó a pwgen segédprogrammal is generálható, pl. a következőképpen:

/usr/bin/pwgen -s -n -c 12 1

Az esetleges shell loginhoz készítsük elő a nyilvános kulcsú távoli bejelentkezéshez szükséges állományokat:

export user='webadmin' group='www-data'
mkdir -m 500 /home/$user/.ssh
chown $user:$group /home/$user/.ssh
touch /home/$user/.ssh/authorized_keys2
chown $user:$group /home/$user/.ssh/authorized_keys2
chmod 400 /home/$user/.ssh/authorized_keys2
chattr +i /home/$user/.ssh/authorized_keys2

A fenti beállításokkal csak a root tud a webadmin felhasználó nevében történő bejelentkezéshez szükséges kulcsokat felvenni.

A webadmin alapvetően nem interaktív felhasználó, így ne hagyjuk, hogy a shelljére vonatkozó beállításokat interaktívan megváltoztassa:

chmod 440 /home/webadmin/.bashrc; chattr +i /home/webadmin/.bashrc
chmod 440 /home/webadmin/.profile; chattr +i /home/webadmin/.profile
chmod 440 /home/webadmin/.bash_logout; chattr +i /home/webadmin/.bash_logout 

A webadmin által létrehozott állományoknak nem szabad a csoportra nézve írásjoggal, illetve az other felhasználókra nézve semmilyen jogosultságokkal rendelkezniük - ezt a korábbi PAM umask beállítás biztosítja. Mielőtt a későbbi DAV hozzáféréseket kiadnánk, ellenőrzésképpen jelentkezzünk be webadminként, és hozzunk létre egy állományt a felhasználó home könyvtárában:

$ touch hello
$ ls -l hello

-rw-r-----  1 webadmin www-data 0 YYYY-MM-DD HH:MM hello

Ellenőrizzük, hogy a tesztfile a www-data csoportot kapja-e, és hogy a csoportnak nincs írásjoga (a webszerver a csoport jogán fogja olvasni az állományokat)! Ellenőrizzük továbbá, hogy a webadmin felhasználóval kiadott su (helyesen megadott root password esetén is) sikertelen:

$ su -
Password:
su: Permission denied

Megjegyzés: a felhasználó nincs benne az admin group-ban, így a korábbi PAM szigorítás miatt su-zni nem tud.

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/html/index.lighttpd.html tartalmát mutatja meg. Ezután, a további beállításig állítsuk le a webszervert:

systemctl stop lighttpd

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);
  • a wsm2-vel kompatibilis aliast és 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($|/)" {
    alias.url = ( "/munin/" => "/var/www/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:

  • tiltsuk le az SSLv2 és SSLv3 protokollokat (vagyis csak TLS-t engedélyezzünk) a POODLE támadás kivédésére;
  • tiltsuk le az RC4 cipher használatát (amely túlságosan gyenge).

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.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 -R webadmin:www-data /var/www
chmod -R o-rwx /var/www
chmod 2751 /var/www  # Muninnnak be kell lépni ide!

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

touch /var/www/html/index.html
chown webadmin:www-data /var/www/html/index.html
chmod 640 /var/www/html/index.html
mcedit /var/www/html/index.html
-rw-r----- webadmin www-data /var/www/html/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:

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

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

systemctl start lighttpd; systemctl status lighttpd; 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