Выполнение команд, хотя сценарии PHP/Perl как priviledged пользователь на Linux

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

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

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

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

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

7
задан jtd 12 May 2010 в 20:30
поделиться

3 ответа

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

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

2
ответ дан 7 December 2019 в 07:41
поделиться

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

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

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

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

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

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

НТН

С.

0
ответ дан 7 December 2019 в 07:41
поделиться

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

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

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

5
ответ дан 7 December 2019 в 07:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: