Назад | Перейти на главную страницу

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

У меня есть сценарий, который выполняет несколько команд в домашнем каталоге пользователя. Файлы принадлежат пользователю и Apache ( www-data group) имеет только права чтения для них. Скрипт должен выполняться по запросу 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с sudo пароль

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

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

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. Любой, кто знает, как это применимо к такого рода проблемам, оставьте, пожалуйста, свои комментарии!

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

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

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

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

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

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

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

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

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

Geert

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

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

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