Подтвердить что ты не робот

Как запретить сериализацию селитры в сельдерее

Сельдерей по умолчанию использует рассол в качестве метода его сериализации для задач. Как отмечено в FAQ, это представляет собой дыру в безопасности. Celery позволяет вам настроить, как сериализовать задачи, используя параметр конфигурации CELERY_TASK_SERIALIZER.

Но это не решает проблему безопасности. Даже если задачи сериализованы с помощью JSON или аналогичных, рабочие все равно будут выполнять задачи, вставленные в очередь с сериализацией pickle - они просто отвечают на параметр content-type в сообщении. Поэтому любой, кто может писать в очередь задач, может эффективно обрабатывать рабочие процессы, пиши вредоносные маринованные объекты.

Как я могу помешать рабочим потокам запускать задачи, сериализованные с помощью рассола?

4b9b3361

Ответ 1

Я получил ответ от списка рассылки сельдерей-пользователей (от Ask Solem, чтобы быть конкретным). Добавьте эти две строки в конфигурацию (celeryconfig/settings):

from kombu import serialization
serialization.registry._decoders.pop("application/x-python-serialize")

Ответ 2

Я получал "ContentDisallowed: отказ от десериализации недоверенного содержимого типа pickle (application/x-python-serialize)"

имеющий:

CELERY_ACCEPT_CONTENT = ['json']

было недостаточно... Мне также нужно было добавить следующие настройки:

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

Ответ 3

Теперь, когда Celery поддерживает конфигурацию для каждого приложения, существует более чистый способ ограничить контент, который будет выполнять потребитель.

c = celery.Celery()
c.conf.update(CELERY_ACCEPT_CONTENT = ['json'])

Подробные сведения см. в Документах по сельдерей в безопасности и более расширенных параметрах безопасности, таких как подписание содержимого.