Professional Documents
Culture Documents
KATEDRA INFORMATYKI
Serwer WWW
Komercyjny serwer www oparty na appache
Zespół autorski:
Łukasz Kawulok E-mail: luc@ernie.icslab.agh.edu.pl
Spis treści
1. Wstęp i opis zadań ____________________________________________________________________ 4
2
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
6.1.1. MaxKeepAliveRequests_________________________________________________________ 26
6.1.2. MinSpareServers______________________________________________________________ 26
6.1.3. MaxSpareServers _____________________________________________________________ 26
6.1.4. StartServers __________________________________________________________________ 26
6.1.5. MaxClients __________________________________________________________________ 26
6.1.6. MaxRequestsPerChild _________________________________________________________ 27
6.2. mod_mmap_static moduł Apache’a______________________________________________ 27
6.2.1. Zmapowanie dokumentów do pamięci: ____________________________________________ 27
6.2.2. Modyfikacja httpd.conf_________________________________________________________ 27
7. Klika zabezpieczeń Appache’a _________________________________________________________ 28
7.1. Read-only na “httpd” _________________________________________________________ 28
7.2. Katalogi_____________________________________________________________________ 28
7.3. Automatic indexing ___________________________________________________________ 28
7.4. Zabezpieczenie “httpd.conf”____________________________________________________ 28
8. Składnia podstawowych dyrektyw ______________________________________________________ 29
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
3
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
W rozdziale drugim opisujemy podstawy konfiguracji wirtualnych serwisów, zarówno tych bazujących na
nazwach jak i na adresach IP. Kolejny rozdział to przykładowe konfiguracje, które ułatwiają zrozumienie
podstawowych zasad konfiguracji.
Dalej, w rozdziale czwartym opisujemy zasady działania i konfigurację suExec’a – programu
odpowiedzialnego za uruchamianie skryptów CGI z innymi prawami użytkownika niż prawa użytkownika
uruchamiającego serwis. Po krótkim opisie logów i składni podstawowych poleceń przechodzimy do naszej
konfiguracji.
W opisie konfiguracji akcentujemy głównie zmiany w stosunku do domyślnej konfiguracji.
Na koniec zajmujemy się skryptami analizującymi logi napisanie napisanymi przez nas. Skrypty te generują
informacje o:
• 10. najczęściej odwiedzanych serwisach
• 10. najczęstszych adresach, z których ktoś ogląda strony www serwera.
W zadaniu używaliśmy serwera WWW – apache_1.3.23, który jest dostępny pod adresem:
http://www.apache.org/dist/httpd/.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
4
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Określenie Virtual Host do sytuacji gdy na jednej maszynie utrzymujemy więcej niż jeden serwer
odróżniany przy pomocy jego nazwy – hostname. Przykładem może być sytuacja gdy w dowolnej firmie
serwer WWW jest dzielony pomiędzy różne domeny i są one dostępne poprzez nazwy:
www.company1.com, www.company2.com. Nie wymaga to od użytkownika znajomości żadnych
dodatkowych ścieżek w głównej domenie firmy, tylko znajomości tych nazw domen..
Appache był jednym z pierwszych serwerów WWW który wspierał IP-based (bazujące na adresie IP)
wirtualne hosty. Od wersji 1.1 Apache udostępnia zarówno IP-based, jak i name-based (bazujące na
nazwach) wirtualne hosty.
Poniżej omówimy oba rozwiązania (oczywiście rozwiązania mieszane także są możliwe). Dla szybkiego
zrozumienia idei wirtualnych hostów najlepiej nadają się przykłady zamieszczone w następnym rozdziale.
Wirtualne serwery WWW bazujące na nazwie są w gruncie rzeczy prostsze do konfiguracji, ponieważ
wystarczy odpowiednio skonfigurować DNS’a, (lub inaczej rezolwoać nazwy hostów) aby ten mapował
każdy z hostów do odpowiedniego jednego adresu IP i następnie skonfigurować serwer Appache do
rozpoznawania tych różnych hostów. Dodatkowo nie cierpimy tu na brak adresów IP. Dlatego zalecane jest
używanie wirtualnych serwerów bazujących na nazwach, poza pewnymi specyficznymi przypadkami, z
których kilka wymieniamy poniżej:
• Niektóre starsze przeglądarki – klienci – nie są kompatybilne z wirtualnymi serwerami bazującymi
na nazwach, ponieważ dla ich poprawnego działania klient musi wysyłać nagłówek HTTP Host
Header. Jest on wymagany przez HTTP/1.1, a nowoczesne przeglądarki mają go zaimplementowany
jako rozszerzenie HTTP/1.0.
• Ze względu na naturę protokołu SSL wirtualne serwery bazujące na nazwach nie mogą być używane
z tym protokołem.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
5
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
• Niektóre systemy, lub wyposażenie implementujące zarządzanie pasmem przepustowości nie potrafi
rozróżniać hostów jeśli nie mają one odrębnych adresów IP.
Jeżeli chcemy używać wirtualne serwery bazujące na nazwach to musimy określić adres IP (jeśli to możliwe
to również port) na serwerze który będzie akceptował żądania dla tych hostów. Konfigurujemy to przy
użyciu dyrektywy NameVirtualHost. W standardowym przypadku, kiedy jakikolwiek i każdy z adresów IP
na serwerze ma być użyty w tym celu można użyć * – jako argumentu w dyrektywie NameVirtualHost.
(dotyczy to tylko wersjo 1.3.13 i późniejszych). Użycie adresu IP w dyrektywie NameVirtualHost nie
powoduje automatycznie, że serwer będzie na tym porcie nasłuchiwał. Adres taki musi być oczywiście
połączony z interfejsem sieciowym serwera.
Kolejnym krokiem w konfiguracji jest określenie bloków <VirtualHost> dla każdego z hostów które chcemy
obsłużyć. Argument tej dyrektywy powinien być taki sam jak NameVirtualHost (tzn. ten sam adres IP, lub
*). Wewnątrz każdego z takich bloków <VirtualHost> musi wystąpić minimalnie dyrektywa ServerName ,
która określa wybrany serwer i dyrektywa DocumentRoot, która określa gdzie w systemie plików znajduje
się zawartość dla tego serwera.
Poniższy prosty przykład ilustruje taką sytuację. Załóżmy , że mamy dwie domeny: www.domain.tld i
www.otherdomain.tld i mają one przypisany ten sam adres IP. W pliku http.conf dopisujemy poniższe linie.
NameVirtualHost *
<VirtualHost *>
ServerName www.domain.tld
DocumentRoot /www/domain
</VirtualHost>
<VirtualHost *>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
6
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Zamiast gwiazdek można wpisać konkretny adres serwera. (jest on wymagany w wersjach wcześniejszych
od 1.3.13)
Wiele serwerów chce być dostępnych poprzez więcej niż jedną nazwę. Jest to możliwe przy użyciu
dyrektywy ServerAlias umieszczonej w sekcji <VirtualHost>. Przykładowo dodanie do pierwszego bloku z
sekcją dla wirtualnych hostów następującej linii:
ServerAlias domain.tld *.domain.tld
Spowoduje, że wszystkie zapytania w domenie domain.tld będą obsługiwane przez wirtualny serwer
www.domain.tld. Można tutaj używać znaków zastępujących * i ?.
W sekcjach mogą być także używane inne dyrektywy które określają wtedy tylko konfigurację wybranego
wirtualnego hosta i nie mają wpływu na konfigurację pozostałych hostów.
W momencie przybycia żądania, serwer sprawdza czy używa ono adresu IP używanego przez wirtualne
hosty. Jeśli adres ten pasuje do dyrektywy NameVirtualHost, to przeszukiwane są kolejne sekcje
<VirtualHost> z pasującym adresem IP i próbuje znaleźć jedną gdzie ServerAlias lub ServerName pasuje do
żądanej nazwy hosta. Jeżeli jakiś wirtualny host zostanie w ten sposób znaleziony to jego konfiguracja jest
używana, jeśli nie to używana jest konfiguracja dla pierwszego wymienionego wirtualnego serwera. Dlatego
jest on często nazywany default virtual host (domyślnym wirtualnym hostem).
Jak już było wspominane wcześniej niektóre starsze przeglądarki nie wysyłają danych potrzebnych dla
prawidłowej pracy wirtualnych serwerów opartych na nazwach. Ci klienci będą zawsze wysyłani do
domyślnego wirtualnego hosta dla określonego adresu IP (the primary name-based virtual host).
Jednak przy użyciu dyrektywy ServerPath można zrobić pewne obejście dla takich wypadków. Obrazuje go
poniższy przykład.
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName www.domain.tld
ServerPath /domain
DocumentRoot /web/domain
</VirtualHost>
Daje to taką możliwość, że teraz zapytanie URI: http://www.domain.tld/domain/ będzie obsługiwane przez
serwer www.domain.tld dla wszystkich klientów pomimo faktu, że dla tych którzy wysyłają odpowiedni
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
7
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
nagłówek może być dostępny przez: http://www.domain.tld/. Aby to działało należy w głównym wirtualnym
hoście dodać link do http://www.domain.tld/domain/.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
8
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
9
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Proponowana konfiguracja:
...
Port 80
ServerName server.domain.tld
NameVirtualHost *
<VirtualHost *>
DocumentRoot /www/domain
ServerName www.domain.tld
...
</VirtualHost>
<VirtualHost *>
DocumentRoot /www/subdomain
ServerName www.sub.domain.tld
...
</VirtualHost>
Wszystkie możliwe nazwy hostów są obsługiwane więc serwer bazowy nie będzie obsługiwał żadnych
odwołań. Z uwagi na fakt, że www.domain.tld jest pierwszy w liście serwerów ma on najwyższy priorytet i
może on być uznawany, za domyślny.
3.1.2. Przykład 2
Maszyna serwera ma aders IP (111.22.33.44) który rezolwuje na nazwę server.domain.tld. Dodatkowo
mamy dwa aliasy www.domain.tld i www.sub.domain.tld dla adersu 111.22.33.44.
Proponowana konfiguracja:
...
Port 80
ServerName server.domain.tld
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
DocumentRoot /www/domain
ServerName www.domain.tld
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
10
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
...
</VirtualHost>
<VirtualHost 111.22.33.44>
DocumentRoot /www/subdomain
ServerName www.sub.domain.tld
...
</VirtualHost>
Poza localhost’em nie ma niewyspecyfikowanych adresów/portów dlatego bazowy serwer rezolwuje tylko
zapytania na localhost. Z uwagi na fakt, że www.domain.tld jest pierwszy w liście serwerów ma on
najwyższy priorytet i może on być uznawany, za domyślny.
3.1.3. Przykład 3
Maszyna na której jest serwer ma dwa adresy IP (111.22.33.44 i 111.22.33.55) które rezolwują do nazw
server1.domain.tld i server2.domain.tld. Alias www.domain.tld powinien być użyty dla serwera głównego
i powinien przechwytywać niewyspecyfikowane adresy. Chcemy używać wirtualnego hosta dla aliasu i
innego wirtualnego hosta o nazwie www.sub.domain.tld, dla żądań o host postaci *.sub.domain.tld.
Wirtualne hosty powinny używać adresu 111.22.33.55.
Proponowana konfiguracja:
...
Port 80
ServerName www.domain.tld
DocumentRoot /www/domain
NameVirtualHost 111.22.33.55
<VirtualHost 111.22.33.55>
DocumentRoot /www/otherdomain
ServerName www.otherdomain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.55>
DocumentRoot /www/subdomain
ServerName www.sub.domain.tld
ServerAlias *.sub.domain.tld
...
</VirtualHost>
Każde żądanie do adresu innego niż 111.22.33.55 będzie obsługiwane przez serwer główny. Żądanie do
111.22.33.55 z nieznanym lub bez nagłówka Host: będzie obsługiwane przez www.otherdomain.tld.
3.1.4. Przykład 4
Maszyna z serwerem ma dwa adresy IP (192.168.1.1 i 111.22.33.55). Maszyna znajduje się pomiędzy
wewnętrzną (intranet) i zewnętrzną (internet) siecią. Na zewnątrz sieci nazwa server1.domain.tld resolwuje
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
11
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Do zewnętrznego adresu IP (111.22.33.55), ale wewnątrz sieci, ta sama nazwa rezolwuje do wewnętrznego
adresu IP (192.168.1.1).
Ten serwer może być tak skonfigurowany, aby odpowiadał na zewnętrzne i wewnętrzne zapytania tą samą
zawartością przy użyciu tylko jednego wirtualnego serwera.
Proponowana konfiguracja:
...
NameVirtualHost 192.168.1.1
NameVirtualHost 111.22.33.55
<VirtualHost 192.168.1.1 111.22.33.55>
DocumentRoot /www/server1
ServerName server1.domain.tld
ServerAlias server1
...
</VirtualHost>
3.1.5. Przykład 5
Przykład ten pokazuje użycie serwera o jednym IP do obsługi wielu domen przy pomocy portów. Ważne
jest, że w tagach "NameVirtualHost" specyfikowany jest także port. Próba użycia <VirtualHost name:port>
bez wcześniejszego NameVirtualHost name:port nie zadziała
Proponowana konfiguracja:
...
NameVirtualHost 111.22.33.44:80
NameVirtualHost 111.22.33.44:8080
<VirtualHost 111.22.33.44:80>
ServerName www.domain.tld
DocumentRoot /www/domain-80
</VirtualHost>
<VirtualHost 111.22.33.44:8080>
ServerName www.domain.tld
DocumentRoot /www/domain-8080
</VirtualHost>
<VirtualHost 111.22.33.44:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain-80
</VirtualHost>
<VirtualHost 111.22.33.44:8080>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain-8080
</VirtualHost>
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
12
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
3.2.2. Przykład 2
Sytuacja jak wyżej ale nie chcemy mieć serwera bazowego.
Proponowana konfiguracja:
...
Port 80
ServerName server.domain.tld
<VirtualHost 111.22.33.44>
DocumentRoot /www/domain
ServerName www.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.55>
DocumentRoot /www/otherdomain
ServerName www.otherdomain.tld
...
</VirtualHost>
Serwer bazowy jest niedostępny ponieważ wszystkie adresy IP maszyny są użyte przez bazujące na IP
wirtualne hosty (tylko żądanie do localhost może dosięgnąć ten serwer).
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
13
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
3.2.3. Przykład 3
Maszyna serwera ma dwa adresy IP(111.22.33.44 i 111.22.33.55) które rezolwwują do nazw
server.domain.tld i www-cache.domain.tld. Nazwa hosta www.domain.tld jest aliasem dla server.domain.tld i
reprezentuje serwer bazowy. www-cache.domain.tld stanie się proxy-cache nasłuchującym na porcie 8080,
kiedy sam web serwer używał będzie portu 80.
Proponowana konfiguracja:
...
Port 80
Listen 111.22.33.44:80
Listen 111.22.33.55:8080
ServerName server.domain.tld
<VirtualHost 111.22.33.44:80>
DocumentRoot /www/domain
ServerName www.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.55:8080>
ServerName www-cache.domain.tld
...
<Directory proxy:>
Order Deny,Allow
Deny from all
Allow from 111.22.33
</Directory>
</VirtualHost>
Główny serwer jest nieosiągalny, bo wszystkie adresy IP (poza localhost) są używane przez wirtualne hosty
bazujące na IP. Web serwer jest osiągalny tylko poprzez pierwszy adres na porcie 80 a proksy tylko poprzez
drugi adres na porcie 8080.
...
Port 80
ServerName server.domain.tld
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
14
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
DocumentRoot /www/domain
ServerName www.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.44>
DocumentRoot /www/subdomain1
ServerName www.sub1.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.44>
DocumentRoot /www/subdomain2
ServerName www.sub2.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.55>
DocumentRoot /www/otherdomain1
ServerName www.otherdomain1.tld
...
</VirtualHost>
<VirtualHost 111.22.33.66>
DocumentRoot /www/otherdomain2
ServerName www.otherdomain2.tld
...
</VirtualHost>
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
15
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
3.5.2. Przykład 2
Konfiguracja jak serwera wyżej , przy czym serwer nasłuchuje na różnych portach, przy czym my chcemy
użyć drugiego _default_ vhost dla portu 80.
Proponowana konfiguracja:
...
<VirtualHost _default_:80>
DocumentRoot /www/default80
...
</VirtualHost>
<VirtualHost _default_:*>
DocumentRoot /www/default
...
</VirtualHost>
Domyślny vhost dla portu 80 (który musi pojawić się przed default vhost z gwiazdką) łapie wszystkie
żądania do niewyspecyfikowanych IP. Główny serwer nie jest nigdy używany.
3.5.3. Przykład 3
Chcemy mieć default vhost dla portu 80, ale żadnych innych domyślnych vhosts.
Proponowana konfiguracja:
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
16
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
...
<VirtualHost _default_:80>
DocumentRoot /www/default
...
</VirtualHost>
Żądanie do niewyspecyfikowanego adresu na port 80 jest obsługiwane przez default vhost ,a wszystkie inne
żądania do niewyspecyfikowanego adresu i portu są obsługiwane przez serwer główny.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
17
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
sub1-vhost jeśli klient wysyła odpowiedni nagłówek correct Host :header. Gdy nagłówek nie jest
wysyłany klient dostaje stronę informacyjną z pierwszego hosta.
Żądanie do http://www.sub2.domain.tld/sub1/ jest również zawsze obsługiwane przez sub1-vhost jeśli klient
nie wysyła nagłówka.
Dyrektywa RewriteRule używana jest w celu upewnienia się, że klient wysyłający poprawny nagłówek
może używać obu wariantów URL tj. z lub bez prefix’a URL.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
18
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
19
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
--enable-suexec
Włączenie seEXeC’a do instalacji
--suexec-caller=UID
Użytkownik który normalnie uruchamia serwer Appache, jedyny możliwy.
--suexec-docroot=DIR
Określa DocumentRoot (główny katalog) dla Apache. Początek hierarchii używanej przez seEXEC.
Domyślnie wartość --datadir z sufiksem "/htdocs", np. jeśli konfigurujemy z --
datadir=/home/apache" to katalog "/home/apache/htdocs" jest używany jako główny dla
suEXECa.
--suexec-logfile=FILE
Nazwa pliku do logowania błędów, domyślnie "suexec_log" w katalogu (--logfiledir).
--suexec-userdir=DIR
Określa podkatalog w katalogach użytkowników gdzie suEXEC ma mieć dostęp. Wszystkie
uruchamialne programy w tym katalogu będą uruchamiane jako programu użytkownika więc powinny
być bezpieczne. Wartość domyślna to "public_html".
W przypadku serwerów wirtualnych z różnymi UserDir dla każdego z nich, konieczne jest określenie
dla nich jednego katalogu wspólnego wyżej w hierarchii.
--suexec-uidmin=UID
Najniższy UID dopuszczony do użycia przez suEXEC. Dla większości systemów 100 lub 500 jest
domyślne.
--suexec-gidmin=GID
Najniższy GID dopuszczony do użycia przez suEXEC. Dla większości systemów 100 jest domyślne.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
20
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
--suexec-safepath=PATH
Określa bezpieczną ścieżkę w środowisku do plików uruchomieniowych CGI. Domyślnie
"/usr/local/bin:/usr/bin:/bin".
Przed instalacją można sprawdzić ustawienia dla suEXEC’a przy pomocy opcji –layout.
Dalsza instalacja przebiega standardowo, a domyślnym katalogiem dla suEXEC’a jest
"/usr/local/apache/sbin/suexec". Po uruchomieniu Appache szuka suexec’a w tym właśnie katalogu. Jeśli
znajdzie lub nie to loguje informację o nim do error_log’aa.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
21
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
5. Format Logów
Serwer Appache ma bardzo rozbudowany format logów. W naszym przypadku poza standardowym
error_log‘iem który informował nas o błędach konfiguracji czy też uruchomieniu np. suExeca używaliśmy
też logów do zrzucania informacji które następnie analizowaliśmy w celu uzyskania danych o ilości
odwiedzin poszczególnych serwisów.
Bardzo wygodnym mechanizmem jest definiowanie stringu opisującego formatowanie logów. Umożliwia to
wyłuskanie i zapisanie tylko tych informacji które nas interesują. I takie rozwiązanie zastosowaliśmy dla
naszego zadania przypisując nazwę dla stworzonego przez nas formatu i aplikując ją do wszystkich logów
poszczególnych wirtualnych serwerów. Umieszczenie dyrektywy określającej plik docelowy i format
generowania logów wewnątrz deklaracji wirtualnego hosta możemy albo zapisywać informacje do osobnych
logów dla każdego serwisu (tak jak w naszym wypadku), albo do jednego wspólnego logu odpowiednio
oznaczając każdy serwis który z wpisów jest wygenerowany przez niego. (Patrz przykład w pkt 8). Możliwe
jest także rozwiązanie pośrednie w którym cześć logów jest zapisywana do osobnych logów a część do
wspólnego.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
22
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Mamy tutaj zdefiniowana nazwe common dla określonego stringu formatującego. Poszczególne fragmenty
logów mają w sobie znak %_ który określa jaka informacja ma zostać w tym miejscu umieszczona. W
stringu tym zupełnie tak jak w printfie mogą być umieszczone napisy które zostaną skopiowane do loga.
Znaczek ” musi być zaback-slash’owany, a format może zawierać także takie znaki specjalne jak „\n” czy
„\t”.
Dyrektywa CustomLog tworzy nowy plik z logami przy użyciu formatu określonego przez nazwe (np. jak
wyżej – common). Log jest tworzony w katalogu względnym do ServerRoot, chyba, że zaczyna się od
slasha.
Powyżej przedstawiona konfiguracja zapisuje logi w formacie znanym jako (CLF) – Common Log Format –
i wygląda następująco.
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0"
200 2326
Jest to adres IP klienta (remote host) który robi zapytania do serwera. Jeśli HostNameLookups jest włączone,
To serwer próbuje określić hostname i zalogować właśnie ją zamiast adresu IP. Jednak nie jest to polecane z
uwagi na zwalnianie pracy serwera. Lepiej użyć post-processora logów jak np. logresolve w celu otrzymania
nazw hostów. Jeśli pomiędzy użytkownikiem i serwerem jest proksy do serwer pamięta tylko adres tego
Proksy.
5.3.2.2. (%l)
Napis "hyphen" oznacza ze jakieś informacje nie były dostępne. Apache httpd mnie będzie nawet próbował
dostępować do logu , chyba, że jest włączony IdentityCheck.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
23
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Linia żądania od klienta w podwójnych apostrofach. Zawiera ono wiele cennych informacji. Po pierwsze
Klient używa metody GET.Po drugie żąda pliku /apache_pb.gif, po trzecie używa protokołu
HTTP/1.0.
Można także logować tylko części tej linii żądania klienta. Dla przykładu string "%m %U%q %H" zaloguje
metodę, ścieżkę, string zapytania, protokół zwracając to samo co "%r".
Kod statusu wysyłany zwrotnie do klienta. Określa czy operacja była pomyślna – zazwyczaj zaczynająca się
od 2), przy przekierowaniu (3), błędy z powodu klienta (4), błędy serwera (5). Pełną listę można znaleźć w
HTTP specification (RFC2616 section 10).
Ostatni element jest rozmiarem obiektu zwracanym do klienta , bez nagłówków. Jeśli nic nie było zwracane
to będzie to „-” Żeby logować „0” dla pustego rozmiaru używamy %B zamiast małej litery.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
24
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Ten format dokładnie odpowiada Common Log Format, ale ma dwa dodatkowe pola. Każde z nich używa
dyrektywy %{ header}i, gdzie header może być dowolnym zapytaniem HTTP. Log dostępu z tym
formatem wygląda następująco.
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200
2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98;;Nav)"
Dodatkowe pola to:
"http://www.example.com/start.html" (\"%{Referer}i\")
"Referer" (sic) to HTTP request header. Daje stronę i klienta który się z niej łączy. (Powinna to być strona
która zawiera /apache_pb.gif).
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
25
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Poniżej opisane są optymalizacje osiągów serwera WWW proponowane w książce: „Securing and
Optimizing Linux: RedHat Edition, A hands on guide for Linux professionals” autorstwa Gerhard
Mourani’ego. Ogólnie zmiany dotyczą kilku aspektów wydajnościowych, których takie ustawienia są
rekomendowane przez różne benchmarki.
6.1.2. MinSpareServers
MinSpareServers 16
Opcja “MinSpareServers” określa minimalną ilość bezczynnych procesów dzieci serwera, który nie
obsługuje żądań. Jest to ważny parametr tuning’owy. Dla bardzo obciążających operacji, rekomendowana
jest wartość “16”.
6.1.3. MaxSpareServers
MaxSpareServers 64
Opcja “MaxSpareServers” określa maksymalną ilość bezczynnych procesów dzieci serwera, który nie
obsługuje żądań. Jest to również ważny parametr tuning’owy. Dla bardzo obciążających operacji,
rekomendowana jest właśnie wartość “64”.
6.1.4. StartServers
StartServers 16
Opcja “StartServers” określa ilość procesów dzieci serwera, która zostanie uruchomiona na starcie serwera.
Tak jak poprezadnio jest to parametr tuning’owy Apache’a. Najbardziej zalecana jest wartość “16”
6.1.5. MaxClients
MaxClients 512
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
26
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Opcja “MaxClients” określa ilość równoczesnych zapytań jakie Appache może obsługiwać. Najbardziej
optymalna jest wartość “512”.
6.1.6. MaxRequestsPerChild
MaxRequestsPerChild 100000
Opcja “MaxRequestsPerChild” określa ilość żądań na które pojedynczy proces potomny może odpowiadać.
I z tych samych przyczyn co wcześniejsze opcje ma być ustawiony na taką wartość.
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
27
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Zmiana uprawnień do poszczególnych plików Web Server’a Appache może znacznie wpłynąć na jego
bezpieczeństwo. Podczas instalacji wiele z tych plików ma ustawione domyślnie zbyt wiele uprawnień.
Poniżej przedstawiamy kilka dodatkowych czynności które mogą temu zaradzić.
7.2. Katalogi
Katalogi “/etc/httpd/conf” i “/var/log/httpd” nie muszą być oni do odczytu, zapisu czy wykonywania przez
innych.
[root@deep /]# chmod 511 /usr/sbin/httpd
[root@deep /]# chmod 750 /etc/httpd/conf/
[root@deep /]# chmod 750 /var/log/httpd/
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
28
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
<VirtualHost> directive
Syntax: <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
Compatibility: Non-IP address-based Virtual Hosting only available in Apache 1.1 and later.
Compatibility: Multiple address support only available in Apache 1.2 and later.
NameVirtualHost directive
Syntax: NameVirtualHost addr[:port]
ServerName directive
Syntax: ServerName fully-qualified-domain-name
ServerAlias directive
Syntax: ServerAlias hostname [hostname] ...
Compatibility: ServerAlias is only available in Apache 1.1 and later.
ServerPath directive
Syntax: ServerPath directory-path
Compatibility: ServerPath is only available in Apache 1.1 and later.
DocumentRoot directive
Syntax: DocumentRoot directory-path
Default: DocumentRoot /usr/local/apache/htdocs
User directive
Syntax: User unix-userid
Default: User #-1
Group directive
Syntax: Group unix-group
Default: Group #-1
CustomLog directive
Syntax: CustomLog file|pipe format|nickname [env=[!]environment-variable]
Compatibility: Nickname only available in Apache 1.3 or later. Conditional logging available in 1.3.5 or
later.
ScriptAlias directive
Syntax: ScriptAlias URL-path file-path|directory-path
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
29
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
9. Nasza konfiguracja
Konfiguracja poniższa jest przykładową konfiguracją, którą stworzyliśmy dla wirtualnych hostów
bazujących na nazwach, konfiguracja ta dotyczy tworzy kilka wirtualnych hostów: www.domain1.com,
www.domain2.com, www.domain3.com, ... oraz obsługuje skrypty CGI z prawami innymi dla każdego z
hostów, które odpowiadają użytkownikom : d1,d2,d3, a nie z prawami użytkownika uruchamiającego
serwer. Host pierwszy jest domyślnym hostem dla danego adresu IP i dlatego nie ma możliwości odwołania
się do bazowego serwera, chyba że poprzez localhost.
30
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
User d3
Group wwwdomains
ServerName www.domain3.com
DocumentRoot /home/d3/www
ScriptAlias /cgi-bin/ "/home/d3/www/cgi-bin/"
CustomLog /www/logs/host_domain3 logfrmt
</VirtualHost>
......
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
31
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Opis zmian:
HTTPD_USER – (odpowiada --suexec-caller=UID z konfiguracji razem z appachem) to
użytkownik uruchamiający samego Appache. U nas to właśnie nobody
USERDIR_SUFFIX – (--suexec-userdir=DIR) to podkatalog w katalogu użytkownika w którym
są uruchamiane skrypty CGI, u nas www/cgi-bin
DOC_ROOT – (--suexec-docroot=DIR) określa początek hierarhi katalogów w których seExec
może uruchamiać CGI
32
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Aby mieć możliwość analizowania informacji o ilości odwiedzin poszczególnych serwisów (naszych
wirtualnych hostów), po przetestowaniu różnych konfiguracji wirtualnych serwerów, skonfigurowaliśmy
nasz serwer w opisany powyżej sposób. Instalacja suExeca i obsługa sktyptów CGI nie jest związana z
informacjami w logach które przetwarzamy.
Rozwiązaniem które zastosowaliśmy jest generowanie logów przez każdy z wirtualnych serwerów do
osobnych plików w wcześniej stworzonym katalogu /www/logs/. Pliki te jak widać w konfiguracji to
odpowiednio host_domain1, host_domain2, host_domain3, .... Logować będziemy tylko
adresy IP hostów z których odwołania dotyczą poszczególnych wirtualnych serwerów.
LogFormat "%h" logfrmt # określenie formatu logu
# czyli tylko adres IP
NameVirtualHost 192.168.2.4
<VirtualHost 192.168.2.4>
User d1
Group wwwdomains
ServerName www.domain1.com
DocumentRoot /home/d1/www
ScriptAlias /cgi-bin/ "/home/d1/www/cgi-bin/"
CustomLog /www/logs/host_domain1 logfrmt # określenie pliku
# docelowego dla logów i jego formatu
</VirtualHost>
<VirtualHost 192.168.2.4>
User d2
Group wwwdomains
ServerName www.domain2.com
DocumentRoot /home/d2/www
ScriptAlias /cgi-bin/ "/home/d2/www/cgi-bin/"
CustomLog /www/logs/host_domain2 logfrmt #to samo dla kolejnego
# hosta
</VirtualHost>
...
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
33
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
34
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
#!/bin/bash
if [ -z "$1" ] #testuje czy podano argument
then #jesli nie podano
echo "nie podales nazwypliku, uzycie: 10ex <logfile>" #to komunikat i
exit 1 #wyjscie z progr
elif [ ! -e "$1" ] #testuje czy podany plik istnieje
then #jesli nie podano
echo "nie ma takiego pliku, uzycie: 10ex <logfile>" #to komunikat i
exit 2 #wyjscie z programu
else #jesli podano istniejacy plik
echo "10 adresow najczesciej odwiedzajacych serwis " #wypisanie
#informacji czego dotyczy skrypt
perl -e 'open(F,"@ARGV[0]"); #wywolanie perla z linia jako skrypt,
while($line = <F>){ #^otwarcie pliku i pentla po jego liniach
chop $line; #obcina karetke
$addresses{$line} += 1; #wpis do tablicy asocjacyjnej pod
#index lini
} #^lub inkrementacja istniejacego wpis
@tab = %addresses; #przepisanie do zwyklej tablicy
#ilosc,linia,ilosc,linia
$size = $#tab; #pobranie jej rozmiaru
for ($i=1; $i <= $size; $i+=2){ #petla co 2 po tej tablicy
print $tab[$i], " x adres:",$tab[$i-1],"\n"; #wypisanie ilosci x
#linia czyli IP z pliku
}
close F;' $1 |sort -gr|head #zamkniecie pliku, sortowanie liczbowe
#odwrocone i obciecie 10 pierwszych
fi #koniec ifa
exit 0 #wyjscie z programu
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
35
Łukasz Kawulok, Michał Jaeschke, Grzegorz Duda Administracja systemami komputerowymi
Plik: Serwer WWW.doc Wersja: 0.1-68 z dnia 07.06.2002 Stron: 36 Długość: 916 kB
Copyright © 2002 Akademia Górniczo-Hutnicza Prowadzenie zajęć: mgr inż. Bogusław Juza
36