2013-06-10 4 views
2

Я запускаю веб-сервер с nginx, а затем gunicorn для запуска приложения Django с Celery. Руководителем Supervisor управляют все процессы стрельбы и работники сельдерея. Мой вопрос: каковы наилучшие методы определения разрешений для каждого из процессов в стеке?Nginx + Supervisor + Gunicorn + Django + Celery - Проблемы с безопасностью

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

  1. мастер-процесс Nginx является корень, рабочий процессы выполняются в WWW-данных
  2. Supervisor работает как корень
  3. Gunicorn работает как корень (я попытался установить его в качестве другого использования, но этот процесс не стал бы)
  4. PostgresSQL и RabbitMQ бежать как их собственные пользователи (Postgres и RabbitMQ)
  5. Я еще не установил сельдерей, но их документы говорят, что они не запускаются под корень

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

+0

I также нашли этот ответ на serverfault полезным: http://serverfault.com/a/357109 – hgcrpd

ответ

6

Супервизор должен быть root, чтобы запускать другие процессы (например, Nginx) с привилегиями root. Это должно быть хорошо, потому что Supervisor не должен взаимодействовать напрямую с внешними пользователями или принимать входные данные пользователя.

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

Как правило, в сценариях веб-сервера необходимы привилегии root для доступа к файлам и открытым сокетам на портах ниже 1024. Если ваш сервер не может получить доступ к файлам, вы должны изменить их разрешения, а не запускать с привилегиями. Обычно вам нужны привилегии, чтобы открыть порт 80 или 443, поэтому современные веб-серверы запускаются с правами root, привязываются к их порту, а затем передают привилегии своим работающим пользователям www-данных или никому.

Что касается других вещей, которые вы должны рассмотреть, вот быстрый список:

  • Убедитесь, что ваши запросы к базе данных устойчивы к инъекции SQL
  • Убедитесь, что ваш корневой документ определен корректно, и вы не обслуживаете до больше файлов, чем вы планируете.
  • Минимизация привилегий ваши учетные записям базы данных есть (они, вероятно, не нужны падение таблицы и создать, например)
  • Избегайте места в коде, где вы принимаете ввод данные пользователя и исполняющие или оценивающие его