Користувач на віртуальний хост у Nginx


31

Чи можливо в nginx налаштувати іншого користувача на віртуального хоста?

Щось на зразок

 server {
     user myprojectuser myprojectgroup;
     ...
 }

Відповіді:


7

Ні, тому що всі серверні строфи в конфігурації nginx подаються з одного набору робочих процесів. Крім того, з точки зору безпеки, вам краще запустити його так, оскільки це означає, що веб-сервер вміст автоматично не підходить (відсутні дурість, як chmod -R 0777), так що якщо в nginx є вразливість, жоден вміст ризикує.


2
Тож немає способу приховати файли користувача від інших користувачів? Весь вміст користувача повинен читатись за допомогою www-data?
Олексій Неткачов

1
Зробити файли доступними до www-даних (або будь-якого користувача, на якому працює веб-сервер) жодним чином не потрібно, щоб файли були доступні для інших користувачів системи.
живіт

2
Надайте кореню документа групу www-dataта perms 0710під час встановлення vhost (оскільки для корекції nginx для цього потрібен root, проблема автоматичного встановлення також встановить необхідні дозволи). Тоді вміст docroot просто повинен бути o+xдля каталогів і o+rдля файлів.
жіноча

13
Остерігайтеся: якщо PHP-скрипт (або процес cgi-bin) працює під www-dataкожним користувачем, який може обслуговувати PHP-скрипт або cgi-bin-процес, може отримати доступ до будь-якого файлу, доступного www-dataкористувачеві. Це, очевидно, не очевидно для всіх, хто зберігає паролі бази даних у config.php.incсхожих машинах або подібних до них.
Іван Вучиця

2
@Ricalsin Пам'ятайте, що UNIX - це багатокористувацька операційна система, і сервери можуть мати декілька користувачів. Наприклад, peterі john. Вони розміщують свої веб-сторінки в ~/public_html. Якщо відсутній інший підхід, про який не згадував ніхто з людей, що обговорювали це вище, сценарій .php має ті ж дозволи, що й веб-сервер, як це також виконується в www-data. Це означає, що, як і веб-сервер та інтерпретатор PHP, він може читати будь-який інший .php-скрипт.
Іван Вучиця

9

Так. Це можливо і рекомендується для додаткової безпеки (див. Чому нижче).

Враховуючи, що ви використовуєте PHP-FPM (ви, мабуть, є, як це найчастіше), ви можете створити котушку, що належить іншому користувачеві, для кожного домену.

PS: Я написав детальний покроковий посібник тут:

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

1. Створіть котушки:

Додайте котушки до /etc/php/7.0/fpm/pool.d/www.confабо створіть новий .confфайл для кожної нової катушки.

Шпулька №1 (myuser1):

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

Шпулька №2 (myuser2):

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

PS: Тримайте вашу liste.owner / liste.group того самого користувача nginx (зазвичай www-data ).

2. Призначте кожну котушку своєму блоку серверів (віртуальному хосту для користувачів апаш):

Ведучий 1:

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

Ведучий 2:

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

Перезапустіть послуги FPM та NGINX

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

Тестування:

Створіть файл pinfo.php (або будь-яке ім’я), який відображатиме поточного користувача процесу:

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

Або створити файл pinfo.php через bash:

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

Потім відкрийте " http: //.../pinfo.php " у своєму браузері.


Навіщо використовувати декілька користувачів (причини безпеки):

Якщо ви запускаєте всі свої веб-сайти під одним і тим самим користувачем ( www-data ), виклик PHP до системи () / passthru () / exec () матиме доступ до всіх веб-сайтів! NGINX не захистить вас від цього. PHP - лише приклад, але будь-яка популярна мова веб-сервера має подібні дзвінки. Як хакер, ви можете " лс .. " переходити по всіх веб-сайтах і " cp / echo / mv " писати власний код у будь-який файл (включаючи інші файли веб-сайту). Навіть якщо всі веб-сайти на сервері належать одній особі (наприклад, ви), доцільно запускати кожен веб-сайт з іншим користувачем, оскільки це не дозволить потенційним хакерам / вірусам (наприклад, вірусам Wordpress) отримати доступ до інших ваших веб-сайтів.


5

У відповідь на коментар Івана вище та, який здається застосовно до ОП. Дві речі:

  1. Корінь документа програми буде чимось схожим /blah/peterWeb/htmlі /blah/johnWeb/html. І NGINX, і Apache2 не дозволять одному переслідувати або працювати в іншому каталозі, навіть якщо вони обидва використовують дані www як дані у групі.

  2. Якщо розмістити кожне дерево каталогів під власним дозволом користувача, це дозволить кожному користувачеві ssh / login до системи UNIX та зберігати свої каталоги приватними для кожного - просто не слід розміщувати кожного користувача у групі даних www. Якщо ви згодні, то ваше речення:

    кожен користувач, який може обслуговувати PHP-скрипт або процес cgi-bin, може отримати доступ до будь-якого файлу, доступного користувачеві www-data.

    може бути більш точно записано як:

    кожен користувач, який ви ставите в ту ж групу, що і сервер apache / nginx (www-data), може потім робити все, що завгодно (включаючи запуск php-скрипту) у будь-якому доступному для нього файлі (який, по суті, буде всім в Інтернеті сервер).

РЕДАКТИКА 1: Доводиться вирішувати деякі проблеми адміністратора сервера, я детальніше розглядав цю тему. Я не знав, наскільки точні дані Івана! Якщо ви маєте намір надати користувачам можливість завантажувати та запускати сценарії в конфігурації спільного хостингу, тоді зверніть увагу. Ось один підхід . Хед-порада Івану, щоб переконатися, що я зрозумів цю вразливість.


4
Ні, ти цього не вистачаєш. PHP-скрипти, коли вони виконуються в процесі Apache (або інших веб-серверів), працюватимуть під правами хостингу. У великій кількості наївних налаштувань цей користувач є www-data. Якщо Джонні може створити сценарій і запустити його www-data(під наївними налаштуваннями він може), то сценарій Джонні може прочитати сценарії Петра і відправити їх назад Джоні. Це не має нічого спільного з групами. Правильне рішення - мати suPHP (якщо наївне налаштування, погано, оскільки погано написаний код ставить під загрозу всі файли цього користувача), або в'язницю, або виділений додатковий веб-користувач на кожного користувача.
Іван Вучиця

(Крім того, додавання відповіді замість коментаря - це зловживання сайтами типу StackOverflow, враження, ви фактично надаєте відповідь. Будь ласка, уникайте цього.)
Іван Вучиця

@ IvanVučica Оновлено та додав корисне посилання, яке підтримує вашу пораду. Спасибі.
Ricalsin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.