Cree hosts virtuales, directorios protegidos con contraseña y certificados SSL utilizando "Nginx Web Server" en Arch Linux


El artículo anterior "LEMP" de Arch Linux solo cubría cosas básicas, desde la instalación de servicios de red (Nginx, base de datos MySQL y PhpMyAdmin) y la configuración de seguridad mínima requerida para el servidor MySQL y PhpMyadmin.

Este tema está estrictamente relacionado con la instalación anterior de LEMP en Arch Linux y lo guiará a través del establecimiento de configuraciones más complejas para la pila LEMP, especialmente las configuraciones de servidor web Nginx , como la creación de Hosts virtuales , use Directorios protegidos con contraseña , cree y configure Capa de sockets seguros HTTP , redireccionamientos HTTP inseguros a HTTPS y también le presentará algunos scripts Bash útiles que facilitará el trabajo de activación de hosts virtuales y generará claves y certificados SSL .

Instalar LEMP con la base de datos MariaDB en Arch Linux

Paso 1: habilite los hosts virtuales en Nginx

Uno de los métodos más simples para habilitar Hosts virtuales es usar declaraciones include en el archivo de configuración principal de Nginx, lo que hace que el trabajo de configuraciones adicionales sea más simple y eficiente porque puede crear archivos simples para cada nuevo host y mantenga más limpio el archivo de configuración principal.

Este enfoque funciona de la misma manera que en Apache Web Server , lo primero que debe hacer es especificar la nueva ruta de URI donde Nginx debe leer las directivas de archivo.

1. Por lo tanto, abra el archivo principal nginx.conf ubicado en la ruta del sistema /etc/nginx/ y en la parte inferior, antes del último corchete “} ”Agregue la ruta donde residirán los futuros archivos de configuración de Virtual Host.

$ sudo nano /etc/nginx/nginx.conf

En la parte inferior, agregue la siguiente declaración.

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

Esta directiva le dice a Nginx que debe leer todos los archivos que se encuentran en /etc/nginx/sites-enabled/ que terminan con una extensión .conf .

2. El siguiente paso es crear el directorio sitios habilitados y otro, llamado sitios disponibles , donde almacena todos los archivos de configuración de sus hosts virtuales.

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

3. Ahora es el momento de crear un nuevo host virtual. Este ejemplo utilizará la dirección IP del sistema como Nombre de host virtual, por lo que debe crear un nuevo archivo llamado name-ip.conf .

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

Agregue el siguiente contenido.

## 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 es la instrucción server_name en el puerto de escucha. Además, otra directiva importante aquí es la declaración raíz que señala al host virtual de Nginx para que sirva el contenido del archivo desde la ruta del sistema /srv/http/.

4. El último paso es crear el directorio /srv/http/ y hacer que la configuración del archivo name-ip.conf esté disponible para la lectura de Nginx (usando el enlace simbólico), luego reiniciar el demonio para hacer visibles nuevas configuraciones.

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

5. Para verificarlo, apunte su navegador a la dirección IP del sistema Arch y debería ver que el contenido web es diferente de http:// localhost . Aquí agregué un pequeño script php que también verifica las configuraciones de FastCGI PHP como en la captura de pantalla a continuación.

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

<?php
phpinfo();
?>

6. Otro método que he desarrollado yo mismo para habilitar o deshabilitar hosts virtuales en Nginx es uno más elegante y está inspirado en el script Apache a2eniste .

Para usar este método, abra un editor de archivos y cree un nuevo archivo, llamado n2ensite , en su ruta $HOME con el contenido a continuación, hágalo ejecutable, ejecútelo con privilegios de root y pase como una opción a su nuevo nombre de Host Virtual sin el final .conf (llénelo gratis para modificarlo según sus necesidades).

$ 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

Hágalo ejecutable y ejecútelo como se muestra.

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

7. Para deshabilitar los hosts virtuales, cree un nuevo archivo n2dissite con el siguiente contenido y aplique la misma configuración que la 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. Ahora puede usar estos dos scripts para habilitar o deshabilitar cualquier host virtual, pero si desea aplicarlos como comandos para todo el sistema, simplemente copie ambos scripts en /usr/local/bin/ y luego puede utilícelo sin especificar la ruta.

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

Paso 2: habilite SSL con hosts virtuales en Nginx

SSL ( Capa de conexión segura ) es un protocolo diseñado para cifrar conexiones HTTP a través de redes o Internet, que hacen que el flujo de datos se transmita a través de un canal seguro utilizando claves de criptografía simétricas/asimétricas. y se proporciona en Arch Linux mediante el paquete OpenSSL.

$ sudo pacman -S openssl

9. Para habilitar las conexiones HTTPS con Nginx, lo primero que debe hacer es generar claves de hosts virtuales. Además, para simplificar las cosas, he desarrollado pequeños scripts que generan automáticamente claves criptográficas en la ruta del directorio /etc/nginx/ssl , usando nombres de host virtual como nombres de claves.

Cree un archivo llamado nginx_gen_ssl y agregue el siguiente contenido.

$ 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. Una vez que se haya creado el script, agregue los permisos de ejecución, ejecútelo y proporcione sus opciones de Certificado, siendo la más importante el campo Nombre común (agregue el nombre de dominio oficial aquí) y deje en blanco los campos Contraseña y Compañía opcional. .

$ sudo chmod +x nginx_gen_ssl
$ sudo ./nginx_gen_ssl

Al final de la tarea de generación de claves, se mostrará una lista con todas las claves disponibles en el directorio ssl de Nginx.

Además, si desea que este script se utilice como un comando del sistema, cópielo o muévalo a /usr/local/bin/.

$ sudo mv nginx_gen_ssl  /usr/local/bin

11. Después de haber generado las claves necesarias para Nginx SSL Virtual Host, es el momento de crear realmente el archivo de configuración de SSL Virtual Host. Utilice la misma dirección IP del sistema para el host virtual que la anterior en la directiva nombre_servidor , pero cambie ligeramente el nombre del archivo del host virtual agregando ssl antes de .conf , para recordarle que este archivo significa nombre-ip SSL Virtual Host.

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

En este archivo, cambie la instrucción de puerto listen a 443 ssl y proporcione las rutas de los archivos de claves de certificado y SSL con las que se crearon anteriormente para que se vean como en el siguiente extracto.

## 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. Una vez creado el archivo, utilice el script n2ensite o la línea de comando ln para activarlo (crea un enlace simbólico de archivo en el directorio habilitado para sitios ), luego reinicie el demonio Nginx para aplicar la configuración.

$ 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. Vuelva a apuntar su navegador a Arch IP URL pero esta vez usando el protocolo HTTPS - https://192.168.1.33 en mi sistema- y una Conexión no confiable debería aparecer un error de seguridad ( Agregar y confirmar la excepción de seguridad para ir más lejos en la página).

Como puede ver ahora, su Nginx Virtual Host ofrece el mismo contenido que el anterior host name-ip , pero esta vez utilizando una conexión segura HTTP.

Paso 3: Acceda a PhpMyAdmin a través del host virtual

Si Virtual Host está habilitado en Nginx, ya no tendremos acceso al contenido de la ruta http:// localhost (localhost generalmente sirve contenido usando la dirección IP de loopback o la dirección IP del sistema si no está configurado de otra manera) porque tenemos usó la IP del sistema Arch como nombre_servidor , por lo que nuestra ruta de contenido ha cambiado.

14. El método más simple para obtener acceso a PhpMyAdmin a través de la web es crear un enlace simbólico entre la ruta /usr/share/webapps/phpMyAdmin/ y nuestra nueva ruta de host virtual definida (/srv/http ).

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

15. Después de ejecutar el comando anterior, actualice su página y verá aparecer una nueva carpeta phpMyAdmin, si la instrucción autoindex está habilitada en Nginx Virtual Host o apunte su URL directamente a la carpeta PhpMyAdmin https:/arch_IP/phpMyAdmin .

16. Si desea desinfectar la cadena phpMyAdmin en el navegador, edite sus archivos de hosts virtuales y agregue el siguiente contenido en el bloque del servidor.

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

Paso 4: Habilite el directorio protegido con contraseña en Nginx

A diferencia de Apache, Nginx utiliza el módulo HttpAuthBasic para habilitar Directorios protegidos con contraseña , pero no proporciona ninguna herramienta para crear un archivo .htpasswd cifrado.

17. Para lograr la protección con contraseña de directorio con Nginx en Arch Linux, instale el servidor web Apache y use sus herramientas para generar un archivo .htaccess encriptado.

$ sudo pacman -S apache

18. Después de haber instalado Apache, cree un nuevo directorio en /etc/nginx/ llamado intuitivamente passwd donde se almacenará el archivo .htpasswd y use htpasswd comando con –c active el primer usuario agregado para generar el archivo, luego, si desea agregar más usuarios, use htpasswd sin el 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. Para proteger name-ip-ssl Virtual Host root /srv/http/ ruta servida con todas sus subcarpetas y archivos debajo, agregue las siguientes instrucciones Bloquear el servidor Host virtual bajo la directiva root y apuntarlo a la ruta absoluta del archivo .htpasswd .

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

20. Después de reiniciar el servicio Nginx, actualice la página y una ventana emergente Se requiere autenticación debería aparecer exigiendo sus credenciales.

Ahora ha habilitado con éxito los Directorios protegidos con contraseña de Nginx, pero tenga en cuenta que al mismo tiempo que el servidor web Apache está instalado en su sistema, asegúrese de que permanezca deshabilitado y de ninguna manera lo inicie porque puede provocar puertos en conflicto con Nginx.

Paso 5: Redirigir HTTP a HTTPS en Nginx

21. Si desea que los navegadores redirijan automáticamente todas las solicitudes HTTP inseguras al protocolo HTTPS, abra y edite su host virtual no ssl y agregue la siguiente instrucción en la directiva nombre_servidor .

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

Todas las configuraciones presentadas en este artículo se realizaron bajo un sistema Arch Linux que actúa como un servidor, pero la mayoría de ellas, especialmente las relacionadas con los archivos de configuración de Nginx, están disponibles en la mayoría de los sistemas Linux con ligeras diferencias.