【问题标题】:uwsgi is running my app as root, but shouldn't beuwsgi 以 root 身份运行我的应用程序,但不应该是
【发布时间】:2015-12-30 20:55:12
【问题描述】:

我有一个通过uwsgi 运行的Flask 应用程序,由nginx 提供服务,所有这些都由supervisord 控制

我已将/etc/supervisor.conf 中的user 参数设置为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

【问题讨论】:

    标签: python flask permissions uwsgi supervisord


    【解决方案1】:

    这很奇怪,因为通常以root 运行时您不会遇到任何权限问题(实际上相反,在这种情况下您将拥有比必要更多的权限)。

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

    /rootdirectory 通常在没有为用户设置主目录时用作默认目录。您还可以检查您的 /etc/passwd/ 以获取 webdev 的条目,以查看主目录设置的内容。

    如果您不是以root 运行,则您的权限问题可能与其他问题有关(也许webdev 不是您正在写入的目录的所有者?)。

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

    mkdir -p /home/webdev
    usermod -m -d /home/webdev webdev
    

    之后,os.expanduser() 应该会显示正确的主目录。

    编辑 2:我错误地假设 webdev 不是普通用户,而只是一个最低配置的服务用户名,例如您正在使用的 www。我的错。

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

    我想我想通了。当您指定uidgid 选项时,uWSGI 的工作方式是它最初仍以root 运行,但立即调用setuid() 以放弃其权限并切换到您提供的uidgid。这可以解释您所看到的行为:环境仍然为root 配置,即使uWSGI 现在以webdev 运行,$USER$HOME 必须仍然指向root

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

    open('/home/webdev/testfile', 'a').close()
    

    这将在 webdev 的主目录中创建一个空文件。现在以webdev 登录,然后转到/home/webdev 并执行ls -l。如果testfile 的所有者是webdev,那么您正在以webdev 运行。

    如果你能确定这一点,那么你要做的就是编写所有代码,假设 $HOME$USER 设置错误。我不确定它将如何影响您的代码,但请尝试避免使用相对路径(可能会假设默认目标是您错误的主目录)。

    【讨论】:

    • 已编辑问题以添加用户 ID(组 ID 和 os.expanduser() 已在其中)。我很困惑为什么它将用户 ID 和组 ID 显示为 webdev,但 expanduser() 显示 root。 (我不想以root运行,我想以webdev运行)
    • @Brian,你不是root 运行。似乎expanduser()webdev 的主目录感到困惑,它可能设置为/root 或根本没有设置。如果你想解决这个问题,请参阅我编辑的答案。
    • 如果我在 python 终端中运行os.path.expanduser('~'),我会显示正确的主目录。此外,运行 echo $HOME 会给我正确的目录。
    • @gbt 如果我使用命令subprocess.call('echo $USER', shell=True)subprocess.call('echo $HOME', shell=True),我会得到root/root。原来我是以 root 身份运行的。
    • 看起来uwsgi设置只允许设置用户ID和组ID(uid=webdev, gid=www-data)。我对整个系统如何以不同方式对待用户 IDS 和用户名感到困惑。正如您所指出的,用户 ID 与 root 不匹配,但程序在尝试使用 os.expanduser('~'). I tried the testfile trick and sure enough, webdev 确定主目录时感到窒息,这是该文件的所有者。问题是,错误发生在第三方库 (bokeh) 中,所以我无法安全地开始更改 bokeh
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2014-07-16
    相关资源
    最近更新 更多