1. Что такое IDS.
На сегодняшний день, когда сайтов с описаниями взломов, а также статей, эксплоитов, программ на эту же тему, появилось очень много, намного участились попытки взлома серверов. Ведь любой юзер, вообразивший себя хакером, может испробовать на вас свежескачаный эксплоит и получить контроль над вашим сервером. На самом деле все не так легко, но все же...
Для того, чтобы узнать про атаки, ну или просто быть в курсе всех событий, происходящих на сервере, многие админы ежедневно просматривают журналы регистрации – логи. Но когда лог файл, например веб-сервера Apache, за день вырастает на 10 Mb, то приходиться автоматизировать процесс контроля безопасности сервера. Одним из решений являются IDS – системы обнаружения вторжения, эффективность которых за последние несколько лет значительно возросла, и теперь они являются неотъемлемой частью любой сетевой защиты.
Из многих разновидностей IDS (Intrusion Detection System), можно выделить две: основанные на анализе протокола (выявляющие пакеты несоответствующие стандартам), и основанные на анализе сигнатур (в пакетах ищется сигнатура атаки – строка (образец) указывающая на принадлежность данного пакета к вредному трафику. Такие IDS называют NIDS (Network Intrusion Detection System). В общем принцип действия NIDS можно описать так: весь трафик анализируется на наличие пакетов содержащих вредоносные данные, и если такой пакет находиться, то выполняются различные сигнализирующие действия (выводится сообщение на консоль, посылается почта, пишется в лог, отправляется Winpopup сообщение и.т.д.). Оба типа IDS имеют свои достоинства и недостатки, например анализ протоколов работает более медленно из-за преобразования пакета в вид доступный для анализа. Зато ложных тревог намного меньше, так как регистрируются действительно реальные отклонения от стандартов. IDS на основе анализа сигнатур более быстры, и к тому же легко настраиваются и обновляются (увидел новую уязвимость, добавил ее в базу, и твой IDS ее обнаружит). Но лучше все таки использовать IDS на основе двух методов анализа, это даст действительно прекрасный результат.
2. Краткий обзор IDS
На данный момент существует огромное количество IDS, каждая из которых обладает своими качествами и недостатками. Приведу краткое описание некоторых из них (данные сведения о программах взяты с сайта www.opennet.ru, там же вы можете и найти все эти IDS):
PortSentry
Программа позволяющая в реальном режиме времени определить и блокировать попытки сканирования UDP и TCP портов сервера. Определяются также скрытые попытки сканирования портов (SYN/half-open, FIN, NULL, X-MAS, oddball).
Snort
Система анализа и слежения (ведения логов) за проходящими пакетами, распознаются такие атаки как "buffer overflows, stealth port scans, CGI attacks, SMB probes, OS fingerprinting attempts". Присутствует возможность real-time извещения администратора при обнаружении атаки
Nidsbench
Система тестирования сети на предмет типовых уязвимостей и выяснения реакции установленной системы обнаружения попыток несанкционированного доступа. Присутствует неплохая подборка документации по NIDS.
Iplog
Монитор TCP/IP трафика, способен вести логи о проходящем трафике, обнаруживать сканирования портов, флуд и некоторые виды атак.
Libnids
Библиотека для построения NIDS систем, эмулирует TCP/IP стэк Linux 2.0.x, что позволяет не только перехватывать пакеты (хаотично идущий набор пакетов), как делает большинство снифферов (например, libpcap, tcpdump), но и отслеживать отдельные сессии (например, перехватывать SMTP трафик и разделять каждую SMTP сессию) с учетом дефрагментации и сборки TCP кусков пакетов. Работает под Linux, *BSD и Solaris.
Slsnif
Программа позволяет отследить и поместить в лог файл все данные проходящие через последовательный порт.
Это далеко не все IDS, и даже не самые известные, но эти легко найти.
Из всех этих программ, Snort - наиболее понравившаяся мне. Почему? Вот ее плюсы: два режима анализа, по сигнатуре и анализ протоколов, легкая установка и настройка программы, небольшой размер и системные требования, определение огромного количества атак.
3. Установка и настройка Snort
Для начала скачаем Snort с сайта www.snort.org.Вот прямая ссылка на последнюю версию на данный момент http://www.snort.org/dl/binaries/linux/snort-1.9.1-1snort.i386.rpm. Также существуют различные модификации Snort, например с поддержкой MySQL, postgresql, snmp, все это вы можете скачать с этого же сайта, а наш вариант программы я выбрал, как самый легкий в установке.
Установка достаточна проста:
rpm –i snort-1.9.1-1snort.i386.rpm
После этого все необходимые файлы будут скопированы в систему.
Теперь необходимо настроить программу под себя, чем мы сейчас и займемся... Перейдем в директорию /etc/snort, здесь вы можете найти базы сигнатур (точнее их можно назвать правилами, по которым Snort определяет вредный трафик) и несколько файлов конфигурации, нам нужен snort.conf. Тут настраиваем переменные переменные типа HOME_NET, EXTERNAL_NET и другие... Разобраться будет нетяжело, так как каждая опция сопровождается довольно внятными комментариями, хоть и на английском. В самом конце конфигурационного файла идут подключаемые сигнатуры, ненужные можно закомментировать, для повышения производительности.
Приведу пример своего конфига:
###################################################
# Шаг #1: Установка переменных касающихся сети
# Измените IP, на адреса вашей локальной сети
# Можно указать несколько диапазонов, разделяя их запятыми
var HOME_NET 192.168.168.0/24
var EXTERNAL_NET !$HOME_NET
var DNS_SERVERS $HOME_NET
var SMTP_SERVERS $HOME_NET
var HTTP_SERVERS $HOME_NET
var SQL_SERVERS $HOME_NET
var TELNET_SERVERS $HOME_NET
var ORACLE_PORTS 1521
var HTTP_PORTS 80
var SHELLCODE_PORTS !80
# Путь к сигнатурам
var RULE_PATH /etc/snort
#Подключаем необходимые файлы содержащие классификацию обнаруженной атаки и ссылки на
# багтраки
include classification.config
include reference.config
###################################################
# Шаг #2: Настройка механизма обнаружения атак
preprocessor frag2
preprocessor stream4: detect_scans, disable_evasion_alerts
preprocessor stream4_reassemble
preprocessor http_decode: 80 unicode iis_alt_unicode double_encode iis_flip_slash full_whitespace
preprocessor rpc_decode: 111 32771
preprocessor portscan: $HOME_NET 4 3 portscan.log
# Мне пришлось добавить эту опцию, из за некоторых специфических программ, используемых в моей
# сети, из за которых часто случались ложные срабатывания
preprocessor portscan-ignorehosts: 192.168.168.0/24
preprocessor arpspoof
preprocessor conversation: allowed_ip_protocols all, timeout 60, max_conversations 32000
preprocessor portscan2: scanners_max 3200, targets_max 5000, target_limit 5, port_limit 20, timeout 60
####################################################################
# Шаг #3: Указываем какие сигнатуры нам нужны
include $RULE_PATH/bad-traffic.rules
include $RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include $RULE_PATH/finger.rules
include $RULE_PATH/ftp.rules
include $RULE_PATH/dos.rules
include $RULE_PATH/ddos.rules
include $RULE_PATH/dns.rules
include $RULE_PATH/web-cgi.rules
# Следующую опцию я оставил для статистики – мой сервер регулярно сканят на предмет IIS багов,
# Точнее не мой сервер а диапазон адресов, в котрый попадаю и я :)
include $RULE_PATH/web-iis.rules
include $RULE_PATH/web-client.rules
include $RULE_PATH/web-php.rules
include $RULE_PATH/sql.rules
include $RULE_PATH/icmp.rules
include $RULE_PATH/netbios.rules
include $RULE_PATH/misc.rules
include $RULE_PATH/attack-responses.rules
include $RULE_PATH/mysql.rules
include $RULE_PATH/pop3.rules
include $RULE_PATH/pop2.rules
include $RULE_PATH/other-ids.rules
include $RULE_PATH/web-attacks.rules
include $RULE_PATH/backdoor.rules
include $RULE_PATH/shellcode.rules
Теперь все готово для для запуска Snort. Пропишите его в inittab и он будет запускаться вместе с системой.
4. Добавление собственных сигнатур
Snort – это очень гибкий и удобный в настоке IDS. Одно из его качеств позволяет нам самим добавлять сигнатуры атак (или как я уже говорил, это больше похоже на правила). Такие правила у нас лежат в файлах *.rules. Синтаксис правил довольно прост:
ACTION PROTO IP_ADDR1 PORT1 DIRECTION IP_ADDR2 PORT2 [ (OPTIONS) ]
Рассмотрим поля правил более детально:
ACTION
Поле Action имеет три основных директивы, которые определяют действия, при обнаружении сетевого пакета, соответствующего некоторому правилу: pass, log и alert.
pass - игнорировать пакет
log - пакет должен быть передан процедуре журналирования, для записи в файл журнала
alert генерирует уведомление об обнаружении пакета, удовлетворяющего правилу
PROTO
Протокол пакета, может иметь значения tcp,udp,icmp
IP_ADDR
Как это понятно из названия опции, это поле означает IP адрес. any позволяет задать все возможные адреса. Символ ! инвертирует условие, т.е. !192.168.168.0/24 означает любой не принадлежащий подсети 192.168.168.0/24. Можно перечислять несколько IP адресов через запятую
PORT
Кроме единственного номера порта можно задать диапазон портов через двоеточие, например, 6000:6010, символ ! инвертирует условие, а any обозначает все порты
DIRECTION
Определяет направление движения пакета:
-> (одностороннее) - правило будет применяться только к пакетам, идущим с IP_ADDR1 на IP_ADDR2;
<> (двустороннее) - направление движения пакета роли не играет
OPTIONS
Заключаемые в круглые скобки параметры являются необязательной частью правила, но они определяют текст уведомляющего об угрозе сообщения, задают дополнительные действия при срабатывании правила и дополнительные условия на соответствие анализируемых пакетов данному правилу. Параметры отделяются друг от друга точкой с запятой, а ключевое слово параметра отделяется от его аргумента двоеточием.
Параметры, задающие дополнительные условия на соответствие правилу:
ttl - задает значение поля TTL в заголовке IP-пакета;
tos - задает значение поля TOS в заголовке IP-пакета;
id - задает значение поля номера фрагмента в заголовке IP-пакета;
ipopts - задает значение поля параметров IP-пакета;
fragbits - задает биты фрагментации IP-пакета;
dsize - задает условия на размер IP-пакета;
flags - задает условия на наличие или отсутствие определенных TCP-флагов;
seq - задает номер сегмента TCP-пакета в последовательности;
ack - задает значение поля подтверждения в TCP-пакете;
itype - задает значение поля типа ICMP-пакета;
icode - задает значение поля кода ICMP-пакета;
icmp_id - задает значение поля ICMP ECHO ID в ICMP-пакете;
icmp_seq - задает номер ICMP ECHO пакета в последовательности;
content - задает искомый шаблон в содержимом пакета, а не в заголовке (шаблон можно задавать как в текстовом виде, так и в шестнадцатеричном);
content-list - этот параметр аналогичен параметру content за исключением того, что список искомых шаблонов берется из заданного файла;
offset - работает совместно с опцией content для определения смещения в пакете, с которого будет производиться анализ содержимого;
depth - аналогичен параметру offset и определяет положение в пакете, до которого будет производиться анализ содержимого;
nocase - отключает чувствительность к регистру при анализе содержимого пакета;
rpc - этот параметр позволяет более точно задать характеристики программных или процедурных вызовов RPC-сервисов.
Как можно заметить, перечисленные параметры позволяют создавать правила для перехвата практически любых пакетов, которые как-то могут угрожать безопасности. А если учесть, что Snort может перехватывать пакеты на канальном уровне, то его применение особенно интересно на хостах, защищенных файрволлом, так как отбрасываемые файрволлом пакеты все равно будут находиться в поле зрения Snort.
Параметры, значения которых имеют смысл при соответствии анализируемого пакета всем условиям:
msg - содержит текст сообщения;
logto - задает альтернативный файл для записи в него содержимого пакета;
session - этот параметр позволяет включить очень интересную возможность Snort - извлечение пользовательских данных из TCP-сессии, например, для последующего анализа того, какие команды вводил пользователь во время telnet-сессии;
resp - если пакет соответствует правилу, то Snort выполнит одно из указанных действий - например, закроет соединение, отправив TCP-RST-пакет одному из хостов.
react - блокирует заданные в правиле web-сайты, закрывая соединение с ними и/или отправляя заданное сообщение браузеру, с которого была предпринята попытка зайти на сайт.
Вот пара примеров построения собственных правил:
Адресованные web-серверу пакеты, содержащие в себе запрос к файлу _vti_inf.html, рассматриваются как попытка воспользоваться одной из уязвимостей Internet Information Server, что вызовет при обнаружении таких пакетов генерацию сообщения об этом событии, а сам пакет запишется в лог-файл.
alert tcp !192.168.1.45/32 any -> 192.168.1.45/32 80 (msg:"IIS-_vti_inf";flags:PA; content:"_vti_inf.html"; nocase;)
В случае обнаружения запроса к Napster-серверу соединение принудительно закрывается. Как видно, при помощи Snort организовать фильтрацию нежелательного трафика можно более эффективно, чем просто закрывая соответствующие порты на файрволе, поскольку имеется возможность ввести дополнительное условие на содержимое пакетов.
alert tcp any any <> any 6688 (msg:"Napster Client Data"; flags:PA; content:".mp3"; nocase; resp: rst_all)
5. Тестирование Snort
Для тестирования работоспособности Snort, возьмем простейший пример. В коммандной строке наберите ping –s 65507 . Теперь идем в /var/log/snort, здесь по умолчанию хранятся логи. Открываем файл alert и видим такие строки:
[**] [1:499:3] ICMP Large ICMP Packet [**]
[Classification: Potentially Bad Traffic] [Priority: 2]
01/06-07:37:37.119752 192.168.168.99 -> 192.168.168.9
ICMP TTL:255 TOS:0x0 ID:18479 IpLen:20 DgmLen:63028
Type:0 Code:0 ID:512 Seq:19456 ECHO REPLY
[Xref => arachnids 246]
Первая строка говорит нам, какое действие вызвало тревогу, в данном случае - слишком большой ICMP пакет. Вторая строка показывает класс атаки и ее приоритет (эта информация определяется из файла classification.config). Третья строка содержит время атаки, а также IP адреса хоста пославшего пакет, и хоста которому пакет был предназначен. Далее идут остальные поля пакета, как например TTL, TOS – по которому, кстати, можно определить OS нападающего, и другие...
6. Заключение
Из всего, сказанного выше, как мне кажется, можно сделать вывод о чрезвычайной полезности Snort. В любом случае, применение этой программы сделает жизнь хакеров немного сложнее. А разве не эту цель преследует любой системный администратор?
Данная статья не претендует на полное руководство по Snort, но надеюсь она поможет вам разобраться в его установке, настойке и работе. Много мыслей взяты из различных документов, в основном английских, встреченных мной на различных security сайтах, но в основном это результат моего опыта работы с Snort.