"Nejkrásnejší na světe nejsou věci, ale okamžiky."
Karel Čapek

"The only limitations you have are the ones you set yourself."
neznámy autor

"Cenu má iba cesta. Len ona trvá, kdežto cieľ je ilúzia pútnika, kráčajúceho po hrebeni, akoby zmysel bol v dosiahnutom cieli."
Antoine de Saint-Exupéry

Overiť CSS!

Overiť HTML 4.01 Transitional!

Táto sekcia vznikla na základe môjho záujmu o oblasť bezpečnosti webových serverov. Informácie, ktoré tu sú uvedené sú výcucom z mojej bakalárskej práce a ide o skutočne základné fakty a postrehy. Zameriavam sa čisto na bezpečnosť Apache servera a venujem sa nasledovnému:


Apache server

Je vytváraný pod záštitou Apache Software Foundation. Jedná sa o voľne dostupný, modulárny webový server, ktorý využíva špeciálnu licenciu - Apache License. Apache server má kľúčovú rolu v raste World Wide Web-u. V roku 2009 sa stal prvým webový serverom, ktorý prekonal hranicu 100 miliónov webových stránok, ktoré sú obsluhované práve Apache servermi. Je napísaný v jazyku C a ako jeden z mála je používaný na takmer všetkých operačných systémoch. Ide o komplexný webový server, keďže poskytuje obrovské množstvo možností. Väčšina z jeho funkcionalít zostáva separovaná a nezávislá v rozličných moduloch. Nasledujúci obrázok vysvetľuje ako pracuje nielen webový server Apache, ale každý webserver:

Apache server


Vývoj Apache servera [1] sa začal v roku 1993 v NCSA (National Center for Supercomputing Aplications) na Illinoiskej univerzite. Pôvodné meno tohto projektu bolo NCSA HTTPd. NCSA HTTPd však medzitým už používali správcovia webových serverov a dodávali mu vlastné úpravy – záplaty (záplata = a patch; z čoho je aj odvodené meno Apache). Hlavnú úlohu v ďalšom vývoji zohrali Brian Behlendorf a Cliff Skolnick, ktorí založili e-mailovú konferenciu a začali zber úprav a ich distribúciu koordinovať. Prvá verejná verzia s označením 0.6.2 bola vydaná v apríli 1995. Neskôr nasledovalo založenie Apache Group, ktorá je dnes základom vývojarského tímu. Symbolom Apache servera je indiánske vtáčie pierko.


Štruktúra OS Linux a Apache HTTPd

OS Linux
/koreňový adresár
/bin/používateľské príkazy ako ls, cd, ...
/boot/"boot loader" súbory
/dev/zariadenia ako diskové jednotky, sériové porty, ...
/etc/konfiguračné súbory stroja
/home/domovské adresáre používateľov
/lib/zdiežané knižnice potrebné programami
/media/body na pripojenie pre odpojitežné média (CD, USB, ...)
/mnt/dočasne pripojené súborové systémy
/opt/voliteľné softvérové balíky
/proc/informácia o parametroch jadra a syst. konfigurácií
/root/domovský adresár používateľa root
/sbin/systémové príkazy ako init, mount, ...
/tmp/dočasné súbory (taktiež ako aj v /var/tmp)
/usr/používateľské príkazy, manuálové stránky, knižnice, ...
/var/súbory s premenlivým obsahom (variable) ako log súbory, cache, ...


Apache HTTPD
cgi-bin/interaktívne programy písané v C, Java, Perl, ...
conf/adresár s konfiguračnými súbormi ako httpd.conf a mime.types
error/http chybové správy
html/adresár sa tiež označuje ako DocumentRoot
icons/ikony ktoré sú súčasťou Apache servera
logs/logovacie súbory ako access_log a error_log
manual/rozkúskovaný manuál, pomôcky pri práci s Apache-om, FAQ
Základné direktívy
DocumentRootadresár s webstránkou
ServerRootkoreňový adresár Apache servera
Useružívateľ pod ktorým beží server
Groupskupina pod ktorou beží server
ErrorLoglogovací súbor s chybovými záznamami
CustomLogumiestnenie súboru access_log



Nástroj htpasswd

Nástroj htpasswd slúži na naplnenie súborov databázou hesiel a k nim prislúchajúcich prihlasovacích mien pre používateľov. Títo používatelia majú potom prístup k adresárom zabezpečených heslom. Heslá do súboru sa neukladajú samozrejme v nezašifrovanej forme, ale sú zahešované pomocou CRYPT, MD5 alebo SHA1. Súbor s heslom je najlepšie pomenovať, tak aby bol skrytý („.“ pred menom - napríklad .htpasswd), ale je ho možné uložiť žubovolne. Tiež je podstatné, aby sa tento súbor nenachádzal v adresári, do ktorého majú prístup používatelia servera, a preto je ho dobré mať čo najďalej od adresárov v DocumentRoot. Napríklad, ak je ServerRoot nastavený na /etc/httpd/, tak DocumentRoot môže byť nastavený na /var/www/html/, ale súbor s heslom môže byť uložený v adresári /etc/httpd/passwd/.

Prepínače htpasswd:
-c Vloží nové konto do súboru, ak ale sa v súbore nejaké kontá nachádzajú, tak ich odstráni
-d Defaultné šifrovanie pomocou CRYPT (nie je nutné tento prepínač uvádzať)
-m Šifrovanie pomocou MD5
-s Šifrovanie pomocou SHA1
-p V súbore sa bude nachádzať nezašifrované heslo. Tento prepínač je silno neodporúčaný.
-D Odstráni zo súboru záznam používateľa s heslom.
Ak sa zadá príkaz htpasswd bez prepínača a súbor existuje, tak do súboru sa pridá ďalší záznam.

Použitie:
Máme vytvorený súbor .htpasswd v ASCII formáte (klasickom formáte; nesmie to byť binárny formát) a teraz použijeme príkaz:

# htpasswd -c .htpasswd miska

následne pre používateľa "miska" napíšeme heslo a potom ho aj potvrdíme. Program nám po úspešnom pridaní vypíše:
Adding password for user miska

Kebyže si chceme overiť, či bolo heslo skutočne pridané a či je aj zašifrované, tak si pomocou príkazu more .htpasswd možeme obsah súboru zobraziť. Zobrazí sa nám niečo podobné:
miska:AnhZR5tMpnorr

Teraz sme si overili, že bol používateľ úspešne pridaný a aj heslo je zašifrované. Kebyže bolo heslo „heslo“ pridané pomocou prepínača -p (plaintext), tak nám program vypíše miska:heslo. Ak máme záujem pridať viacej používateľov, tak napíšeme
# htpasswd .htpasswd tomas
a program nám po zadaní príkazu more .htpasswd vypíše niečo podobné nasledujúcim riadkom:
miska:AnhZR5tMpnorr
tomas:9nGvByyer5YKQ


Ak chceme záznam o používateľovi tomas odstrániť, tak použijeme príkaz:
# htpasswd -D pokus tomas

a program nám odstránenie záznamu potvrdí nasledujúcim textom:
Deleting password for user tomas

Pre zmenu používateľského hesla sa použije rovnaký príkaz ako pri pridávaní, ale parametrom je používateľ, ktorý sa v súbore už nachádza. Program vypíše pre potvrdenie:
Updating password for user miska

Konfiguračné súbory httpd.conf a .htaccess

Využitie súboru s heslami z htpasswd v httpd.conf

Do direktívy Directory skúsme vpísať nasledovný kód:
<Directory “/var/www/html/pokus“>
AuthType Basic
AuthName "Pristup pre pouzivatela Miska"
AuthUserFile /etc/httpd/passwd/.htpasswd
Require valid-user
</Directory>



V tomto prípade ak máme iba používateľa miska, tak môžeme do direktívy Require dať namiesto valid-user len user miska.
Okrem argumentov valid-user a user [používateľské_meno] môžeme dať ako argument tejto direktívy aj group [meno_skupiny] ako napríklad:
Require group admini

Teraz ale musíme dať serveru vedieť, ktorí užívatelia zo súboru .htpasswd, ktorý sme vytvorili pomocou htpasswd, patria do našej skupiny admini. Toto sa robí tak, že k týmto direktívam sa pridá ešte direktíva s umiestnením súboru skupina1 (pomocou direktívy AuthGroupFile), v ktorom sa nachádza názov skupiny s pridelenými používateľmi. Napríklad môže súbor skupina1, ktorý si uložíme k súboru .htpasswd vyzerať nasledovne:
admini: miska tomas

Teraz bude táto časť httpd.conf súboru vyzerať nasledovne:
<Directory “/var/www/html/pokus“>
AuthType Basic
AuthName "Pristup pre administratorov"
AuthUserFile /etc/httpd/passwd/.htpasswd
AuthGroupFile /etc/httpd/passwd/skupina1
Require group admini
</Directory>



Využitie súboru s heslami z htpasswd v .htaccess

Súbor .htaccess slúži na decentralizované ovládanie rôznych adresárov webového servera, napríklad v prípade ak vlastníme webovú stránku s rôznymi subdoménami a chceme používateľom týchto subdomén povoliť aspoň čiastočnú konfiguráciu správania servera s ich adresármi cez náš webový server. Robí sa to celé cez umiestňovanie súbora .htaccess do adresára, kde chceme zmeniť konfiguráciu nášho adresára a všetkých subadresárov. Kebyže ale vytvoríme v adresári, kde sa nachádza súbor .htaccess s nastavenými vlastnosťami, adresár abc a vložíme doňho ďalší súbor .htaccess s inými nastaveniami, tak adresár abc ignoruje všetky prekrývajúce sa nastavenia v súbore .htaccess, nachádzajúcom sa o úroveň vyššie v adresárovej štruktúre a riadi sa súborom .htaccess v adresári abc.

Administrátor celého Apache servera musí mať možnosť povoliť/zakázať manipuláciu s takýmito súbormi, keďže tým, že povolí prácu s týmito súbormi dochádza k potencionálnemu riziku. Celé sa to robí v konfiguračnom súbore httpd.conf, ku ktorému má prístup iba administrátor. Ak chceme povoliť konfiguráciu adresára pokus, ktorý sa nachádza v adresári /var/www/html/ je potrebné nastaviť 3 veci:

  1. Povoliť konfiguráciu adresára pokus nastavením direktívy AllowOverride na hodnotu AuthConfig v konfiguračnom súbore httpd.conf:
    <Directory “/var/www/html/pokus“>
    AllowOverride AuthConfig
    </Directory>


  2. Keďže sa dá v Apache serveri určiť, že aké meno môže mať tento náš konfiguračný súbor (čiže môže byť iné ako .htaccess), tak to treba definovať v direktíve AccessFileName.
    AccessFileName .htaccess

    Ide vlastne o meno súboru, ktorý Apache server hžadá v každom adresáre, aby našiel ďalšie konfiguračné direktívy.

  3. Keďže konfigurácia adresára pomocou súbora .htaccess je striktne viazaná na daný adresár a jeho podadresáre, tak nie je nutné v ňom určovať cestu adresára, na ktorý je konfigurácia viazaná a tak sa v tomto súbore nachádza konfigurácia adresára bez direktívy Directory. Obsah súbora .htaccess môže byť podobný obsahu konfiguračného súbora httpd.conf a stačí, aby obsah súbora pre požadovanú konfiguráciu, ktorá bola v predošlom prípade pri konfigurácii súboru httpd.conf vyzeral nasledovne:

    AuthType Basic
    AuthName "Pristup pre administratorov"
    AuthUserFile /etc/httpd/passwd/.htpasswd
    AuthGroupFile /etc/httpd/passwd/skupina1
    Require group admini


Základné nástroje a ich použitie

Zistenie rozdielov medzi aktuálnou a zálohovanou verziou konfiguračného súboru httpd.conf - príkaz diff - príklad ak niekto zmenil direktívu KeepAliveTimeout na riadku 87 z hodnoty 15 na hodnotu 20:
diff httpd.conf httpd2.conf
87c87
< KeepAliveTimeout 15
---
> KeepAliveTimeout 20


Nástroj diff ponúka aj rôzne prepínače, ktoré umožnia rôzne typy zobrazení výstupu a rôzne ignorovania komparácie. Najzaujímavejšie sú nasledovné:
-w ignorovanie „white spaces“ pri porovnávaní riadkov
-y porovnanie jedného súboru vedľa druhého s tým, že zmeny sú zobrazené znakmi medzi textami týchto súborov
-i ignorovanie rozdielov medzi veľkými a malými písmenami
-r rekurzívne porovnávanie v prípade adresárov

Zistenie nastavenia Apache servera - Nikto
Nikto je pomernej nenáročný Open Source skener, ktorý ale taktiež poskytuje množstvo analýz. Dokáže zistiť nedostatky v nastaveniach voči XSS, DoS, SQL injection a rôznym ďalším typom útokov.
Použitie:
# perl nikto.pl -h localhost

Nikto má rôzne možnosti nastavení, z toho najzaujímavejšie sú pravdepodobne nasledovné:
-h nastavenie hosta (alebo localhost)
-p výber skenovaných portov
-Format formát súboru, v ktorom sa výstup uloží
-output uloženie výstupu do zadaného súboru
-Tuning X vykonanie špecializovaného testu (ak nie je určené, tak sú všetky vykonané) ak je X=0, potom ide o „File Upload“, X=1 - „Interesting File / Seen in logs“ X=2-„Injection (XSS/Script/HTML)“,X=6-„Denial of Service“,X=9-„SQLInjection“
-Display X zobrazí viac informácií o skenovaní (ak je X=1, tak zobrazí aj presmerovania, ak je X=2 zobrazí prijaté cookies, ak je X=3, tak zobrazí všetky odpovede servera so statusom požiadavky 200/OK)

Obmedzenie prístupu pomocou deny, allow, order
Obmedziť prístup k adresáru je možné aj vzhľadom k IP adrese klienta:
<Directory /pokus>
order deny,allow
deny from all
allow 192.168.10.10 192.168.10.20
</Directory>


Týmto kódom umožním prístup do adresára pokus len používateľom pristupujúcim z IP adries 192.168.10.10 a 192.168.10.20. Všetci ostatní používatelia majú prístup zakázaný. Veľmi podstatné je, že v akom poradí sa napíše argument direktívy order, keďže je medzi nimi rôzna priorita. Ak by to bolo v našom prípade opačne, tak by k adresáru pokus nemali prístup žiadni klienti. Druhý argument má väčšiu prioritu a preto je vhodné hodnotu from all vložiť do direktívy, ktorá je prvým argumentom direktívy order.
Manipulácia s prístupom je možná nielen cez čisté IP adresy, ale aj cez doménové mená (deny from bad-guys.com), IP adresy s maskou (či už v plnom formáte alebo podľa CIDR špecifikácie) a tiež cez čiastočné zadanie IP adresy (napr. deny from 123.123 zablokuje prístup z IP adries začínajúcich 123.123).

Logovanie a analýza - logfilter
Logovanie je veľmi dôležitý proces, keďže vďaka nemu zaznamenávame informácie pre neskoršiu analýzu, čím môžeme predchádzať neskorším problémom. Logovacie súbory Apache servera sa nachádzajú v adresári logs, ktorý je umiestnený v adresári definovanom direktívou ServerRoot. Najpodstatnejšie logovacie súbory sú access_log a error_log a Apache server ich umiestnenie definuje v konfiguračnom súbore httpd.conf direktívami CustomLog a ErrorLog. V súbore access_log sa nachádzajú záznamy o aktivite používateľov, kdežto súbor error_log obsahuje záznamy o chybách a varovaniach, ktoré nastali počas behu programu. Apache umožňuje nielen definovať formát záznamu pomocou LogFormat, ale umožňuje takisto určiť, aká je minimálna úroveň výstrahy, ktorá má byť zaznamenávaná do logovacieho súboru. Robí sa to pomocou direktívy LogLevel.

Ak by administrátor chcel nájsť všetky logové záznamy v súbore access_log, ktoré zodpovedajú tomu, že požiadavky využívajú metódu GET, dotazujú sa na stránku a.html a status požiadavky je 401 (HTTP_UNAUTHORIZED), tak využije nasledovný príkaz:
#logfilter -u a.html -m GET -s 401 access_log

Výstup môže byť nasledovný:
::1 - - [08/May/2010:11:50:30 +0200] "GET /pokus1/a.html HTTP/1.1" 401 476 "http://localhost/" "Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-2.fc12 Firefox/3.5.9" ::1 - jakub [08/May/2010:11:50:34 +0200] "GET /pokus1/a.html HTTP/1.1" 401 476 "http://localhost/" "Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-2.fc12 Firefox/3.5.9"

Administrátor môže používať Logfilter na filtrovania podľa nasledovných aspektov [2]:
-b používateľský prehliadač
-c klientská adresa
-m metóda GET alebo POST
-p typ protokolu (napr. HTTP/1.1)
-r odkiaľ používateľ prichádza
-s status požiadavky (napr. 200, 401,...)
-U používateľské meno (ak existuje nejaké)
-z veľkosť dokumentu
-u dokumentové URI (Uniform Resource Identifier)
-i zanedbanie rozdielov vo veľkosti písmen pri vyhľadávaní (case-insensitive)


Odkazy a bibliografia

[1] Wikipedia. Apache HTTP Server:
http://sk.wikipedia.org/wiki/Apache_HTTP_Server
[2] User manual for logfilter version 0.4
http://www.logfilter.org/manual.php


Matej Mihalech © 2017