Creeu amfitrions virtuals, directoris de protecció amb contrasenya i certificats SSL mitjançant Nginx Web Server a Arch Linux


L'article anterior LEMP d'Arch Linux només cobria coses bàsiques, des d'instal·lar serveis de xarxa (Nginx, base de dades MySQL i PhpMyAdmin) i configurar la seguretat mínima necessària per al servidor MySQL i PhpMyadmin.

Aquest tema està estrictament relacionat amb la instal·lació anterior de LEMP a Arch Linux i us guiarà a través de la configuració de configuracions més complexes per a la pila LEMP, especialment les configuracions del servidor web Nginx, com ara la creació d'Amfitrions virtuals , utilitzeu Directoris protegits amb contrasenya, creeu i configureu Capa de connectors segurs HTTP, redireccions HTTP no segures a HTTPS i també us presentarà alguns scripts Bash útils que facilitarà la feina d'activar els amfitrions virtuals i generarà Certificat SSL i claus.

Instal·leu LEMP amb la base de dades MariaDB a Arch Linux

Pas 1: habiliteu els amfitrions virtuals a Nginx

Un dels mètodes més senzills per habilitar Amfitrions virtuals és utilitzar les declaracions d'inclou al fitxer de configuració principal de Nginx, cosa que fa que la feina de les configuracions addicionals sigui més senzilla i eficient perquè podeu crear fitxers senzills. per a cada amfitrió nou i mantenir el fitxer de configuració principal més net.

Aquest enfocament funciona de la mateixa manera que al Servidor web Apache, el primer que heu de fer és especificar la nova ruta de l'URI on Nginx hauria de llegir les directives del fitxer.

1. Per tant, obriu el fitxer principal nginx.conf situat a la ruta del sistema /etc/nginx/ i a la part inferior, abans de l'últim claudàtor “}” afegiu el camí on residiran els futurs fitxers de configuració de l'amfitrió virtual.

$ sudo nano /etc/nginx/nginx.conf

A la part inferior, afegiu la següent declaració.

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

Aquesta directiva indica a Nginx que ha de llegir tots els fitxers que es troben a /etc/nginx/sites-enabled/ que acaben amb una extensió .conf.

2. El següent pas és crear un directori llocs habilitats i un altre, anomenat llocs disponibles, on emmagatzemeu tots els fitxers de configuració dels vostres hosts virtuals.

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

3. Ara és el moment de crear un nou host virtual. Aquest exemple utilitzarà l'adreça IP del sistema com a nom d'amfitrió virtual, així que creeu un fitxer nou anomenat name-ip.conf.

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

Afegeix el següent contingut.

## 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 directiva que activa Virtual Host és la instrucció server_name sota el port d'escolta. A més, una altra directiva important aquí és la declaració arrel que indica que Nginx Virtual Host serveixi el contingut del fitxer des de la ruta del sistema /srv/http/.

4. L'últim pas és crear el directori /srv/http/ i fer que la configuració del fitxer name-ip.conf estigui disponible per a la lectura de Nginx (utilitzant un enllaç simbòlic), després reinicieu el dimoni. per fer visibles noves configuracions.

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

5. Per verificar-ho, apunteu el vostre navegador a l'adreça IP del sistema Arch i haureu de veure que el contingut web és diferent de http://localhost. Aquí he afegit un petit script php que també verifica les configuracions de FastCGI PHP com a la captura de pantalla següent.

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

<?php
phpinfo();
?>

6. Un altre mètode que he desenvolupat jo mateix per habilitar o desactivar els hosts virtuals a Nginx és un mètode més elegant i està inspirat en l'script d'Apache a2eniste.

Per utilitzar aquest mètode, obriu un editor de fitxers i creeu un fitxer nou, anomenat n2ensite, a la vostra ruta $HOME amb el contingut següent, feu-lo executable, executeu-lo amb privilegis de root i passa com a opció al teu nou nom d'amfitrió virtual sense que acabi .conf (ompliu-lo lliurement per modificar-lo segons les vostres necessitats).

$ 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

Feu-lo executable i executeu-lo com es mostra.

$ sudo chmod +x n2ensite
$ sudo ./n2ensite your_virtual_host

7. Per desactivar els hosts virtuals, creeu un nou fitxer n2dissite amb el contingut següent i apliqueu la mateixa configuració que l'anterior.

$ 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. Ara podeu utilitzar aquests dos scripts per habilitar o desactivar qualsevol host virtual, però si voleu aplicar-lo com a ordres del sistema, només heu de copiar els dos scripts a /usr/local/bin/ i després podeu utilitzar-lo sense especificar el camí.

$ sudo cp n2ensite n2dissite /usr/local/bin/

Pas 2: habiliteu SSL amb hosts virtuals a Nginx

SSL (Secure Sockets Layer) és un protocol dissenyat per xifrar connexions HTTP a través de xarxes o Internet, que fan que el flux de dades es transmeti a través d'un canal segur mitjançant claus de criptografia simètriques/asimètriques. i es proporciona al paquet Arch Linux per OpenSSL.

$ sudo pacman -S openssl

9. Per habilitar connexions HTTPS amb Nginx, el primer que heu de fer és generar claus d'hostes virtuals. A més, per simplificar les coses, he desenvolupat un petit script que genera automàticament claus criptogràfiques al camí del directori /etc/nginx/ssl, utilitzant la denominació de l'amfitrió virtual com a noms de clau.

Creeu un fitxer anomenat nginx_gen_ssl i afegiu el contingut següent.

$ 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. Un cop creat l'script, afegiu els permisos d'execució, executeu-lo i proporcioneu les vostres opcions de certificat, la més important és el camp Nom comú (afegiu aquí el nom de domini oficial) i deixeu en blanc els camps Contrasenya i Empresa opcional. .

$ sudo chmod +x nginx_gen_ssl
$ sudo ./nginx_gen_ssl

Al final de la tasca de generació de claus, es mostrarà una llista amb totes les claus disponibles al directori Nginx ssl.

A més, si voleu que aquest script s'utilitzi com a ordre del sistema, copieu-lo o moveu-lo a /usr/local/bin/.

$ sudo mv nginx_gen_ssl  /usr/local/bin

11. Després d'haver generat les claus necessàries per a Nginx SSL Virtual Host, és hora de crear realment el fitxer de configuració de SSL Virtual Host. Utilitzeu la mateixa adreça IP del sistema per a l'amfitrió virtual que l'anterior a la directiva server_name, però, canvieu lleugerament el nom del fitxer de l'amfitrió virtual afegint ssl abans de .conf, per recordar-vos que aquest fitxer significa name-ip SSL Virtual Host.

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

En aquest fitxer, canvieu escolteu la declaració del port a 443 ssl i proporcioneu els camins dels fitxers de claus SSL i de certificat amb els creats anteriorment perquè es vegin com a l'extracte següent.

## 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. Després de crear el fitxer, utilitzeu l'script n2ensite o la línia d'ordres ln per activar-lo (crea un enllaç simbòlic al fitxer al directori sites-enabled). ), després reinicieu el dimoni Nginx per aplicar la configuració.

$ 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. De nou, apunta el teu navegador a Arch IP URL però aquesta vegada utilitzant el protocol HTTPS - https://192.168.1.33 al meu sistema- i una Connexió no fiable< Hauria d'aparèixer error de seguretat ( Afegeix i confirma l'excepció de seguretat per anar més enllà a la pàgina).

Com ara podeu veure, el vostre Nginx Virtual Host ofereix el mateix contingut que l'amfitrió name-ip anterior, però aquesta vegada utilitzant una connexió segura HTTP.

Pas 3: accediu a PhpMyAdmin mitjançant l'amfitrió virtual

Si l'amfitrió virtual està habilitat a Nginx, ja no tenim accés al contingut de la ruta http://localhost (el localhost normalment serveix el contingut mitjançant l'adreça IP de bucle o l'adreça IP del sistema si no està configurada d'una altra manera) perquè tenim ha utilitzat la IP del sistema Arch com a nom_servidor, de manera que la nostra ruta de contingut ha canviat.

14. El mètode més senzill per accedir a PhpMyAdmin a través del web és crear un enllaç simbòlic entre el camí /usr/share/webapps/phpMyAdmin/ i el nostre nou camí d'amfitrió virtual definit. (/srv/http).

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

15. Després d'executar l'ordre anterior, actualitzeu la vostra pàgina i veureu que apareix una nova carpeta phpMyAdmin, si la declaració autoindex està habilitada a Nginx Virtual Host o apunta el vostre URL directament a la carpeta PhpMyAdmin https: //arch_IP/phpMyAdmin.

16. Si voleu desinfectar la cadena phpMyAdmin al navegador, editeu els vostres fitxers d'hostes virtuals i afegiu el contingut següent sota el bloc del servidor.

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

Pas 4: habiliteu el directori protegit amb contrasenya a Nginx

A diferència d'Apache, Nginx utilitza el mòdul HttpAuthBasic per habilitar Directoris protegits amb contrasenya, però no proporciona cap eina per crear un fitxer .htpasswd xifrat.

17. Per aconseguir la protecció de contrasenya del directori amb Nginx a Arch Linux, instal·leu el servidor web Apache i utilitzeu les seves eines per generar un fitxer .htaccess xifrat.

$ sudo pacman -S apache

18. Després d'haver instal·lat Apache, creeu un directori nou a /etc/nginx/ anomenat intuïtivament passwd on s'emmagatzemarà el fitxer .htpasswd i utilitzeu htpasswd ordre amb –c activa el primer usuari afegit per generar el fitxer, aleshores, si voleu afegir més usuaris, feu servir htpasswd sense l'interruptor –c .

$ 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 tal de protegir name-ip-ssl la ruta arrel de l'amfitrió virtual /srv/http/ amb totes les seves subcarpetes i fitxers a sota, afegiu les instruccions següents dins del vostre Bloqueu el servidor de l'amfitrió virtual sota la directiva root i apunteu-lo a la ruta absoluta del fitxer .htpasswd.

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

20. Després de reiniciar el servei Nginx, actualitzeu la pàgina i apareixerà una finestra emergent Autenticació necessària que exigeixi les vostres credencials.

Ara heu activat correctament els Directoris protegits amb contrasenya de Nginx, però tingueu en compte que al mateix temps que el servidor web Apache s'instal·la al vostre sistema, assegureu-vos que romangui desactivat i, de cap manera, no l'inicieu perquè pot provocar ports en conflicte amb Nginx.

Pas 5: redirigeix HTTP a HTTPS a Nginx

21. Si us agrada que els navegadors redirigin automàticament totes les sol·licituds HTTP insegures al protocol HTTPS, obriu i editeu, sou no-ssl l'amfitrió virtual i afegiu les instruccions següents a la directiva server_name .

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

Tots els paràmetres que es presenten en aquest article s'han fet sota un sistema Arch Linux que actua com a servidor, però la majoria d'ells, especialment els relatius als fitxers de configuració Nginx, estan disponibles a la majoria de sistemes Linux amb lleugeres diferències.