HTTP (HyperText Transfer Protocol) to sieciowy protokół, który zapewnia dostęp do stron sieci web w Internecie. Termin hypertext odnosi się do strukturyzowanego tekstu, który używa hyperlinków aby zezwolić na niesekwencyjny dostęp do informacji hostowanych na serwerze www przez protokół HTTP. Serwer WWW określany jest także serwerem HTTP. Klientem sieci web jest zazwyczaj przeglądarka taka jak Firefox, Google Chrome czy Ms Edge, która rozumie protokół HTTP i jest w stanie “rozmawiać” z serwerem webowym. Najbardziej popularnym serwerem, który dostarcza usługi webowe przy wykorzystaniu protokołu HTTP i HTTPS jest Apache.
Apache to aplikacja działająca w architekturze klient/serwer, wykorzystuje demona httpd, który nasłuchuje na porcie 80 TCP (http) lub 443 TCP (https).
Komendy do kontrolowania Apache:
# apachectl
– uruchamia, zatrzymuje, restartuje i sprawdza status procesu httpd. Do tych czynności może być wykorzystywany także systemctl lub service. Ponadto apachectl może testować składnie plików konfiguracyjnych.# htpasswd
– tworzy i modyfikuje pliki do składowania nazw użytkowników i haseł do autentykacji basic. Opcja –c tworzy plik, -m używa szyfrowania MD5 dla haseł.# httpd
– demon Apacha, uruchomiony z opcją -t sprawdza składnię plików konfiguracyjnych.
Więcej informacji w dokumentacji systemowej man.
Pliki z logami Apacha znajdują się w katalogu /var/log/httpd
.
Pakiety związane z Apachem w RHEL to m.in:
- httpd – demon Apacha.
- httpd-tool -narzędzia do obsługi Apacha.
- httpd-manual – dokumentacja i przykładowe pliki konfiguracyjne. Dostępna jest pod adresem http://localhost/manual.
- mod_ssl – wsparcie dla stron bezpiecznych stron https.
- mod_wsgi – wsparcie dla obsługi skryptów WSGI.
Pliki konfiguracyjne.
Cała konfiguracja Apacha składowana jest w katalogu /etc/httpd
, główny plik konfiguracyjny to: /etc/httpd/http.conf
. Główne dyrektywy pliku konfiguracyjnego przedstawia tabela poniżej.
Dyrektywa | Opis |
ServerRoot | Katalog z konfiguracją serwera, domyślnie /etc/httpd . |
Listen | Port na którym nasłuchuje serwer. Domyślnie 80. Można poza portem określić także adres IP, na którym ma nasłuchiwać serwer. |
Include | Określa położenie modułów wczytywanych podczas startu demona. domyślnie conf.modules.d/*.conf w odniesieniu do katalogu z konfiguracją apacha. |
User | Właściciel procesu httpd. |
Group | Grupa systemowa, do której należy demon httpd. Domyślną grupą jest apache. |
Dyrektywy, które dotyczą domyślnego web serwera przedstawia tabela poniżej. Dyrektywy te dotyczą również hostów wirtualnych o ile nie są nadpisane przez te same dyrektywy wewnątrz definicji konfiguracji hosta wirtualnego.
Dyrektywa | Opis |
ServerName | Nazwa web serwera (lub adres IP) i numer portu. Domyślnie www.example.com:80. |
ServerAdmin | Adres e-mail webmastera. Domyślnie root@localhost. |
DocumentRoot | Położenie katalogu z plikami web. Domyślnie /var/www/html . |
DirectoryIndex | Określa jaka strona ma być serwowana klientowi, który odwiedza serwer. Domyślnie index.html . |
AccessFileName | Plik używany do kontroli dostępu do serwera. Domyślnie .htaccess . |
Alias | Położenie katalogu do składowania plików poza DocumentRoot. |
ScriptAlias | Położenie skryptu CGI (Common Gateway Interface). |
WSGIScriptAlias | Położenie skryptu WSGI. |
IncludeOptional | Położenie dodatkowych plików konfiguracyjnych. |
CustomLog | Określa custom log i jego format. Domyślnie custom log składowany jest w logs/httpd/access_log w odniesieniu do katalogu ServerRoot. |
ErrorLog | Położenie logu z komunikatami o błędach. Domyślnie w logs/error_log w ServerRoot. |
LogFormat | Format dla komunikatów logowania. |
LogLevel | Poziom “gadatliwości” logów. Domyślnie warn, inne opcje to: debug, info, notice, error, crit, alert i emerg. |
Options | Ustawia funkcjonalność związaną w katalogami, w których znajdują się pliki stron web.
|
AllowOverride | Określa typy dyrektyw jakie mogą być zdefiniowane w pliku AccessFileName . Dyrektywy te kontrolują dostęp użytkowników i grup do katalogów prywatnych i hosta. Niektóre opcje:
|
Require | Zezwala lub zakazuje dostępu dla określonych użytkowników, grup, hostów, sieci lub domen. |
AddHandler | Mapują rozszerzenia plików do określonego handlera. |
Wiele dyrektyw jest definiowanych wewnątrz kontenerów:
<Directory ……… > </Directory>
<Files …………. > </Files>
<IfModule ……. > </IfModule>
<VirtualHost …. > </VirtualHost>
Kontrola dostępu.
Ograniczanie dostępu do katalogów dla określonych użytkowników lub grup jest zarządzane przez dyrektywy zdefiniowane w pliku .htaccess
lub bezpośrednio w kontenerze <Directory ....>
w pliku httpd.conf
i jego załącznikach. Użytkownicy mogą mieć inne hasła niż systemowe. Kluczowe dyrektywy związane z kontrolą dostępu na poziomie użytkownika przedstawia tabela poniżej.
Dyrektywa | Opis |
AuthType | Ustawia podstawową autentykację. |
AuthName | Dodaje komentarz. |
AuthBasicProvider | Typ używanej autentykacji. Domyślnie file. |
AuthUserFile | Określa plik z autoryzowanymi hasłami użytkowników. |
AuthGroupFile | Określa plik z autoryzowanymi hasłami grup. |
Za ograniczanie dostępu na poziomie hosta odpowiada dyrektywa Require, przykłady jej użycia przedstawia tabela poniżej:
Dyrektywa Require | Skutek |
Require user <username or UID> |
Dostęp jest przyznany tylko dla określonego użytkownika (dotyczy katalogów). |
Require not user <username or UID> |
Odmowa dostępu dla określonego użytkownika |
Require group <group name or GID> |
Dostęp jest przyznany tylko dla określonej grupy (dotyczy zawartości zarządzanych przez grupy). |
Require not group <group name or GID> |
Odmowa dostępu dla określonej grupy. |
Require valid-user |
Dostęp jest przyznany dla ważnych (aktualnych) użytkowników. |
Require ip 192.168.0 15.2 |
Dostęp jest przyznany tylko dla podsieci 192.168.0 i 15.2. |
Require not ip 192.168.0 15.2 |
Odmowa dostępu dla podsieci 192.168.0 i 15.2. |
Require host server2 |
Dostęp jest przyznany dla hosta server2. |
Require not host server2 |
Odmowa dostępu dla hosta server2. |
Require host example.com |
Dostęp jest przyznany dla domen example.com. |
Require not host .example.com |
Odmowa dostępu dla domen example.com. |
Require all granted |
Dostęp jest przyznany dla wszystkich hostów. |
Require all denied |
Odmowa dostępu dla wszystkich hostów. |
Przykład 1: zezwolenie na dostęp bez hasła do /var/www/example
dla użytkowników user1, user2 i grupy dba.
1 2 3 4 5 |
<Directory /var/www/example> AllowOverride None Require user user1 user2 Require group dba </Directory> |
Przykład 2: zezwolenie na dostęp bez hasła do /var/www/example
dla użytkowników user1, user2 i grupy dba z domeny example.net, podsieci 192.168.0 i hosta server2.example.com. Odmowa dostępu z domeny example.org.
1 2 3 4 5 6 7 8 |
<Directory /var/www/example> AllowOverride None Require user user1 user2 Require group dba Require host example.net server2.example.com Require ip 192.168.0 Require not host example.org </Directory> |
Przykład 3: zezwolenie na dostęp z hasłem do /var/www/example
dla użytkowników user1, user2 i grupy dba z domeny example.net, podsieci 192.168.0 i hosta server2.example.com. Odmowa dostępu z domeny example.org.
1 2 3 4 |
<Directory /var/www/example> AllowOverride AuthConfig AccessFileName conf/.htaccess </Directory> |
Zawartość pliku The .htaccess
:
1 2 3 4 5 6 7 8 9 10 |
AuthType Basic AuthName “This site is password-protected.” AuthBasicProvider file AuthUserFile /etc/httpd/conf/.userdb AuthGroupFile /etc/httpd/conf/.groupdb Require user user1 user2 Require group dba Require host example.net server2.example.com Require ip 192.168.0 Require not host example.org |
Wymagania SELinux.
Zmienne boolean związane z Apachem przedstawia tabela poniżej.
Boolean | Opis |
httpd_anon_write |
Zezwala/zabrania Apachowi na zapis do katalogów z etykietą public_content_rw_t tak jak do katalogów publicznych. |
httpd_sys_script_anon_write |
Zezwala/zabrania skryptom Apacha na zapis do katalogów z etykietą public_content_rw_t tak jak do katalogów publicznych. |
httpd_enable_cgi |
Włącza/wyłącza możliwość uruchamiania skryptów CGI z etykietą httpd_sys_script_exec_t . |
httpd_enable_ftp_server |
Zezwala/zabrania Apachowi działania jako serwer FTP i nasłuchiwania na porcie 21. |
httpd_enable_homedirs |
Włącza/wyłącza Apachowi dostęp do katalogów domowych użytkowników. |
httpd_use_cifs |
Zezwala/zabrania Apachowi na używanie podmontowanych zasobów Samba typu cifs_t . |
httpd_use_nfs |
Zezwala/zabrania Apachowi na używanie podmontowanych zasobów typy nfs_t . |
Poza zmiennymi boolean SELinux wymaga aby był ustawiony odpowiedni kontekst na katalogach związanych z Apachem.
1 2 3 4 5 6 |
# ll –Zd /etc/httpd drwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 /etc/httpd # ll –Zd /var/www drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www # ll –Zd /var/log/httpd drwx------. root root system_u:object_r:httpd_log_t:s0 /var/log/httpd |
A zatem katalogi z konfiguracją muszą mieć ustawiony kontekst httpd_config_t
, katalogi ze stronami web kontekst httpd_sys_content_t
, a katalogi z logami kontekst httpd_log_t
.
Konfiguracja domyślnego web serwera.
1. Instalacja pakietu Apache.
1 |
# yum –y install httpd |
2. Odblokowanie protokołu http na firewallu:
1 2 |
# firewall-cmd --permanent --add-service=http # firewall-cmd --reload |
3. Autostart, uruchomienie i status Apacha:
1 2 3 |
# systemctl enable httpd # systemctl start httpd # systemctl status httpd |
4. Weryfikacka możliwości dostępu do domyślnej strony web:
1 2 |
# yum –y install links # links http://localhost |
5. Weryfikacja na komputerze klienta:
1 2 |
# yum –y install links # links http://server.example.com |
Wystawienie innej strony na domyślnym web serwerze.
1. Utworzenie strony w katalogu DocumentRoot /var/www/html
:
1 2 3 |
# cd /var/www/html # vim index.html To jest strona internetowa. |
2. Modyfikacja pliku /etc/hosts
:
1 2 |
# vim /etc/hosts 192.168.0.1 server.example.com server webserver1.example.com webserver1 |
3. Modyfikacja konfiguracji w pliku /etc/httpd/conf/httpd.conf
:
1 2 3 |
# vim /etc/httpd/conf/httpd.conf ServerAdmin root@webserver1.example.com ServerName webserver1.example.com |
4. Sprawdzenie poprawności składni pliku httpd.conf
:
1 2 |
# httpd –t Syntax OK |
5. Weryfikacja dostępu do nowej strony:
1 |
# links http://webserver1.example.com |
Przyznanie dostępu do prywatnego katalogu web serwera.
1. Utworzenie prywatnego katalogu w DocumentRoot:
1 |
# mkdir /var/privusr |
2. Zmiana praw dostępu do katalogu:
1 2 |
# chown user1:user1 /var/privusr # chmod 0711 /var/privusr |
3. Utworzenie pliku index.html
w prywatnym katalogu:
1 2 |
# vim /var/privusr/index.html This is webserver1 providing user1 access to a private directory. |
4. Dodanie kontekstu SELinux typ httpd_sys_content_t dla katalogu /var/privusr
:
1 2 |
# semanage fcontext –at httpd_sys_content_t “/var/privusr(/.*)?” # restorecon –Rv /var/privusr |
5. Modyfikacja konfiguracji w pliku httpd.conf
:
1 2 3 4 5 6 |
ServerAdmin root@webserver1.example.com ServerName webserver1.example.com DocumentRoot “/var” <Directory /var/privusr> AllowOverride AuthConfig </Directory> |
7. Weryfikacja poprawności składni pliku httpd.conf
:
1 2 |
# httpd –t Syntax OK |
8. Utworzenie pliku .htaccess
w katalogu /var/privusr
:
1 2 3 4 5 6 |
# cd /var/privusr # vim .htaccess AuthType Basic AuthName “Password-protected User Contents. Enter your credentials to log in:” AuthUserFile “/etc/httpd/conf/.userdb” Require user user1 |
9. Utworzenie hasła dla użytkownika user1 i umieszczenie go komendą htpasswd w pliku AuthUserFile (/etc/httpd/conf/.userdb
).
Hasło może być inne niż hasło systemowe użytkownika user1.
1 2 3 4 5 6 7 |
# cd /etc/httpd/conf # htpasswd –c .userdb user1 New password: Re-type new password: Adding password for user user1 # cat .userdb user1:$apr1$CMmJ4ru9$yMiBitQNS5hjOQDJPSIrx. |
10. Zmiana praw dostępu do pliku AuthUserFile file:
1 2 |
# chgrp apache .userdb # chmod 0640 .userdb |
11. Restart Apacha:
1 |
# systemctl restart httpd |
12. Test konfiguracji ze zdalnego systemu przy wykorzystaniu dowolnej przeglądarki:
1 |
http://webserver1.example.com/privusr |
Żeby sprawdzić czy nie występują jakieś błędy można wykorzystać tail:
1 2 |
# tail -f /var/log/httpd/error_log # tail -f /var/log/httpd/access_log |
Zapewnienie dostępu do katalogów pracy grupowej.
1. Utworzenie katalogu, który będzie zarządzany przez grupę w DocumentRoot:
1 2 3 4 5 6 |
# mkdir /var/privgrp # groupadd dba # usermod –G dba user10 # usermod –G dba user11 # chgrp dba /var/privgrp # chmod 0771 /var/privgrp |
2. Create an index.html
file in the directory:
1 2 |
# vim /var/privgrp/index.html This is webserver1 providing dba group members access to a directory. |
3. Dodanie kontekstu SELinux httpd_sys_content_t dla katalogu /var/privgrp
:
1 2 |
# semanage fcontext –at httpd_sys_content_t “/var/privgrp(/.*)?” # restorecon –Rv /var/privgrp |
4. Modyfikacja dyrektyw w pliku /etc/httpd/conf/httpd.conf
:
1 2 3 4 5 6 7 8 9 |
ServerAdmin root@webserver1.example.com ServerName webserver1.example.com DocumentRoot “/var” <Directory /var/privusr> AllowOverride AuthConfig </Directory> <Directory /var/privgrp> AllowOverride AuthConfig </Directory> |
5. Weryfikacja:
1 2 |
# httpd –t Syntax OK |
6. Utworzenie pliku .htaccess
file w katalogu /var/privgrp
:
1 2 3 4 5 6 7 |
# cd /var/privgrp # vi .htaccess AuthType Basic AuthName “Password-protected Group Contents. Enter your credentials to log in:” AuthUserFile “/etc/httpd/conf/.grouppassworddb” AuthGroupFile “/etc/httpd/conf/.groupdb” Require group dba |
7. Utworzenie AuthGroupFile (/etc/httpd/conf/.userdb
) i dodanie informacji o grupie:
1 2 3 |
# cd /etc/httpd/conf # vi .groupdb dba: user10 user11 |
8. Zmiana uprawnień do pliku AuthGroupFile:
1 2 |
# chgrp apache .groupdb # chmod 0640 .groupdb |
9. Utworzenie haseł dla członków grupy i umieszczenie ich w pliku AuthUserFile (/etc/httpd/conf/.grouppassworddb
) komendą htpasswd:
1 2 3 4 5 6 7 8 |
# htpasswd –c .grouppassworddb user10 New password: Re-type new password: Adding password for user user10 # htpasswd .grouppassworddb user11 New password: Re-type new password: Adding password for user user11 |
10. Restart Apacha:
1 |
# systemctl restart httpd |
11. Test konfiguracji ze zdalnego systemu przy wykorzystaniu dowolnej przeglądarki:
1 |
http://webserver1.example.com/privgrp |
Zapewnienie dostępu do serwera web tylko dla wybranego hosta na niedomyślnym porcie.
1. Modyffikacja pliku /etc/httpd/conf/httpd.conf
:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ServerAdmin root@webserver1.example.com ServerName webserver1.example.com:8989 DocumentRoot “/var” <Directory /var/privusr> AllowOverride AuthConfig Require host example.com Require ip 192.168.1.0/24 </Directory> <Directory /var/privgrp> AllowOverride AuthConfig Require host example.com Require ip 192.168.1.0/24 </Directory> |
2. Weryfikacja ppoprawności składni pliku httpd.conf
:
1 |
# httpd –t |
3. Restart Apacha:
1 |
# systemctl restart httpd |
4. Otwarcie portu TCP 8989 na firewallu:
1 2 |
# firewall-cmd --permanent --add-port 8989/tcp # firewall-cmd --reload |
5. Dodanie portu 8989 TCP do polityki SELinux dla typu http_port_t:
1 2 3 |
# semanage port –at http_port_t –p tcp 8989 # semanage port –l | grep ^http_port_t http_port_t tcp 8989, 80, 81, 443, 488, 8008, 8009, 8443, 9000 |
6. Test konfiguracji z systemu w domenie example.com domain i z podsieci 192.168.1.0/24 przez przeglądarkę Firefox:
1 2 |
http://webserver1.example.com:8989/privusr http://webserver1.example.com:8989/privgrp |
Wirtualne web serwery – hosty wirtualne.
Apache pozwala na uruchamianie wielu web serwerów na jednym systemie. Każdy wirtualny host może zarówno współdzielić jeden adres IP jak i mieć przypisany osobny adres IP. Konfigurację hostów wirtualnych umieszczamy w katalogu /etc/httpd/conf.d
w osobnych plikach. Przykład kontenera z konfiguracją hosta wirtualnego:
1 2 3 4 5 6 7 |
<VirtualHost *:80> DocumentRoot /var/www/html/vh1.example.com ServerAdmin admin@vh1.example.com ServerName vh1.example.com ErrorLog logs/vh1.example.com-error_log CustomLog logs/vh1.example.com-access_log common </VirtualHost> |
Weryfikacja poprawności konfiguracji hosta wirtualnego przeprowadzana jest komendą:
1 2 3 4 5 6 7 |
# httpd –D DUMP_VHOSTS AH00112: Warning: DocumentRoot [/var/www/html/vh1.example.com] does not exist VirtualHost configuration: *:80 is a NameVirtualHost default server vh1.example.com (/etc/httpd/conf.d/vh1.example.com.conf:1) port 80 namevhost vh1.example.com (/etc/httpd/conf.d/vh1.example.com.conf:1) port 80 namevhost vh1.example.com (/etc/httpd/conf.d/vh1.example.com.conf:1) |
Konfiguracja prostego hosta wirtualnego.
1. Utworzenie pliku /etc/httpd/conf.d/vhost1.conf
o treści:
1 2 3 4 5 6 7 8 |
# vim /etc/httpd/conf.d/vhost1.conf <VirtualHost *:80> ServerAdmin admin@vhost1.example.com DocumentRoot /var/www/html/vhost1 ServerName vhost1.example.com ErrorLog logs/vhost1-error_log CustomLog logs/vhost1-access_log combined </VirtualHost> |
2. Utworzenie katalogu, w którym będzie składowana strona:
1 |
# mkdir /var/www/html/vhost1 |
3. Utworzenie pliku index.html
w DocumentRoot:
1 2 |
# vi /var/www/html/vhost1/index.html This web page is to test virtual host. |
4. Weryfikacja:
1 2 3 4 5 6 |
# httpd –D DUMP_VHOSTS VirtualHost configuration: *:80 is a NameVirtualHost default server vhost1.example.com (/etc/httpd/conf.d/vhost1.conf:1) port 80 namevhost vhost1.example.com (/etc/httpd/conf.d/vhost1.conf:1) port 80 namevhost vhost1.example.com (/etc/httpd/conf.d/vhost1.conf:1) |
5. Modyfikacja pliku /etc/hosts
:
1 |
192.168.0.1 server.example.com server webserver1.example.com webserver1 vhost1.example.com vhost1 |
6. Restart Apacha:
1 |
# systemctl restart httpd |
7. Test:
1 |
# links http://vhost1.example.com |
Konfiguracja bardziej skomplikowanego hosta wirtualnego.
1. Utworzenie pliku /etc/httpd/conf.d/vhost2.conf
o treści:
1 2 3 4 5 6 7 8 |
# vi /etc/httpd/conf.d/vhost2.conf <VirtualHost *:8900> ServerAdmin admin@vhost2.example.com DocumentRoot /var/vhost2 ServerName vhost2.example.com ErrorLog logs/vhost2-error_log CustomLog logs/vhost2-access_log combined </VirtualHost> |
2. Utworzenie katalogu, w którym będzie składowana strona:
1 |
# mkdir /var/vhost2 |
3. Utworzenie pliku index.html
w DocumentRoot:
1 2 |
# vim /var/vhost2/index.html This web page is to test a more complex virtual host setup. |
4. Weryfikacja:
1 2 3 4 5 6 |
# httpd –D DUMP_VHOSTS VirtualHost configuration: *:8900 is a NameVirtualHost default server vhost2.example.com (/etc/httpd/conf.d/vhost2.conf:1) port 8900 namevhost vhost2.example.com (/etc/httpd/conf.d/vhost2.conf:1) port 8900 namevhost vhost2.example.com (/etc/httpd/conf.d/vhost2.conf:1) |
5. Modyfikacja pliku /etc/hosts
:
1 2 |
192.168.0.1 serveripv4.example.com serveripv4 vhost2.example.com vhost2 Make the above change to the hosts file on server2 and host1 as well, so that you can test access to this virtual host from there. |
6. Dodanie kontekstu SELinux typ httpd_sys_content_t dla katalogu /var/vhost2
:
1 2 |
# semanage fcontext –at httpd_sys_content_t “/var/vhost2(/.*)?” # restorecon –Rv /var/vhost2 |
7. Dodanie portu TCP 8900 do polityki SELinux typ http_port_t:
1 2 3 |
# semanage port –at http_port_t 8900 –p tcp # semanage port –l | grep 8900 http_port_t tcp 8900, 8989, 80, 81, 443, 488, 8008, 8009, 8443, 9000 |
8. Odblokowanie portu TCP 8900 na firewallu:
1 2 |
# firewall-cmd --permanent --add-port 8900/tcp # firewall-cmd --reload |
9. Restart Apacha:
1 |
# systemctl restart httpd |
10. Test dostępu lokalnie i zdalnie:
1 2 |
# links http://vhost2.example.com # tail -f /var/log/httpd/vhost2-access_log |
Web serwery SSL/TLS.
Secure Socket Layer (SSL) to protokół kryptograficzny, który pozwala systememom na bezpieczną komunikację przez sieć. Może być używane wraz z Transport Layer Security (TLS), protokołem który zapewnia integralność, prywatność i bezpieczną autentykację. Apache działający w oparciu o SSL i TLS może być określany jako HTTPS (HyperText Transfer Protocol Secure) webowy serwer SSL. Serwer HTTPS używa cyfrowego certyfikatu by dowieść swej autentyczności klientom, którzy się do niego podłączają. Certyfikat podpisywany jest przez Certificate Authority (CA). Aby uzyskać podpis aplikant generuje parę zaszyfrowanych kluczy prywatny/publiczny oraz
CSR (Certificate Signing Request) na serwerze, dla którego ma być wystawiony certyfikat. CSR zawiera dane identyfikujące aplikanta takie jak nazwa, adres czy nazwę systemu hosta. CSR jest szyfrowany przed wysłaniem do CA. CA przegląda CSR i wydaje podpisany certyfikat. Innym typem certyfikatów są certyfikaty podpisane samodzielnie. Taki certyfikat jest wygenerowany lokalnie i jest używany do celów testowych.
W RHEL pakiety wspierające HTTPS to mod_ssl i openssl. Po instalacji mod_ssl w katalogu /etc/httpd/conf.d
pojawi się przykładowy plik ssl.conf
, który może byyć wykorzystany jako wzór przy uruchamianiu web serwerów ssl. Openssl oferuje wiele narzędzi do tworzenia i zarządzania zaszyfrowanymi kluczami, CSRami, cyfrowymi certyfikatami oraz połączeniami HTTPS. Komendy dostępne w pakiecie openssl można wylistować w sposób następujący:
1 2 3 |
# openssl list-standard-commands # openssl list-cipher-commands # openssl list-message-digest-comands |
Przykład wirtualnego hosta SSL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Listen 443 https ## SSL Virtual Host Context <VirtualHost _default_:443> DocumentRoot "/var/www/html" ServerName www.example.com:443 ErrorLog logs/ssl_error_log TransferLog logs/ssl_access_log LogLevel warn SSLEngine on SSLProtocol all -SSLv2 SSLCertificateFile /etc/pki/tls/certs/host1.crt SSLCertificateKeyFile /etc/pki/tls/private/host1.key <Files ∼ "\.(cgi|shtml|phtml|php3?)$"> SSLOptions +StdEnvVars </Files> <Directory "/var/www/cgi-bin"> SSLOptions +StdEnvVars </Directory> CustomLog logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost> |
Generowanie pary kluczy i samodzielnie podpisanego certyfikatu.
1. Instalacja pakietów mod_ssl i openssl:
1 |
# yum –y install mod_ssl openssl |
2. Zmiana katalogu na /etc/pki/tls/certs
i wygenerowanie klucza prywatnego o rozmiarze 2048 bits algorytmem RSA.
Zapisanie klucza w pliku server.example.com.key
.
1 2 3 4 5 6 7 |
# cd /etc/pki/tls/certs # openssl genpkey –algorithm rsa –pkeyopt rsa_keygen_bits:2048 –out server.example.com.key ……………………….+++ ………………………………………………………………………………+++ You can view the man pages ofthe openssl command for details, and run ”openssl genpkey” to obtain help on the options used. |
3. Utworzenie żądania podpisania certyfikatu (CSR) w pliku server.example.com.csr
przy wykorzystaniu klucza prywatnego wygenerowanego w poprzednim punkcie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# openssl req –new –key server.example.com.key –out server.example.com.csr 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) [XX]:CA State or Province Name (full name) []:Ontario Locality Name (eg, city) [Default City]:Toronto Organization Name (eg, company) [Default Company Ltd]:example Organizational Unit Name (eg, section) []:example Common Name (eg, your name or your server's hostname) []:server.example.com Email Address []:info@server.example.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: |
4. Wygenerowanie samodzielnie podpisanego certyfikatu (server.example.com.crt
) ważnego 120 dni przy wykorzystaniu klucza prywatnego (server.example.com.key
) i żądania podpisania certyfikatu (server.example.com.csr
) utworzonych wcześniej:
1 2 3 4 5 |
# openssl x509 –req –days 120 –signkey server.example.com.key –in server.example.com.csr –out server1.example.com.crt Signature ok subject=/C=CA/ST=Ontario/L=Toronto/O=example/OU=example/CN=server.example.com/emailAddress=info@server.example.com Getting Private key |
5. Zabezpieczenie kluczy nadaniem im odpowiednich praw dostępu and umieszczenie ich w katalogu /etc/pki/tls/private
:
1 2 |
# chmod 0600 server.example.com.key # mv server.example.com.key ../private |
6. Sprawdzenie ważności i statusu certyfikatu komendą openssl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# openssl s_client –connect localhost:443 –state CONNECTED(00000003) SSL_connect:before/connect initialization SSL_connect:SSLv2/v3 write client hello A SSL_connect:SSLv3 read server hello A depth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU = SomeOrganizationalUnit, CN = server.example.com, emailAddress = root@server.example.com …… . . Certificate chain 0 s:/C=-- /ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=server.example.com/emailAddress=root@server.example.com i:/C=-- /ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=server.example.com/emailAddress=root@server.example.com Server certificate -----BEGIN CERTIFICATE----- MIIEBjCCAu6gAwIBAgICGeIwDQYJKoZIhvcNAQELBQAwgbcxCzAJBgNVBAYTAi0t MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK …… . . This key and the certificate will be used in our next exercise. |
Konfiguracja bezpiecznego hosta wirtualnego SSL.
1. Utworzenie DocumentRoot:
1 |
# mkdir /var/www/html/secure |
2. Wykorzystanie przykładowego pliku /etc/httpd/conf.d/ssl.conf
do konfiguracji witual hosta. Zmieniamy w pliku ssl.conf
tylko dyrektywy zawarte poniżej, pozostałe pozostawwiamy bez zmian.
1 2 3 4 5 6 |
<VirtualHost *:443> DocumentRoot “/var/www/html/secure” ServerName server1.example.com:443 SSLCertificateFile /etc/pki/tls/certs/server.example.com.crt SSLCertificateKeyFile /etc/pki/tls/private/server.example.com.key </VirtualHost> |
3. Weryfikacja składni pliku konfiguracyjnego:
1 2 3 4 5 6 7 |
# httpd –D DUMP_VHOSTS VirtualHost configuration: *:443 is a NameVirtualHost default server server1.example.com (/etc/httpd/conf.d/ssl.conf:8) port 443 namevhost server.example.com (/etc/httpd/conf.d/ssl.conf:8) port 443 namevhost server.example.com (/etc/httpd/conf.d/ssl.conf:8) |
4. Utworzenie pliku index.html
w DocumentRoot:
1 2 |
# vim /var/www/html/secure/index.html This web page is to test a more complex virtual host setup. |
5. Zastosowanie kontektu SELinux dla katalogu /var/www/html
:
1 |
# restorecon –Rv /var/www/html |
6. Odblokowanie https na firewallu:
1 2 |
# firewall-cmd --permanent --add-service=https # firewall-cmd --reload |
7. Restart Apacha:
1 |
# systemctl restart httpd |
8. Test dostępu z hosta lokalnego i zdalnego:
1 2 |
# links https://server.example.com # tail -f /var/log/httpd/server1-ssl_access_log |
Hostowanie dynamicznych stron CGI.
Apache pozwala nam nie tylko na hostowanie stron statycznych ale także dynamicznych. Skrypt jest uruchamiany w tle a wynik jego wykonania wyświetlany jest na serwowanej stronie web. Taki mechanizm może być realizowany m.in. dzięki Common Gateway Interface (CGI). Skrypty CGI mogą być napisane w Perlu, Ruby, Pythonie, C, bashu lub w innym języku programowania.
Uruchomienie podstawowego skryptu CGI.
1. Utworzenie skryptu systime.sh w katalogu /var/www/cgi-bin
:
1 2 3 4 5 |
# vim /var/www/cgi-bin/systime.sh #!/bin/bash echo “Content-type: text” echo echo “The current system time is `date`” |
2. Zezwolenie na wykonywanie skryptu:
1 |
# chmod +x /var/www/cgi-bin/systime.sh |
3. Aktywacja zmiennej boolean SELinux httpd_enable_cgi:
1 |
# setsebool –P httpd_enable_cgi 1 |
4. Restart Apacha:
1 |
# systemctl restart httpd |
5. Test:
1 |
# links http://server1/cgi-bin/systime.sh |
6. Sprawdzenie logu:
1 |
# tail -n 20 /var/log/httpd/server1-ssl_access_log file |
7. Sprawdzenie, jakie logi zostały zaktualizowane:
1 |
# ll –lrt /var/log/httpd: |
Uruchomienie podstawowego skryptu CGI w niedomyślnym katalogu.
1. Utworzenie katalogu /var/dynpage
do składowania skryptów CGI:
1 |
# mkdir /var/dynpage |
2. Utworzenie skryptu sysmem.sh w katalogu /var/dynpage
:
1 2 3 4 5 |
# vi /var/dynpage/sysmem.sh #!/bin/bash echo –e “Content-type: text\n” echo echo “The system memory usage is $(free –m) ” |
3. Dodanie praw wykonywania skryptu:
1 |
# chmod +x /var/dynpage/sysmem.sh |
4. Aktywacja zmiennej boolean SELinux httpd_enable_cgi:
1 |
# setsebool –P httpd_enable_cgi 1 |
5. Dodanie kontekstu SELinux typ httpd_sys_script_exec_t dla katalogu /var/dynpage
:
1 2 |
# semanage fcontext –at httpd_sys_script_exec_t "/var/dynpage(/.*)?" # restorecon –Rv /var/dynpage |
6. Modyfikacja dyrektywy ScriptAlias w pliku httpd.conf
:
1 2 3 4 5 6 |
ScriptAlias /cgi-bin/ /var/dynpage/ <Directory /var/dynpage> AllowOverride None Options None Require all granted </Directory> |
7. Restart Apacha:
1 |
# systemctl restart httpd |
8. Test:
1 |
# links http://server1/cgi-bin/sysmem.sh |
9. Sprawdzenie logu:
1 |
# tail -f /var/log/httpd/server1-ssl_access_log |
Serwowanie dynamicznych stron PHP.
Skrypty PHP mogą być serwowane jako skrypty CGI ale lepiej jest zainstalować moduł mod_php, który włącza wewnętrzny bardziej wydajny interpreter PHP. Instalacja mod_php tworzy nowy plik konfiguracyjny /etc/httpd/conf.d/php.conf
, który zawiera kilka dyrektyw pozwalających na uruchamianie skryptów PHP.
1 2 3 4 5 6 7 8 9 10 11 |
# grep -v '^#' /etc/httpd/conf.d/php.conf <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> AddType text/html .php DirectoryIndex index.php php_value session.save_handler "files" php_value session.save_path "/var/lib/php/session" |
Serwowanie dynamicznych stron Python.
Również skrypty Python mogą być serwowane jako skrypty CGI lub przez Web Server Gateway Interface (WSGI) zawarty w module mod_wsgi
.
1. Instalacja modułu mod_wsgi.
1 |
# yum -y install mod_wsgi |
2. Edycja /etc/hosts
:
1 2 |
# vim /etc/hosts 192.168.0.1 server server.example.com www.example.com webapp.example.com |
3. Utworzenie katalogu, w którym będzie hostowany skrypt WSGI:
1 |
# mkdir /var/www/webapp |
4. Utworzenie przykładowego skryptu WSGI:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# cd /var/www/webapp # touch webapp.wsgi # vim webapp.wsgi def application(environ, start_response): status = '200 OK' output = 'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output] |
5. Konfiguracja hosta wirtualnego do serwowania skryptu WSGI:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# vim /etc/httpd/conf.d/wsgi.conf <VirtualHost *:80> ServerAdmin webmaster@www.example.com DocumentRoot „/var/www/webapp” ServerName webapp.example.com WSGIScriptAlias / /var/www/webapp/webapp.wsgi ErrorLog /var/log/httpd/webapp.example.com-error_log CustomLog /var/log/httpd/webapp.example.com-access_log combined </VirtualHost> <Directory /var/www/webapp> AllowOverride None Require all granted </Directory> |
6. Restart Apacha.
1 |
# systemctl restart httpd |
I am in fact delighted to read this weblog posts which includes tons of valuable data, thanks for providing these kinds of statistics.