Búsqueda de sitios web

Cree hosts virtuales, directorios protegidos con contraseña y certificados SSL utilizando el "servidor web Nginx" en Arch Linux


El artículo anterior de Arch Linux 'LEMP' solo cubrió aspectos básicos, 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 de la configuración de configuraciones más complejas para la pila LEMP, especialmente configuraciones del servidor web Nginx, como la creación de hosts virtuales. , utilice Directorios protegidos con contraseña, cree y configure la Capa de sockets seguros HTTP, redirecciones HTTP inseguras a HTTPS y también le presentará algunos scripts Bash útiles que facilitará el trabajo de activación de hosts virtuales y generará certificados y claves SSL.

Requisitos

Instale 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 limpio el archivo de configuración principal.

Este enfoque funciona de la misma manera que en el servidor web Apache, lo primero que debe hacer es especificar la nueva ruta URI donde Nginx debe leer las directivas de archivos.

1. Entonces, abra el archivo principal nginx.conf ubicado en la ruta del sistema /etc/nginx/ y en la parte inferior, antes de la última llave “ }” agregue la ruta donde residirán los futuros archivos de configuración del host virtual.

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 sites-enabled y otro, llamado sites-available, donde almacenará toda la configuración de sus Hosts virtuales. archivos.

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, así que cree 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 el host virtual es la declaración server_name en el puerto de escucha. Además, otra directiva importante aquí es la declaración root que indica al Nginx Virtual Host que proporcione 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 enlace simbólico), luego reinicie el demonio para hacer visibles las 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 siguiente.

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 más elegante y está inspirado en el script Apache a2eniste.

Para utilizar este método, abra un editor de archivos y cree un nuevo archivo, llamado n2ensite, en su ruta $HOME con el siguiente contenido, hágalo ejecutable, ejecútelo con privilegios de root. y pase como opción a su nuevo nombre de Host Virtual sin el final .conf (complételo libremente 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

Hazlo ejecutable y ejecútalo 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 puedes usarlo sin especificar la ruta.

sudo cp n2ensite n2dissite /usr/local/bin/

Paso 2: habilite SSL con hosts virtuales en Nginx

SSL (Secure Sockets Layer) es un protocolo diseñado para cifrar conexiones HTTP a través de redes o Internet, que hacen que los datos fluyan 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, utilizando nombres de host virtual como nombres de clave.

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 creado el script, agregue permisos de ejecución, ejecútelo y proporcione las 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 Empresa 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 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 el host virtual SSL de Nginx, es hora de crear el archivo de configuración del host virtual SSL. Utilice la misma dirección IP del sistema para el Host virtual que se indica arriba en la directiva server_name, 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 declaración del puerto listen a 443 ssl y proporcione las rutas de los archivos de claves de certificado y SSL con las creadas 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. Después de crear el archivo, utilice el script n2ensite o la línea de comando ln para activarlo (crea un enlace simbólico del archivo en sitios). -enabled), 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. Nuevamente apunte su navegador a la URL IP de Arch pero esta vez usando el protocolo HTTPS – https://192.168.1.33 en mi sistema- y Debería aparecer un error de seguridad Conexión no confiable ( Agregar y confirmar excepción de seguridad para ir más lejos en la página).

Como puede ver ahora, su host virtual Nginx ofrece el mismo contenido que el host name-ip anterior, 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 tenemos acceso al contenido de la ruta http://localhost (localhost generalmente sirve contenido usando la dirección IP de bucle invertido o la dirección IP del sistema si no está configurado de otra manera) porque tenemos Usé la IP del sistema Arch como server_name, por lo que nuestra ruta de contenido ha cambiado.

14. El método más sencillo 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 declaración autoindex está habilitada en Nginx Virtual Host o apunta su URL directamente a 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 de contraseña del directorio con Nginx en Arch Linux, instale el servidor web Apache y use sus herramientas para generar un archivo .htaccess cifrado.

sudo pacman -S apache

18. Después de haber instalado Apache, cree un nuevo directorio en /etc/nginx/ llamado intuitivamente passwd donde se almacenará y utilizará el archivo .htpasswd. El comando htpasswd con –c activa el primer usuario agregado para generar el archivo, luego, si desea agregar más usuarios, use htpasswd sin – c interruptor.

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 la ruta servida name-ip-ssl del host virtual /srv/http/ con todas sus subcarpetas y archivos debajo agrega las siguientes instrucciones dentro del bloque de su servidor Virtual Host bajo la directiva raíz y apunta 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 debería aparecer una ventana emergente Autenticación requerida solicitando 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 no seguras al protocolo HTTPS, abra y edite su host virtual no SSL y agregue las siguientes instrucciones en 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 servidor, pero la mayoría de ellas, especialmente aquellas relacionadas con los archivos de configuración de Nginx, están disponibles en la mayoría de los sistemas Linux con ligeras diferencias.