CIV:Granty/Zvýšení bezpečnosti webhostingu

Z HelpDesk
Zvýšení bezpečnosti webhostingu
Základní údaje
Agentura Fond Rozvoje CESNET, z.s.p.o
Evidenční číslo 475/2013
Stav Ukončen
Lidé
Řešitel Ing. Petr Benedikt
Spoluřešitel Ing. Michal Švamberg
Termíny
Začátek 19.6.2013
Konec 19.12.2014
Dokumentace
Žádost 5.3.2013
Závěrečná zpráva 19.2.2015


Obsah projektu

Projekt se zabývá zvýšením bezpečnosti webhostingových serverů na Západočeské univerzitě v Plzni. Webhosting je nejexponovanější službou v organizaci, přes kterou bývá aktuálně vedeno největší množství útoků. Aktuální stav, který byl adekvátní situaci před několika lety, je již z hlediska bezpečnosti nedostačující. Cílem projektu je zajistit izolaci webhostingových projektů tak, aby zranitelnost jednoho nemohla ohrozit provoz ostatních služeb.

Popis provedených úprav

Spouštění vlastních instancí Apache centrální proxy server

Hlavní bodem projektu bylo zajistit větší izolaci jednotlivých webů. Toho bylo docíleno spouštěním vlastní instance Apache pro každý jednotlivý web. Nicméně abychom mohli nadále provozovat více webů na jediné IP adrese, bylo nutné koncentrovat i nadále přístup k těmto webům přes jediný přístupový bod, proxy server. Proxy server je opět instance Apache, která zastává funkci vstupního rozhraní, má povolené jen nejnutnější moduly a nemá přístup k souborovému systému, pouze předává požadavky na příslušnou instanci, pod kterou běží přistupovaný web. Schéma webhostinogvého serveru a funkce proxy serveru je naznačena na následujícím obrázku.

Schéma webhostingu s reverzní proxy

Další výhodou tohoto řešení je možnost zavěsit za proxy server i jiné aplikace webového serveru jako např. NGINX, Tomcat, Brick, Node.js apod.

Konfigurace proxy serveru

Pro funkci proxy serveru je potřeba mít zapnuté následující moduly:

proxy
proxy-http
ssl
alias
webauth

Konfigurace proxy webu (/etc/apache2-proxy/sites-enabled/web1.zcu.cz) pak vypadá následovně:

<VirtualHost 147.228.x.x>
        ServerAdmin operator@service.zcu.cz
        ServerName web1.zcu.cz
        ServerAlias www.web1.zcu.cz

        Redirect permanent / https://web1.zcu.cz  # automaticky přesměruj na zabezpečené připojení přes HTTP

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost 147.228.x.x:443>
        ServerAdmin operator@service.zcu.cz
        ServerName web1.zcu.cz
        ServerAlias www.web1.zcu.cz

        ProxyPass / http://localhost:8081/   # instance Apache na lokální portu
        ProxyPassReverse / http://localhost:8081/

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

     <Location / >
        AuthType WebAuth   # web vyžaduje přihlášení přes univerzitní SSO
        Require privgroup CIV
        RequestHeader set "REMOTE-USER" "%{WEBAUTH_USER}e"   # proxy předává uživatelské jméno lokální instanci pomocí proměnné WEBAUTH_USER
     </Location>

        SSLEngine on
        SSLCertificateFile    /etc/ssl/web1.cert/server.crt
        SSLCertificateKeyFile /etc/ssl/web1.cert/server.key
        SSLCertificateChainFile /etc/ssl/web1.cert/ca-chain.pem
</VirtualHost>

Konfigurace instance Apache pro web1

Konfigurace vlastní instance Apache pro web1 (/etc/apache2-web1/sites-enabled/web1.zcu.cz'):

<VirtualHost localhost:8081>
        ServerAdmin webmaster@localhost
        ServerName web1.zcu.cz
        ServerAlias web1.zcu.cz web1 www.web1

        DocumentRoot /afs/zcu.cz/project/www/www-web1/

        WaklogEnabled on
        WaklogLocationPrincipal web/web1.zcu.cz /etc/keytabs/web1.keytab

        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/inst1/>
                Options -Indexes FollowSymLinks
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Pro vytvoření vlastní instance je využíván upravený skript dostupný s balíkem Apache. Popis skriptu je k dispozici v /usr/share/doc/apache2.2-common/README.multiple-instances a samotný skript je umístěn v /usr/share/doc/apache2.2-common/examples/setup-instance.

Pro vytváření nových instancí je potřeba mít připravenou vzorovou konfigurační složku, která obsahuje základní konfigurační soubory instance. Umístění složky je možné upravit ve skriptu. Skript je vhodné přesunout do vlastní složky a upravit dle potřeby.

Pro vygenerování nové instance pak stačí spustit skript z příkazové řádky s parametrem <suffix>, který slouží k označení nové instance (např. web1 nebo číslo portu):

root@webhost:~# bash /usr/share/doc/apache2.2-common/examples/setup-instance 
usage: /usr/share/doc/apache2.2-common/examples/setup-instance <suffix>

Po vygenerování instance je potřeba nastavit vlastní port v /etc/apache2-web1/ports.conf a uživatele, pod kterým bude instance spouštěna, viz dále.

Každá instance Apache pro jednotlivé weby má vlastního lokálního uživatele, kterým je zajištěno, že instance může přístupovat jen k vlastnímu keytabu.

root@webhost:~# l /etc/keytabs/web1.keytab 
-rw------- 1 www-8081 www-8081 635 23. led  2013 /etc/keytabs/web1.keytab

V /etc/apache2-web1/envvars je potřeba upravit následující proměnné:

export APACHE_RUN_USER=www-8081
export APACHE_RUN_GROUP=www-8081

Kontrolovaný přístup k AFS

Veškerá data webů jsou ukládána na distribuovaném souborovém systému AFS. Pro přístup k AFS je potřeba, aby stroj, resp. aplikace měla vygenerovanou kerberos identitu v keytabu a tato identita měla nastavená příslušná práva do složek AFS. Původní koncept přeřazoval identitu pro celý stroj a tato identita měla přístup do celého stromu adresářů, kde byly složky všech webů. Toto bylo přepracováno a nyní každý web má vlastní identitu, která má přístup pouze do jediné složky, která přísluší danému webu. K nastavení indetity pro samostatnou instanci Apache je využíváno modulu waklog. Po instalaci modulu je nutné jej aktivovat a v konfiguračním souboru /etc/apache2-web1/mods-enabled/waklog.conf nastavit příslušnou AFS buňku.

WaklogAFSCell zcu.cz

Pro nastavení identity pomocí waklog stačí v konfiguraci webu uvést následující direktivy:

        WaklogEnabled on
        WaklogLocationPrincipal web/web1.zcu.cz /etc/keytabs/web1.keytab # nastavuje cestu k příslušnému keytabu

Na AFS je potřeba nastavit potřebná práva do složky:

root@webhost:/afs/zcu.cz/project/www/www-web1$ fs la
Access list for . is
Normal rights:
  system:administrators rlidwka
  web.web1.zcu.cz rl #dle potřeby je možné nastavit práva v rozsahu 'rlidwk'

V nadřazených složkách pak stačí mít přístup pro skupinu s právem pouze 'l' = list, do které můžeme přidávat další identity webů. Skupina v nadřazených složkách tedy nebude moci číst data, ale bude moci se dostat hlouběji ve struktuře ke své odpovídající složce, ale ne k žádné jiné.

Vynucení provozu přes HTTPS

V nové konfiguraci webových projektů jsme zavedli politiku pro vynucování provozu přes zabezpečný protokol SSL na portu 443. Toho je dosaženo jednoduchým přesměrováním veškerého přenosu na portu 80 na zabezpečený port 443.

Redirect permanent / https://web1.zcu.cz

Zabezpčený provoz přes HTTPS samozřejmě vyžaduje certifikát. Dříve bylo možné mít na jedné IP adrese pouze jedinný certifikát, nicméně to již v dnešní době neplatí a s rozšíření SNI (Server Name Indication) je možné provozovat na jediné IP adrese mnoho samostatných certifikátů. SNI již v dnešní době podporuje většina moderních webových prohlížečů.

Sledování aktualizací

Pro sledování aktualizací a bezpečnostních problémů aplikace Apache, či celého systému Linux je možné několika způsoby. Zde si popíšeme tři základní způsoby pro sledování změn, jejich použití je na zvážení každého správce.

Automatické aktualizace

Automatické aktualizace v systému Debian lze řešit pomocí balíku unattended-upgrades. Balík je nutné nainstalovat z repozitáře a následně nakonfigurovat v konfiguračním souboru /etc/apt/apt.conf.d/50unattended-upgrades. V našem případě jsme zvolili automatický upgrade balíků ve větvi security. Toho jsme dosáhli odkomentováním následujícího řádku v konfiguraci:

Unattended-Upgrade::Origins-Pattern {
        "origin=Debian,archive=stable,label=Debian-Security";
};

Unattended-Upgrade::Mail "root"; # místo root je potřeba zadat email správce, kam bude chodit výpis o provedených změnách

Samotné spouštění automatického upgradu se nastavuje v /etc/apt/apt.conf.d/02periodic pomocí:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";,

kde “1” značí četnost spouštění upgradu ve dnech, v tomto případě je tedy nastaveno, aby kontrola a případná instalace bezpečnostních balíčků se prováděla každý den.

Sledování změn pomocí apticron

Pomocí balíku apticron lze sledovat aktualizace všech balíků a v případě potřeby provádět aktualizace těchto balíků ručně. Balík je možné nainstalovat z repozitáře a konfigurace se jednoduše provede nastavením proměnné EMAIL v konfiguračním souboru /etc/apticron/apticron.conf.

Sledování mailinglistů

Pro sledování aktualních bezpečnostních incidentů v OS Debian je možné sledovat následujcí mailing listy:

security debian anounce list - https://lists.debian.org/debian-security-announce/ 
apache security anounce list - https://lists.debian.org/debian-apache/ 
debian security (optional) - https://lists.debian.org/debian-security/

První z uvedených je nejvhodnější pro účely sledování bezpečnostních problémů systému Debian, kam chodí pouze oznámení o nalezených bezpečnostních chybách s informacemi o jejich odstranění. Další dva jsou spíše diskuzní vlákna, kde se člověk může dočíst o různých dalších chybách v aplikacích.

Zákaz spouštění PHP skriptů ze složek s povoleným zápisem

Nedávný bezpečnostní incident, kdy na kompromitovaném webu s povoleným zápisem do všech podadresářů utočník dokázal nahrát vlastní kód a ten pak spustit skriptovacím jazykem PHP. To vedlo k dalšímu kroku zpřísnění politiky jednotlivých webů. V adresářích s právy zápisu je zakázáno spouštět skripty PHP. Toho je docíleno tím, že v adresářích s právy zápisu je nastaveno v konfiguračním souboru .htaccess direktiva:

php_flag engine off

Odkazy

Stránka projektu FR475/2013

Použitá literatura

Popis vytváření samostaných instancí

Přesměrování provozu na HTTPS

Server Name Indication

Učební materiály kurzu SANS SEC 506: Securing Linux/Unix

mod_proxy

mod_waklog