Recherche de site Web

Créez des hôtes virtuels, des répertoires protégés par mot de passe et des certificats SSL à l'aide de "Nginx Web Server" dans Arch Linux


L'article précédent d'Arch Linux « LEMP » couvrait uniquement les éléments de base, depuis l'installation des services réseau (Nginx, base de données MySQL et PhpMyAdmin) et la configuration de la sécurité minimale requise pour le serveur MySQL et PhpMyadmin.

Ce sujet est strictement lié à l'ancienne installation de LEMP sur Arch Linux et vous guidera dans la définition de configurations plus complexes pour la pile LEMP, en particulier les configurations de serveur Web Nginx, comme la création d'hôtes virtuels. , utilisez les Répertoires protégés par mot de passe, créez et configurez le HTTP Secure Sockets Layer, les redirections HTTP non sécurisées vers HTTPS et vous présenterez également quelques scripts Bash utiles qui facilitera le travail d'activation des hôtes virtuels et générera un certificat et des clés SSL.

Exigences

Installer LEMP avec la base de données MariaDB dans Arch Linux

Étape 1 : Activer les hôtes virtuels sur Nginx

L'une des méthodes les plus simples pour activer les hôtes virtuels consiste à utiliser les instructions include sur le fichier de configuration principal de Nginx, ce qui rend le travail de configuration ultérieure plus simple et plus efficace car vous pouvez créer des fichiers simples. pour chaque nouvel hôte et gardez le fichier de configuration principal plus propre.

Cette approche fonctionne de la même manière que sur Apache Web Server, la première chose que vous devez faire est de spécifier le nouveau chemin URI où Nginx doit lire les directives de fichier.

1. Alors, ouvrez le fichier principal nginx.conf situé sur le chemin système /etc/nginx/ et en bas, avant la dernière accolade " }" ajoutez le chemin où résideront les futurs fichiers de configuration de l'hôte virtuel.

sudo nano /etc/nginx/nginx.conf

En bas, ajoutez la déclaration suivante.

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

Cette directive indique à Nginx qu'il doit lire tous les fichiers trouvés dans /etc/nginx/sites-enabled/ qui se terminent par une extension .conf.

2. L'étape suivante consiste à créer un répertoire sites-enabled et un autre, appelé sites-available, dans lesquels vous stockez toute la configuration de vos hôtes virtuels. des dossiers.

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

3. Il est maintenant temps de créer un nouvel hôte virtuel. Cet exemple utilisera l'adresse IP du système comme nom d'hôte virtuel, créez donc un nouveau fichier nommé name-ip.conf.

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

Ajoutez le contenu suivant.

## 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 directive qui active l'hôte virtuel est l'instruction server_name sous le port d'écoute. En outre, une autre directive importante ici est l'instruction root qui indique à l'hôte virtuel Nginx de servir le contenu du fichier à partir du chemin système /srv/http/.

4. La dernière étape consiste à créer le répertoire /srv/http/ et à rendre la configuration du fichier name-ip.conf disponible pour la lecture de Nginx (en utilisant lien symbolique), puis redémarrez le démon pour rendre visibles les nouvelles configurations.

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

5. Pour le vérifier, pointez votre navigateur sur l'adresse IP du système Arch et vous devriez voir que le contenu Web est différent de http://localhost. Ici, j'ai ajouté un petit script php qui vérifie également les configurations FastCGI PHP comme dans la capture d'écran ci-dessous.

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

<?php
phpinfo();
?>

6. Une autre méthode que j'ai moi-même développée pour activer ou désactiver les hôtes virtuels sur Nginx est plus élégante et inspirée du script Apache a2eniste.

Pour utiliser cette méthode, ouvrez un éditeur de fichiers et créez un nouveau fichier, appelé n2ensite, sur votre chemin $HOME avec le contenu ci-dessous, rendez-le exécutable, exécutez-le avec les privilèges root et passez en option votre nouveau nom d'hôte virtuel sans la fin .conf (à remplir gratuitement pour le modifier selon vos besoins).

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

Rendez-le exécutable et exécutez-le comme show.

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. Pour désactiver les hôtes virtuels, créez un nouveau fichier n2dissite avec le contenu suivant et appliquez les mêmes paramètres que ci-dessus.

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. Vous pouvez maintenant utiliser ces deux scripts pour activer ou désactiver n'importe quel hôte virtuel, mais si vous souhaitez l'appliquer en tant que commandes à l'échelle du système, copiez simplement les deux scripts dans /usr/local/bin/ et vous pouvez ensuite l'utiliser sans spécifier de chemin.

sudo cp n2ensite n2dissite /usr/local/bin/

Étape 2 : Activer SSL avec des hôtes virtuels sur Nginx

SSL (Secure Sockets Layer) est un protocole conçu pour crypter les connexions HTTP sur les réseaux ou Internet, qui permettent la transmission des flux de données sur un canal sécurisé à l'aide de clés de cryptographie symétriques/asymétriques. et est fourni dans Arch Linux par le package OpenSSL.

sudo pacman -S openssl

9. Pour activer les connexions HTTPS avec Nginx, la première chose à faire est de générer des clés d'hôtes virtuels. De plus, pour simplifier les choses, j'ai développé un petit script qui génère automatiquement des clés cryptographiques sur le chemin du répertoire /etc/nginx/ssl, en utilisant le nom de l'hôte virtuel comme nom de clé.

Créez un fichier nommé nginx_gen_ssl et ajoutez le contenu suivant.

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. Une fois le script créé, ajoutez les autorisations d'exécution, exécutez-le et fournissez vos options de certificat, la plus importante étant le champ Nom commun (ajoutez le nom de domaine officiel ici) et laissez les champs Mot de passe et Entreprise facultative vides.

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

À la fin de la tâche de génération de clés, une liste de toutes les clés disponibles dans le répertoire SSL Nginx sera affichée.

De plus, si vous souhaitez que ce script soit utilisé comme commande système, copiez-le ou déplacez-le vers /usr/local/bin/.

sudo mv nginx_gen_ssl  /usr/local/bin

11. Après avoir généré les clés nécessaires à l'hôte virtuel SSL Nginx, il est temps de créer le fichier de configuration de l'hôte virtuel SSL. Utilisez la même adresse IP système pour l'hôte virtuel que ci-dessus sur la directive server_name mais modifiez légèrement le nom du fichier de l'hôte virtuel en ajoutant ssl avant .conf, pour vous rappeler que ce fichier signifie nom-ip SSL Virtual Host.

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

Sur ce fichier, remplacez l'instruction de port listen par 443 ssl et fournissez les chemins des fichiers de clé SSL et de certificat avec ceux créés précédemment pour ressembler à l'extrait ci-dessous.

## 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. Une fois le fichier créé, utilisez le script n2ensite ou la ligne de commande ln pour l'activer (crée un lien symbolique de fichier dans sites -enabled), puis redémarrez le démon Nginx pour appliquer les paramètres.

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. Pointez à nouveau votre navigateur sur Arch IP URL mais cette fois en utilisant le protocole HTTPS – https://192.168.1.33 sur mon système - et une erreur de sécurité Connexion non fiable devrait apparaître ( Ajouter et confirmer une exception de sécurité pour aller plus loin sur la page).

Comme vous pouvez maintenant le voir, votre hôte virtuel Nginx sert le même contenu que l'hôte name-ip précédent, mais cette fois en utilisant une connexion sécurisée HTTP.

Étape 3 : Accédez à PhpMyAdmin via l'hôte virtuel

Si l'hôte virtuel est activé sur Nginx, nous n'avons plus accès au contenu du chemin http://localhost ( localhost sert généralement le contenu en utilisant l'adresse IP de bouclage ou l'adresse IP du système si elle n'est pas configurée autrement) car nous avons utilisé l'adresse IP du système Arch comme nom_serveur, notre chemin de contenu a donc changé.

14. La méthode la plus simple pour accéder à PhpMyAdmin via le Web consiste à créer un lien symbolique entre le chemin /usr/share/webapps/phpMyAdmin/ et notre nouveau chemin d'hôte virtuel défini (/srv/http).

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

15. Après avoir exécuté la commande ci-dessus, actualisez votre page et vous verrez un nouveau dossier phpMyAdmin apparaître, si l'instruction autoindex est activée sur l'hôte virtuel Nginx ou pointez votre URL directement vers Dossier PhpMyAdmin https://arch_IP/phpMyAdmin.

16. Si vous souhaitez nettoyer la chaîne phpMyAdmin sur le navigateur, modifiez vos fichiers d'hôtes virtuels et ajoutez le contenu suivant sous le bloc de serveur.

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

Étape 4 : Activer le répertoire protégé par mot de passe sur Nginx

Contrairement à Apache, Nginx utilise le module HttpAuthBasic pour activer les répertoires protégés par mot de passe mais ne fournit aucun outil pour créer un fichier .htpasswd chiffré.

17. Pour protéger le répertoire par mot de passe avec Nginx sur Arch Linux, installez le serveur Web Apache et utilisez ses outils pour générer un fichier .htaccess crypté.

sudo pacman -S apache

18. Après avoir installé Apache, créez un nouveau répertoire sous /etc/nginx/ nommé intuitivement passwd où le fichier .htpasswd sera stocké et utilisé Commande htpasswd avec –c activez le premier utilisateur ajouté pour générer le fichier, puis si vous souhaitez ajouter plus d'utilisateurs, utilisez htpasswd sans – c commutateur.

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. Afin de protéger name-ip-ssl la racine de l'hôte virtuel /srv/http/ le chemin servi avec tous ses sous-dossiers et fichiers en dessous il ajoute les instructions suivantes dans le bloc de votre serveur hôte virtuel sous la directive racine et le pointe vers le chemin absolu du fichier .htpasswd.

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

20. Après avoir redémarré le service Nginx, actualisez la page et une fenêtre contextuelle Authentification requise devrait apparaître pour demander vos informations d'identification.

Vous avez maintenant activé avec succès les répertoires protégés par mot de passe de Nginx, mais sachez qu'en même temps le serveur Web Apache est installé sur votre système, alors assurez-vous qu'il reste désactivé et ne le démarrez en aucun cas car cela pourrait entraîner ports en conflit avec Nginx.

Étape 5 : Rediriger HTTP vers HTTPS sur Nginx

21. Si vous souhaitez que les navigateurs redirigent automatiquement toutes les requêtes HTTP non sécurisées vers le protocole HTTPS, ouvrez et modifiez que vous êtes un hôte virtuel non SSL et ajoutez les instructions suivantes sous directive nom_serveur.

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

Tous les paramètres présentés dans cet article ont été effectués sous un système Arch Linux faisant office de serveur, mais la plupart d'entre eux, notamment ceux concernant les fichiers de configuration Nginx, sont disponibles sur la plupart des systèmes Linux avec de légères différences.