Nginx — защита сайта на vds от атаки ботами [основные методы блокировки]

Чтение и понимание файлов журнала Nginx

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

Вот пример записи из файла журнала доступа, в котором используется стандартный формат журнала Nginx для объединения:

Давайте разберемся, что означает каждое поле записи:

  • — — IP-адрес клиента, выполняющего запрос.
  • — — Пользователь, аутентификацию по HTTP. Если имя пользователя не задано, в этом поле отображается .
  • — — Время на локальном сервере.
  • — — тип запроса, путь и протокол.
  • — — Код ответа сервера.
  • — — Размер ответа сервера в байтах.
  • — — URL перехода.
  • — — Пользовательский агент клиента (веб-браузер).

Используйте команду для просмотра файла журнала в режиме реального времени:

Что такое HAProxy?

HAProxy, или High Availability Proxy, является программным балансировщиком нагрузки TCP/HTTP. Он распределяет рабочую нагрузку по серверам для обеспечения максимальной производительности и оптимизации использования ресурсов. HAProxy поддерживает гибко настраиваемые методы проверки доступности, обработки отказов и восстановления после них.

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

В одном из вариантов настройки HAProxy устанавливается на каждом сервере приложений, выполняющем запросы к базе данных. Такой вариант отлично подходит при наличии нескольких серверов, что позволяет контролировать нагрузку и скрыть организацию кластера СУБД. Приложение подключается к локальному HAProxy (например, устанавив mysql-соединение на 127.0.0.1:3306) и может получить доступ ко всем серверам базы данных. Веб-сервер и HAProxy вместе образуют рабочий блок, поэтому веб-сервер не будет работать, если HAProxy недоступен.

Использование HAProxy для балансировки нагрузки дает следующие преимущества:

  • Все приложения получают доступ к кластеру через указанные IP-адреса. Внутренняя топология кластера базы данных скрывается за HAProxy.
  • Соединения MySQL распределены между доступными узлами БД.
  • Можно добавлять или удалять узлы базы данных без необходимости внесения каких-либо изменений в приложения.
  • Как только достигается максимальное количество соединений с базой данных, новые соединения ставятся в очередь. Это удобный способ ограничения количества запросов на соединение с базой данных, обеспечивающий защиту от перегрузки.

ClusterControl поддерживает развертывание HAProxy из пользовательского интерфейса, поддерживая стандартные алгоритмы балансировки, предоставляемые HAProxy:

  • Round Robin. Каждый сервер получает запросы пропорционально своему весу, при этом веса серверов могут меняться на лету.
  • Least Connection. Выбирается сервер с наименьшим количеством активных соединений.
  • Source Hash Scheduling. Сервер для соединения назначается на основе хэша IP-адреса отправителя запроса и весов серверов.

Доступ с определенных IP-адресов

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

В настройке виртуального домена:

location / {
    deny  192.168.0.15;
    allow 192.168.0.0/24;
    allow 2001:0ab3::/32;
    deny  all;
}

* в данном примере мы разрешаем доступ для всех компьютеров сети 192.168.0.0/24 (за исключением 192.168.0.15) и компьютеру с адресом ipv6 2001:0ab3::. Остальным доступ запрещен. 

Если мы хотим сделать ограничение не для конкретного сайта, а для всего nginx (всех сайтов), то прописываем настройки в общем конфигурационном файле секции http:

vi /etc/nginx/nginx.conf

http {
    …
    deny  192.168.0.15;
    allow 192.168.0.0/24;
    allow 2001:0ab3::/32;
    deny  all;
    …
}

После перезапускаем NGINX одной из команд:

systemctl reload nginx

service nginx reload

Ограничение доступа к определенной папке

Стоит отметить, что блокировать доступ по IP-адресу можно не только ко всему сайту, но и к определенным директориям, например:

location /install {
    allow 192.168.0.15;
    deny  all;
}

* в данном примере мы запрещаем доступ к папке install, но разрешаем устройству 192.168.0.15.

Разрешить только локальные запросы

Самый правильный способ, настроить, чтобы NGINX слушал только на локальном адреса, например, listen 127.0.0.1:80;

Но если такой метод, по каким-либо причинам нам не подходит, делаем так:

location / {
    allow 127.0.0.1;
    deny  all;
}

Действие с IP по условию

В зависимости от определенного IP-адреса NGINX может выполнять различные действия, а не только запрет доступа. Например, перенаправление:

location / {
    …
    if ($remote_addr != 127.0.0.1) {
        return 301 https://$host$request_uri;
    }
    …
}

* в данном примере мы перенаправляем всех посетителей по пути https://$host$request_uri, кроме запросов с IP-адреса 127.0.0.1.

Установка

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

Измени строку приветствия Web-сервера

Скачай исходники nginx, открой файл src/http/ngx_http_header_filter_module.c и найди следующие две строки:

Замени их на что-то вроде этого:

Удали все неиспользуемые тобой nginx-модули

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

Выполни сборку с помощью следующих команд:

Так ты получишь nginx с заранее отключенными (и в большинстве случаев бесполезными) модулями SSI (Server Side Includes) и Autoindex. Чтобы узнать, какие модули можно безболезненно выбросить из Web-сервера, запусти скрипт configure с флагом ‘—help’.

Безопасность

Помимо уменьшения времени отклика веб-сервера, необходимо позаботиться о безопасности. Разберем основные http заголовки, которые могут представлять угрозу.

X-XSS-Protection

Заголовок может предотвратить некоторые XSS-атаки.

Вы можете реализовать защиту XSS, используя три варианта в зависимости от конкретной потребности.

  • Это полностью отключит фильтр
  • Это включает фильтр, но очищает только потенциально вредоносные скрипты
  • Это включает фильтр и полностью блокирует страницу.

X-Frame-Options

Заголовок позволяет снизить уязвимость вашего сайта для clickjacking-атак. Этот заголовок служит инструкцией для браузера не загружать вашу страницу в frame/iframe. Не все браузеры поддерживают этот вариант.

Настроить X-Frame-Options можно тремя способами:

  • : это полностью отключит функции iframe.
  • : iframe может использоваться только кем-то из того же источника.
  • : Это позволит размещать страницы в окнах iframe только с определенных URL-адресов.

X-Permitted-Cross-Domain-Policies

Аналогично механизму браузеров блокировки стороннего контента Adobe Flash имеет свой. Он регулируется файлами crossdomain.xml сайта, начиная с корневого каталога. Проблема с механизмом в том, что на любом уровне вложенности корневой регулирующий файл (политика безопасности) может быть переопределен. Чтобы избежать таких ситуаций, необходимо задать этот HTTP-заголовок.

Доступно несколько вариантов настройки:

  • — никакая политика не допускается
  • — разрешить только главную политику
  • — все позволено
  • — Разрешить только определенный тип контента. Пример — XML
  • — применимо только для FTP-сервера

Strict-Transport-Security

Заголовок Strict-Transport-Security запрещает использование незащищенного HTTP соединения на сайте, если есть защищенное HTTPS.

X-Content-Type-Options

Рейтинг наиболее опасных к использованию возможностей браузера возглавляет возможность Internet Explorer «угадывать» тип файла, игнорируя его MIME-тип.

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

Таким образом, обычные текстовые файлы могут быть интерпретированы как JavaScript со всеми вытекающими последствиями. Например, если у вас на сайте запрещена загрузка текстовых файлов с расширениями .js пользователями, то они могут загрузить в виде картинок текстовый файл, содержащий JavaScript-код, который может быть исполнен браузером.

Настройка журнала ошибок

Nginx записывает сообщения об ошибках приложения и общих ошибках сервера в файл журнала ошибок. Если вы испытываете ошибки в своем веб-приложении, журнал ошибок — это первое место, с которого можно начать поиск и устранение неисправностей.

Директива включает и устанавливает расположение и уровень серьезности журнала ошибок. Он имеет следующую форму и может быть установлен в блоке , или :

Параметр устанавливает уровень ведения журнала. Ниже перечислены уровни в порядке их серьезности (от низкого до высокого):

  • — сообщения.
  • — Информационные сообщения.
  • — Уведомления.
  • — Предупреждения.
  • — Ошибки при обработке запроса.
  • — Критические проблемы. Требуется быстрое действие.
  • — Оповещения. Действия должны быть предприняты немедленно.
  • — Чрезвычайная ситуация. Система находится в непригодном для использования состоянии.

Каждый уровень журнала включает в себя более высокие уровни. Например, если вы установите уровень журнала , чтобы , Nginx будет также регистрировать , , и сообщения.

Если параметр не указан, по умолчанию используется .

По умолчанию директива определена в директиве внутри основного файла nginx.conf:

/etc/nginx/nginx.conf

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

Например, чтобы настроить журнал ошибок domain.com на вы должны использовать:

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

Оптимизация работы соединений

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

— Определяет количество рабочих процессов. Обычно, выставляют равному числу ядер, но в новых версиях его лучше устанавливать в auto. По умолчанию 1

— Устанавливает максимальное количество соединений одного рабочего процесса, то есть nginx будет обрабатывать * , остальные запросы ставить в очередь. Следует выбирать значения от 1024 до 4096. По умолчанию 512.

— Позволяет принимать максимально возможное количество соединений. Иначе, процесс nginx за один раз будет принимать только одно новое соединение. По умолчанию off.

— Отвечает за максимальное время поддержания keepalive-соединения, в случае, если пользователь по нему ничего не запрашивает. Для современных систем, стоит выставить от 30 до 50. В нашем случае 45. По умолчанию 75.

— Если клиент перестал читать страницу, Nginx будет сбрасывать соединение с ним. По умолчанию off.

— Ждет выставленное количество секунд тело запроса от клиента, после чего сбрасывает соединение. По умолчанию 60.

— Если клиент прекратит чтение ответа, Nginx подождет выставленное количество секунд и сбросит соединение. По умолчанию 60.

| Атаки на сайт довольно распространённый метод вредительства.

Статья несёт в себе не только список команд или конкретный метод борьбы с атакой, следует тщательно прочитать всю информацию для полноты восприятия, Вы потратите немного больше времени на прочтение, но получите больше информации и у Вас с вероятностью 99% всё получится.
Начнём с обычного флуда на сайт (bruteforce, POST\HEAD\GET флуд и другое вредительство)

  1. Забивание inode на сервере, это количество максимальных файлов (не размер файлов) которые могут быть на диске. Обычно это сессии и временные файлы от CMS (движка сайта).
  2. Перегрузка MySQL, даже при нормально работающем nginx и apache2, нужно искать в логах, куда именно идёт флуд и на какой скрипт, который приводит к нагрузке на MySQL.
  3. Перегрузка nginx или apache2, нужно читать логи и выяснять, куда идёт атака. Если в логах информации нет, но нагрузка есть, следует настроить правила iptables и сделать дамп трафика утилитой tcpdump, что бы анализировать дальнейшую защиту.
  4. Вас могут брутить, т.е подбирать логины\пароли, в этом случае требуется каптча и опять же чтение логов и их анализ, для более лучшего эффекта.
  5. Самое плохое, что может случится, что Ваш сервер VDS будет просто виснуть, когда ресурсы будут переполнены и сервер перегружен, тогда для борьбы с атакими нужно повышать тариф и иметь запас мощности.

1. Немного настроим наш Nginx веб-сервер 
events {    worker_connections  100;}
events {    worker_connections  65535;    use epoll;}
/etc/init.d/nginx restart
2. Собираем информацию для дальнейшего анализа 

  • /var/www/httpd-logs
  • /var/www/ПОЛЬЗОВАТЕЛЬ/data/logs/

grep -lr ‘access_log’ /etc/nginx/

cat /etc/nginx/vhosts/user/site.com.conf | grep access_log

3. Анализируем полученные логи
tail -n 100 /var/www/httpd-logs/site.com.access.log

4. Проверяем все подключения к серверу, ищем наличие атаки
netstat -ntu | grep «:443\|:80» | grep -v 127.0.0.1 | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr

5. Блокируем «плохие» IP адреса, которые атакуют сайт
/etc/init.d/nginx restart
/etc/nginx/vhosts/user/site.com.conf

netstat -ntu | grep «:443\|:80» | grep -v 127.0.0.1 | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr

ip route add blackhole 2.92.2.14
ip route del 2.92.2.14
/sbin/iptables -I INPUT -p tcp —match multiport —dports 80,443 -s 2.92.2.14 -j DROP
/sbin/iptables -D INPUT -p tcp —match multiport —dports 80,443 -s 2.92.2.14 -j DROP
/sbin/iptables-save | grep -v 2.92.2.14 | iptables-restore
6. Переходим к автоматизации процесса блокировки и обнаружения атаки.

FREQ= здесь указывается интервал запуска скрипта, параметр средней важности, так как в крон мы добавим задания вручную.
TAILCOUNT= количество строк, читаемых с лога, этот параметр на каждый сайт уникален, чем больше запросов у сайта, тем больше указывайте значение, на 1000 посетителей, которые что-то делают на сайте или открывают, желательно указать 10000, считайте дальше сами, если Вы не знаете что лучше указать, напишите нам в поддержку.
LOGPATH= это путь к вашему access_log логу сайта, как его найти мы читали выше.
GREP_FILTER= желательно не трогать, здесь указан фильтр по которому считать запросы..
NO_OF_CONNECTIONS= количество одновременных запросов к сайту, по умолчанию 100, обычно хватает.
APF_BAN= не трогаем, здесь указывается метод блокировки, через iptables или APF
KILL= не трогаем, указывается блокировать ип адреса которые флудят или нет, при настройке скрипта можете поменять, что бы не банить настоящих пользователей в процессе настройки.
EMAIL_TO= здесь заполняем свой email куда будут отправляться отчёты о блокировках, должен быть установлен почтовый сервер, по умолчанию уже должен быть установлен, если нет, то (apt-get install exim4)
BAN_PERIOD= период бана IP адреса, указывается в секундах, разблокировка происходит при последующих запусках скрипта.

ignore.ip.listignoreds.listapt-get install nanoexport EDITOR=nanocrontab -e

Настройка журнала доступа

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

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

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

Где — это полный путь к файлу журнала, а — формат, используемый файлом журнала.

Журнал доступа можно включить в блоке , или .

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

/etc/nginx/nginx.conf

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

/etc/nginx/conf.d/domain.com.conf

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

Чтобы изменить формат ведения журнала, отмените настройку по умолчанию или определите новую. Например, чтобы определить новый формат ведения журнала с именем custom, который расширит комбинированный формат значением, показывающим заголовок добавьте следующее определение в директиву или :

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

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

Другие способы

Открой файл /etc/sysctl.conf и помести в него следующие строки:

Поместив корневой каталог Web-сервера в выделенный раздел и запретив на нем размещение любых исполняемых файлов и файлов-устройств, ты обезопасишь остальную часть системы от тех, кто сможет получить доступ к корню Web-сервера. При этом запись в файле /etc/fstab должна иметь примерно такой вид:

Помести nginx в chroot/jail-окружение

Любая современная *nix-система позволяет запереть приложение в изолированной среде исполнения. В Linux для этого можно использовать технологии KVM, Xen, OpenVZ и VServer, во FreeBSD – Jail, в Solaris – Zones. Если ни одна из этих технологий не доступна, ты можешь поместить nginx в классический chroot, который хоть и намного более хрупок, но большинство взломщиков остановить сможет.

Установи правила SELinux для защиты nginx

Хорошей альтернативой изолированным средам исполнения являются локальные системы обнаружения и предотвращения вторжений, такие как SELinux или AppArmor. Будучи правильно настроенными, они смогут предотвратить попытки взлома Web-сервера. По дефолту ни одна из них не настроена для работы в связке с nginx, однако в рамках проекта SELinuxNginx (http://sf.net/projects/selinuxnginx/) были созданы правила для SELinux, которые может использовать любой желающий. Остается только скачать и установить:

Настрой брандмауэр

Обычно nginx устанавливают на выделенных машинах, готовых к высокой нагрузке, поэтому зачастую он остается единственным сетевым сервисом, работающим на сервере. Чтобы обезопасить сервер, достаточно создать совсем небольшой набор правил, которые будут открывать 80, 110 и 143-й порты (если, конечно, nginx должен работать еще и как IMAP/POP3-прокси) и закрывать от внешнего мира все остальное.

Ограничь количество соединений с помощью брандмауэра

Для не слишком нагруженного Web-сайта хорошей идеей будет ограничить количество попыток соединений с одного IP-адреса в минуту. Это сможет уберечь тебя от некоторых типов DoS-атак и брутфорса. В Linux это можно сделать с помощью стандартного iptables/netfilter-модуля state:

Правила урезают лимит на количество подключений с одного IP в минуту до 15. То же можно сделать и с помощью pf:

Кроме лимита на количество последовательных подключений (15 в минуту), данное правило устанавливает дополнительный лимит на количество одновременных подключений равный 100.

Настрой PHP

Если ты используешь nginx в связке с PHP, не забудь настроить и его. Вот как должен выглядеть конфигурационный файл /etc/php/php.ini защищенного сервера:

Оптимизация работы с файлами

позволяет использовать более совершенный системный вызов, который обеспечивает прямую передачу файла, то есть без системных вызовов read + write.

включает использование асинхронного обращения к файлам, что избавит от очередей запросов.

позволит передавать заголовок ответа и начало файла в одном пакете.

по умолчанию выключена. Задает настройку для кэширования информации о файлах, с которыми работает nginx. По умолчанию выключено.

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

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

Выводы

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

О герое дня

Nginx – один самых производительных и популярных Web-серверов в мире. Согласно данным Netcraft, он используется для поддержки более чем 12 миллионов Web-сайтов по всему миру, включая таких мастодонтов как Rambler, Yandex, Begun, WordPress.com, Wrike, SourceForge.net, vkontakte.ru, megashara.com, Либрусек и Taba.ru. Грамотная архитектура, основанная на мультиплексировании соединений с помощью системных вызовов select, epoll (Linux), kqueue (FreeBSD) и механизме управления памятью на основе пулов (небольших буферов от 1 до 16 Кб), позволяет nginx не проседать даже под очень высокими нагрузками, выдерживая свыше 10000 одновременных соединений (так называемая проблема C10K). Изначально написан Игорем Сысоевым для компании Rambler и открыт в 2004 году под BSD-подобной лицензией.

Взято с xakep.ru

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: