Комбинированные средства системного аудита
Если бы программное обеспечение всегда работало так, как это предполагается, то нам не понадобилось бы писать эту лекцию. Но поскольку мы живем в несовершенном мире, то можем быть уверены в том, что приложения и службы, запущенные на нашей машине, неизбежно будут содержать ошибки. Особенно плохо то, что любое хорошо написанное приложение может работать в нашей системе неправильно сконфигурированным. Ошибки и неверная конфигурация могут облегчить взломщику задачу незаметного проникновения в вашу сеть и систему. Эти проблемы также могут позволить взломщику испортить вам день атакой на критические системы и службы.
Ошибки и неправильная конфигурация называются уязвимостью. Почти каждая система в вашей сети имеет различные уязвимости. Некоторые уязвимости известны как потенциально опасные для взлома, и поставивший себе такую задачу взломщик может рыскать по интернету в поисках программного кода, который может быть взломан. Другие уязвимости пока не несут в себе потенциальной опасности взлома, но всегда могут найтись люди, которые, поработав как следует, над этим вопросом, могут добиться результата. Многие уязвимости просто остаются необнаруженными и ожидают своей очереди.
Атаки на уязвимости обычно влекут за собой крах служб или нарушение нормальной работы. Некоторые из этих атак приводят приложение в состояние, при котором оно не сможет работать; другие пожирают такое количество системных ресурсов, что система не может далее выполнять свои функции. Такие атаки на отказ в обслуживании называются DOS-атаками ( Denial-of-Service ).
Другие уязвимости позволяют взломщику заставить приложение выполнять функции, которые они в обычных условиях выполнять не должны. И поскольку многие службы выполняются с полномочиями пользователя root или администратора (и то и другое не всегда обязательно), взломщик может получить в системе привилегии суперпользователя, избежав обычного процесса авторизации. При таком сценарии есть два типа уязвимостей, которые могут быть использованы: ошибка, позволяющая манипулировать службой непредусмотренным образом (такая, как переполнение буфера - см. лекцию "Простые средства аудита исходных кодов" ), известная, как уязвимость приложения, и ошибка конфигурации службы (запущенной с полномочиями администратора), известная как уязвимость конфигурации. Если служба запущена с полномочиями непривилегированного пользователя с ограниченными правами доступа, то взломщик, использовавший уязвимость приложения, не сможет получить большие полномочия. Если взломщик использовал переполнение буфера против Web-службы, которая запущена с полномочиями администратора, и переполнение буфера привело к возможности выполнения системных команд от лица пользователя Web-службы, то взломщик получает полный доступ к системе. Однако если взломщик использует переполнение буфера против Web-службы, которая запущена с полномочиями непривилегированного пользователя ("IUSR"), то он получит доступ только к той части системы, к которой имеет доступ пользователь IUSR. Устраняйте уязвимости конфигурации, уязвимости приложения доставляют меньше хлопот.
Цель для менеджеров и администраторов сети - найти уязвимости в сети раньше, чем это сделает кто-то другой.
Nessus
Программа Nessus представляет собой удаленный сканер уязвимостей, свободно доступный для загрузки по адресу http://www.nessus.org/. Программа обеспечивает эффективную чистку систем в вашей сети от известных ошибок конфигурации сети и уязвимостей приложений. В этой лекции мы сосредоточимся на версии 1.0.10 программы, а также обсудим версию 1.2.0, которая скоро будет выпущена. В Nessus 1.2.0. добавлены возможности типа поддержки SSL, оптимизации проверки уязвимостей и возможность сохранения сессии.
Nessus - клиент-серверное приложение. Сервер nessusd запускается под управлением Unix и выполняет черную работу, сохраняя информацию о различных тестах уязвимости и выполненном сканировании. Он имеет собственную пользовательскую базу данных и метод безопасной аутентификации, так что удаленные пользователи, использующие клиент Nessus (Unix- или Windows-версии) могут войти, настроить сканирование уязвимостей и установки соответствующих режимов.
Создатели Nessus разработали соответствующий скриптовый язык (называемый Nessus Attack Scripting Language, или NASL ) для использования в рамках приложения. В Nessus сканирование каждой из уязвимостей строится на основе отдельного встраиваемого модуля, написанного на NASL. Такая модульная архитектура позволяет легко добавлять процедуры сканирования уязвимостей (и, возможно, тестов на взлом), как только будут обнаружены новые виды уязвимостей. Сообщество Nessus поддерживает собственную базу уязвимостей, обновляемую ежедневно, и они предлагают простой скрипт ( nessus-update-plugins ), который вы можете запустить еженощно (поместив в директорию cron) для автоматического обновления базы встраиваемых модулей.
Nessus - интеллектуальная программа: он может распознать службу, запущенную на другом порту, отличном от стандартного номера порта, который предусмотрен в Internet Assigned Numbers Authority (IANA). Если у вас есть Web-сервер, запущенный по порту 8888, Nessus может найти его и попытаться протестировать с помощью CGI-теста. С другой стороны, если Nessus не может найти ни одного Web-сервера в системе, которую он сканирует, он пропустит для этой системы все тесты для Web-сервера и CGI-тесты.
Nessus отличается тщательностью, так как многие встраиваемые процедуры не только сканируют систему на наличие уязвимостей, но и пытаются осуществить взлом уязвимостей и составляют об этом соответствующий отчет. Иногда такая деятельность может быть немного опасна, поскольку удачный взлом может привести к краху сканируемой системы или к потере данных. Тем не менее, поскольку Nessus дает полное описание того, как тестируется та или иная уязвимость, вы можете принять решение о том, какие тесты не следует применять.
В отличие от многих свободно распространяемых Unix-утилит, Nessus составляет необычайно подробные отчеты, хорошо построенные и доступные в различных выходных форматах, таких как plain text, HTML и LaTeX. Программа различает события в области безопасности по классам от замечания ( notes ) до предупреждения ( warnings ) и дыр ( holes ), каждый из которых разбивается по уровням от низкого ( Low ) до очень высокого ( Very High ).
Инсталляция
Инсталляция демона Nessus может оказаться сложной. Он требует для своей установки наличия GIMP Toolkit (GTK) и nmap (см. лекцию "Сканеры портов" ). Nessus можно загрузить в четырех отдельных пакетах: nessus-libraries, libnasl, nessus-core и nessus-plugins. Каждый пакет необходимо загрузить, скомпилировать и инсталлировать (обычно с помощью процедур configure, make, make install ) в том порядке, как эти пакеты были перечислены. Nessus также поставляется в едином архиве ( nessus-installer.sh ), который включает все пакеты и обеспечивает для вас полную инсталляцию.
Реализация
Помните, что Nessus - клиент-серверное приложение. После успешного завершения компиляции следующим шагом будет запуск демона, который поддерживает запросы по сканированию и выполняет основную работу. Для начала необходимо сконфигурировать демона.
Поскольку у клиента Nessus должна быть возможность соединиться с демоном, в первую очередь необходимо создать сертификат для демона (для версии 1.2.0 - если вы хотите, чтобы связь между клиентом и сервером шифровалась по протоколу SSL) и создать как минимум один клиентский профиль. Утилита nessus-mkcert, входящая в состав Nessus 1.2.0, позволяет создать SSL-сертификат и обеспечивает поддержку процесса его создания. Утилита nessus-adduser может быть использована для добавления пользователей в базу данных Nessus. При запуске утилиты nessus-adduser вы получаете запрос на ввод имени пользователя и типа аутентификации. Версия 1.2.0 позволяет сделать выбор между аутентификацией по паролю или по сертификату. Для пользователей версии 1.2.0 обычно достаточно аутентификации по паролю. Для пользователей более ранних версий предпочтительней аутентификация по коду. Вас могут попросить настроить параметры, описывающие, откуда разр ешен доступ пользователям (по умолчанию отовсюду), и ввести одноразовый пароль, на котором будет базироваться аутентификация по коду. Как только вы соединитесь с Nessus первый раз с использованием имени пользователя и пароля, все последующие соединения не потребуют ввода пароля. Если вы используете версию 1.2.0, пароль вам может понадобиться каждый раз, если только вы не задали аутентификацию по сертификату (см. страницы справки). Вы можете сконфигурировать правила для каждого пользователя (например, какие машины разрешено сканировать пользователю), но многопользовательская конфигурация выходит за рамки тем, обсуждаемых в этой книге. Для наших целей оставьте список правил пустым, нажав CTRL-D и подтвердив создание пользователя, введя символ y и нажав ENTER.
Файл nessusd.conf (который устанавливается по умолчанию в директорию /usr/local/etc/nessus/) содержит несколько глобальных параметров сканирования, которые вы захотите пощупать. Переменная max_threads (по умолчанию равна 8) может быть увеличена, если вы хотите ускорить сканирование, и ваша система может выдержать нагрузку. В добавление к легко читаемому отчету Nessus может сохранять детали каждого своего теста в журнале. Это особенно полезно, если вы увидите в отчете что-то, что покажется вам необычным, и захотите понять, почему появилось это сообщение в отчете. Вы можете сконфигурировать место размещения этого журнала (по умолчанию /usr/local/var/nessus/nessusd.messages ) и уровень детализации ведения журнала, используя переменную logfile и другие относящиеся к этому переменные ( log-:).
Другой важный параметр предназначен для настройки интервала портов, которые вы хотите сканировать ( port_range ). Nessus сначала использует nmap, чтобы определить порты, прослушиваемые в системе. По умолчанию, Nessus прослушивает порты с номером больше 15000. Увеличение интервала сканирования увеличивает время работы, но это необходимо, если вы хотите осуществить полное сканирование сети.
Еще две переменные, которые влияют на продолжительность сканирования (и его точность) - это check_read_timeout и delay_between_tests. Первая переменная определяет время ожидания ответа перед тем, как перейти к следующей операции, а вторая определяет время ожидания перед повторением опроса того же самого порта (в случае с тестом CGI для Web-сервера). Переменная check_read_timeout здесь - существенный фактор. Значение по умолчанию составляет 15 секунд. Уменьшение значения до 5 секунд может сделать ваше сканирование слишком быстрым, но вы можете что-нибудь потерять, закончив ожидание слишком быстро. Есть вероятность, что сканируя локальную сеть, можно установить очень маленькое значение параметра check_read_timeout. Значение по умолчанию для переменной delay_between_tests равно 1 секунде, и это, в большинстве случаев, наилучший выбор.