Ricerca nel sito web

Crea host virtuali, directory protette da password e certificati SSL utilizzando "Nginx Web Server" in Arch Linux


Il precedente articolo "LEMP" di Arch Linux trattava solo aspetti di base, dall'installazione dei servizi di rete (Nginx, database MySQL e PhpMyAdmin) alla configurazione della sicurezza minima richiesta per il server MySQL e PhpMyadmin.

Questo argomento è strettamente correlato alla precedente installazione di LEMP su Arch Linux e ti guiderà attraverso l'impostazione di configurazioni più complesse per lo stack LEMP, in particolare le configurazioni del server web Nginx, come la creazione di host virtuali , utilizza Directory protette da password, crea e configura HTTP Secure Sockets Layer, reindirizzamenti HTTP non sicuri a HTTPS e ti presenterà anche alcuni utili script Bash che faciliterà il lavoro di attivazione degli host virtuali e genererà certificato e chiavi SSL.

Requisiti

Installa LEMP con il database MariaDB in Arch Linux

Passaggio 1: abilita gli host virtuali su Nginx

Uno dei metodi più semplici per abilitare gli host virtuali è utilizzare le istruzioni include sul file di configurazione principale di Nginx, che rende il lavoro di ulteriori configurazioni più semplice ed efficiente perché puoi creare file semplici per ogni nuovo host e mantenere il file di configurazione principale più pulito.

Questo approccio funziona allo stesso modo del Web Server Apache, la prima cosa che devi fare è specificare il nuovo percorso URI in cui Nginx dovrebbe leggere le direttive dei file.

1. Quindi, apri il file principale nginx.conf situato nel percorso di sistema /etc/nginx/ e in basso, prima dell'ultima parentesi graffa " }" aggiunge il percorso in cui risiederanno i futuri file di configurazione dell'host virtuale.

sudo nano /etc/nginx/nginx.conf

In fondo aggiungi la seguente dichiarazione.

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

Questa direttiva dice a Nginx di leggere tutti i file che si trovano in /etc/nginx/sites-enabled/ che terminano con un'estensione .conf.

2. Il passaggio successivo è creare la directory sites-enabled e un'altra, chiamata sites-available, in cui memorizzi tutta la configurazione dei tuoi host virtuali File.

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

3. Ora è il momento di creare un nuovo host virtuale. Questo esempio utilizzerà l'indirizzo IP del sistema come nome host virtuale, quindi crea un nuovo file denominato nome-ip.conf.

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

Aggiungi il seguente contenuto.

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

La direttiva che attiva l'host virtuale è l'istruzione nome_server nella porta di ascolto. Inoltre, un'altra direttiva importante qui è l'istruzione root che indirizza Nginx Virtual Host a servire il contenuto del file dal percorso di sistema /srv/http/.

4. L'ultimo passaggio è creare la directory /srv/http/ e rendere disponibile la configurazione del file name-ip.conf per la lettura di Nginx (utilizzando collegamento simbolico), quindi riavviare il demone per rendere visibili le nuove configurazioni.

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

5. Per verificarlo, punta il browser sull'indirizzo IP del sistema Arch e dovresti vedere che il contenuto web è diverso da http://localhost. Qui ho aggiunto un piccolo script php che controlla anche le configurazioni FastCGI PHP come nello screenshot qui sotto.

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

<?php
phpinfo();
?>

6. Un altro metodo che ho sviluppato io stesso per abilitare o disabilitare gli host virtuali su Nginx è più elegante ed è ispirato allo script Apache a2eniste.

Per utilizzare questo metodo apri un editor di file e crea un nuovo file, chiamato n2ensite, sul tuo percorso $HOME con il contenuto seguente, rendilo eseguibile, eseguilo con privilegi di root e passa come opzione al tuo nuovo nome Host Virtuale senza estensione .conf (riempilo gratuitamente per modificarlo secondo le tue esigenze).

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

Rendilo eseguibile ed eseguilo come show.

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. Per disabilitare gli host virtuali crea un nuovo file n2dissite con il seguente contenuto e applica le stesse impostazioni di cui sopra.

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. Ora puoi utilizzare questi due script per abilitare o disabilitare qualsiasi host virtuale, ma se vuoi applicarlo come comandi a livello di sistema basta copiare entrambi gli script su /usr/local/bin/ e quindi puoi usarlo senza specificare il percorso.

sudo cp n2ensite n2dissite /usr/local/bin/

Passaggio 2: abilita SSL con host virtuali su Nginx

SSL (Secure Sockets Layer) è un protocollo progettato per crittografare le connessioni HTTP su reti o Internet, che fanno sì che il flusso di dati venga trasmesso su un canale sicuro utilizzando chiavi di crittografia simmetriche/asimmetriche ed è fornito in Arch Linux dal pacchetto OpenSSL.

sudo pacman -S openssl

9. Per abilitare le connessioni HTTPS con Nginx la prima cosa che devi fare è generare chiavi Virtual Hosts. Inoltre, per semplificare le cose, ho sviluppato un piccolo script che genera automaticamente chiavi crittografiche sul percorso della directory /etc/nginx/ssl, utilizzando la denominazione dell'host virtuale come nome della chiave.

Crea un file denominato nginx_gen_ssl e aggiungi il seguente contenuto.

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. Dopo che lo script è stato creato, aggiungi i permessi di esecuzione, eseguilo e fornisci le opzioni del tuo certificato, la più importante delle quali è il campo Nome comune (aggiungi qui il nome di dominio ufficiale) e lasciare vuoti i campi Password e Azienda facoltativa.

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

Al termine dell'attività di generazione delle chiavi, verrà visualizzato un elenco con tutte le chiavi disponibili nella directory SSL Nginx.

Inoltre, se vuoi che questo script venga utilizzato come comando di sistema, copialo o spostalo in /usr/local/bin/.

sudo mv nginx_gen_ssl  /usr/local/bin

11. Dopo aver generato le chiavi necessarie per l'host virtuale SSL Nginx, è il momento di creare effettivamente il file di configurazione dell'host virtuale SSL. Utilizza lo stesso indirizzo IP di sistema per l'host virtuale come sopra nella direttiva nome_server ma modifica leggermente il nome del file dell'host virtuale aggiungendo ssl prima di .conf, per ricordarti che questo file sta per nome-ip host virtuale SSL.

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

Su questo file modifica l'istruzione della porta listen in 443 ssl e fornisci i percorsi dei file delle chiavi SSL e del certificato con quelli creati in precedenza in modo che appaiano nell'estratto seguente.

## 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. Dopo che il file è stato creato, utilizza lo script n2ensite o la riga di comando ln per attivarlo (crea un collegamento simbolico al file in sites -enabled), quindi riavviare il demone Nginx per applicare le impostazioni.

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. Punta nuovamente il browser su Arch IP URL ma questa volta utilizzando il protocollo HTTPS – https://192.168.1.33 sul mio sistema- e dovrebbe apparire un errore di sicurezza Connessione non attendibile (Aggiungi e conferma eccezione di sicurezza per andare avanti nella pagina).

Come ora puoi vedere, il tuo host virtuale Nginx fornisce lo stesso contenuto del precedente host nome-ip ma questa volta utilizzando una connessione sicura HTTP.

Passaggio 3: accedi a PhpMyAdmin tramite l'host virtuale

Se l'host virtuale è abilitato su Nginx, non abbiamo più accesso ai contenuti del percorso http://localhost (localhost solitamente fornisce contenuti utilizzando l'indirizzo IP di loopback o l'indirizzo IP di sistema se non è configurato diversamente) perché abbiamo abbiamo utilizzato l'IP del sistema Arch come nome_server quindi il percorso del nostro contenuto è cambiato.

14. Il metodo più semplice per accedere a PhpMyAdmin tramite web è creare un collegamento simbolico tra il percorso /usr/share/webapps/phpMyAdmin/ e il nostro nuovo percorso host virtuale definito (/srv/http).

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

15. Dopo aver eseguito il comando precedente, aggiorna la tua pagina e vedrai apparire una nuova cartella phpMyAdmin, se l'istruzione autoindex è abilitata su Nginx Virtual Host o indirizza il tuo URL direttamente a Cartella PhpMyAdmin https://arch_IP/phpMyAdmin.

16. Se desideri disinfettare la stringa phpMyAdmin sul browser, modifica i file Host virtuali e aggiungi il seguente contenuto nel blocco del server.

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

Passaggio 4: abilitare la directory protetta da password su Nginx

A differenza di Apache, Nginx utilizza il modulo HttpAuthBasic per abilitare Directory protette da password ma non fornisce alcuno strumento per creare un file .htpasswd crittografato.

17. Per ottenere la protezione tramite password della directory con Nginx su Arch Linux, installa il server web Apache e utilizza i suoi strumenti per generare un file .htaccess crittografato.

sudo pacman -S apache

18. Dopo aver installato Apache, crea una nuova directory in /etc/nginx/ denominata intuitivamente passwd dove verrà archiviato il file .htpasswd e utilizza Il comando htpasswd con –c attiva il primo utente aggiunto per generare il file, quindi se vuoi aggiungere più utenti usa htpasswd senza – c interruttore.

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. Per proteggere nome-ip-ssl radice dell'host virtuale /srv/http/ percorso servito con tutte le sue sottocartelle e file sottostanti aggiunge le seguenti istruzioni all'interno del blocco del server host virtuale sotto la direttiva root e lo indirizza al percorso assoluto del file .htpasswd.

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

20. Dopo aver riavviato il servizio Nginx, aggiorna la pagina e dovrebbe apparire un popup Autenticazione richiesta che richiede le tue credenziali.

Ora hai abilitato con successo Nginx Directory protette da password ma tieni presente che nello stesso momento in cui il server web Apache è installato nel tuo sistema, quindi assicurati che rimanga disabilitato e in ogni caso non avviarlo perché può portare a porte in conflitto con Nginx.

Passaggio 5: reindirizzare HTTP a HTTPS su Nginx

21. Se desideri che i browser reindirizzino automaticamente tutte le richieste HTTP non sicure al protocollo HTTPS, apri e modifica il tuo host virtuale non SSL e aggiungi le seguenti istruzioni in nome_server.

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

Tutte le impostazioni presentate in questo articolo sono state effettuate su un sistema Arch Linux che funge da server, ma la maggior parte di esse, in particolare quelle riguardanti i file di configurazione Nginx, sono disponibili sulla maggior parte dei sistemi Linux con lievi differenze.