8.3. Брандмауэры и системы обнаружения вторжений
Возможность подключать любые компьютеры по всему миру друг к другу имеет как положительные, так и отрицательные стороны. Отдельным домашним пользователям интернет принес множество развлечений. А вот для специалистов по безопасности в корпорациях это настоящий кошмар. Большинство компаний располагает огромными объемами конфиденциальной информации, размещенной на подключенных к сети компьютерах: коммерческие тайны, планы развития производства, рыночные стратегии, аналитические финансовые отчеты, история налоговых платежей и т.д. Раскрытие этих сведений конкурентам может иметь ужасные последствия.
Помимо опасности утечки информации, существуют риски проникновения вредоносных программ — вирусов, червей и прочей цифровой заразы, способной красть секреты и уничтожать ценные данные. На борьбу с ней у системных администраторов уходит масса времени. Часто эту «инфекцию» заносят беззаботные сотрудники, желающие поиграть в новую модную компьютерную игру.
Следовательно, нам требуются механизмы, позволяющие оставлять только «хорошие» биты, устраняя все «плохие». Один из способов состоит в использовании шифрования для защиты данных во время их пересылки между безопасными сайтами. Однако шифрование не спасает от вирусов и хакеров, способных проникнуть в LAN компании. Чтобы защитить сеть, нам понадобится межсетевой экран.
8.3.1. Брандмауэры
Брандмауэры (firewalls) — это современная реализация средневекового принципа обеспечения безопасности. Они напоминают ров, вырытый вокруг замка. Суть конструкции в том, что все входящие и выходящие из замка должны проходить по одному подъемному мосту, где полиция ввода/вывода проверяет их личность. Тот же принцип может применяться и в сетях: у компании может быть несколько LAN, соединенных произвольным образом, но весь внешний трафик должен проходить через электронный «подъемный мост» (межсетевой экран), как показано на илл. 8.8. Никакого другого пути попасть в сеть не существует.
Илл. 8.8. Брандмауэр, защищающий внутреннюю сеть
Брандмауэр работает как пакетный фильтр (packet filter). Он исследует каждый входящий и исходящий пакет. Пакеты, удовлетворяющие определенным критериям, пропускаются. Не сумевшие пройти проверку пакеты удаляются.
Критерии фильтрации обычно устанавливаются правилами или таблицами, где перечислены допустимые и блокируемые отправители и получатели, а также стандартные правила, описывающие, что делать с исходящими и входящими пакетами. В общем случае настроек TCP/IP информация о получателе или отправителе состоит из IP-адреса и номера порта. Номер порта соответствует нужной службе. Например, порт 25 используется для почты, порт 80 — для HTTP. Некоторые порты просто могут быть заблокированы. Например, компания может блокировать поступление входящих пакетов для всех IP-адресов, привязанных к TCP-порту 79. Раньше этот порт широко применялся для получения адресов электронной почты с помощью службы Finger, но сегодня практически не используется, поскольку сыграл не последнюю роль в крупной интернет-атаке 1988 года.
Остальные порты блокируются не так просто. Сложность в том, что сетевые администраторы мечтают об идеальной защите, но не могут блокировать коммуникацию с внешним миром. Второй вариант был бы проще и безопаснее, однако поток жалоб от пользователей шел бы непрерывно. Здесь могут помочь такие решения, как демилитаризованная зона (DeMilitarized Zone, DMZ), показанная на илл. 8.8. DMZ — это часть сети компании, которая находится за пределами периметра безопасности. Сюда допускаются все. Если разместить веб-сервер в DMZ, то сторонние компьютеры будут подключаться к нему, чтобы зайти на сайт компании. При этом брандмауэр можно настроить так, чтобы блокировать входящий TCP-трафик к порту 80, так что компьютеры извне не смогут использовать этот порт для атаки компьютеров внутренней сети. Чтобы управлять веб-сервером, брандмауэр разрешает соединения между ним и компьютерами в сети.
По мере продолжения «гонки вооружений» между разработчиками средств защиты и хакерами брандмауэры становились все более сложными. Изначально они применяли набор правил независимо для каждого пакета, но составлять правила, предоставляющие полезную функциональность и при этом блокирующие весь нежелательный трафик, — задача не из легких. Брандмауэры с контролем состояния соединений (statefull firewalls) сопоставляют пакеты с соединениями и используют поля TCP/IP-заголовков для отслеживания этих соединений. Это позволяет создавать правила, которые, к примеру, разрешают внешнему веб-серверу отправлять пакеты внутреннему хосту, только если перед этим этот хост установил соединение с внешним сервером. Такое правило нельзя было создать при использовании схемы без контроля состояния: она может либо пропускать, либо отбрасывать все пакеты внешнего сервера.
Следующим уровнем сложности по сравнению с контролем состояния является реализация брандмауэром шлюза прикладного уровня (application-level gateway). При этом брандмауэр просматривает содержимое пакетов, не ограничиваясь лишь TCP-заголовками, чтобы узнать, что делает приложение. Это позволяет отделить HTTP-трафик для серфинга в интернете от HTTP-трафика для обмена файлами между пирами. Администратор может написать правила, запрещающие сотрудникам компании обмениваться файлами, но позволяющие заходить на сайты, необходимые для работы. С помощью этих методов исходящий трафик может исследоваться примерно так же, как входящий (например, чтобы важные документы не уходили по электронной почте за пределы компании).
Из всего вышесказанного очевидно, что брандмауэры нарушают стандартную иерархию протоколов. Они являются устройствами сетевого уровня, но также контролируют транспортный и прикладной уровни, чтобы фильтровать данные. Это делает их уязвимыми. Например, брандмауэры ориентируются на стандартную нумерацию портов, чтобы определить, какой трафик находится в пакете. Хотя стандартные порты применяются часто, их используют далеко не все компьютеры и приложения. Некоторые пиринговые приложения выбирают порт динамически, чтобы его было труднее отследить (и заблокировать). Кроме того, высокоуровневая информация скрыта от брандмауэра шифрованием. Наконец, брандмауэр не может открыто сообщить компьютерам, которые пытаются связаться друг с другом с его помощью, почему соединение не удалось установить. Он должен сделать вид, что дело в отрезанном кабеле. В силу этих причин сетевые пуристы считают брандмауэры недостатком архитектуры интернета. Тем не менее интернет может представлять опасность для компьютера. Брандмауэры помогают решать эту проблему, так что они, скорее всего, никуда не исчезнут.
Даже в случае идеально настроенного брандмауэра остается множество вопросов, связанных с безопасностью. Например, если входящие пакеты пропускаются только со стороны конкретных сетей (например, LAN дочернего предприятия компании), взломщик, находящийся вне зоны действия брандмауэра, может просто фальсифицировать адрес отправителя и тем самым преодолеть барьер. Если же нечестный сотрудник захочет переслать секретные документы, он может их зашифровать или просто сфотографировать и передать в виде JPEG-файлов, и тогда они смогут проникнуть через любые почтовые анализаторы. И мы еще не обсудили тот факт, что хотя 75 % атак происходит извне, атаки в зоне действия брандмауэра (например, недовольными сотрудниками) зачастую гораздо опаснее (см. отчет компании Verizon, 2009).
Еще один недостаток брандмауэров состоит в том, что они обеспечивают единый периметр или единую защиту. Если эта защита ломается — все пропало. По этой причине их используют для многоуровневой защиты. Например, брандмауэр может охранять вход во внутреннюю сеть, а на каждом компьютере также может быть свой брандмауэр. Если вам кажется достаточным наличие одного контрольно-пропускного пункта, видимо, вы давно не летали международными авиалиниями. Сегодня многие сети имеют несколько уровней защиты, вплоть до отдельных брандмауэров для каждого хоста. Это самый простой пример эшелонированной защиты (defense in depth). Следует заметить, что как в аэропорту, так и в компьютерной сети наличие множества независимых механизмов защиты существенно усложняет злоумышленникам задачу взлома всей системы.
8.3.2. Обнаружение и предотвращение вторжений
Помимо брандмауэров и скрубберов, администраторы сетей могут развернуть ряд других средств защиты, включая системы обнаружения и предотвращения вторжений, которые мы сейчас кратко обсудим. Как можно понять из названия, системы обнаружения вторжений (Intrusion Detection System, IDS) служат для обнаружения атак, в идеале еще до того, как атаки успеют причинить какой-либо урон. Например, они могут генерировать предупреждения при выявлении ранних проявлений атаки, таких как сканирование портов, попытки войти в систему путем прямого перебора паролей от SSH (когда атакующий просто перебирает различные популярные пароли) или обнаружение сигнатуры новейшего и мощного эксплойта в TCP-соединении. В то же время иногда атаку удается выявить лишь на позднем ее этапе, когда система уже взломана и необычно себя ведет.
IDS можно классифицировать по тому, где и как они работают. Хостовые системы обнаружения вторжений (Host-based IDS, HIDS) работают непосредственно на конечной точке (ноутбуке или сервере) и отслеживают поведение программного обеспечения или входящий и исходящий трафик веб-сервера только в пределах данного компьютера. Сетевые системы обнаружения вторжений (Network IDS, NIDS), напротив, проверяют сетевой трафик некоторой группы компьютеров. Обе эти разновидности систем имеют свои преимущества и недостатки.
Сетевые IDS привлекательны тем, что защищают большое количество компьютеров (и благодаря этому могут находить корреляции между событиями на разных хостах) и не используют их ресурсы. Таким образом, IDS не влияют на производительность компьютеров в защищаемой ими области сети. С другой стороны, при этом трудно устранять проблемы, касающиеся отдельных компьютеров. Допустим, что в трафике TCP-соединения имеются TCP-сегменты, частично накладывающиеся друг на друга: пакет A содержит байты 1–200, а пакет B — байты 100–300. Очевидно, что в данном случае имеется наложение байтов пользовательских данных. Предположим, что байты в накладывающейся области несколько различаются. Что в таком случае должна сделать IDS?
На самом деле вопрос заключается в следующем: какие байты будет при этом использовать хост-получатель? Если ему нужны байты из пакета A, то IDS должна проверить их на отсутствие вредоносного контента и проигнорировать пакет B. Но что, если этот хост использует байты из пакета B? А если одна часть хостов в сети принимает байты из пакета A, а другая — из пакета B? Затруднения могут возникнуть, даже если все хосты ведут себя одинаково и IDS знает, как они производят повторную сборку данных из TCP-потока. Даже если все хосты обычно принимают байты из пакета A, IDS может обнаружить, что этот пакет все равно некорректен, поскольку до адресата он должен пройти еще два-три транзитных участка, а его значение TTL равно единице (то есть он не сможет достичь пункта назначения). Такие трюки со значением TTL и накладывающимися диапазонами байтов в IP-фрагментах или TCP-сегментах называют методами обхода IDS (IDS evasion).
Еще одной проблемой при использовании сетевых IDS является шифрование. Если сетевые байты уже невозможно дешифровать, то системе IDS очень сложно проверить, являются ли они вредоносными. Это еще один пример того, как одно средство защиты (шифрование) может снизить эффективность другого средства (IDS). В качестве обходного маневра администраторы отдельных систем могут предоставить IDS ключи шифрования для сетевой IDS. Хотя этот подход работает, все же он не идеален, ведь тогда придется дополнительно заботиться об управлении ключами. При этом IDS видит весь сетевой трафик и, как правило, сама содержит множество строк кода. Из-за этого она становится привлекательной мишенью для атаки. Взломав ее, злоумышленники получат доступ ко всему сетевому трафику!
Недостатком хостовых IDS является то, что они используют ресурсы тех отдельных компьютеров, на которых работают, и видят лишь незначительную часть происходящих в сети событий. С другой стороны, им гораздо легче бороться с методами обхода IDS, поскольку они могут проверять поступающие данные после их повторной сборки сетевым стеком защищаемого компьютера. Кроме того, при использовании, к примеру, IPsec (когда шифрование и дешифрование пакетов происходит на сетевом уровне) хостовая IDS может проверять данные после расшифровки.
Как уже упоминалось, IDS могут различаться не только по расположению, но и по тому, как они выявляют угрозы. Здесь выделяют две основные категории. Сигнатурные системы обнаружения вторжений (Signature-based IDS) используют паттерны байтов или последовательностей пакетов, представляющие собой признаки известных разновидностей атак. Если вы знаете, что поступление в порт 53 UDP-пакета, содержащего 10 определенных байтов в начале пользовательских данных, говорит о применении эксплойта E, то IDS может проверять сетевой трафик на отсутствие этого паттерна и выдавать оповещение при его обнаружении. Это оповещение будет носить конкретный характер («Я обнаружил E») и обладать высокой степенью уверенности («Я точно знаю, что это E»). В то же время IDS на основе сигнатур могут выявлять только известные разновидности угроз, для которых доступны сигнатуры. Еще один подход сводится к тому, чтобы IDS выдавала оповещение при обнаружении необычного поведения. Например, если компьютер, который обычно обменивается SMTP- и DNS-трафиком только с несколькими IP-адресами, вдруг начинает отправлять HTTP-трафик на множество совершенно незнакомых IP-адресов за пределами LAN, IDS может посчитать это подозрительным. Поскольку такие системы обнаружения вторжений на основе аномалий (Anomaly-based IDS), или просто системы обнаружения аномалий, реагируют на любое нетипичное поведение, они могут выявлять и старые, и новые разновидности атак. Их недостатком является малоинформативность оповещений. Так, сообщение «в сети произошло нечто необычное» гораздо менее конкретное и полезное, чем сообщение «камера видеонаблюдения на воротах атакована вредоносной программой Hajime».
Система предотвращения вторжений (Intrusion Prevention System, IPS) должна не только выявлять, но и останавливать атаки. С этой точки зрения она действует так же, как уже известный нам брандмауэр. Например, обнаружив пакет с сигнатурой Hajime, IPS может отбросить его, не позволив ему дойти до камеры видеонаблюдения. Чтобы это сделать, IPS должна находиться на пути к объекту атаки и принимать решение о приеме или отбрасывании трафика на лету. IDS, напротив, может располагаться в другой части сети, при условии, что мы зеркалируем весь трафик так, чтобы IDS могла его видеть. Вы спросите: к чему все эти лишние сложности? Почему нельзя просто развернуть IPS и полностью избавиться от возможных угроз? Отчасти потому, что при этом встает вопрос производительности: скорость передачи данных будет определяться скоростью обработки данных в IPS. Если на обработку отведено слишком мало времени, то данные будут проверяться не слишком тщательно. Что, если будет допущена ошибка? Точнее, что, если IPS посчитает трафик какого-нибудь соединения вредоносным и отбросит эти данные, хотя на самом деле они не представляют никакой угрозы? Это весьма нежелательно, особенно если речь идет о важном соединении, от которого зависят бизнес-процессы. Возможно, лучше выдать оповещение и позволить кому-то другому изучить подозрительные данные, чтобы выяснить, действительно ли они представляют угрозу.
При этом очень важно знать, насколько часто подозрения IDS или IPS оказываются верными. Если система слишком часто поднимает ложную тревогу, то есть выдает много ложноположительных результатов (false positives, FP), это закончится тем, что вы потратите много времени и денег на поиски черной кошки в темной комнате. Если же, наоборот, IDS или IPS ведет себя слишком сдержанно, часто не поднимая тревогу при атаке, то есть выдает много ложноотрицательных результатов (false negatives, FN), то злоумышленники смогут легко взломать вашу систему. Эффективность системы защиты определяется тем, каким будет число ложноположительных и ложноотрицательных результатов по сравнению с количеством истинно положительных (true positive, TP) и истинно отрицательных (true negative, TN) результатов. Свойства системы в этом отношении принято выражать в виде таких показателей, как точность (precision) и полнота (recall). Точность показывает, какая доля сигналов тревоги была оправданной, что выражается следующей формулой: P = TP/(TP + FP). Полнота показывает, какую долю реальных атак удалось выявить: R = TP/(TP + FN). Можно применять комбинацию двух этих значений, F-меру (F-measure): F = 2PR/(P + R). Наконец, иногда нам нужно выяснить только то, как часто IDS или IPS выдает правильный результат, для этого используется показатель доля верных результатов (accuracy): A = (TP + TN)/общее количество.
Что касается показателей полноты и точности, чем выше их значение, тем лучше. При этом между количеством ложноотрицательных и ложноположительных результатов обычно существует обратная зависимость: при уменьшении первого параметра растет второй, и наоборот. Диапазон допустимых значений для этих параметров зависит от конкретной ситуации. Если система защиты создается для Пентагона, то на первый план выходит исключение вероятности взлома. В этом случае лучше получать чуть больше ложноположительных результатов при минимальном количестве ложноотрицательных. Однако если система защиты создается для учебного заведения, то к ней предъявляются уже не столь жесткие требования. Вероятно, здесь можно обойтись без системного администратора, который проводит почти все свое рабочее время, анализируя ложные срабатывания системы.
Нам осталось рассмотреть еще одну особенность упомянутых показателей, которая показывает важность ложноположительных результатов. При этом мы используем слегка модифицированную версию примера, приведенного Стефаном Аксельсоном (Stefan Axelsson) в его известной статье о том, почему обнаружение вторжений является сложным процессом (Axelsson, 1999). Допустим, реальное количество заболевших определенной болезнью составляет 1 из 100 000 человек. Любой человек, у которого обнаруживается эта болезнь, умирает в течение месяца. К счастью, имеется тест, позволяющий эффективно выявлять наличие болезни. У этого теста доля верных результатов составляет 99 %: если пациент болен (S), то в 99 % случаев тест выдаст положительный результат (что в медицине является не хорошим, а плохим признаком!), а если пациент здоров (H), то в 99 % случаев тест выдаст отрицательный результат (Neg). Решив пройти этот тест, вы получаете положительный результат (Pos). Вопрос на миллион долларов: насколько это плохой признак? Или скажем иначе: стоит ли вам попрощаться с друзьями и семьей, распродать имущество и пуститься во все тяжкие в оставшиеся вам тридцать с небольшим дней или все же не стоит этого делать?
Чтобы ответить на этот вопрос, обратимся к математике. Мы должны определить вероятность наличия у вас заболевания при условии, что тест выдал положительный результат: P(S | Pos). Нам известно следующее:
.
Чтобы вычислить P(S | Pos), воспользуемся известной формулой Байеса:
.
В данном случае тест может выдавать только два варианта ответа — вы либо заболели, либо нет. То есть
,
где P(H) = 1 – P(S);
P(Pos | H) = 1 – P(Neg | H), следовательно:
Таким образом
.
Итак, вероятность наличия у вас этого заболевания составляет менее 0,1 %, и вам пока не стоит паниковать (если, конечно, вы еще не успели распродать все свое имущество).
Как мы видим, окончательное значение вероятности здесь в значительной мере зависит от доли ложноположительных результатов P(Pos | H) == 1 – P(Neg | H) = 0,01. Это объясняется тем, что количество рассматриваемых происшествий является настолько малым (0,00001), что мы можем пренебречь влиянием всех остальных членов уравнения. Данную проблему называют ошибкой базовой оценки (Base Rate Fallacy). Если мы заменим здесь слова «болезнь» и «положительный результат» словами «атака» и «оповещение об атаке», то увидим, что ошибка базовой оценки играет крайне важную роль при использовании любой IDS или IPS. Поэтому нужно стремиться к тому, чтобы количество ложных срабатываний было как можно меньше.
Кроме базовых принципов безопасности Зальцера и Шредера, многие исследователи предлагали использовать дополнительные, часто очень практичные принципы. В частности, здесь уместно вспомнить прагматичный принцип эшелонированной защиты (principle of defense in depth). Часто для защиты системы целесообразно использовать несколько взаимно дополняющих методов. Например, чтобы остановить атаку, можно применять брандмауэр в сочетании с системой обнаружения вторжений и антивирусным сканером. Хотя эти средства не дают стопроцентной защиты по отдельности, их гораздо труднее обойти, если они используются одновременно.