Kao što većina administratora i ljudi koji se na neki način kreću u informatičkom svijetu zna, Apache je jedan od najpopularnijih web servera. To, naravno, ima svojih pozitivnih ali i negativnih strana, a jedna od negativnih je i ta da zbog velike rasprostranjenosti zlonamjerni korisnici traže nedostatke baš za Apache kako bi napravili štetu. Slično je bilo i sa Internet preglednikom Mozilla Firefox koji u početku nije imao mnogo sigurnosnih propusta baš zbog toga što ih nitko nije niti tražio jer sam preglednik nije bio odveć popularan pa su ga rijetki koristili. No, kako mu je popularnost rasla, tako su se uočavali i propusti. Da se razumijemo - ja ne tvrdim da je Firefox loš proizvod (u svakom slučaju meni je puno bolji od Internet Explorera) nego samo da se ga napravili ljudi, a tko radi taj i griješi. Ali da ne duljim previše, donosim vam nekoliko savjeta za sigurnost Apache web servera.

Sakrijte osjetljive informacije od korisnika

Sigurno ste do sad naišli na neku adresu kod koje vam se javila popularna greška 404 (ako niste, probajte otvoriti neku izmišljenu adresu, s tim da domena mora biti prava). Kod takvih grešaka, na dnu se po defaultnim postavkama Apache-a ispisuje verzija i moduli koji su instalirani na serveru. Budući da to nekome može poslužiti za napad, bolje je to spriječiti.

Otvorite postavke Apache-a (datoteka /etc/apache2/apache2.conf) i u njoj napravite slijedeće promjene. Pronađite

ServerTokens Full
ServerSignature On

i promijenite u

ServerTokens Prod
ServerSignature Off

Opcija ServerTokens određuje koje informacije će server poslati u HTTP response headeru (najmanje što možete odrediti je da se šalje naziv proizvoda - Apache), a opcija ServerSignature određuje hoće li se ispisivati potpis Apache servera na stranicama koje generira sam Apache (npr. stranice sa 404 greškom, listanje direktorija putem FTP-a). Jedino što treba zapamtiti da ovime ne određujemo da se verzija Apache-a i slične informacije neće prikazivati ukoliko smo odredili prikazivanje proizvoljnih stranica (npr. proizvoljne stranice sa greškom 404).

Nedavno sam imao potrebu na jednom serveru postaviti nekoliko Internet stranica. Možda neki (malo manje upućeni) misle da na Internetu vrijedi “1 site = 1 server” no to nije tako. Vrlo često se kod manje zahtjevnih site-ova (koji nemaju previše pageview-ova dnevno) koristi jedan server za nekoliko Internet stranica. Ovdje ću opisati kako na jednostavan način na jedan Apache2 server smjestiti 3 Internet stranice (za primjer ću koristiti domene www.prva.com, www.druga.com i www.treca.hr).

Dakle, imate server na kojem je instaliran Apache i to u verziji 2.x. Ako malo bolje pogledate u direktorij /etc/apache2, vidjet ćete slijedeće:

  • apache2.conf datoteku - u njoj se nalazi veći dio konfiguracije Apache web servera
  • conf.d direktorij - sve datoteke koje se nalaze u njemu Apache smatra konfiguracijskima i pokušati će ih pročitati kod pokretanja
  • httpd.conf - datoteka ovog naziva je u verziji 1.x sadržavala konfiguraciju koja je sad prebačena u apache2.conf. Budući da u njoj vjerojatno nema ništa, a Apache ju po defaultu čita kod pokretanja, možete ju koristiti za vlastitu konfiguraciju Apache-a
  • mods-available direktorij - u njemu se nalaze konfiguracijske datoteke modula koji su dostupni za instalaciju (neki su možda već i instalirani)
  • mods-enabled direktorij - sadrži soft linkove na konfiguracijske datoteke modula, a ti linkovi se stvaraju automatski kad se modul instalira
  • ports.conf datoteka - popis portova na kojima Apache sluša
  • sites-available direktorij - u njemu se nalaze konfiguracijske datoteke za svaku web stranicu koja je dostupna Apache-u
  • sites-enabled direktorij - sadrži soft linkove na konfiguraciju svake instalirane web stranice

Kreiranje direktorija za svaku stranicu

Prvo ćemo kreirati jedan direktorij u koji ćemo smjestiti sve Internet stranice koje ćemo imati na serveru. Taj direktorij možete kreirati bilo gdje, samo što korisnik pod kojim je pokrenut Apache servis (na nekim distribucijama to je www-data, a na drugima je httpd) mora imati prava za čitanje iz tog direktorija. Ja ću direktorij kreirati u home direktoriju.

mkdir /home/www

Nakon toga kreirajte direktorije za svaku stranicu koju ćete imati, a u svakom direktoriju stranice napravite dodatne direktorije htdocs, logs i cgi-bin.

mkdir /home/www/www.prva.com
mkdir /home/www/www.prva.com/htdocs
mkdir /home/www/www.prva.com/logs
mkdir /home/www/www.prva.com/cgi-bin
mkdir /home/www/www.druga.com
mkdir /home/www/www.druga.com/htdocs
mkdir /home/www/www.druga.com/logs
mkdir /home/www/www.druga.com/cgi-bin
mkdir /home/www/www.treca.com
mkdir /home/www/www.treca.com/htdocs
mkdir /home/www/www.treca.com/logs
mkdir /home/www/www.treca.com/cgi-bin

Naravno, ukoliko ćete imati isti sadržaj za sve stranice (npr. ukoliko imate isti naziv domene, ali različite vršne domene - www.stranica.com, www.stranica.net, www.stranica.org…) nema smisla kreirati različite direktorije nego treba koristiti soft linkove.

Konfiguracija

Nakon što smo kreirali direktorije za svaku web stranicu, moramo u Apache konfiguraciji omogućiti korištenje virtualnih hostova. Najjednostavnije je u direktoriju /etc/apache2/conf.d napraviti datoteku virtual.conf i u nju upisati slijedeće:

NameVirtualHost *

Kao što sam već rekao, Apache prilikom pokretana čita sve datoteke u direktoriju conf.d pa će pročitati i datoteku virtual.conf.

Nakon toga, u direktoriju /etc/apache2/sites-available ćemo kreirati konfiguracijsku datoteku za svaku Internet stranicu. Dakle, u datoteku /etc/apache2/sites-available/www.prva.com upišite slijedeće:

#  Prva.com (/etc/apache2/sites-available/www.prva.com)
<VirtualHost *>
ServerAdmin webmaster@prva.com
ServerName  www.prva.com
ServerAlias prva.com, *.prva.com

# Indexes + Directory Root.
DirectoryIndex index.html, index.php
DocumentRoot /home/www/www.prva.com/htdocs/

# CGI Directory
ScriptAlias /cgi-bin/ /home/www/www.prva.com/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>

# Logfiles
ErrorLog  /home/www/www.prva.com/logs/error.log
CustomLog /home/www/www.prva.com/logs/access.log combined
</VirtualHost>

Nakon toga u istom direktoriju kreirajte još i datoteke www.druga.com te www.treca.com. U njih možete staviti istu konfiguraciju kao i u www.prva.com, samo napravite logične promjene (npr. umjesto Server name www.prva.com upišite Server name www.druga.com te Server name www.treca.com).

Naravno, u svaku od datoteka možete dodati i neki proizvoljni konfiguracijski redak koji će se odnositi samo na tu web stranicu.

Instaliranje internet stranica na serveru

Iako sam ovo poglavlje nazvao instaliranje internet stranica, to je ustvari dozvola korištenja stranice Apache-u.

Da ponovimo - sada imamo 3 stranice koje se još ne koriste jer Apache ne vidi virtualne hostove koje smo definirali. To je zato što se njihova konfiguracija još ne nalazi u direktoriju sites-enabled već samo u sites-available. Pomoću slijedećih naredbi ćemo Apache-u dozvoliti korištenje stranica:

a2ensite www.prva.com
a2ensite www.druga.com
a2ensite www.treca.com

Ukoliko iz nekog razloga želimo privremeno zabraniti korištenje neke stranice Apache-u, to ćemo napraviti sa naredbom a2dissite:

a2dissite www.druga.com

Nakon što smo sve napravili slijedi ponovno pokretanje Apache servera i to je to.

/etc/init.d/apache2 reload

Korisni linkovi

Još jedna zgodna stvar kod Apache-a je što možete imati mnogo Internet stranica sa istom konfiguracijom. Dobar članak o tome možete pronaći ovdje.

Apache logoSigurno ste se do sad susretali sa web adresama tipa http://www.domena.hr/~imekorisnika/. To je standardna adresa za web prostor svakog korisnika na nekom web serveru. Svaka takva adresa ima DocumentRoot u direktoriju /home/<imekorisnika>/public_html. To je defaultna postavka Apache web servera.

No, mogli ste se susresti i sa puno “ljepšim” adresama tipa http://imekorisnika.domena.hr. Do takvog oblika web adrese vrlo je lako doći koristeći mod_rewrite modul Apache web servera.

Otvorite datoteku /etc/apache2/httpd.conf (ili /etc/apache2/apache2.conf) u nekom editoru teksta (ja ću, kao i uvijek do sad koristiti vim).

vim /etc/apache2/httpd.conf

U nju upišite slijedeće:

<VirtualHost 192.168.1.1:80>
    ServerName korisnici.domena.hr
    ServerAlias *.domena.hr
    DocumentRoot /var/www/korisnici/

    UseCanonicalName Off

    RewriteEngine on

    RewriteCond %{HTTP_host} ^([a-z0-9][-a-z0-9]+)\.domena\.hr\.?(:80)?$ [NC]
    RewriteCond /home/%1/public_html -d
    RewriteRule ^(.*) /home/%1/public_html/$1 [L]
</VirtualHost>

U prvoj liniji umjesto IP adrese 192.168.1.1 stavite IP adresu vašeg servera. Svugdje gdje piše domena.hr promijenite u vlastitu domenu i restartajte Apache.

/etc/init.d/apache2 restart

Ako na serveru imate nekog korisnika (ovo ne vrijedi za root korisnika), u njegovom home direktoriju kreirajte direktorij naziva public_html. Otvorite Internet preglednik i upišite http://imekorisnika.domena.hr i trebali biste vidjeti korisnikov web prostor.

U slučaju da prilikom restarta Apache servera dobijete grešku o liniji RewriteEngine on, vjerojatno nemate instaliran modul mod_rewrite. Upišite slijedeće:

a2enmod rewrite

Nakon toga ponovno napravite restart Apache servera i sve bi trebalo raditi kako treba.

htpasswdSigurno su se mnogi od vas do sad susreli sa .htaccess zaštitom neke Internet stranice ili nekog njenog dijela (npr. dijela stranice namijenjenog registriranim korisnicima). Radi se o zaštiti od strane Apache web servera i prilično je siguran način zaštite.

Logično, da bi ovo radilo morate imati instaliran Apache web server (poželjno verziju 2.x).

  1. Na serveru se pozicionirajte u direktorij koji želite zaštititi (u ovom primjeru ja ću zaštititi direktorij /home/korisnik/public_html):
    cd /home/korisnik/public_html
  2. Kreirajte datoteku .htaccess u tom direktoriju i otvorite ju u nekom uređivaču teksta (ja ću koristiti vim):
    vim .htaccess
  3. U datoteku upišite slijedeće:
    AuthUserFile /usr/share/apache2/.htpasswds
    AuthName "Naziv zasticenog direktorija"
    AuthType Basic
    Require valid-user

    Prva linija označava putanju gdje će biti datotekama sa popisom korisnika i pripadajućih lozinki. Iako su lozinke kriptirane, preporuča se tu datoteku staviti u neki direktorij koji nije dostupan preko Weba. Najbolje da koristite direktorij kao i ja, dakle /usr/share/apache2, te da u njega stavite datoteku naziva .htpasswds (naziv može biti bilo koji).
    Druga linija je naziv direktorija koji će biti zaštićen. Ovdje možete napisati bilo što.
    Treća linija označava da će se koristiti uobičajeni tip zaštite.
    Četvrta linija znači da će se za autorizaciju tražiti bilo koji korisnik zapisan u datoteci sa popisom korisnika i lozinki.
    Nakon što ste sve prilagodili vlastitim potrebama, snimite datoteku i vratite se u shell.

  4. Pomoću programa htpasswd kreirajte datoteku sa novim korisnikom:
    htpasswd -c /usr/share/apache2/.htpasswds nekikorisnik

    Primijetite opciju -c koja se koristi samo onda kad datoteka sa popisom korisnika ne postoji. Ukoliko ste već prije kreirali datoteku i u njoj postoje neki korisnici, a želite dodati novog, naredba je ista, samo se ne koristi opcija -c.
    Prvi argument je putanja do datoteke sa popisom korisnika (kod mene je to /usr/share/apache2/.htpasswds), a drugi je naziv korisnika (u mojem slučaju to je nekikorisnik).

Gotovi ste. Otvorite Internet preglednik i pokušajte otvoriti stranicu koju ste zaštitili. Ukoliko ste sve napravili kako treba, preglednik će vas tražiti da upišete korisničko ime i lozinku.

Na ovaj način vrlo jednostavno i efikasno možete zaštititi dijelove Internet stranice ili cijelu stranicu od neželjenih pogleda.