Контрольный список развертывания

Интернет - враждебная среда. Перед развертыванием проекта Django вам следует потратить некоторое время на то, чтобы просмотреть свои настройки с учетом безопасности, производительности и операций.

Django включает в себя множество функций безопасности . Некоторые из них встроены и всегда включены. Другие необязательны, потому что они не всегда подходят или неудобны для разработки. Например, принудительное использование HTTPS может не подходить для всех веб-сайтов и непрактично для локальной разработки.

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

Следующий контрольный список включает настройки, которые:

  • должен быть правильно настроен, чтобы Django обеспечивал ожидаемый уровень безопасности;
  • ожидается, что они будут отличаться в каждой среде;
  • включить дополнительные функции безопасности;
  • включить оптимизацию производительности;
  • предоставлять отчеты об ошибках.

Многие из этих настроек являются конфиденциальными и должны рассматриваться как конфиденциальные. Если вы выпускаете исходный код для своего проекта, обычной практикой является публикация подходящих настроек для разработки и использование модуля частных настроек для производства.

Беги manage.py check --deploy

Некоторые из описанных ниже проверок можно автоматизировать с помощью этой опции. Обязательно запустите его с файлом производственных настроек, как описано в документации по опции.check --deploy

Критические настройки

SECRET_KEY

Секретный ключ должен быть большим случайным значением и должен храниться в секрете.

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

Вместо того, чтобы жестко закодировать секретный ключ в вашем модуле настроек, рассмотрите возможность загрузки его из переменной среды:

import os
SECRET_KEY = os.environ['SECRET_KEY']

или из файла:

with open('/etc/secret_key.txt') as f:
    SECRET_KEY = f.read().strip()

DEBUG

Вы никогда не должны включать отладку в производственной среде.

Вы, безусловно, разрабатываете свой проект с помощью , поскольку это позволяет использовать такие удобные функции, как полная обратная связь в вашем браузере.DEBUG = True

Однако для производственной среды это действительно плохая идея, потому что из-за нее происходит утечка большого количества информации о вашем проекте: выдержки из исходного кода, локальные переменные, настройки, используемые библиотеки и т. Д.

Настройки, зависящие от среды

ALLOWED_HOSTS

Когда Django вообще не работает без подходящего значения для .DEBUG = FalseALLOWED_HOSTS

Этот параметр необходим для защиты вашего сайта от некоторых атак CSRF. Если вы используете подстановочный знак, вы должны выполнить собственную проверку HostHTTP-заголовка или иным образом убедиться, что вы не уязвимы для этой категории атак.

Вы также должны настроить веб-сервер, который находится перед Django, для проверки хоста. Он должен отвечать статической страницей ошибки или игнорировать запросы на неправильные хосты вместо того, чтобы перенаправлять запрос в Django. Таким образом вы избежите ложных ошибок в журналах Django (или в электронных письмах, если у вас настроен отчет об ошибках). Например, на nginx вы можете настроить сервер по умолчанию так, чтобы он возвращал «444 No Response» на нераспознанном хосте:

server {
    listen 80 default_server;
    return 444;
}

CACHES

Если вы используете кеш, параметры подключения могут отличаться при разработке и производстве. Django по умолчанию использует кэширование в локальной памяти для каждого процесса, что может быть нежелательно.

Кэш-серверы часто имеют слабую аутентификацию. Убедитесь, что они принимают соединения только от ваших серверов приложений.

DATABASES

Параметры подключения к базе данных, вероятно, различаются при разработке и производстве.

Пароли базы данных очень чувствительны. Вы должны защищать их точно так же SECRET_KEY.

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

Если вы еще не настроили резервное копирование для своей базы данных, сделайте это прямо сейчас!

STATIC_ROOTи STATIC_URL

Статические файлы автоматически обслуживаются сервером разработки. В процессе производства вы должны определить STATIC_ROOTкаталог, в который вы collectstaticбудете их копировать.

См. Управление статическими файлами (например, изображениями, JavaScript, CSS) для получения дополнительной информации.

MEDIA_ROOTи MEDIA_URL

Медиа-файлы загружают ваши пользователи. Им не доверяют! Убедитесь, что ваш веб-сервер никогда не пытается их интерпретировать. Например, если пользователь загружает .phpфайл, веб-сервер не должен его выполнять.

Теперь самое время проверить вашу стратегию резервного копирования этих файлов.

HTTPS

Любой веб-сайт, который позволяет пользователям входить в систему, должен применять протокол HTTPS для всего сайта, чтобы избежать передачи токенов доступа в открытом виде. В Django токены доступа включают логин / пароль, cookie сеанса и токены сброса пароля. (Вы мало что можете сделать для защиты токенов сброса пароля, если отправляете их по электронной почте.)

Защита конфиденциальных областей, таких как учетная запись пользователя или администратор, недостаточна, потому что один и тот же файл cookie сеанса используется для HTTP и HTTPS. Ваш веб-сервер должен перенаправлять весь HTTP-трафик на HTTPS и передавать только HTTPS-запросы в Django.

После настройки HTTPS включите следующие параметры.

Оптимизация производительности

Настройка отключает несколько функций, которые полезны только при разработке. Кроме того, вы можете настроить следующие параметры.DEBUG = False

Сессии

Рассмотрите возможность использования кэшированных сеансов для повышения производительности.

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

CONN_MAX_AGE

Включение постоянных подключений к базе данных может привести к значительному ускорению подключения к учетным записям базы данных в течение значительной части времени обработки запроса.

Это очень помогает на виртуализированных хостах с ограниченной производительностью сети.

TEMPLATES

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

Отчет об ошибках

К тому времени, когда вы отправите свой код в рабочую среду, он будет надежным, но вы не сможете исключить непредвиденные ошибки. К счастью, Django может фиксировать ошибки и уведомлять вас об этом.

LOGGING

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

См. « Ведение журнала» для получения подробной информации о ведении журнала.

ADMINSи MANAGERS

ADMINS будут уведомлены о 500 ошибках по электронной почте.

MANAGERSбудет уведомлен об ошибках 404. IGNORABLE_404_URLSможет помочь отфильтровать ложные отчеты.

См. Отчеты об ошибках для получения подробной информации об отправке сообщений об ошибках по электронной почте.

Сообщения об ошибках по электронной почте не очень хорошо масштабируются

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

Настройте представления ошибок по умолчанию

Django включает представления по умолчанию и шаблоны для нескольких кодов ошибок HTTP. Вы можете переопределить шаблоны по умолчанию, создав следующие шаблоны в корневом каталоге шаблона: 404.html, 500.html, 403.html, и 400.html. Представления ошибок по умолчанию , в которых используются эти шаблоны, должно хватить для 99% веб-приложений, но вы также можете настроить их .

Copyright ©2021 All rights reserved