我有一个 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
仍然可以保留其密码。