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

Innen: AdminWiki

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.

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