Что нового

Article NGINX: Улучшаем конфигурацию сервера

SecreaD 0

SecreaD

Команда форума
27.11.2019
14
53
Приветствую Всех!!!

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


vgregsd.png


nginx [engine x] — это HTTP-сервер и обратный прокси-сервер, почтовый прокси-сервер, а также TCP/UDP прокси-сервер общего назначения, изначально написанный Игорем Сысоевым. Уже длительное время он обслуживает серверы многих высоконагруженных российских сайтов, таких как ЯHдeкс, МaiI, BКонтакте и Pамблер. Согласно статистике Netcraft nginx обслуживал или проксировал 25.76% самых нагруженных сайтов в сентябре 2020 года.
  • Начнем со скачивания архива с исходниками
Код:
wget https://nginx.org/download/nginx-1.18.0.tar.gz
1.png

Распаковываем архив, после чего сразу переходим в каталог с исходниками.

Код:
tar -zxvf nginx-1.18.0.tar.gz && cd nginx-1.18.0
Устанавливаем необходимые библиотеки:
Код:
sudo apt install zlib1g-dev build-essential libpcre++-dev libssl-dev -y
  • Добавим нужные и убрем ненужные нам модули
Теперь необходимо задать конфигурацию сервера, добавив нужные и убрав ненужные модули.
Со списком модулей и их описанием можно ознакомиться в документации nginx, в справочнике по модулям.

Я использовал этот список модулей:
Код:
    # Задаем директории и конфигурационные файлы сервера
--prefix=/etc/nginx
    --sbin-path=/usr/sbin/nginx
    --conf-path=/etc/nginx/nginx.conf
    --error-log-path=/var/log/nginx/error.log
    --http-log-path=/var/log/nginx/access.log
    --pid-path=/var/run/nginx.pid
    --lock-path=/var/run/nginx.lock
    --http-client-body-temp-path=/var/cache/nginx/client_temp
    --http-proxy-temp-path=/var/cache/nginx/proxy_temp
    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp

    # Задаем пользователя и группу для управления сервером
    --user=nginx
    --group=nginx

    # Убираем ненужные модули
    --without-http_autoindex_module / Убираем вывод содержимого каталогов
    --without-http_ssi_module / Убираем обработку SSI команд
    --without-http_scgi_module / Убираем модуль запросов к SCGI-серверу
    --without-http_uwsgi_module / Убираем модуль запросов к UWSGI-серверу
    --without-http_geo_module / Убираем модуль переменных в зависимости от IP-адреса клиента
    --without-http_split_clients_module / Убираем модуль переменных для "split-тестирования"
    --without-http_memcached_module / Убираем memcached модуль
    --without-http_empty_gif_module / Убираем модуль позволяющий выдавать однопиксельный прозрачный GIF
    --without-http_browser_module / Убираем модуль переменных зависящих от значения "User-Agent" в заголовке запроса

    # Добавляем нужные модули
    --with-http_ssl_module / Обеспечение работы по протоколу HTTPS
    --with-http_v2_module / Обеспечение поддержки HTTP/2 протокола
    --with-http_realip_module / Замена адреса клиента на адрес переданный в заголовке
    --with-http_mp4_module / Поддержка стриминга MP4 файлов
    --with-http_auth_request_module / Авторизация клиента на результате подзапроса
    --with-http_stub_status_module / Предоставление доступа к базовой информации о сервере
    --with-http_random_index_module / Обслуживание запросов оканчивающихся "/"
    --with-http_gunzip_module / Распаковка ответов для тех клиентов, кто не поддерживает метод сжатия "gzip"

    # Добавляем нужные опции
    --with-threads / для настройки пула потоков
Выполняем следующую команду включающий вышеописанный список
Код:
sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --user=nginx --group=nginx --without-http_autoindex_module --without-http_ssi_module --without-http_scgi_module --without-http_uwsgi_module --without-http_geo_module --without-http_split_clients_module --without-http_memcached_module --without-http_empty_gif_module --without-http_browser_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --with-http_stub_status_module --with-http_random_index_module --with-http_gunzip_module --with-threads
Запускаем компиляцию и последующую установку сервера.
Код:
sudo make && sudo make install
7.png


Все дальнейшие изменения будем вносить в файл nginx.conf, который по умолчанию находится в /etc/nginx.
  • Отключаем server_tokens
По умолчанию директива server_tokens в nginx отображает номер версии nginx. Этот номер непосредственно виден на всех автоматически генерируемых страницах ошибок, и также присутствует во всех ответах HTTP в заголовке сервера.
Для предотвращения раскрытия информации о используемой вами версии nginx вы должны отключить директиву server_tokens в файле конфигурации nginx, установив server_tokens off.


  • Предотвращаем атаки переполнения буфера на сервере 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 КБ.


  • Disable Any Unwanted HTTP methods
Отключаем любые методы HTTP, которые не используются и которые не обязательно должны быть реализованы на веб-сервере.
Добавляем следующее условие в блок location конфигурации nginx, сервер разрешит только методы GET, HEAD и POST и отфильтрует такие методы, как DELETE и TRACE.

Код:
location / {

limit_except GET HEAD POST { deny all; }

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

Код:
if ($request_method !~ ^(GET|HEAD|POST)$ ) {

    return 444; }
  • Устанавливаем ModSecurity для усиления безопасности web-сервера nginx
ModSecurity — это модуль с открытым исходным кодом, который работает как брандмауэр веб-приложения (WAF). Его функции включают в себя фильтрацию, маскировку идентификатора сервера и предотвращение атак с нулевым байтом. Позволяет выполнять мониторинг трафика в режиме реального времени. Для лучшего понимания предлагаю ознакомиться с документацией ModSecurity.

На нашем форуме есть статья описывающая подробно принцип работы данного модуля
  • Установка и настройка 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.


  • Мониторинг журналов Access и Error
Для обнаружения любых ошибок связаных с работой web-сервера нужно смотреть log-файлы nginx.
Это поможет вам обнаружить любые попытки атаки, а также определить, что вы можете сделать, чтобы оптимизировать производительность сервера.
Для обновления и сжатия старых журналов и освобождения дискового пространства используйте инструменты управления журналами, такие как logrotate.
Чтобы получить доступ к основной информации о состоянии используется ngx_http_stub_status_module.
Использование коммерческой версии nginx (nginx Plus) обеспечивает мониторинг активности трафика, нагрузки и других показателей в режиме реального времени.


  • Включение заголовков безопасности
Чтобы дополнительно защитить свой web-сервер nginx, вы можете добавить несколько различных заголовков HTTP.

X-Frame-Options
Заголовок HTTP-ответа X-Frame-Options, используется чтобы указать, разрешено ли браузеру отображать страницу в frame или iframe .
Это предотвратит атаки с помощью clickjacking.

Добавьте следующий параметр в разделе server:

Код:
add_header X-Frame-Options "SAMEORIGIN";

Strict-Transport-Security
HTTP Strict Transport Security (HSTS) — это метод, используемый веб-сайтами для объявления того, что доступ к ним должен осуществляться только через HTTPS. Если веб-сайт объявляет политику HSTS, браузер должен отклонить все HTTP-соединения и запретить пользователям принимать незащищенные SSL-сертификаты.

Добавляем следующую директиву в раздел server:

Код:
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 в раздел вашего server:

Код:
add_header X-XSS-Protection "1; mode=block";
  • Настраиваем SSL и Cipher Suites
Конфигурация nginx по умолчанию позволяет использовать небезопасные старые версии протокола TLS (согласно официальной документации: ssl_protocols TLSv1 TLSv1.1 TLSv1.2). Это может привести к таким атакам, как атака BEAST.
Рекомендуется не использовать старые протоколы TLS.

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

Добавляем набор шрифтов усиливающих шифрование
Код:
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
Меняем значение по умолчанию на следующую директиву в разделе server:

Код:
ssl_protocols TLSv1.2 TLSv1.3;
Код:
ssl_prefer_server_ciphers on;

9.png


  • Регулярно обновляйте ваш сервер
Как и с любым другим программным обеспечением, рекомендуется всегда обновлять сервер nginx до последней стабильной версии. Новые обновления часто содержат исправления для уязвимостей, выявленных в предыдущих версиях и включают новые функции безопасности и улучшения.
На сайте nginx вы можете найти рекомендации по безопасности в специальном разделе и новости о последних обновлениях на главной странице.


  • Проверяем свою конфигурацию с Gixy
Gixy — это инструмент с открытым исходным кодом, который позволяет вам проверить ваш web-сервер nginx на наличие типичных ошибок конфигурации.
После того, как вы подготовите свою конфигурацию nginx, всегда полезно проверить ее с помощью Gixy.
Репозиторий Gixy на Github


Спасибо за внимание!
 
Последнее редактирование:
Верх Низ