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

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

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

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

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

решение1

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

решение2

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

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

решение3

Если вам в какой-то момент понадобится сделать это вне 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

решение4

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

Например, /etc/sudoers(предполагается, что Apache — это пользователь, запускающий веб-сервер):

User_Alias WWW = apache

WWW ALL =(username) NOPASSWD: my_command

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

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

Связанный контент