uwsgi以root身份运行我的应用程序,但不应该

时间:2015-10-02 15:30:12

标签: python flask permissions uwsgi supervisor

我有一个Flask个应用uwsgi通过nginx投放,全部由supervisord控制

我已将user中的/etc/supervisor.conf参数设置为user=webdev

../myapp/uwsgi_app.ini/etc/uwsgi/emperor.ini中,我设置了uid=webdevgid=www-data

问题是,我在我的应用中遇到了权限问题。在我的一个视图中使用以下print语句,我发现该应用程序正在以root运行。这导致函数调用中出现需要创建目录的问题。

以下所有打印语句都位于Flask视图中。

print 'group!! {}'.format(os.getegid())
print 'user id!! {}'.format(os.getuid())
print 'user!! {}'.format(os.path.expanduser('~'))

导致......

group!! 1000
user id!! 1000
user!! /root

编辑:我添加了以下打印语句:

from subprocess import call
print 'here is user',
call('echo $USER', shell=True)
print 'here is home',
call('echo $HOME', shell=True)

打印

here is user root
here is home /root

在服务器上的终端中,我输入$ id,我得到uid=1000(webdev) gid=1000(webdev) groups=1000(webdev)

以下是$ getent group

的输出
root:x:0:
...
webdev:x:1000:
...
www-data:x:1001:nginx
nginx:x:996:nginx
...

以下是/etc/passwd

中的一些行
webdev:x:1000:1000::/home/webdev:/bin/bash

1 个答案:

答案 0 :(得分:1)

这很奇怪,因为通常在以root身份运行时您不会遇到任何权限问题(事实上相反,在这种情况下,您拥有的权限超过了必要的权限)。

我觉得您可能正在以webdev而不是root运行该流程。您可以尝试拨打os.getuid()而不是os.expanduser()吗?

当没有为用户设置主目录时,/root目录通常用作默认目录。您还可以查看/etc/passwd/的{​​{1}}条目,了解主目录的设置。

如果您未以webdev身份运行,则您的权限问题可能与其他内容有关(可能root不是您正在撰写的目录的所有者在?)。

编辑:如果您希望用户webdev拥有正确的主目录,请运行以下webdev

root

之后,mkdir -p /home/webdev usermod -m -d /home/webdev webdev 应显示正确的主目录。

编辑2:我错误地认为os.expanduser()不是普通用户,而只是您正在使用的最低配置服务用户名,例如webdev。我的错。

无论如何,正如我在评论中提到的那样,重要的是你的www值。您没有以root用户身份运行,因为uid不是0.在UNIX术语中没有其他问题。

我认为我想出来了。指定uid&时,uWSGI的工作方式uid选项最初仍以gid运行,但会立即致电root以取消其权限并切换到您提供的setuid()uid。这可以解释您所看到的行为:仍然为gid配置了环境,即使uWSGI现在以root运行,webdev$USER也必须仍然指向$HOME

您可以尝试通过在Flask视图中添加此行来测试它:

root

这将在webdev的主目录中创建一个空文件。现在以[{1}}身份登录,转到open('/home/webdev/testfile', 'a').close() 并执行webdev。如果/home/webdev的所有者为ls -l,您就会以testfile的身份运行。

如果您可以确定,那么您必须做的就是编写所有代码,假设webdevwebdev设置错误。我不确定它会如何影响您的代码,但请尝试避免相对路径(可以假设默认目标是您错误的主目录)。