15 lipca 2015

Konfiguracja serwera Apache, SSL w systemie GNU/Linux

Konfiguracja serwera Apache, SSL w systemie GNU/Linux


Autor: Kamil Michalak


Czy próbowałeś kiedyś postawić własny serwer www? Nie? Przeczytaj ten artykuł i ciesz się własnym serwerem!


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.

Jeżeli instalacja przebiegnie pomyślnie w pasku adresu przeglądarki internetowej możemy wpisać adres http://localhost/. Powinniśmy zobaczyć taką stronę

dqk5k7r_38f7d39khc_b

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.

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 100orazKeepAliveTimeout 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 ;)



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: 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
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
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 i /etc/httpd/conf/ssl.key/server.key. Następnie przystępujemy do utworzenia certyfikatu.

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

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
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=admin@mail.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


Jeżeli wpiszemy teraz w pasku przeglądarki adres otrzymamy niestety komunikat o niepoprawnym certyfikacie.

dqk5k7r_39cwtw96c7_b

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

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

ServerAdmin admin@mail.serv1.com
ServerName www.serv1.com
DocumentRoot /www/serv1/htdocs
TransferLog /var/log/www/access_log.serv1
ErrorLog /var/log/www/error_log.serv1


ServerAdmin admin@mail.serv2.com
ServerName www.serv2.com
DocumentRoot /www/serv2/htdocs
TransferLog /var/log/www/access_log.serv2
ErrorLog /var/log/www/error_log.serv2


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.


K. Michalak

Licencjonowane artykuły dostarcza Artelis.pl.

Brak komentarzy:

Prześlij komentarz