Собирайте и анализируйте журналы Nginx в режиме реального времени, автоматически блокируйте рискованные IP-решения.
Адрес статьи:blog.Park Ruiqing.com/2019/11/17/…
предисловие
В этой статье рассказывается о схеме и практике автоматического сбора и анализа логов Nginx и блокировки опасных IP-адресов в режиме реального времени.
Прочитав эту статью, вы получите:
- План сбора логов.
- Простая схема оценки риска ИС.
- Стратегии и решения для блокировки IP.
Для прочтения этой статьи вам понадобится:
- Знаком с программированием.
- Знаком с общими командами Linux.
- Узнайте о Докере.
задний план
При анализе журнала доступа nginx я увидел большое количество 404 недопустимых запросов, и все URL были случайными конфиденциальными словами.И эти запросы в последнее время становились все более частыми.После ручной блокировки некоторых IP в пакетах, будут приходить новые IP скоро.
Поэтому родилась идея блокировки IP в режиме реального времени за счет автоматического анализа логов Nginx.
необходимость
серийный номер | необходимость | Примечание |
---|---|---|
1 | Сбор логов Nginx | Схем много, автор выбрал схему, наиболее подходящую для персонального сервера:filebeat +redis
|
2 | Анализ журнала в реальном времени | потребление в реальном времениredis log, разобрать необходимые данные для анализа |
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 после успешного развертывания:
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка: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Бесплатная версия базы данных:
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:
-
Первый в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 -
Объедините 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 -
Вычислите абсолютное значение разницы между 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, которые часто сканируют сайт автора, и они автоматически блокируются в течение нескольких секунд после обнаружения, и текущий эффект идеален.
Эпилог
- Сканеры, роботы, сканирование уязвимостей и т. д. вызвали ненужные накладные расходы и даже создали риски для веб-сайта, которые нельзя игнорировать.Абсолютной безопасности трудно достичь, но постарайтесь быть в большей безопасности, чем другие.
- Бан — достаточно жестокий метод, и надо хорошо понимать масштабы, непредумышленное убийство приведет к потере пользователей на сайте.
- Помимо бана, можно еще рассмотреть "Casual Water", перенаправляя риск IP 302 на gitpage (резервный сайт), чтобы даже если его убьют по ошибке, он не стал причиной потери доступа пользователем.
- Тысячи дорог, безопасность превыше всего
Если эта статья была вам полезна, ставьте лайк ( ̄▽ ̄)"
Рекомендуемое чтение
- Сервер нон-стоп!Как мигрировать данные
- Как научиться программировать
- Практика открытия шлюза API (1) — проектирование шлюза API
- Практика Open API Gateway (2) — Повтор атаки и защита
- Практика Open API Gateway (3) — Текущее ограничение
- Kubernetes (1) Следуйте официальной документации, чтобы собрать K8S с нуля.
- Развертывание приложений Kubernetes (2)
- Kubernetes (3) Как получить доступ к сервисам извне
Добро пожаловать в публичный аккаунт (код как поэзия)
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.