Django認証によるCelery Flowerのセキュリティ保護
By hientd, at: 2025年1月13日10:04
Estimated Reading Time: __READING_TIME__ minutes


Celery FlowerとDjango認証によるセキュリティ強化
FlowerでCeleryタスクを管理する際には、セキュリティが重要な考慮事項となります。デフォルトでは、FlowerはDjangoの認証システムと統合されていないため、不正アクセスに対して脆弱です。
このガイドでは、django-revproxy
パッケージを利用してDjango認証を使用してFlowerをセキュリティで保護する方法を説明します。
Flowerのセキュリティ強化の理由
FlowerはCeleryタスクの強力な監視ツールを提供しますが、公開されたままにしておくと、悪用や不正なデータアクセスにつながる可能性があります。Django認証でFlowerをセキュリティで保護することで、権限のあるユーザーだけが機密のタスク関連情報にアクセスできるようになります。
ツールとセットアップ
これを実現するために、次のツールを使用します。
-
django-revproxy:外部サービスへのリクエストをリバースプロキシできるDjangoパッケージ。
-
カスタムDjangoビュー:ユーザーの権限を確認し、Flowerダッシュボードにリクエストを転送するビュー。
django-revproxy
のインストール
まず、django-revproxy
パッケージをインストールします。
pip install django-revproxy
詳細については、django-revproxyのドキュメントを参照してください。
実装
プロキシビューの作成
次のようなカスタムビュークラスを作成します。
-
django-revproxy
を使用して、Flowerダッシュボードへのリクエストをプロキシします。
-
スーパーユーザーのみがFlowerにアクセスできるように、ユーザーの権限を確認します。
実装は以下のとおりです。
from django.conf import settings
from django.contrib.auth.mixins import UserPassesTestMixin
from django.urls import re_path
from revproxy.views import ProxyView
class FlowerCustomProxyView(UserPassesTestMixin, ProxyView):
upstream = settings.FLOWER_URL
url_prefix = settings.FLOWER_URL_PREFIX
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()
)</path>
URLの設定
次に、アプリのURL設定にFlowerProxyView
を追加します。
from django.urls import include, path
from . import views
app_name = "misc"
urlpatterns = [
...
views.FlowerCustomProxyView.as_url(),
]
設定の構成
Djangoプロジェクトに次の設定を追加してください。
FLOWER_URL = "http://localhost:5555"
FLOWER_URL_PREFIX = "flower"
テスト
Django開発サーバーを起動します。
python manage.py runserver
Flowerを起動します。
celery -A your_project flower
ブラウザでhttp://localhost:5555
/flower
にアクセスします。ダッシュボードにアクセスするには、スーパーユーザーとしてログインしていることを確認してください。
さらなる考察
-
IPによるアクセス制限:セキュリティを強化するために、IPアドレスでFlowerダッシュボードへのアクセスを制限することを検討してください。
-
SSL/TLS:Flowerダッシュボードにアクセスする際のデータの転送を暗号化するために、HTTPSを使用してください。
-
レート制限:悪用を防ぐために、レート制限を実装してください。
-
監査ログ:使用状況を監視するために、アクセス試行をログに記録してください。
結論
Django認証でFlowerをセキュリティで保護することは、Celeryタスクデータを保護するためのシンプルながらも効果的な方法です。django-revproxy
とカスタムの権限ベースのビューを統合することで、権限のあるユーザーだけがFlowerダッシュボードにアクセスできるようになります。
同様のセキュリティ対策を実装したことがありますか? ご意見をコメント欄で共有してください!