Я хотел бы создать очень простую веб-панель управления на основе PHP, чтобы добавлять и удалять пользователей в / из, а также добавлять и удалять разделы в / из файлов конфигурации nginx на моем linode vps (Ubuntu 8.04 LTS).
Каков наиболее безопасный способ выполнения команд от имени пользователя root на основе ввода с веб-панели управления?
Я не хочу запускать PHP как root (даже если за брандмауэром IP-таблиц) по очевидным причинам.
Предложения приветствуются. Это должно быть возможно, поскольку несколько коммерческих (и раздутых для моих нужд) панелей управления предлагают аналогичные функции.
Спасибо
Создайте правило sudo для пользователя, от имени которого работает веб-сервер, чтобы он мог выполнять только определенные команды. Чтобы отредактировать файл, например, вы можете сделать так, чтобы веб-сервер сделал копию в каталоге, принадлежащем веб-серверу и доступном для записи только ему (чтобы злонамеренные локальные пользователи не могли вмешиваться в ваши изменения в середине процесса), и иметь правило sudo для скопируйте отредактированный файл на место. Вы можете заблокировать правила sudo, чтобы можно было обрабатывать только те команды с определенными аргументами.
Кроме того, убедитесь, что вы аутентифицируете пользователей, и убедитесь, что вы дезинфицируете любой ввод от пользователя, чтобы предотвратить проникновение каких-либо метасимволов оболочки или аналогичных. При добавлении пользователей, например, вы можете убедиться, что ввод соответствует максимальной длине и состоит только из букв и цифр. Использование sudo в любом случае предотвратит большинство подобных вещей, но несколько уровней защиты - это хорошо. Невозможно быть слишком параноиком с пользовательским вводом. ;)
Или просто установите Webmin. :)
Что бы вы ни делали, это всегда будет возможной дырой в безопасности.
Некоторые предложения:
Ничто из вышеперечисленного не кажется на самом деле безопаснее (и определенно не проще), чем просто запустить вашу «панель управления» от имени пользователя root. И большинство пакетов "панели управления" (например, webmin) просто обойдите это полностью и запустите как root.
Я думаю, что вы могли бы объединить эти элементы для достижения хорошего уровня безопасности:
Кроме того, хотя я предпочитаю описанный выше подход, у меня был клиент, который просто выгружал действия в файл, а затем скрипт обрабатывал эти действия. Скрипт запускался через cron каждые 5 минут.
Требуется ли для этого публичный доступ? Если нет, используйте IPtables и собственный Authconfig apache, чтобы защитить его от злоупотреблений.
напишите cgi-скрипт на python, думаю, это, наверное, проще. Хотя, как сказал Массимо, гораздо безопаснее запустить вебмин ...
Это делают cPannel и WebMin, они также небезопасны. Последствия взлома также велики: вы теряете всю систему, и вам придется переустанавливать с нуля, когда вас взломают.
Так же, как вы не хотите использовать telnet, вы не хотите использовать http. Убедитесь, что вы используете HTTPS, и купите настоящий сертификат, в конце концов, передача пароля root через сеть - серьезная ошибка, и вы хотите убедиться, что он попадает на правильный сервер.
РЕДАКТИРОВАТЬ: Вы можете запустить cPannel в chroot, так что даже если он будет скомпрометирован, вы можете просто создать новый chroot. Это также мягкая тюрьма, которая позволяет вам точно определить, к какому root имеет доступ.
Вы можете создать символьную ссылку на файлы в корневую веб-папку, htaccess для полубезопасности (поверх вашего php auth), написать скрипт для его преобразования ... тогда вам просто нужно перезапустить процесс nginx, когда файлы будут изменены.
www.cyberciti.biz/faq/freebsd-configure-nginx-php-fastcgi-server/
Вы можете использовать что-то вроде следующего, чтобы отслеживать изменения, отправлять вам электронное письмо, когда они меняются (с изменениями), и перезапускать процесс nginx с помощью скрипта.
http://inotify-tools.sourceforge.net/
Это было бы излишним, если бы вы могли обнаруживать его через cron примерно каждую минуту ..
Идея №1: Используйте марионетку, чтобы направлять изменения в ваши файлы конфигурации.
Если вам нужно отредактировать файлы, попробуйте: Создайте сценарий PHP, который редактирует его собственную локальную копию. Затем это проверяется в локальном репозитории SVN. Затем, используя svn-externals, единственное, что вам нужно сделать как root, - это выполнить svn update
в конфигурационных файлах nginx (которые, конечно, вы уже отметили в SVN) и ваш set.
Сценарий обновления может запускаться в задании cron.