2015-04-20 2 views
0

документация для модуля «SSL» в стандартной библиотеке Python 2.7.9 говорит:Как работать с ограничениями PRNG OpenSSL в разветвленных процессах Python?

При использовании этого модуля в составе нескольких обработанным приложения (используя, например, в многопроцессорных или concurrent.futures модули), имейте в виду, что внутренний генератор случайных чисел OpenSSL неправильно обрабатывает разветвленные процессы. Приложения должны изменять состояние PRNG родительского процесса, если они используют любую функцию SSL с os.fork(). Любой успешный вызов RAND_add(), RAND_bytes() или RAND_pseudo_bytes() является достаточным.

Что это означает в конкретных терминах? Должен ли я вызвать одну из этих трех функций в мастер-процессе после каждой вилки?

Кроме того, применимо ли это к нескольким потокам?

В случае, если это имеет значение, у меня есть приложение Django, запущенное на сервере Gunicorn. Мастер-процесс ничего не делает с SSL, но рабочие делают.

+0

Разве у пушки не есть модель предкара/форксвера, что сделало бы это неуместным в первую очередь? Или вы вручную вызываете 'os.fork' себя где-то или что-то еще? – abarnert

+0

Это хороший момент! – Gustavo

ответ

1

Что это означает в конкретных терминах?

Я считаю, что детали находятся в #18747.

Основной риск состоит в том, что каждый ребенок получает копию состояния PRNG. Если вы разбудите двух детей, не касаясь PRNG между ними, они могут получить одинаковое состояние PRNG, предположительно позволяя атакам предсказания. NIST's CVE 2013-1900 описывает эквивалентный вектор атаки против Postgres как «генерирует недостаточно случайные числа, что может позволить удаленному аутентифицированному пользователю иметь неуказанный эффект». Не все это специфическое ...

Мастер-процесс ничего не делает с SSL, но рабочие делают.

Ну, проблема есть возможность не делать что-либо с помощью SSL между двумя вилками, так никогда не делать что-либо с помощью SSL довольно много гарантий, что ...

Кроме того, что, если вы абсолютно уверены, что вы никогда даже initialize SSL, тогда дети будут инициализировать (и семя) SSL для себя в первый раз, когда они им понадобятся. Я не уверен в хорошем способе убедить себя, что это происходит, но, возможно, стоит попробовать. (Может быть, monkeypatch SSL при запуске, а затем Unpatch его после развилки, так что если вы косвенно потрогать все умрет?)

Должен ли я вызвать одну из этих трех функций в мастер-процессе после каждой вилки?

Я бы ошибался на стороне осторожности. Это будет трудно сделать или проблема эффективности?

Если дело обстоит сложно, вы всегда можете засеять RNG в начале каждого ребенка. * Для традиционного сервера prefork, который запускает рабочего для каждого соединения, это может быть катастрофически неэффективным, но я уверен, что gunicorn doesn't work that way. Он создает пул работников (который, я думаю, по умолчанию имеет значение 2 * NCPU + 1) при запуске, возможно, он периодически их перерабатывает, но новые клиенты либо ждут свободного рабочего (в модели синхронизации), либо идут в gentent/asyncio рабочего/нить/и т.д..пул (в различных асинхронных моделях). Таким образом, стоимость времени запуска ребенка должна быть неактуальной. (Если я ошибаюсь, пожалуйста, проигнорируйте это предположение - или, лучше, исправьте мое незнание ...)

Кроме того, применимо ли это к нескольким потокам?

Нет, потоки будут (изменчиво) разделять одно и то же состояние RNG, а не копировать его, чтобы вы были в безопасности. (И, конечно, идет на gunicorn/GEvent микронитей тоже.)


* Первоначально я предложил или деинициализацию OpenSSL и реинициализировать, немного получается, что если вы сделаете это, по крайней мере, если есть потоки в либо хозяин, либо сервер, все идет в ад. Так что не делайте этого, просто семя.

+0

ОК. Таким образом, проблема, о которой они говорят, связана только с плохой случайностью, не так ли, как проблемы с Global Interpreter Lock (GIL), не так ли? – Gustavo

+1

@Gustavo: Верно, это просто плохая случайность. И тот факт, что кто-то пытается обойти его (по крайней мере, в программе со всеми тремя вилками, потоками и сигналами) может сильно испортить ситуацию, поэтому они хотели дать конкретный совет о том, как это сделать. – abarnert

Смежные вопросы