Raspberry Pi Home Server – Restreindre les accès à vos sites en utilisant Nginx

Lors des tutoriels de ce site, j’utilise exclusivement Nginx. Je le trouve performant, léger et simple de configuration. Pourtant un point que j’aborde jamais c’est la sécurisation des sites. Nous allons essayer d’y remédier aujourd’hui !

computer_laptop_keyboard_padlock

Quand Madame a des soucis avec son hébergeur, des indisponibilités qui reviennent de plus en plus souvent, elle m’a demandé si on pouvait faire quelque chose. J’ai donc pensé à prendre un nouveau joujou pour y installer WordPress. J’ai commandé mon nouveau Raspberry Pi en vente chez Radio Spares et suis prêt à me lancer dans l’auto hébergement 🙂

Seulement voilà, lorsque l’on va mettre en place son site ou l’interface web de son outil préféré, souvent une fois fait on est content du résultat et on s’arrête là. Il y a pourtant une étape importante à ne pas négliger c’est la sécurisation du site et le contrôle des accès.

Certains outils comme par exemple Raspcontrol par exemple intègre une gestion des utilisateurs. Mais d’autres (transmission, rTorrent, etc.) sont accessibles directement. Avec Nginx vous pouvez utiliser deux méthodes pour restreindre ces accès.

Tout d’abord, vous pouvez suivre ce tutoriel pour installer Nginx avec le support PHP. Ensuite nous allons créer 3 pages pour notre démonstration. Tout se fait dans /var/www :

  1. Créer le fichier /etc/nginx/sites-enabled/tutoriel avec le contenu suivant :
    server {
    
       # On travaille sur quel port
    
       listen 80;
    
       # Nom du serveur vu par Nginw
    
       server_name tutoriel;
    
       # Racine ou se trouve les fichiers
    
       root /var/www;
    
       # Interdir tous les acces fichiers. C'est la ou nous allons stocker les logins/passwd
    
       location ~ /.ht {
    
          deny  all;
    
       }
    
       # Que va-t-on afficher si on genere un refus d'acces (erreur HTTP 403)
    
       error_page 403 /refus.html;
    
       # Que va-t-on faire a la base du serveur (fichiers dans /var/www)
    
       location / {
    
          # Par defaut on affiche index.html
    
          index index.html;
    
       }
    
       # Que va-t-on faire dans le repertoire part1
    
       location /part1/ {
    
          # Par defaut on affiche index.html
    
          index index.html;
    
          # Acces refuse a l'IP 192.168.1.10
    
          deny 192.168.1.1O;
    
          # Toutes les IP du reseau 192.168.1.0 sont autorisees. Sauf la 192.168.1.10 grace a la regle precedente.
    
          allow 192.168.1.0/24;
    
          # Toutes les autres IP sont refusees
    
          deny all;
    
       }
    
       # Que va-t-on faire dans le repertoire part2
    
       location /part2/ {
    
          # Par defaut on affiche index.html
    
          index index.html;
    
          # Message a afficher lorsque l'on demande le login et le mot de passe
    
          auth_basic "Merci de vous identifier";
    
          # Ou se trouve vos identifiants. Le chemin doit est complet et non relatif
    
          auth_basic_user_file  /$document_root/part2/vos_users;
    
       }
    
    }
  2. Relancer Nginx
    service nginx restart
  3. Créer le fichier /var/www/index.html avec le contenu suivant :
    <html>
    
    <body>
    
    Ceci est la page /index.html
    
    </body>
    
    </html>
  4. Créer le fichier /var/www/refus.html avec le contenu suivant :
    <html>
    
    <body>
    
    Accès refusé
    
    </body>
    
    </html>
  5. Créer le répertoire /var/www/part1/ et y créer le fichier index.html avec le contenu suivant
    <html>
    
    <body>
    
    Ceci est la page /part1/index.html
    
    </body>
    
    </html>
  6. Créer le répertoire /var/www/part2/ et y créer le fichier index.html avec le contenu suivant
    <html>
    
    <body>
    
    Ceci est la page /part2/index.html
    
    </body>
    
    </html>
  7. Vous avez maintenant de quoi faire les premiers tests

Restreindre les accès de certaines IP

Nginx permet dans sa configuration de filtrer les IP qui vont se connecter à la machine. Les instructions pour gérer les règles d’accès sont :

  • allow : autorise l’IP/réseau qui suivent à se connecter au serveur
  • deny : refuse l’IP/réseau qui suivent à se connecter au serveur

Les valeurs prises par ces deux paramètres peuvent être une IP v4, une IP v6, un masque de réseau ou la valeur all qui ouvre/ferme à tous.

Dans notre exemple, l’IP 192.168.1.10 ne pourra pas se connecter à la partie /part1/ et sera redirigée vers la page refus.html (grâce à l’instruction error_page). Ensuite on autorise tout le réseau 192.168.1.x et enfin on interdit tout le reste.

Dès que votre IP matche une règle, le contrôle s’applique sans tenir compte des règles suivantes. C’est ce qui permet d’exclure l’IP 192.168.1.10 du réseau 192.168.1.0 qui lui est ouvert.

Le deny all permet de fermer la porte à tout ce qui n’a pas été ouvert dans les règles précédentes. Pas une mauvaise idée si on ne souhaite pas faire un site public.

Restreindre les accès avec un login et mot de passe

Si la gestion des IP n’est pas ce qu’il vous faut, une autre solution est le classique login avec mot de passe. Ici Nginx peut le faire pour vous. Pas besoin de passer par du PHP.

Pour cela vous utilisez les instructions comme dans notre exemple dans le bloc qui vous intéresse :

      auth_basic "Merci de vous identifier";

      auth_basic_user_file  /part2/vos_users;

Ces instructions vont afficher un message à l’utilisateur qui cherche à accéder au répertoire part2.

Capture_d_écran_29_05_13_21_48

Le contrôle des accès va se faire en validant les données saisies avec le contenu du fichier dans le paramètre auth_basic_user_file, dans notre exemple le fichier /part2/vos_users. Il faut savoir que ce fichier ne doit pas être obligatoirement dans le répertoire protégé mais il doit être accessible par le user www-data qui est celui utilisé par le serveur Nginx. Vous pouvez par exemple le sécuriser avec :

chmod 640 /var/www/part2/vos_users
chown root:www-data /var/www/part2/vos_users

Le contenu de ce fichier est une liste de users pouvant se connecter avec le mot de passe associé. Le format est :

user:password

Le mot de passe doit être encodé avec la fonction crypt. Pour ajouter une entrée, rien de plus facile ! Vous pouvez lancer la commande suivante pour ajouter le user pihome avec le mot de passe raspi :

printf "pihome:$(openssl passwd -crypt raspi)\n" >> /var/www/part2/vos_users

Capture_d_écran_29_05_13_22_22

Vous pouvez retrouver des infos sur ce sujet sur cette page.

Et la gestion du PHP ?

Pour ce qui est du PHP, il suffit de mettre le bloc qui fait le lien vers php-fpm à l’intérieur de celui qui gère votre répertoire protégé. Si vous le mettez en dehors, un accès direct à une page PHP pourra s’exécuter.

Voilà pour la protection de vos serveurs, à vous l’ouverture sur le monde, l’accès avec votre téléphone sans être trop inquiet 🙂

Vous aimez cet article ? Supportez-moi sur Patreon!

Vous aimerez aussi...