Utilisateur par hôte virtuel dans Nginx

31

Est-il possible dans nginx de configurer un utilisateur différent par hôte virtuel?

Quelque chose comme

 server {
     user myprojectuser myprojectgroup;
     ...
 }
Alex Netkachov
la source

Réponses:

7

Non, car toutes les strophes de serveur d'une configuration nginx sont servies à partir du même ensemble de processus de travail. De plus, du point de vue de la sécurité, il vaut mieux l' exécuter comme ça, car cela signifie que le contenu est automatiquement inscriptible par le serveur Web (en l'absence de stupidités comme a chmod -R 0777), de sorte que s'il y a une vulnérabilité dans nginx, aucun du contenu est à risque.

femme
la source
2
Il n'y a donc aucun moyen de cacher les fichiers des utilisateurs à d'autres utilisateurs? Tout le contenu de l'utilisateur doit être lisible par le www-data?
Alex Netkachov
1
Rendre les fichiers accessibles aux données www (ou à tout utilisateur sous lequel le serveur Web s'exécute) ne nécessite en aucun cas que les fichiers soient accessibles aux autres utilisateurs du système.
womble
2
Donnez à la racine du document un groupe www-dataet des perms 0710lorsque vous configurez le vhost (car cela nécessite root pour configurer nginx, ce n'est pas un problème que votre automatisation définisse également les autorisations nécessaires). Ensuite, le contenu de la docroot doit simplement être o+xdestiné aux répertoires et o+raux fichiers.
womble
13
Attention: si un script PHP (ou un processus cgi-bin) fonctionne sous www-data, chaque utilisateur qui peut servir un script PHP ou un processus cgi-bin peut accéder à n'importe quel fichier accessible à l' www-datautilisateur. Cela ne semble pas évident pour quiconque stocke des mots de passe de base de données dans config.php.incou similaire sur une machine partagée.
Ivan Vučica
2
@Ricalsin N'oubliez pas qu'UNIX est un système d'exploitation multi-utilisateurs et que les serveurs peuvent avoir plusieurs utilisateurs. Par exemple, peteret john. Ils hébergent leurs pages Web en ~/public_html. En l'absence d'une approche différente non mentionnée par aucune des personnes discutant de cela ci-dessus, un script .php a les mêmes autorisations que le serveur Web car il s'exécute également sous www-data. Cela signifie que, tout comme le serveur Web et l'interpréteur PHP, il peut lire tout autre script .php.
Ivan Vučica
9

Oui. Il est possible et recommandé pour plus de sécurité (voir pourquoi ci-dessous).

Étant donné que vous utilisez PHP-FPM (vous l'êtes probablement, comme c'est le plus courant), vous pouvez créer un spool, appartenant à un utilisateur différent, pour chaque domaine.

PS: j'ai écrit un tutoriel détaillé étape par étape ici:

https://learnwithdaniel.com/2019/06/user-per-virtual-host-nginx/

1. Créez des bobines:

Ajoutez les bobines /etc/php/7.0/fpm/pool.d/www.confou créez un nouveau .conffichier pour chaque nouvelle bobine.

Bobine # 1 (myuser1):

[myprojectuser1]
user = myuser1
group = myprojectgroup
..
listen = /run/php/myuser1.sock
...  
listen.owner = www-data
listen.group = www-data

Bobine # 2 (myuser2):

[myprojectuser2]
user = myuser2
group = myprojectgroup
..
listen = /run/php/myuser2.sock
...  
listen.owner = www-data
listen.group = www-data

PS: Gardez votre listen.owner / listen.group au même utilisateur nginx (généralement www-data ).

2. Attribuez chaque spoule à son bloc serveur (hôte virtuel pour les utilisateurs apache):

Hôte 1:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser1.sock;
  }
  ...
}

Hôte 2:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser2.sock;
  }
  ...
}

Redémarrez les services FPM et NGINX

sudo /etc/init.d/php7.0-fpm restart
sudo service nginx restart

Essai:

Créez un fichier pinfo.php (ou n'importe quel nom) qui montrera l'utilisateur du processus actuel:

<?php 
echo str_replace("\n", '<br>', shell_exec('ps -u -p '.getmypid()));

Ou créez le fichier pinfo.php via bash:

echo "<?php echo str_replace(\"\\n\", '<br>', shell_exec('ps -u -p '.getmypid()));" > pinfo.php

Ouvrez ensuite " http: //.../pinfo.php " sur votre navigateur.


Pourquoi utiliser plusieurs utilisateurs (raisons de sécurité):

Si vous exécutez tous vos sites Web sous le même utilisateur ( www-data ), un appel PHP à system () / passthru () / exec () aura accès à tous les sites Web! NGINX ne vous protégera pas contre cela. Le PHP n'est qu'un exemple, mais tout langage de serveur Web populaire a des appels similaires. En tant que hacker, vous pouvez " ls .. " pour naviguer sur tous les sites Web et " cp / echo / mv " pour écrire votre propre code dans n'importe quel fichier (y compris les fichiers d'un autre site Web). Même si tous les sites Web du serveur appartiennent à la même personne (par exemple, vous), il est conseillé d'exécuter chaque site Web avec un utilisateur différent, car cela empêchera d'éventuels pirates / virus (par exemple, les virus Wordpress) d'accéder à vos autres sites Web.

Daniel Loureiro
la source
5

En réponse au commentaire d'Ivan ci-dessus et qui semble applicable au PO. Deux choses:

  1. La racine du document d'application serait quelque chose comme /blah/peterWeb/htmlet /blah/johnWeb/html. NGINX et Apache2 ne permettraient pas à l'un de lire attentivement ou de fonctionner dans l'autre répertoire, même s'ils exécutent tous les deux www-data en groupe.

  2. Le fait de placer chaque arborescence de répertoires sous leur propre autorisation utilisateur permettrait à chaque utilisateur de ssh / se connecter à un système UNIX et de garder leurs répertoires privés pour chacun - il suffit de ne pas placer chaque utilisateur dans le groupe www-data. Si vous êtes d'accord, alors votre phrase:

    chaque utilisateur pouvant servir un script PHP ou un processus cgi-bin peut accéder à n'importe quel fichier accessible à l'utilisateur www-data.

    pourrait être écrit avec plus de précision:

    chaque utilisateur que vous mettez dans le même groupe que le serveur apache / nginx (www-data) peut alors faire ce qu'il veut (y compris exécuter un script php) dans n'importe quel fichier qui lui est accessible (qui serait essentiellement tout sur un site web serveur).

EDIT 1: Devant résoudre certains problèmes d'administration du serveur, j'ai approfondi ce sujet. Je ne savais pas à quel point les informations d'Ivan étaient exactes! Si vous avez l'intention de donner aux utilisateurs la possibilité de télécharger et d'exécuter des scripts sur une configuration d'hébergement partagé, alors prenez garde. Voici une approche . Chapeau à Ivan pour m'être assuré d'avoir bien compris cette vulnérabilité.

Ricalsin
la source
4
Non, vous le manquez. Les scripts PHP, lorsqu'ils sont exécutés dans le processus d'Apache (ou d'autres serveurs Web), s'exécuteront sous les privilèges du processus d'hébergement. Sur un grand nombre de configurations naïves, cet utilisateur est www-data. Si Johnny peut créer un script et l'exécuter sous www-data(ce qui sur des configurations naïves, il peut), alors le script de Johnny peut lire les scripts de Peter et les renvoyer à Johnny. Cela n'a rien à voir avec les groupes. La bonne solution est d'avoir suPHP (s'il est naïvement configuré, mauvais, car un code mal écrit met en danger tous les fichiers de cet utilisateur), ou une prison, ou un utilisateur Web supplémentaire dédié par utilisateur.
Ivan Vučica
(En outre, l'ajout d'une réponse au lieu d'un commentaire est un abus de sites de type StackOverflow, impressionnez que vous fournissez réellement une réponse. Veuillez éviter cela.)
Ivan Vučica
@ IvanVučica Mise à jour et ajout d'un lien utile qui soutient vos conseils. Merci.
Ricalsin