background image

KONFIGURACJA SERWERA APACHE, SSL W SYTEMIE GNU/LINUX

    Powszechny dostęp do Internetu już dawno stał się dla nas czymś tak naturalnym jak oddychanie. Każdy ze 
zwykłego użytkownika chce stać się autorem i właścicielem strony internetowej. Nawet dzieci tworzą własne 
portale, blogi korzystając z ogólnodostępnych serwerów. Korzystanie nawet z dobrze opłacanego hostingu 
wiąże się niestety z pewnymi ograniczeniami co do dostępnej dla nas przestrzeni dyskowej, czasu 
wykonywania skryptu strony, wielkości bazy danych, czy rozmiaru plików. Istnieje jednak możliwość 
stworzenia własnego serwera www w domowych warunkach.

    Pierwszą rzeczą jakiej będziemy potrzebować będzie działający komputer z dostępem do sieci (co jest chyba 
oczywiste :) ). Na potrzeby tego artykułu pozwoliłem sobie dokonać założenia, że nie obce nam są 
przynajmniej podstawowe zasady funkcjonowania serwisów internetowych, oraz sposób ich konstruowania.

    Na początek sprawdźmy czy w naszym systemie zostały zainstalowane odpowiednie pakiety. Robimy to 
poleceniem

    $ rpm ­q httpd openssl mod_ssl 

Polecenie powinno zwrócić wynik podobny do poniższego 

    httpd­2.2.11­2.fc10.i386 

    openssl­0.9.8g­13.fc10.i686 

    mod_ssl­2.2.11­2.fc10.i386 

W przeciwnym wypadku konieczne jest doinstalowania powyższych pakietów przy pomocy yuma lub ze 
źródeł. Dodatkowo możemy również zainstalować pakiet PHP5. Przyda się on w późniejszych testach 
wydajności serwera. 

background image

Jeżeli instalacja przebiegnie pomyślnie w pasku adresu przeglądarki internetowej możemy wpisać adres 

http://localhost/

. Powinniśmy zobaczyć taką stronę 

 

Ilustracja 1: Strona testowa serwera Apache 

APACHE 

    Otwieramy teraz (w dowolnym edytorze tekstowym) plik /etc/httpd/conf/httpd.conf. Plik konfiguracyjny 
jest bardzo długi, więc na nasze potrzeby kierujemy zainteresowanie wyłącznie na kilka linijek. 

background image

Pierwszą z nich jest ServerTokens Min. Upewniamy się, że przypisaną mamy tu wartość Min. Linia ta 
informuje jakie informacje wysyłane będą do przeglądarki przez serwer. Aby zwiększyć bezpieczeństwo 
zmniejszamy wiedzę otoczenia 

Następnie ustawiamy wartość Timeout na 120. Jest to czas oczekiwania na odebranie żądania GET , 
maksymalny czas pomiędzy odebraniem kolejnych pakietów żądania PUT lub POST . 

Zaraz potem ustawiamy KeepAlive On, MaxKeepAliveRequests 100 oraz KeepAliveTimeout 15. Pierwsza 
opcja odpowiada za to czy należy podtrzymać połączenie pomiędzy żądaniami od klienta. Druga ile żądań 
będzie obsłużonych podczas jednego połączenia z klientem. Tutaj sugerowane duże wartości dla dużej 
wydajności serwera. Ostatnia zaś mówi serwerowi ile sekund czekać przed zamknięciem połączenia po 
zakończeniu obsługi żądania . 

W kolejnym kroku kierujemy swoje spojrzenie na linię Listen 80 dopisując zaraz za nią kolejną linię Listen 
8080
.
 Dodajemy w ten sposób kolejny port nasłuchiwania. Na tych portach będziemy mogli ustanowić 
połączenie z serwerem.  

Czasami taka konfiguracja jest wystarczająca. Zdarza się jednak, że nasze strony internetowe mają problemy z 
poprawnym wyświetlaniem polskich znaków. Korzystamy w tedy z linijki AddDefaultCharset UTF-8. To 
kodowanie zapewnia poprawną obsługę polskich liter. Zostaje nam tylko zmienić kodowanie plików stron na 
UTF-8, co swoją drogą w coraz większej skali staje się standardem internetowym. 

    Innym, konkurencyjnym serwerem HTTP jest Lighttpd. Faktem godnym zauważenia jest jego wydajność. 
Krótki test przeprowadzony przy pomocy programu ab (Apache HTTP server benchmarking tool) pokazał, że 
Lighttpd jest szybszy od Apache'a. Wynik testu renderowania prostej strony napisanej w PHP (kalendarz 
roczny) przedstawiają poniższe tabele. Wnioski można już wyciągnąć samemu ;)

APACHE 

This is ApacheBench, Version 2.0.40­dev <$Revision: 1.146 $> apache­2.0 

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 

Copyright 2006 The Apache Software Foundation, http://www.apache.org/ 

Benchmarking 127.0.0.1 (be patient).....done 

background image

Server Software: Apache/2.2.3 

Server Hostname: 127.0.0.1 

Server Port: 80 

Document Path: /index.php 

Document Length: 400 bytes 

Concurrency Level: 1 

Time taken for tests: 0.7221 seconds 

Complete requests: 1 

Failed requests: 0 

Write errors: 0 

Non­2xx responses: 1 

Total transferred: 579 bytes 

HTML transferred: 400 bytes 

Requests per second: 138.48 [#/sec] (mean) 

Time per request: 7.221 [ms] (mean) 

Time per request: 7.221 [ms] (mean, across all concurrent requests) 

Transfer rate: 0.00 [Kbytes/sec] received 

Connection Times (ms) 

min mean[+/­sd] median max 

Connect: 0 0 0.0 0 0 

Processing: 7 7 0.0 7 7 

background image

Waiting: 6 6 0.0 6 6 

Total: 7 7 0.0 7 7 

LIGHTTPD 

This is ApacheBench, Version 2.0.40­dev <$Revision: 1.146 $> apache­2.0 

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 

Copyright 2006 The Apache Software Foundation, http://www.apache.org/ 

Benchmarking 127.0.0.1 (be patient).....done 

Server Software: lighttpd/1.4.22 

Server Hostname: 127.0.0.1 

Server Port: 80 

Document Path: /index.php 

Document Length: 345 bytes 

Concurrency Level: 1 

Time taken for tests: 0.749 seconds 

Complete requests: 1 

background image

Failed requests: 0 

Write errors: 0 

Non­2xx responses: 1 

Total transferred: 498 bytes 

HTML transferred: 345 bytes 

Requests per second: 1335.11 [#/sec] (mean) 

Time per request: 0.749 [ms] (mean) 

Time per request: 0.749 [ms] (mean, across all concurrent requests) 

Transfer rate: 0.00 [Kbytes/sec] received 

Connection Times (ms) 

min mean[+/­sd] median max 

Connect: 0 0 0.0 0 0 

Processing: 0 0 0.0 0 0 

Waiting: 0 0 0.0 0 0 

Total: 0 0 0.0 0 0 

SSL 

    Kiedy podstawową konfigurację serwera mamy już za sobą, pora na zwiększenie bezpieczeństwa. 

Otwórzmy raz jeszcze plik /etc/httpd/conf/httpd.conf. Upewniamy się, czy obecna jest linia Include 
conf.d/*.conf
. Pozwoli ona na wykorzystanie plików konfiguracyjnych w katalogu /etc/httpd/conf.d/
Otwieramy plik /etc/httpd/conf.d/ssl.conf. Sprawdzamy, gdzie przetrzymywane są pliki kluczy. W tym 
przypadku jest to /etc/httpd/conf/ssl.crt/server.crt /etc/httpd/conf/ssl.key/server.key Następnie przystępujemy 
do utworzenia certyfikatu.  

background image

     Najpierw tworzymy nowy katalog i tworzymy w nim kopię plików serwera Apache 

# mkdir /tmp/apache 

# cp ­r /etc/httpd/conf/* /tmp/apache/. 

Potem wydajemy kolejno polecenia: 

# mkdir /etc/httpd/conf/tmp 

# cd /etc/httpd/conf/tmp 

# openssl genrsa ­des3 ­out server.key 2048 

Generating RSA private key, 2048 bit long modulus 

................+++ 

................................................................... ......
........+++ 

e is 65537 (0x10001) 

Enter pass phrase for server.key: 

[nasze hasło]

 

Verifying ­ Enter pass phrase for server.key: 

[nasze hasło]

 

To polecenie wygeneruje prywatny 2048 bitowy klucz RSA przy użyciu biblioteki OpenSSL. Klucz jest 
kodowany algorytmem des3 . 

# openssl rsa ­in server.key ­out server.pem 

background image

Enter pass phrase for server.key: 

[nasze hasło]

 

writing RSA key

Usuwamy hasło z prywatnego klucza i umieszcza go w pliku server.pem. 

# openssl req ­new ­key server.key ­out server.csr (answer the series of 

questions) 

Enter pass phrase for server.key: 

[jeszcze raz to samo hasło]

 

You are about to be asked to enter information that will be incorporated 

into your certificate request. 

What you are about to enter is what is called a Distinguished Name or a 
DN. 

There are quite a few fields but you can leave some blank 

For some fields there will be a default value, 

If you enter '.', the field will be left blank. 

­­­­­ 

Country Name (2 letter code) [GB]:

PL

 

State or Province Name (full name) [Berkshire]:

lubelskie 

Locality Name (eg, city) [Newbury]:

Lublin 

Organization Name (eg, company) [My Company Ltd]: 

[puste]

 

Organizational Unit Name (eg, section) []: 

[puste]

 

Common Name (eg, your name or your server's hostname)[]:

[localhost]

 

Email Address []:

root@localhost

 

background image

Please enter the following 'extra' attributes 

to be sent with your certificate request 

A challenge password []: 

[puste]

 

An optional company name []: 

[puste]

 

Generujemy podpisany klucz 

# openssl x509 ­req ­days 365 ­in server.csr ­signkey server.key ­out 

server.crt 

Signature ok 

subject=/C=PL/ST=lubelskie/L=Lublin/O=My Company 
Ltd/emailAddress=kmichalak8@gmail.com 

Getting Private key 

Enter pass phrase for server.key: 

[hasło]

 

i tworzymy certyfikat, którego ważność trwa 365 dni. 

Na koniec wchodzimy do katalogu /etc/httpd/conf i kopiujemy otworzone przez nas pliki i restartujemy serwer 
HTTP. 

# cd /etc/httpd/conf && cp tmp/server.crt ./ssl.crt && cp 
tmp/server.key ./ssl.key 

# cp tmp/server.csr ./ssl.csr && service httpd restart 

background image

Jeżeli wpiszemy teraz w pasku przeglądarki adres 

http://localhost/

 otrzymamy niestety komunikat o 

niepoprawnym certyfikacie.

  

 

Ilustracja 2: Komunikat błędu uwierzytelniania 

Dzieje się tak ze względu na fakt, że certyfikat udzielony stronie został podpisany przez nas samych. Aby 
uniknąć tego problemu konieczne jest uzyskanie certyfikatu autentyczności strony z zewnętrznego źródła. 

SERWERY WIRTUALNE 

background image

    Ostatnim już i najbardziej chyba interesującym zagadnieniem związanym z serwerem Apache jest pomysł 
serwerów wirtualnych. Aby utworzyć dwa przykładowe wirtualne serwery należy w głównym pliku 
konfiguracyjnym (/etc/httpd/conf/httpd.conf) umieścić wpis 

NameVirtualHost 192.168.0.1:80 

<VirtualHost 192.168.0.1> 

ServerAdmin kmichalak8@gmail.lab1.com 

ServerName www.lab1.com 

DocumentRoot /www/lab1/htdocs 

TransferLog /var/log/www/access_log.lab1 

ErrorLog /var/log/www/error_log.lab1 

</VirtualHost> 

<VirtualHost 192.168.0.1> 

ServerAdmin kmichalak8@gmail.lab2.com 

ServerName www.lab2.com 

DocumentRoot /www/lab2/htdocs 

TransferLog /var/log/www/access_log.lab12 

ErrorLog /var/log/www/error_log.lab12 

</VirtualHost> 

Pierwsza linia określa adres, do którego odnoszą się poszczególne serwery. ServerName jest dyrektywą 
przypisującą symboliczną nazwę wirtualnego serwera. 

Sens takiego podejścia jest niewątpliwy w przypadku, kiedy chcemy na jednym serwerze przechowywać kilka 
serwisów WWW. Pozwala to na redukcję kosztów jeżeli chodzi o sprzęt – wystarczy nam jedna maszyna. Daje 
nam również możliwość tworzenia aliasów adresów internetowych. Dzięki czemu dana strona może być 
widoczna pod kilkoma różnymi nazwami.