dpi_из_подручных_материалов

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
dpi_из_подручных_материалов [2024/05/13 06:02]
val [Шаг 2. Разворачиваем http приложение]
dpi_из_подручных_материалов [2024/05/15 11:28] (current)
val [DPI из подручных материалов]
Line 1: Line 1:
 ====== DPI из подручных материалов ====== ====== DPI из подручных материалов ======
 +
 +  * [[https://​habr.com/​ru/​articles/​813799/​|DPI из подручных материалов]]
  
 Всем привет! Всем привет!
  
-Однажды,​ много лет назад, во времена эпидемии вируса ​CodeRed, я работал сисадмином в одном вузе и невежливо ответил на электронное письмо из какого то банка с требованием немедленно прекратить атаку на их веб сервер Apache, через месяц пришло бумажное письмо от их службы безопасности,​ и завертелось. Так я познакомился с сервисом Snort, который некоторое время защищал Интернет от наших студентов. Со временем трафик стал https, и решение потеряло смысл, но есть места, где он снова превращается в http, например после https прокси. Тут то мы и сможем его подсмотреть,​ выявить атаки и заблокировать злоумышленника!+Однажды,​ много лет назад, во времена эпидемии вируса ​[[https://​ru.wikipedia.org/​wiki/​Code_Red|Code Red]], я работал сисадмином в одном вузе и невежливо ответил на электронное письмо из какого то-банка с требованием немедленно прекратить атаку на их веб сервер, работающий под управлением ​Apache, через месяц пришло бумажное письмо от их службы безопасности,​ и завертелось. Так я познакомился с системой [[https://​ru.wikipedia.org/​wiki/​Snort|Snort]], которая некоторое время защищала Интернет от наших студентов. Со временем, большая часть ​трафика стала https, и решение потеряло смысл, ноесть места, где он снова превращается в http, например после https прокси. Тут то мы и сможем его ​"подсмотреть", выявить атаки и заблокировать злоумышленника!
  
-Что бы было интереснее,​ рассмотрим вариант, который можно ​воспроизвести в домашних условиях. На единственной системе развернем https прокси,​ веб приложение за ним, и защитим от атак на основе анализа содержимого http запросов. ​ Потребуется VirtualBox (или любой другой гипервизор) и дистрибутив Linux, например Ubuntu, там Snort имеется в виде пакета. Можно взять готовый ova образ:+Что бы было интереснее, ​не будем ​рассматривать [[https://​youtu.be/​oIczkkD-hOU?​si=tb7ucLRAdH2rbSVL|реальный ​кейс]], а воспроизведем все "в домашних условиях". На единственной системе развернем https прокси,​ веб приложение за ним, и защитим от атак на основе анализа содержимого http запросов. ​ Потребуется VirtualBox (или любой другой гипервизор) и дистрибутив Linux, например Ubuntu, там Snort имеется в виде пакета. Можно взять ​мой ​готовый ova образ:
  
 https://​val.bmstu.ru/​unix/​img/​My%20Documents/​ubuntu_24.04_01.ova https://​val.bmstu.ru/​unix/​img/​My%20Documents/​ubuntu_24.04_01.ova
  
-и выполнить 1-й шаг из этой статьи: ​https://​habr.com/​ru/​articles/​716454/​+и выполнить 1-й шаг из [[https://​habr.com/​ru/​articles/​716454/​|этой статьи]]
  
 ===== Шаг 2. Разворачиваем http приложение ===== ===== Шаг 2. Разворачиваем http приложение =====
  
-Можно развернуть что-нибудь поинтереснее ​(https://​youtu.be/​oIczkkD-hOU?​si=tb7ucLRAdH2rbSVL) ​но, сути это не меняет,​ поэтому обойдемся простым вариантом:​+Можно развернуть ​[[https://​youtu.be/​ykWLHQ2i_8E?​si=VBVfi9w-vhl_bGDg|что-нибудь поинтереснее]], но, сути это не меняет,​ поэтому обойдемся простым вариантом:​
  
 <​code>​ <​code>​
Line 45: Line 47:
 ===== Шаг 3. Разворачиваем https прокси ===== ===== Шаг 3. Разворачиваем https прокси =====
  
-В качестве https прокси рассмотрим nginx (можно haproxy, суть не изменится). Поскольку тестировать все будем по ip адресу,​ настроим перенаправление любых запросов на 443 порт в наше http приложение. X-Forwarded-For нуженпоскольку только в этом заголовке будет ip адрес клиента в трафике между https прокси и приложением.+В качестве https прокси рассмотрим nginx (можно haproxy, суть не изменится). Поскольку тестировать все будем по ip адресу,​ настроим перенаправление любых запросов ​(server_name ​ _) на 443 порт в наше http приложение. X-Forwarded-For ​в нашем случае ​нужен потому, что ​только в этом заголовке будет ip адрес клиента в трафике между https прокси и приложением.
  
 <​code>​ <​code>​
Line 69: Line 71:
 </​code>​ </​code>​
  
-Теперь наше http приложение должно быть доступно по URL: https://​ip_адрес_виртульной_машины/​ правда,​ браузер будет ругаться на сертификат.+Теперь наше http приложение должно быть доступно по URL: https://​ip_адрес_виртульной_машины/​ правда,​ браузер будет ругаться на сертификат ​и придется "​перейти на сайт небезопасно"​
  
 ===== Шаг 4. Разворачиваем IDS Snort ===== ===== Шаг 4. Разворачиваем IDS Snort =====
Line 77: Line 79:
 </​code>​ </​code>​
  
-В вопросах ​визарда про сетевые интерфейсы указываем docker0, в нашем случае именно через него идет трафик между https прокси и http приложением в контейнере. ​Результат работы ​визарда записывается в файл:+В вопросах инсталлятора про сетевые интерфейсы указываем docker0, в нашем случае именно через него идет трафик между https прокси и http приложением в контейнере. ​Остальные ответы "по умолчанию",​ результат работы инсталлятора записывается в файл:
  
 <​code>​ <​code>​
-nano /​etc/​snort/​snort.debian.conf+less /​etc/​snort/​snort.debian.conf
 </​code><​code>​ </​code><​code>​
 ... ...
Line 110: Line 112:
 </​code>​ </​code>​
  
-Для тестирования будем использовать тот самый злополучный ​CodeRed, для которого,​ как раз, есть правило "из коробки":​+Для тестирования будем использовать тот самый злополучный ​Code Red, для которого,​ как раз, есть правило "из коробки":​
  
 <​code>​ <​code>​
Line 138: Line 140:
 <​code>​ <​code>​
 # u2spewfoo /​var/​log/​snort/​snort.alert # u2spewfoo /​var/​log/​snort/​snort.alert
 +</​code><​code>​
 +...
 +        priority: 1     ip source: 172.17.0.1 ​  ip destination:​ 172.17.0.2
 ... ...
         type: 1 datatype: 1     ​bloblength:​ 12  Original Client IP: 192.168.1.100         type: 1 datatype: 1     ​bloblength:​ 12  Original Client IP: 192.168.1.100
Line 143: Line 148:
 </​code>​ </​code>​
  
-Этот файл создается и непрерывно растет с момента запуска Snort, а утилита умеет ​только ​выводить его целиком. Для нашей следующей задачи будет удобнее,​ если полученная таким образом информация будет тоже последовательно писаться в журнал. Пришлось "​сочинить"​ такого "​крокодила"​ (ключи -с +1 команды tail из-за двоичного формата файла, u2spewfoo не умеет читать из STDIN, stdbuf отключает буферизацию ввода и вывода,​ logger все пишет в syslog от имени приложения snort с типом сообщений auth и уровнем важности info):+Этот файл создается и непрерывно растет с момента запуска Snort, а утилита умеет выводить его только целиком. Для нашей следующей задачи будет удобнее,​ если полученная таким образом информация будет тоже последовательно писаться в журнал. Пришлось "​сочинить"​ такого "​крокодила"​ (ключи -с +1 команды tail из-за двоичного формата файла, u2spewfoo не умеет читать из STDIN, stdbuf отключает буферизацию ввода и вывода,​ logger все пишет в syslog от имени приложения snort с типом сообщений auth и уровнем важности info):
  
 <​code>​ <​code>​
Line 179: Line 184:
 ===== Шаг 5. Превращаем IDS в IPS ===== ===== Шаг 5. Превращаем IDS в IPS =====
  
-Теперь в журнале поваляются адреса клиентов,​ сигнатуры пакетов которых попадают в правила Snort (с правилами все печально,​ были платные подписки или бесплатно с месячной задержкой,​ теперь только Community rules, в составе пакета,​ ну, и, можно писать свои)+Теперь в журнале поваляются адреса клиентов,​ сигнатуры пакетов которых попадают в правила Snort (с правилами все печально, Snort принадлежит Cisco, были платные подписки или бесплатно с месячной задержкой,​ теперь только Community rules, в составе пакета,​ ну, и, можно писать свои)
  
-Для чтения журнала и блокировки злоумышленником будем использовать fail2ban ​+Для чтения журнала и блокировки злоумышленников будем использовать fail2ban ​
  
 Вообще,​ он ставится командой:​ Вообще,​ он ставится командой:​
Line 189: Line 194:
 </​code>​ </​code>​
  
-но, на текущий момент (май 2024) в 24-й ubuntu он не работает (наверняка ​починят) и приходится устанавливать его так:+но, на текущий момент (май 2024) в 24-й ubuntu он не работает (надеюсь, ​починят) и приходится устанавливать его так:
  
 <​code>​ <​code>​
Line 200: Line 205:
  
 <​code>​ <​code>​
-cat /​etc/​fail2ban/​filter.d/​snort_filter.conf+nano /​etc/​fail2ban/​filter.d/​snort_filter.conf 
 +</​code><​code>​
 [Definition] [Definition]
  
 failregex = .*Original Client IP: <​HOST>​.* failregex = .*Original Client IP: <​HOST>​.*
 </​code><​code>​ </​code><​code>​
-cat /​etc/​fail2ban/​jail.d/​snort_jail.conf+nano /​etc/​fail2ban/​jail.d/​snort_jail.conf 
 +</​code><​code>​
 [snort] [snort]
 enabled ​    = true enabled ​    = true
Line 227: Line 234:
 </​code>​ </​code>​
  
-А так же снять блокировку:​+А также снять блокировку:​
  
 <​code>​ <​code>​
dpi_из_подручных_материалов.1715569348.txt.gz · Last modified: 2024/05/13 06:02 by val