Kreirajte virtuelne hostove, imenike za zaštitu lozinkom i SSL sertifikate koristeći "Nginx Web server" u Arch Linuxu


Prethodni članak Arch Linux 'LEMP' pokrio je samo osnovne stvari, od instaliranja mrežnih usluga (Nginx, MySQL baze podataka i PhpMyAdmin) i konfigurisanja minimalne sigurnosti potrebne za MySQL server i PhpMyadmin.

Ova tema je striktno povezana s prethodnom instalacijom LEMP-a na Arch Linux i vodit će vas kroz postavljanje složenijih konfiguracija za LEMP stack, posebno konfiguracije Nginx web servera, kao što je kreiranje Virtuelnih hostova , koristite Direktorije zaštićene lozinkom, kreirajte i konfigurirajte HTTP Secure Sockets Layer, HTTP nesigurna preusmjeravanja na HTTPS i također će vam predstaviti neke korisne Bash skripte koje će olakšati posao aktiviranja virtualnih hostova i generirati SSL certifikat i ključeve.

Zahtjevi

Instalirajte LEMP sa MariaDB bazom podataka u Arch Linux

Korak 1: Omogućite virtuelne hostove na Nginxu

Jedna od najjednostavnijih metoda za omogućavanje Virtuelnih hostova je korištenje naredbi include na glavnoj Nginx konfiguracijskoj datoteci, što posao daljnjih konfiguracija čini jednostavnijim i efikasnijim jer možete kreirati jednostavne datoteke za svaki novi host i održavajte glavni konfiguracijski fajl čistijim.

Ovaj pristup funkcioniše na isti način kao na Apache Web serveru, prvo što treba da uradite je da navedete novi URI putanju gde Nginx treba da čita direktive datoteka.

1. Dakle, otvorite glavnu datoteku nginx.conf koja se nalazi na /etc/nginx/ sistemskoj putanji i na dnu, prije zadnje vitičaste zagrade “ }” dodajte putanju na kojoj će se nalaziti budući konfiguracijski fajlovi virtualnog hosta.

sudo nano /etc/nginx/nginx.conf

Na dnu dodajte sljedeću izjavu.

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

Ova direktiva govori Nginx-u da treba pročitati sve datoteke koje se nalaze u /etc/nginx/sites-enabled/ koje završavaju sa ekstenzijom .conf.

2. Sljedeći korak je kreiranje direktorija sa omogućenim lokacijama i još jednog, koji se zove sites-available, gdje pohranjujete svu svoju konfiguraciju virtualnih hostova datoteke.

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

3. Sada je vrijeme za kreiranje novog virtuelnog hosta. Ovaj primjer će koristiti sistemsku IP adresu kao naziv virtuelnog hosta, pa kreirajte novi fajl pod nazivom name-ip.conf.

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

Dodajte sljedeći sadržaj.

## 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;
    }
}

Direktiva koja aktivira Virtual Host je izjava server_name pod portom za slušanje. Također, ovdje je još jedna važna direktiva root izjava koja upućuje na Nginx Virtual Host da služi sadržaj datoteke sa /srv/http/ sistemske putanje.

4. Posljednji korak je da kreirate /srv/http/ direktorij i učinite konfiguraciju datoteke name-ip.conf dostupnom za Nginx čitanje (koristeći simbolička veza), zatim ponovo pokrenite demon da nove konfiguracije budu vidljive.

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

5. Da biste to potvrdili, usmjerite svoj pretraživač na IP adresu Arch sistema i trebali biste vidjeti da se web sadržaj razlikuje od http://localhost. Ovdje sam dodao malu php skriptu koja također provjerava FastCGI PHP konfiguracije kao na slici ispod.

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

<?php
phpinfo();
?>

6. Druga metoda koju sam sam razvio da omogućim ili onemogućim virtuelne hostove na Nginxu je elegantnija i inspirisana je Apache a2eniste skriptom.

Da biste koristili ovu metodu, otvorite uređivač datoteka i kreirajte novu datoteku, nazvanu n2ensite, na vašoj $HOME putanji sa sadržajem ispod, učinite je izvršnom, pokrenite je s root privilegijama i proslijedite kao opciju vašem novom nazivu virtuelnog hosta bez završetka .conf (ispunite slobodno da ga izmijenite prema vašim potrebama).

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

Učinite ga izvršnim i pokrenite ga kao show.

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. Da biste onemogućili virtuelne hostove, kreirajte novi n2dissite fajl sa sledećim sadržajem i primenite iste postavke kao gore.

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. Sada možete koristiti ove dvije skripte da omogućite ili onemogućite bilo koji virtuelni host, ali ako želite da ga primenite kao sistemske komande samo kopirajte obe skripte u /usr/local/bin/ i onda ga možete koristiti bez navođenja putanje.

sudo cp n2ensite n2dissite /usr/local/bin/

Korak 2: Omogućite SSL sa virtuelnim hostovima na Nginxu

SSL (Secure Sockets Layer) je protokol dizajniran za šifriranje HTTP veza preko mreža ili Interneta, koji omogućava da se protok podataka prenosi preko sigurnog kanala koristeći simetrične/asimetrične kriptografske ključeve i dostupan je u Arch Linuxu od OpenSSL paketa.

sudo pacman -S openssl

9. Da biste omogućili HTTPS konekciju sa Nginxom, prvo što trebate učiniti je generirati ključeve virtuelnih hostova. Takođe, da pojednostavim stvari, razvio sam male skripte koje automatski generišu kriptografske ključeve na /etc/nginx/ssl putanji direktorijuma, koristeći imenovanje virtuelnog hosta kao imena ključeva.

Kreirajte datoteku pod nazivom nginx_gen_ssl i dodajte sljedeći sadržaj.

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. Nakon što je skripta kreirana, dodajte dozvole za izvršavanje, pokrenite je i unesite svoje opcije certifikata, od kojih je najvažnije polje Common Name (ovdje dodajte službeno ime domene) i ostavite polja Lozinka i Opciona kompanija prazna.

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

Na kraju zadatka generiranja ključeva, prikazat će se lista sa svim dostupnim ključevima u Nginx ssl direktoriju.

Takođe, ako želite da se ova skripta koristi kao sistemska naredba, kopirajte je ili premjestite u /usr/local/bin/.

sudo mv nginx_gen_ssl  /usr/local/bin

11. Nakon što smo generirali ključeve neophodne za Nginx SSL Virtual Host, vrijeme je da zapravo kreiramo konfiguracijsku datoteku SSL Virtual Host. Koristite istu sistemsku IP adresu za virtuelni host kao gore za server_name direktivu, ali malo promijenite naziv datoteke virtuelnog hosta dodavanjem ssl prije .conf, da vas podsjeti da je ovaj fajl znači name-ip SSL Virtual Host.

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

Na ovoj datoteci promijenite naredbu porta slušajte u 443 ssl i navedite putanje datoteka ključeva SSL-a i certifikata sa onima kreiranim ranije da izgledaju kao u donjem izvodu.

## 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. Nakon što je fajl kreiran, koristite n2ensite skriptu ili ln komandnu liniju da ga aktivirate (kreira simboličku vezu datoteke u stranicama -enabled direktorijum), zatim ponovo pokrenite Nginx demon da biste primijenili postavke.

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. Ponovo usmjerite svoj pretraživač na Arch IP URL, ali ovaj put koristeći HTTPS protokol – https://192.168.1.33 na mom sistemu- i bi se trebala pojaviti sigurnosna greška Nepouzdana veza ( Dodaj i potvrdi sigurnosni izuzetak da ideš dalje na stranici).

Kao što sada možete vidjeti, vaš Nginx Virtual Host služi isti sadržaj kao prethodni name-ip host, ali ovaj put koristi HTTP sigurnu vezu.

Korak 3: Pristupite PhpMyAdmin-u preko Virtual Host-a

Ako je virtuelni host omogućen na Nginx-u, više nemamo pristup sadržaju putanje http://localhost (lokalni host obično opslužuje sadržaj koristeći IP adresu povratne petlje ili sistemsku IP adresu ako nije drugačije konfigurisano) jer imamo koristio Arch system IP kao ime_servera tako da se naš put sadržaja promijenio.

14. Najjednostavniji način za pristup PhpMyAdmin putem weba je kreiranje simboličke veze između /usr/share/webapps/phpMyAdmin/ putanje i naš novi definirani virtualni host staza (/srv/http).

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

15. Nakon što ste izvršili gornju naredbu, osvježite svoju stranicu i vidjet ćete da se pojavljuje nova mapa phpMyAdmin, ako je naredba autoindex omogućena na Nginx Virtual Host-u ili usmjerite svoj URL direktno na PhpMyAdmin folder https://arch_IP/phpMyAdmin.

16. Ako želite da očistite phpMyAdmin string na pretraživaču, uredite svoje Virtual Hosts datoteke i dodajte sljedeći sadržaj u blok servera.

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

Korak 4: Omogućite direktorij zaštićen lozinkom na Nginxu

Za razliku od Apache-a, Nginx koristi HttpAuthBasic modul da omogući direktorije zaštićene lozinkom, ali ne pruža nikakve alate za kreiranje šifrovane datoteke .htpasswd.

17. Da biste postigli zaštitu direktorija lozinkom pomoću Nginxa na Arch Linuxu, instalirajte Apache web server i koristite njegove alate za generiranje šifrirane datoteke .htaccess.

sudo pacman -S apache

18. Nakon što ste instalirali Apache, kreirajte novi direktorij pod /etc/nginx/ pod nazivom intuitivno passwd gdje će datoteka .htpasswd biti pohranjena i korištena htpasswd naredba sa –c uključiti prvog dodanog korisnika za generiranje fajla, a zatim ako želite dodati još korisnika koristite htpasswd bez – c prekidač.

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. Da bi se zaštitio name-ip-ssl Virtuelni host root /srv/http/ služio je putanju sa svim svojim podfolderima i fajlovima ispod dodaje sljedeće upute unutar vašeg Virtual Host serverskog bloka pod root direktivom i usmjerava ga na apsolutnu putanju datoteke .htpasswd.

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

20. Nakon što ponovo pokrenete Nginx uslugu, osvježite stranicu i skočni prozor Potrebna je autentifikacija koji zahtijevaju vaše vjerodajnice.

Sada ste uspješno omogućili Nginx Direktorije zaštićene lozinkom, ali imajte na umu da je u isto vrijeme kada je Apache web server instaliran na vašem sistemu, pa se pobrinite da ostane onemogućen i nikako ga nemojte pokretati jer može dovesti do portovi u sukobu sa Nginxom.

Korak 5: Preusmjerite HTTP na HTTPS na Nginxu

21. Ako želite da pretraživači automatski preusmjeravaju sve nesigurne HTTP zahtjeve na HTTPS protokol otvaraju i uređuju, vi ste ne-ssl Virtual Host i dodajte sljedeće instrukcije pod naziv_servera direktiva.

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

Sve postavke predstavljene u ovom članku napravljene su pod Arch Linux sistemom koji djeluje kao server, ali većina njih, posebno ona koja se odnose na Nginx konfiguracijske datoteke, dostupna je na većini Linux sistema sa malim razlikama.