在 apache 中以另一个用户身份运行命令

在 apache 中以另一个用户身份运行命令

我有一个 Web 应用程序,它运行一个需要 X 的程序。我正在使用 xvfb 来启动它;我想以另一个用户的身份运行它。

我可能可以这样做sudo -u username -p password my command。但是,我不太愿意以纯文本形式存储用户密码。

有没有“更聪明”的方法来做到这一点?

答案1

使用执行指令它允许脚本以文件所有者的身份运行,而不是以网络服务器用户的身份运行。

答案2

我见过的做法是,只为 Apache 用户授予一个非常具体的命令(在我们的例子中是 apache2ctrl restart)的 sudo 权限。您不需要使用密码,如果您将其以纯文本形式存储在 Apache 用户可以读取的地方,那么您可能没有密码。

当然,除非您需要以 Apache 用户身份通过​​ Sudo 运行多个不同的命令。如果您必须为每个命令添加 sudo 权限,这可能会很尴尬。

答案3

如果您需要在任何时候在 Apache 之外执行此操作,这里有一个更通用的解决方案。

要允许一个用户以另一个用户的身份重复运行特定命令,您可以创建该用户拥有的 shell 脚本,并使用设置用户标识位启用,只需运行您需要的命令。通过将组所有权设置为 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 是运行 Web 服务器的用户):

User_Alias WWW = apache

WWW ALL =(username) NOPASSWD: my_command

并调用sudo -u username my_command。无需存储密码,并且只允许 Web 服务器my_command以用户名执行。

用户username仍然可以保留其密码。

相关内容