Как запустить каждый отдельный сайт от имен разных пользователей на nginx+php-fpm?
Нет 100% уверенности в безопасности кода CMS-систем размещенных сайтов. Даже самый опытный программист допускает ошибки и эти ошибки могут повлиять на безопасность сайта и сервера, где он размещен.
Зачем это нужно?
Безопасность.
Запускать сайт от имени разных пользователей – это гарантия того, что проблемы с безопасностью одного сайта, не повлияют на работу остальных сайтов на этом сервере.
Если один из сайтов получит вирус или бэкдор, то он сможет сломать только его. У него попросту не будет к остальным доступа.
Как это работает?
Мы создадим отдельные пулы php-fpm для каждого сайта, которые будут запускаться от разных пользователей. Права у пользователей будут ограничены только запуском своего пула и директорией сайта.
Процесс
Далее все команды будут вводится от имени пользователя root.
Добавляем нового пользователя в Linux
sudo useradd -M username
Указываем только один параметр -M — без создания домашней директории. Одноименная группа создастся автоматически. Пароль пользователю указывать не нужно.
Подготавливаем 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 = username
group = username
# Сам 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
Теперь ваш сайт работает от пользователя username и не сможет ничего поломать у других сайтов, работающих от стандартной учетки www-data.
Теги: nginx и сервер Linux