{ }
menu zespół linki Logowanie
Stabilny hosting
BSDGuru zawdzięcza
firmie Datanet.pl
Hosting BSDGuru.org - DataNet.pl

Apache

Spis treści:

1.Wstęp.

2.Krótki opis apache.

3.Instalacja.

   3.1. Zdobywanie źródeł.

   3.2. Wybrane moduły apache.

     3.2.1. Mod_bandwidth.

     3.2.2. Mod_throttle.

     3.2.3. Mod_php4.

   3.3. Wykaz i opis standardowych modułów apache.

   3.4. Wprowadzenie do pisania własnych modułów.

   3.5. Bazy danych (mySQL, postgreSQL).

   3.6. Kompilowanie kodu źródłowego.

4.Konfiguracja.

   4.1. Pliki konfiguracyjne.

   4.2. Składnia.

   4.3. Główne dyrektywy.

5.Pierwsze uruchomienie serwera Apache.

   5.1. Uruchamianie, restartowanie, zatrzymywanie.

   5.2. Automatyczne uruchamianie serwera.

6.Przykładowe dyrektywy modułów z punktu 3.2.

7.Zabezpieczanie serwera i połączeń.

   7.1. Opis dyrektyw zabezpieczających serwer httpd.

   7.2. Wprowadzenie do SSL.

   7.3. Kompilacja apache do współpracy z SSL.

   7.4. CGI konfiguracja i bezpieczeństwo.

   7.5. PHP, kilka rad na zabezpieczenie skryptów.

8.Domeny wirtualne.

   8.1. Konfiguracja DNS.

   8.2. Składnia.

9.Apache chroot.

   9.1. Tworzenie katalogów.

   9.2. Kopiowanie potrzebnych plików, bibliotek.

  9.3. Testowanie.

1. WSTĘP

Autor artykułu, opisuje sposoby konfiguracji, instalacji serwera Apache,
dołożył wszelkich starań, aby opisane metody działały jak najwydajniej i efektywniej.

Autor opierał się tylko i wyłącznie o własne doświadczenie,
nie ponosi odpowiedzialności za wszelkie szkody powstałe na skutek wykorzystywania tego artykułu,
który ma na celu przedstawienie zagadanień związanych z obsługa serwera apache.

Na potrzeby artykułu został użyty serwer httpd APACHE w wersji 1.3.29.


2. Krótki opis apache

W dzisiejszej dobie internetu, liczy się przede wszystkim, szybkość, wydajność, stabilność, bezpieczeństwo.
Serwer httpd jakim jest Apache, posiada wszystkie cechy, które czynią go niezastąpionego w aplikacjach internetowych.

Apache jest najpopularniejszym serwerem httpd na świecie, według statystyk obsługuje dziś 62% witryn internetowych.
Umożliwia on uruchamianie skryptów pisanych w przeróżnych językach programowania. Jego `modułowość` daje ogromne
możliwości dostosowania do własnych potrzeb.
Jest to bezpłatna aplikacja udostępniana na zasadach Open Source.


3. Instalacja


3.1. Zdobywanie źródeł

Serwer można pobrać z www Apache Software Foundation dostępnej pod adresem :

http://www.apache.org.

źródło:


http://sunsite.icm.edu.pl/pub/www/apache/dist/httpd/apache_1.3.29.tar.gz

Dla potrzeb tego artykułu został użyty serwer w wersji 1.3.29.

Można oczywiście zainstalować w portów czyli: /usr/ports/apache13/ lub z paczek pkg_add z opcja "-r", lecz my
zajmiemy się instalowaniem serwera bezpośrednio ze źródeł.

Mamy już źródła apache na dysku teraz wystarczy rozpakować czyli:

# tar zxf apache_1.3.29.tar.gz
# cd apache-1.3.29

W tym momencie możemy przejść do następnego punktu czyli "wybieranie modułów apache"


3.2. Wybrane moduły apache

Modułów Apache w sieci jest wiele (pomijając te standardowe). My skupimy się na kilku najbardziej popularnych modułach.

Punkt 4.4 Opisuje szerzej wszystkie te moduły i sposoby ich konfiguracji.


3.3. Wykaz i opis standardowych modułów apache

mod_env - Ustawianie zmiennych środowiskowych dla skryptów CGI/SSI.

mod_setenvif - Ustawianie zmiennych środowiskowych na podstawie nagłówków HTTP.

mod_mime - Ustalanie typu treści, kodowania.

mod_negotiation - Wybieranie treści według nagłówków Accept* HTTP.

mod_alias - Tłumaczenie i przekierowanie adresów URL.

mod_userdir - Wybieranie katalogów zasobów według nazwy użytkownika.

mod_dir - Obsługa katalogów i domyślnych plików katalogowych.

mod_autoindex - Automatyczne generowanie indexów katalogów.

mod_access - Kontrola dostępu.

mod_auth - Uwierzytelnianie HTTP.

mod_asis - Nieprzetworzone odpowiedzi HTTP.

mod_include - Obsluga Server-Side Includes (SSI).

mod_cgi - Obsługa CGI.

mod_actions - Skrypty CGI jako wewnętrzne programy obsługi.

mod_status - Stan działania serwera.

mod_log_config - Rejestrowanie żądań.

mod_log_agent - Rejestrowanie nagłówków HTTP Referrer.


3.4. Wprowadzenie do pisania własnych modułów

Własne moduły to temat dla nieco bardziej zaawansowanych administratorów. Jeżeli jednak zdecydujemy się na takowy krok,
dostosujemy sobie serwer httpd do własnych potrzeb.

Opisze tutaj sposób przygotowania i kompilacji serwera apache do wprowadzenia w życie własnego modułu.
Aby zapoznać się szerzej proponuje przeczytać plik: src/modules/example/README.

Utwórz w katalogu /src/modules/ podkatalog o nazwie np.:

# mkdir src/modules/test-modul

Aby wstawić kod naszego modułu niezbędny będzie plik w tym podkatalogu np.: src/modules/test-modul/test.c
W pliku test.c powinien znajdować się kod naszego modułu.

W tym momencie możemy przystąpić do kompilacji z naszym modułem:

# ./configure -add-module=src/modules/test-modul/mod_test-modul.c \
--enable-module=test-modul
# make
# make install


3.5. Bazy danych (mySQL, postgreSQL)

Jeżeli pragniemy aby nasz serwer apache współpracował z bazami danych np. MySQL czy PgSQL musimy zaopatrzyć się w
odpowiednie źródła które znajdziemy:

W portach :

MySQL
/usr/ports/databases/mysql4X-server/

PgSQL
/usr/ports/databases/postgresXX/

X = numer wersji pakietu.

Lub bezpośrednio na stronach projektów :

W tym momencie jeżeli zdecydujemy się na bazy danych musimy skompilować źródła np. MySQL.

UWAGA: Aby bazy danych poprawnie funkcjonowały w aplikacjach internetowych należy je uwzględnić przy kompilacji PHP
(punkt 3.6), ponieważ to za pomocą tego języka będziemy mieli możliwość sprawnie
połączyć z się z baza danych.


3.6. Kompilowanie kodu źródłowego

Przed kompilacją kodu warto przeczytać opcje konfiguracyjne :

#./configure -help

Jeżeli już zdecydowałeś się na odpowiednie opcje, przejdźmy zatem do kompilacji php.

# tar -zxf php-4.3.4.tar.gz
# cd php-4.3.4
# ./configure --with-apache=../apache_1.3.29 \
--with-mysql

Warto zauważyć iż użyliśmy opcji -with-mysql - to właśnie ta opcja jest odpowiedzialna za to iż PHP będzie poprawnie
funkcjonowało, gdy zechcemy połączyć się z baza.
W przypadku postgres robimy tak tamo z drobna różnicą : --with-pgsql.

Oczywiście użyliśmy tylko jedna opcje z wielu jakie oferuje nam:

#./configure -help

Nastepnie :

# make
# make install

Teraz PHP mamy na razie z głowy.
Następnie przechodzimy do katalogu ze źródłami apache:

# cd ../apache-1.3.29

Warto wspomnieć iż istnieje możliwość, aby utajnić nazwę naszego serwera httpd, lub po prostu `nazwać po swojemu`.

W takim celu przechodzimy do katalogu ze źródłami, a dokładnie do katalogu include :

# cd src/include

Widzimy plik httpd.h, wyedytujmy go i poszukajmy frazy : "tokens"

A dokładnie chodzi nam o:

#define SERVER_BASEVENDOR "Apache Group"
#define SERVER_BASEPRODUCT "Apache"
#define SERVER_BASEREVISION "1.3.29"

Zmieniamy sobie np. Numerek wersji czyli :

#define SERVER_BASEREVISION "1.0"

Aby zmiany takie weszły poprawnie w życie po instalacji apache należy w pliku
httpd.conf ustawić pewną dyrektywę, ale o tym w punkcie 4.3.

W takim razie, php, mysql mamy gotowe, nie pozostało nam nic innego jak tylko przejść do dalszej części.

Przystępujemy do konfiguracji:

# ./configure : --prefix=/katalog/przeznaczenia/apache \
--activate-module=src/modules/php4/libphp4.a \
--enable-module=php4 \
--add-module=../mod_bandwidth.c \
--add-module=../mod_throttle.c

--prefix , gdy chcemy aby apache leżał w innej lokalizacji niż /usr/local/apache

Oczywiście np. : '../mod_bandwidth.c' , zakładając że źródła modułu bandwidth mamy katalog wyżej.

# make
# make install

I do poprawnego funkcjonowania PHP skopiujmy jego plik konfiguracyjny w odpowiednie miejsce :

# cd ../php-4.3.4
# cp php.ini-dist /usr/local/lib/php.ini


4.Konfiguracja

Konfigurowanie apache to jedna z najważniejszych rzeczy z jakimi przyjdzie nam się zmagać.
Aby to uczynić należy zapoznać się z plikami konfiguracyjnymi, przejdźmy zatem do następnego punktu.


4.1. Pliki konfiguracyjne

Pliki konfiguracyjne standardowo znajdują się z /usr/local/apache/conf/ (jeżeli nie ustaliliśmy inaczej czyli -prefix).

Wyedytujmy plik httpd.conf, który de facto pełni role najważniejszego pliku konfiguracyjnego.


4.2. Składnia

W pliku httpd.conf istnieją dwa rodzaje dyrektyw są to : przypisania zmiennych i dyrektywy blokowe.

Przypisania zmiennych to : nazwa zmiennej i wartość.

Dyrektywy blokowe to np. :

<Directory "/lokalizacja/katalogu">

przypisania zmiennych
</Directory>

W pliku tym, znakiem komentarza jest # (aż do końca wiersza), wszystkie pozostałe wiersze są dyrektywami.


4.3. Główne dyrektywy.

Opisze tutaj główne dyrektywy, które wystarcza do poprawnego uruchomienia serwera apache.

ServerType

Dyrektywą tą określamy w jaki sposób ma być uruchamiany demon apache.
Jeżeli domyślnie :

ServerType standlone

Mamy możliwość uruchomić apache poprzez demon inetd czyli :

ServerType inetd

Co spowoduje, iż serwer apache będzie uruchamiany tylko wtedy jeżeli odbierze takowe żądanie. Aby dyrektywa ta
funkcjonowała poprawnie potrzebny jest oczywiście wpis w /etc/inetd.conf.

ServerRoot

Za pomocą tej dyrektywy określamy katalog apache (ten który podałeś w -prefix), w naszym przypadku jest to

ServerRoot "/usr/local/apache"
PidFile

Określamy ścieżkę pliku w którym apache zapisuje identyfikator swojego procesu

PidFile /usr/local/apache/logs/httpd.pid

ScoreBoardFile

Dyrektywa ta określa ścieżkę, w którym apache przechowuje informacje o procesie.

ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
Port

Port na którym serwer będzie nasłuchiwać, jeżeli będzie inny niż 80, w takim przypadku będziemy zmuszeni dołączać
do adresu www numer portu np.: http://www.naszadomena.pl:899 - to w przypadku podania jako port 899.
Dlatego tez ustawmy port 80 - standardowy port serwera httpd

Port 80

ServerAdmin

Czyli adres e-mail administratora serwera

ServerAdmin admin@twojadomena.pl

ServerName

Dyrektywa ta standardowo jest z oznaczona komentarzem #ServerName, w takim przypadku serwer pobiera wynik polecenia
`hostname`, w przeciwnym wypadku ustawiamy:

ServerName naszadomena.pl
DocumentRoot

Główny katalog, stron www na naszym serwerze
W naszym przypadku:

DocumentRoot "/usr/local/apache/htdocs/"
UserDir

Dyrektywa ta określa miejsce przechowywania stron naszych użytkowników, standardowo ustawione jest public_html,
ponieważ takowa nazwa jest chyba najbardziej popularna, nic nie stoi na przeszkodzie abyśmy nazwali np. stronki,
wtedy natomiast w katalogu użytkownika nie tworzymy standardowego public_html tylko katalog stronki,
my jednak przyjmiemy standard:

UserDir public_html

DirectoryIndex

Za pomocą tej dyrektywy ustalamy główne pliki stron www.

Przykładowo może wyglądać w ten sposób :

DirectoryIndex index.html index.php index.php3 index.htm

CustomLog

Czyli logi naszego serwera, warto zauważyć iż, do tego pliku wędrować będą logi z naszej strony głównej czyli z
/usr/local/apache/htdocs/ jak i strony użytkowników http://naszadomena.pl/~user, jeżeli natomiast mamy do czynienia z
hostem wirtualnym dla danego użytkownika wtedy zdefiniujemy sobie aby logowanie wędrowało do innego
pliku ale o tym w dyrektywach wirtualnych domen.

CustomLog /usr/local/apache/logs/access_log common

Istnieje kilka typów logowań jednym z nich jest tak jak wyżej 'common'

Przy kompilacji zmodyfikowaliśmy kod źródłowy aby serwer httpd odpowiadał inną wersją apache a dokładnie aby wskazywał
na wersie 1.1, by poprawnie to funkcjonowało musimy dodać :

ServerTokens Prod

W tym momencie jesteśmy gotowi do przetestowania :

# /usr/local/apache/bin/apachectl configtest

Powinniśmy zobaczyć :

Syntax OK

Jeżeli tak się stało przejdźmy zatem do następnego punktu.

5.Pierwsze uruchomienie serwera Apache

Sprawdźmy czy na pewno wszystko jest w jak najlepszym porządku:

# /usr/local/apache/bin/apachectl start

Z poziomu przeglądarki wpiszmy swój adres np:

http://217.20.20.20 - To oczywiście przykład, czyli nasz adres ip.

Powinniśmy ujrzeć, strone tytułową apache.

5.1. Uruchamianie, restartowanie, zatrzymywanie

Jak zdążyliśmy zauważyć uruchomiliśmy apache ze skryptu o nazwie apachectl - to właśnie ten skrypt jest odpowiedzialny
za startowanie, restartowanie i wyłączanie naszego serwera httpd.

Najważniejsze dla nas opcje:

start - Startowanie apache.
restart - Restartowanie.
stop - Zatrzymywanie serwera.
graceful - Restartowanie serwera, lecz takie którego nikt nie zauważy, czyli jeżeli ktoś pobiera plik z naszego serwera i
zrestartujemy z opcja graceful, nie przerwiemy akcji.
status - Szybsze sprawdzenie statusu poprawności działania naszego serwera.
configtest - Sprawdzenie składni pliku konfiguracyjnego.

5.2. Automatyczne uruchamianie serwera

Aby nasz serwer uruchamiał się automatycznie przy starcie serwera np. po restarcie, musimy napisać mały skrypcik w katalogu /usr/local/etc/rc.d/.

Tworzymy i edytujemy plik o nazwie np. apache.sh

#/bin/sh

case "$1" in
start)
echo -n "Startowanie serwera httpd"

/usr/local/apache/bin/apachectl start
;;
stop)
echo -n "Zatrzymywanie serwera httpd"
/usr/local/apache/bin/apachectl stop

;;

*)
echo "Usage: ./apache.sh{start|stop}"
exit 1
esac

6. Przykładowe dyrektywy modułów z punktu 3.2

Opisze tutaj standardowe dyrektywy, które dają nam pewność poprawnego funkcjonowania modułów.

mod_bandwidth :

Na początek, należy stworzyć katalogi modułu np.:

# mkdir /tmp/apachebw
# mkdir /tmp/apachebw/link
# mkdir /tmp/apachebw/master

Następnie wyedytujmy znany już plik httpd.conf :

BandWidthModule On

Dodajemy dyrektywę BandWidthDataDir, czyli lokalizacje stworzonego katalogu:

BandWidthDataDir /tmp/apachebw

W tym momencie moduł jest już zainicjowany, zajmijmy się teraz nałożeniem limitu przepustowości:

Przyjrzyjmy się dyrektywie "BandWidth"

Posiada ona kilka opcji do wyboru mianowicie:

BandWidth <domain|ip|all> <rate>

Czyli ograniczamy po domenie, po ip lub dla wszystkich.

Jeżeli życzymy sobie aby ograniczenie było zastosowane na cały serwer httpd i wszystkie katalogi piszemy :

BandWidth all 1024

W takim przypadku ograniczenie dotyczy wszystkich odwiedzających, a przepustowość to 1024 Bajtów czyli 1Kb

Możemy oczywiście zastosować tylko dla domeny czyli:

BandWidth domena.pl 1024

Lub ip, lub tylko jego klasy :

BandWidth 195.116 1024

W takim przypadku jeżeli adres odwiedzającego zaczyna się od 195.116, ma on do dyspozycji tylko 1Kb przepustowości.
Nic nie stoi na przeszkodzie abyśmy dali np. 100kb przepustowości, pamiętajmy jednak iż wartości w "BandWidth" mogą być
podawane tylko w bajtach.

Następnie jeżeli życzymy sobie aby niezależnie od odwiedzających każdy z nich miał do dyspozycji nie mniej niż 1kb/s
transferu podajemy w takim przypadku dyrektywę MinBandWidth:

MinBandWidth all -1
BandWidth all 1024

Tutaj mamy pewność, ze odwiedzający, przy ściąganiu np. pliku, nie będzie miał mniej niż 1Kb
(oczywiście w dyspozycji naszego łącza)

Jeżeli życzymy sobie aby tylko ograniczyć użytkowników z wybranego katalogu np. /home/users/, w takim przypadku
zdefinjujmy katalog:

<Directory "/home/users">
BandWidth all 1024
</Directory>

Więcej informacji na stronie projektu: www.cohprog.com/mod_bandwidth.html

mod_throttle:

Na początek wyedytujmy plik httpd.conf i dodajmy dyrektywy:

<IfModule mod_throttle.c>
ThrottlePolicy none

<Location /throttle-status>
SetHandler throttle-status
</Location>

<Location /throttle-me>

SetHandler throttle-me
</Location>

<Location /~*/throttle-me>
SetHandler throttle-me
</Location>
</IfModule>

przeładujmy serwer:

/usr/local/apache/bin/apachectl restart

Jeżeli ujrzeliśmy znany już nam: Syntax OK
Możemy sprawdzić, wpisując w przeglądarce:

http://www.naszedomena.pl/throttle-status

Lub danego użytkownika:

http://www.naszadomena.pl/~jasio/throttle-me

W module tym mamy do wyboru wiele opcji, jedną z nich jest blokowanie witryny po przekroczeniu danej ilości ściągniętych
danych, służy do tego dyrektywa: ThrottlePolicy np.

<Directory "/home/users/jasio/">

ThrottlePolicy Volume 1G 30d
</Directory>

W takim przypadku użytkownik może wykorzystać 1GB przepustowości w ciągu 30 dni.

Moduł ten posiada ciekawa opcje mianowicie : ThrottleClientIP

Możemy za pomocą tej dyrektywy ograniczyć ilość wizyt z jednego adresu ip, w przeciągu określonego czasu np.:

ThrottleClientIP 1024 Document 10 60

W takim przypadku, pozwalamy na 10 zapytań / minutę z danego adresu ip.

Moduł ten jest bardzo rozbudowany, ma szereg innych ciekawych opcji, dlatego zapraszam na : strone projektu:

http://www.snert.com/Software/mod_throttle/
.

mod_php4:

Skompilowaliśmy apache z modułem php, w takim przypadku należy jeszcze `powiedzieć` serwerowi httpd, aby umiał
interpretować pliki z rozszerzeniem .php

Dodajemy w pliku httpd.conf:

AddType application/x-httpd-php .php

Możemy już przeładować serwer:

# /usr/local/apache/bin/apachectl restart

Przechodzimy do katalogu /usr/local/apache/htdocs/

Tworzymy i edytujemy plik np. phpinfo.php i dodajemy:

<? phpinfo(); ?>

Zapisujemy i z poziomu przeglądarki wywołujemy plik:

Jeżeli oczom naszym ukazały się ładne tabelki z opcjami i konfiguracja naszego php, znaczy to iż wszystko jest w porządku.


7. Zabezpieczanie serwera i połączeń

Każda nowa usługa na serwerze na jaka się decydujemy, niesie za sobą nowe
ryzyko, dlatego też bardzo dużą uwagę należy
zwrócić na to w jakim stopniu jesteśmy ostrożni przy konfigurowaniu, a raczej nie dopuszczeniu aby ktoś spowodował szkody
na naszym serwerze.

Na początek należy przyjąć pewna twarda regułę :

Blokujemy wszystko, następnie puszczamy tylko to co jest / będzie nam potrzebne.
Jeżeli chodzi o serwer httpd Apache, ważnym jest śledzenie zmian i poprawek, dlatego tez zapraszam na stronę
http://www.apache.org/.


7.1. Opis dyrektyw zabezpieczających serwer httpd

Przedstawione dyrektywy oczywiście wpisujemy w plik httpd.conf.


LimitRequestBody

Dyrektywa ta ogranicza rozmiar treści żądania HTTP, Jeżeli żądanie przekroczy limit zostanie odrzucone z komunikatem o
błędzie. Dyrektywa ta zmniejsza ryzyko blokady usługi.
W dyrektywie tej 0 oznacza brak limitu, - ustawienie domyślne. Zakres to 0-2147483647.


LimitRequestFields

Ograniczenie dopuszczenia liczby pól nagłówka w żądaniu. Jeżeli przekroczony zostanie limit, żądanie zostanie odrzucone
z błędem(0 oznacza brak limitu) zakres to 0-32767.


LimitRequestFieldSize

Ograniczenie rozmiaru każdego nagłówka żądania - zmniejsza to ryzyko przepełnienia bufora (buffer-overflow).

Zakres to 0-8190 (0 oznacza brak limitu).

LimitRequestLine

Ograniczenie długości każdego wiersza. Zakres to 0-8190 (0 oznacza brak limitu).


RLimitCPU

Dyrektywa ta ogranicza liczbę sekund, przez którą proces może zajmować procesor, dyrektywa ta posiada dwa parametry pierwszy
limit miękki a drugi maksymalny, dyrektywa ta może też występować w <VirtualHost>


RlimitNProc

Ograniczenie liczby procesów, które mogą zostać odgałęzione przez każdy proces, przyjmuje jeden lub dwa parametry
liczbowe, tak jak dyrektywa wyżej.


KeepAlive

Dyrektywa ta włącza trwale połączenie, zwiększa to wydajność serwera, gdyż klient może zgłosić kilka żądań,
nie nawiązując za każdym razem oddzielnego połączenia, dyrektywa ta może przyjąć parametr on lub off.


KeepAliveTimeout

Wyznacza maksymalny czas oczekiwania na następne żądanie przez to samo połączenie.


MaxKeepAliveRequests

Ograniczenie liczby żądań zgłaszane przez to samo połączenie, domyślne ustawienie to 100, zalecane jest obniżenie tej
wartości.

7.3. Wprowadzenie do SSL

SSL odpowiada za szyfrowanie danych, miedzy warstwą transportu a warstwą aplikacji TCP, szyfruje wszystkie dane wychodzące
z aplikacji i deszyfruje dane wchodzące do aplikacji. W przypadku serwera httpd SSL zabezpiecza dokumenty czyli poufne dane.
Standardowo SSL oczekuje na zapytania na porcie 443, przeglądarka zgłasza takie zapytanie poprzez protokół https://.
SSL daje poczucie bezpieczeństwa, które jest tak ważne w dzisiejszej dobie internetu.

7.4. Kompilacja apache do współpracy z SSL

Na początek musimy zaopatrzyć się w źródła modułu ssl, które znajdziemy na stronie projektu http://www.modssl.org/.

A dokładniej ściągamy wersje pod apache w wersji 1.3.29


http://www.modssl.org/source/mod_ssl-2.8.16-1.3.29.tar.gz
.

Rozpakowywujemy źródła:

# tar zvf mod_ssl-2.8.16-1.3.29.tar.gz

Przechodzimy do katalogu

# cd mod_ssl-2.8.16-1.3.29

Konfigurujemy z podaniem ścieżki do naszych źródeł serwera apache :

# ./configure -with-apache=../apache-1.3.29

# make
# make install

Przechodzimy do katalogu apache :

# cd apache-1.3.29

I zaczynamy kompilacje tak jak w zrobiliśmy to wcześniej :

./configure : --prefix=/katalog/przeznaczenia/apache \
--activate-module=src/modules/php4/libphp4.a \
--enable-module=php4 \
--add-module=../mod_bandwidth.c \
--add-module=../mod_throttle.c

Do tego dodajemy jeszcze jedna opcje a dokładnie :

--enable-module=ssl

# make

I tworzymy certyfikat

# make certificate TYPE=custom

Po odpowiedzeniu na kilka zadanych pytań, zostanie utworzony certyfikat.
W tym momencie musimy zdecydować czy usuwamy hasło z klucza serwera, w przeciwnym wypadku przy każdym restarcie serwera
apache będziemy pytani o hasło, co w niektórych sytuacjach może przysporzyć problemu.

Jeżeli zdecydujemy się na takowy krok piszemy :

# cd ./conf/ssl.key
# openssl rsa -in ./server.key -out ./server.key

Podajemy hasło jakie wcześniej ustaliliśmy.

# cd ../../

# make install

Jeżeli wszystko zrobiliśmy bezbłędnie oznacza to iż jesteśmy gotowi do uruchomienia serwera z modułem ssl.

Jeszcze jedna ważna sprawa, przy tej instalacji został wygenerowany nowy plik konfiguracyjny:

/usr/local/apache/conf/httpd.conf.default

Proszę o zapoznanie się ze zmianami jakie nastąpiły - są to dyrektywy odpowiedzialne za poprawne funkcjonowanie SSL.

Od tego momentu zmienia się sposób uruchamiania serwera a dokładnie :

# /usr/local/apache/bin/apachectl startssl

Czyli opcja startssl.

Oczywiście użyliśmy metody, własnego podpisania certyfikatu. Jeżeli nie zdecydujemy się aby podpisała nam certyfikat
odpowiednia do tego celu instytucja, przy uruchomieniu protokołu https:// przeglądarka wyświetli nam komunikat iż
certyfikat został podpisany przez firmę która nie została sklasyfikowana jako godna zaufania.

7.5. CGI konfiguracja i bezpieczeństwo

CGI, ma ogromne zastosowanie, i udostępnia pełna moc systemu operacyjnego, jest to oczywiście zaleta ale i wada.

Ważne jest określenie komu pozwalasz na umieszczanie skryptów CGI a komu nie.

Aby poprawnie mogły funkcjonować skrypty CGI na koncie użytkownika musimy zdefiniować pewne dyrektywy. Na początek dodajemy :

AddHandler cgi-script .cgi

Następnie aby zezwolić użytkownikowi np. "jasio" który mieści się w katalogu /home/users/jasio piszemy :

<Directory "/home/users/jasio/public_html/cgi-bin/">

AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

Oczywiście w przypadku takim musi być stworzony katalog cgi-bin, zakładając ze to właśnie w tym katalogu użytkownik
będzie trzymał skrypty CGI.

Istnieje możliwość zrobienia aliasu do katalogu za pomocą dyrektywy "ScriptAlias".

Dobrym sposobem na zabezpieczenie się przed błędami programistycznymi naszych użytkowników jest korzystanie z nakładek CGI.

Czyli przed instalacją źródeł należy aktywować opcje "suexec", dokładne opcje opisane są po wydaniu komendy
./configure -help w katalogu apache.

Aby uaktywnić przed kompilacją apache czyli w ./configure dodajemy :

--enable-suexec - zbuduje plik binarny suexec, czyli program nakładki CGI.


7.6. PHP, kilka rad na zabezpieczenie skryptów

Jeżeli prowadzimy usługi typu hosting, bardzo ważnym elementem jest zabronienie, uruchamiania poleceń systemowych za pomocą
funkcji w php.

Czyli włączmy opcje Safe_Mode

Wyedytujmy plik /usr/local/lib/php.ini

Odszukujemy dyrektywę Safe_Mode i uaktywniamy ją zmieniając z off na on :

safe_mode = On

Oczywiście można tak, aby tylko użytkownicy mieli włączona taką opcje a np. my opcje tą wyłączoną, w takim przypadku edytujemy plik httpd.conf i piszemy :


php_admin_value safe_mode 0

Pamiętajmy o przeładowaniu serwera aby opcje mogły wejść w życie:

# /usr/local/apache/bin/apachectl restart

Opisze teraz ciekawy sposób utajnienia hasła do bazy danych np. MySQL

Edytujemy plik httpd.conf i wstawiamy następująca dyrektywę:

<Directory "/home/users/jasio/public_html">
php_admin_value disable_functions TUTAJ_HASLO_DO_BAZY
</Directory>

Nic nie stoi na przeszkodzie abyśmy wpisali jakiś string zakodowany, w takim przypadku nasz skrypt po otrzymaniu
zakodowanego hasła musiał by najpierw go rozkodować.
Jednak na potrzeby artykułu opisze sposób bez kodowania - tylko ukrycia hasła.

Mamy hasło w httpd.conf, w takim przypadku musimy pamiętać o tym abyśmy tylko my mieli prawo do odczytania pliku
httpd.conf czyli np.:

# chown root:wheel httpd.conf
# chmod 700 httpd.conf

Następnie przechodzimy do naszego skryptu łączącego się a bazą czyli tak jak zdefiniowaliśmy w dyrektywie powyżej:
edytujemy plik np. /home/users/jasio/public_html/connect_sql.php

<?php

$key = ini_get("disable_functions"); // Otzymujemy hasło z pliku httpd.conf

$connection = mysql_connect("localhost", "USER, "$key"); // $key czyli nasze pobrane haslo.

// itd. itd.
?>

Następna sprawa to standardowo pliki sesji trzymane są w /tmp/
Na ogół do tego katalogu mają dostęp również zwykli użytkownicy, co stwarza zagrożenie przejęcia sesji.

Istnieje możliwość umieszczenia plików sesji w innym katalogu niż standardowo
"/tmp/". Służy do tego funkcja PHP o nazwie : session_save_path();

Czyli rozkładając na kod PHP:

<?
$sess = "/home/users/jasio/public_html";
session_save_path($sess);
?>

Od razu nasuwa się myśl aby zakodować również podobnym sposobem jak metodą z hasłem ścieżkę gdzie trzymamy
katalog sesji, więc w przypadku takowym zasada jest ta sama.

8. Domeny wirtualne

Domeny wirtualne w Apache, mają przeogromne zastosowanie, szczególnie ważne przy usługach typu hosting.
Dzięki nim możemy tworzyć wirtualne serwery, dla każdej domeny zastosować indywidualne konfiguracje jak i zabezpieczenia.

8.1. Konfiguracja DNS

Aby poprawnie skonfigurować wirtualny host w apache, należy na początek poprawnie skonfigurować domenę.
Zalętą wirtualnych hostów jest to, iż możemy przykładowo obsługując 100 domen podpiąć je pod 1 adres ip, a apache zajmie
się już poprawnym interpretowaniem domen.

Dla przykładu, przyszło nam skonfigurować apache pod domenę "domena.com".

Zakładam iż masz już skonfigurowanego np. Bind`a (Named).

Przechodzimy do pliku strefy domeny domena.com, wyedytujmy ten plik :

Wydelegujmy domenę na konkretny adres ip i subdomenę www. również na konkretny ip.

Załóżmy ze nasz ip ma adres : 217.20.20.20

@ IN A 217.20.20.20
www. IN A 217.20.20.20

Następnie przeładujmy named`a i sprawdźmy.

# host domena.com

i

Jeżeli otrzymamy odpowiedz, ze domena wskazuje na adres 217.20.20.20 to znaczy, iż możemy przejść do edycji pliku httpd.conf.

8.2. Składnia

W pliku httpd.conf, odszukajmy sekcje : VirtualHosts

Zdefiniujmy adres ip dla wirtualnej domeny:

NameVirtualHost 217.20.20.20

Następnie:

Dyrektywy wirtualnych hostów definiujemy w <Directory> na przykład dla naszego przykładu:

<VirtualHost 217.20.20.20>
DocumentRoot /home/users/jasio/public_html
ServerName domena.com
ServerAlias www.domena.com
CustomLog /usr/local/apache/logs/domena.com.logs common
</VirtualHost>

DocumentRoot - Czyli katalog docelowy strony www użytkownika

ServerAlias - Alias z subdomena www, aby wskazywał na ten sam adres

CustomLog - Czyli miejsce docelowe zrzutu logów z zapytań do serwera wirtualnego.

Zrestartujmy apache:

/usr/local/apache/bin/apachectl restart

Wejdźmy z przeglądarki na adres : http://www.domena.pl (domena.pl jest przykładem), powinniśmy ujrzeć zawartość strony
jaka jest w katalogu : /home/users/jasio/public_html/.


9. Apache chroot

Dbając o bezpieczeństwo naszego serwera, idealnym pomysłem będzie umieszczenie naszego serwera httpd apache w chroot,
przedstawiam krotki opis jak tego dokonać.

9.1. Tworzenie katalogów

Jako pierwsza czynność powinniśmy zatrzymać serwer apache.
Następnie tworzymy katalogi, które będą nam niezbędne.

UWAGA: Poniższy opis jest w założeniu ze stosowałeś/aś się do kompilacji i instalacji serwera tak jak w tym artykule opisano.

# mkdir /chroot
# mkdir /chroot/httpd/
# mkdir /chroot/httpd/dev
# mkdir /chroot/httpd/etc
# mkdir /chroot/httpd/tmp
# mkdir -p /chroot/httpd/var/run
# mkdir -p /chroot/httpd/usr/lib
# mkdir -p /chroot/httpd/usr/libexec
# mkdir -p /chroot/httpd/usr/local/apache
# mkdir -p /chroot/httpd/usr/local/apache/bin
# mkdir -p /chroot/httpd/usr/local/apache/logs
# mkdir -p /chroot/httpd/usr/local/apache/conf
# mkdir -p /chroot/httpd/usr/local/apache/cgi-bin
# mkdir -p /chroot/httpd/usr/local/apache/icons
# mkdir -p /chroot/httpd/usr/local/apache/htdocs
# mkdir -p /chroot/httpd/usr/local/lib
# mkdir /chroot/httpd/var/log
# mknod /chroot/httpd/dev/null c 2 2
# chown root:sys /chroot/httpd/dev/null
# chmod 666 /chroot/httpd/dev/null
# mknod /chroot/httpd/dev/random c 2 3
# chown root:wheel /chroot/httpd/dev/randomo
# chmod 755 /chroot/httpd/dev/random
# cd /chroot/httpd/dev
# ln -s random urandom

Wyedytujmy nasz plik /etc/rc.conf i wstawmy linijkę :

syslogd_flags="-l /chroot/httpd/dev/log"

9.2. Kopiowanie potrzebnych plików, bibliotek

W tym momencie warto sprawdzić z czego korzysta binarka httpd a więc :

# ldd /usr/local/apache/bin/httpd

Wynik:

/usr/local/apache/bin/httpd:
libpam.so.1 => /usr/lib/libpam.so.1 (0x281bf000)
libcrypt.so.2 => /usr/lib/libcrypt.so.2 (0x281c9000)
libm.so.2 => /usr/lib/libm.so.2 (0x281e2000)
libc.so.4 => /usr/lib/libc.so.4 (0x281fd000)

Przystępujemy do instalowania niezbędnych plików.

# install -C /usr/local/apache/bin/httpd /chroot/httpd/usr/local/apache/bin/
# install -C /var/run/ld-elf.so.hints /chroot/httpd/var/run
# install -C /usr/lib/libcrypt.so.2 /chroot/httpd/usr/lib/
# install -C /usr/lib/libc.so.4 /chroot/httpd/usr/lib/
# install -C /usr/libexec/ld-elf.so.1 /chroot/httpd/usr/libexec/
# install -C /usr/local/lib/libexpat.so.4 /chroot/httpd/usr/local/lib/
# install -C /usr/lib/libpam.so.1 /chroot/httpd/usr/lib/
# install -C /usr/lib/libm.so.2 /chroot/httpd/usr/lib/

Następnie kopiujemy:

# cp /etc/master.passwd /chroot/httpd/etc/
# cp /etc/hosts /chroot/httpd/etc/
# cp /etc/resolv.conf /chroot/httpd/etc/
# cp /etc/group /chroot/httpd/etc/

# cd /chroot/httpd/etc/

Edytujemy plik group, i zostawiamy tylko i wyłącznie grupe spod jakiej będzie uruchamiany apache w naszym przypadku "www":

www:*:80:

Dalej edytujemy plik master.passwd i zostawiamy tylko użytkownika, w naszym przypadku "apache":

apache:*:1009:80::0:0:Serwer httpd:/home/apache:/usr/bin/false

Tworzymy bazę plik "pwd.db" poleceniem :

# pwd_mkdb -p -d /chroot/httpd/etc master.passwd

Możemy usunąć już plik master.passwd

# rm master.passwd

Pozostało nam skopiować jeszcze kilka plików:

# cp /usr/local/apache/conf/* /chroot/httpd/usr/local/apache/conf/
# cp /usr/local/apache/icons/* /chroot/httpd/usr/local/apache/icons/
# cp /usr/local/apache/htdocs/* /chroot/httpd/usr/local/apache/htdocs/
# cp /usr/local/apache/cgi-bin/* /chroot/httpd/usr/local/apache/cgi-bin/
# cp /usr/local/apache/logs/* /chroot/httpd/usr/local/apache/logs

9.3. Testowanie

# chroot /chroot/httpd/ /usr/local/apache/bin/apachectl

Aby apache w ten sposób był uruchamiany automatycznie, należy lekko zmodyfikować skrypt startowy, aby uruchamiał się
za pomocą komendy "chroot".

10. Zakończenie

Jeżeli masz pytania / sugestie dotyczące tego artykułu napisz na adres oziq[at]vastnet.co.uk

Autor: 
Przemysław Ozga (oziq) oziq[at]auto-gielda.pl
Porozmawiaj o tym artykule na forum: 

tytus, nie., 20/04/2008 - 14:33