Lighty (lighttpd) telepítése (Wheezy)
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).
Tartalomjegyzék
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:
- 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 SSL compression-t a CRIME 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.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