Вопрос: Разрешить Apache запускать команду как другого пользователя


У меня есть скрипт, который выполняет несколько команд в домашнем каталоге пользователя. Файлы принадлежат пользователю и Apache ( www-data группа) имеет только привилегии чтения для них. Сценарий должен выполняться по требованию PHP через exec(), и выполняет некоторые удаления / распаковки файлов, которые не работают, поскольку Apache не имеет прав на запись в каталоги.

Я пробовал редактировать sudoers выполните следующие действия:

www-data ALL=(user) NOPASSWD: /bin/su user -c /home/user/bin/script.sh

но он подсказывает мне пароль пользователя

Я тоже пробовал

www-data ALL=(root) NOPASSWD: /usr/bin/sudo su user -c /home/user/bin/script.sh

но это побуждает www-data«s sudo пароль

Как я могу заставить это работать без пароля?


5
2017-07-03 15:47


Источник




Ответы:


Наконец, он работал с этой строкой:

www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh

Поскольку мне нужны аргументы для моего скрипта, мне пришлось добавить «оболочку в стиле оболочки» в конце строки:

www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh [[\:alpha\:]]*

Это не совсем то, что я искал, но он работает (т. Е. Бывает, что мои аргументы начинаются с буквенных символов, но на самом деле я хотел бы, чтобы выражение соответствовало только буквенно-цифровым символам, тире и периодам).

Я не совсем знаком с командами оболочки и классами символов POSIX, тот, который я использую, в основном скопирован из руководства sudoers. Любой, кто знает, как это относится к этой проблеме, оставьте свои комментарии!


4
2017-07-04 20:42





Почему вы используете su внутри sudo? (или, что еще хуже, sudo внутри sudo)

www-data ALL=(user) NOPASSWD: /bin/bash /home/user/bin/script.sh

Это должно сработать.


3
2017-07-03 16:09



Я уже пробовал ваше решение, и скрипт все еще управляется www-данными, поэтому я подумал об использовании sudo su user для переключения пользователя перед запуском скрипта ... - Andrei
Читать man sudo и взгляните на параметр -u, - joschi
Благодаря ! Мне удалось заставить его работать, добавив эту строку в файл sudoers: www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh Однако он не работает с аргументами, и мой скрипт использует аргументы ... - Andrei
Nevermind, нашел решение здесь: gratisoft.us/sudo/sudoers.man.html - Andrei
Ehm, работает sudo в sudo является своего рода неудачей. Почему бы не позвонить sudo -u $USER /home/user/bin/script.sh в первую очередь? - joschi


Если бы это был не скрипт, вы могли бы просто suid'd исполняемый файл, и установите группу & разрешения, чтобы только веб-сервер мог ее выполнить.

Вы также можете использовать suExec (только apache) или CGIWrap (любой веб-сервер) для запуска CGI под другими пользователями. Есть также suPHP специально для PHP в режиме без CGI на Apache.

Они предлагают несколько разные варианты (например, CGIwrap может устанавливать ограничения ресурсов), но в целом они будут запускать программы в качестве альтернативных пользователей.


1
2017-07-04 21:13



Из всех вы упомянули, suPHP кажется, проще всего настроить и лучше всего подходит для моих нужд. suExecпоскольку я понимаю, что это требует изменений в способе работы Apache с PHP, и мне действительно нужна эта функция только для одного скрипта. В чем преимущества использования этих других решений или редактирования файла sudoers? С точки зрения безопасности, возможно? - Andrei
@Andrei: для одного сценария одновременно, sudo должно быть хорошо, если вы ограничиваете его только скриптом с фиксированным набором аргументов и запускаете его как пользователь без полномочий root; те, о которых я говорил, полезны, когда у вас есть набор сценариев, которые все должны запускаться как один пользователь, например. устанавливая что-то, что вы downlaoded, и вы не хотите открывать все для пользователя веб-сервера. Они также полезны для многопользовательских систем, поэтому каждый пользователь может установить CGI, но не может взаимодействовать со сценариями друг друга. - Joe H.
Спасибо за это объяснение! Я запускаю этот скрипт на выделенном сервере, моя главная задача - хранить www-данные, делая то, что должно быть сделано (чтение некоторых файлов и запись только в некоторых каталогах). У меня все еще возникают проблемы с командами оболочки, необходимыми для включения аргументов для команд в sudoers, хотя ... (см. Ниже) - Andrei
@Andrei: любое из решений, о которых я упоминал, должно помешать вам справиться с вопросом о аргументах. Вы также можете разрешить скрипту принимать любые аргументы, а затем выполнять проверку аргументов в скрипте, а не в файле sudoers. - Joe H.


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

APACHEUSER        ALL=(USERNAME)        ALL
Defaults:APACHEUSER       targetpw
Defaults:APACHEUSER             !requiretty

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

echo password | sudo -u username -S bash -c command_here arguments_here

Просто убедитесь, что для этого используется выделенный пользователь, и не ставьте этого пользователя в группу колес.

смотрите также Вот

Герт


1
2018-06-07 09:10