PankovAlxndr
@PankovAlxndr
Fullstack web developer

Нужен ли отдельный linux user для сайта?

Помогите расставить точки над и.
Какой существует бестпрактис при разворачивании lemp стека с точки зрения пользователей?

Вот только что я на vps поставил nginx, указал в конфиге, что он работает от www-data.
Поставил php-fpm, пул www которого, аналогично работает от www-data.
Установил mysql, redis, supervisor, certbot.
Далее, через rsync (пока не смотрю на ci\cd), я залил файлы проекта (php\laravel) в var/www/app
и всему содержимому папки var/www/app поставил пользователя и группу www-data:www-data (проверил через ls -la).

Потом у меня есть крон, вот с этого момента я начал беспокоиться, что делаю что-то не так.
Мне же нужно кое-какие скрипты запускать через крон (шедулер ларавела, бекапы через mysqldump и тд и тп), а доступ у меня сейчас ssh root (через ключ, а не пароль), те мне нужно crontab вызвать не для себя (рута) а для www-data, ну я так и сделал командой crontab -u www-data -e ....
Вообще, все у меня работает.
Все руками сделал, далее буду прикручивать ci\cd через gitlab, раскатывать через ansible.

Но не могу в голове уложить все по кирпичикам на счет юзеров, вычитал, что кто-то создает специального юзера для сайта, типа laravel, deployer, summy называют его, добавляют в группу www-data и работают (ларавел, кстати, так не заведется на сколько я понимаю, тк не сможет файлы сессий, логов, кеша писать в файловую систему, прав не хватит по умолчанию, но это фиксится и, наверное, косвенно относится к вопросу, хотя хз.. велосипедом из костылей пахнет).

А в одном тг чатике сказали, что делают своего юзера, пусть будет app, через него запускают nginx и php-fpm и его же назначают владельцем и группой для файлов сайта (var/www/app), дают ssh авторизацию. Те можно спокойно входить что-то править, через тот же rsync заливать, с правами траблов не будет, НО и надо помнить, что теперь нет нигде www-data и копипаст каких-то решений\конфингов может не завестись.

Погуглил и как-то решения "железобетонного" не нашел, подскажите пожалуйста как делайте вы и почему именно так?
Еще раз повторю, что как я в самом начале описал - у меня все работает, но, возможно, я не вижу какой-то ошибки, которая потом, в ci\cd, jenkinse, ansible или еще где-то мне ногу отстрелит.
  • Вопрос задан
  • 235 просмотров
Пригласить эксперта
Ответы на вопрос 5
vabka
@vabka
Токсичный шарпист
Какой существует бестпрактис при разворачивании lemp стека с точки зрения пользователей.

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

Нельзя чтобы они работали от рута или имени обычного пользователя, тк таким образом ты увеличиваешь площадь для атаки.

А одном тг чатике сказали, что делают своего юзера, пусть будет app, через него запускают nginx и php-fpm и его же назначают владельцем и группой для файлов сайта (var/www/app), дают ssh авторизацию.

Не вижу смысла выдавать app-юзеру права на логин по ssh. Все настройки можно делать и от имени административного пользователя - главное потом проверить что права выданы корректно.

НО и надо помнить, что теперь нет нигде www-data и копипаст каких-то решений\конфингов может не завестись.

Не вижу в этом никаких проблем - лишний раз включишь мозг чтобы понять, что ты там в конфигах воротишь => будешь сам знать где может быть потенциальная дыра или ошибка.

у меня все работает, но, возможно, я не вижу какой-то ошибки, которая потом, в ci\cd, jenkinse, ansible или еще где-то мне ногу отстреллит.

Значит потом для cicd / jenkins / ansible также заведёшь пользователя с нужными правами, как и у тебя, чтобы ворочать конфиги и файлы.
Ответ написан
neuotq
@neuotq
Прокрастинация
Практик очень много, тут лучше идти в сторону лучших практик от devops, это большая тема, но полезная.

Но если упрощенно и по старинке и быстро.
1. Доступ на сервер только по ssh ключам, никаких паролей.
2. Отдельный момент по sudo
2.1 Для пользователя админа в целом оставляем запрос пароля на sudo
2.2 Для сервисных аккаунтов(условные www-data и компашка,которые для служб, сервисов, автоматика того же ларавел) делаем sudo без пароля для избранных команд/программ. Таким образом автоматизация будет работать сама, независимо и стабильно.
3. Бонус пункт. Подумать о переходе на докер контейнеры на сервере, многие штуки упрощаются. Можно начать с интеграции того же laradock как самый быстрый и лёгкий старт.
PS почему rsync? Почему хотя бы не скрипты которые фетчат гит репо. rsync для некоторых сценариев бекапа еще понятно, но для деплоя кода ну не знаю. Более прозрачная схема через гит и билд на сервере. В крайнем случае в тот же гит можно и сбилженные релизы добавлять и их разворачивать на сервере.
Ответ написан
ValdikSS
@ValdikSS
Нужны отдельные unix-пользователи на сервис/проект/сайт, иначе в случае взлома сайта А будет возможность читать и модифицировать файлы сайта Б, т.к. все файлы принадлежат www-data.

Отдельные пользователи нужны всем сервисам, которые так или иначе взаимодействуют с файлами. В случае PHP это php-fpm (или другой исполнитель) — у каждого сайта должен быть свой пул со своим пользователем. Всё, с чем взаимодействие ведётся только по сети/сокету и имеет правильное разделение привилегий (базы данных), должны работать от своего (стандартного) пользователя.

В случае веб-сервера также уместно разделить статические данные от кода: картинкам и .js-файлам следует назначить www-data, чтобы веб-сервер мог их прочесть и раздать, а php-код любого сайта при этом не мог эти данные модифицировать. Верно и в обратную сторону — веб-сервер не сможет отдать ваши .php-файлы без их исполнения в случае некорректной настройки веб-сервера.
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
что теперь нет нигде www-data и копипаст каких-то решений\конфингов может не завестись.

И это очень хорошо, потому что бездумная копипаста может попросту сервак убить :)
подскажите пожалуйста как делайте вы и почему именно так?

Стандартный принцип - каждый сервис работает от своего юзера. redis - от юзера redis. mysql - от юзера mysql. apache - от юзера apache. Это на тот случай, если кто-то проломит сервис - он получит не права рута, а права сервиса, которые заметно меньше.
Да, иногда нужно потанцевать с правами, но оно того стоит.
Ответ написан
Комментировать
leahch
@leahch Куратор тега Linux
3D специалист. Dолго, Dорого, Dерьмово.
Предложу немного "необычное" решение.
Запускайте все в контейнерах, docker или lxd/lxc, делайте внутреннюю сеть внутри контейнеров и проброс портов наружу для nginx.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы