Как заблокировать опасные IP-адреса в режиме реального времени через журналы Nginx

Безопасность
Как заблокировать опасные IP-адреса в режиме реального времени через журналы Nginx

Собирайте и анализируйте журналы Nginx в режиме реального времени, автоматически блокируйте рискованные IP-решения.

Адрес статьи:blog.Park Ruiqing.com/2019/11/17/…

предисловие

В этой статье рассказывается о схеме и практике автоматического сбора и анализа логов Nginx и блокировки опасных IP-адресов в режиме реального времени.

Прочитав эту статью, вы получите:

  • План сбора логов.
  • Простая схема оценки риска ИС.
  • Стратегии и решения для блокировки IP.

Для прочтения этой статьи вам понадобится:

  • Знаком с программированием.
  • Знаком с общими командами Linux.
  • Узнайте о Докере.

задний план

При анализе журнала доступа nginx я увидел большое количество 404 недопустимых запросов, и все URL были случайными конфиденциальными словами.И эти запросы в последнее время становились все более частыми.После ручной блокировки некоторых IP в пакетах, будут приходить новые IP скоро.

Поэтому родилась идея блокировки IP в режиме реального времени за счет автоматического анализа логов Nginx.

nginx-404-accesslog

необходимость

серийный номер необходимость Примечание
1 Сбор логов Nginx Схем много, автор выбрал схему, наиболее подходящую для персонального сервера:filebeat+redis
2 Анализ журнала в реальном времени потребление в реальном времениredislog, разобрать необходимые данные для анализа
3 Оценка рисков интеллектуальной собственности Оценка рисков, связанных с ИС, несколько параметров: количество посещений, атрибуция ИС, использование и т. д.
4 запрет в реальном времени Блокировка опасных IP-адресов на разные сроки

анализировать

Несколько функций кратко описаны в журнале:

серийный номер особенность описывать Примечание
1 частые визиты Несколько или даже десятки раз в секунду Нормальное поведение трафика тоже имеет всплески, но ненадолго
2 непрерывный запрос длится долго То же
3 Большинство 404 Большинство запрошенных URL-адресов могут не существовать, и есть чувствительные слова, такие как admin, login, phpMyAdmin, backup и т. д. Это редко случается с нормальным поведением трафика
4 IP ненормальный Некоторые подсказки можно увидеть из ASN.Как правило, IP-адреса таких запросов не являются обычными отдельными пользователями. Запрос, который он использует, как правило, COM (коммерческий), DCH (центр обработки данных / веб-хостинг / передача), SES (паук поисковой системы) и т. Д.

Примечания: Анализ IP здесь осуществляется черезip2locationБесплатная версия базы данных, о которой будет подробно рассказано позже.

план

日志采集分析处理时序图

Сбор логов

Источник: веб-сайт автора развернут через докер, Nginx — единственная запись, и все журналы доступа записываются.

Сбор: Из-за ограниченных ресурсов автор выбрал облегченный инструмент для сбора журналов.Filebeat, собирать логи Nginx и писать в Redis.

Оценка риска

MonitorСлужба выполняет оценку риска на основе URL, IP, исторической оценки и т. д. и вычисляет окончательный фактор риска.

IP бан

MonitorПосле обнаружения опасного IP (фактор риска превышает пороговое значение) звонитеActuatorДля бана по IP время бана рассчитывается в зависимости от фактора риска.

воплощать в жизнь

Сбор логов

Использование Filebeat очень простое, автор развертывает его через swarm, файлы развертывания следующие (чтобы код не был слишком длинным, здесь опущены другие сервисы):

version: '3.5'
services:
  filebeat:
    image: docker.elastic.co/beats/filebeat:7.4.2
    deploy:
      resources:
        limits:
          memory: 64M
      restart_policy:
        condition: on-failure
    volumes:
    - $PWD/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
    - $PWD/filebeat/data:/usr/share/filebeat/data:rw
    - $PWD/nginx/logs:/logs/nginx:ro
    environment:
      TZ: Asia/Shanghai
    depends_on:
    - nginx
  • image: укажите образ и версию.
  • deploy.resources.limits.memory: ограничение памяти.
  • $PWD/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro:filebeat.yml — это конфигурационный файл, описывающий источник и место назначения журналов.$PWDявляется текущим каталогом, то есть выполнитьdocker stack deployкаталог.roдля разрешений только для чтения.
  • $PWD/filebeat/data:/usr/share/filebeat/data:rw: каталог данных необходимо сохранить, чтобы при удалении докера и повторном развертывании также записывалось местоположение последнего прочитанного журнала.rwдля прав на чтение и запись.
  • $PWD/nginx/logs:/logs/nginx:ro: сопоставьте каталог журнала Nginx с Filebeat.
  • environment.TZ: Часовой пояс

filebeat.ymlСодержимое файла следующее:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /logs/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true

output.redis:
  hosts: ["redis-server"]
  password: "{your redis password}"
  key: "filebeat:nginx:accesslog"
  db: 0
  timeout: 5
  • filebeat.inputs: определить ввод

  • paths: путь журнала

  • json.keys_under_root: Поместите содержимое журнала в корневой узел json (если не задано, все данные будут помещены во вторичный узел). Примечание: автор настраивает журнал nginx в формате json. Эталонная конфигурация выглядит следующим образом:

    log_format  main_json  escape=json
    '{'
       '"@timestamp":"$time_iso8601",'
       '"http_host":"$http_host",'
       '"remote_addr":"$remote_addr",'
       '"request_uri":"$request_uri",'
       '"request_method":"$request_method",'
       '"server_protocol":"$server_protocol",'
       '"status":$status,'
       '"request_time":"$request_time",'
       '"body_bytes_sent":$body_bytes_sent,'
       '"http_referer":"$http_referer",'
       '"http_user_agent":"$http_user_agent",'
       '"http_x_forwarded_for":"$http_x_forwarded_for"'
    '}';
    
  • json.overwrite_keys: перезаписать КЛЮЧ, сгенерированный Filebeat, здесь, чтобы перезаписать@timestampполе.

  • output.redis: определить вывод.

Просмотрите данные Redis после успешного развертывания:

accesslog-in-redis

[Уведомление об авторских правах]
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.

Оценка риска

MonitorСервисы написаны на Java, развернуты с помощью докера иActuatorСервисы взаимодействуют через http.

Оценка риска должна включать несколько аспектов:

серийный номер измерение Стратегия
1 IP дома Группы пользователей китайских веб-сайтов обычно принадлежат Китаю, если IP-адрес принадлежит зарубежным странам, вам нужно быть бдительными.
2 использовать Узнайте об использовании IP, DCH (центр обработки данных/веб-хостинг/транспорт), SES (паук поисковых систем) и т. д., чтобы повысить оценку риска.
3 доступ к ресурсам Ресурс доступа не существует, а путь содержит чувствительные слова, такие как admin, login, phpMyAdmin, backup и т. д., чтобы повысить оценку риска.
4 Частота посещения и продолжительность Частые и настойчивые просьбы, рассмотрите возможность повышения балла.
5 исторический рейтинг Исторические рейтинги интегрированы в текущие рейтинги.

Получить атрибуцию IP

Получить атрибуцию IP относительно легко, и многие веб-сайты службы данных предоставляют бесплатные пакеты, такие какIpInfoи т. д. Существуют также бесплатные версии баз данных IP, которые можно загрузить, например,ip2locationЖдать.

Автор использовалip2locationБесплатная версия базы данных:

ip2location

ip_fromиip_toЭто начало и конец сегмента IP, формат хранения десятичный, который можно передать в MySQL.inet_aton('your ip')Функция преобразует IP в десятичное число, например:

set @a:= inet_aton('172.217.6.78');
SELECT * FROM ip2location_db11 WHERE ip_from <= @a AND ip_to >= @a LIMIT 1;
ip_from ip_to country_code country_name region_name city_name latitude longitude zip_code time_zone
2899902464 2899910655 US United States California Mountain View 37.405992 -122.07852 94043 -07:00
  • Объем данных большой, рекомендуется приноситьLIMIT 1.

Получить AS, ASN и использование

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

ip2locationдоступна бесплатная версияIP2Location™LITE IP-ASNиIP2Proxy™LITEбаза данных.

IP2Location™ LITE IP-ASN: База данных предоставляет справочную информацию для определения автономных систем и номеров (ASN).

IP2Proxy™ LITE: База данных содержит IP-адреса, которые используются в качестве открытых прокси.База данных включает тип прокси, страну, регион, город, интернет-провайдера, домен, тип использования, ASN и последние записи для всех общедоступных адресов IPv4 и IPv6.

IP2Location™ LITE IP-ASNТип использования IP не может быть запрошен вIP2Proxy™ LITEМеньше данных может не содержать указанный IP, но вы можете объединить эти две библиотеки, чтобы примерно угадать назначение IP:

  1. Первый вIP2Proxy™ LITEЗапросите ASN IP.

    set @a:= inet_aton('172.217.6.78');
    SELECT * FROM ip2location_asn WHERE ip_from <= @a AND ip_to >= @a LIMIT 1;
    
    ip_from ip_to cidr asn as
    2899904000 2899904255 172.217.6.0/24 15169 Google LLC
  2. Объедините ASN и IP, запросите один и тот же ASNближайшийУкажите две записи до и после IP:

    set @a:= inet_aton('172.217.6.78');
    SELECT * FROM ip2proxy_px8 WHERE ip_from >= @a AND asn = 15169 ORDER BY ip_from ASC LIMIT 1;
    SELECT * FROM ip2proxy_px8 WHERE ip_from <= @a AND asn = 15169 ORDER BY ip_from DESC LIMIT 1;
    
    ip_from ip_to proxy_type country_code country_name region_name city_name isp domain usage_type asn as last_seen
    2899904131 2899904131 PUB US United States California Mountain View Google LLC google.com DCH 15169 Google LLC 30
    ip_from ip_to proxy_type country_code country_name region_name city_name isp domain usage_type asn as last_seen
    2899904015 2899904015 PUB US United States California Mountain View Google LLC google.com DCH 15169 Google LLC 30
  3. Вычислите абсолютное значение разницы между IP-адресом в запрошенной записи прокси-сервера и текущим IP-адресом.

    IP proxy IP abs(IP - proxy IP)
    2899904078 2899904131 53
    2899904078 2899904015 63

    Если абсолютное значение очень близко, то считается, что цель этого IP такая же, как у прокси-IP.Определение очень близкого можно настроить в зависимости от ситуации, например, абсолютное значение находится в диапазоне 65535. .

Общий рейтинг

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

серийный номер Зачетный элемент Правила подсчета очков (1-10 баллов)
1 IP дома Например: 5 баллов для внутренних и 10 баллов для зарубежных стран, которые можно разделить по регионам.
2 использовать Например: 2 балла за ISP/MOB, 5 баллов за COM, 10 баллов за DCH.
3 доступ к ресурсам Например: 404 дает 5 баллов, все деликатные слова — 10 баллов.
4 Частота посещения и продолжительность Рассчитать балл на основе среднего количества посещений за определенный период времени.
5 исторический рейтинг

Объединяя вышеперечисленные пункты 1-5, расчет можно проводить простым сложением или взвешенным расчетом.

IP бан

Автор использует **iptables+ipset** способ заблокировать IP.ActuatorСервис написан на узле, работает на хосте, в докереMonitorВзаимодействуйте с ним через http.Часть кода для блокировки IP выглядит следующим образом:

'use strict';

const express = require('express');
const shell = require('shelljs');
const router = express.Router();

router.post('/blacklist/:name/:ip', function (req, res, next) {
    let name = req.params.name;
    let ip = req.params.ip;
    let timeout = req.query.timeout;
    let cmd = `ipset -exist add ${name} ${ip} timeout ${timeout}`;
    console.log(cmd);
    shell.exec(cmd);
    res.send('ok\n');
});

module.exports = router;
  • name: имя из черного списка.
  • timeout: Время ожидания, единица измерения: секунды.

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

violation-ticket-list

Эпилог

  • Сканеры, роботы, сканирование уязвимостей и т. д. вызвали ненужные накладные расходы и даже создали риски для веб-сайта, которые нельзя игнорировать.Абсолютной безопасности трудно достичь, но постарайтесь быть в большей безопасности, чем другие.
  • Бан — достаточно жестокий метод, и надо хорошо понимать масштабы, непредумышленное убийство приведет к потере пользователей на сайте.
  • Помимо бана, можно еще рассмотреть "Casual Water", перенаправляя риск IP 302 на gitpage (резервный сайт), чтобы даже если его убьют по ошибке, он не стал причиной потери доступа пользователем.
  • Тысячи дорог, безопасность превыше всего

Если эта статья была вам полезна, ставьте лайк ( ̄▽ ̄)"

Рекомендуемое чтение

Добро пожаловать в публичный аккаунт (код как поэзия)

代码如诗(poetic_code)
[Уведомление об авторских правах]
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.