CIV:Granty/Zvýšení bezpečnosti webhostingu
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.
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í