Настройка безопасности стека ELK с помощью Nginx

Nginx? Назначение, особенности, варианты настроек — это вещи, с которыми должен быть ознакомлен каждый веб-разработчик, чтобы тестировать свои наработки.

Контекст events

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

Верхний предел количества процессов для одного пользователя можно узнать при помощи команды ulimit, просмотрев ограничения ядра операционной системы.

ulimit -n

Значение скорее всего будет равно 1024, это значение можно задать для worker_connections.

Директива use задает метод обработки соединений, в Linux следует использовать метод epoll. Включение multi_accept позволяет принимать максимально возможное количество соединений.

events { # Максимальное число соединений на один рабочий процесс worker_connections 1024; # Метод обработки соединений use epoll; # Принимаем максимально возможное количество соединений multi_accept on; }

Секция http

Первое, что мы видим в этой секции — это директива include, сообщающая серверу о необходимости считать часть конфигурации из внешнего файла или нескольких файлов. Как видно в конце секции http, в качестве параметра директиве include можно передавать путь с использованием масок файлов. Директиву include можно применять в любом месте файла конфигурации и это даёт дополнительную гибкость и удобство администрирования сервера.

При помощи опции default_type задаётся MIME-тип по умолчанию, коорый будет передавать сервер клиенту, если этот тип не удалось определить. Опцию default_type можно использовать в контексте секций http, server и location.

Параметр access_log определяет местоположение и формат лог-файла доступа к содержимому. Если формат не определён, о будет использоваться предопределённый формат combined, что и имеет место быть в приведённом примере. Подробнее о создании своих форматов лог-файлов и их использовании можно прочесть на соответствующей вики-странице проекта. Опция access_log может применяться в контексте секций http, server и location.

Параметр sendfile включает или отключает использование сервером одноимённого системного вызова. Включение этого параметра увеличивает производительность Nginx за счёт использования более эффективного способа ввода-вывода. Опция sendfile может применяться в контексте секций http, server и location.

Включение опции tcp_nopush заставляет Nginx пытаться отправлять HTTP-заголовки в одном пакете. Имейте ввиду, что смысл в этой опции есть лишь тогда, когда включена опция sendfile. Опция tcp_nopush может применяться в контексте секций http, server и location.

keepalive_timeout регулирует время, в течение которого Nginx будет держать открытым постоянное соединение, если таковое было запрошено со стороны клиента. Не стоит ставить его слишком большим, поскольку это может повлечь за собой увеличение расхода ресурсов системы. По умолчанию значение параметра равно 75 секундам. Опция keepalive_timeout может применяться в контексте секций http, server и location.

Параметр tcp_nodelay влияет разрешает или запрещает использование сервером опции сокета TCP_NODELAY при работе с постоянными соединениями. Опция tcp_nodelay может применяться в контексте секций http, server и location.

Параметр gzip управляет включением/отключением сжатия сервером данных, передаваемых клиенту. Включение этой опции увеличивает нагрузку на центральный процессор системы, однако позволяет существенно сократить объём передаваемых данных. Опция gzip может применяться в контексте секций http, server и location.

В следующей статье, посвящённой Nginx, мы рассмотрим базовые  принципы использования секций server и location, упомянутые в сегодняшней заметке.

tcp_nopush

Настройка Nginx Ubuntu

Настройка Nginx Ubuntu намного сложнее чем Apache. Здесь мы не будем рассматривать все опции и возможности программы, а поговорим только об основном. Есть различные конфигурации, в которых Nginx используется в качестве прокси сервера, а основной сервер Apache, но нас это интересовать не будет. Нам нужна установка Nginx как самостоятельного веб-сервера.

Настройки Nginx сильно отличаются здесь есть только один основной файл конфигурации и файлы для виртуальных хостов. Настройка из каждой директории, как в Apache не поддерживается.

  • /etc/nginx/ — главный файл конфигурации
  • /etc/nginx/sites-available/* — файлы конфигурации для виртуальных хостов, проще говоря для каждого сайта.
  • /etc/nginx/sites-enabled/* — файлы конфигурации активированных сайтов.

На самом деле файлы конфигурации для виртуальных хостов читаются только из директории sites-enabled, но здесь содержаться ссылки на sites-available. Такая система была придумана, чтобы дать возможность отключать на время те или иные сайты, не стирая их конфигурацию. Все остальные файлы содержат только объявления переменных и стандартные настройки, которые изменять не нужно. Что же касается , то в него включаются все файлы из sites-enables, а поэтому они могут содержать все точно такие же инструкции. А теперь давайте рассмотрим главный файл конфигурации:

sudo vi /etc/nginx/

Как видите файл разделен на секции. Общая структура такова:

глобальные опции events http mail

  • глобальные опции отвечают за работу всей программы.
  • events — эта секция содержит настройки для работы с сетью.
  • http — содержит настройки веб-сервера. Должна содержать секцию servier для тонкой настройки каждого сайта.
  • server — в этой секции содержится настройка каждого размещенного на веб-сервере сайта.
  • location — секция location может находиться только внутри секции server и содержит настройки только для определенного запроса.
  • mail — содержит настройки почтового прокси.
Читайте также:  Установка Linux Mint 20 рядом с Windows 10

Перед тем как перейти к опциям, нужно сказать еще пару слов о синтаксисе строки в конфигурационном файле. Он выглядит вот так:

Настройка Nginx Ubuntu

параметр значение дополнительное_значение. ;

Строка должна обязательно заканчиваться «;», а все открытые скобки < должны быть закрыты.

Теперь, когда вы немного изучили глобальную структуру, можно переходить к рассмотрению самих параметров. Глобальных опций не так уж много:

  • user — пользователь, от имени которого будет работать программа.
  • worker_processes — устанавливает сколько процессов нужно запускать для параллелизации работы программы, нужно запускать не больше процессов, чем у вас есть ядер. Можно установить параметр auto и тогда программа определит это число сама.
  • pid = файл pid программы.
  • worker_rlimit_nofile — указывает максимальное количество файлов, которые может открыть программа. Рассчитывается как worker_processes * worker_connections* 2.

С глобальными опциями закончили, их было не так много и они не такие интереснее. Куда интереснее в плане оптимизации опции с секции events:

  • worker_connections — количество соединений, которые программа может обрабатывать одновременно на одном процессе. Если умножить worker_process на этот параметр, то мы получим максимальное количество пользователей, которые могут подключиться к серверу одновременно. Рекомендуется устанавливать значение от 1024 до 4048.
  • multi_accept — разрешить принимать много подключений одновременно, установите параметр on или off.
  • use — способ работы с сетевым стеком. По умолчанию используется poll, но для Linux эффективнее использовать epoll.

Дальше переходим самой главной секции — http. Здесь опций намного больше:

  • sendfile — использовать метод отправки данных sendfile. Значение on.
  • tcp_nodelay, tcp_nopush — отправлять заголовки и начало файла одним пакетом. Значение on.
  • keepalive_timeout — таймаут ожидания, перед тем как keepalive соединение будет разорвано, по умолчанию 65, но можно уменьшить до 10 секунд.
  • keepalive_requests — максимальное количество keepalive соединений от одного клиента, рекомендовано 100.
  • reset_timedout_connection — разрывать соединения после таймаута. Значение on.
  • open_file_cache — кэшировать информацию об открытых файлах. Строчка настройки выглядит вот так: open_file_cache max=200000 inactive=20s; max — максимальное количество файлов в кэше, время кэширования.
  • open_file_cache_valid — указывает по истечении какого времени нужно удалить информацию из кэша. Например: open_file_cache_valid 30s;
  • open_file_cache_min_uses — кэшировать информацию о файлах, которые были открыты как минимум указанное количество раз.
  • open_file_cache_errors — кэшировать информацию об отсутствующих файлах, значение on.

Основные параметры рассмотрели. Эти настройки помогут вам получить большую производительность от nginx. Секцию server и location мы рассмотрим в настройке виртуальных хостов.

Выводы

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

Читайте также:  Использование команды Basename в Bash Scripts

Читайте другие интересные статьи

  • Защита ssh от брутфорса
  • Шпаргалка по SSH
  • Python установка в Ubuntu
  • Оптимальная настройка Mysql
  • MYSQL: ОТСТАЮЩАЯ РЕПЛИКА
  • Создание и использование архивов Java
  • Увеличение и уменьшение группы томов
  • Пробрасывание портов на Linux маршрутизаторе
  • Установка и настройка SAMBA-сервера в Ubuntu Server LTS
  • Работаем в виртуальном окружении: что такое virtualenv

Заключение

Как часто бывает в проектах с открытым исходным кодом, в стеке ELK некоторые компоненты не реализованы, а должны обеспечиваться внешними службами. Одним из таких компонентов является компонент аутентификации. Использование Nginx в качестве обратного прокси-сервера позволяет обеспечить защиту служб Elasticsearch и Kibana от доступа неавторизованных пользователей.

Заключение

Для полноценной настройки защиты ELK с помощью Nginx необходимо включить протокол HTTPS с использованием корректного сертификата SSL:

Установка балансирующего прокси-сервера Nginx в CentOS 7 с поддержкой SSL и сертификатом Let’s Encrypt

Заключение

Установка балансирующего прокси-сервера Nginx в Debian 9 с поддержкой SSL и сертификатом Let’s Encrypt

Установка балансирующего прокси-сервера Nginx в Ubuntu с поддержкой SSL и сертификатом Let’s Encrypt

Заключение

Реализация: location

Определяется внутри server:

Наличие знака «/» необходимо, чтобы сравнивать получаемые данные и смотреть, есть ли такой адрес из обработанного запроса здесь. Если никаких проблем нет, то указываем путь /data/www к необходимому файлу, что находится в данной локальной системе. Если совпадение есть с несколькими блоками, то выбирается тот, у которого самый длинный префикс. В приведённом примере его длина равняется единице, то есть использование будет исключительно в том случае, если нет «конкурентов». Теперь давайте его усовершенствуем:

location /images/ {

Реализация: location

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

location /images/ {

Это рабочий вариант, который случает стандартный Этот сервер без проблем может быть доступный на локальном компьютере, если пройти по адресу: http://localhost/. Как же это всё будет работать?