Django認証を用いたCelery Flowerのセキュリティ確保
By hientd, at: 2025年1月13日10:04
Estimated Reading Time: __READING_TIME__ minutes


CeleryタスクをFlowerで管理する際には、セキュリティが重要な考慮事項となります。デフォルトでは、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{}.*)$".format(cls.url_prefix), cls.as_view()
)
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ダッシュボードにアクセスできるようにすることができます。
同様のセキュリティ対策を実装したことがありますか? あなたの考えを下のコメント欄で共有してください!