【问题标题】:Deploying a Flask app with root privileges使用 root 权限部署 Flask 应用程序
【发布时间】:2017-05-04 01:24:51
【问题描述】:

我在 Raspberry Pi 上托管了一个烧瓶 Web 应用程序,它可以控制我的 LED 灯条。当我以 root 用户身份使用 python 运行服务器时,这一切都很好,但是我很难使用 Apache mod_wsgi 部署它。我想使用htttps,所以部署它似乎是必要的,但Apache似乎不允许运行具有root权限的服务器。 Root 是通过烧瓶服务器中导入的库控制灯光所必需的。

有没有办法部署具有 root 权限的烧瓶服务器?如果没有,是否可以在不部署的情况下使用 https(来自letsencrypt.org)?有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: python apache flask mod-wsgi


    【解决方案1】:

    出于安全原因,我不会以 root 身份运行 Web 服务器。

    相反,我建议:

    1. 将 web 用户添加到 /etc/sudoers - 没有密码。理想情况下,只允许您希望以 root 身份运行的命令。
    2. 使用 sudo [command] 运行命令

    您提到部署,如果您将其打包成 rpm,我会将 sudo 定义放在 /etc/sudoers.d/youpackage

    另一种选择是拆分您的应用程序并使用某种消息传递系统 - 通过在数据库表中包含行或使用消息传递服务器,例如 rabbit mq(还有其他服务器,但我发现它很容易设置)。以 root 身份运行的单独进程将实际打开/关闭灯。您的前端会简单地发送一条消息,例如“关灯”,而另一个进程(可以以 root 身份运行)会在需要时收到一条消息。这种方法的优点是web进程永远没有任何root权限,即使它有漏洞,损坏也是有限的。

    【讨论】:

    • 当你说“用 sudo [command] 运行命令”时,你的意思是我应该用子进程调用来控制灯光,还是用 sudo 启动服务器?
    • 不确定您需要以 root 身份做什么 - 我认为它正在调用命令/shell 脚本。出于安全原因,您不希望网络服务器作为 root。另一种选择是拆分您的应用程序并使用某种消息传递 - 数据库表或像 rabbit mq 这样的消息传递服务器,并让其他进程以 root 身份运行。您的前端会简单地发送一条消息,例如“关灯”,然后其他进程会接收它
    • 我有一个需要访问 /dev/mem 的 python LED 库。通常我只是导入它并使用它,但这需要整个服务器以root身份运行。我认为将网络端与光控端分开的想法似乎是合乎逻辑的。我将研究进程间通信。谢谢!
    • 很高兴,这样做肯定更好。如果您愿意使用rabbitmq...使用他们的第一个教程需要几分钟才能获得一个从另一个进程接收消息的函数,它使您的代码保持简单
    • rabbitmq 似乎是一个不错的选择。我现在正在学习教程。再次感谢!
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2018-05-24
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多