CeleryタスクをFlowerで管理する際には、セキュリティが重要な考慮事項となります。デフォルトでは、FlowerはDjangoの認証システムと統合されておらず、不正アクセスに対して脆弱です。

このガイドでは、django-revproxyパッケージを利用してDjango認証を用いてFlowerを保護する方法を紹介します。

なぜFlowerを保護する必要があるのか?

FlowerはCeleryタスクの強力な監視ツールですが、公開されたままにしておくと、悪用や不正なデータアクセスにつながる可能性があります。Django認証でFlowerを保護することで、承認されたユーザーのみが機密のタスク関連情報にアクセスできるようになります。

ツールとセットアップ

これを実現するために、以下のツールを使用します。
 

  1. django-revproxy:外部サービスへのリバースプロキシリクエストを許可するDjangoパッケージ。
     

  2. カスタム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にアクセスします。ダッシュボードにアクセスするには、スーパーユーザーとしてログインしていることを確認してください。

さらなる考察

  1. IPによるアクセス制限:さらにセキュリティを高めるために、IPアドレスでFlowerダッシュボードへのアクセスを制限することを検討してください。
     

  2. SSL/TLS:Flowerダッシュボードにアクセスする際に、データの転送を暗号化するためにHTTPSを使用してください。
     

  3. レート制限:悪用を防ぐために、レート制限を実装してください。
     

  4. 監査ログ:使用状況を監視するために、アクセス試行をログに記録します。

結論

Django認証を使用してFlowerを保護することは、Celeryタスクデータを保護するための簡単ながらも効果的な方法です。django-revproxyとカスタムの権限ベースのビューを統合することで、承認されたユーザーのみがFlowerダッシュボードにアクセスできるようにすることができます。

同様のセキュリティ対策を実装したことがありますか? あなたの考えを下のコメント欄で共有してください!