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 aimerez aussi...

  • vins987

    Bonsoir,

    Peux-tu donner l’exemple de rutorrent SVP. J’ai regarde, avec les test NICKEL!!! Mais je pense que rutorrent est avec PHP (je pense).

    Merci d’avance!!

    Tes divers tuto m’ont bcp aider dans mon installation et mes tests!!!

  • Tef

    Bonjour,

    j’essaie de mettre en place l’authentification par login/mot de passe pour FreshRSS, mais il refuse mon login et/ou mon mot de passe.
    Je n’ai pas d’erreur nginx et la fenêtre de connexion s’affiche normalement. j’ai aussi tenté avec différent mots de passe avec et sans chiffrement. Aucun résultat.
    Voici mon fichier de conf:

    server {

    listen 8080;

    server_name FreshRSS;

    root /var/www/FreshRSS/public;

    index index.php index.html index.htm;

    auth_basic « Merci de vous identifier »;

    auth_basic_user_file /var/www/authentif;

    location ~ .php$ {

    fastcgi_pass unix:/var/run/php5-fpm.sock;

    fastcgi_index index.php;

    include fastcgi_params;

    }

    }

    Si quelqu’un sait ce qui se passe…

  • Tef

    Voilà ce que j’ai trouvé en épluchant les logs:

    2013/06/23 10:41:36 [error] 20600#0: *7 no user/password was provided for basic authentication, client: 192.168.1.78, server: freshrss, request: « GET / HTTP/1.1 », host: « raspitef.no-ip.org:8080 »

    Donc apparemment il ne trouve pas mon fichier contenant les login/mot de passe?

    • C’est possible qu’effectievement le fichier ne soit pas accessible par le serveuret qu’il génère ce message

      • Tef

        J’ai trouvé d’où venait l’erreur!

        Après des heures de recherche dans la doc de Nginx, c’est finalement du côté de l’encodage du mot de passe qu’il fallait chercher…
        Pour reprendre ton exemple, j’ai du rajouter un antislash après la parenthèse et devant le ‘n’ :
        printf « pihome:$(openssl passwd -crypt raspi)\n » >> /var/www/part2/vos_users

        cf cette page : http://wiki.nginx.org/Faq#How_do_I_generate_an_htpasswd_file_without_having_Apache_tools_installed.3F

        Voilà, bon dimanche

        • Merci c’est corrigé. Je pense que l’ancien thème m’a viré le caractère. Sinon le n seul n’a aucun sens 😉

Handpicked links

Mise en cache objet de 2083/2311 objets utilisant disk Mise en cache utilisant disk: enhanced Mise en cache de base de données 31/86 requêtes dans 0.040 secondes utilisant disk Served from: pihomeserver.fr @ 2017-08-12 14:31:47 by W3 Total Cache -->