我希望使用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-需要的基础。
答案 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文档页面:
答案 2 :(得分:6)
我已经在Django https://pypi.org/project/django-revproxy/端使用代理解决了这个问题。因此Flower被隐藏在Django身份验证后面,比基本身份验证更灵活。而且您不需要NGINX中的重写规则。
urlpatterns = [
re_path(r'^flower/?(?P<path>.*)$', FlowerProxyView.as_view()),
...
]
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
URL前缀必须移到代理路径:https://github.com/mher/flower/pull/766
urlpatterns = [
FlowerProxyView.as_url(),
...
]
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]。用户名和密码是登录到您选择的数据库的凭据。
如果你指的是这个登录,不能简单地禁用/删除他们的登录就足够了吗?