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 :
ź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:
# 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.
- mod_bandwidth - Ograniczanie i manipulowanie zużycia przepustowości. (http://www.cohprog.com/mod_bandwidth.html)
- mod_throttle - Tak jak wyżej, jest on bardziej popularny od mod_bandwidth. (http://www.snert.com/Software/mod_throttle/)
- mod_php4 - Możliwość zastosowania języka php w aplikacjach internetowych. (http://www.php.net/)
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.:
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:
--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 :
/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 :
Jeżeli już zdecydowałeś się na odpowiednie opcje, przejdźmy zatem do kompilacji php.
# 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:
Nastepnie :
# make install
Teraz PHP mamy na razie z głowy.
Następnie przechodzimy do katalogu ze źródłami apache:
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 :
Widzimy plik httpd.h, wyedytujmy go i poszukajmy frazy : "tokens"
A dokładnie chodzi nam o:
#define SERVER_BASEPRODUCT "Apache"
#define SERVER_BASEREVISION "1.3.29"
Zmieniamy sobie np. Numerek wersji czyli :
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 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. :
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.
Dyrektywą tą określamy w jaki sposób ma być uruchamiany demon apache.
Jeżeli domyślnie :
Mamy możliwość uruchomić apache poprzez demon inetd czyli :
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.
Za pomocą tej dyrektywy określamy katalog apache (ten który podałeś w -prefix), w naszym przypadku jest to
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.
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
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:
Główny katalog, stron www na naszym serwerze
W naszym przypadku:
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:
DirectoryIndex
Za pomocą tej dyrektywy ustalamy główne pliki stron www.
Przykładowo może wyglądać w ten sposób :
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ć :
W tym momencie jesteśmy gotowi do przetestowania :
Powinniśmy zobaczyć :
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:
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
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/link
# mkdir /tmp/apachebw/master
Następnie wyedytujmy znany już plik httpd.conf :
Dodajemy dyrektywę BandWidthDataDir, czyli lokalizacje stworzonego katalogu:
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:
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 :
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:
Lub ip, lub tylko jego klasy :
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:
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:
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:
Jeżeli ujrzeliśmy znany już nam: Syntax OK
Możemy sprawdzić, wpisując w przeglądarce:
Lub danego użytkownika:
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.
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:
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:
Przechodzimy do katalogu
Konfigurujemy z podaniem ścieżki do naszych źródeł serwera apache :
# make
# make install
Przechodzimy do katalogu apache :
I zaczynamy kompilacje tak jak w zrobiliśmy to wcześniej :
--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 :
# make
I tworzymy certyfikat
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 :
# openssl rsa -in ./server.key -out ./server.key
Podajemy hasło jakie wcześniej ustaliliśmy.
# 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 :
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 :
Następnie aby zezwolić użytkownikowi np. "jasio" który mieści się w katalogu /home/users/jasio piszemy :
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 :
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:
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.:
# 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
$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
www. IN A 217.20.20.20
Następnie przeładujmy named`a i sprawdźmy.
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:
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/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
# 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ę :
9.2. Kopiowanie potrzebnych plików, bibliotek
W tym momencie warto sprawdzić z czego korzysta binarka httpd a więc :
Wynik:
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 /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/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":
Dalej edytujemy plik master.passwd i zostawiamy tylko użytkownika, w naszym przypadku "apache":
Tworzymy bazę plik "pwd.db" poleceniem :
Możemy usunąć już plik master.passwd
Pozostało nam skopiować jeszcze kilka plików:
# 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
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
tytus, nie., 20/04/2008 - 14:33
