Lighty (lighttpd) telepítése (Jessie)
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