Что это означает в конкретных терминах?
Я считаю, что детали находятся в #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 и реинициализировать, немного получается, что если вы сделаете это, по крайней мере, если есть потоки в либо хозяин, либо сервер, все идет в ад. Так что не делайте этого, просто семя.
Разве у пушки не есть модель предкара/форксвера, что сделало бы это неуместным в первую очередь? Или вы вручную вызываете 'os.fork' себя где-то или что-то еще? – abarnert
Это хороший момент! – Gustavo