Системы обнаружения атак
Существует три этапа осуществления атаки. Первый, подготовительный, этап заключается в поиске предпосылок для осуществления той или иной атаки. На этом этапе ищутся уязвимости, использование которых приводит к реализации атаки, т.е. ко второму этапу. На третьем этапе завершается атака, "заметаются" следы и т.д. При этом первый и третий этапы сами по себе могут являться атаками. Например, поиск нарушителем уязвимостей при помощи сканеров безопасности, например, SATAN считается атакой.
Существующие механизмы защиты, реализованные в межсетевых экранах, серверах аутентификации, системах разграничения доступа и т.д. работают только на втором этапе. Т.е. по существу они являются средствами блокирующими, а не упреждающими атаки. В абсолютном большинстве случаев они защищают от атак, которые уже находятся в процессе осуществления. И даже если они смогли предотвратить ту или иную атаку, то намного более эффективным было бы упреждение атак, т.е. устранение самих предпосылок реализации вторжений. Комплексная система обеспечения информационной безопасности должна работать на всех трех этапах осуществления атаки. И обеспечение адекватной защиты на третьем, завершающем, этапе не менее важно, чем на первых двух. Ведь только в этом случае можно реально оценить ущерб от "успешной" атаки, а также разработать меры по устранению дальнейших попыток реализовать аналогичную атаку.
Обнаруживать, блокировать и предотвращать атаки можно несколькими путями. Первый, и самый распространенный, способ - это обнаружение уже реализуемых атак. Этот способ применяется в "классических" системах обнаружения атак (например, RealSecure компании Internet Security Systems), межсетевых экранах и т.п. Однако, "недостаток" средств данного класса в том, что атаки могут быть реализованы повторно. Второй путь - предотвратить атаки еще до их реализации. Осуществляется это путем поиска уязвимостей, которые могут быть использованы для реализации атаки. И, наконец, третий путь - обнаружение уже совершенных атак и предотвращение их повторного осуществления. Таким образом, системы обнаружения атак могут быть классифицированы по этапам осуществления атаки (рис.1.):
Системы, функционирующие на первом этапе осуществления атак и позволяющие обнаружить уязвимости информационной системы, используемые нарушителем для реализации атаки. Иначе средства этой категории называются системами анализа защищенности (security assessment systems) или сканерами безопасности (security scanners). Обычно системы анализа защищенности не принято относить к классу средств обнаружения атак, однако, если следовать описанным выше этапам осуществления атаки, то такое отнесение вполне логично.
Системы, функционирующие на втором этапе осуществления атаки и позволяющие обнаружить атаки в процессе их реализации, т.е. в режиме реального (или близкого к реальному) времени. Именно эти средства и принято считать системами обнаружения атак в классическом понимании. Помимо этого можно выделить такой класс средств обнаружения атак как обманные системы.
Системы, функционирующие на третьем этапе осуществления атаки и позволяющие обнаружить уже совершенные атаки. Эти системы делятся на два класса - системы контроля целостности, обнаруживающие изменения контролируемых ресурсов, и системы анализа журналов регистрации.
Рисунок 1. Классификация систем обнаружения атак по этапу осуществления атаки
Помимо этого, существует еще одна распространенная классификация систем обнаружения нарушения политики безопасности - по принципу реализации: host-based, т.е. обнаруживающие атаки, направленные на конкретный узел сети, и network-based, направленные на всю сеть или сегмент сети. Обычно на этом дальнейшая классификация останавливается. Однако системы класса host-based можно разделить еще на три подуровня:
Application IDS (Intrusion Detection System ), обнаруживающие атаки на конкретные приложения;
OS IDS, обнаруживающие атаки на операционные системы;
DBMS IDS, обнаруживающие атаки на системы управления базами данных.
Выделение обнаружения атак на системы управления базами данных (СУБД) в отдельную категорию связано с тем, что современные СУБД уже вышли из разряда обычных приложений и по многим своим характеристикам, в т.ч. и по сложности, приближаются к операционным системам. Таким образом, классификация систем обнаружения атак по уровню реализации выглядит следующим образом (рис.2):
Можно заметить, что это деление соответствует уровням информационной системы предприятия.
Рисунок 2. Классификация систем обнаружения атак по принципу реализации
Системы контроля целостности
Системы контроля целостности работают по замкнутому циклу, обрабатывая файлы, системные объекты и атрибуты системных объектов с целью получения контрольных сумм; затем они сравнивают их с предыдущими контрольными суммами, отыскивая изменения. Когда изменение обнаружено, система посылает сообщение администратору, фиксируя время, соответствующее вероятному времени изменения. Если вновь вернуться к этапам реализации атаки, то системы этого класса функционируют на третьем этапе, т.е. они могут однозначно сказать, происходила атака (точнее изменение контролируемого объекта) или нет.
Обманные системы
Обычно, когда речь заходит об обмане в области информационной безопасности, то здесь используются методы, которые применяют злоумышленники, т.е. лазейки для обхода используемых средств защиты, будь то кража паролей и работа от имени авторизованного пользователя или несанкционированное использование модемов. Обман может сослужить хорошую службу не только для злоумышленников, но и для защиты корпоративных ресурсов. Существует множество различных вариантов использования обмана в благих целях:
Сокрытие
Камуфляж
Дезинформация
В той или иной мере эти механизмы используются в практике работ отделов безопасности. Однако, как правило, эти механизмы используются не для информационной, а для иных областей обеспечения безопасности (физическая, экономическая и т.д.).
В области информационной безопасности наибольшее распространение получил первый метод - сокрытие. Ярким примером использования этого метода в целях обеспечения информационной безопасности можно назвать сокрытие сетевой топологии при помощи межсетевого экрана. Примером камуфляжа является следующий пример: каждая операционная система обладает присущим только ей представлением механизма идентификации пользователя, отличающимся цветом и типом шрифта, которым выдается приглашение, текстом приглашения и местом его расположения. И, наконец, в качестве примера дезинформации можно назвать использование заголовков (banner), которые бы давали понять злоумышленнику, что атакуемая им система якобы уязвима.
Работа систем 2 и 3 их реализующих заключается в том, что эти системы эмулируют те или иные известные уязвимости, которых в реальности не существует. Использование средств (deception systems), реализующих камуфляж и дезинформацию, приводит к следующему:
1. Увеличение числа выполняемых нарушителем операций и действий. Так как заранее определить является ли обнаруженная нарушителем уязвимость истинной или нет, злоумышленнику приходится выполнять много дополнительных действий, чтобы выяснить это. И даже дополнительные действия не всегда помогают в этом. Например, попытка запустить программу подбора паролей (например, Crack для Unix или L0phtCrack(LC ) для Windows) на сфальсифицированный и несуществующий в реальности файл, приведет к бесполезной трате времени без какого-либо видимого результата. Нападающий будет думать, что он не смог подобрать пароли, в то время как на самом деле программа "взлома" была просто обманута.
2. Получение возможности отследить нападающих. За тот период времени, когда нападающие пытаются проверить все обнаруженные уязвимости, в т.ч. и фиктивные, администраторы безопасности могут проследить весь путь до нарушителя или нарушителей и предпринять соответствующие меры.
Например, в информационной системе используются от 5 до 10 зарезервированных портов (с номерами от 1 до 1024). К ним можно отнести порты, отвечающие за функционирование сервисов HTTP, FTP, SMTP, NNTP, NetBIOS, Echo, Telnet и т.д. Если обманные системы (например, RealSecure компании ISS) эмулируют использование еще 100 и более портов, то работа нападающего резко увеличивается и злоумышленник обнаружит не 5-10, а 100 открытых портов. При этом мало обнаружить открытый порт, надо еще попытаться использовать уязвимости, связанные с этим портом. И даже если нападающий автоматизирует эту работу путем использования соответствующих программных средств (Nmap, SATAN и т.д.), то число выполняемых им операций все равно существенно увеличивается, что приводит к быстрому снижению производительности его работы.
Средства анализа защищенности
Обнаружением уязвимостей занимаются системы анализа защищенности - сканеры безопасности или системы поиска уязвимостей. Они проводят всесторонние исследования заданных систем с целью обнаружения уязвимостей, которые могут привести к нарушениям политики безопасности. Результаты, полученные от средств анализа защищенности, представляют "мгновенный снимок" состояния защиты системы в данный момент времени. Несмотря на то, что эти системы не могут обнаруживать атаку в процессе ее развития, они могут определить потенциальную возможность реализации атак.
Технология анализа защищенности является действенным методом реализации политики сетевой безопасности прежде, чем осуществится попытка ее нарушения снаружи или изнутри организации.
Одним из вариантов классификации уязвимостей может служить классификация, отражающая этапы жизненного цикла информационной системы (Таблица 1).
Этапы жизненного цикла ИС |
|
Проектирование ИС |
Уязвимости проектирования |
Реализация ИС |
Уязвимости реализации |
Эксплуатация ИС |
Уязвимости конфигурации |
Наиболее опасны уязвимости проектирования, которые обнаруживаются и устраняются с большим трудом. В этом случае, уязвимость свойственна проекту или алгоритму и, следовательно, даже совершенная его реализация (что в принципе невозможно) не избавит от заложенной в нем уязвимости. Например, уязвимость стека протоколов TCP/IP.
Смысл уязвимостей второй категории (уязвимости реализации) заключается в появлении ошибки на этапе реализации в программном или аппаратном обеспечении корректного с точки зрения безопасности проекта или алгоритма. Обнаруживаются и устраняются такого рода уязвимости относительно легко - путем обновления исполняемого кода или изменения исходного текста уязвимого ПО.
Последняя причина возникновения уязвимостей - ошибки конфигурации программного или аппаратного обеспечения. К их числу можно отнести, например, доступный, но не используемый на узле сервис Telnet, использование "слабых" паролей или паролей менее 6 символов, учетные записи (accounts) и пароли, остановленные по умолчанию (например, SYSADM или DBSNMP в СУБД Oracle), и т.д. Обнаружить и исправить такие уязвимости проще всего.
Системы анализа защищенности могут быть классифицированы по типам обнаруживаемых ими уязвимостей (Рис.3), описанных выше.
Системы анализа защищенности второго и третьего классов получили наибольшее распространение среди конечных пользователей. Существует несколько дополнительных классификаций этих систем. Например, системы анализа исходного текста и исполняемого кода тестируемого программно-аппаратного обеспечения и т.д. Первые также применяются обычно при сертификации программного обеспечения по требованиям безопасности. В большинстве случаев программное обеспечение поставляется в организации без исходных текстов. Кроме того, анализ исходных текстов требует высокой квалификации от обслуживающего их персонала. Отсутствие эффективных систем анализа исходных текстов не позволяет проводить такой анализ на качественном уровне. Именно поэтому большой интерес вызывают системы поиска уязвимостей в исполняемом коде, самым распространенным подклассом которых являются системы имитации атак, которые моделируют различные несанкционированные воздействия на компоненты информационной системы. Именно эти системы получили широкую известность во всем мире ввиду своей относительной простоты и дешевизны. Посредством таких имитаторов обнаруживаются уязвимости еще до того, как они будут использованы нарушителями для реализации атак. К числу систем данного класса можно отнести SATAN, Internet Scanner, Cisco Secure Scanner и т.д.
Системы имитации атак с одинаковым успехом обнаруживают не только уязвимости реализации, но и уязвимости эксплуатации. Функционировать системы анализа защищенности, в частности системы поиска уязвимостей реализации и эксплуатации, могут на всех уровнях информационной инфраструктуры любой компании, то есть на уровне сети, операционной системы, СУБД и прикладного программного обеспечения. Наибольшее распространение получили средства анализа защищенности сетевых сервисов и протоколов. Связано это, в первую очередь, с универсальностью используемых протоколов. Изученность и повсеместное использование таких стеков протоколов, как TCP/IP и т.п. позволяют с высокой степенью эффективности проверять защищенность корпоративной сети, работающей в данном сетевом окружении, независимо от того, какое программное обеспечение функционирует на более высоких уровнях. Примером такой системы является Internet Scanner компании ISS. Вторыми по распространенности являются средства анализа защищенности операционных систем. Связано это также с универсальностью и распространенностью некоторых операционных систем (например, UNIX и Windows). Однако, из-за того, что каждый производитель вносит в операционную систему свои изменения (ярким примером является множество разновидностей ОС UNIX), средства анализа защищенности ОС анализируют в первую очередь параметры, характерные для всего семейства одной ОС. И лишь для некоторых систем анализируются специфичные для нее параметры. Примером такой системы является System Scanner компании ISS.
При проведении анализа защищенности реализуются две стратегии. Первая - пассивная, - реализуемая на уровне операционной системы, СУБД и приложений, при которой осуществляется анализ конфигурационных файлов и системного реестра на наличие неправильных параметров, файлов паролей на наличие легко угадываемых паролей, а также других системных объектов на нарушения политики безопасности. Вторая стратегия, - активная, - осуществляемая в большинстве случаев на сетевом уровне, позволяющая воспроизводить наиболее распространенные сценарии атак, и анализировать реакции системы на эти сценарии.
Однако не стоит думать, что при помощи средств анализа защищенности можно тестировать только возможность несанкционированного доступа в корпоративную сеть из сетей открытого доступа (например, Internet). Эти средства с не меньшим успехом могут быть использованы для анализа некоторых сегментов или узлов внутренней сети организации. Системы анализа защищенности могут быть использованы:
Таблица 2. Средства анализа защищенности.
Название |
Производитель |
Примечание |
|
Internet Scanner |
Internet Security Systems |
На уровне сети |
Первая система, получившая сертификат ГТК. По системе существует авторизованное обучение в России. |
System Scanner |
Internet Security Systems |
На уровне ОС |
|
Database Scanner |
Internet Security Systems |
На уровне СУБД |
|
Cisco Secure Scanner |
На уровне сети |
||
CyberCop Scanner |
Network Associates |
На уровне сети |
|
WebTrends Security Analyzer |
WebTrends Corporation |
На уровне сети |
|
Enterprise |
Security Manager |
Symantec |
На уровне ОС |
SFProtect |
На уровне сети, ОС, СУБД |
||
Nessus |
Свободно распространяется |
На уровне сети |
Система имеет сертификат ГТК. |
Поскольку постоянно появляются новые уязвимости, то для их эффективного обнаружения необходимо постоянно обновлять базу данных системы анализа защищенности. В идеале разрыв между появлением информации об уязвимости в различных "хакерских" источниках и появлением сигнатуры в базе данных системы обнаружения должен отсутствовать. Но как бы часто не обновлялась база данных уязвимостей, существует временной промежуток между сообщением о новой уязвимости и появлением проверки для нее.
Существует два основных механизма, при помощи которых сканер проверяет наличие уязвимости - сканирование (scan) и зондирование (probe).
Сканирование - механизм пассивного анализа, с помощью которого сканер пытается определить наличие уязвимости без фактического подтверждения ее наличия - по косвенным признакам. Этот метод является наиболее быстрым и простым для реализации. В терминах компании ISS данный метод получил название "логический вывод" (inference). Согласно компании Cisco этот процесс идентифицирует открытые порты, найденные на каждом сетевом устройстве, и собирает связанные с портами заголовки (banner), найденные при сканировании каждого порта. Каждый полученный заголовок сравнивается с таблицей правил определения сетевых устройств, операционных систем и потенциальных уязвимостей. На основе проведенного сравнения делается вывод о наличии или отсутствии уязвимости.
Зондирование - механизм активного анализа, который позволяет убедиться, присутствует или нет на анализируемом узле уязвимость. Зондирование выполняется путем имитации атаки, использующей проверяемую уязвимость. Этот метод более медленный, чем "сканирование", но почти всегда гораздо более точный, чем он. В терминах компании ISS данный метод получил название "подтверждение" (verification). Согласно компании Cisco этот процесс использует информацию, полученную в процессе сканирования ("логического вывода"), для детального анализа каждого сетевого устройства. Этот процесс также использует известные методы реализации атак для того, чтобы полностью подтвердить предполагаемые уязвимости и обнаружить другие уязвимости, которые не могут быть обнаружены пассивными методами, например подверженность атакам типа "отказ в обслуживании" ("denial of service").
На практике указанные механизмы реализуются следующими несколькими методами.
"Проверка заголовков" (banner check)
Указанный механизм представляет собой ряд проверок типа "сканирование" и позволяет делать вывод об уязвимости, опираясь на информацию в заголовке ответа на запрос сканера. Типичный пример такой проверки - анализ заголовков программы Sendmail или FTP-сервера, позволяющий узнать их версию и на основе этой информации сделать вывод о наличии в них уязвимости. Однако не стоит забывать, что администратор может изменить текст заголовков, возвращаемых на внешние запросы.
"Активные зондирующие проверки" (active probing check)
Также относятся к механизму "сканирования". Однако они основаны на сравнении "цифрового слепка" (fingerprint) фрагмента программного обеспечения со слепком известной уязвимости. Аналогичным образом поступают антивирусные системы, сравнивая фрагменты сканируемого программного обеспечения с сигнатурами вирусов, хранящимися в специализированной базе данных. Разновидностью этого метода являются проверки контрольных сумм или даты сканируемого программного обеспечения, которые реализуются в сканерах, работающих на уровне операционной системы.
Специализированная база данных (в терминах компании Cisco - база данных по сетевой безопасности) содержит информацию об уязвимостях и способах их использовании (атаках). Эти данные дополняются сведениями о мерах их устранения, позволяющих снизить риск безопасности в случае их обнаружения. Зачастую эта база данных используется и системой анализа защищенности и системой обнаружения атак. По крайней мере, так поступают компании Cisco и ISS.
Этот метод также достаточно быстр, но реализуется труднее, чем "проверка заголовков".
"Имитация атак" (exploit check)
Некоторые уязвимости не обнаруживают себя, пока их не "подтолкнут". Для этого против подозрительного сервиса или узла запускаются реальные атаки. Проверки методом "exploit check" позволяет имитировать реальные атаки, тем самым с большей эффективностью (но меньшей скоростью) обнаруживая уязвимости на сканируемых узлах. Имитация атак является более надежным способом анализа защищенности, чем проверки заголовков, и обычно более надежны, чем активные зондирующие проверки.
Однако существуют случаи, когда имитация атак не всегда может быть реализована. Такие случаи можно разделить на две категории: ситуации, в которых тест приводит к "отказу в обслуживании" анализируемого узла или сети, и ситуации, при которых уязвимость в принципе не годна для реализации атаки на сеть.
Многие проблемы защиты не могут быть выявлены без блокирования или нарушения функционирования сервиса или компьютера в процессе сканирования. В некоторых случаях нежелательно использовать имитацию атак (например, для анализа защищенности важных серверов), т.к. это может привести к большим затратам (материальным и временным) на восстановление работоспособности выведенных из строя элементов корпоративной сети. В этих случаях желательно применить другие проверки, например, активное зондирование или проверки заголовков.
Однако, есть некоторые уязвимости, которые просто не могут быть протестированы без возможного выведения из строя сервиса или компьютера. В этом случае такие проверки выключены и пользователь может сам включить их. Например, в Internet Scanner такого рода проверки выделены в отдельную категорию "Denial of service" ("Отказ в обслуживании").
Этапы сканирования
Практически любой сканер проводит анализ защищенности в несколько этапов:
Сбор информации о сети. На данном этапе идентифицируются все активные устройства в сети и определяются запущенные на них сервисы и демоны. В случае использования систем анализа защищенности на уровне операционной системы данный этап пропускается, поскольку на каждом анализируемом узле установлены соответствующие агенты системного сканера.
Обнаружение потенциальных уязвимостей. Сканер использует описанную выше базу данных для сравнения собранных данных с известными уязвимостями при помощи проверки заголовков или активных зондирующих проверок. В некоторых системах все уязвимости ранжируются по степени риска. Например, в Internet Scanner уязвимости делятся на три степени риска: высокая (High), средняя (Medium) и низкая (Low).
Подтверждение выбранных уязвимостей. Сканер использует специальные методы и моделирует (имитирует) определенные атаки для подтверждения факта наличия уязвимостей на выбранных узлах сети.
Генерация отчетов.
Автоматическое устранение уязвимостей. Этот этап очень редко реализуется в сетевых сканерах, но широко применяется в системных сканерах (например, System Scanner). При этом данная возможность может реализовываться по-разному. Например, в System Scanner создается специальный сценарий (fix script), который администратор может запустить для устранения уязвимости. Одновременно с созданием этого сценария, создается и второй сценарий, отменяющий произведенные изменения. Это необходимо в том случае, если после устранения проблемы, нормальное функционирование узла быдет нарушено.
В любом случае у администратора, осуществляющего поиск уязвимостей, есть несколько вариантов использования системы анализа защищенности:
Запуск сканирования с пользовательскими правилами для нахождения конкретной проблемы.
Комбинации вышеперечисленного.
Подсистема генерации отчетов - немаловажный элемент системы анализа защищенности. Без нее трудно составить мнение о том, каков уровень защищенности сегментов корпоративной сети. На основе созданных отчетов администратор безопасности строит всю свою дальнейшую деятельность - изменяет политику безопасности, устраняет обнаруженные уязвимости, реконфигурирует средства защиты, готовит отчеты руководству и т.д. При этом хорошая подсистема генерации отчетов должна обладать следующими свойствами:
Наличие в отчетах, как текстовой информации, так и графических данных.
Наличие в отчетах информации об обнаруженной уязвимости, вариантах ложного обнаружения, наличие рекомендаций по устранению обнаруженных проблем, ссылках на сервера производителей, дополнительной информации. Во многих случаях отчеты также содержат ссылки на FTP- или Web-сервера, содержащие patch"и и hotfix"ы, устраняющие обнаруженные уязвимости.
Возможность выборки из всей собранной информации только нужных данных по заданным критериям (интервал времени, название уязвимости, степень риска, операционная система, тип уязвимости и т.д.).
Возможность сортировки данных в создаваемых отчетах по различным параметрам (по имени, по дате, по степени риска и т.д.).
Возможность создания отчетов для различных категорий специалистов. Как минимум можно выделить три таких категории: руководство компании, руководство среднего звена и технические специалисты. В отчетах первой категории не содержится никакой технической информации об обнаруженных уязвимостях или атаках. Они содержат описание общего состояния защищенности корпоративной сети. Отчеты второй категории могут содержать более подробную техническую информацию, например, описание обнаруженных уязвимостей или атак, но без указания мер по их устранению. К данной категории также относятся так называемые сравнительные отчеты (trend analysis), которые показывают тенденции в изменении уровня защищенности заданных узлов корпоративной сети. К последней категории отчетов можно отнести технические отчеты, содержащие не только подробное описание каждой из обнаруженных проблем, но и рекомендации по их устранению, а также ссылки на дополнительные источники информации. Такие категории отчетов приняты, например, в Internet Scanner и Cisco Secure Scanner.
Поддержка различных форматов создаваемых отчетов.
Особенности применения
Если сканер не находит уязвимостей на тестируемом узле это не значит, что их нет. Просто это зависит не только от сканера, но и от его окружения. Например, для ОС Windows характерен такой случай: сканер пытается дистанционно проанализировать системный реестр, однако в случае запрета на анализируемом узле удаленного доступа к реестру, сканер никаких уязвимостей не обнаружит. Различные реализации одного итого же сервиса по-разному реагируют на системы анализа защищенности. Очень часто на практике можно увидеть, что сканер показывает уязвимости, которых на анализируемом узле нет. Это относится к сетевым сканерам, которые проводят дистанционный анализ узлов сети. Удаленно определить, существует ли в действительности уязвимость или нет, практически невозможно. В этом случае можно порекомендовать использовать систему анализа защищенности на уровне операционной системы, агенты которой устанавливаются на каждый контролируемый узел и проводят все проверки локально.
Для решения этой проблемы некоторые компании-производители пошли по пути предоставления своим пользователям нескольких систем анализа защищенности, работающих на всех указанных выше уровнях, - сетевом, системном и уровне приложений. Совокупность этих систем позволяет с высокой степенью эффективности обнаружить практически все известные уязвимости. Например, компания Internet Security Systems предлагает семейство SAFEsuite, состоящее из четырех сканеров: Internet Scanner, System Scanner, Security Manager и Database Scanner.
Компания Cisco, предлагающая только систему анализа защищенности на уровне сети пошла другим путем для устранения проблемы ложного срабатывания. Она делит все уязвимости на два класса:
Потенциальные - вытекающие из проверок заголовков и т.н. активных "подталкиваний" (nudge) анализируемого сервиса или узла. Потенциальная уязвимость возможно существует в системе, но активные зондирующие проверки не подтверждают этого.
Подтвержденные - выявленные и существующие на анализируемом хосте.
Проверки на потенциальную уязвимость проводятся через коллекцию заголовков и использование "несильных подталкиваний". "Подталкивание" используется для сервисов, не возвращающих заголовки, но реагирующих на простые команды, например, посылка команды HEAD для получения версии HTTP-сервера.
В некоторых случаях имеются уязвимости, с трудом обнаруживаемые или совсем не обнаруживаемые через сеть. Например, проверка "слабости" паролей, используемых пользователями и другими учетными записями. В случае использования сетевого сканера вам потребуется затратить очень много времени на удаленную проверку каждой учетной записи. В то же время, аналогичная проверка, осуществляемая на локальном узле, проводится на несколько порядков быстрее. Другим примером может служить проверка файловой системы сканируемого узла. Во многих случаях ее нельзя осуществить дистанционно.
Достоинства сканирования на уровне ОС кроются в прямом доступе к низкоуровневым возможностям ОС хоста, конкретным сервисам и деталям конфигурации. Тогда как сканер сетевого уровня имитирует ситуацию, которую мог бы иметь внешний злоумышленник, сканер системного уровня может рассматривать систему со стороны пользователя, уже имеющего доступ к анализируемой системе и имеющего в ней учетную запись. Это является наиболее важным отличием, поскольку сетевой сканер по определению не может предоставить эффективного анализа возможных рисков деятельности пользователя.
Многие сканеры используют более чем один метод проверки одной и той же уязвимости или класса уязвимостей. Однако в случае большого числа проверок использование нескольких методов поиска одной уязвимости привносит свои проблемы. Связано это со скоростью проведения сканирования.
Не все проверки, разработанные в лабораторных условиях, функционируют так, как должны. Даже, несмотря на то, что эти проверки тестируются, прежде чем будут внесены в окончательную версию сканера. На это могут влиять некоторые факторы:
Особенности конфигурации пользовательской системы.
Способ, которым был скомпилирован анализируемый демон или сервис.
Ошибки удаленной системы.
В таких случаях автоматическая проверка может пропустить уязвимость, которая легко обнаруживается вручную и которая может быть широко распространена во многих системах. Проверка заголовка в совокупности с активным зондированием в таком случае может помочь определить подозрительную ситуацию, сервис или узел. И хотя уязвимость не обнаружена, это не значит, что ее не существует.
1 .Фильтрация на маршрутизаторе
Фильтры на маршрутизаторе, соединяющем сеть предприятия с Интернетом, применяются для запрета пропуска датаграмм, которые могут быть использованы для атак как на сеть организации из Интернета, так и на внешние сети злоумышленником, находящимся внутри организации.
Следует отметить, что более безопасным и управляемым решением, чем фильтрация того или иного TCP-трафика следующего от или к компьютеру пользователя, является работа пользователей через прокси-серверы. Прокси-сервер берет на себя функции предоставления пользователю требуемого сервиса и сам связывается с необходимыми хостами Интернета. Хост пользователя взаимодействует только с прокси-сервером и не нуждается в коннективности с Интернетом. Таким образом, фильтрующий маршрутизатор разрешает прохождение TCP-сегментов определенного типа только от или к прокси-серверу. Преимущества этого решения следующие:
2.Анализ сетевого трафика
Анализ сетевого трафика проводится для обнаружения атак, предпринятых злоумышленниками, находящимися как в сети организации, так и в Интернете.
3.Защита маршрутизатора
Мероприятия по защите маршрутизатора проводятся с целью предотвращения атак, направленных на нарушение схемы маршрутизации датаграмм или на захват маршрутизатора злоумышленником.
4.Защита хоста
Мероприятия по защите хоста проводятся для предотвращения атак, цель которых перехват данных, отказ в обслуживании, или проникновение злоумышленника в операционную систему.
5.Превентивное сканирование
Администратор сети должен знать и использовать методы и инструменты злоумышленника и проводить превентивное сканирование сети организации для обнаружения слабых мест в безопасности до того, как это сделает злоумышленник. Для этой цели имеется также специальное программное обеспечение сканеры безопасности.
Общие меры по повышению безопасности сети
Текст это сердце Unix. Философия "все есть файл" полностью пронизывает всю систему и разработанные для нее инструменты. Вот почему работа
с текстом является одним из обязательных навыков системного администратора или начинающего пользователя Linux.
AWK - один из самых мощных инструментов для обработки и фильтрации текста, доступный даже для людей никак не связных с программированием.
Простейшая и часто востребованная задача - выборка полей из стандартного вывода. Вы не найдете более подходящего инструмента для решения этой задачи, чем awk. По умолчанию awk разделяет поля пробелами. Если вы хотите напечатать первое поле, вам нужно просто указать awk параметр $1:
echo "one two three four" | awk "{print $1}"
Да, использование фигурных скобок немного непривычно, но это только в первое время. Вы уже догадались как напечатать второе, третье, четвертое, или другие поля? Правильно это $2, $3, $4 соответственно.
echo "one two three four" | awk "{print $3}"
Иногда необходимо представить данные в определенном формате, например, выбрать несколько слов. AWK легко справляется с группировкой нескольких полей и даже позволяет включать статические данные:
echo "one two three four" | awk "{print $3,$1}"
three one
echo "one two three four" | awk "{print "foo:",$3,"| bar:",$1}"
foo: three | bar: one
Если поля разделены не пробелами, а другим разделителем, просто укажите в параметре -F нужный разделитель в ковычках, например ":" :
echo "one mississippi:two mississippi:three mississippi:four mississippi" | awk -F":" "{print $4}"
four mississippi
Но разделитель не обязательно заключать в ковычки. Следующий вывод аналогичен предыдущему:
echo "one mississippi:two mississippi:three mississippi:four mississippi" | awk -F: "{print $4}"
four mississippi
Иногда нужно обработать данные с неизвестным количеством полей. Если вам нужно выбрать последнее поле можно воспользоваться переменной $NF. Вот так вы можете вывести последнее поле:
echo "one two three four" | awk "{print $NF}"
four
Также вы можете использовать переменную $NF для получения предпоследнего поля:
echo "one two three four" | awk "{print $(NF-1)}"
three
Или поля с середины:
echo "one two three four" | awk "{print $((NF/2)+1)}"
three
echo "one two three four five" | awk "{print $((NF/2)+1)}"
three
Все это можно сделать с помощью таких утилит как sed, cut и grep но это будет намного сложнее.
И еще одна возможность awk, поддержка обработчиков для строк:
echo -e "one 1\n two 2" | awk "{print $1}"
one
two
echo -e "one 1\n two 2" | awk "{print $2}"
1
2
echo -e "one 1\n two 2" | awk "{sum+=$2} END {print sum}"
3
Это означает что мы должны выполнять следующий блок кода для каждой строки. Это можно использовать, например, для подсчета количества переданных данных по запросам из журнала веб-сервера.
Представьте себе, у нас есть журнал доступа, который выглядит так:
23 июля 18:57:12 HTTPD : "GET / Foo / бар HTTP / 1.1" 200 344
23 июля 18:57:13 HTTPD : "GET / HTTP / 1.1" 200 9300
23 июля 19:01:27 HTTPD : "GET / HTTP / 1.1" 200 9300
23 июля 19:01:55 HTTPD : "GET / Foo / Baz HTTP / 1.1" 200 6401
23 июля 19:02:31 HTTPD : "? GET / Foo / Baz страница = 2 HTTP / 1.1" 200 6312
Нам известно что последнее поле это число переданных байт, тогда мы можем использовать переменную $NF:
< requests.log awk "{print $NF}"
344
9300
9300
НАЗВАНИЕ
awk - сопоставление с шаблонами и преобразование текста
СИНТАКСИС
Awk [-Fсимвол] [[-f] программа] [аргумент...] [файл...]
ОПИСАНИЕ
Команда awk сопоставляет строки исходных файлов с шаблонами, определенными в программе. Шаблоны можно задать
либо непосредственно в командной строке, либо поместить
в файл с именем программа и воспользоваться опцией -f.
Если шаблоны указаны в командной строке, их следует
заключить в одинарные кавычки ("), чтобы избежать интерпретации shell"ом.
Команде awk могут быть переданы аргументы в виде x=... y=... и т.д. (см. ПРИМЕРЫ).
Файлы читаются в том порядке, как они заданы. Если не указано ни одного файла или задано имя -, используется стандартный ввод. Ввод для awk делится на записи, разделяемые специальным символом. По умолчанию это перевод строки; в таком случае awk обрабатывает ввод построчно. Разделитель записей можно изменить, переопределив переменную RS. Каждая запись делится на поля, ограниченные разделителями полей (по умолчанию - пробелами). Этот разделитель можно изменить, переопределив переменную FS или указав флаг -Fсимвол. Поля исходных строк доступны по именам $1, $2,...; $0 - вся входная строка.
Для каждого шаблона из программы может быть задано действие, которое будет произведено со всякой строкой, успешно сопоставленной с шаблоном. Оператор шаблон-действие имеет вид:
Шаблон { действие } Каждая исходная строка сопоставляется с каждым из шаблонов; в случае успеха выполняются указанные действия. После сопоставления со всеми шаблонами вводится следующая строка и процесс сопоставления повторяется. Может быть опущен либо шаблон, либо действие, но не оба вместе. Если для данного шаблона не указаны действия, то строка просто копируется на стандартный вывод. Если для действия не определен шаблон, то оно будет выполняться для каждой входной строки. Строки, которые не удалось сопоставить ни одному шаблону, игнорируются.
Действие есть последовательность операторов. Так как шаблоны и действия могут быть опущены, то, чтобы различать их в программе, последние надо брать в фигурные скобки. Оператор есть одна из конструкций:
If (условие) оператор [ else оператор ] while (условие) оператор for (выражение; условие; выражение) оператор break continue { [ оператор ] ... } переменная = выражение print [ список_выражений ] [> выражение ] printf формат [, список_выражений ] [> выражение ] next # пропустить оставшиеся шаблоны и перейти к следующей строке exit # пропустить оставшиеся строки
Операторы завершаются точкой с запятой, переводом строки или правой скобкой. Пустой список_выражений означает всю строку. Выражения строятся из цепочек символов и чисел с помощью операций +, -, *, /, % и конкатенации (обозначается пробелом). В выражениях также можно использовать операции из языка C: ++, --, +=, -=, *=, /=, %=. Переменные инициализируются пустыми цепочками. Переменные могут быть скалярами, элементами массива (обозначается x[i]) или полями. Индексами массива могут служить любые (не обязательно числовые) цепочки символов, что позволяет реализовать разновидность ассоциативной памяти. Цепочки символов заключаются в двойные кавычки (").
Оператор print выдает свои аргументы на стандартный вывод (или в файл, если присутствует часть >выражение), разделяя их текущим разделителем полей и завершая каждую запись выходным разделителем записей. Оператор printf делает то же самое, но под управлением формата [см. printf(3S) ].
Встроенная функция length возвращает длину своего аргумента, рассматривая его как цепочку символов; если аргумент опущен, то возвращается длина текущей строки. Определены также следующие встроенные функции: exp, log, sqrt и int (int отбрасывает дробную часть своего аргумента). Функция substr(s, m, n) возвращает n-символьную подцепочку цепочки s, начинающуюся с позиции m. Функция sprintf(формат, выражение, выражение,...) преобразует выражения в соответствии с указанным форматом [см. printf(3S) ] и возвращает полученную цепочку символов.
Шаблон - это произвольная логическая комбинация, составленная с помощью операций!, ||, && и скобок из регулярных выражений и выражений сравнения. Регулярные выражения обрамляются символами / [подробнее см. egrep(1) ]. Отдельное регулярное выражение в шаблоне сопоставляется со всей строкой. Регулярные выражения могут входить и в выражения сравнения. Шаблон может состоять из двух шаблонов, разделенных запятой; при этом указанные действия выполняются для всех строк между строкой, удовлетворяющей первому шаблону, и строкой, удовлетворяющей второму шаблону.
Выражение сравнения - это одна из следующих конструкций:
Выражение опер_сопост регулярное_выражение выражение опер_сравн выражение
где опер_сравн - любая из шести операций сравнения языка C, опер_сопост это ~ (содержится) или!~ (не содержится).
Условие - это арифметическое выражение, выражение сравнения или их логическая комбинация.
Для выполнения каких-либо действий перед первой или после последней строки определены специальные шаблоны BEGIN и END. BEGIN должен быть первым шаблоном, END - последним. Например, для использования символа c в качестве разделителя полей можно либо запустить программу с опцией -Fc, либо указать
BEGIN { FS = c } Остальные специальные переменные: NF Количество полей в текущей записи. NR Порядковый номер текущей записи. FILENAME Имя файла, из которого в данный момент производится ввод. OFS Разделитель полей при выводе, по умолчанию пробел. ORS Разделитель записей при выводе, по умолчанию перевод строки. OFMT Формат вывода чисел, по умолчанию %.6g.
ПРИМЕРЫ
СМ. ТАКЖЕ
egrep(1) , lex(1) , sed(1) .
printf(3S) в Справочнике программиста.
СЮРПРИЗЫ
Входные пробелы не сохраняются при выводе, если поля
этой записи подвергались изменениям.
В языке команды awk отсутствуют явные преобразования между цепочками символов и числами. Чтобы выражение трактовалось как число, прибавьте к нему 0; чтобы трактовалось как цепочка - сконкатенируйте его с пустой цепочкой ""
Основное назначение программы awk - интерпретация языка программирования awk, который позволяет быстро создать программу для анализа и преобразования текстовых файлов. Типичный awk-сценарий построен по следующей схеме:
шаблон1 {действие1} шаблон2 {действие2} ...
Программа читает входной файл или поток и анализирует каждую строку на соответствие шаблону. Если есть соответствие, производятся действия, описанные в фигурных скобках. Если шаблон отстутствует, действие применяется к каждой строке. Если отсутствует действие, строка выводится на стандартный вывод. Действие может состоять из последовательности операторов, разделяемых точкой с запятой.
Печать тертьего поля (колонки, слова) каждой строки:
Ls -l | awk "{print($3)}"
Печать двух указанных полей каждой строки:
Ls -l | awk "{print($9,$1)}"
Печать полей с пробелами:
Ls -l | awk "{print($9," ",$1)}"
Чтобы указать разделитель полей, отличный от пробела, следует использовать параметр -F. В данном случае разделителем полей будет двоеточие:
Awk -F: "{print($2)}" $filenameForProcessing
Чтобы использовать скрипт awk, сохранённый в файле:
Awk -f $scriptFilename $filenameForProcessing
Файл скрипта awk можно сделать исполняемым и указать в нём соответствующий ша-банг. Такой скрипт будет принимать в виде параметра файл для обработки:
#!/usr/bin/awk -f
Переменные языка awk создаются в момент первого обращения к ним и могут содержать целые числа, числа с плавающей запятой или строки, что определяется контекстом. В специальной переменной RS хранится значение разделителя записей (по умолчанию - \n), а в переменной FS - значение разделителя полей (по умолчанию - пробел). Если какая-либо из этих переменныех содержит более, чем один символ, это значение интерпретируертся как регулярное выражение. Язык awk содержит ряд встроенных строковых и математических функций, условные операторы и операторы циклов, поддерживает массивы и определение пользовательских функций. В интернете можно найти обширные руководства по языку awk, а также автоматические трансляторы ("переводчики") скриптов awk на другие языки (например, Си или Перл).
Специальными видами шаблонов являются BEGIN и END. Они не проверяются на соответствие с записями входного потока. Действие по шаблону BEGIN будет выполнено один раз до начала чтения входных данных, а действие по шаблону END - один раз после прочтения входных данных.
Пример удаления соседних дубликатов строк в файле:
Filename=test.txt
res=`awk "BEGIN {PREV=""} {if ($0 != PREV) {print $0; PREV=$0}}" $filename`
echo "$res" > $filename
Перед началом работы мы устанавливаем переменную PREV равной пустой строке. Остальная часть скрипта awk не имеет шаблона и поэтому выполняется для любой строки. Если текущая строка не равна PREV, она выводится, а затем записывается в переменную PREV. Таким образом, при обработке каждой строки, если она окажется равна предыдущей, она выведена не будет.
Пример конкатенации полей:
Awk "{a = $3 $4; print a}" $filename
Пример суммирования значений полей:
Awk "{a = $3+$4; print a}" $filename
Понятие "селектор" следует понимать, как расширение понятия "шаблон". Там, где в структуре команды указан шаблон, в общем случае может стоять любой селектор.
Проверка третьего поля на соответствие регулярному выражению и печать всей строки в случае успеха:
Awk "$3~/(7)$/ {print}" $filename
Проверка первого поля на равенство указанной строке и печать второго поля в случае успеха.
04.10.2015
16:55
Утилита awk является примером классического приложения Linux для обработки текста. Она весьма универсальна и эффективна, хоть и не предоставляет полноценный язык программирования. Однако будьте уверены, что ее возможностей вполне хватит для решения многих задач автоматизированной обработки текста (особенно при комбинировании с другими консольными утилитами).
Если awk -программа достаточно простая и короткая, то ее код можно набрать прямо в консоли:
Awk "< код awk-программы >" < имя_файла_для_обработки >
В качестве входных данных для awk можно использовать не только текстовые файлы, но и вывод в стандартный поток других приложений:
< некое_приложение > | awk "< код awk-программы >"
В случае, когда код awk -программы достаточно объемный или должен быть сохранен для повторного использования, его можно вызывать из файла с ключом -f:
Awk -f < имя_файла_с_кодом_awk_программы > < имя_файла_для_обработки >
Для проведения экспериментов используем файл test.cpp , на котором будем проверять результаты работы awk - программ:
#include
В первую очередь awk позволяет отбирать строки из текста на основе регулярных выражений и некоторых числовых условий.
Например, чтобы получить все строки файла test.cpp , содержащие директиву препроцессора #include , воспользуемся следующей командой:
Awk "/^#\s*include/" test.cpp
Регулярное выражение записывается между двумя символами / . В результате получим:
#include
Чтобы оставить все строки, которые не соответствуют регулярному выражению, воспользуйтесь командой из предыдущего подраздела и поставьте в начало awk -кода восклицательный знак. Например, так мы исключим все закомментированные строки:
Awk "! /^[/]{2}.*/" test.cpp
Вот что осталось:
#include
Определить диапазон строк для вывода на экран можно с помощью двух регулярных выражений, записанных через запятую. В качестве примера найдем определение всех функций, возвращающих int:
Awk "/^int .*(.*) {/, /^}/" test.cpp
Соответствующий результат:
Int main(int argc, char** argv) { std::cout << "Hello, world!" << std::endl; for(int i = 0; i < 10; ++i) { std::cout << i << std::endl; } return 0; } int test2() { std::cout << "Hello, test2!" << std::endl; }
Для проверки строк сразу по нескольким условиям используйте операторы && (И) и || (ИЛИ) .
Следующая команда выводит все комментарии, которые не содержат main:
Awk "/[/]{2}.*/ && ! /main/" test.cpp
В итоге имеем:
// Комментарий в стиле С для функции test1() // Комментарий в стиле С для функции test2()
Ранее мы искали диапазон строк по двум регулярным выражениям, но если номера строк, которые нужно вывести, известные заранее, то все упрощается:
Awk "4 < NR && NR < 7" test.cpp
NR - переменная awk , которая определяет номер строки. Таким образом, представленный код выводит 5-ую и 6-ую строки:
Void test1(); int test2();
Awk может фильтровать текст не только по строкам, но и по отдельным словам. На i -ое слово в строке можно сослаться с помощью $i . Нумерация начинается с единицы, а $0 определяет содержимое всей строки. Количество слов в строке определяется с помощью переменной NF , поэтому $NF указывает на последнее слово. Например, найдем строки, первым словом которых является int или void:
Awk "$1 == "int" || $1 == "void"" test.cpp
Соответствующий вывод на консоль:
Void test1(); int test2(); int main(int argc, char** argv) { void test1() { int test2() {
Однако проще использовать проверку по регулярному выражению для слова. Для этого в awk предусмотрен специальный оператор ~ , который нужно поставить между переменной, указывающей на слово, и регулярным выражением. В качестве примера перепишем предыдущую команду в более компактном виде:
Awk "$1 ~ /int|void/" test.cpp
В awk доступны арифметические операторы языка C, что открывает свободу действий. Пример ниже выводит все четные строки (NR - номер строки):
Awk "NR % 2 == 0" test.cpp
Соответствующий вывод:
#include
Следующая awk -программа выводит все строки, у которых длина 1-ого слова равна трем:
Awk "length($1) == 3" test.cpp
В результате получаем:
Int test2(); int main(int argc, char** argv) { int test2() {
Awk "NF == 2" test.cpp
И соответствующий вывод:
#include
Как вы могли убедиться, awk обладает неплохим набором функций для фильтрации строк текста. Однако для этих строк еще можно выполнять различные преобразования. Команды для работы со строками должны быть обернуты в фигурные скобки { ... } . Код в скобках последовательно вызывается для каждой строки обрабатываемого текста.
В awk имеется прямой аналог функции printf() языка C . В качестве примера выведем в начале каждой строки ее номер:
Awk "{ printf "%-2d %s\n", NR, $0 }" test.cpp
Вот что получили:
1 #include
Кроме printf() есть в awk и другие функции. Например, print() и toupper() :
Awk "{ print toupper($0) }" test.cpp
Соответствующий результат:
#INCLUDE
В awk -программах доступны операторы if-else . Например, следующий код выводит без изменения строки, у которых на 1-ой позиции стоит int , а на последней - { , иначе на консоль отправляется --- :
Awk " { if($1 == "int" && $NF == "{") print; else print "---" }" test.cpp
Выполнение кода приводит к выводу следующего:
Int main(int argc, char** argv) { --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- int test2() { --- ---
Доступны в awk -программах и переменные, которые не требуется предварительно объявлять. Следующий код для подсчета количества строк и слов в тексте поместим в файл stat.awk:
{ lineCount++; wordCount += NF } END { printf "line count: %d, word count: %d\n", lineCount, wordCount }
Тогда его вызов осуществляется следующим образом:
Awk -f stat.awk test.cpp
Результат выполнения:
Line count: 27, word count: 88
Фильтр END указывает, что код в скобках после него должен выполняться только после прохода всех строк. Доступен в awk и фильтр BEGIN , поэтому в более общем случае программа принимает вид:
BEGIN { Вызывается до начала прохода по строкам } { Вызывается для каждой строки после секции BEGIN, но до секции END } END { Вызывается после завершения прохода по строкам }
Wc -lw test.cpp
В awk -программах вам также доступны циклы for и while в стиле C . Для примера выведем все строки в обратном порядке. Создадим файл reverse.awk следующего содержимого:
{ for(i = NF; i > 0; --i) printf "%s ", $i; printf "\n" }
Вызовем программу следующий образом:
Awk -f reverse.awk test.cpp
В результате слова в каждой строке будут выведены в обратном порядке:
По умолчанию awk в качестве разделителя слов использует пробельные символы, однако такое поведение можно изменить. Для этого воспользуйтесь ключом -F , после которого укажите строку, определяющую разделитель. Например, следующая программа выводит название группы и ее пользователей (если в группе есть пользователи) из файла /etc/group , применяя в качестве разделителя символ двоеточия:
Awk -F":" "{ if($4) printf "%15s: %s\n", $1, $4 }" /etc/group
Все рассмотренные ранее фильтры можно использовать совместно с командами обработки строк. Достаточно записать ограничения перед фигурными скобками. Ниже представлен пример для вывода первых 9 строк вывода команды ps , содержащей информацию о пользователе, идентификаторе процесса и имени команды:
Ps axu | awk "NR < 10 { print $1, $2, $NF }"
После запуска увидим:
USER PID COMMAND root 1 /sbin/init root 2 root 3 root 5 root 7 root 8 root 9 root 10