Benutzer pro virtuellem Host in Nginx

31

Ist es in nginx möglich, unterschiedliche Benutzer pro virtuellem Host zu konfigurieren?

So etwas wie

 server {
     user myprojectuser myprojectgroup;
     ...
 }
Alex Netkachov
quelle

Antworten:

7

Nein, da alle Server-Zeilengruppen in einer Nginx-Konfiguration von derselben Gruppe von Arbeitsprozessen bedient werden. Unter Sicherheitsaspekten ist es außerdem besser , wenn Sie es so ausführen, da es bedeutet, dass der Inhalt vom Webserver automatisch nicht beschreibbar ist (ohne Dummheiten wie a chmod -R 0777), sodass bei einer Sicherheitslücke in nginx keiner der Inhalte vorhanden ist ist gefährdet.

womble
quelle
2
Gibt es also keine Möglichkeit, Benutzerdateien vor anderen Benutzern zu verbergen? Der gesamte Inhalt des Benutzers sollte von den WWW-Daten lesbar sein.
Alex Netkachov
1
Damit die Dateien für WWW-Daten (oder für jeden Benutzer, unter dem der Webserver ausgeführt wird) zugänglich sind, müssen die Dateien in keiner Weise für andere Benutzer im System zugänglich sein.
womble
2
Weisen Sie dem Dokumentstamm eine Gruppe von www-dataund Berechtigungen zu, 0710wenn Sie den vhost einrichten (da dies root zur Konfiguration von nginx benötigt, ist es kein Problem, wenn Ihre Automatisierung auch die erforderlichen Berechtigungen einstellt). Dann muss der Inhalt des Dokuments nur o+xfür Verzeichnisse und o+rfür Dateien sein.
womble
13
Achtung: Wenn ein PHP-Skript (oder ein CGI-Bin-Prozess) unter ausgeführt wird www-data, kann jeder Benutzer, der ein PHP-Skript oder einen CGI-Bin-Prozess ausführen kann, auf jede Datei zugreifen, auf die der www-dataBenutzer zugreifen kann . Dies scheint für jeden, der Datenbankkennwörter config.php.incauf einem gemeinsam genutzten Computer speichert, nicht offensichtlich zu sein .
Ivan Vučica
2
@ Ricalsin Denken Sie daran, dass UNIX ein Betriebssystem für mehrere Benutzer ist und Server mehrere Benutzer haben können. Zum Beispiel peterund john. Sie hosten ihre Webseiten in ~/public_html. Ohne einen anderen Ansatz, den keiner der oben genannten Personen erwähnt, verfügt ein .php-Skript über die gleichen Berechtigungen wie der Webserver, unter dem es auch ausgeführt wird www-data. Dies bedeutet, dass es genau wie der Webserver und der PHP-Interpreter jedes andere .php-Skript lesen kann.
Ivan Vučica
9

Ja. Dies ist möglich und wird aus Sicherheitsgründen empfohlen (siehe unten).

In Anbetracht der Tatsache, dass Sie PHP-FPM verwenden (wahrscheinlich, wie es am häufigsten vorkommt), können Sie für jede Domain einen Spool erstellen, der einem anderen Benutzer gehört.

PS: Ich habe hier ein detailliertes Tutorial geschrieben:

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

1. Spools erstellen:

Fügen Sie die Spools zu jeder neuen Spool hinzu /etc/php/7.0/fpm/pool.d/www.confoder erstellen Sie eine neue .confDatei.

Spule 1 (myuser1):

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

Spule 2 (myuser2):

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

PS: Behalten Sie Ihre listen.owner / listen.group für denselben nginx-Benutzer (normalerweise www-data ).

2. Ordnen Sie jede Spool ihrem Serverblock zu (virtueller Host für Apache-Benutzer):

Host 1:

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

Host 2:

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

Starten Sie die FPM- und NGINX-Dienste neu

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

Testen:

Erstellen Sie eine pinfo.php- Datei (oder einen beliebigen Namen), die den aktuellen Prozessbenutzer anzeigt :

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

Oder erstellen Sie die Datei pinfo.php über bash:

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

Dann öffne " http: //.../pinfo.php " in deinem Browser.


Gründe für die Verwendung mehrerer Benutzer (Sicherheitsgründe):

Wenn Sie alle Ihre Websites unter demselben Benutzer ( www-data ) betreiben , hat ein PHP-Aufruf von system () / passthru () / exec () Zugriff auf alle Websites! NGINX schützt Sie nicht davor. Das PHP ist nur ein Beispiel, aber alle gängigen Webserver-Sprachen haben ähnliche Aufrufe. Als Hacker können Sie mit " ls .. " durch alle Websites navigieren und mit " cp / echo / mv " Ihren eigenen Code in eine beliebige Datei (einschließlich anderer Website-Dateien) schreiben. Selbst wenn sich alle Websites auf dem Server im Eigentum derselben Person befinden (z. B. Sie), ist es ratsam, jede Website mit einem anderen Benutzer zu betreiben, da so verhindert wird, dass eventuelle Hacker / Viren (z. B. Wordpress-Viren) auf Ihre anderen Websites zugreifen.

Daniel Loureiro
quelle
5

Als Antwort auf den obigen Kommentar von Ivan, der auf das OP anwendbar zu sein scheint. Zwei Dinge:

  1. Das Anwendungsdokument root wäre so etwas wie /blah/peterWeb/htmlund /blah/johnWeb/html. Sowohl NGINX als auch Apache2 erlauben es keinem, das andere Verzeichnis zu durchsuchen oder in diesem zu arbeiten, selbst wenn beide www-data als Gruppe ausführen.

  2. Wenn Sie jedem Verzeichnisbaum eine eigene Benutzerberechtigung zuweisen, kann sich jeder Benutzer bei einem UNIX-System anmelden und die Verzeichnisse für jeden Benutzer privat halten. Fügen Sie einfach nicht jeden Benutzer in die Gruppe www-data ein. Wenn Sie einverstanden sind, dann Ihr Satz:

    Jeder Benutzer, der ein PHP-Skript oder einen CGI-Bin-Prozess ausführen kann, kann auf jede Datei zugreifen, auf die der WWW-Data-Benutzer zugreifen kann.

    könnte genauer geschrieben werden als:

    Jeder Benutzer, den Sie in dieselbe Gruppe wie den Apache / Nginx-Server (www-data) stellen, kann dann in jeder Datei, auf die er zugreifen kann (die im Wesentlichen alles in einem Web ist), tun, was er will (einschließlich der Ausführung eines PHP-Skripts) Server).

BEARBEITEN 1: Nachdem ich einige Probleme mit dem Server-Administrator angesprochen hatte, habe ich mich weiter mit diesem Thema befasst. Mir war nicht bewusst, wie genau die Informationen von Ivan waren! Wenn Sie Benutzern das Hochladen und Ausführen von Skripten in einer gemeinsam genutzten Hosting-Konfiguration ermöglichen möchten, beachten Sie dies. Hier ist ein Ansatz . Ich habe Ivan einen Tipp gegeben, um sicherzugehen, dass ich diese Sicherheitsanfälligkeit verstanden habe.

Ricalsin
quelle
4
Nein, du vermisst es. PHP-Skripte werden, wenn sie im Apache-Prozess (oder auf anderen Webservern) ausgeführt werden, unter den Rechten des Hosting-Prozesses ausgeführt. Auf einer großen Anzahl von naiven Setups ist dieser Benutzer www-data. Wenn Johnny ein Skript erstellen und ausführen kann www-data(was bei naiven Setups der Fall ist), kann Johnnys Skript Peters Skripte lesen und an Johnny zurücksenden. Dies hat nichts mit Gruppen zu tun. Die richtige Lösung besteht darin, suPHP (wenn es naiv eingerichtet ist, schlecht, da schlecht geschriebener Code alle Dateien dieses Benutzers gefährdet) oder ein Gefängnis oder einen dedizierten zusätzlichen Webbenutzer pro Benutzer zu haben.
Ivan Vučica
(Außerdem ist das Hinzufügen einer Antwort anstelle eines Kommentars ein Missbrauch von Websites vom Typ
StackOverflow
@ IvanVučica Aktualisiert und ein hilfreicher Link hinzugefügt, der Ihren Rat unterstützt. Vielen Dank.
Ricalsin