Пользователь на виртуальный хост в Nginx

31

Возможно ли в nginx настроить разных пользователей для каждого виртуального хоста?

Что-то типа

 server {
     user myprojectuser myprojectgroup;
     ...
 }
Алекс Неткачов
источник

Ответы:

7

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

romble
источник
2
То есть нет способа скрыть файлы пользователя от других пользователей? Весь пользовательский контент должен быть доступен для чтения через www-данные?
Алекс Неткачов
1
Чтобы сделать файлы доступными для www-данных (или любого пользователя, с которым работает веб-сервер), никоим образом не требуется, чтобы файлы были доступны для других пользователей в системе.
womble
2
При настройке vhost укажите корневую группу документов www-dataи права 0710доступа (поскольку для настройки nginx требуется root, не проблема в том, чтобы ваша автоматизация также установила необходимые разрешения). Тогда содержимое документа должно быть просто o+xдля каталогов и o+rфайлов.
womble
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: держите ваш listen.owner / listen.group тем же пользователем nginx (обычно www-data ).

2. Назначьте каждую катушку своему блоку сервера (виртуальный хост для пользователей apache):

Хост 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-вызов system () / passthru () / exec () будет иметь доступ ко всем сайтам! NGINX не защитит вас от этого. PHP является лишь примером, но любой популярный язык веб-сервера имеет аналогичные вызовы. Как хакер, вы можете « ls .. » перемещаться по всем сайтам и « cp / echo / mv » писать свой собственный код в любом файле (включая файлы других сайтов). Даже если все веб-сайты на сервере принадлежат одному и тому же человеку (например, вам), рекомендуется запускать каждый веб-сайт с другим пользователем, поскольку это предотвратит доступ хакеров / вирусов (например, вирусов Wordpress) к другим вашим веб-сайтам.

Даниэль Лоурейро
источник
5

В ответ на комментарий Ивана выше и который представляется применимым к ФП. Две вещи:

  1. Корень документа приложения будет что-то вроде /blah/peterWeb/htmlи /blah/johnWeb/html. И NGINX, и Apache2 не позволят одному просматривать или работать в другом каталоге, даже если они оба используют www-данные как группу.

  2. Размещение каждого дерева каталогов под собственным разрешением пользователя позволит каждому пользователю входить в систему ssh / login в системе UNIX и сохранять свои каталоги закрытыми для каждого - просто не помещайте каждого пользователя в группу www-data. Если вы согласны, то ваше предложение:

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

    может быть более точно написано как:

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

РЕДАКТИРОВАТЬ 1: необходимость решения некоторых проблем администратора сервера, я посмотрел дальше в эту тему. Я не знал, насколько точной была информация Ивана! Если вы намереваетесь предоставить пользователям возможность загружать и запускать сценарии в конфигурации с общим хостингом, обратите внимание. Вот один из подходов . Шляпа подсказка Ивану, чтобы убедиться, что я понял эту уязвимость.

Ricalsin
источник
4
Ты скучаешь по этому. Сценарии PHP, когда они выполняются в процессе Apache (или на другом веб-сервере), будут выполняться с привилегиями процесса хостинга. На большом количестве наивных установок этот пользователь есть www-data. Если Джонни может создать сценарий и запустить его www-data(что на наивных установках он может), то сценарий Джонни может прочитать сценарии Питера и отправить их обратно Джонни. Это не имеет ничего общего с группами. Правильное решение - иметь suPHP (если наивно настроенный, плохой, так как плохо написанный код ставит под угрозу все файлы этого пользователя), или тюрьму, или выделенного дополнительного веб-пользователя на пользователя.
Иван Вучица,
(Кроме того, добавление ответа вместо комментария - это злоупотребление сайтами типа StackOverflow, впечатляет, что вы на самом деле предоставляете ответ. Пожалуйста, избегайте этого.)
Иван Вучица,
@ IvanVučica Обновлена ​​и добавлена ​​полезная ссылка, которая поддерживает ваш совет. Спасибо.
Ricalsin