6135 links
  • GuiGui's Show
  • Home
  • Login
  • RSS Feed
  • ATOM Feed
  • Tag cloud
  • Picture wall
  • Daily
Links per page: 20 50 100
 
  • La grande flexibilité du mod_userdir d'Apache httpd

    Le module userdir du serveur web Apache httpd permet à chaque utilisateur d'un serveur d'héberger un site web dans son dossier personnel ($HOME). Celui-ci sera accessible à l'URL https://www.monorganisation.example/~<IDENTIFIANT_UTILISATEUR>.

    Du moins, ça c'est la théorie. J'ignorais la grande flexibilité de mod_userdir :

    • Par défaut, le site web d'un utilisateur doit se trouver dans un dossier « public_html » situé dans le $HOME (home directory, dossier personnel) de cet utilisateur. Mais, en fait, ce dossier peut se trouver n'importe où, tant que le chemin pour y accéder contient / dépend de l'identifiant de l'utilisateur. Même le nom du dossier n'est pas imposé ;

    • Il est possible de préciser plusieurs chemins vers le dossier contenant le site web d'un utilisateur. Apache httpd cherchera le dossier contenant le web d'un utilisateur dans telle arborescence, et s'il ne trouve pas le dossier, il le cherchera dans telle autre arborescence, puis dans telle autre, etc.


    Cas d'étude

    Nous avons un serveur Debian GNU/Linux sur lequel tous nos utilisateurs peuvent se connecter en SSH et déposer des pages web (entre autres choses).

    Deux espaces de stockage sont à leur disposition : leur dossier personnel ($HOME) et leurs données. Les deux sont montés en NFS. Les données sont aussi accessibles en CIFS depuis n'importe quelle machine et n'importe quel système d'exploitation. Le dossier personnel est accessible seulement depuis ce serveur.

    Certains utilisateurs veulent modifier leur site web depuis winwin (entre l'encodage des caractères, le codage différent d'un retour à la ligne, et autres fourberies, ce n'est pas une bonne idée, mais je ne suis pas là pour empêcher nos utilisateurs de se faire mal). On va donc stocker les sites web dans l'espace de stockage « données ».

    Comment faire ? Simple. Voici le contenu du fichier /etc/apache2/mods-enabled/userdir.conf :

    <IfModule mod_userdir.c>
    
        UserDir disabled root
    
        UserDir /nfs/nas-datas/datas/*/public_html
    
        <Directory /nfs/nas-datas/datas/*/public_html>
            AllowOverride All
            Options Indexes
            Require all granted
        </Directory>
    
    </IfModule>

    Commentaires :

    • Par sécurité, on désactive ce module pour l'utilisateur root ;

    • Pour servir une URL de la forme https://www.monorganisation.example/~<IDENTIFIANT>, Apache httpd cherchera les fichiers dans le dossier /nfs/nas-datas/datas/<IDENTIFIANT>/public_html ;

    • On autorise Apache httpd à accéder au dossier public_html des utilisateurs. Selon la documentation, ici, le caractère substituable « * » n'est pas remplacé par l'identifiant demandé dans l'URL, mais signifie « n'importe quels caractères qui apparaît 0, 1 ou une infinité de fois ».



    Difficulté supplémentaire : en fait, sur notre NAS, pour des raisons de performances, le dossier d'un utilisateur est en fait un sous-dossier d'un dossier qui peut prendre le nom d'un hash ou celui du groupe auquel appartient l'utilisateur (son service, par exemple) ou l'année d'arrivée de l'utilisateur, etc. Pour cet exemple, on considérera que c'est le groupe de l'utilisateur et que celui-ci équivaut à son service.

    Comment faire ? Facile. Le module userdir peut chercher le site web dans plusieurs dossiers en s'arrêtant à la première occurrence trouvée. Quant à elle, la directive « Directory » autorise plusieurs caractères substituables.

    Le contenu du fichier /etc/apache2/mods-enabled/userdir.conf devient :

    <IfModule mod_userdir.c>
        UserDir disabled root
    
        UserDir /nfs/nas-datas/datas/info/*/public_html /nfs/nas-datas/datas/compta/*/public_html /nfs/nas-datas/datas/direction/*/public_html
    
        <Directory /nfs/nas-datas/datas/*/*/public_html>
            AllowOverride All
            Options Indexes
            Require all granted
        </Directory>
    
    </IfModule>



    Allez, une dernière chose : si le site web n'est pas trouvé dans l'espace de stockage « données », on souhaite le chercher dans le dossier personnel.

    Ce n'est pas un problème : on peut bien évidemment cumuler les différentes syntaxes de la directive « UserDir » : UserDir /nfs/nas-datas/datas/info/*/public_html public_html. Dans cet exemple, Apache httpd ira chercher dans le dossier /nfs/nas-datas/datas/info/<IDENTIFIANT>/public_html et, si ce dossier n'existe pas, il ira chercher dans le dossier public_html du home directory (qui n'est pas toujours /home/<IDENTIFIANT>, pour rappel).

    Évidemment, pour que cela fonctionne, il faut ajouter une directive « Directory » supplémentaire autorisant l'accès au dossier « public_html » situé dans le $HOME. Exemple :

    <Directory /nfs/nas-homedir/homedirs/*/*/public_html>
        AllowOverride All
        Options Indexes
        Require all granted
    </Directory>
    November 16, 2020 at 8:41:55 PM UTC - permalink - http://shaarli.guiguishow.info/?LvGB_A
Links per page: 20 50 100
 
Mentions légales identiques à celles de mon blog | CC BY-SA 3.0

Shaarli - The personal, minimalist, super fast, database-free, bookmarking service by the Shaarli community