Utente per host virtuale in Nginx


31

In nginx è possibile configurare utenti diversi per host virtuale?

Qualcosa di simile a

 server {
     user myprojectuser myprojectgroup;
     ...
 }

Risposte:


7

No, perché tutte le stanze del server in una configurazione nginx sono servite dallo stesso insieme di processi di lavoro. Inoltre, dal punto di vista della sicurezza, è meglio eseguirlo in questo modo, poiché significa che il contenuto è automaticamente non scrivibile dal server web (assenze stupide come a chmod -R 0777), in modo che se esiste una vulnerabilità in nginx, nessuno dei contenuti è a rischio.


2
Quindi non c'è modo di nascondere i file dell'utente a un altro utente? Tutto il contenuto dell'utente dovrebbe essere leggibile dai dati www?
Alex Netkachov,

1
Rendere i file accessibili ai dati www (o qualunque altro utente venga eseguito dal server web) non richiede in alcun modo che i file siano accessibili ad altri utenti sul sistema.
womble

2
Assegna al root del documento un gruppo di www-datae permanenti 0710quando configuri il vhost (poiché questo ha bisogno del root per configurare nginx, non è un problema avere l'automazione anche impostare le autorizzazioni necessarie). Quindi il contenuto del docroot deve essere solo o+xper le directory e o+rper i file.
Womble

13
Attenzione: se viene eseguito uno script PHP (o un processo cgi-bin) www-data, ogni utente che può servire uno script PHP o un processo cgi-bin può accedere a qualsiasi file accessibile www-dataall'utente. Questo sembra non essere ovvio per chiunque memorizzi le password del database config.php.inco simili su una macchina condivisa.
Ivan Vučica,

2
@Ricalsin Ricorda che UNIX è un sistema operativo multiutente e i server possono avere più di un utente. Ad esempio, petere john. Stanno ospitando le loro pagine web in ~/public_html. In assenza di un approccio diverso non menzionato da nessuno delle persone che ne discutono sopra, uno script .php ha le stesse autorizzazioni del server Web di cui è anche in esecuzione www-data. Ciò significa che, proprio come il web server e l'interprete PHP, è in grado di leggere qualsiasi altro script .php.
Ivan Vučica,

9

Sì. È possibile e consigliato per maggiore sicurezza (vedere perché di seguito).

Considerando che stai usando PHP-FPM (probabilmente lo sei, come è il più comune), puoi creare uno spool, di proprietà di un utente diverso, per ogni dominio.

PS: ho scritto un tutorial dettagliato dettagliato qui:

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

1. Crea spool:

Aggiungi gli spool /etc/php/7.0/fpm/pool.d/www.confo crea un nuovo .conffile per ogni nuovo spool.

Spool # 1 (myuser1):

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

Spool # 2 (myuser2):

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

PS: mantieni il tuo hear.owner / Listen.group allo stesso utente nginx (di solito www-data ).

2. Assegnare ogni spool al suo blocco server (host virtuale per utenti apache):

Host 1:

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

Host 2:

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

Riavvia i servizi FPM e NGINX

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

test:

Crea un file pinfo.php (o qualunque sia il nome) che mostrerà l'utente del processo corrente:

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

Oppure crea il file pinfo.php tramite bash:

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

Quindi apri " http: //.../pinfo.php " sul tuo browser.


Perché usare più utenti (motivi di sicurezza):

Se gestisci tutti i tuoi siti Web con lo stesso utente ( dati www ), una chiamata PHP a system () / passthru () / exec () avrà accesso a tutti i siti Web! NGINX non ti proteggerà da questo. Il PHP è solo un esempio, ma qualsiasi linguaggio web server popolare ha chiamate simili. Come hacker, puoi " ls .. " per navigare in tutti i siti Web e " cp / echo / mv " per scrivere il tuo codice in qualsiasi file (inclusi altri file di siti Web). Anche se tutti i siti Web sul server sono di proprietà della stessa persona (es. Tu), è consigliabile eseguire ogni sito Web con un utente diverso, in quanto impedirà ad eventuali hacker / virus (es. Virus Wordpress) di accedere ad altri tuoi siti Web.


5

In risposta al commento di Ivan sopra e che sembra applicabile all'OP. Due cose:

  1. La radice del documento dell'applicazione sarebbe qualcosa di simile /blah/peterWeb/htmle /blah/johnWeb/html. Sia NGINX che Apache2 non consentirebbero a uno di esaminare o operare nell'altra directory anche se entrambi eseguono www-data come gruppo.

  2. Posizionare ciascun albero di directory sotto la propria autorizzazione utente consentirebbe a ciascun utente di accedere a un sistema UNIX e di mantenere le proprie directory private per ciascuno - semplicemente non mettere ciascun utente nel gruppo www-data. Se sei d'accordo, allora la tua frase:

    ogni utente che può servire uno script PHP o un processo cgi-bin può accedere a qualsiasi file accessibile all'utente www-data.

    potrebbe essere scritto più accuratamente come:

    ogni utente che inserisci nello stesso gruppo del server apache / nginx (www-data) può quindi fare quello che vuole (incluso l'esecuzione di uno script php) in qualsiasi file accessibile (che sarebbe essenzialmente tutto su un web server).

EDIT 1: dovendo affrontare alcuni problemi di amministrazione del server ho approfondito questo argomento. Non ero a conoscenza della precisione delle informazioni di Ivan! Se si intende dare agli utenti la possibilità di caricare ed eseguire script su una configurazione di hosting condiviso, fare attenzione. Ecco un approccio . Consiglio ad Ivan di assicurarsi di aver capito questa vulnerabilità.


4
No. Ti manca. Gli script PHP, se eseguiti nel processo di Apache (o di altri server Web) verranno eseguiti con i privilegi del processo di hosting. Su un gran numero di configurazioni ingenue questo utente è www-data. Se Johnny è in grado di creare una sceneggiatura e farla funzionare sotto www-data(cosa che può fare su configurazioni ingenue), la sceneggiatura di Johnny può leggere le sceneggiature di Peter e rispedirle a Johnny. Questo non ha nulla a che fare con i gruppi. La soluzione corretta è avere suPHP (se impostato in modo ingenuo, non valido, poiché un codice scritto in modo inadeguato mette in pericolo tutti i file di questo utente), oppure una jail o un utente Web dedicato dedicato per utente.
Ivan Vučica,

(Inoltre, aggiungere una risposta invece di un commento è un abuso dei siti di tipo StackOverflow, impressum che in realtà stai fornendo una risposta. Per favore,
evitatelo

@ IvanVučica Aggiornato e aggiunto un link utile che supporta i tuoi consigli. Grazie.
Ricalsin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.