Apache 2.x (wsm2) telepítése (Jessie)

Innen: AdminWiki
A lap korábbi változatát látod, amilyen KZoli (vitalap | szerkesztései) 2018. május 29., 21:56-kor történt szerkesztése után volt. (Új oldal, tartalma: „Ebben a leírásban az [http://www.apache.org/ Apache] 2.4.x webszerver Debian Jessie operációs rendszer alá történő telepítését ismertetjük. A leírt telepí…”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

Ebben a leírásban az Apache 2.4.x webszerver Debian Jessie operációs rendszer alá történő telepítését ismertetjük. A leírt telepítés a szervergépen több, önálló virtualhost alatti webszolgáltatás üzemeltetését teszi lehetővé, elkülönített szerkesztői hozzáférésekkel illetve látogatási statisztikával.

Webes házirend

Elméleti szakasz, nyugodtan átléphető, amennyiben csak telepítési checklistként használjuk ezt a leírást.

                      [ADMINISZTRÁCIÓS SZOLGÁLTATÁS   ]  [PUBLIKUS SZOLGÁLTATÁS         ]
Internet webmaster => [Apache 443: (webadmin:www-data)]  [Apache 80: (www-data:www-data)] <= Internet látogató
                                        |       |-- (proxy) -->            |
                                        V                                  V
[WEB TÁRTERÜLET  webmaster feltöltése        webalkalmazások által készített
[ (/var/www)     D: webadmin:www-data 2750 | www-data:www-data 2770 + acl: -d g::rwX (= force group rw inside) ]
[                F: webadmin:www-data  640 | www-data:www-data  660 + acl: group rw  (= webadmin is rw)        ]
  • A publikus webszolgáltatásokat alapvetően a 80-as TCP porton futó Apache webszerverrel nyújtjuk. Ugyanez a szolgáltatás Apache-SSL proxy útján elérhető SSL kapcsolaton, a 443-as TCP porton is.
  • Minden webszolgáltatás külön virtualhostba kerül. A virtualhost neve sok helyen használt egyedi azonosító, ajánlott formája egy fully qualified hostname (FQHN pl. www.mydomain.com). A virtualhostok DocRoot-ja a /var/www/virtualhost könyvtár (pl. /var/www/www.mydomain.com).
  • A /var/www-t tartalmazó partíció írható, de nem futtatható.
  • Minden virtualhost látogatói felületét a TCP:80-as porton az Apache webszerver szolgáltatja www-data nevében. Az egyes virtualhostokhoz nem tartoznak elkülönített Linux felhasználók.
  • Amennyiben a webszolgáltatást https felől érjük el (Apache-SSL proxy, WebDAV), a szerver oldalt igazoló SSL tanúsítvány virtualhostonként különböző lehet (Server Name Indication).
  • A /var/www alatt alapértelmezésben minden könyvtár webadmin:www-data 2750 (setgid), minden file webadmin:www-data 640 jogokkal rendelkezik (www-data-nak általában nincs írásjoga). A www-data által írható könyvtárak (alapértelmezésben /var/www/virtualhost/upload) jogai
    www-data:www-data 2750 (setgid) + -d g::rwX (acl)
    ami lehetővé teszi, hogy a könyvtárakban a www-data által létrehozott állományokhoz a webadmin-nak csoport jogán írás-olvasási joga legyen.
  • Minden virtualhosthoz önálló (web)szerkesztői hozzáférést adunk SSL WebDAV útján.
  • A WebDAV-ot a TCP:443-as porton ugyancsak az Apache szolgáltatja, de webadmin nevében; a /var/www alatt minden file-ra és könyvtárra írásjoga van.
  • A (web)szerkesztői hozzáféréshez minden virtualhostra külön-külön basic authentication szükséges.
  • A (web)szerkesztői hozzáféréssel megegyező authentikációval, a virtualhost/log alatt elérhetőek a virtualhost webszerver logjai.
  • A látogatási statisztikát időzítve (naponta egyszer) frissített statikus oldalakon (és nem CGI futtatásával) nyújtjuk.
  • A látogatási statisztika minden virtualhostra külön-külön a virtualhost/forgalom URL alatt, basic authentication után érhető el.

TODO: átgondolni, kiegészíteni!

Tanúsítványkezelés

A https kapcsolathoz szükséges (SSL) tanúsítványokat az alábbiak szerint kezeljük:

  • Alapértelmezésben server name indication-t (SNI) használunk, így az egyes virtualhostoknak külön-külön tanúsítványaik lehetnek.
  • Azokat a tanúsítványokat és privát kulcsaikat, amelyek közös használatúak (azaz nem egy-egy virtualhost számára dedikáltak), fizikailag a Debian alapértelmezett tanúsítványtároló könyvtáraiban (/etc/ssl/certs és /etc/ssl/private) helyezzük el (a kulcsokat szigorú, root:ssl-certs 640 fájlszintű jogosultságokkal).
  • Minden virtualhost a reá vonatkozó tanúsítvány(oka)t a /etc/apache2/auth.d/[virtualhost]/ könyvtáron keresztül érheti el. Amennyiben a tanúsítvány dedikált, akkor fizikailag is itt található; amennyiben közös használatú, akkor itt csak symlinkelve van.
  • Az Apache/OpenSSL telepítésekor létrejön egy alapértelmezett, önaláírt szervertanúsítvány (ssl-cert-snakeoil). A wsm2 symlinkeléssel gondoskodik arról, hogy ez a tanúsítvány az alapértelmezett (a wsm2 --configure parancs lefutásakor létrejövő) virtualhost nevével megegyező néven is elérhető legyen. Viszont, amennyiben a virtualhostokat a wsm2 segítségével hozzuk létre, ez a tanúsítvány nincsen használatban (kivéve, ha használatát explicit előírjuk).
  • A wsm2 által létrehozott virtualhostok esetében:
    • ha a létrehozatalkor kiadott wsm2 -cw parancsnak van harmadik paramétere és az létező web tanúsítványra mutat, akkor ez lesz a létrejövő virtualhost által használt (symlinkelt) tanúsítvány;
    • ha ez a paraméter létező aláíró tanúsítványra mutat, akkor a virtualhost számára egy dedikált web tanúsítvány keletkezik, amelyet az aláíró tanúsítvánnyal írunk alá;
    • ha ez a paraméter nincs megadva, vagy érvénytelen, akkor a virtualhost számára egy dedikált, önaláírt web tanúsítvány keletkezik;
    • ha a létrehozatalkor a wsm2 -cwca parancsot használjuk, akkor a virtualhost számára létrejön egy mini Certificate Authority amely rendelkezik egy újonnan készített aláíró tanúsítvánnyal (ez nem hiteles, hiszen nem írta alá fő tanúsítványszolgáltató, de teljesen funkcionális). A továbbiakban ez a CA tanúsítvány írja alá a virtualhost web illetve opcionális kliens tanúsítvány(ai)t, illetve használhatóak egyéb Certificate Authority funkciók (pl. a kiadott tanúsítványok nyilvántartása hosszabbítása, visszavonása, stb.).
  • Minden, használatban lévő (aktív Apache konfigurációban hivatkozott) tanúsítvány érvényességét naponta ellenőrzi a házirend szerinti telepítésben szereplő (a wsm2-nek részét nem képező, 3rd party) /etc/cron.daily/check-active-certs script, amely a közelgő lejáratról 30 nappal megelőzően értesítést küld.
  • TODO: átgondolni, kiegészíteni!

Webstatisztika

A webstatisztika készítésére az AWStats logelemzőt használjuk, amely a wsm2 integrációval a következő szolgáltatásokat nyújtja:

  • Éves és havi gyűjtés, megtekinthető frame-es szerkeszetű statikus HTML oldalakon.
  • A statisztika készítése, frissítése nem igényel beavatkozást.
  • Új virtualhost felvétele esetén a hozzá tartozó statisztika legkésőbb 24 óra múlva automatikusan létrejön.
  • A statisztika naponta egyszer, automatikusan frissül.
  • A látogatók földrajzi helyének meghatározására használt GeoIP adatbázis hetente egyszer, automatikusan frissül.

A statisztika működésének feltételei (a wsm2 használata biztosítja):

  • Minden virtualhost a /etc/apache2/sites-available/ valamelyik állományában van definiálva (a httpd.conf-ban vagy egyéb állományokban nincs virtualhost definíció).
  • Az Apache alapértelmezett formátumú combined access log-ot állít elő.
  • Az Apache access log a /var/log/apache2/ServerName-access.log állományban található, ahol a ServerName az azonos nevű Apache direktíva értéke.

A statisztika elérhetőségének feltételei (a wsm2 használata biztosítja):

  • Létezik, és a szokásos statikus web jogosultságokkal bír a /var/www/awstats könyvtár.
  • Létezik a https: /awstats -> /awstats/ServerName/ rewrite rule.
  • TODO: átgondolni, kiegészíteni!

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

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.

Tekintettel arra, hogy a webadmin lehet interaktív, számára a Midnight Commanderben is érdemes beállítani (F9, Beállítások, Alapbeállítások) a saját szövegszerkesztő használatát, illetve az XTerm ablak fejléc átírásának kikapcsolását (F9, Beállítások, Megjelenés, Xterm-ablakcím pipa ki, Mentés). Az mcedit-ben (F9, Beállítások, Általános) célszerű az új sorban automatikus behúzást (ha be lenne kapcsolva) és a látható tabulátorokat(!) kikapcsolni, végül a beállításokat elmenteni (F9, Beállítások, Beállítások mentése).

Apache webszerver és kiegészítői telepítése

A webszervert a ModSecurity web applikációs tűzfallal megerősítve és az AwStats logelemző és statisztikai programmal kiegészítve telepítjük.

  • A ModSecurity lehetővé teszi az Apache-on belül a HTTP kérések és a kimenő válaszok szűrését, és különböző akciók végrehajtását még a kérés érdemi feldolgozása illetve a válasz kiküldése előtt.
  • A webstatisztika készítésére szolgáló AWStats futtatható CGI-ként, így a forgalmi statisztika lekérésekor dinamikus weboldalakon generált, friss adatokat szolgáltat, illetve offline módban, amikor cron-ból indítva frissíti a statisztikai adatokat, és ezeket statikus HTML lapokon szolgáltatja. Jelenleg az utóbbi üzemmódot használjuk (napi egyszeri frissítéssel), amely nem enged hozzáférést a CGI esetleges biztonsági réseihez, és megakadályozza a terjedelmes statisztikák gyakori újrageneráltatásán alapuló DOS támadást.

Tekintettel arra, hogy ugyanazon Apache-nak két különböző felhasználó (www-data és webadmin) nevében kell futnia, azt mpm-itk üzemmódban telepítjük (ez egyben a PHP-nak megfelelő prefork architektúrát ad), valamint telepítjük a security modult, a GeoIP modult és az AwStats logelemzőt (és kiegészítőit) is:

apt-get install apache2-mpm-itk           # apache2 + libapache2-mpm-itk, openssl, ssl-cert, könyvtárak
apt-get install libapache2-mod-security2  # + modsecurity-crs, ca-certificates, könyvtárak
apt-get install libwww-perl               # magával hoz sok Perl könyvtárat, kell a Munin monitorozáshoz (is).
apt-get install libapache2-mod-geoip geoip-bin 
apt-get install awstats libgeo-ipfree-perl libnet-dns-perl libnet-xwhois-perl

A telepítés elindítja a még nem konfigurált webszervert. Egy, a telepítés alatt álló szervergépet HTTP-n elérő kliensről a http://IP.IP.IP.IP/ webcím böngészőben megtekintésével ellenőrizzük, hogy az alapértelmezett Apache működik-e, majd sürgősen :-) állítsuk le:

systemctl stop apache2

Mivel az AwStats CGI-t nem használjuk, ajánlatos a CGI könyvtárba települő Perl programot csak lokálisan, az offline statisztikát készítő root számára futtathatóvá tenni:

mount -o remount,rw /usr # átmenetileg írni kell a /usr-re
chmod 740 /usr/lib/cgi-bin/awstats.pl

valamint kommentezzük ki a /etc/cron.d/awstats összes taskját - ezzel kikapcsoltuk a telepítő által előírt (www-data nevében lefutó) tízpercenkénti frissítést.

A változtatások után a /usr csak olvashatóan újracsatolható:

mount -o remount /usr

Apache webszerver konfigurációja a wsm2 toolkittel

Az alábbiakban felépítjük a házirend szerinti webszolgáltatást. Ehhez töltsük le és telepítsük a legfrissebb (de legalább 2.6 verziószámú!) website-manager-2 toolkitet, és a /usr átmeneti írhatóvá tétele után:

mount -o remount,rw /usr

könyvtárhelyesen csomagoljuk ki a website-manager-2.tgz tartalmát.

Ügyeljünk a verziószámra: a website-manager korábbi, 1.x verziói csak Apache 1.x webszerverekhez alkalmazhatóak, a 2.x de 2.6 alattiak pedig csak Apache 2.2.x verziókat kezelnek, azaz még nem Jessie kompatibilisek! A verziószám megtekintése:

wsm2 | grep -i 'version'

Ellenőrizzük, szükség szerint szerkesszük meg a /etc/default/wsm2 állomány elején lévő beállításokat:

-rw-r--r-- root root /etc/default/wsm2

# Common literals for Website-Manager-2. This is a shell script fragment, handle with care!
# Part of the website-manager-2 package.

# Default hostname used on creation of default virtualhost (wsm2 --configure).
# If empty machine's fully qualified hostname will be used.
DEFAULT_HOSTNAME=""
DEFAULT_HOSTNAME="${DEFAULT_HOSTNAME:-$(/bin/hostname --fqdn)}"

# Default email address used on virtualhost creation (wsm2 -cw).
# You may change to your real administrative email address.
# If empty root@DEFAULT_HOSTNAME will be used.
DEFAULT_EMAIL=""
DEFAULT_EMAIL="${DEFAULT_EMAIL:-root@$DEFAULT_HOSTNAME}"

# Global web certificate or certificate authority to use for websites.
# Specify only the filename of this web- or CA certificate below,
# without path and without file extension (e.g. to use the  Debian's default
# web certificate for every virtualhosts, write "ssl-cert-snakeoil").
# If empty, separated, self-signed web certificates will be generated
# for every virtualhost.
DEFAULT_CERT=""
  • Amennyiben a szervernek van szerepneve, azt érdemes DEFAULT_HOSTNAME-ként felvenni.
  • A DEFAULT_CERT kitöltése akkor javasolt, ha rendelkezünk valamennyi leendő virtualhostunkra érvényes web tanúsítvánnyal (pl. céges intranet környezetben a cég intranet domain nevére érvényes - *.domain.org alakú neveket tanúsító UCC - szervertanúsítvánnyal, vagy van olyan, leendő felhasználóink által elismert (pl. céges környezetben a cég tulajdonában álló) tanúsítványszolgáltató (CA certificate) tanúsítványunk, amely leendő virtualhostjaink https kapcsolathoz szükséges tanúsítványait képes aláírni (igazolni). Ez esetben a /etc/ssl/certs illetve /etc/ssl/private könyvtárakba telepített web- vagy CA tanúsítvány fájlnevét (a crt vagy .pem illetve .key kiterjesztés nélkül) írjuk be az állományba.

Ezután (továbbra is írható /usr mellett!) adjuk ki a

wsm2 --configure

parancsot, ami az alábbiakat fogja beállítani (csak tájékoztatás, teendő nincs vele):

  • Készít egy (rotált) logállományt (/var/log/wsm2.log), amelyben a wsm2 aktivitásai (így ez a telepítés is) megtekinthetőek. A logállományban benne vannak a létrehozott virtualhost felhasználók adatai és jelszavai is (ezért került ki ez a log a web adminisztrátorok által olvasható /var/log/apache2 hierarchiából).
  • Megváltoztatja az Apache webroot (/var/www) jogosultságait (webadmin:www-data 2751) és felállít egy ACL szabályt annak érdekében, hogy a /var/www-ben létrejövő állományokra az others-nek ne legyen semmilyen joga. Letörli az alapértelmezett index.html állományt.
  • Elkészíti a /etc/apache2/auth.d könyvtárat, amelyben az egyes Apache felhasználók (basic) authentikációs állományai kapnak helyet.
  • Elkészíti a /var/lock/apache2-mpm-itk könyvtárat, amelyben a www-data csoport tagjai létrehozhatnak zárolásokat. Erre azért van szükség, mert a maintainer által biztosított lock könyvtárba csak a www-data felhasználó írhat (ezt az Apache minden indításakor ellenőrzi, beállítja), viszont az mpm-itk modellben más Linux felhasználó is futtathat Apache processzeket (esetünkben az SSL kiszolgálás a webadmin nevében történik).
  • Módosítja a /var/log/apache2 könyvtár jogosultságait úgy, hogy abban a webadmin felhasználónak legyen olvasási joga (így a virtualhostokban elhelyezett symlinkeket követve azok saját logjai https-en, adminisztrációs authentikáció után olvashatóak lesznek).
  • A wsm2 globális Apache beállításait tartalmazó (a /usr/local/... alatti, R/O) állományt belinkeli az Apache konfigurációs könyvtárába, így ezek a beállítások érvényesülnek (részben felüldefiniálva a maintainer által biztosított konfigurációk beállításait). Ugyanitt elkészíti a wsm2-local.conf konfigurációs állományt, ahova a továbbiakban az egész Apache-ra kiterjedő (nem virtualhost szintű) saját beállításainkat írhatjuk. Célszerű minden saját globális beállítást itt elhelyezni, és a maintainer állományaihoz nem nyúlni (ez megkönnyíti a frissítéseket).
  • Template alapján elkészíti az urlcheck működését szabályozó /etc/apache2/urlcheck.exception és /etc/apache2/urlcheck.hosts állományokat.
  • Elkészíti az AwStats eredmények statikus web tárhelyét (/var/www/awstats) és a /usr/local/bin-be symlinkeli az ezek elkészítéséhez szükséges, a maintainer által biztosított Perl scripteket.
  • Frissíthető helyre (/var/lib/geoipfree) mozgatja a maintainer által a /usr hierarchiában létrehozott GeoIPFree és GeoLite Country adatbázisokat. Ezek heti rendszerességű frissítéséről a website-manager-2 kicsomagolásakor telepített cron job-ok gondoskodnak.
  • Letiltja a cgi és cgid Apache modulokat, engedélyezi a szükséges extra (authz_groupfile, dav_fs, expires, headers, proxy_http, rewrite, ssl) modulokat.
  • Beállítja a ModSecurity-t: megfelelő jogosultságokkal elkészíti a szükséges munkakönyvtárakat, illetve a /etc/modsecurity alatt a frissíthető szabálykészlet (CRS) alapkönyvtárát, ahova belinkeli a maintainer által biztosított szabálykészletet. A szabálykészlet heti rendszerességű frissítéséről (a Debian frissítésétől függetlenül) a website-manager-2 kicsomagolásakor telepített cron job-ok gondoskodnak. Template alapján összeállít egy ModSecurity alapkonfigurációt (wsm2-modsec.conf) és bemásolja azt az Apache konfigurációs könyvtárába.
  • Készít egy virtualhostot a szerver teljes hostneve (hostname --fqdn) vagy a konfigurált DEFAULT_HOSTNAME alapján, és ezt beállítja alapértelmezett virtualhostnak is (a maintainer által biztosított default virtualhost konfigurációs állományt elmenti és az új virtualhost konfigurációs állományára mutató symlinkkel helyettesíti).
  • Végül elindítja a webszervert az új konfigurációval.

A konfiguráció lefutása során a wsm2 a képernyőre írja az auditor (webstatisztika olvasására jogosult) és webmaster (logok olvasására és https DAV feltöltésre jogosult) virtualhost felhasználók jelszavát, valamint a példa kliens tanúsítvány böngészőbe importálásához szükséges jelszót; ezeket jegyezzük fel (ha ezt elmulasztanánk, később a /var/log/wsm2.log állományból elővehetőek).

Sikeres konfigurálás után a /usr csak olvashatóan újracsatolható:

mount -o remount /usr

Gyorstesztek

  • A publikus webszolgáltatás ellenőrzésére egy, a telepítés alatti szervert grafikus böngészőn elérő munkaállomáson böngészőprogrammal kérjük le a http://IP.IP.IP.IP weboldalt - az alapértelmezett virtualhost nyitólapját kell megkapjuk (ezen csak a hostnév szerepel). Ha a telepítés alatti szerverre mutatnak DNS rekorodok, az ezek alapján indított web lekérések is ugyanezt az eredményt adják. Valamennyi lekérésünk a /var/log/apache2/[hostnév]-access.log állományban jelenik meg.
  • A https webszolgáltatás ellenőrzésére a fenti lekéréseket ismételjük meg https:// protokollal is (erre ugyanazt az eredményt kell kapjuk, mert a különlegesen kezelt /awstats, /forgalom és /log könyvtáraktól eltekintve az SSL reverse proxyként a publikus webet adja vissza). Ha a virtualhost tanúsítványát magunk állítottuk elő (nem adtunk meg DEFAULT_CERT értéket), akkor az önaláírt tanúsítvány miatt böngésző biztonsági figyelmeztetést fog adni, amit vegyünk tudomásul (kivétel hozzáadása).
  • Ellenőrizzük a https szolgáltatást a Qualys SSL Labs teszt eszközével is; helyes beállítás esetén önaláírt tanúsítvánnyal T/A, hitelesített tanúsítvánnyal A osztályzatot kell kapjunk.
  • A ModSecurity ellenőrzésére szimuláljuk egy "támadás" kivédését (ismert security analyser robot kizárását) az alábbi parancssor kiadásával:
wget -S --spider --user-agent='dummyagent' localhost # Normál lekérés
wget -S --spider --user-agent='webinspect' localhost # Szimulált támadás

Helyes működés esetén az első esetben a lekérés sikeres, a második esetben 403-as (Forbidden) http hibaüzenetet kapunk, és a /var/log/apache2/[hostnév]-error.log állományban egy, a ModSecrity-ra utaló hibaüzenetet, a /var/log/apache2/[hostnév]-audit.log állományban egy ModSecurity naplóüzenetet, míg a /var/log/apache2/[hostnév]-modsec.log állományban - legfeljebb 5 perc késleltetéssel - a lekérés és a válasz részletes naplózását találjuk.

  • A logok ellenőrzésére kérjük el a http://IP.IP.IP.IP/log weboldalt, ahol https-re átirányítást követően webmaster felhasználóként bejelentkezve megtekinthetjük illetve letölthetjük a virtualhost Apache logállományait (mindig csak a legutóbbi, még nem rotált állományokat).
  • Az urlcheck szolgáltatás (lényegében minden engedélyezett virtualhost ServerName URL-jének periodikus lekérése) ellenőrzésére adjuk ki az alábbi parancsot:
urlcheck_scanhosts

Válaszul egyetlen sornak kell megjelennie, amely a webszerver alapértelmezett virtualhostjának egyszeri ellenőrzését dokumentálja, az alábbi formában:

YYYY:MM:DD:hh:mm:ss YYYY:MM:DD:hh:mm:ss FULLY.QUALIFIED.HOSTNAME 200 OK

ahol az első időadat a lekérés kiadása, a második a válasz megérkezése (a kettő különbsége a válaszidő). Ezután adjuk ki a

urlcheck_scanhosts | urlcheck_distlogs

parancsot, és ellenőrizzük a /var/log/apache2/ALLHOSTS-modsec.log illetve /var/log/apache2/[hostnév]-modsec.log naplók létrejöttét, tartalmát. A fenti parancs fél óránként időzítetten is lefut (/etc/cron.d/wsm2), és hiba esetén a hibás kimenetet email-ben a root-nak küldi.

  • A https DAV ellenőrzésére egy alkalmas DAV klienssel (pl. Ubuntu Linux, Gnome fájlkezelő: Kapcsolódás kiszolgálóhoz davs://FULLY.QUALIFIED.HOSTNAME/; Linux parancssor: davfs - Lockolást a kliensben letiltani!; Windows: Total Commander plugin vagy Cyberduck; Java: DAV Explorer) nyissuk meg a https://IP.IP.IP.IP webhelyet. Authentikáció (webmaster) után lehetőségünk van módosítani pl. a virtualhost nevét tartalmazó index.html-t, illetve a virtualhost alá feltölteni új file-okat, könyvtárakat. Az eredményt látnunk kell a böngészőben, authentikáció nélkül(!) mind a 80-as (http), mind a 443-as (https) porton. A DAV-val nem szabad hozzáférnünk a statisztikai- és log könyvtárakhoz (a könyvtár látszik, de nem lehet belépni, és a tartalma nem másolható ki).
  • A helymeghatározáshoz szükséges GeoIPFree és GeoLite Country adatbázisok Internetről történő frissítésének ellenőrzéséhez adjuk ki az alábbi (egyben a heti automatikus frissítést is beütemező) parancsot:
/etc/cron.weekly/geoipfree-update
/etc/cron.weekly/geolite-update

A sikeres frissítést üzenet jelzi. Hiba esetén elsőként a /etc/default/wsm2-geoipfree illetve /etc/default/wsm2-geolite állományokban megadott frissítő URL-ek elérhetőségét ellenőrizzük.

  • A webstatisztika frissítésének és elérhetőségének ellenőrzéséhez adjuk ki a napi frissítést végző (alapértelmezésben kora reggelre beütemezett)
/etc/cron.daily/awstats

parancsot, amely üzenetben tájékoztat az imént elkészített virtualhost statisztikai eredménylapjainak létrehozataláról. Ha a script lefutott, böngészőben nyissuk meg a http://IP.IP.IP.IP/forgalom webhelyet, és az automatikus https-re váltás után auditor-ként bejelentkezve ellenőrizzük a webstatisztika elérhetőségét és tartalmát.

  • A webcron ellenőrzéséhez a virtualhost gyökérkönyvtárában lévő .htcrontab állomány végére írjunk egy sort:
[...]
* * * * * http://www.debian.org

amely a fenti URL percenkénti urlcheck ellenőrzését ütemezi be, és egy perc múlva ellenőrizzük a virtualhost gyökérkönyvtárából nyíló log/webcron.log naplóállomány létrejöttét illetve tartalmát. Sikeres teszt után ne felejtsük el törölni a beütemezett webcron sort!

Ha a fenti gyorstesztelés sikeres, nagy valószínűséggel rendelkezünk egy házirend szerinti, egyelőre statikus webszolgáltatásra alkalmas, a wsm2-vel menedzselhető webszerverrel.

Egyéb beállítások

Az Apache által használt SSL certificate újragenerálása

A wsm2 újabb verzióiban a közös szerver tanúsítvány használata helyett a virtualhostonkénti tanúsítvány és Server Name Indication használata az alapértelmezett, így a közös szerver tanúsítvány nincs használatban. Emiatt az alábbiak végrehajtása opcionális.

Az openssl telepítésekor létrejön egy alapértelmezett self-signed SSL szerver tanúsítvány (/etc/ssl/certs/ssl-cert-snakeoil.pem), amelyet a wsm2 belinkel az Apache számára. Érdemes ezt a linkelt tanúsítványt egy "rendesen kitöltöttre" cserélni. Ehhez lépjünk be egy átmeneti könyvtárba (pl. /root/tmp) és adjuk ki az alábbi parancsokat:

cd /root/tmp
export DAYS=360 FQHN="FULLY.QUALIFIED.HOSTNAME" 
echo $FQHN $DAYS # Biztos, ami biztos :-)

openssl genrsa -out $FQHN.key 2048 # Private key
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á
mv $FQHN.crt $FQHN.pem # Nevezzük át

A kitöltésnél ügyeljünk arra, hogy a FQHN egyezzen meg a tanúsítvány Common Name mezejével! Ezzel létrehoztunk egy egy évig érvényes self-signed tanúsítványt. A webszerver átmeneti leállításával másoljuk ezt a /etc/ssl könyvtárba, felülírva a wsm2 által elhelyezett linkeket:

systemctl stop apache2
rm  /etc/ssl/certs/$FQHN.pem; cp $FQHN.pem /etc/ssl/certs/$FQHN.pem 
rm  /etc/ssl/private/$FQHN.key; cp $FQHN.key /etc/ssl/private/$FQHN.key
# Ezek már nem kellenek
rm $FQHN.csr $FQHN.key $FQHN.pem
systemctl start apache2

A fenti eljárással egy kb. egy évig érvényes, önaláírt szervertanúsítványt készítettünk, amelyet pl. az alábbi paranccsal tekinthetünk meg:

openssl x509 -text -noout -in /etc/ssl/certs/$FQHN.pem | less

Web tanúsítványok érvényességének monitorozása

A szervergép házirend szerinti alaptelepítésében ez a lépés szerepel, így (opcionálisan) csak akkor érdemes itt végrehajtani, ha valamilyen okból az SSL tanúsítványok érvényességét figyelő scriptet még nem telepítettük.

Az alábbi, innen származó scriptek ellenőrzik a szervergép meglévő SSL tanúsítványait (így a használatban lévő web tanúsítványokat is) és figyelmeztető levelet küldenek, ha a következő 30 napban valamelyik lejárna.

# Az ellenőrző script letöltése
wget 'http://howto.biapy.com/fr/debian-gnu-linux/serveurs/http/mettre-en-place-une-notification-par-email-de-l-expiration-des-certificats-ssl-tls/ssl-cert-check/at_download/file' \
--output-document='/usr/local/bin/ssl-cert-check'
chmod 755 /usr/local/bin/ssl-cert-check

# A tanúsítványokat megkereső és az előzőt meghívó, ütemező script letöltése és egy hibajavítás
wget -q -O- 'http://howto.biapy.com/fr/debian-gnu-linux/serveurs/http/mettre-en-place-une-notification-par-email-de-l-expiration-des-certificats-ssl-tls/check-active-certs/at_download/file' |\
sed "s/ grep -r/ grep -R/g" >/etc/cron.daily/check-active-certs
chmod 755 /etc/cron.daily/check-active-certs

Ez a script jelenleg nem figyeli a használatban lévő CA és kliens tanúsítványokat - TODO!

A ModSecurity szabálykészlet manuális frissítése

Debian Jessie alatt a ModSecurity alapvető szabálykészletének (core ruleset vagy crs) frissítéséről maga a Debian gondoskodik, ennélfogva az alábbiak végrehajtása opcionális.

A ModSecurity programját (engine) és szűrőszabályait külön fejlesztik, az alapvető szabálykészletet mindig napra készen érdemes tartani. A Jessie-ben elvileg szinkronban van a libapache2-mod-security2 (motor) és modsecurity-crs csomag, így a frissítésről maga a Debian is gondoskodik. Az alábbi szakasz arra az esetre vonatkozik, ha valamilyen okból a crs frissítéseket magunk szeretnénk elvégezni. Erre a wsm2 beépített lehetőséget ad (a korábbi Debian kiadásokban erre szükség is volt, mert a szabálykészletet a maintainer nem frissítette).

Technikailag a crs frissítések kiadását a wsm2 a Debian csomagkezelőtől függetlenül, közvetlenül a projekt GitHub könyvtárából automatikusan, hetente ellenőrzi a

/etc/cron.weekly/modsec-update-owasp

cron job lefuttatásával, és ha van frissítés, az új szabálykészletet letölti és kicsomagolja a /etc/modsecurity/modsecurity-crs/X.Y.Z (verziószámmal jelölt) könyvtárba. Mivel a szabálykészlet cseréje kritikus művelet, azt a wsm2 nem végzi el, hanem a rendszergazdát levélben értesíti.

Ha opcionálisan úgy döntünk, hogy a szabálykészlet frissítését nem bízzuk a Debianra, és a maintainer által biztosított szabálykészlet helyett a fenti frissítésekkel beszerzetteket telepítjük és használjuk, akkor:

  • Állítsuk le a webszervert:
systemctl stop apache2
  • Irányítsuk át a szabálykészletre mutató symlinkeket az új változatra (az alábbi parancssorokkal vagy pl. a mc CTRL-x, CTRL-s parancsával):
rm /etc/modsecurity/currentversion
ln -s modsecurity-crs/X.Y.Z /etc/modsecurity/currentversion  # Verziószámot töltsük ki!

rm /etc/modsecurity/rules
ln -s currentversion /etc/modsecurity/rules                  # Ezt csak egyszer kell módosítani, az első update alkalmával
  • Ellenőrizzük az aktivált szabályok meglétét a /etc/modsecurity/rules/activated_rules könyvtárban! A frissítőprogram symlinkeléssel érvényesíti a szabálykészlet fő beállító állományát is (*-setup.conf.example), így ezzel nincs tennivalónk. Érvényben marad továbbá a wsm2 hibajavító (errata) szabálykészlete (/etc/modsecurity/modsecurity_crs_99_errata.wsm2) is.
  • Az ellenőrzéseket követően indítsuk el a webszervert:
apachectl configtest    # Biztos, ami biztos....
systemctl start apache2

Sikertelenség esetén állítsuk vissza a currentversion és rules symlinkeket úgy, hogy egy korábbi, működő állapotra mutassanak.

  • Ellenőrizzük a ModSecurity működését legalább a telepítésnél használt GO/NOGO teszttel:
wget -S --spider --user-agent='dummyagent' localhost # Normál lekérés
wget -S --spider --user-agent='webinspect' localhost # Szimulált támadás

A keletkező Apache error logban a szabálykészlet verziószáma: [rev "X.Y.Z"] szerepel. TODO: szofisztikáltabb teszt!

Apache naplórend módosítása

A Debian Jessie Apache csomagjainak alapértelmezései szerint, a webnaplókat naponta rotáljuk és 14 napra visszamenőleg őrizzük meg. Noha a közönséges webszolgáltatás (tartalomszolgáltatás), önmagában, jelenleg, valószínűleg nem tartozik a 2003. évi C. törvény (elektronikus hírközlési törvény, EHT) hatálya alá (nincsen felsorolva a 159/A paragrafus - Bűnüldözési, nemzetbiztonsági és honvédelmi célú adatmegőrzési kötelezettség - használati esetei között), a jelenlegi magyar viszonyok között célszerűnek tűnik a webnaplókat ezen paragrafus (3) szakasza alapján, kb. egy évig megőrizni. Ezzel, valószínűleg, nem sértünk más jogszabályt (TODO!).

Ehhez opcionálisan módosítsuk az Apache csomaggal telepített beállító állományt:

-rw-r--r-- root root /etc/logrotate.d/apache2

/var/log/apache2/*.log {
        weekly
        missingok
        rotate 53
        [...]

Megjegyzés: relatív alacsony forgalmú webhelyeken, az alapértelmezett napi rotációnál a heti rotálás előnyösebbnek tűnik (kevesebb fájl, egyszerűbb kereshetőség).

Apache (system) felhasználók levelezésének átirányítása

A webszolgáltatások a www-data (illetve https esetén webadmin) felhasználó nevében küldhetnek levelet. Ennek sikertelensége vagy visszapattanása esetén a levelet a root postafiókjába célszerű irányítani:

-rw-r--r-- root root /etc/aliases

[...]
www-data: root
webadmin: root

Apache monitorozásának engedélyezése a Munin számára

Ha a Munin még nincs telepítve, akkor ezzel a beállítással most nem kell foglalkoznunk, a Munin telepítésekor automatikusan lefutnak az alábbiak.

A wsm2 által telepített konfiguráció engedélyezi a server-status lekérdezését a localhost számára, így (ha a Munin már telepítve van) a megfelelő Munin plugin-ok monitorozni tudják a webszerver tevékenységét. Ennek engedélyezésére kérjük le a szükséges symlinkek listáját:

munin-node-configure --suggest --shell

és hozzuk létre azokat, majd indítsuk újra a munin-node-ot:

systemctl restart munin-node

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

A webszerver démonja(i) állandóan fut(nak), így a biztonsági figyelmeztetések elkerülése érdekében be kell jegyezni az Apache-ot a tigerrc állományba:

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

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

Opcionális Apache kiegészítők

Az alábbi kiegészítőket rutinszerűen ne telepítsük, csak ha ténylegesen szükség van rájuk!

ModEvasive

A ModEvasive Apache modul telepítésének opcionálisan, (D)DoS-támadásokkal fenyegetett webszerver esetén van értelme. Az eszköz karbantart egy hash táblát a beérkező lekérések IP címeiről, és 403-as (Forbidden) HTTP hibát ad vissza, ha az IP ugyanazt az URL-t kéri el "túl gyakran", vagy egyáltalán "túl gyakran" küld lekérést.

Debian csomagból telepíthető:

apt-get install libapache2-mod-evasive

Telepítés után állítsuk be a paramétereket a /etc/apache2/conf-available/wsm2-local.conf állományban:

-rw-r--r-- root root /etc/apache2/conf-available/wsm2-local.conf

[...]
# Defense against overload
<IfModule mod_evasive20.c>
    DOSHashTableSize 3097
    DOSPageCount 20
    DOSPageInterval 1
    DOSSiteCount 100
    DOSSiteInterval 1
    DOSBlockingPeriod 10
    #DOSLogDir "/var/cache/apache2/mod_evasive_cache"
    #DOSEmailNotify root@localhost
    #DOSWhiteList 127.0.*.*
</IfModule>

A megadott beállításokkal a blokkolás egy IP-ről egy URL egy másodpercen belül húszszori elkérése vagy egy IP-ről egy másodpercen belül 100 párhuzamos lekérés esetén lép életbe és 10 másodpercig tart.

A teszteléshez az alapértelmezett virtualhoston átmenetileg kapcsoljuk ki a ModSecurity-t.

Go/Nogo tesztként a Munin (távoli böngészőn keresztül nézett) weboldala használható: a DOSSiteCount 10-re csökkentése után a képek jelentős része nem frissül és az error.log-ban megjelennek a 403-as hibák. Jó teszt: TODO!

A tesztelés végeztével ne feledkezzünk meg a ModSecurity visszakapcsolásáról!

A ModEvasive (tudtommal) virtualhostonként nem kapcsolható ki, csak a teljes modul kikapcsolásával állítható le:

a2dismod mod-evasive; systemctl restart apache2

Irodalom