Пользователь без привилегий, без полномочий root, для запуска или перезапуска сервера веб-сервера, такого как nginx без root или sudo

Я использую Capistrano для развертывания веб-приложения Rails. Я хочу предоставить пользователю развертывания на веб-сервере как можно меньше привилегий. Я был в состоянии сделать все, что мне нужно, как непривилегированный пользователь, кроме перезапуска веб-сервера.

Я делаю это на сервере Ubuntu, но эта проблема не является специфичной для моего варианта использования (rails, capistrano, развертывание), и я видел много подходов к этой проблеме, которые, кажется, связаны с плохой практикой безопасности. Хотите знать, могут ли другие проверить мое решение и посоветовать, безопасно ли оно?

Во-первых, не обязательно, но я понятия не имею, почему /etc/init.d/nginx потребуется какой-либо (даже чтение) доступ другим пользователям. Если им нужно прочитать его, сделайте его пользователем root (с помощью sudo или другими способами), поэтому я:

chmod 750 /etc/init.d/nginx

Так как владельцем является владелец root, группа root (или может быть установлена ​​с помощью chown root: root /etc/init.d/nginx) только root, или пользователь, должным образом sudo'ed, может читать, изменять или запускать / etc / init .d / nginx, и я не собираюсь давать моему пользователю развертывания такие широкие права. Вместо этого я собираюсь предоставить пользователю deploy только конкретное право sudo для запуска сценария управления /etc/init.d/nginx. Они не смогут запустить редактор для его редактирования, потому что у них будет только возможность выполнить этот скрипт. Это означает, что если кто-то получит доступ к моему ящику в качестве пользователя развертывания, он может перезапустить и остановить процесс nginx и т. Д., Но он не сможет сделать больше, например, изменить сценарий для выполнения множества других злых дел.

В частности, я делаю это:

visudo

visudo это специальный инструмент, используемый для редактирования файла sudoers, и для доступа к нему у вас должны быть привилегии sudoer.

Используя visudo, я добавляю:

# Give deploy the right to control nginx
deploy ALL=NOPASSWD: /etc/init.d/nginx

Проверитьсудо человек страницы, но, насколько я понимаю, в первом столбце пользователю даны права sudo, в данном случае «deploy». ALL предоставляет доступ к развертыванию из всех типов терминалов / логинов (например, через ssh). Конец, /etc/init.d/nginx, ТОЛЬКО дает пользователю root доступ к запуску /etc/init.d/nginx (и в этом случае NOPASSWD означает без пароля, который мне нужен для автоматического развертывания) , Пользователь развертывания не может отредактировать скрипт, чтобы сделать его злым, ему нужноПОЛНЫЙ Доступ sudo для этого. Фактически, никто не может, если у них нет корневого доступа, в этом случае есть большая проблема. (Я проверил, что пользователь не может редактировать скрипт после этого, и вы тоже должны это делать!)

Что, вы парни, думаете? Это работает? Есть ли лучшие способы сделать это? Мой вопрос похож наэтот а такжеэтот, но дает больше объяснений, чем я нашел там, извините, если это слишком дублирует, если так, я удалю его, хотя я также прошу другие подходы.

Ответы на вопрос(1)

Ваш ответ на вопрос