Apache 2.x (wsm2) telepítése (Wheezy)
Ebben a leírásban az Apache 2.x webszerver Debian Wheezy 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.
Tartalomjegyzék
Webes házirend
[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 virtualhostok DocRoot-ja a /var/www/virtualhost könyvtár.
- 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 publikus webszolgáltatást az Apache-SSL proxy (https) felől érjük el, 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ó 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 szerkesztői hozzáféréshez minden virtualhostra külön-külön basic authentication szükséges.
- A szerkesztői hozzáféréssel azonos 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
- TODO!
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.
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 hozá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.
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 lekéré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 # magával hozza: apache2-utils apache2.2-common, openssl, könyvtárak apt-get install libapache-mod-security libcrypt-ssleay-perl libgnupg-perl # magával hozza: mod-security-common sgml/xml library-k apt-get install libwww-perl # magával hoz sok Perl könyvtárat, kell a Munin monitorozáshoz (is). apt-get install geoip-bin libapache2-mod-geoip libgeoip1 apt-get install awstats libgeo-ipfree-perl libnet-dns-perl libnet-ip-perl libnet-xwhois-perl liburi-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 (It works!), majd sürgősen :-) állítsuk le:
/etc/init.d/apache2 stop
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.
Jelenleg a ModSecurity updater megköveteli, hogy a maintainer publikus GPG kulcsában teljesen megbízzunk, de ezt kulturáltan beállítani sajnos nem tudom (TODO!), ezért (ha most telepítettük) távolítsuk el a libgnupg-perl könyvtárat - így a script nem tudja meghívni a GnuPG-t és az ellenőrzést kihagyja (dirty hack - sorry):
apt-get remove --purge libgnupg-perl apt-get autoremove # ha maradt függőség
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.4 verziójú!) 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.4 alattiak pedig még nem Wheezy kompatibilisek!
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 certificate authority to use for websites. # If empty, a dedicated local CA will be generated for every virtualhost. DEFAULT_CA="" ################################################### # Perhaps isn't necessary to modify anything below.
- Amennyiben a szervernek van szerepneve, azt érdemes DEFAULT_HOSTNAME-ként felvenni.
- A DEFAULT_CA kitöltése akkor javasolt, ha rendelkezünk 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ánnyal, 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 CA tanúsítvány fájlnevét (a .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 ext3 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 (It works!) 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 a /etc/apache2/conf.d alá, így azok érvényesülnek (részben felüldefiniálva a maintainer által biztosított /etc/apache2/apache2.conf beállításait). Template alapján elkészíti továbbá a /etc/apache2/conf.d/wsm2.local á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.
- Letiltja a cgi és engedélyezi a szükséges dav_fs, expires, geoip, headers, mod-security, proxy_http, rewrite, ssl Apache modulokat.
- Beállítja a ModSecurity-t (TODO!).
- Készít egy virtualhostot a szerver teljes hostneve (hostname --fqdn) alapján, és ezt beállítja alapértelmezett virtualhostnak is (a maintainer által biztosított /etc/apache2/sites-available/default állományt elmenti és az új virtualhost konfigurációs állományára mutató symlinkkel helyettesíti).
- TODO!!!
- 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ő, akkor a böngésző biztonsági figyelmeztetést fog adni. Válaszképpen elfogadhatjuk a virtualhost (saját CA-ja által aláírt) webszerver tanúsítványát (kivétel hozzáadása), vagy ehelyett importálhatjuk a virtualhost http://fully.qualified.hostname/CA.crt helyről letölthető főtanúsítványát (megbízás csak webhelyek azonosítására beállítással). Mindkét beállítás megszünteti a biztonsági figyelmeztetést.
- 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 500-as (Internal Server Error) http hibaüzenetet kapunk, és a /var/log/apache2/[hostnév]-error.log állományban egy ModSecrity hibaüzenetet, a /var/log/apache2/ALLHOSTS-modsec.log állományban legfeljebb 5 perc késleltetéssel (a wsm2 v2.3 előtti verziókban a /var/log/apache2/ALLHOSTS-modsec-audit.log állományban és azonnal) 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ő). Megjegyzés: a wsm2 v2.3 előtti verzióiban egy hiba miatt minden ellenőrzés kétszer történik meg, így két, nagyjából egyforma sor fog megjelenni. 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, Linux parancssor: davfs - Lockolást a kliensben letiltani!, Windows XP: Intéző - webmappa, korábbi Windows: Total Commander plugin, 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 # nem x86-on nagyon sokáig (akár egy óráig is) futhat! (C kód helyett script) /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 wsm2 v2.3 utáni változataiban 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!
- Böngésző kliens azonosítás - TODO!
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 2.5 vagy magasabb verziójú wsm2 futtatása esetén 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:
/etc/init.d/apache2 stop 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 /etc/init.d/apache2 start
A ModSecurity szabálykészlet frissítése
A ModSecurity szabályait folyamatosan finomítják, fejlesztik. Ennek kihasználásához érdemes az alapvető szabálykészletet (core ruleset vagy crs) mindig napra készen tartani. Ez azonban nem triviális művelet, mert maga a ModSecurity motor jelenleg a disztribúcióhoz kötött, így nem frissül, viszont a crs-eket mindig a legfrissebb motorral tesztelik, így a visszamenőleges kompatibilitással lehetnek problémák.
Jelenleg a Wheezy-vel csomagolt ModSecurity motor 2.6.6 verziójú; az ehhez passzoló legfrissebb szabálykészlet a csomagolt 2.2.5-ös verzió. Emiatt CRS frissítés jelenleg nem lehetséges, a fejezet további része sajnos átléphető.
Technikailag a frissítések kiadását a wsm2 automatikusan, hetente ellenőrzi a
/etc/cron.weekly/modsec-update # Elavult! Wheezy-ben már nem szükséges! /etc/cron.weekly/modsec-update-owasp # Friss, csak Wheezy-hez!
cron job lefuttatásával, és ha van frissítés, az új szabálykészletet letölti és kicsomagolja a /etc/apache2/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 az automatikus frissítő valamiért nem működne, a mindenkori legfrissebb szabálykészlet a projekt GitHub könyvtárából manuálisan letölthető.
A szabálykészlet cseréjét forgalommentes időszakban érdemes elvégezni; ha lehet, előbb teszt környezetben, és csak a tapasztalatok birtokában a production szervereken. A cseréhez:
- Állítsuk le a webszervert:
invoke-rc.d apache2 stop
- 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/apache2/modsecurity/currentversion ln -s modsecurity-crs/X.Y.Z /etc/apache2/modsecurity/currentversion # Verziószámot töltsük ki! rm /etc/apache2/modsecurity/rules ln -s currentversion /etc/apache2/modsecurity/rules # Ezt csak egyszer kell módosítani, az első update alkalmával
- Aktiváljuk a /etc/apache2/modsecurity/currentversion könyvtárban lévő konfigurációs állomány(oka)t úgy, hogy a modsecurity_crs*.conf.example kiterjesztésekből modsecurity_crs*.conf-ot csinálunk (átnevezés, másolat vagy symlinkelés egyformán jó lehet) - megszerkeszteni általában nem kell ezeket;
- Érdemes belinkelni a wsm2-vel szállított errata állományt, amelyben az esetleges hibajavításokat (szabálymódosításokat) tároljuk. Ha a ruleset használata során módosítandó vagy használhatatlan szabályra bukkanunk (netes fórumok segítenek ebben), akkor a megfelelő SecRuleRemoveById, SecRuleUpdateTargetById, stb. szabályokat itt érdemes elhelyezni (ezek logikailag a rulesethez és nem a motorhoz vagy a virtualhostokhoz tartoznak).
ln -s ../../modsecurity_crs_99_errata.wsm2 /etc/apache2/modsecurity/currentversion/modsecurity_crs_99_errata.conf
- Indítsuk el a webszervert:
invoke-rc.d apache2 start
Sikertelenség esetén a motor és a ruleset inkompatibilitása valószínű - jobb híján keressünk megoldást a weben, 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 (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
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:
/etc/init.d/munin-node restart
Ha a Munin még nincs telepítve, akkor ezzel a beállítással nem kell foglalkoznunk, a Munin telepítésekor automatikusan lefutnak a fentiek.
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
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.d/wsm2-local állományban:
-rw-r--r-- root root /etc/apache2/conf.d/wsm2-local [...] # 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.
Jó teszt: TODO! - a maintainer által mellékelt
/usr/bin/perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl
a localhost-ot kérdezi, és úgy tűnik,hogy azt a mod_evasive20 sosem blokkolja. 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.
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; invoke-rc.d apache2 restart
Irodalom
- Apache 2.2 dokumentáció
- ModSecurity Handbook from Google Books