芹菜花安全生产

时间:2013-10-30 17:13:46

标签: django nginx celery flower

我希望使用Flower(https://github.com/mher/flower)来监控我的Celery任务,而不是像他们的文档(http://docs.celeryproject.org/en/latest/userguide/monitoring.html#flower-real-time-celery-web-monitor)中所推荐的django-admin一样。但是,因为我是新手,所以我对Flower的页面仅基于HTTP而不是HTTPS的方式感到有些困惑。如何为我的Celery任务启用安全性,以便任何旧用户都无法访问无需登录的网站http://flowerserver.com:5555并更改某些内容?

我已经考虑过Celery的own documentation,但不幸的是,他们没有提到如何保护Flower的api或web ui。它只是说:[Need more text here]

谢谢!

更新:我的问题部分与此处重复:How do I add authentication and endpoint to Django Celery Flower Monitoring?

但是,我在这里通过询问如何在同一个远程机器上使用包含nginx,gunicorn和celery的环境来运行它来澄清他的问题。我也想知道如何设置Flower的外部可访问网址,但是如果可能的话,也更喜欢https而不是http(或某种方式保护webui并远程访问它)。我还需要知道,对于任何可能获得Flower内部API访问权限的人来说,离开Flower运行是否存在相当大的安全风险,以及确保实现这一目标的最佳方式是什么,或者它是否应该完全禁用并仅用于as-需要的基础。

6 个答案:

答案 0 :(得分:39)

您可以使用--auth标志运行花,该标志将使用特定的Google电子邮件进行身份验证:

celery flower --auth=your.email@gmail.com

修改1

新版本的Flower需要更多标记和已注册的OAuth2客户端Google Developer Console

celery flower --auth=your.email@gmail.com --oauth2_key="client_id" --oauth2_secret="client_secret" --oauth2_redirect_uri="http://example.com:5555/login"

oauth2_redirect_uri必须是实际的花卉登录网址,并且还必须添加到Google开发者控制台中的授权重定向网址。

不幸的是,此功能在当前稳定版0.7.2中无法正常运行,但现在已使用此commit在开发版0.8.0-dev中修复。

编辑2

您可以使用basic authentication配置Flower:

celery flower --basic_auth=user1:password1,user2:password2

然后为除localhost之外的所有端口阻止5555端口,并为nginx或apache配置反向代理:

ProxyRequests off
ProxyPreserveHost On
ProxyPass / http://localhost:5555

然后确保代理模式已启用:

sudo a2enmod proxy
sudo a2enmod proxy_http

如果您无法在单独的子域名设置,例如flower.example.com(上面的配置),则可以为example.com/flower设置它:

使用url_prefix运行花:

celery flower --url_prefix=flower --basic_auth=user1:password1,user2:password2

在apache config中:

ProxyPass /flower http://localhost:5555

当然,确保配置了SSL,否则没有意义:)

答案 1 :(得分:11)

我想在我的网络服务器的子目录上开花,所以我的nginx反向代理配置如下所示:

location /flower/ {
    proxy_pass http://localhost:5555/;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Protocol $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;

    auth_basic  "Restricted";
    auth_basic_user_file  /etc/nginx/.htpasswd;
}

现在我可以通过www.example.com/flower

开花(密码保护)了

大部分内容来自关于配置nginx反向代理的Flower文档页面:

http://flower.readthedocs.org/en/latest/reverse-proxy.html

答案 2 :(得分:6)

我已经在Django https://pypi.org/project/django-revproxy/端使用代理解决了这个问题。因此Flower被隐藏在Django身份验证后面,比基本身份验证更灵活。而且您不需要NGINX中的重写规则。

urls.py

urlpatterns = [
    re_path(r'^flower/?(?P<path>.*)$', FlowerProxyView.as_view()),
    ...
]

views.py

from django.contrib.auth.mixins import UserPassesTestMixin
from revproxy.views import ProxyView


class FlowerProxyView(UserPassesTestMixin, ProxyView):
    # `flower` is Docker container, you can use `localhost` instead
    upstream = 'http://flower:5555'

    def test_func(self):
        return self.request.user.is_superuser

积分https://www.webnach.ru/django-auth-for-celery-flower.html

花朵0.9.5及更高版本

URL前缀必须移到代理路径:https://github.com/mher/flower/pull/766

urls.py

urlpatterns = [
    FlowerProxyView.as_url(),
    ...
]

views.py

class FlowerProxyView(UserPassesTestMixin, ProxyView):
    upstream = 'http://{}:{}'.format('flower', 5555)
    url_prefix = 'flower'
    rewrite = (
        (r'^/{}$'.format(url_prefix), r'/{}/'.format(url_prefix)),
     )

    def test_func(self):
        return self.request.user.is_superuser

    @classmethod
    def as_url(cls):
        return re_path(r'^(?P<path>{}.*)$'.format(cls.url_prefix), cls.as_view())

答案 3 :(得分:2)

我使用代理视图遵循@petr-přikryl 的方法。但是我无法让它验证身份验证(我认为 test_func 从未被调用过)。相反,我选择将其嵌入到 Django Admin 视图中,并使用 AdminSite.admin_view()(作为 described here)使用 Django Admin 身份验证包装视图。

具体来说,我做了以下更改:

# Pipfile
[packages]
...
django-revproxy="*"
# admin.py
class MyAdminSite(admin.AdminSite):
    # ...
    def get_urls(self):
        from django.urls import re_path

        # Because this is hosted in the root `urls.py` under `/admin` this 
        # makes the total prefix /admin/flower
        urls = super().get_urls()
        urls += [
            re_path(
                r"^(?P<path>flower.*)$",
                self.admin_view(FlowerProxyView.as_view()),
            )
        ]
        return urls
# views.py
from __future__ import annotations

from django.urls import re_path

from revproxy.views import ProxyView


class FlowerProxyView(ProxyView):
    # Need `/admin/` here because the embedded view in the admin app drops the
    # `/admin` prefix before sending the URL to the ProxyView
    upstream = "http://{}:{}/admin/".format("localhost", 5555)

最后,我们需要确保在运行 flower 时设置了 --url_prefix,所以我将它设置为在我们的生产和开发环境中运行:

celery flower --app=my_app.celery:app --url_prefix=admin/flower

答案 4 :(得分:1)

是不是花上没有auth,因为它只是与代理商交谈,但是如果你通过SSL运行它,那么基本的auth应该足够好了。

答案 5 :(得分:0)

HTTP和HTTPS如何影响Celery安全性?您指的是哪些用户登录?

通过附加到工作人员来监视Celery队列。设置Flower时,您需要提供连接字符串[broker]:// [user_name]:[password] @ [database_address]:[port] / [instance]。用户名和密码是登录到您选择的数据库的凭据。

如果你指的是这个登录,不能简单地禁用/删除他们的登录就足够了吗?