Apache jest najbardziej popularnym i najszerzej stosowanym serwerem WWW w internecie. Dostępny jest dla wielu systemów operacyjnych takich jak UNIX, LINUX, Microsoft Windows, BSD, OS X oraz pojawia się jako składnik wielu pakietów oferujących wraz z nim dodatkowe oprogramowanie PHP czy baz danych np.: XAMPP, LAMP, WAMP itp. Strona domowa projektu http://httpd.apache.org/. Głównymi cechami serwera są wielowątkowość, skalowalność, bezpieczeństwo, kontrola dostępu, CGI, proxy, obsługa modułów w tym mod_ssl. Pierwsza wersja pojawiła się oficjalnie w kwietniu 1995 roku. Na chwilę obecną najnowsze wydania serwera posiadają już graficzny interfejs konfiguracyjny parsujący ustawienia do pliku httpd.conf.
INSTALACJA SERWERA APACHE
Krok 1 - Instalacja wymaganych pakietów
# yum install -y httpd mod_ssl
Krok 2 - Sprawdzenie że wszystkie potrzebne pakiety znajdują się w systemie
# rpm -qa | grep http
httpd-tools-2.2.15-15.el6.i686
httpd-2.2.15-15.el6.i686
# rpm -qa | grep ssl
openssl-1.0.0-20.el6.i686
mod_ssl-2.2.15-15.el6.i686
Krok 3 - Ustawienie uruchamiania usług wraz z systemem operacyjnym
# chkconfig httpd on
Krok 4 - Sprawdzenie wprowadzonych zmian
# chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
KONFIGURACJA SERWERA WWW
Po instalacji odpowiednich pakietów możemy skierować uwagę na odpowiednie pliki konfiguracyjne i ich lokalizację. Podczas instalacji został utworzony katalog /var/www i jest to miejsce w którym umieszczamy pliki stron WWW. Istnieje również kilka plików konfiguracyjnych takich jak :
/etc/httpd/conf/httpd.conf Główny plik konfiguracyjny
/var/log/httpd Logi serwera www
/usr/lib64/httpd/modules Moduły dla serwera Apache
Po instalacji serwera jego konfiguracja znajdująca się w głównym pliku konfiguracyjnym nadaje się od razu do zastosowania. Warto jednak zapoznać się z opcjami jakie mamy dostępne i jakie możemy skonfigurować ponieważ jest ich dość sporo i wszystkie zostały dobrze udokumentowane. Informacje w pliku pogrupowane są w sekcje.
Podstawowe globalne opcje konfiguracyjne :
ServerRoot - Miejsce przechowywania plików konfiguracyjnych
Timeout - Okres czasu pomiędzy zapytaniami po jakimi przerywane jest połączenie
Listen - Numer portu nasłuchu
User - Użytkownik z jakiego uruchamiana jest usługa serwera www
Group - Grupa z jakiej uruchamiany jest serwer www
LoadModule - Definicja modułów ładowanych wraz ze startem serwera www
Podstawowe opcje dla serwera www
DocumentRoot - Lokalizacja plików stron WWW
ServerName - Definicja nazwy serwera, adresu IP i numeru portu
Zacznijmy od konfiguracji związanych z lokalizacją plików stron WWW. Domyślnie jest to /var/www/html ale jeżeli zachodzi taka potrzeba możemy to zmienić.
W głównym pliku konfiguracyjny możemy znaleźć również sekcję nazwaną "Directory" :
W głównym pliku konfiguracyjny możemy znaleźć również sekcję nazwaną "Directory" :
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Określone tu parametry wskazują na to w jakiej lokalizacji będą znajdowały się pliki stron, ale jeżeli chcemy zmienić lokalizację w jakiej mają znajdować się pliki stron www musi dokonać tego w :
DocumentRoot "/var/www/html"
Ma to również zastosowanie w przypadku konfiguracji virtualnych hostów o których będzie później. Jeżeli konfiguracja jest już zadowalająca i zgadzamy się na ustawione parametry możemy przeprowadzić test sprawdzający poprawność pliku konfiguracyjnego na występowanie błędów składniowych:
# service httpd configtest
httpd: Could not reliably determine the server's fully qualified domain name, using RHEL01.example.com for ServerName
Syntax OK
Powyższy błąd dotyczy nieustawionej nazwy serwera zgodniej z hostem na jakim serwer się znajduję i po od komentowaniu odpowiedniej opcji i podaniu sugerowanej nazwy serwera błąd został usunięty.
# service httpd configtest
Syntax OK
Jeżeli chcemy wykonać restart serwera stosujemy polecenie :
# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
Możemy również przeładować pliki konfiguracyjne serwera bez restartu całej usługi przy pomocy :
# service httpd reload
Istnieje jeszcze jedna opcja umożliwiająca restart serwera pozwalająca wczytać nowe pliki konfiguracyjne ale bez rozłączanie ani jednego klienta aktualnie korzystającego z www.
# service httpd graceful
KONFIGURACJA ZAPORY IPTABLES I SELINUX
Krok 1 - Dodanie odpowiednich reguł zapory iptables
iptables -I INPUT 5 -p tcp -m tcp --dport 80 -j ACCEPT
Krok 2 - Zapisanie ustawień iptables
# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
Krok 3 - Restart usługi zapory systemowej
# service iptables restart
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
Powyższe ustawienie otwiera port 80 na jakim działa usługa dla wszystkich. Często jest jednak tak, że z jakiegoś powodu potrzebujemy zablokować jakąś podsieć, a korzystanie z usługi pozostawić wybranym podsiecią lub hostom.
Aby dostęp do usługi httpd był możliwy tylko dla danej podsieci można wprowadzić ograniczenie w postaci :
iptables -I INPUT -s 192.168.56.0/24 -p tcp --dport 80 -j ACCEPT
Wpis ten ograniczy dostęp dla hostów znajdujących się w podsieci 192.168.56.0/24.
Możemy również posunąć się dalej o zastosować ograniczenie do pojedynczego hosta
iptables -I INPUT -s 192.168.56.102 -p tcp --dport 80 -j ACCEPT
Teraz można zobaczyć strony www tylko będąc na hoście lokalnym lub 192.168.56.102
Idąc jeszcze dalej mamy możliwość zablokowania dostępu również na hoście lokalnym i pozostawienie go tylko z wybranej konkretnej maszyny lub podsieci. Zablokowanie dostępu z maszyny lokalnej można wykonać blokując lokalny adres IP np.: (192.168.56.101)
iptables -I INPUT -s 192.168.56.101 -p tcp --dport 80 -j REJECT
Wpis ten zablokuje dostęp do stron www również z hosta na jakim serwer się znajduję.
OPCJE SELINUX
httpd_can_network_relay - Umożliwia httpd działanie jako przekaźnik
htttp_can_network_connect_db - Zezwala httpd na łączenie się skryptów i modułów z bazą danych.
httpd_use_gpg - Zezwala httpd na włączenie gpg w domenie gpg-web
httpd_enable_cgi - Zezwala na wsparcie dla CGI
httpd_use_cifs - Zezwala by httpd miał dostęp do CIFS
allow_httpd_mon_auth_pam - Zezwala na użycie mod_auth_pam
allow_httpd_anon_write - Zezwala na modyfikacje plików publicznych
httpd_enable_homedirs - Umożliwia czytanie katalogów domowych
allow_httpd_sys_scripts_anon_write - Zezwala skryptom apache modyfikować zawartość publicznego katalogu katalog musi mieć kontekst public_rw_content_t
httpd_dbus_avahi - Umożliwia komunikacje z usługa avahi
httpd_unified - Ujednolicenie uchwytów do zawartości wszystkich plików
httpd_can_network_connect - Umożliwia skryptom i modułom httpd na łączenie z siecią przez TCP
allow_httpd_mod_auth_ntlm_winbind - Umożliwia stosowanie mod_auth_pam
httpd_tty_comm - Ujednolicona komunikacja z terminalem.
httpd_read_user_content - Zezwala na dostęp do plików użytkowników
httpd_use_nfs - Dostęp do NFS systemu plików
httpd_tmp_exec - Dostęp do plików w katalogu /tmp
httpd_execmem - Zezwala na dodanie modułów /execmem i /execstak
httpd_can_sendmail - Pozwala usłudze httpd wysyłać wiadomości email
httpd_builtin_scripting - Umożliwia usłudze httpd korzystać ze skryptów zazwyczaj PHP
httpd_can_check_spam - Sprawdzanie spamu przez httpd
httpd_can_network_connect_cobbler - Pozwala by skrypty i moduły miały połączenie z siecią cobbler
httpd_ssi_exec - Umożliwia httpd uruchamianie SSI w tej samej domenie co skrypty CGI
httpd_enable_ftp_server - Umożliwia httpd dostęp do serwera FTP i wy listowanie plików przez port FTP
httpd_setrlimit - Pozwala usłudze httpd zmieniać limity systemowe.
By uruchomić podstawową usługę webową we własnej sieci nie ma potrzeby wprowadzania żadnych zmian w plikach konfiguracyjnych. Prawie każda nowa nie zawarta w podstawowych ustawieniach opcja wymaga konfiguracji ustawień SELinux. Pracując z usługami webowymi należy pamiętać o istnieniu dodatkowego wymogu w postaci SELinuxa. Apache korzysta z kontekstów plików z powodu istnienia różnych treści dostępnych na dysku.
Kontekst każdego nowo utworzonego katalogu musi zostać ustawiony na użytkownika serwera httpd tak by mógł on uzyskiwać do niego poprawny dostęp.
Kontekst każdego nowo utworzonego katalogu musi zostać ustawiony na użytkownika serwera httpd tak by mógł on uzyskiwać do niego poprawny dostęp.
Załóżmy dla przykładu, że potrzebujemy utworzyć dwa nowe katalogi przeznaczone dla dwóch odrębnych klientów :
Krok 1 - Utworzenie katalogów dla klientów :
# mkdir /var/www/strona1
# mkdir /var/www/strona2
Krok 2 - Sprawdzenie jakie aktualnie konteksty mamy dla plików :
# ls -Z /var/www/
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 strona1
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 strona2
Trzeba zmienić konteksty dla katalogów klientów na zgodne z domyślnymi dla stron www ( lokalizacja html)
Krok 3 - Używając polecenia chcon zmieniamy kontekst dla użytkownika domeny
# chcon -Rvu system_u /var/www/strona1
changing security context of `/var/www/strona1'
# chcon -Rvu system_u /var/www/strona2
changing security context of `/var/www/strona2'
Krok 4 - Możemy również odwołać się do domyślnego katalogu jedną komendą
# chcon --reference /var/www/html/ /var/www/strona2
Jest to przeniesienie ustawionego kontekstu na znanym pliku w tym przypadku domyślnie ustawiony kontekst katalogu html gdzie po instalacji można umieszczać pliki stron na inny wybrany lub utworzony nowy katalog jaki również będzie miał zadanie przechowywać pliki stron.
Krok 5 - Teraz możemy sprawdzić poprawność kontekstów dla nowych lokalizacji
# ls -Z /var/www/
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 strona1
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 strona2
ROZWIĄZYWANIE PROBLEMÓW Z APACHE
Jednym z najlepszych narzędzi do rozwiązywania problemów z apache są pliki logów. Pliki logów serwera apache posiadają oddzielną lokalizację od logów systemowych by łatwiej je znaleźć. Mamy dwa podstawowe pliki jakie możemy poddać analizie w celu rozwiązania problemów z serwerem apache.
- /var/log/httpd/access_log Log wszystkich dostępów do serwera
- /var/log/httpd/error_log Informację o błędach z serwerem
Zazwyczaj analiza powyższych plików dostarcza wystarczających informacji do rozwiązania problemów. W głównym pliku konfiguracyjnym istnieje sekcja umożliwiająca ustawienie poziomu logowania z usługi httpd.
Jeżeli stosujemy bezpieczne strony istnieją wtedy trzy dodatkowe pliki dla SSL :
- /var/log/httpd/ssl_access_log Logowanie dostępu do bezpiecznej strony
- /var/log/httpd/ssl_error_log Logowanie informacji o błędach ze stroną ssl
- /var/log/httpd/ssl_request_log Logowanie zapytań od klienta do serwera
Jak już wiemy do sprawdzania poprawności składni głównego pliku konfiguracyjnego stosujemy polecenie "config-test". Jednym z popularnych błędów podczas uruchamiania usługi jest komunikat informujący, że nazwa serwera "ServerName" nie została ustalona więc serwer domyślnie zakłada ją jako 127.0.0.1. By pozbyć się tej niedogodności ustawiamy nazwę serwera. Możemy również ustawić ilość informacji jaka znajduje się w logach za pomocą parametru "LogLevel"w głównym pliki konfiguracyjnym.
ELINKS
Innym użytecznym narzędziem jakie może być przydatne podczas rozwiązywania problemów z apache jest przeglądarka internetowa "elinks". Jest to przeglądarka tekstowa pozwalająca szybko sprawdzić działanie strony www. By używać tego narzędzia musimy zainstalować dodatkowe paczki.
Krok 1 - Instalacja wymaganych pakietów
# yum install -y elinks
Krok 2 - Po instalacji możemy przetestować działanie strony wydając polecenie :
elinks 192.168.56.101
Powinniśmy zobaczyć zawartość pliku : /var/www/html/index.html
Możemy również sprawdzić działanie SSL
# elinks https://172.168.1.1
Na razie nie będzie jeszcze działać !
BEZPIECZEŃSTWO APACHE
Powyżej przedstawiono już sposób dodania reguł do firewall'a oraz zasady kontekstów SELinuxa. W tym miejscu jeszcze bardziej i dokładniej omówione zostaną sposoby zabezpieczeń i konfigurację ustawień regulujące dostęp do usługi serwera www.
Zabezpieczenie usługi na na hoście
Pierwszym sposobem zabezpieczenia jest ograniczenie dostępu do serwera httpd z określonej podsieci. Wykonujemy to wprowadzając w głównym pliku konfiguracyjnym opcje w parametrze "Listen" :
Listen <adres_IP_serwera>:<port>
Listen 192.168.56.101:80
Po restarcie usługi serwera strony dostępne będą jedynie z podanej podsieci.
Kolejnym sposobem zabezpieczenia jest dyrektywa <Directory> w głównym pliku konfiguracyjnym :
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from 192.168.56.102
</Directory>
Taki zapis w pliku konfiguracyjnym, ogranicza dostęp do katalogu /var/www/html i jego zawartości. Dostęp możliwy jest tylko z wybranego hosta w tym przypadku jest to host 192.168.56.102
Inne możliwe konfigurację to :
Dostęp ograniczony do danej domeny :
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from .example.com
</Directory>
Należy zwrócić uwagę, że nazwę domeny podajemy zaczynając od kropki !
Dostęp ograniczony do danej podsieci
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from 192.168.1
</Directory>
Należy zwrócić uwagę by adres kończył się na 3 oktecie bez kropki
Po określeniu hostów które mają mieć dostęp lub nie mieć dostępu do serwera WWW należy zdefiniować kolejność stosowania reguł.
Order allow, deny Jako pierwsze zostaną przepuszczone wybrane adresy
Order deny, allow Jako pierwsze zostanie wykonane zabronienie dostępu.
Chcąc przepuścić dany adres stosujemy opcję że najpierw przepuszczamy dany adres , a pozostałe blokujemy , alternatywnie chcąc zablokować dany adres blokujemy go na początku a resztę przepuszczamy.
W dyrektywie tej istnieją również opcje :
Option Indexes - Jeżeli nie istnieje plik index.html na stronie pojawi się wylistowana zawartość katalogu
FollowSymLinks - Można wykonać dowiązanie symboliczne w systemie operacyjnym gdzie wskażemy inny katalog z poza zdefiniowanego w dyrektywie.
AllowOverride - Nie zezwala zwykłym użytkownikom na zmianę plików root'a
Powyższe opcje mogą być zastosowane do innych katalogów z poustawianymi różnymi względem siebie opcjami. Istnieje również sekcja <Directory> bez zdefiniowanego katalogu i wszystkie ustawione w niej opcje będą nadrzędnie stosowane dla wszystkich pozostałych poniżej.
Zabezpieczenie usługi od strony klienta
W tym miejscu wykonamy zabezpieczenie danego katalogu dając dostęp jedynie wybranym użytkownikom. Istnieją następujące opcję umożliwiające ograniczenie dostępu użytkownikom:
AuthType - Definiuje typ autentykacji
AuthName - Definiuje komentarz wyświetlany użytkownikowi przy logowaniu
AuthUserFile - Ustawia plik używany do przechowywania loginów i haseł użytkowników
AuthGroupFile - Ustawia plik do przechowywania loginów i haseł dla grupy
Require - Ustawia które grupy i użytkownicy mogą się zalogować
Przećwiczymy powyższe na przykładzie. Zabezpieczamy główną stronę wystawianą przez serwer WWW udostępniając ją jedynie użytkownikowi User01.
Krok 1 - W dyrektywie <Directory> dopisujemy parametry :
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from 192.168.56.102
AuthType Basic
AuthName "Zabezpieczona strona nie dla Ciebie"
AuthUserFile /etc/httpd/userfile
Require user user01
</Directory>
Krok 2 - Utworzenie pliku userfile
# htpasswd -cm /etc/httpd/userfile user01
New password:
Re-type new password:
Adding password for user user01
Opcja -c powoduje utworzenie pliku i stosujemy ją jednorazowo jeżeli plik jeszcze nie istnieje. Kolejna opcja -m używa szyfrowania MD5 przy zapisywaniu haseł do pliku przez co nie są przechowywane w postaci jawnej.
Krok 3 - Restartujemy serwer WWW
# service httpd restart
Krok 4 - Sprawdzenie działania w przeglądarce
Powinniśmy być pytani o login i hasło , a po wpisaniu hasła i loginu zobaczymy stronę.
Kolejną opcją jest umożliwienie dostępu do głównej strony natomiast wymagane logowanie będzie w momencie otwierania innych podstron.
Krok 1 - W pliku konfiguracyjnym dokonujemy kolejnych zmian
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride authconfig
Order allow,deny
Allow from 192.168.56.1
AuthType Basic
AuthName "Zabezpieczona strona nie dla Ciebie"
AuthUserFile /etc/httpd/userfile
Require user user01
</Directory>
Krok 2 - Utworzenie lokalizacji z podstroną
W katalogu /var/www/html tworzymy nowy katalog : # mkdir katalog w którym będzie zabezpieczona strona.
Krok 3 - W utworzonym katalogu tworzymy plik .htaccess
# vi .htaccess
wpisując do pliku treść :
AuthType Basic
AuthName "Nie masz dostepu do tego pliku bez logowania"
AuthGroupFile /etc/httpd/groupfile
Require group hr_users
Krok 4 - Utworzenie kilku użytkowników
# htpasswd -m /etc/httpd/userfile hr01
New password:
Re-type new password:
Adding password for user hr01
# htpasswd -m /etc/httpd/userfile hr02
New password:
Re-type new password:
Adding password for user hr02
Krok 5 - Utworzenie pliku groupfile
Tworzymy plik : # vim /etc/httpd/groupfile w którym wpisujemy :
hr_users: hr01 hr02
Krok 6 - Restart serwera WWW
# service httpd restart
Krok 7 - Sprawdzenie działania
W przeglądarce można zobaczyć stronę główna ale po przejściu do katalogu będzie prośba o zalogowanie.
Udostępnienie stron z katalogów domowych użytkowników
Możemy również umożliwić udostępnianie na serwerze WWW stron z katalogów domowych użytkownika.
W tym celu należy:
# mkdir public_html ( w katalogu domowym użytkownika tworzymy podkatalog )
# chmod 701 /home/user01/
# chmod 705 -R /home/user01/public_html/
Po wykonaniu powyższego należy sprawdzić ustawienia SELinux
# getsebool -a | grep httpd
allow_httpd_anon_write --> off
allow_httpd_mod_auth_ntlm_winbind --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> on
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_read_user_content --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_tmp_exec --> off
httpd_tty_comm --> on
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
Zmieniając odpowiednią opcję :
# setsebool -P httpd_enable_homedirs=1
Sprawdzenie wprowadzonych zmian :
# getsebool -a | grep httpd
...
httpd_enable_homedirs --> on
...
Teraz można sprawdzić działanie w przeglądarce :
http://192.168.56.101/~user01/
Pamiętajmy o użyciu znaku ~ przed nazwą użytkownika.
KONFIGURACJA HTTPS - SSL
Poza normalnymi stronami możemy mieć również bezpieczne strony używające protokołu HTTPS. Konfiguracja bezpiecznych stron w apache jest prosta. Do bezpiecznych stron potrzebujemy pakietu mod_ssl więc jeśli nie ma go w systemie trzeba go zainstalować. Jeżeli pakiet zostanie zainstalowany w systemie będziemy mieć dostęp do pliku konfiguracyjnego /etc/httpd/conf.d/ssl.conf w którym znajdują sie parametry konfiguracyjne zabezpieczające serwer www.
Sprawdźmy co takiego możemy skonfigurować w tym pliku :
# grep -v ^# /etc/httpd/conf.d/ssl.conf
LoadModule ssl_module modules/mod_ssl.so
Listen 443
SSLPassPhraseDialog builtin
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost _default_:443>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
Najważniejszymi opcjami jakie są w tym pliku są : Listen oraz parametry zdefiniowane pomiędzy znacznikami <VirtualHost _default_:443></VirtualHost>.
Domyślnie bezpieczne strony umieszcza się na wirtualnych hostach ( co jest bardzo dobre bo mogą działać niezależnie od istniejących stron)
Należy również zwrócić uwagę na dwie opcję :
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
Opcje te definiują i wskazują na lokalizację plików zawierających klucze jakie używane są dla udostępniania zabezpieczonych stron. Chociaż domyślne opcje będą działać w postaci po instalacji to jeżeli zmienimy adres IP lub nazwę pary domen zachodzi potrzeba wygenerowania nowego certyfikatu i klucza. Do generowania certyfikatów i kluczy należy zainstalować pakiet crypto-utils. Generowanie kluczy i certyfikatów nie jest tematem egzaminu RHCE.
Krok 1 - Utworzenie reguł zapory iptables
# iptables -I INPUT 5 -p tcp -m tcp --dport 443 -j ACCEPT
# iptables -I INPUT 5 -p tcp -m tcp --dport 80 -j ACCEPT
(jeżeli nie otworzono go wcześniej)
Krok 2 - Zapisanie ustawień iptables
# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@RHEL01 ~]# service iptables restart
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
Krok 3 - Restart usługi iptables
# service iptables restart
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
APLIKACJA CGI
W tym miejscu w kilku krokach pokażę jak uruchomić aplikację CGI w serwerze apache.
Krok 1 - Utworzenie katalogu dla aplikacji
# mkdir /var/www/web-app
Krok 2 - W utworzonym katalogu umieszczamy plik z przykładową aplikacją
# cd /var/www/webapp
# vim app.sh
app.sh
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, world!\n";
Krok 3 - W pliku konfiguracyjnym /etc/httpd/conf/httpd.conf dodajemy wpis :
ScriptAlias /webapp "/var/www/webapp"
<Directory "/var/www/webapp/">
Options ExecCGI FollowSymLinks
Order allow,deny
Allow from all
</Directory>
Krok 4 - Sprawdzamy czy składnia pliku jest poprawna
# service httpd configtest
Syntax OK
Krok 5 - Ustawiamy odpowiednie uprawnienia na katalogu
# chmod -R 755 /var/www/webapp/
Krok 6 - Restartujemy usługę serwera WWW
# service httpd restart
HOSTY WIRTUALNE
Dużą zaletą serwera WWW Apache jest możliwość uruchamiania wielu stron na jednym serwerze www. Robi się to poprzez skonfigurowanie wirtualnych hostów. Konfiguracja znajduje się w głównym pliku konfiguracyjnym apache httpd.conf w trzeciej sekcji :
NameVirtualHost - Określa nazwę lub adres IP dla wirtualnego hosta
ServerAdmin - Określa adres email dla webmastera
DocumentRoot - określa katalog dla plików wirtualnego hosta
ServerName - Definiuje URL dla wirtualnego hosta
ErrorLog - określa lokalizacje pliku error logu
CustomLog - określa lokalizacje custom logu
By uruchomić wirtualny host w serwerze Apache należy w pliku konfiguracyjnym httpd.conf w ostatniej części dodać wpis :
Usuwamy komentarz z linii : NameVirtualHost *:80
<VirtualHost *:80>
</VirtualHost>
Tworząc pusty wirtualny host zapobiegamy nadpisaniu ustawień dla lokalnego serwera www dzięki czemu po podaniu adresu strony prowadzącego do plików znajdujących się w domyślnej lokalizacji /var/www/html strony będą działać poprawnie. Następnie konfigurujemy wirtualnego hosta.
<VirtualHost *:80>
ServerAdmin webmaster@station1.example.com
DocumentRoot /StronyWWW/
ServerName stronywww.example.com
ErrorLog logs/stronywww.example.com-error_log
CustomLog logs/stronywww.example.com-access_log common
<Directory "/StronyWWW" >
AllowOverride None
Order Allow,Deny
Allow from 192.168.0
</Directory>
</VirtualHost>
Usuwamy komentarz z linii : NameVirtualHost *:80
<VirtualHost *:80>
</VirtualHost>
Tworząc pusty wirtualny host zapobiegamy nadpisaniu ustawień dla lokalnego serwera www dzięki czemu po podaniu adresu strony prowadzącego do plików znajdujących się w domyślnej lokalizacji /var/www/html strony będą działać poprawnie. Następnie konfigurujemy wirtualnego hosta.
<VirtualHost *:80>
ServerAdmin webmaster@station1.example.com
DocumentRoot /StronyWWW/
ServerName stronywww.example.com
ErrorLog logs/stronywww.example.com-error_log
CustomLog logs/stronywww.example.com-access_log common
<Directory "/StronyWWW" >
AllowOverride None
Order Allow,Deny
Allow from 192.168.0
</Directory>
</VirtualHost>
Należy zwrócić uwagę na linie :
ServerName - adres strony pod jaką widoczne będą pliki
<Directory "/lokalizacja plików" > - ścieżka do plików www dla danego wirtualnego hosta
Allow from - określenie kto ma uprawnienia do oglądania stron.
ServerName - adres strony pod jaką widoczne będą pliki
<Directory "/lokalizacja plików" > - ścieżka do plików www dla danego wirtualnego hosta
Allow from - określenie kto ma uprawnienia do oglądania stron.
Należy pamiętać również aby utworzony katalog w tym przypadku /Stronywww posiadał odpowiedni kontekst SELinux.
system_u:object_r:httpd_sys_content_t:s0 StronyWWW
O odpowiedni kontekst możemy zadbać odwołując się referencyjnie poleceniem chcon :
Powyższa konfiguracja umożliwia oglądanie stron z katalogu domyślnego oraz z katalogu /Stronywww pod adresem http://stronywww.example.com (pamiętajmy by dodać odpowiednie wpisy do plików /etc/hosts na maszynach z których będziemy testować działanie).
Zabezpieczenie dostępu do wirtualnego hosta wykonujemy tak samo jak w domyślnym serwerze czyli ustawiając odpowiednie parametry w dyrektywie <Directory>.
AllowOverride authconfig
oraz tworząc plik .htaccess w którym dodajemy przykładowy wpisy:
AuthType Basic
AuthName "Nie masz dostepu do tego pliku bez logowania"
AuthUserFile /Stronywww/.userfile
Require user user01
Utworzenie pliku .userfile
# htpasswd -cm /Stronywww/.userfile user01
New password:
Re-type new password:
Adding password for user user01
Aplikacje CGI w hostach wirtualnych
Krok 1 - Tworzymy katalog dla własnej aplikacji
# mkdir /var/www/moje-cgi
Krok 2 - Ustawiamy właściwy kontekst
# chcon --reference /var/www/cgi-bin /var/www/moje-cgi
Krok 3 - Tworzymy aplikację i umieszczamy ją w katalogu /var/www/moje-cgi
# vim /var/www/moje-cgi/app.pl
w pliku app.pl wpisujemy :
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, world!\n";
Krok 4 - Nadajemy aplikacji uprawnienia do uruchamiania
# chmod +x /var/www/moje-cgi/app.pl
Krok 5 - W pliku /etc/httpd/conf/httpd.conf tworzymy wirtualny host dodając wpis :
<VirtualHost *:80>
ServerAdmin webmaster@aplikacja.example.com
DocumentRoot /var/www/moje-cgi
ServerName aplikacja.example.com
ErrorLog logs/aplikacja.example.com-error_log
CustomLog logs/aplikacja.example.com-access_log common
ScriptAlias /cgi-bin/ /var/www/moje-cgi/
<Directory "/var/www/moje-cgi/">
Options +ExecCGI
AddHandler cgi-script cgi pl
</Directory>
</VirtualHost>
Szczególną uwagę należy zwrócić na wpisy zawarte pomiędzy znacznikami <Directory></Directory>. Ważne jest by pamiętać o myślniku jaki pojawia się w linii AddHandler cgi-script cgi pl. Bez myślnika podczas restartu usługi http nie zobaczymy żadnego błędu ani informacji o złej składni. Inaczej rzecz się ma jeżeli zabraknie końcowych cgi pl i w takim przypadku zobaczymy błąd.
Po zapisaniu pliku httpd.conf i restarcie usługi httpd można zobaczyć wynik działania :
# elinks http://aplikacja.example.com/app.pl
Pamiętając by dodać odpowiedni wpis w pliku /etc/hosts
192.168.56.101 host1.example.com strona1.example.com strona2.example.com aplikacja.example.com
Jestem pod wrażeniem. Bardzo fajny wpis.
OdpowiedzUsuń