Настройте Celery таким образом, чтобы он игнорировал ненадежные типы контента, а не сбой - PullRequest
0 голосов
/ 10 сентября 2018

Я хочу использовать исключительно сериализатор auth в сельдерее. В документах приведен следующий фрагмент кода для включения сериализатора безопасности auth.

app.conf.update(
    security_key='...',
    security_certificate='...',
    security_cert_store='...',
    task_serializer='auth')

app.setup_security()

Рабочие по-прежнему будут обрабатывать неподписанные задачи, которые я отправляю в рабочую очередь, даже если эта функция подписи включена. Вид поражения цели, поэтому я решил добавить следующую конфигурацию, чтобы заставить Celery принимать только задачи, сериализованные сериализатором auth.

app.conf.update(
    # config from above
    accept_content=['auth'],
    result_serializer='auth')

Задачи, сериализованные с помощью сериализатора json, теперь отбрасываются, но вместо того, чтобы их игнорировать, весь работник Celery просто падает. Это потенциальный механизм DOS, и его не должно быть. Я приложил журналы для такого сбоя ниже.

8-09-09 21:55:15,009: CRITICAL/MainProcess] Unrecoverable error: ContentDisallowed('Refusing to deserialize untrusted content of type json (application/json)',)
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/celery/worker/worker.py", line 205, in start
    self.blueprint.start(self)
  File "/usr/lib/python3.6/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/usr/lib/python3.6/site-packages/celery/bootsteps.py", line 369, in start
    return self.obj.start()
  File "/usr/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 317, in start
    blueprint.start(self)
  File "/usr/lib/python3.6/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/usr/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 593, in start
    c.loop(*c.loop_args())
  File "/usr/lib/python3.6/site-packages/celery/worker/loops.py", line 91, in asynloop
    next(loop)
  File "/usr/lib/python3.6/site-packages/kombu/asynchronous/hub.py", line 354, in create_loop
    cb(*cbargs)
  File "/usr/lib/python3.6/site-packages/kombu/transport/redis.py", line 1040, in on_readable
    self.cycle.on_readable(fileno)
  File "/usr/lib/python3.6/site-packages/kombu/transport/redis.py", line 337, in on_readable
    chan.handlers[type]()
  File "/usr/lib/python3.6/site-packages/kombu/transport/redis.py", line 724, in _brpop_read
    self.connection._deliver(loads(bytes_to_str(item)), dest)
  File "/usr/lib/python3.6/site-packages/kombu/transport/virtual/base.py", line 983, in _deliver
    callback(message)
  File "/usr/lib/python3.6/site-packages/kombu/transport/virtual/base.py", line 633, in _callback
    return callback(message)
  File "/usr/lib/python3.6/site-packages/kombu/messaging.py", line 624, in _receive_callback
    return on_m(message) if on_m else self.receive(decoded, message)
  File "/usr/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 567, in on_task_received
    callbacks,
  File "/usr/lib/python3.6/site-packages/celery/worker/strategy.py", line 136, in task_message_handler
    if body is None and 'args' not in message.payload:
  File "/usr/lib/python3.6/site-packages/kombu/message.py", line 207, in payload
    return self._decoded_cache if self._decoded_cache else self.decode()
  File "/usr/lib/python3.6/site-packages/kombu/message.py", line 192, in decode
    self._decoded_cache = self._decode()
  File "/usr/lib/python3.6/site-packages/kombu/message.py", line 197, in _decode
    self.content_encoding, accept=self.accept)
  File "/usr/lib/python3.6/site-packages/kombu/serialization.py", line 253, in loads
    raise self._for_untrusted_content(content_type, 'untrusted')
kombu.exceptions.ContentDisallowed: Refusing to deserialize untrusted content of type json (application/json)
[2018-09-09 21:55:16,024: WARNING/MainProcess] Restoring 1 unacknowledged message(s)

 -------------- celery@e754df01b874 v4.2.1 (windowlicker)
---- **** ----- 
--- * ***  * -- Linux-4.9.93-linuxkit-aufs-x86_64-with 2018-09-09 21:55:02
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         blep:0x7faa53d3ccf8
- ** ---------- .> transport:   redis://redis:6379/0
- ** ---------- .> results:     redis://redis:6379/0
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> blep         exchange=blep(direct) key=blep


[tasks]
  . blep.tasks.blep_task

Как правильно настроить Celery для использования сериализатора auth и игнорировать или отбрасывать - вместо сбоя - любые ненадежные задачи / сообщения от брокера?

...