Wyszukiwanie w witrynie

Twórz wirtualne hosty, katalogi chronione hasłem i certyfikaty SSL za pomocą „Nginx Web Server” w Arch Linux


Poprzedni artykuł „LEMP” Arch Linux opisał podstawowe rzeczy, od instalacji usług sieciowych (Nginx, baza danych MySQL i PhpMyAdmin) po skonfigurowanie minimalnych zabezpieczeń wymaganych dla serwera MySQL i PhpMyadmin.

Ten temat jest ściśle powiązany z poprzednią instalacją LEMP na Arch Linux i poprowadzi Cię przez ustawianie bardziej złożonych konfiguracji stosu LEMP, zwłaszcza konfiguracji serwera WWW Nginx, takich jak tworzenie hostów wirtualnych , skorzystaj z Katalogów chronionych hasłem, utwórz i skonfiguruj HTTP Secure Sockets Layer, niezabezpieczone przekierowania HTTP do HTTPS, a także przedstawię Ci kilka przydatnych skryptów Bash, które ułatwi pracę związaną z aktywacją wirtualnych hostów i wygeneruje Certyfikat i klucze SSL.

Wymagania

Zainstaluj LEMP z bazą danych MariaDB w Arch Linux

Krok 1: Włącz wirtualne hosty w Nginx

Jedną z najprostszych metod włączenia hostów wirtualnych jest użycie instrukcji include w głównym pliku konfiguracyjnym Nginx, co sprawia, że dalsze konfiguracje są prostsze i wydajniejsze, ponieważ można tworzyć proste pliki dla każdego nowego hosta i dbaj o czystość głównego pliku konfiguracyjnego.

To podejście działa tak samo jak na Apache Web Server, pierwszą rzeczą, którą musisz zrobić, to określić nową ścieżkę URI, gdzie Nginx powinien czytać dyrektywy plików.

1. Zatem otwórz główny plik nginx.conf znajdujący się w ścieżce systemowej /etc/nginx/ i na dole, przed ostatnim nawiasem klamrowym „ ” dodaj ścieżkę, w której będą znajdować się przyszłe pliki konfiguracyjne Virtual Host.

sudo nano /etc/nginx/nginx.conf

Na dole dodaj następujące oświadczenie.

include /etc/nginx/sites-enabled/*.conf;

Ta dyrektywa mówi Nginxowi, że powinien przeczytać wszystkie pliki znalezione w /etc/nginx/sites-enabled/, które kończą się rozszerzeniem .conf.

2. Następnym krokiem jest utworzenie katalogu obsługiwanego witrynami i kolejnego, o nazwie dostępne witryny, w którym będziesz przechowywać całą konfigurację hostów wirtualnych akta.

sudo mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled

3. Teraz nadszedł czas na utworzenie nowego wirtualnego hosta. W tym przykładzie jako nazwa hosta wirtualnego zostanie użyty systemowy adres IP, dlatego utwórz nowy plik o nazwie name-ip.conf.

sudo nano /etc/nginx/sites-available/name-ip.conf

Dodaj następującą treść.

## File content ##

server {
    listen 80;
    server_name 192.168.1.33;

    access_log /var/log/nginx/192.168.1.33.access.log;
    error_log /var/log/nginx/192.168.1.33.error.log;

    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }

    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

Dyrektywa aktywująca Hosta wirtualnego to instrukcja nazwa_serwera znajdująca się w porcie nasłuchiwania. Kolejną ważną dyrektywą jest instrukcja root, która wskazuje, że wirtualny host Nginx ma udostępniać zawartość plików ze ścieżki systemowej /srv/http/.

4. Ostatnim krokiem jest utworzenie katalogu /srv/http/ i udostępnienie konfiguracji pliku name-ip.conf do odczytu Nginx (przy użyciu dowiązanie symboliczne), a następnie zrestartuj demona, aby nowe konfiguracje były widoczne.

sudo mkdir /srv/http/
sudo ln -s /etc/nginx/sites-available/name-ip.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

5. Aby to sprawdzić, wskaż w przeglądarce adres IP systemu Arch i powinieneś zobaczyć, że zawartość sieci różni się od http://localhost. Tutaj dodałem mały skrypt php, który sprawdza również konfiguracje FastCGI PHP, jak na zrzucie ekranu poniżej.

sudo nano /srv/http/info.php
## File content ##

<?php
phpinfo();
?>

6. Inna metoda, którą sam opracowałem, aby włączyć lub wyłączyć wirtualne hosty w Nginx, jest bardziej elegancka i jest inspirowana skryptem Apache a2eniste.

Aby skorzystać z tej metody, otwórz edytor plików i utwórz nowy plik o nazwie n2ensite na ścieżce $HOME z poniższą treścią, uczyń go wykonywalnym i uruchom z uprawnieniami roota i przekaż jako opcję swojej nowej nazwie wirtualnego hosta bez końcówki .conf (możesz dowolnie modyfikować ją zgodnie ze swoimi potrzebami).

sudo nano n2ensite
## File content ##

#!/bin/bash
if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled  ; then
echo "-----------------------------------------------"
else
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
fi

avail=/etc/nginx/sites-available/$1.conf
enabled=/etc/nginx/sites-enabled/
site=`ls /etc/nginx/sites-available/`

if [ "$#" != "1" ]; then
                echo "Use script: n2ensite virtual_site"
                echo -e "\nAvailable virtual hosts:\n$site"
                exit 0
else

if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail virtual host does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart nginx server: sudo systemctl restart nginx"
else
echo  -e "Virtual host $avail does not exist!\nPlease see available virtual hosts:\n$site"
exit 0
fi
fi

Ustaw go jako wykonywalny i uruchom jako pokaz.

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. Aby wyłączyć hosty wirtualne, utwórz nowy plik n2dissite z następującą zawartością i zastosuj te same ustawienia, co powyżej.

sudo nano n2dissite
## File content ##

#!/bin/bash
avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled/`

if [ "$#" != "1" ]; then
                echo "Use script: n2dissite virtual_site"
                echo -e "\nAvailable virtual hosts: \n$site"
                exit 0
else
if test -e $avail; then
sudo rm  $avail
else
echo -e "$avail virtual host does not exist! Exiting!"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail virtual host!"
else
echo  -e "Success! $avail has been removed!\nPlease restart Nginx: sudo systemctl restart nginx"
exit 0
fi
fi

8. Teraz możesz użyć tych dwóch skryptów, aby włączyć lub wyłączyć dowolnego wirtualnego hosta, ale jeśli chcesz zastosować go jako polecenia systemowe, po prostu skopiuj oba skrypty do /usr/local/bin/ i wtedy możesz go użyć bez podawania ścieżki.

sudo cp n2ensite n2dissite /usr/local/bin/

Krok 2: Włącz SSL z wirtualnymi hostami na Nginx

SSL (Secure Sockets Layer) to protokół przeznaczony do szyfrowania połączeń HTTP w sieciach lub Internecie, który umożliwia przesyłanie danych bezpiecznym kanałem przy użyciu symetrycznych/asymetrycznych kluczy kryptograficznych i jest dostarczany w Arch Linux przez pakiet OpenSSL.

sudo pacman -S openssl

9. Aby włączyć połączenia HTTPS z Nginx, pierwszą rzeczą, którą musisz zrobić, to wygenerować klucze wirtualnych hostów. Ponadto, aby uprościć sprawę, opracowałem mały skrypt, który automatycznie generuje klucze kryptograficzne w ścieżce katalogu /etc/nginx/ssl, używając nazewnictwa hostów wirtualnych jako nazw kluczy.

Utwórz plik o nazwie nginx_gen_ssl i dodaj następującą treść.

sudo nano nginx_gen_ssl
## File content ##

#!/bin/bash
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

echo -e "Enter your virtual host FQDN: \nThis will generate the default name for Nginx  SSL certificate!"
read cert

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
chmod 600 $cert.key
openssl req -new -key $cert.key -out $cert.csr
openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt

echo -e " The certificate $cert has been generated!\nPlease link it to nginx ssl available website!"
ls -all /etc/nginx/ssl
exit 0

10. Po utworzeniu skryptu dodaj uprawnienia do wykonywania, uruchom go i podaj opcje certyfikatu, z których najważniejsza to pole Nazwa zwyczajowa (tutaj dodaj oficjalną nazwę domeny) i pozostaw pola Hasło i Opcjonalna Firma puste.

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

Po zakończeniu zadania generowania kluczy zostanie wyświetlona lista wszystkich dostępnych kluczy w katalogu Nginx ssl.

Jeśli chcesz, aby ten skrypt był używany jako polecenie systemowe, skopiuj go lub przenieś do /usr/local/bin/.

sudo mv nginx_gen_ssl  /usr/local/bin

11. Po wygenerowaniu kluczy niezbędnych dla wirtualnego hosta Nginx SSL nadszedł czas na utworzenie pliku konfiguracyjnego wirtualnego hosta SSL. Użyj tego samego systemowego adresu IP dla hosta wirtualnego, jak powyżej w dyrektywie nazwa_serwera, ale nieznacznie zmień nazwę pliku hosta wirtualnego, dodając ssl przed .conf, aby przypomnieć, że ten plik oznacza name-ip Virtual Host SSL.

sudo nano /etc/nginx/sites-availabe/name-ip-ssl.conf

W tym pliku zmień instrukcję portu listen na 443 ssl i podaj ścieżki plików kluczy SSL i certyfikatów na te utworzone wcześniej, tak aby wyglądały jak w poniższym fragmencie.

## File content ##

server {
    listen 443 ssl;
    server_name 192.168.1.33;

       ssl_certificate     /etc/nginx/ssl/192.168.1.33.crt;
       ssl_certificate_key  /etc/nginx/ssl/192.168.1.33.key;

       ssl_session_cache    shared:SSL:1m;
       ssl_session_timeout  5m;

       ssl_ciphers  HIGH:!aNULL:!MD5;
       ssl_prefer_server_ciphers  on;

    access_log /var/log/nginx/192.168.1.33-ssl.access.log;
    error_log /var/log/nginx/192.168.1.33-ssl.error.log;
    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }
    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

12. Po utworzeniu pliku użyj skryptu n2ensite lub wiersza poleceń ln, aby go aktywować (tworzy dowiązanie symboliczne do pliku w sites -enabled), a następnie zrestartuj demona Nginx, aby zastosować ustawienia.

sudo ./n2ensite name-ip-ssl
OR
sudo ln -s /etc/nginx/sites-available/name-ip-ssl.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

13. Ponownie skieruj przeglądarkę na Arch IP URL, ale tym razem używając protokołu HTTPS – https://192.168.1.33 w moim systemie- i powinien pojawić się błąd bezpieczeństwa Połączenie niezaufane ( Dodaj i potwierdź wyjątek bezpieczeństwa, aby przejść dalej na stronie).

Jak teraz widzisz, Twój wirtualny host Nginx udostępnia tę samą zawartość, co poprzedni host name-ip, ale tym razem przy użyciu bezpiecznego połączenia HTTP.

Krok 3: Uzyskaj dostęp do PhpMyAdmin poprzez wirtualnego hosta

Jeśli Host wirtualny jest włączony w Nginx, nie mamy już dostępu do zawartości ścieżki http://localhost (localhost zwykle udostępnia zawartość przy użyciu adresu IP sprzężenia zwrotnego lub adresu IP systemu, jeśli nie jest skonfigurowany inaczej), ponieważ mamy użyłem adresu IP systemu Arch jako nazwa_serwera, więc nasza ścieżka treści uległa zmianie.

14. Najprostszą metodą uzyskania dostępu do PhpMyAdmin przez Internet jest utworzenie symbolicznego łącza pomiędzy ścieżką /usr/share/webapps/phpMyAdmin/ oraz nasza nowa zdefiniowana ścieżka hosta wirtualnego (/srv/http).

sudo ln -s /usr/share/webapps/phpMyAdmin/ /srv/http/

15. Po wykonaniu powyższego polecenia odśwież swoją stronę, a zobaczysz nowy folder phpMyAdmin, jeśli włączona jest instrukcja autoindex na wirtualnym hoście Nginx lub skieruj swój adres URL bezpośrednio do Folder PhpMyAdmin https://arch_IP/phpMyAdmin.

16. Jeśli chcesz wyczyścić ciąg phpMyAdmin w przeglądarce, edytuj pliki Virtual Hosts i dodaj następującą zawartość w bloku serwera.

location /phpmyadmin {
       rewrite ^/* /phpMyAdmin last;
    }

Krok 4: Włącz katalog chroniony hasłem w Nginx

W przeciwieństwie do Apache, Nginx używa modułu HttpAuthBasic, aby włączyć Katalogi chronione hasłem, ale nie udostępnia żadnych narzędzi do tworzenia zaszyfrowanego pliku .htpasswd.

17. Aby zapewnić ochronę katalogów hasłem za pomocą Nginx na Arch Linux, zainstaluj serwer WWW Apache i użyj jego narzędzi do wygenerowania zaszyfrowanego pliku .htaccess.

sudo pacman -S apache

18. Po zainstalowaniu Apache utwórz nowy katalog w /etc/nginx/ o intuicyjnej nazwie passwd, w którym będzie przechowywany plik .htpasswd i użyj go Polecenie htpasswd z przełącznikiem –c włączającym pierwszego dodanego użytkownika w celu wygenerowania pliku, a jeśli chcesz dodać więcej użytkowników, użyj htpasswd bez – c przełącznik.

sudo mkdir /etc/nginx/passwd

sudo htpasswd -c /etc/nginx/passwd/.htpasswd first_user
sudo htpasswd /etc/nginx/passwd/.htpasswd second_user
sudo htpasswd /etc/nginx/passwd/.htpasswd third_user

19. W celu ochrony name-ip-ssl katalogu głównego hosta wirtualnego /srv/http/ podana ścieżka ze wszystkimi podfolderami i plikami znajdującymi się poniżej dodaj następujące instrukcje do bloku serwera hosta wirtualnego w ramach dyrektywy root i wskaż bezwzględną ścieżkę pliku .htpasswd.

auth_basic "Restricted Website";
auth_basic_user_file /etc/nginx/passwd/.htpasswd;

20. Po ponownym uruchomieniu usługi Nginx odśwież stronę i wyskakujące okienko Wymagane uwierzytelnienie powinno wyświetlić się z żądaniem podania danych uwierzytelniających.

Teraz pomyślnie włączyłeś Katalogi chronione hasłem Nginx, ale pamiętaj, że w tym samym czasie w twoim systemie jest zainstalowany serwer WWW Apache, więc upewnij się, że pozostaje on wyłączony i w żadnym wypadku go nie uruchamiaj, ponieważ może to prowadzić do porty powodujące konflikt z Nginx.

Krok 5: Przekieruj HTTP na HTTPS na Nginx

21. Jeśli chcesz, aby przeglądarki automatycznie przekierowywały wszystkie niezabezpieczone żądania HTTP do protokołu HTTPS, otwórz i edytuj, jesteś hostem wirtualnym nie obsługującym ssl i dodaj następującą instrukcję w sekcji nazwa_serwera.

rewrite        ^ https://$server_name$request_uri? permanent;

Wszystkie ustawienia przedstawione w tym artykule zostały wykonane w systemie Arch Linux, który pełni rolę serwera, ale większość z nich, szczególnie te dotyczące plików konfiguracyjnych Nginx, jest dostępna w większości systemów Linux z niewielkimi różnicami.