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

Запустите команду от имени другого пользователя в apache

У меня есть веб-приложение, которое запускает программу, которой требуется X. Я использую xvfb для ее запуска; Я хочу запустить его как другой пользователь.

Я, наверное, мог бы сделать sudo -u username -p password my command. Однако мне не очень нравится хранить пароль пользователя в виде обычного текста.

Есть ли более «умный» способ сделать это?

Использовать suEXEC что позволяет запускать сценарий как владелец файла, а не как пользователь веб-сервера.

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

Если, конечно, вам не нужно запускать несколько разных команд через Sudo как пользователь Apache. Это может вызвать затруднения, если вам нужно добавить привилегии sudo для каждой из команд.

Если вам когда-либо понадобится сделать это вне Apache, вот более общее решение.

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

Пример:

# Replace $MYCOMMAND, $USERNAME, $GROUPNAME, and $MYSCRIPTNAME below
# In this case $GROUPNAME should probably be apache
su
touch $MYSCRIPTNAME
chown $USERNAME:$GROUPNAME $MYSCRIPTNAME
chmod 4750 $MYSCRIPTNAME # setuid, read/execute for group, none for others
echo '#!/bin/sh' >> $MYSCRIPTNAME
echo "sudo -u $USERNAME $MYCOMMAND" >> $MYSCRIPTNAME

Возможно, сейчас немного поздно отвечать, но я чувствую, что NOPASSWD особенность sudo необходимо упомянуть.

Например, в /etc/sudoers (при условии, что apache - это пользователь, запустивший веб-сервер):

User_Alias WWW = apache

WWW ALL =(username) NOPASSWD: my_command

И вызвать sudo -u username my_command. Нет необходимости хранить пароль, и вы разрешаете выполнение только веб-серверу. my_command как имя пользователя.

Пользователь username все еще может сохранить свой пароль.