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

A AdminWiki wikiből

Ebben a leírásban az Apache 2.4.x webszerver Debian Stretch 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.

Work in progress - még ne vedd komolyan!

Tartalomjegyzék

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:

# Fenntartott UID = 999, alap csoportja a www-data
useradd -c "Web Administrator" -r -u 999 -g www-data -d /home/webadmin -m -s /bin/bash webadmin
chmod 750 /home/webadmin
passwd webadmin

A korábbi Debian verziókhoz tartozó leírásban a UID nem volt rögzítve, ezt az esetleges migrációnál figyelembe kell venni! A felülről történő UID foglalás nem teljesen Debian-barát megoldás, jobbat találni TODO!

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