Apache Web Server Administration

From Training Material
Revision as of 22:15, 13 May 2013 by Izabela Szlachta (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Template:Apache Links

Kontenery

Tworzymy kontener warunkowy dotyczący modułu Alias a w nim kilka wpisów:

<IfModule alias_module>
	Redirect permanent /pliki /dokumenty
	Redirect temp /allegro http://allegro.pl
	Alias /aktualnosci /var/www/wiadomosci/2012
</IfModule>

Odejmujemy możliwość listowania katalogu w kontenerze Directory dla dokumenty/tajne jednocześnie dając możliwość późniejszej zmiany opcji za pomocą parametru AllowOverride All. Dopisujemy w tym celu na końcu pliku default:

<Directory /var/www/dokumenty/tajne>
	Options -Indexes
	AllowOverride All
	Order allow,deny
	Allow from all
</Directory>

Od tego momentu nie mamy prawa do wyświetlania zawartości katalogu. Tworzymy wewnątrz plik .htaccess a w nim:

Options +Indexes

Dzięki takiemu wpisowi narzuciliśmy możliwość wyświetlania zawartości katalogu. W środku są trzy pliki, ale chcemy ukryć dostęp do pliku o nazwie dokument-2.html i w tym celu dodajemy w pliku .htaccess kontener:

<Files dokument-2.html>
	Deny from all
</Files>

W podobny sposób możemy zablokować dostęp do plików o pewnych nazwach określonych za pomocą wyrażenia regularnego:

<Files ~ ^tajn(.*)\.html$>
	Deny from all
</Files>

Kiedy jest potrzeba ograniczenia dostępu dla kilku rodzajów plików możemy wykorzystać listę z rozszerzeniami plików:

<Files ~ \.(doc|docx|txt)$>
	Deny from all
</Files>

W podobny sposób możemy stosować listy przy definiowaniu kontenerów Location i Directory.


Status serwera

Aby uzyskać informacje o serwerze trzeba załadować moduł Info:

a2enmod info

W pliku z konfiguracja do tego modułu jest już zdefiniowana lokalizacja i ograniczony dostęp po adresie IP, który zmieniamy w razie potrzeby:

<Location /server-info>
	SetHandler server-info
	Order deny,allow
	Deny from all
	Allow from localhost 192.168.0.115
</Location>

Możemy odczytać zawartość wszystkich plików konfiguracyjnych. Domyślnie oprócz modułu Info jest załadowany moduł status a w pliku konfiguracyjnym znajdziemy lokalizację odpowiadającą za wywołanie strony z informacjami o stanie serwera:

localhost/server-status?refresh=1

Dzięki powyższemu wywołaniu strona będzie odświeżała się automatycznie co określoną parametrem liczbę sekund.

Jeśli chcemy minimalne informacje możemy do adresu dodać inny parametr:

localhost/server-status?auto

Poza kontenerem VirtualHost możemy ustalić ilość informacji w sygnaturze serwera:

ServerTokens Full

Jeśli jest to serwer produkcyjny zaleca się podać samą nazwę serwera:

ServerTokens Prod

Można też zupełnie wyłączyć pokazywanie sygnaturki:

ServerSignature Off

Te ustawienia dotyczą bezpieczeństwa i znajdują się już w osobnym pliku konfiguracyjnym w katalogu /etc/apache2/conf.d/security


Uwierzytelnianie

Zabezpieczanie dostępu do katalogu na hasło za pomocą podstawowej metody uwierzytelnienia:

<Directory ~ /dokumenty/prywatne>
	AuthName "Strefa chroniona"
	AuthType Basic
	Require valid-user
	AuthUserFile .htpasswd"
</Directory>

Hasło dla użytkownika misiek można wygenerować do pliku .htpasswd za pomocą polecenia:

htpasswd -c /var/www/dokumenty/prywatne/.htpasswd misiek

Podajemy hasło jogi. Można ustalić kilka warunków dzięki którym będziemy mogli dokładniej określić kto może odczytać dane zasoby. W tym celu tworzymy nową lokację:

<Location /poczta>
	Order deny,allow
	Deny from all
	Allow from 127.0.0.10
	AuthName "Poczta dla pracowników"
	AuthType Basic
	Require user pracownik
	AuthUserFile "C:/Apache/conf/passwd"
	Satisfy all
</Location>

Tworzymy potrzebny plik z hasłem dla użytkownika pracownik:

htpasswd -c /var/www/poczta/.htpasswd pracownik

Podajemy hasło poczta i sprawdzamy czy jest możliwość zalogowania. Logowanie nie powiodło się bo nie został spełniony jeden z warunków.

W tym przykładzie określamy konkretną nazwę użytkownika, która może mieć dostęp do tego zasobu i jednocześnie adres hosta z którego wymagane jest logowanie. Dodatkowo postawiony jest warunek że muszą być spełnione oba założenia czyli jednocześnie próba logowania jest z adresu 127.0.0.10 i wymagany jest użytkownik o nazwie pracownik.

Aby sprawdzić działanie zmieniamy adres hosta na 127.0.0.1 i restartujemy serwer. Możemy też zmniejszyć wymagania:

Satisfy any

Powyższy zapis oznacza, że przynajmniej jeden warunek musi być spełniony.


Logi

Konfigurację plików z logami zaczynamy od ustalenia nazwy pliku z błędami:

ErrorLog ${APACHE_LOG_DIR}/default_error.log

Ponadto możemy ustalić poziom błędów od jakiego informacje mają dopisywać się do pliku.

LogLevel Info

Jeśli interesują nas same błędy krytyczne możemy zmienić parametr na Crit.

Oba wpisy możemy zmienić w globalnej konfiguracji serwera lub z uwagi na wiele wirtualnych hostów dla każdego kontenera VirtualHost osobno, co pomoże nam lepiej rozróżnić pochodzenie plików. Dodane wpisów do kontenera VirtualHost w pliku default nadpisuje wartości, które są w pliku z główną konfiguracją serwera.

Oprócz logowania informacji o błędach mamy do dyspozycji parametr pozwalający tworzyć pliki logów z dowolną zawartością.


Przepisywanie adresów

Włączamy moduł Rewrite, możemy użyc programu dostępnego w pakiecie Apache:

a2enmod rewite

Startujemy ponownie Apache:

sudo apache2ctl restart

Możemy też użyć polecenia:

sudo /etc/init.d/apache2 restart

Aby wyłączyć moduł postępujemy podobnie używając innego polecenia:

a2dismod rewrite

Od teraz możemy używać silnika Rewrite. Dopisujemy do kontenera Directory /var/www:

RewriteEngine On
RewriteRule ^aktualnosci\.html$ wiadomosci/%{TIME_YEAR}/news.html
RewriteRule ^d/(.*) dokumenty/$1

Dzięki tej regule możemy mieć dostęp do plików z katalogu dokumenty wykonując odwołanie localhost/d/dokument-1.html. Kolejna reguła jest bardziej skomplikowana:

RewriteRule ^foto-([0-9]+)\.jpg$ foto/$1.jpg

Znak + oznacza że ciąg cyfr może być dowolnej długości dlatego reguła zadziała dla pliku foto-1.jpg jak również dla pliku foto-123.jpg a $1 to pierwsza i jedyna zmienna, która w naszym przypadku oznacza nazwę pliku a dokładnie numer. Kolejna reguła wykorzystuje kilka zmiennych:

RewriteRule ^~(([a-z])[a-z]+)(.*) uzytkownicy/$2/$1/$3

Reguła jest ciekawa ponieważ pokazuje elementy z jakich budowane jest wyrażenie regularne. Wpisując w przeglądarce localhost/~agnieszka uzyskamy dostęp do katalogu localhost/uzytkownicy/a/agnieszka

Każdy nawias stanowi osobną zmienną. Mamy tutaj jeden znak z przedziału od a do z zawarty w nawiasie co stanowi jedną zmienną, zaraz po niej mamy drugi znak od a do z oraz znak + oznaczający że tutaj może wystąpić jeden lub wiele znaków z tego przedziału i to razem z poprzednią zmienną stanowi drugą zmienną ponieważ oba elementy są zawarte razem w nawiasach, Trzecią zmienną stanowi nawias zawierający znak * oznaczający dowolny ciąg znaków.

Pierwszą zmienną czyli $1 nie jest pojedynczy znak od którego zaczęliśmy analizę wyrażenia tylko zlepek obu zmiennych, tak więc znak od a do z przyklejony do dowolnie długiego ciągu znaków z zakresu od a do z. Jeżeli całość jest $1 to wewnętrzny pojedynczy znak z przedziału od a do z jest zmienną $2 i ostatnim elementem jest zmienna $3

Dlatego po prawej stronie wyrażenia mam zapis uzytkownicy/$2 czyli u nas pojedyncza literka a oraz / i kolejna zmienna $1 czyli a i pozostały ciąg gnieszka czyli razem agnieszka / i gwiazdka.

Za pomocą modułu Rewrite możemy realizować pewne warunki:

RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^wiadomosci\.html$ wiadomosci/%{TIME_YEAR}/wiadomosci-poranne.html
RewriteRule ^wiadomosci\.html$ wiadomosci/%{TIME_YEAR}/wiadomosci-wieczorne.html

Zapisujemy warunek lub kilka warunków za pomocą komendy RewriteCond a następnie bezpośrednio pod nimi regułę, która ma zostać zrealizowana po spełnieniu warunków, oraz w kolejnej linijce opcjonalnie możemy podać regułę która zostanie wykonana jeżeli ten warunek nie jest spełniony.

W ten sposób możemy łączyć reguły i budować warunki dotyczące konkretnych adresów hostów w połączeniu z przedziałami czasowymi.

RewriteCond %{REMOTE_HOST} !127.0.0.10
RewriteRule uzytkownicy/(.*) obcy.html

Moduł Rewrite wymaga do działania wpisu Options FollowSymLinks w odpowiednim kontenerze Directory w obrębie którego chcemy przepisywać adresy. Jeżeli rewrite nie działa mimo włączenia silnika za pomocą RewriteEngine On to znaczy, że kontener Directory głównego katalogu z naszą stroną nie posiada takiego wpisu.


Wirtualne hosty

Wirtualne hosty pomagają utrzymywać wiele stron na jednym serwerze. W tym celu musimy najpierw ustawić rekordy DNS domen tak aby wskazywały na adres IP naszego serwera.

Przed konfigurowaniem wirtualnych hostów dopiszemy domeny do naszego lokalnego serwera. Edytujemy plik /etc/hosts i dodajemy w nim potrzebne wpisy.

127.0.0.1		szkolenie.pl
127.0.0.1		www.szkolenie.pl
127.0.0.1		allegro.szkolenie.pl
127.0.0.1		poczta.szkolenie.pl
127.0.0.1		poczta.pl

Najbardziej polecaną metodą tworzenia wirtualnych hostów jest bazowanie na nazwach. Tworzymy osobny plik z konfiguracją wirtualnego hosta w katalogu sites-available o nazwie poczta, wewnątrz którego tworzymy standardowy kontener VirtualHost oraz wymagane wpisy.

<VirtualHost *:80>
	ServerName poczta.pl
	ServerAlias poczta.szkolenie.pl
	DocumentRoot /var/www/poczta
</VirtualHost>

ServerName to podstawowa nazwa wirtualnego hosta, po której Apache rozpoznaje o który wirtualny host nam chodzi. ServerAlias natomiast może zawierać nazwę lub kilka nazw w postaci listy adresów alternatywnych, które są powiązane z głównym adresem. Po zapisaniu pliku z konfiguracją możemy uaktywnić nowy wirtualny host poleceniem:

a2ensite poczta

Ponowne uruchomienie serwera uwzględni zmiany w konfiguracji.


Certyfikat SSL

Certyfikat to zaszyfrowane informacje, które zawierają klucz publiczny i tożsamość serwera. Dodatkowo zawierają identyfikację i podpis wydawcy certyfikatu. Rozróżniamy dwa rodzaje certyfikatów, komercyjne podpisane przez zaufanych wydawców i prywatne certyfikaty podpisane przez nas. Obsługę SSL w serwerach Apache można zrealizować na dwa sposoby, albo pobrać specjalną dystrybucję Apache zawierającą wsparcie dla SSL lub wykorzystać moduł.

a2enmod ssl

W katalogu sites-available jest dołączony plik z domyślną konfiguracją serwera dla SSL a w nim parametr uruchamiający silnik SSL:

SSLEngine On

Teraz trzeba wygenerować pliki certyfikatu i klucza oraz podać ich ścieżki dostępu w pliku z konfiguracją. Przechodzimy do katalogu w którym chcemy utworzyć plik z kluczem prywatnym i wykonujemy komendę:

openssl genrsa -out www.szkolenie.pl.key 1024

Został utworzony 1024 bitowy klucz prywatny. Następnie generujemy żądanie podpisania certyfikatu:

openssl req -new -key www.szkolenie.pl.key -out server.csr

Uzupełniamy informacje o nas, które znajdą się w certyfikacie. Podajemy kolejno:

kod kraju: PL
województwo: malopolskie
miasto: Krakow
nazwa firmy lub organizacji: Poczta Polska
dział jednostki organizacyjnej:można pominąć
nazwa identyfikująca nasz serwer np. pełny adres: www.szkolenie.pl
e-mail: poczta@szkolenie.pl

Ostatnie dwa parametry możemy pominąć. Został utworzony plik pośredni, który teraz sami podpiszemy.

x509 -req -days 365 -in server.csr -signkey www.szkolenie.pl.key -out www.szkolenie.pl.crt

Został wygenerowany podpisany przez nas plik certyfikatu, teraz musimy aktywować konfigurację hosta dla SSL:

a2ensite default-ssl

Teraz otwieramy w przeglądarce adres poprzedzony protokołem https://szkolenie.pl. Certyfikaty z własnym podpisem nie są zaufane, dlatego otrzymamy ostrzeżenie. Jedynym rozwiązaniem jest dodać wyjątek lub wykupić podpis u zaufanego wydawcy certyfikatów.


Proxy

Serwer proxy to serwer pośredniczący. Z jednej strony po otrzymaniu zapytania pełni rolę serwera a jednocześnie pełni rolę hosta, który wysyła zapytanie do zewnętrznego serwera z którego mają zostać pobrane dane. W przypadku Apache serwer proxy wykorzystywany jest głównie do zwiększenia bezpieczeństwa poprzez dostarczanie zasobów do których normalnie nie ma dostępu z Internetu.

Aktywujemy moduł proxy

a2enmod proxy
a2enmod proxy_http

Proxy konfigurujemy dodając odpowiednie wpisy do konfiguracji wirtualnego hosta:

<VirtualHost *:80>
	ServerName allegro.szkolenie.pl
	ProxyPass / http://allegro.pl/
	ProxyPassReverse / http://allegro.pl/
	ProxyPreserveHost On
</VirtualHost>

ProxyPass pozwala na mapowanie zasobów naszego drzewa katalogów do zewnętrznych zasobów. ProxyPassReverse zapewniają prawidłową obsługę niektórych odpowiedzi z serwerów zewnętrznych, które stoją za serwerem proxy. ProxyPreserveHost kontroluje nazwę hosta w nagłówkach zapytań pomiędzy serwerami, co zapewnia pełną transparentność dla użytkownika.

Jeżeli chcemy aby Apache pełnił rolę proxy z prawdziwego zdarzenia, powinien on przechowywać odwiedzane strony w celu ich szybszego doręczania. Jedną z metod jest zapisywanie plików w pamięci podręcznej na dysku. W tym celu aktywujemy moduł:

a2enmod disk_cache

I dopisujemy kilka parametrów:

ProxyRequests On
CacheRoot /var/www/cache
CacheEnable disk /
CacheDirLevels 2
CacheMaxFileSize 100000000
CacheDefaultExpire 604800

Podajemy katalog, w którym mają być przechowywane dane, maksymalny rozmiar plików, które mają być przechowywane podane w bajtach oraz czas w sekundach po którym pliki w pamięci podręcznej wygasną.