Как запустить каждый отдельный сайт от имен разных пользователей на nginx+php-fpm?

Нет 100% уверенности в безопасности кода CMS-систем размещенных сайтов. Даже самый опытный программист допускает ошибки и эти ошибки могут повлиять на безопасность сайта и сервера, где он размещен.

Зачем это нужно?

  1. Безопасность. Запускать сайт от имени разных пользователей – это гарантия того, что проблемы с безопасностью одного сайта, не повлияют на работу остальных сайтов на этом сервере. Если один из сайтов получит вирус или бэкдор, то злоумышленник получит доступ только к одному сайту.
  2. Можно указать разные настройки PHP для разных сайтов. Очень удобно, если на одном сервере размещены сайты с разными CMS.

Как это работает?

Мы создадим отдельные пулы php-fpm для каждого сайта, которые будут запускаться от разных пользователей. Права у пользователей будут ограничены только запуском своего пула и директорией сайта.

Процесс

Далее все команды будут вводится от имени пользователя root.

Добавляем нового пользователя и устанавливаем права доступа

sudo useradd -M -s /usr/sbin/nologin имя_пользователя

Указываем параметр -M — без создания домашней директории и -s /usr/sbin/nologin — без использования шелла. Одноименная группа создастся автоматически. Пароль пользователю указывать не нужно.

У директории, где размещен сайт, меняем владельца и ограничиваем ему права. Мы меняем только владельца. Группа должна остаться по умолчанию — www-data:

cd /var/www/название_сайта/www/
sudo chown -R имя_пользователя ./
sudo find . -type f -exec chmod 664 {} +
sudo find . -type d -exec chmod 755 {} +

Этот код на директории устанавливает 755 (владельцу можно все, группе и всем остальным читать и выполнять), а на файлы 664 (владельцу и его группе читать и писать, а остальным только читать).

Если Вы планируете редактировать файлы через sFTP, то пользователя, от имени которого Вы это делаете, нужно добавить в группу созданного пользователя.

sudo usermod -a -G имя_пользователя ваш_пользователь

Подготавливаем PHP

Нужно проверить возможность подключения внешних конфигурационных файлов для пулов. В Debian это сделано по умолчанию и этот шаг можно пропустить. Для этого открываем конфиг (в примере используется PHP версии 7.3):

sudo nano /etc/php/7.3/fpm/php-fpm.conf

и в нем должна быть раскомментирована строка:

include=/etc/php/7.3/fpm/pool.d/*.conf

Создаем новый пул PHP-FPM

Копируем конфиг пула для нового и открываем его для редактирования:

cd /etc/php/7.3/fpm/pool.d/
sudo cp www.conf www-new.conf
sudo nano /etc/php/7.3/fpm/pool.d/www-new.conf

Обязательно меняем:

# Меняем название пула в квадратных скобках на свое.
# Удобнее указывать название сайта
[www-new]
# Меняем на свое
listen = /var/run/php/php7.3-fpm-www-new.sock
# Указываем имя пользователя и группу созданные ранее
user = имя_пользователя
group = имя_пользователя
# Сам nginx и php-fpm будут запущены от имени стандартной учетной записи.
# Оставляем без изменений.
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

На этом настройка php-fpm закончилась.

Перезапускаем php-fpm

sudo service php7.3-fpm restart

Приступаем к web-серверу.

Настройка nginx

Открываем конфигурационный файл сайта.

sudo nano /etc/nginx/sites-available/sitename.conf

Если конфига для нового сайта нет, то копируем его с уже существующего и редактируем под себя.

Чтобы «заставить» работать сайт от имени другого пользователя нужно в конфигурационном файле во всех секциях обработки php-файлов добавить ссылку на созданный ранее сокет пула php-fpm:

location ~ \.php$ {
   ...
   fastcgi_pass unix:/var/run/php/php7.3-fpm-www-new.sock;
   ...
}

Перезапускаем nginx

Заранее проверяем правильность настроек всех конфигов для nginx:

sudo nginx -t

Если все ОК, перезапускаем последний:

sudo service nginx restart

Теперь ваш сайт работает от пользователя имя_пользователя и не сможет ничего поломать у других сайтов, работающих от стандартной учетки www-data.

Теги: и

Комментарии






Важное событие
Основание Canon<
Основание Canon
Узнать подробнее
Комментарии
Интересное