У меня есть веб-приложение, которое запускает программу, которой требуется 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
все еще может сохранить свой пароль.