Запуск команд через скрипты PHP / Perl от имени привилегированного пользователя в Linux - PullRequest
7 голосов
/ 13 мая 2010

Справочная информация : я пишу сценарий для компании, который позволит пользователям создавать учетные записи FTP через веб-интерфейс. В фоновом режиме скрипт должен запускать несколько команд:

  • Добавить пользователя в систему (useradd)
  • Открытие и редактирование различных файлов
  • почта пользователя через sendmail

и несколько других вещей ...

Я в основном ищу самый безопасный способ сделать это. Я слышал о методе setuid, методе sudo и, конечно, запуске httpd от имени привилегированного пользователя. Перед выполнением каких-либо команд будут проверены правильность введенных данных (т. Е. Только буквенно-цифровые символы в именах пользователей)

Какой метод используется популярными сценариями (например, webmin), поскольку он должен быть достаточно безопасным?

Ответы [ 3 ]

5 голосов
/ 13 мая 2010

Я бы настроил очередь, в которую веб-скрипт может писать.

Тогда мне нужно было бы прочитать какой-нибудь привилегированный процесс из этой очереди и предпринять соответствующие действия. Вы можете запустить скрипт командной строки с помощью задания cron или написать небольшой демон на PHP, который проверяет очередь и выполняет работу чаще, чем позволяет cron.

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

2 голосов
/ 13 мая 2010

Создайте сценарий, который принимает параметр командной строки, проверяет его и исполняет useradd. Добавьте пользователя httpd в файл sudoers с помощью директивы NOLOGIN, ТОЛЬКО для этого одного процесса.

Таким образом, вам не нужно беспокоиться о написании демона, который всегда будет работать с привилегиями root, и ваш скрипт также немедленно вернется. Если вы только что использовали корневой скрипт setuid, другие пользователи в той же системе могли выполнить ваш скрипт (если вы не проверили их действительный идентификатор пользователя).

0 голосов
/ 14 мая 2010

Начну с того, что запускать httpd от имени root - очень плохая идея.

Самый безопасный способ сделать это - иметь полное разделение привилегий между пользовательским интерфейсом веб-сервера и эффектором - один из очевидных способов сделать это - запустить сервер в качестве пользователя root, принимающего только локальные соединения, которые пользовательский интерфейс отправляет своему запросы к (простой способ сделать это через inetd / xinetd - это означает, что вам не нужно беспокоиться обо всех сложностях создания процесса демона).

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

Наконец, вам нужен четко определенный протокол, по которому пользовательский интерфейс и эффектор взаимодействуют.

Это намного сложнее, чем использование sudo, но более безопасно (например, sudo просто позволяет пользователям запускать определенные файлы в качестве другого uid - вы надеетесь, что файл содержит нужную программу).

У Setuid есть много тех же недостатков, что и у sudo, с дополнительным усложнением, заключающимся в том, что (в большинстве случаев), если он запускает другую программу - он будет делать то же, что и исходный uid.

НТН

С

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...