Безопасность nginx: как улучшить конфигурацию вашего сервера
Перевод статьи: Tomasz Andrzej Nidecki — nginx Security: How To Harden Your Server Configuration
В настоящее время nginx является самым популярным веб-сервером, недавно опередившим Apache. Он легкий, быстрый, надежный и поддерживает все основные операционные системы. Это предпочтительный веб-сервер для Netflix, WordPress.com и других сайтов с высоким трафиком. Сервер nginx может легко обрабатывать 10 000 неактивных HTTP-соединений, имея всего 2,5 МБ памяти. В этой статье мы дадим советы по безопасности сервера nginx, которые покажут вам, как защитить ваш сервер.
После установки nginx вы должны хорошо понимать его параметры конфигурации, которые находятся в файле nginx.conf. Это основной файл конфигурации для nginx, и поэтому большинство проверок безопасности будет выполняться с использованием этого файла. По умолчанию вы можете найти nginx.conf в [каталог установки nginx]/conf в системах Windows и в /etc/nginx или /usr/local/etc/nginx в системах Linux. Вам также может потребоваться внести некоторые изменения в файлы конфигурации виртуального хоста, обычно содержащиеся в подкаталоге sites-available.
Шаг 1. Отключить любые нежелательные модули nginx
Когда вы устанавливаете nginx, он автоматически включает в себя множество модулей. В настоящее время вы не можете выбирать модули во время выполнения. Чтобы отключить определенные модули, вам нужно перекомпилировать nginx. Мы рекомендуем отключить все ненужные модули, так как это минимизирует риск потенциальных атак за счет ограничения разрешенных операций.
Для этого используйте опцию configure во время установки. В приведенном ниже примере мы отключаем модуль autoindex, который генерирует автоматические списки каталогов, а затем перекомпилируем nginx.
# ./configure --without-http_autoindex_module
# make
# make install
Шаг 2. Отключить nginx server_tokens
По умолчанию директива server_tokens в nginx отображает номер версии nginx. Этот номер непосредственно виден на всех автоматически генерируемых страницах ошибок, и также присутствует во всех ответах HTTP в заголовке сервера.
Это может привести к раскрытию информации — неавторизованный пользователь может получить информацию о используемой вами версии nginx. Вы должны отключить директиву server_tokens в файле конфигурации nginx, установив server_tokens off.
Шаг 3. Контроль ресурсов и ограничения
Чтобы предотвратить потенциальные DoS-атаки на nginx, вы можете установить ограничения на размер буфера для всех клиентов. Вы можете сделать это в файле конфигурации nginx, используя следующие директивы:
- client_body_buffer_size – используйте эту директиву, чтобы указать размер буфера тела запроса клиента. Значение по умолчанию — 8 КБ или 16 КБ, но рекомендуется установить его равным 1 КБ: client_body_buffer_size 1k.
- client_header_buffer_size – используйте эту директиву, чтобы указать размер буфера заголовка для заголовка запроса клиента. Размер буфера 1k подходит для большинства запросов.
- client_max_body_size – используйте эту директиву, чтобы указать максимально допустимый размер тела для клиентского запроса. Директивы 1k должно быть достаточно, но вам нужно увеличить ее, если вы получаете загрузку файлов методом POST.
- large_client_header_buffers – используйте эту директиву, чтобы указать максимальное количество и размер буферов, которые будут использоваться для чтения больших заголовков клиентских запросов. Директива large_client_header_buffers 2 1k устанавливает максимальное количество буферов в 2, каждый с максимальным размером 1k. Эта директива будет принимать URI данных размером 2 КБ.
Примечание. Некоторые источники предполагают, что установка таких ограничений может предотвратить потенциальные атаки переполнения буфера, если такие уязвимости обнаружены в nginx.
Шаг 4. Отключить любые нежелательные методы HTTP
Мы предлагаем отключить любые методы HTTP, которые не используются и которые не обязательно должны быть реализованы на веб-сервере. Если вы добавите следующее условие в блок местоположения файла конфигурации виртуального хоста nginx, сервер разрешит только методы GET, HEAD и POST и отфильтрует такие методы, как DELETE и TRACE.
location / {
limit_except GET HEAD POST { deny all; }
}
Другой подход заключается в добавлении следующего условия в раздел server (или блок server). Это более более универсальный способ, но вы должны быть осторожны с инструкциями if в контексте местоположения.
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444; }
Шаг 5. Установите ModSecurity для вашего веб-сервера nginx
ModSecurity — это модуль с открытым исходным кодом, который работает как брандмауэр веб-приложения (WAF). Его функции включают в себя фильтрацию, маскировку идентификатора сервера и предотвращение атак с нулевым байтом. Модуль также позволяет выполнять мониторинг трафика в режиме реального времени. Мы рекомендуем вам следовать руководству ModSecurity, чтобы установить модуль mod_security, чтобы усилить ваши параметры безопасности.
Обратите внимание, что если ModSecurity не отвечает вашим потребностям, вы также можете использовать другие бесплатные решения WAF.
Шаг 6. Установка и настройка access и error logs nginx
Журналы access и error logs nginx включены по умолчанию и расположены соответственно в logs/error.log и logs/access.log. Если вы хотите изменить местоположение, вы можете использовать директиву error_log в файле конфигурации nginx. Вы также можете использовать эту директиву, чтобы указать журналы, которые будут записываться в соответствии с их уровнем безопасности. Например, уровень crit заставит nginx регистрировать критические проблемы и все проблемы, которые имеют более высокий уровень, чем уровень crit. Чтобы установить уровень crit, установите директиву error_log следующим образом:
error_log logs/error.log crit;
Вы можете найти полный список уровней error_log в официальной документации nginx.
Вы также можете изменить директиву access_log в файле конфигурации nginx, указав расположение не по умолчанию для журналов доступа. Наконец, вы можете использовать директиву log_format для настройки формата записываемых сообщений, как описано в документации по nginx.
Шаг 7. Мониторинг журналов Access и Error
Если вы постоянно отслеживаете и управляете лог-файлами nginx, вы можете лучше понимать запросы, отправленные на ваш веб-сервер, а также заметить любые обнаруженные ошибки. Это поможет вам обнаружить любые попытки атаки, а также определить, что вы можете сделать, чтобы оптимизировать производительность сервера.
Вы можете использовать инструменты управления журналами, такие как logrotate, чтобы обновлять и сжимать старые журналы и освобождать дисковое пространство. Кроме того, модуль ngx_http_stub_status_module предоставляет доступ к основной информации о состоянии. Вы также можете использовать nginx Plus, коммерческую версию nginx, которая обеспечивает мониторинг активности трафика, нагрузки и других показателей в режиме реального времени.
Шаг 8. Настройте Nginx для включения заголовков безопасности
Чтобы дополнительно защитить свой веб-сервер nginx, вы можете добавить несколько различных заголовков HTTP. Вот некоторые из вариантов, которые мы рекомендуем.
X-Frame-Options
Заголовок HTTP-ответа X-Frame-Options, используется чтобы указать, разрешено ли браузеру отображать страницу в frame или iframe . Это может предотвратить атаки с помощью clickjacking. Поэтому мы рекомендуем вам включить эту опцию для вашего сервера nginx.
Для этого добавьте следующий параметр в файл конфигурации nginx в разделе server:
add_header X-Frame-Options "SAMEORIGIN";
Strict-Transport-Security
HTTP Strict Transport Security (HSTS) — это метод, используемый веб-сайтами для объявления того, что доступ к ним должен осуществляться только через безопасное соединение (HTTPS). Если веб-сайт объявляет политику HSTS, браузер должен отклонить все HTTP-соединения и запретить пользователям принимать незащищенные SSL-сертификаты. Чтобы добавить заголовок HSTS на ваш сервер nginx, вы можете добавить следующую директиву в ваш раздел сервера:
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
CSP and X-XSS-Protection
Политика безопасности контента (CSP) защищает ваш веб-сервер от определенных типов атак, включая атаки с использованием Cross-site Scripting (XSS) и атаки с использованием data injection. Вы можете реализовать CSP, добавив следующий пример заголовка Content-Security-Policy (обратите внимание, что фактический заголовок должен быть настроен в соответствии с вашими уникальными требованиями):
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
Заголовок HTTP X-XSS-Protection поддерживается IE и Safari и не требуется для современных браузеров, если у вас есть строгая политика безопасности содержимого. Однако, чтобы предотвратить XSS в случае более старых браузеров (которые еще не поддерживают CSP), вы можете добавить заголовок X-XSS Protection в раздел вашего сервера:
add_header X-XSS-Protection "1; mode=block";
Шаг 9. Настройте SSL и Cipher Suites
Конфигурация nginx по умолчанию позволяет использовать небезопасные старые версии протокола TLS (согласно официальной документации: ssl_protocols TLSv1 TLSv1.1 TLSv1.2). Это может привести к таким атакам, как атака BEAST. Поэтому мы рекомендуем вам не использовать старые протоколы TLS и изменять конфигурацию для поддержки только новых, безопасных версий TLS.
Для этого добавьте следующую директиву в раздел server файла конфигурации nginx:
ssl_protocols TLSv1.2 TLSv1.3;
Кроме того, вы должны указать наборы шифров, чтобы убедиться, что уязвимые наборы не поддерживаются. Чтобы выбрать лучшие комплекты шифров, прочитайте нашу статью об усилении шифрования TLS и добавьте директиву ssl_ciphers в раздел сервера для выбора шифров (как предлагается в статье об усилении шифрования). Мы также рекомендуем добавить следующую директиву в раздел сервера:
ssl_prefer_server_ciphers on;
Эта директива позволит принять решение о том, какие шифры использовать, на стороне сервера, а не на стороне клиента.
Шаг 10. Регулярно обновляйте ваш сервер
Как и с любым другим программным обеспечением, мы рекомендуем вам всегда обновлять сервер nginx до последней стабильной версии. Новые обновления часто содержат исправления для уязвимостей, выявленных в предыдущих версиях, таких как уязвимость обхода каталога (CVE-2009-3898), существовавшая в версиях nginx до 0.7.63 и 0.8.x до 0.8.17. Обновления также часто включают новые функции безопасности и улучшения. На сайте nginx.org вы можете найти рекомендации по безопасности в специальном разделе и новости о последних обновлениях на главной странице.
Шаг 11. Проверьте свою конфигурацию с Gixy
Gixy — это инструмент с открытым исходным кодом, который позволяет вам проверить ваш веб-сервер nginx на наличие типичных ошибок конфигурации. После того, как вы подготовите свою конфигурацию nginx, всегда полезно проверить ее с помощью Gixy.
Вы можете найти Gixy здесь.
Шаг 12. Вам не нужно делать это вручную
Если вы не хотите настраивать nginx вручную, вы можете использовать бесплатный онлайн-инструмент визуальной настройки, предоставляемый DigitalOcean.
Вы можете найти этот инструмент здесь.