98
№1(26) январь 2005 подписной индекс 81655 www.samag.ru Обзор дистрибутива SuSE Professional 9.2 Прокси-сервер oops: первые впечатления Как защищают программное обеспечение Путешествие из Perl в Excel Нити в Perl HOTSPOT – это просто! Программное управление файловой системой с помощью VBScript Восстановление NTFS Организация общего доступа в Интернет и защиты от вторжений на основе Kerio WinRoute Firewall 6 Обзор дистрибутива SuSE Professional 9.2 Прокси-сервер oops: первые впечатления Как защищают программное обеспечение Путешествие из Perl в Excel Нити в Perl HOTSPOT – это просто! Программное управление файловой системой с помощью VBScript Восстановление NTFS Организация общего доступа в Интернет и защиты от вторжений на основе Kerio WinRoute Firewall 6 №1(26) январь 2005

026 Системный Администратор 01 2005

Embed Size (px)

DESCRIPTION

HOTSPOT – это просто! Путешествие из Perl в Excel Путешествие из Perl в Excel Нити в Perl Нити в Perl Восстановление NTFS Восстановление NTFS Прокси-сервер oops: первые впечатления Прокси-сервер oops: первые впечатления Как защищают программное обеспечение Как защищают программное обеспечение

Citation preview

Page 1: 026 Системный Администратор 01 2005

№1(26) январь 2005подписной индекс 81655

www.samag.ru

Обзор дистрибутива SuSE Professional 9.2

Прокси-сервер oops: первые впечатления

Как защищают программное обеспечение

Путешествие из Perl в Excel

Нити в Perl

HOTSPOT – это просто!

Программное управлениефайловой системойс помощью VBScript

Восстановление NTFS

Организация общего доступав Интернет и защиты от вторженийна основе Kerio WinRoute Firewall 6

Обзор дистрибутива SuSE Professional 9.2

Прокси-сервер oops: первые впечатления

Как защищают программное обеспечение

Путешествие из Perl в Excel

Нити в Perl

HOTSPOT – это просто!

Программное управлениефайловой системойс помощью VBScript

Восстановление NTFS

Организация общего доступав Интернет и защиты от вторженийна основе Kerio WinRoute Firewall 6

№1(

26)

янв

арь

2005

Page 2: 026 Системный Администратор 01 2005
Page 3: 026 Системный Администратор 01 2005

1№1, январь 2005

оглавление

Linux из Редмонда:обзор Lycoris Desktop/LX

Валентин Синицын[email protected] 8

Прокси-сервер oops:первые впечатления

Сергей Супрунов[email protected] 12

SuSE 9.2 снаружи и изнутри

Алексей Барабанов[email protected] 3

Программное управление файловойсистемой с помощью VBScript

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

HOTSPOT – это просто!

Андрей Платонов[email protected] 22

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

Организация общего доступав Интернет и защиты от вторженийна основе Kerio WinRoute Firewall 6

Роман Марков[email protected] 28

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

Защита файловой системыпри помощи нестандартногоиспользования снапшотовв программе ShadowUser

Денис Батранков[email protected] 35

Как защищаютпрограммное обеспечение

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

Путешествие из Perl в Excel

Сергей Супрунов[email protected] 56

Нити в Perl

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

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

ТЕНДЕНЦИИ 2

Сетевой полицейский

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

Защита сетевых сервисовс помощью stunnelЧасть 2

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

Все в одном, или Hogwashкак пример Gateway-IDS

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

JpGraph

Кирилл Сухов[email protected] 70

Веб-сервис для разработчиков сайтов

Даниил Алиевский[email protected] 77

WEB

Запись дисков CD-R/RW в LinuxЧасть 3

Владимир Мешков[email protected] 78

HARDWARE

Обучение при помощи ATutor

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

ОБРАЗОВАНИЕ

Восстановление NTFS –undelete своими руками

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

BUGTRAQ 49, 61, 76, 83

Page 4: 026 Системный Администратор 01 2005

2

тенденции

Новые технологии HP25 января в отеле «Пента Ренессанс» прошла пресс-кон-ференция компании HP, посвященная представлению но-вых серверов семейства HP Integrity среднего и старшегоуровня на базе нового процессора Madison9M.

Во вступительном слове Дмитрий Пенязь, руководительподразделения бизнес-критичных серверных решений вРоссии и странах СНГ, рассказал о стратегии развития биз-нес-критических систем HP и причинах перехода на архи-тектуру Intel Itanium 2.

В процессоре Intel Itanium 2 повышена частота до 1.6,1.5 Ггц, увеличен кэш второго уровня до 9 Мб. За счет би-нарной совместимости ОС с двухпроцессорными модуля-ми HP mx2 и процессорами Intel Itanium 2 6M замена про-цессоров не требует перекомпиляции приложений, а оди-наковый процессорный разъем и совместимость с набора-ми микросхем HP zx1 и HP sx1000 призваны обеспечитьлегкую миграцию на Itanium 2.

Повышена масштабируемость и гибкость в Linux-реше-ниях: вдвое увеличено количество процессоров – с 8 до 16под управлением SUSE Linux Enterprise Server 9 на базепоследней версии ядра 2.6, добавлены расширенные воз-можности по виртуализации с использованием GlobalWorkload Manager. Усилена безопасность и добавлены но-вые возможности управления вычислительными нагрузка-ми в HP-UX 11i. Для Windows добавлены новые возможно-сти Systems Insight Manager и Intergity iLO.

Также на серверах HP Integrity теперь работает опера-ционная система OpenVMS 8.2. Система работает на 3 ап-паратных платформах – VAX, Alpha и Itanium. Поскольку этаОС построена на базе общих исходных текстов, это позво-лит в дальнейшем выпускать модули модернизации ОС сра-зу для HP Intergity и HP AlphaServer. OpenVMS 8.2 поддер-живает «смешанные» кластерные конфигурации, состоя-щие из узлов HP Integrity и HP AlphaSever (SSI до 96 узловс расстоянием до 800 км). По заявлениям сотрудников HPкластеры из 3 платформ официально не поддерживаются,но также работают.

Продолжаются работы в направлении виртуализации.В HP Virtual Server Environment внесены следующие усовер-шенствования: для платформы Windows – оплата по прин-ципу коммунальных платежей (HP Pay Per Use for Windows),для HP-UX 11i и Linux – ПО управления вычислительными

Äìèòðèé Ïåíÿçü, ðóêîâîäèòåëü ïîäðàçäåëåíèÿ áèçíåñ-êðèòè÷-íûõ ñåðâåðíûõ ðåøåíèé â Ðîññèè è ñòðàíàõ ÑÍÃ. Îëåã Âàñü-êîâ, ìåíåäæåð íàïðàâëåíèÿ ñåðâåðíûõ ðåøåíèé äåïàðòàìåíòàòåõíîëîãè÷åñêèõ ðåøåíèé, HP Ðîññèÿ

Череда новогодних UNIX-релизовПервого января состоялся выпуск очередного (четвертого)обновления к последней стабильной версии Debian GNU/Linux(3.0, «woody»). В rev4 представлены накопившиеся за пос-ледний месяц заплатки к найденным уязвимостям, доступ-ные на security.debian.org, и незначительные исправленияошибок. Михльмаер, лидер проекта, тем временем, сообща-ет, что новая стабильная версия дистрибутива – «Sarge» –появится «в начале этого года». 4 января Mandrakesoft анон-сирует свои новые Linux-продукты для корпоративных пользо-вателей: Corporate Server и Corporate Desktop, оснащенныевсем лучшим из наработок компании в сочетании с откры-тым и коммерческим ПО, а также с качественным уровнемобслуживания и 5-годовой поддержкой. Патрик Волкердинг,несмотря на продолжающиеся исследования состояния здо-ровья, выпускает бета-релиз Slackware 10.1, а также проситвсех пользователей не беспокоиться о будущем системы: онав надежных в руках и без поддержки не останется. 19 янва-ря до восьмой (8.0) версии обновляется популярная и много-функциональная открытая база данных PostgreSQL, для ко-торой серверная Win32-платформа становится «родной». 25января выходит в свет очередной стабильный релиз FreeBSDиз четвертой ветки – 4.11-RELEASE. Все традиционно: пат-чи, поддержка новых устройств, небольшие улучшения.

Sun и Open SourceSun Microsystems продолжает подчеркивать свою благо-склонность к открытым и бесплатным проектам: сначалакомпания выкладывает для свободного скачивания Linux-систему Java Desktop System 2.0, а затем и исходники Java6 «Mustang». Кроме того, представители Sun не перестаютговорить об открытии Solaris, и в конце месяца осуществ-ляется первый шаг уже широко разрекламированной ак-ции: структура DTrace, одна из составляющих операцион-ной системы, опубликована под Open Source лицензиейCDDL. В сети появляется веб-сайт, посвященный проводи-мой Sun кампании, – www.opensolaris.org. Также поддерж-ку Open Source в очередной раз демонстрирует и IBM, пре-доставив в свободное пользование 500 своих патентов.

Очередные пополнения в Linux-группахAMD и RealNetworks становятся спонсорами грядущей кон-ференции Desktop Summit, учрежденной компанией Linspireи посвященной обсуждению открытого программного обес-печения. Китайские разработчики из Red Flag Software,активно готовящие к лету релиз Asianux 2.0, примыкают кLinux-лаборатории OSDL. А позже в OSDL приходит и Трид-желл, автор Samba, который, став вторым после ЛинусаТорвальдса «OSDL Fellow», продолжит работу над «крити-чески важным компонентом для Linux» при поддержке гло-бального Linux-консорциума.

Составил Дмитрий Шуруповпо материалам www.nixp.ru

нагрузками, кластерное ПО HP Serviceguard для HP-UX 11iи Linux для повышения доступности в средах Oracle и SAPи многое другое.

Кирилл Тихонов

Page 5: 026 Системный Администратор 01 2005

3№1, январь 2005

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

Как известно, с 8 ноября прошлого года официально нача-лись продажи новейшего дистрибутива от SuSE с номером9.2 [1]. В результате бурного развития процессов глобализа-ции уже 11 ноября можно было заказать этот дистрибутивна nixp.ru [2], и спустя всего две недели после начала про-даж один из таких заказов был доставлен мне. Еще немно-го, и можно будет получать новые выпуски SuSE раньше,чем сами трудолюбивые немцы увидят их в магазинах, точ-но так же, как и последние голливудские фильмы раньшеамериканцев. Это не шутка, ибо выложить на ftp получен-ный дистрибутив в нашей стране можно было бы прямотогда же, а вот сама SuSE смогла разместить версию ftp наофициальных зеркалах [3] лишь 5 января 2005 года, то есть,как обычно, спустя пару месяцев.

Теперь делюсь некоторыми впечатлениями. Кто ожидаетуслышать подробное step-by-step по настройке станции наSuSE, увы, не найдет этого. Здесь лишь некоторая инфор-мация и личные ощущения от последнего дистрибутива всравнении с предыдущими. Скриншоты экранов и реклама«все ставьте SuSE» тоже представляется малоинформатив-ной именно потому, что установка системы не представляетпроблемы в подавляющем большинстве случаев, и поэтомуприведение доказательств ее успешного проведения лишьвызывает сомнения в адекватности респондента. Хотя же-лающие могут полюбоваться снимками экранов на сайтеSuSE [1], то есть теперь уже на разделе сайта Novell.

Итак, начинаем установку на простенькое железо iC1700-i845+ti4200+lcd15”. Все назначаем «по дефолту». Сразу за-метно, что заставки установщика обрели «казенную» новел-ловскую стилистику. Собственно SuSE и так не отличалсяигривостью MDK (пингвинчики во всяких видах и проч.), по-скольку делался прагматичными немцами, но теперь дажеокантовка модальных окон linuxrc получила засечки в стилеMS Windows-286. Если судить по экрану загрузки установ-щика системы, то все постепенно обретает черты посинев-шей Netware. Еще одно почти косметическое изменение про-изошло с кодом управления заставкой загрузчика. Уже при-вычный код F2 для включения детализации изменен на Esc,что плохо, поскольку это общепринятый код отмены, и еслион случайно «зависнет» в буфере или просто продублирует-ся из-за неисправной клавиатуры, то его может получитьпервое загруженное приложение. Такой выбор можно объяс-нить только влиянием Novell и стереотипами виндового GUI.

В этой версии установщика, как и в предыдущей, снова

предлагается русский язык, и причем вполне корректно, еслине считать фразы вроде «Кликните на любом заголовке, что-бы сделать изменения» и странное изменение числа с «На-стройка устройства» (одного!) на «Настройку оборудования»(уже многих) при движении по этому меню. То есть русскийязык можно смело выбирать без риска получить нечитае-мые сообщения на экране. Тем более это приятно для жите-лей зоны GMT+3, которая ставится в этом случае автомати-чески, как и вообще вся остальная локализация для «Евро-па/Россия», в том числе ru_RU.UTF-8 и переключение языкаввода через <Ctrl+Shif>. Не забыли даже русскую локализа-цию в KDE, что ранее бывало частенько. Хотя в важных слу-чаях, когда надо получить однозначный и вразумительныйответ от пользователя, установщик снова теряет доверие крусскому переводу и переходит на привычный английский.Например, после уточнения параметров установки подтвер-ждение требуется на англо-русском, предлагая выбор меж-ду «Назад» и «Install».

Далее все как обычно. Снова SuSE по умолчанию пред-лагает ставить reiserfs, к которой идеологи компании испы-тывают труднообъяснимую мужскую симпатию. Если комуеще не известно, то в процессе установки доступны допол-нительные консоли через <Alt+F№>, на которых можно про-следить как ход установки, так и подправить что-то. Напри-мер, подгрузить недостающие модули или удалить что-то,если установка идет поверх старой версии.

Итак, установка началась. В прогнозе заявлено, что оназавершится через 38 минут. Причем в этой версии времясчитается как до окончания всей установки, так и до запро-са нового CD. То есть, теоретически до запроса очередногоCD можно устроить легкий кофе-брейк.

Но скучать и перекуривать некогда. Выходим, как и пре-дупреждали, в соседнюю консоль и подсматриваем, в какомрежиме происходит установка. По тривиальному запросу «psxua» узнаем, что y2base запускает для установки каждогопакета нечто вроде следующего (в фигурных скобках ком-ментарии автора):

SuSE 9.2 СНАРУЖИ И ИЗНУТРИОБЗОР ДИСТРИБУТИВАSuSE Professional 9.2

АЛЕКСЕЙ БАРАБАНОВ

rpm �root /mnt �dbpath /var/lib/rpm -U �-persent--nosignature {à âäðóã ìàíòåéíåðû «ëåâûå» ïîïàäóòñÿ}--force {ñèñòåìó ñòàâèòü, çàòèðàÿ âñå êîíôëèêòíûå ôàéëû}--nodeps {àâòîðû linuxrc âîîáùå íå äîâåðÿþò íèêîìó èç suse/people}--ignoresize {èãíîðèðîâàòü, òàê âñå, «äî êó÷è»!}/var/adm/YaST/InstSrcManager/IS_CACHE_0x00000001 ↵↵↵↵↵

/MEDIA/suse/...*.rpm

Page 6: 026 Системный Администратор 01 2005

4

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

Вопреки тому, что в формате rpm присутствуют связи, ив базе rpm-пакеты регистрируются тоже с учетом связей, исам дистрибутив SuSE относится к rpm-дистрибутивам, нопо давней традиции и в силу происхождения SuSE отSlackware установщик этого чудного изделия напрочь игно-рирует преимущества формата rpm перед tgz. И несмотряна такую явно беспроигрышную манеру установки инстал-ляция в первый раз «замерзает» на файле fonts-config-20041001-2. Выяснение источника проблемы указывает, чтопроцесс rpm с номером 4062 имеет статус D+, что, скореевсего, не лечится. Огорчению нет конца – а вдруг fonts-config«битый»? Ведь использовался не оригинальный диск, а все-го лишь дубликат, выполненный на непрофессиональномоборудовании. Но что делать, надо спасать ситуацию. Выру-чают, как обычно, «три заветные кнопки». И здесь получаемвторой сюрприз! Эксперимент проводился на компьютере,где уже ранее стоял SuSE 9.1 и одновременно с этим быларабочая копия Windows. Но вот незадача, у коллектива SuSEкроме симпатии к Хансу Рейзеру есть еще одна – к разра-ботчикам GRUB. И они усиленно насаждают именно его вкачестве системного загрузчика. Так как вторая стадия GRUBнаходилась на разделе, который был только что сформати-рован в процессе установки, то Windows стал недоступен.Использование другого загрузчика, например LILO, могло быизбавить пользователей от подобных проблем.

Короче, отступать некуда, надо ставить SuSE во что быто ни стало. Во второй раз выбираем минимальную конфи-гурацию установки. Система прогнозирует установку па-кетов общим объемом 350 Мб, ставится только с первогоCD и предполагает время своей установки в 5 минут. Надоотметить, что не обманывает, ставится успешно именно за5 минут.

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

Из негатива – то, что в минимальную установку сноване вошел mc. Эта утилита периодически вносится в мини-мальную систему, поскольку рациональна и удобна, и с не-изменным постоянством изымается, поскольку презирае-ма юниксовыми снобами. В релизе SuSE 9.2 снобы побе-дили. А может, победило соображение, что mc собираетсяобычно с зависимостями от библиотек Xfree86 и множестваутилит, а этого стараются избегать в минимальной устано-вочной системе.

Полностью минимальная система занимает 705 Мб дис-кового объема. Это несколько больше, чем размеры подоб-ных установок большинства дистрибутивов, и практическивплотную приближается к разумному пределу для понятияминимальное в отношении Linux-дистрибуции, поскольку си-стема большего объема уже не сможет быть клонированас помощью CD без компрессии.

Но успешная установка показала, что с копией дистри-бутива все ОК. Чтобы не заниматься утомительным пере-биранием CD, дистрибутив с CD-дисков переносим на DVD

по известной методе [4] и устанавливаем так, как и плани-ровалось, со всеми настройками по умолчанию.

Конечно, как не перекладывай дистрибутив с CD на DVD,все равно версия, поставляемая на CD, содержит менее двухс половиной тысяч пакетов, что совершенно не удовлетво-рительно для SuSE и совершенно недостаточно для рабо-ты. Скажем так, непривычна подобная бедность пользова-телям SuSE. Работая с продукцией этой фирмы, практи-чески не приходится прибегать к использованию пакетовиз других источников, кроме установочных носителей. И кэтим прекрасным привычкам возвращает использованиедвухслойного DVD из дистрибутива SuSE, полученного изтого же источника, что и первая копия [1]. Число разме-щенных там пакетов приближается к привычному пределув четыре тысячи. Дифференциальный список составляет1623 пакета [5]. Там очень много достаточно важных эле-ментов. Например, все относящееся к IP-телефонии AtaAuto,asterisk, bayonne и весь набор openh323. Все приложения,необходимые для создания вычислительных кластеров икластеров heartbeat. Важные серверные приложенияarpwatch, apcupsd, nagios. То, без чего просто не построитьсетевой коммутатор, bridge-utils и ebtables. Большое числоприложений из разряда security, например tynyca и наборутилит и библиотек для работы с электронными ключами икартами pcsc. Большинство пакетов разряда *-devel такжеразмещено только на DVD, включая и компилятор для NET.В разряд «не для всех» попал даже PostgreSQL и совер-шенно необходимый на взгляд автора leafnode. Короче,крайне не рекомендуется использовать дистрибутив на CD,чтобы не испортить впечатление от нового SuSE, особеннодля тех, кто сталкивается с этим дистрибутивом впервые.

Поэтому откладываем урезанный вариант в коллекциюи далее работаем только с полной DVD-версией. Проверкана железе проходит безупречно. Более интересный резуль-тат показывает установка в среду виртуальной машиныVMware5 beta, запущенной под SuSE 9.1. Установщик не-правильно понимает виртуальную видеокарту и переходитна общение в текстовом режиме, хотя и предлагает уста-новку графической среды. Которая, будучи запущеннойпосле перезагрузки, не только отлично работает, но и пос-ле установки режима с большим разрешением, чем стар-товые 640 на 480, прекрасно его держит. Все остальноетакже безупречно. То есть, такая проверка выявляет отсут-ствие должных деловых контактов между командой разра-ботчиков linuxrc и командой, совершенствующей YaST.

Дистрибуция SuSE является очень динамическим обра-зованием. Релизы выпускаются по меньшей мере дваждыв год, а между выпусками постоянно вносятся исправления.Уже много лет подряд главным признаком скорого появле-ния очередного дистрибутива является создание на офи-циальных зеркалах SuSE [3] директории с обновлениями кеще не выпущенному дистрибутиву. Итак, обновления – иблаго, и источник беспокойства. Зачастую их объем весьмазначителен. Так, например, спустя менее 2 месяцев посленачала продаж объем обновлений к новому SuSE уже пре-вышает 500 Мб. Это приводит к тому, что свежепоставлен-ная система сразу же требует потратить значительный тра-фик на ее доведение до соответствия всем последним из-менениям, в том числе и по безопасности. Поэтому разум-

Page 7: 026 Системный Администратор 01 2005

5№1, январь 2005

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

но или заранее скачать обновления и добавить их к дист-рибутивному DVD, как подсказано по ссылке [4], или сде-лать специальный patch-диск. Для создания такого дисканадо разместить в корне подготовленного ISO-имиджа це-почку вложенных директорий i386/update/9.2/*, подобно томукак они размещаются на f tp-зеркалах, например, вftp.mirrors.net.ar/pub/suse/i386/update и так далее. Внутридолжна обязательно присутствовать директория patches/,содержащая информацию о патчах, и директория rpm/, вкоторой внутри директорий одноименных с названиями ар-хитектур, а именно i586, noarch и x86_64, размещены соб-ственно патчи. Это все. Достаточно создать такие директо-рии, наполнить их файлами с ftp, записать на диск, и тогдаможно выбирать в YaST пункт меню «Обновление с patchCD» и устанавливать апдейты прямо с созданного диска.

Теперь снова вернемся к вопросу переноса дистрибу-тива SuSE на DVD, но уже не с набора CD, а с дорогогодвухслойного на обычный и дешевый. Изначально размеримиджа такого оригинального Double Layer DVD составля-ет 7680 Мб. Если выкинуть директорию, содержащую фай-лы для 64-битной архитектуры, то останется 4971 Мб. Опятьнедостаточно. Значит, вопрос в том, что сократить еще. Тео-ретически, надо удалить некоторое число пакетов общимобъемом 200 Мб. Самое простое – выкинуть локализацию,кроме русской и 5 европейских языков – английского, не-мецкого, французского, испанского и итальянского. Из ува-жения к Барселоне оставим еще и каталонский. Украинскийсамо собой тоже. Итак, удаляем «лишние» локализации изOpenOffice, aspell, ispell, kde3-i18n, koffice-i18n, mozilla, myspell,ted. Общим числом 160 и общим объемом на 491 Мб [7].Остается 4497 Мб, которые и укладываем в новый имидж. Витоге получили 4352 Мб в готовом образе DVD. Иначе гово-ря, проявив немного более решительности в избавлении отлингвистических излишков, можно еще получить место длядобавления нужных утилит из сборников третьих произво-дителей [8]. Например, тот самый Mplayer сборки из misc/packman/suse/9.2/. Важно отметить, YaST опознает диск внепримонтированном состоянии по меткам ISO9660. Ключе-выми являются метки Volume, Publisher и Application. Еслиустановка некоторого дистрибутива происходила с диска,который был далее модифицирован, то новый ISO9660-имидж надо создавать точно с такими метками, иначе YaSTего не «почувствует».

Отметим некоторые метрики. В SuSE92 для архитекту-ры IA32 предложено 332 пакета, а для x86_64 уже 3972! Еслиучесть, что 6 пакетов в IA32 продублированы в i586 и в i686,то получается еще меньше, а именно 3926. Кстати, во всехдальнейших подсчетах продублированные пакеты создаютнекоторое расхождение в полученных суммах с листингами,созданными утилитой diff и другими. В версии CD всего 2311пакетов в числе которых 6 для i686, то есть реально 2305.

Вот итоговые числа, сведенные для наглядности в таб-лицу.

Разберемся, в чем же дело. Может, стоит всем дружноперейти на новую 64-битную архитектуру. Создадим спис-ки пакетов в разделах i586 и x86_64 с помощью простень-кого скрипта вроде следующего:

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

Заглянув в полученный дифференциальный список, рас-крываем секрет несоразмерно большого числа пакетов дляx86_64. В разделе x86_64 дополнительно уложены пакеты,содержащие 32-битные версии. Это вызвано спецификойобработки платформенных зависимостей менеджером rpm.Например, arts из i586 содержит полную версию для IA32.Аналогичный пакет arts из x86_64 содержит полную вер-сию для 64-битной архитектуры, а добавка arts-32bit содер-жит только библиотеки от архитектуры IA32. Теоретическиэти библиотеки можно было бы экстрагировать из пакетовраздела i586, но практически rpm так не умеет делать, ипоэтому мы обречены произвести второй подсчет, но ужеисключив пакеты с суффиксом 32bit в имени.

Полный результат можно посмотреть по ссылке [9]. Этотсписок сообщает, что счастливые обладатели компьютеровна 64-битных процессорах не смогут пользоваться практи-чески всеми имеющимися в дистрибутиве эмуляторами отFAUmachine до wine и dosemu.

Им будет недоступно огромное число драйверов, вклю-чая и драйвера софтмодемов. Будут лишены они и OpenOfficeвместе с Acroread, и RealPlayer. Заодно и etherboot с netboot.Короче, тестировать такие компьютеры уже можно, но ра-ботать все-таки лучше на традиционных.

Но уверен, что строка чисел, относящихся к FTP-версии,также должна вызвать вопросы. Традиционно в SuSE вер-сия, подготовленная для FTP, то есть практически для бес-платного скачивания, всегда выходила позже, что очевидно,и, как правило, с ограничениями, которые были вызваны непроблемами хостинга, а тем, что в «коробочную» версиюдобавлялись программные продукты, специально подготов-ленные для промоутинга. Например, демо Loki Games илирелизы VMWare. Конечно, на FTP это отсутствовало. Но современем разница между «коробкой» и FTP становилась всеменьше и меньше. Настоящий релиз не исключение. В кате-гории i586 в FTP недостает лишь BEAJava2-JRE, BEAJava2-SDK, что совсем не обижает, ну сколько же можно коллекци-онировать Java-клонов, особенно производства таких ком-паний, которые не желают открыто размещать свои продук-ты. А в категории x86_64 даже наметилось превосходствоFTP-релиза! Добавлен «свеженький» драйвер km_usbvisionдля веб-камер Zoran/Nogatech USBVision. Другими словами,FTP-версия ничем не уступает, а если учесть то, что пакеты,в нее входящие, имеют более «свежие» индексы, то и пре-

# ls -l /mnt/suse/i586 | perl -ni -e ↵↵↵↵↵'@s=split(/\d\d\:\d\d); @q=split(/-(\d)*\./,$s[1]); ↵↵↵↵↵print $q[0], "\n"' | sort -u >i586.list

# diff x86_64.list i586.list > x86_64-i586.list

# cat x86_64.list | grep -v 32bit >x86_64only.list# diff x86_64only.list i586.list > x86_64-i586.list

Page 8: 026 Системный Администратор 01 2005

6

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

восходит «коробочный» вариант, поэтому счастливые вла-дельцы безлимитных подключений к Интернету могут сме-ло выкачивать с зеркал SuSE [3] FTP-версию последнего ди-стрибутива и, переложив ее на DVD, как описано в [4], ста-вить на свои рабочие станции и сервера.

Может сложиться впечатление, что в SuSE совершеннонапрасно потратились на CD в своем дистрибутиве. Прак-тически, да. Лишь одно оправдание есть для CD. Первыйиз них играет важную роль как спасательный диск и дискдля установки минимальной системы. Точнее, установкаSuSE производится в два этапа. На первом этапе системав базовом варианте устанавливается только с первого дис-ка. Затем происходит перезагрузка, и далее ставятся не-достающие пакеты с других дисков, если это необходимо.Поэтому набор пакетов на первом диске является самодо-статочным с точки зрения связей rpm [10]. Это говорит овысоком качестве сборки. Замечу, что до версии 7.3 SuSE –о таком можно было лишь мечтать. Инженеры SuSE посте-пенно, путем проб и ошибок, приходят ко многим очевид-ным для остальных истинам. Например, столь долго всехудивлявшие полной никчемностью, Live Evaluation CD на-чиная с версии 9.1 трансформировались в полноценные LiveCD. Но вместо этого появилась новая странная вещь, такназываемый SuSE-Linux-9.2-mini-installation.iso. Это загру-зочная часть стандартного дистрибутивного носителя вме-сте с initrd установщиков и спасательных дисков. Как напи-сано в сопровождающем этот артефакт README.txt, сиепредназначено для установки никак не минимального, аполного релиза SuSE с удаленного примонтированного ре-позитория. Можно предположить, что это что-то вроде ба-зовой системы Debian для установки с официальных зер-кал. Но нет. Имидж этот лежит уже давно, а ftp-версия SuSEтолько-только появилась. Короче, загадочно назначениеэтого продукта мысли, если только не принять версию, чтоftp-установщик выложили за пару месяцев до ftp-релиза из-за неожиданного перевыполнения графика работ. Но естьнадежда, что со временем все эти робкие попытки позна-ния истины приведут к тому, что в SuSE догадаются соеди-нить Live-CD, CD1 и псевдо-mini-installation в один имидж,выкинув все остальные CD из дистрибутива совсем.

Проанализировав rpm-зависимости всего дистрибутива,а не только лишь первого CD, обнаруживаем небольшуюпроблему [11] в сборке одного пакета из OpenOffice. В нача-ле отчета сборщика связей содержится сообщение об ошиб-ке следующего содержания: «При обработке пакета OpenOffice_org-tr-1.1.3-16.i586.rpm, который уже в группе 65, об-наружено что он взаимно связан с пакетом OpenOffice_org-1.1.3-16.i586.rpm, который уже в группе 66». Непонятно, что-то в чем-то, а не где-то... Посмотрим поточнее, что требуетупомянутый в сообщении пакет и сравним это с аналогич-ным, так как речь идет об одном из локализующих добавле-ний в OpenOffice.

Итак, пакет турецкой локализации расходится с паке-том итальянской локализации ровно в одном требовании –OpenOffice_org-en-help. Проверим, что в свою очередь тре-бует этот пакет :

Следующий кандидат на проверку OpenOffice_org-langотсутствует в списке пакетов. Но, запросив, список обес-печиваемых ресурсов у конфликтного пакета, получим :

Как видно, OpenOffice_org-tr ссылается сам на себя поцепочке. Значит, совсем не зря установка пакетов происхо-дит без учета зависимостей rpm. И благодаря этому канди-даты на вступление в дружную европейскую семью могут небеспокоиться, у них не будет проблем в использовании SuSE.Но тем не менее каждый может заглянуть в spec в исходни-ках турецкого локализатора и узнать автора этой несураз-ности.

Найденное есть сущая мелочь. Можно отметить высокоекачество сборки дистрибутива. Предположим, что этот дис-трибутив может быть помещен под управление apt без ка-ких-либо существенных правок. Еще парочка релизов, иSuSE можно «из коробки» ставить не только YaST, но и apt идаже просто последовательно с помощью тривиального rpm.

Снова вернемся к составу дистрибутива SuSE 9.2 наDVD. Там 7230 пакетов. Исключив 3298 тех, что относятсяк x86_64, получим 3932 пакета, что на 1621 пакет больше,чем в CD версии. То есть дистрибутив на DVD напоминаеттот самый, привычный всем SuSE, в котором обычно быловсегда примерно 4000 пакетов. Пакеты «росли» и «толсте-ли», старые «съеживались» и исчезали, новые приходилисразу изрядного объема. Все это увеличивало размерыдистрибутивных носителей, но число пакетов всегда оста-валось в пределах 4 тысяч. Итак, если проблемы с турец-кой локализацией ОpenОffice решат до принятия Турции вЕС, то у SuSE 9.3 прекрасные перспективы. Хотя, если при-нять в расчет ускорение прогресса, благодаря которомупоследний минорный индекс 4 был только у SuSE 6.4, аминорный индекс 3 у SuSE 7.3, то шансов увидеть SuSE 9.3гораздо меньше, чем SuSE 10.0.

Но попробуем сравнить настоящий выпуск SuSE с пре-дыдущим. Что происходит? Развитие, регресс или стагна-ция. Проведем сравнение по нескольким параметрам.

Сначала по объему. В релизе 9.1 было 3446 пакетов дляархитектуры IA32 и noarch. В 9.2 уже 3932 для IA32 и noarchи еще 3298 только для 64-битной архитектуры. Другими сло-вами, объем вырос. Чего не скажешь о цене, что приятно.

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

# rpm --requires -qp OpenOffice_org-tr-1.1.3-16.i586.rpm ↵↵↵↵↵| grep -v ^rpmlib

OpenOffice_org = 1.1.3-16

OpenOffice_org-en-help

fileutils

# rpm --requires -qp OpenOffice_org-it-1.1.3-16.i586.rpm ↵↵↵↵↵| grep -v ^rpmlib

OpenOffice_org = 1.1.3-16

myspell-italian

fileutils

# rpm --requires -qp ↵↵↵↵↵OpenOffice_org-en-help-1.1.3-16.i586.rpm | grep -v ̂ rpmlib

OpenOffice_org-lang

# rpm --provides -qp OpenOffice_org-tr-1.1.3-16.i586.rpmOpenOffice_org-lang

ooo-i18n:/usr/lib/ooo-1.1/program/resource/vcl64590.res

OpenOffice_org-tr = 1.1.3-16

Page 9: 026 Системный Администратор 01 2005

7№1, январь 2005

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

лялась возможность работы со старым, в 9.1 выбора не ос-тавили и принудительно всех «пересадили» на ядро 2.6.4. Ипоскольку использованное в коробочной версии ядро оказа-лось неудачным, то впервые SuSE выпустила не просто ис-правляющий апдейт, а полную смену ядра на следующуюверсию 2.6.5. То есть в этом смысле релиз 9.1 явно не удал-ся. В настоящем релизе используется ядро 2.6.8, что внуша-ет доверие, учитывая его младший индекс и почти полугодо-вую историю эксплуатации ядер 2.6 в SuSE. Но с другой сто-роны, в новом дистрибутиве уже сменили версию Samba с3.0.7 на 3.0.9. То есть «еще не вечер», а лишь первые парамесяцев из средней полугодовой «жизни» релиза.

Теперь более подробно рассмотрим, что же конкретнобыло удалено из дистрибутива и что было добавлено вза-мен. Полный список очень велик [12]. Далее некоторые вы-держки из него.! Расстались с чрезвычайно необходимой игрушкой 3d_

chess, перестали играть в машинки racer, racer-addonsи в прочую ерунду tuxeyes, xmine. Но обрели последниепопулярные средства IP-телефонии Asterisk вместе соспокойными вдумчивыми пазлом fillets-ng.

! Потеряли Keramic стиль в Gtk Geramik, а заодно и дру-гие темы gtk-themes-20001105, но приобрели новыедрайвера для софтмодемов Intel-536ep и Intel-537ep, вы-кинув при этом старые hsflinmodem, km_hsflinmodem.

! Вот сюрприз! Выкинули весь Xfree86! А взамен получи-ли Xorg!

! Вот еще новинки для любителей. Детектор вторженияchkrootkit, инструментал для создания новомодных Live-CD – cloop и средство протоколирования аварийных за-вершений panicsel. За это выкидываем без колебанийcellular и coldsync!

! А вот этого и в самом деле жаль directory_administrator,logsurfer, webmin. Но, может, кого-то утешит появлениенеобычайно нужного серверного средства dnsmasq. Шут-ка, конечно. Хотя полностью верно в отношении ulogd.

! И вот он – знак прогресса! Нет теперь этого музейногоэкспоната inetd, который уже давно является бесполез-ным дублем xinetd. А в утешение снова вернули симу-лятор историчеких версий UNIX – simh. Аналогично вы-кинут iSilo, но добавлен могучий dx от IBM.

! Оказался ненужным url_get. Вместо этого появился но-вый сетевой бэкап sesam_srv и монитор openhpi.

! Наконец кто-то догадался, что у xterm слишком многоклонов, и выкинул eterm и wterm. К огорчению юниксо-вых снобов, выкинут новый VI клон nvi и ставшие не-нужными rusers и rwall.

! Выкинут deliver и bulk_mailer, но добавлен почтовый сер-вер dovecot и обработчик входящей почты otrs.

! Стал для разработчиков SuSE не нужен и прекрасныйвеб-редактор quanta. Зато снова вернулся Tomcat в видеtomcat5 и вместе с struts и даже с servletapi.

! Как известно, производители ERP-систем переживаюткризис. И вот следствие. Зачем SuSE спонсоры, которыене платят денег. Резолюция – выкинуть! Так избавилисьот sapdb. Но поскольку теперь Linux-прогресс двигают но-вые «лошадки», IBM и Novell, то они накидали в дистри-бутив своего любимого всякого java-подобного puretls, oro,netcomponents, mx4j и еще очень много в разделе noarch

с первой буквой «j» вплоть до ejb и даже cryptix. Но доби-ли совершенно шеллом на все том же java bsh. Теперь непользоваться java все труднее и труднее.

! Ну и напоследок, так как yast2 в развитии достиг небы-валых высот, то отладочный плагин yast2-debugger емустал не нужен. А вместо этого получили новые модулиyast2-bluetooth, yast2-bootfloppy, yast2-irda, yast2-uml.

Каждый волен расставить свои оценки напротив пере-численных пунктов. Но вряд ли оценки могут полностью не-гативными. Пользователи SuSE 9.2, вероятно, более приоб-рели, чем потеряли. Главное, что осталось в SuSE, это высо-кое качество и чисто немецкая добротность всего, что выхо-дит под маркой SuSE. Для иллюстрации последнего утверж-дения сошлюсь на положительный опыт установки в SuSE9.2 специального программного продукта Wine Rack, выпу-щенного к версии SuSE 9.0. Фактически это CrossOver Office,то есть специально собранный wine. Этот продукт ставитсяповерх нового SuSE и позволяет далее устанавливать в своюсреду различные приложения для MS Windows. Например,как видно на снимке экрана [13], в KDE одновременно рабо-тают встроенный браузер Konqueror и IE6.

Полезные ссылки:1. Официальный обзор SuSE 9.2: http://www.novell.com/ru-ru/

products/linuxprofessional/overview.html. Там же можно по-смотреть и скриншоты с десктопов этого дистрибутива.

2. Покупка копии: http://www.nixp.ru/cdrom. Здесь вы полу-чите точную копию с оригинала SuSE. Работа с этимикопиями и описана выше.

3. Полная FTP-версия и обновления к «коробочному» вы-пуску: http://www.suse.com/en/private/download/ftp/int_mirrors.html.

4. Как модифицировать дистрибутив: http://www.baraba-nov.ru/arts/how-to-modify-suse-dvd.html. Рекомендуетсядобавить к установочному DVD последние обновления,что поможет сократить онлайновые апдейты.

5. Список пакетов, размещенных только на DVD: http://www.barabanov.ru/arts/suse92overview/suse92-dvd-cd.list

6. Покупка бокса: http://www.linuxcenter.ru/goods/1083.html.7. Список пакетов, дополнительно удаленных с имиджа

двухслойного DVD: http://www.barabanov.ru/arts/suse92overview/suse92-removed.list.

8. Нестандартные добавления к SuSE: http://ftp.gwdg.de/pub/linux/suse. Рекомендую добавить к установочномуDVD последние обновления, что поможет сократить он-лайновые апдейты.

9. Различия в наборах пакетов для разных архитектур: http://www.barabanov.ru/arts/suse92overview/x86_64-i586.diff.

10. Список пакетов первого CD в порядке установки: http://www.barabanov.ru/arts/suse92overview/suse92-cd1-table.rep.

11. Список пакетов дистрибутива SuSE 9.2 в порядке уста-новки: http://www.barabanov.ru/arts/suse92overview/suse92-dvd-table.rep.

12. Различия в составе дистрибутивов SuSE 9.2 и 9.1: http://www.barabanov.ru/arts/suse92overview/suse92-suse91.diff.

13. Скриншот suse92, Wine Rack 9.0 и Internet Explorer v.6:http://www.barabanov.ru/arts/suse92overview/suse92-wine-ie6.png.

Page 10: 026 Системный Администратор 01 2005

8

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

Как и многое в этом мире, дистрибутив Lycoris Desktop/LXберет свое начало в 2000 году. На рубеже веков человек поимени Джозеф Чик (Joseph Cheek) решил сделать на базеLinux систему, доступную каждому, а заодно занять пусту-ющую нишу настольных операционных систем для дома.Для достижения этой цели им была создана компанияRedmond Linux Corp., зарегистрированная в Редмонде (штатВашингтон). По странному стечению обстоятельств там жерасполагалась (и до сего момента располагается) штаб-квартира корпорации Microsoft, поэтому многие стали рас-сматривать это название не как производную от местопо-ложения фирмы, а как тонкий намек на эквивалентностьWindows. Производители настольных дистрибутивов вооб-

ще любят ассоциировать свои продукты и вездесущие«окна» в глазах потенциальных покупателей, однако немно-гим из них удавалось сделать это столь тонко и изящно.Под данной торговой маркой компания успела выпуститьсвой первый продукт, Redmond Linux Personal (декабрь 2001года), а затем, в январе 2002 года сменила имя на геополи-тически нейтральное «Lycoris» (произносится «лайкорис»,официальный сайт http://www.lycoris.com) и некоторое вре-мя спустя перебралась в городок Мэпл Уэлли (Maple Valley).Как было сказано в официальном пресс-релизе, ребрен-динг являлся частью подготовки к продвижению на новыерынки и расширению модельного ряда. Последнее не зас-тавило себя ждать. Redmond Linux превратился в Lycoris

LINUX ИЗ РЕДМОНДА:ОБЗОР LYCORIS DESKTOP/LX

ВАЛЕНТИН СИНИЦЫН

Page 11: 026 Системный Администратор 01 2005

9№1, январь 2005

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

Desktop/LX1. Для взыскательных пользователей был создантрехдисковый Lycoris Desktop/LX Deluxe со средствами раз-работки и исходными текстами, для владельцев «наладон-ников» – PocketPC Edition (ныне это направление развитиязаморожено в связи с отсутствием ресурсов). В июле 2003года появилась на свет и версия для суб-ноутбуков – Desktop/LX Tablet Edition. Помимо этого, компания предлагает раз-личные дополнения (Pack), например, ProductivityPak иGamePak, речь о которых пойдет ниже.

Первые версии дистрибутива распространялись бес-платно, а компания взимала деньги лишь с тех, кто желалприобрести коробочную версию. В конце прошлого – нача-ле этого года данная бизнес-стратегия была пересмотренаи бесплатная Download Edition превратилась в оценочнуюверсию (Evaluation Edition), срок использования которойограничен 45 днями, а максимальное число компьютеров,работающих под ее управлением, – пятью. Кроме этого,Evaluation Edition включает только открытые приложения.Коммерческая версия не имеет подобных ограничений (т.е.может быть установлена на произвольное число компью-теров, но только для некоммерческого применения) и сто-ит 40 (Desktop/LX) или 50 (Desktop/LX Deluxe) долларов плюсеще пять, если вы предпочитаете красивую коробку обыч-ному ISO-образу (или не имеете возможности загрузитьнесколько сотен мегабайт). В комплект поставки входит30-страничное руководство по инсталляции, 60 дней тех-нической поддержки по электронной почте (максимум 3 ин-цидента), а также Product ID, уникальный код, с помощьюкоторого можно получить доступ к дополнительным услу-гам, представляемым Lycoris, например, фирменной кол-лекции программ Iris (http://iris.lycoris.com). В свою очередьLycoris Desktop/LX Evaluation Edition доступен для загрузкис FTP-архива Ibiblio (ftp://ftp.ibiblio.org) и многочисленныхзеркал. Его поддержка обеспечивается через сайт сообще-ства Lycoris (http://www.lycoris.org), где находится форум,полезные советы, списки часто задаваемых вопросов идаже кое-какие программы, собранные энтузиастами. Боль-шая часть из них, к сожалению, подустарела.

В данной статье мы рассмотрим возможности и некото-рые детали устройства ОС Lycoris Desktop/LX 1.4 EvaluationEdition.

ГенезисВ основе Desktop/LX лежит дистрибутив Caldera OpenLinux,который в свою очередь базируется на ранних версиях RedHat. На сегодняшний день Caldera в образе SCO Group ве-дет войну с миром Open Source, поэтому на помощь в под-держании «фундамента» Lycoris рассчитывать не приходит-ся. Это накладывает на систему своеобразный отпечаток:вплоть до текущего выпуска в качестве рабочего стола поумолчанию в Desktop/LX использовался KDE 2. Впрочем,приобретенная в наследство от Red Hat пакетная система(RPM) позволяла особенно охочим до всего нового пользо-вателям поставить KDE 3.x из любого удобного репозита-

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

«Под капотом» Desktop/LX 1.4, фактический выпуск ко-торой состоялся в сентябре 2004 года, скрывается Linux2.4.27, XFree86 4.4.0 и KDE 3.2.3. В качестве офисного па-кета используется KOffice. Пользователям, предпочитаю-щим OpenOffice.org, придется раскошелиться на LycorisProductivityPak (40 долларов). Одним из крупных нововве-дений в версии 1.4 является специальная редакция PowerPack, включающая все возможности Desktop/LX Deluxe плюсCrossOver Office и btX2, закрытую технологию обработки иотображения шрифтов, разработанную компанией Bitstream.Все это удовольствие стоит 80 долларов. До настоящего вре-мени единственным средством совместимости с Windows,доступным пользователям Lycoris Desktop/LX, был Wine.Любители поиграть могли также приобрести Gamepack (не-сколько свободно распространяемых игр + 1 месяц подпис-ки на WineX, 30 долларов). Кроме того, в данный моментLycoris широко рекламирует AI2 («AI в квадрате») – систе-му, обеспечивающую тесную интеграцию сторонних прило-жений с Desktop/LX, но, к сожалению, опробовать ее в дей-ствии мне так и не удалось.

Первое знакомствоС чего начинается Lycoris Desktop/LX?. Как это ни парадок-сально, с «ящерицы». Именно так, в переводе с английско-го, называется инсталлятор этой системы – Lizard. Впро-чем, если вам придет в голову вставить дистрибутивныйдиск в привод компьютера, работающего под управлениемMicrosoft Windows, вы увидите не его, а стандартный мас-тер а-ля InstallShield, который предложит вам ознакомить-ся с лицензией, выбрать способ установки (с CD-ROM илигибких дисков) и перезагрузить систему.

В процессе инсталляции обнаружилась одна неприят-ная особенность. Расположенный на компакт-диске с дист-рибутивом GRUB отказывался загружать ядро на системах,имеющих менее 600 Кб свободной «нижней» памяти (lowermemory). Это имеет место на ноутбуках, собранных на базепроцессора Transmeta Crusoe. Чтобы решить данную про-блему, мне пришлось загрузить уже установленный на ком-пьютере Mandrakelinux, смонтировать в нем образ загру-зочного диска Desktop/LX, скопировать ядро и организоватьзагрузку через LILO. Дальше все пошло как по маслу. Ин-сталлятор автоматически обнаружил CD-ROM с программ-ными пакетами (судя по выводу на экран, я мог бы такжеразместить их на жестком диске или разделе NFS), послечего был запущен упомянутый выше Lizard. Независимо оттого, сделали вы это в Windows-мастере или нет, «ящери-ца» предложит вам принять лицензионное соглашение. Изуказанных в нем вещей нас сейчас будет особенно интере-совать список компонентов, разработанных самой Lycoris2.Согласно данному документу, это My Linux System, NetworkBrowser, панель управления Desktop/LX Control Panel и со-путствующие конфигурационные утилиты (Remote access

1 Компания настаивает на том, чтобы ее продукт называли «Lycoris Desktop/LX» или на худой конец просто «Desktop/LX», но уж никак не

«Lycoris». Уважая права автора на свое произведение, мы будем следовать этому требованию неукоснительно.2 Как правило, выискивать области, подвергшиеся специальной доработке, приходится вручную. А тут – на тебе: на блюдечке с голубой

каемочкой.

Page 12: 026 Системный Администратор 01 2005

10

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

control, Firewall control), поддержка протокола «exec:» дляKonqueror (KIO_EXEC) и собственно инсталлятор (Softwareinstaller). Все перечисленные программы распространяют-ся свободно.

Памятуя об излишне «умном и самостоятельном» ин-сталляторе Linspire, хочется отметить, что Lizard предостав-ляет пользователю куда большую свободу действий. Осо-бых похвал заслуживает опция «Обновить существующуюсистему» («Update Existing Installation»). В том, что касает-ся разметки жесткого диска, Lizard предлагает нескольковариантов: использовать весь HDD, только свободное (не-размеченное) пространство, выбрать раздел или произве-сти разбиение вручную. Правда, к бочке меда прилагаетсясвоя ложка дегтя: поддерживается только файловая систе-ма ext3. Имеющиеся на диске разделы подкачки инсталля-тор определяет и подключает автоматически.

Процедура копирования пакетов в Lizard реализованавесьма оригинально. Она начинается сразу же после раз-биения жесткого диска и продолжается в фоновом режи-ме, о чем свидетельствует полоска-индикатор в нижнейчасти экрана. Вы же тем временем продолжаете настрой-ку своей будущей системы: указываете параметры сети,создаете пользователей (к чести создателей Desktop/LXотметим, что программа явным образом отделяет паролиобычных пользователей от системного пароля root, хотя ихпроверка на прочность опять же не производится), выбира-ете тип модема и видеокарты (оба списка достаточно об-ширны), указываете свой часовой пояс и включаете заг-рузку «других ОС» (по-видимому, под этим термином по-нимается Windows. По крайней мере стоящий на соседнемразделе Mandrakelinux инсталлятор проигнорировал). По-кончив с этими делами, вы можете скоротать минуты, ос-тавшиеся до конца инсталляции, раскладывая пасьянс.

При выборе видеокарты советую вам быть особо осто-рожными с адаптерами типа «Generic SVGA». По не вполнепонятной мне причине их поддержка в Lycoris Desktop/LXобеспечивается не XFree86 4.4.0, а XFree86 3.3.6, котораятакже входит в состав дистрибутива. Если до этого вы ус-пели выбрать более «продвинутый» вариант (скажем, nvidia),возникнет патовая ситуация – файл настроек X-серверабудет содержать инструкции для XFree86 4.x, но при этомсимволическая ссылка «X» будет указывать на более ста-рый сервер. В результате после перезагрузки система несможет перейти в графический режим и вам придется вно-сить правки вручную из командной строки и vi. Добро по-жаловать в Linux!

Закончив с установкой, извлеките диск из привода CD-ROM и приготовьтесь войти в прекрасный мир Lycoris.

Встречают по одежке...После успешной перезагрузки и выбора правильной (в моемслучае – единственно возможной) опции в меню GRUB, выувидите графическую заставку с фирменной эмблемойLycoris (цветочком «Flower Logo»). О том, что компьютер независ, свидетельствует полоска-индикатор в правом нижнемуглу экрана. Впрочем, вы можете посмотреть, что происхо-дит «за кулисами», нажав волшебную кнопку <F2>. Послеподгрузки модулей ядра, монтирования файловых систем истарта всех необходимых демонов вам будет представлен

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

Первое, что бросается в глаза при виде рабочего столаDesktop/LX, – это прозрачная панель (см. рис 1). Несмотряна простоту эффекта, это выглядит очень стильно. Запус-тив одно-два приложения KDE, можно заметить, что все онииспользуют визуальную тему Plastik. Как правило, разра-ботчики настольных дистрибутивов стремятся создать своесобственное оформление, но, видимо, в Lycoris решили неизобретать велосипед и воспользоваться уже готовым ре-шением. К сожалению, это негативно сказалось на качествеинтеграции: приложения KDE и GNOME (например, входя-щие в стандартную поставку Desktop/LX GIMP 2 или LycorisWeb Suite, он же – Mozilla 1.7.3) выглядят по-разному.

На самом рабочем столе легко заметить пиктограммыMy Linux System и Network Browser, заменяющих «Мой ком-пьютер» и «Сетевое окружение», соответственно. Еще одиниз упомянутых в прошлом разделе компонентов, Desktop/LX Control Panel, скрывается в главном меню (пункт SystemManagement). Все три утилиты выдержаны в едином стиле,по своей структуре напоминающем соответствующие диа-логи Windows (рис. 2), и реализованы очень оригинальнымобразом. Как нетрудно догадаться, они базируются наKonqueror. На самом деле, панели навигации в окнах MyLinux System/Network Browser, а также различные разделыпанели управления – это просто HTML-страницы, шаблоныкоторых хранятся в каталоге /usr/share/RedmondLinux/HTML,а сопутствующие сценарии на языке оболочки – в /opt/redmondlinux/bin. Вызов сторонних утилит (например, «ап-плетов» Control Panel) осуществляется посредством специ-ального протокола «exec:» (компонент KIO_EXEC, реали-зованный программистами Lycoris). Для обзора сетиWindows или локальных дисков используются протоколы,включенные в состав KDE по умолчанию, такие как smb,file, devices. Лично мне подобное решение кажется весьмаудачным, и я рекомендую разработчикам иметь его в видупри создании каких-либо утилит для KDE. ВзаимосвязьDesktop/LX Control Panel с Konqueror имеет еще один нео-жиданный эффект. Работая с панелью управления, вы мо-жете использовать вкладки (tabs), как и при просмотреобычных веб-страниц. Это позволяет более эффективно ис-пользовать рабочее пространство.

Ðèñóíîê 1. Ðàáî÷èé ñòîë Lycoris Desktop/LX 1.4

Page 13: 026 Системный Администратор 01 2005

11№1, январь 2005

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

Как и каждый уважающий себя настольный дистрибу-тив, Lycoris Desktop/LX 1.4 содержит «джентльменский ми-нимум: Adobe Acrobat Reader, Macromedia Flash 7, JavaRuntime Environment (JRE) 1.4 и RealPlayer 8. Все перечис-ленные продукты доступны в качестве подключаемых мо-дулей к Lycoris Web Suite. Предыдущая версия дистрибути-ва включала также небольшое аудиоруководство, подобноетому, что поставляется вместе с Linspire, но сейчас оно куда-то исчезло. Зато наряду со шрифтами семейства BitstreamVera имеются также шрифты Bitstream Delta Hinted Fonts.Среди этого многообразия глифов можно отыскать и буквыкириллического алфавита (рис. 3). Официальной поддерж-ки русского в Lycoris Desktop/LX, конечно, нет, однако про-грамм, входящих в стандартный комплект поставки вполнедостаточно для минимальной русификации на уровне ори-гинальных версий Knoppix. Для переключения раскладокможно использовать стандартные средства KDE.

Совместимость с Windows обеспечивается офиснымпакетом KOffice, в принципе умеющим читать и сохранятьдокументы в форматах, поддерживаемых Microsoft Office(хотя OpenOffice.org справляется с этой задачей гораздолучше) и эмулятором Wine. Предложение запустить после-

дний появляется автоматически, если вставить в привод CD-ROM диск с приложением Win32 (функция autorun) или по-пытаться запустить его (приложение) иным образом3. Напрактике у меня не получилось запустить в Wine ни однойпрограммы. Возможно, это связано с тем, что эмуляторнастроен на работу в системе с существующим Windows-разделом (или попросту не настроен).

Для расширения возможностей дистрибутива суще-ствует репозитарий программ Iris Software Gallery (http://iris.lycoris.com). Работа с ним осуществляется с помощьюспециального мастера, однако для этого необходим иден-тификатор Product ID (т.е. коммерческая лицензия наDesktop/LX). На сегодняшний день в Iris представлено чутьменее 400 (против 1900 в Linspire Click-n-Run Warehouse)пакетов, сгруппированных в 10 разделах. Здесь можно най-ти средства разработки (но не gcc, который, как мы помним,является частью Desktop/LX Deluxe), пакет русификацииKDE, файловые менеджеры Midnight Commander и Krusader,HTML-редактор Bluefish и т. д. В отличие от все того же CNR,доступ к Iris бесплатен, если не считать стоимости ProductID и не ограничен по времени. Желающие могут также на-строить систему под свои собственные нужды, установивнеобходимое ПО из обычных RPM-пакетов.

Lycoris Desktop/LX позволяет удобно работать со съем-ными носителями информации. Компакт-диски, Flash-«брел-ки» и прочая «мелочь» автоматически распознаются и мон-тируются системой. К моему великому удивлению, я не на-шел опции для отключения USB-носителей (размонтирова-ние компакт-дисков происходит автоматически при попыт-ке извлечь их из привода).

Провожают по...В заключение попробуем вывести «формулу Desktop/LX».Дистрибутив создает ощущение чего-то домашнего, стольчасто встречающееся в любительских проектах и столь ред-кое в коммерческих решениях. Однако это не сказываетсяна качестве продукта, которое остается весьма высоким,хотя и не идеальным (вспомним про проблемы с загрузкойядра, X Window System и Wine). По сравнению с альтерна-тивными вариантами Lycoris Desktop/LX неплохо русифи-цирован, и мне даже приходилось слышать о его сторонни-ках, проживающих на территории РФ. К минусам системыможно отнести не слишком большой выбор доступного ПО(при существующем многообразии 400 наименований этопочти капля в море) и отсутствие OpenOffice.org в стандар-тном комплекте поставки.

Однако все эти недостатки так или иначе преодолимы,а цена на данный продукт не очень высока даже по отече-ственным меркам. Если вы не стремитесь иметь систему,которая бы думала за вас, имеете достаточный опыт рабо-ты с компьютером и всего лишь опасаетесь командной стро-ки, попробуйте найти оценочную версию Desktop/LX. Бытьможет, вам понравится дистрибутив, рожденный прямо подносом у корпорации Microsoft?

Автор выражает благодарность Шабунио Ю.А. за идеи,высказанные при написании данной статьи.

Ðèñóíîê 2. Âñå ýòî � ïðîñòî HTML-ñòðàíèöû, îòêðûòûå â îêíåKonqueror. Êòî áû ìîã ïîäóìàòü?

Ðèñóíîê 3. Âñòðîåííûå ñðåäñòâà èíòåðíàöèîíàëèçàöèèïîçâîëÿþò õóäî-áåäíî ïèñàòü íà ðîäíîì ÿçûêå

3 Кстати, чтобы открыть файл в Lycoris Desktop/LX, достаточно щелкнуть по нему мышью всего один раз. Это может показаться непривыч-

ным.

Page 14: 026 Системный Администратор 01 2005

12

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

Что такое прокси-сервер, пояснять, думаю, не требуется.Для UNIX-машин стандартом де факто является Squid. Про-веренный временем, отлично документированный, мощный,он способен удовлетворить большинство запросов систем-ных администраторов. Однако для моей сети, в которой

ПРОКСИ-СЕРВЕР OOPS:ПЕРВЫЕ ВПЕЧАТЛЕНИЯ

СЕРГЕЙ СУПРУНОВ

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

Page 15: 026 Системный Администратор 01 2005

13№1, январь 2005

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

Установку на свой сервер (FreeBSD 5.3) я выполнял изпортов с помощью утилиты portupgrade:

На этапе конфигурирования порта (см. рис. 1) нужновключить поддержку DB4 – она понадобится для работы скэшем.

Нужный порт будет установлен при этом автоматически.Также можно включить поддержку MySQL или PostgreSQLдля хранения базы авторизации. На вопрос о том, нужноли создать пользователя oops, с правами которого будетработать прокси-сервер, был дан положительный ответ. Впринципе можно использовать и существующего пользо-вателя (например, nobody или оставшегося от Squid одно-именного пользователя), главное – не забыть подправитьконфигурацию.

Скудный man oops слегка опечалил. Справедливостиради нужно заметить, что и squid в этом смысле далек отсовершенства. Конфигурационный файл, по умолчанию /usr/local/etc/oops/oops.cfg, документирован достаточно непло-хо. Может быть, не так пространно и красиво, как Squid, нозато ориентироваться в нем оказалось проще.

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

Прежде всего нужно задать удобные для вас DNS-сер-веры в параметрах nameserver. Обычно вполне достаточнодвух – основного, с которым будет идти работа, и резерв-ного на всякий случай. Я просто продублировал то, что зна-чится у меня в /etc/resolv.conf.

Далее при желании можете изменить номер порта, накотором oops будет ожидать соединение – параметрhttp_port. По умолчанию используется 3128. Если у вас за-пущен Squid, то для тестирования oops можно поставитьдругой порт и тренироваться на нем.

C помощью параметра bind, находящегося в этой же сек-ции, можно заставить oops ожидать запросы на интерфей-

се с указанным IP-адресом, а не на всех имеющихся интер-фейсах.

Следующий полезный параметр – userid. Здесь нужнозадать имя или UID пользователя, с правами которого бу-дет работать oops. По умолчанию это пользователь oops.Если вы используете другого – не забудьте внести соответ-ствующие изменения до инициализации базы кэша.

Далее следуют параметры logfile, accesslog и pidfile. Ус-тановите те пути, которые у вас используются. Для лог-фай-лов попутно можно задать параметры ротации.

В файл statistics (по умолчанию /var/run/oops/oops_statfile) раз в минуту сбрасывается текущая статистика вида:

Назначение указанных параметров перечислено в таб-лице:

Вернемся к конфигурации. Параметры mem_max иlo_mark позволяют ограничивать количество оперативнойпамяти, потребляемой прокси-сервером. С помощью сле-дующих далее опций start_red и refuse_at можно управлятьколичеством соединений, обслуживаемых одновременно.Первая из них указывает число соединений, при которомoops будет случайным образом «прореживать» очередь зап-росов, сбрасывая некоторые из них (так называемый алго-ритм Early Drop). Если количество соединений все же дос-тигнет определенного второй опцией, то все последующиезапросы на соединение будут получать отказ.

Остальное можно оставить как есть. Разве что можетвозникнуть желание поэкспериментировать с опцией force_completion. По умолчанию она имеет значение 75, что озна-чает продолжение загрузки объекта, загруженного болеечем на 75%, даже если соединение с клиентом, запросив-шим объект, разорвется или клиент откажется от продол-жения закачки.

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

Группу «paco», включенную по умолчанию (по крайнеймере во FreeBSD), вполне можно рассматривать как при-мер – она содержит практически все параметры, которыемогут быть использованы в настройках групп, и достаточ-но подробно прокомментирована. По умолчанию она обслу-

# portupgrade oops

Ðèñóíîê 1

clients : 7

uptime : 181 sec.

http_requests : 287

http_hits : 82

icp_requests : 0

req_rate : 2/s

hits_rate : 28%

free_space : 99%

1 Например, ввод в адресной строке браузера адреса http://www.yandex.ru увеличит значение http_hits на 1 (запрошена одна страница), а

http_requests увеличится при этом на 30-40, поскольку для каждого объекта, размещаемого во внешнем файле (рисунки, css, js-файлы и т. д.)

формируется отдельный HTTP-запрос.

Page 16: 026 Системный Администратор 01 2005

14

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

живает подсети 195.114.128/19, 127/8 и 195.5.40.93/32 (см.параметр networks). Если случайно диапазон ваших адре-сов попадет в описанный для этой группы, то поменяйтеэтот параметр, чтобы данная группа оставалась исключитель-но демонстрационной. Хотя никто, конечно, не запрещаетвам использовать ее (в конце концов, в файле oops.cfg.sampleона останется неизменной) или, наоборот, вообще удалить.Но мне удобнее, когда подсказки всегда под рукой. Еще об-ратите внимание, что в эту группу попадает localhost. Какправило, обращений к прокси-серверу с локальной машиныне происходит, но если вы решите проверить его работу,например, с помощью телнета «telnet localhost 3128», то дол-жны понимать, что обслуживание запроса будет выполнять-ся согласно правилам этой группы (если, конечно, вы не оп-ределите для localhost другую группу).

Рассмотрим подробнее пару моих групп:

В группу ourlan попадут все IP-адреса из указанных впараметре networks, если они не попали в более узкие груп-пы. Принадлежность адреса к группе определяется в по-рядке уменьшения маски. То есть адрес 192.168.0.25, фор-мально попадающий и в группу ourlan, и в группу ouradmin,будет обслуживаться в соответствии с правилами группыouradmin, несмотря на то что она описана позже.

Помимо определения допустимых адресов, для всех ма-шин локальной сети, кроме машины администратора, за-дано ограничение скорости: для всей группы доступная по-лоса ограничивается значением 16 Кб/с, и дополнительнодля каждого клиента доступно не более 4 Кб/с. То есть вданном случае одновременно только 4 клиента смогут ра-ботать на максимально доступной им скорости. Если числоклиентов возрастет, то доступные для всей группы 16 Кб/сбудут делиться между ними поровну. Например, при одно-временной работе 8 пользователей из этой группы каждо-му достанется по 2 Кб/с.

При желании в секции http-группы можно более жесткоустановить доступ к конкретным доменам – либо перечис-лить разрешенные в параметре allow, либо разрешить все,но запретить доступ к некоторым с помощью параметраdeny. Запрет или разрешение распространяется на сам ука-занный домен и все его поддомены. Например, параметр«deny narod.ru» запретит доступ ко всем «народным» фай-лам, а «allow ru» разрешит посещать только сайты в зоне«ru». Также поддерживается одиночный символ «*», озна-чающий любые домены. Если домен попадает как в прави-ло allow, так и в deny, применяется то, которое точнее опи-сывает этот домен.

Например:

Эти правила запретят доступ ко всем доменам, кроме«народных».

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

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

После секций групп следует секция storage, описываю-щая параметры файла, который будет использоваться дляхранения кэша. В отличие от Squid, хранение кэширован-ных объектов в oops осуществляется в одном файле-хра-нилище, а не в отдельных файлах для каждого объекта.Это несколько разгружает систему, поскольку заботу о за-писи в кэш oops берет на себя, и по идее должно способ-ствовать увеличению скорости работы, но на моих мини-мальных нагрузках это совершенно незаметно. С другойстороны, подобная схема ограничивает максимальный раз-мер файла значением 2 Гб. Если вам требуются большиехранилища, соберите oops с поддержкой GigaBase.

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

Нужно заметить, что файлы-хранилища создаются вовремя инициализации, которой мы займемся немного поз-же, когда разберемся с конфигурацией. Процент занятос-ти кэша можно контролировать в приведенном выше фай-ле /var/run/oops/oops_statfile или с помощью управляющейутилиты oopsctl, которую мы скоро рассмотрим.

Далее следуют секции модулей. Модуль lang позволяетзадать параметры перекодировки и кодировку по умолча-нию. Шаблон HTML-файла сообщения об ошибках можноописать в секции err, если хотите изменить вид, принятыйпо умолчанию. Файл-шаблон задает вид страницы с сооб-щением об ошибке, текст самого сообщения в процессе ра-боты подставляется вместо переменных %M (на языке, ука-занном в параметре lang этой же секции) и %m (на англий-ском языке).

Последующие модули в большинстве своем отвечаютза авторизацию. Oops поддерживает хранение базы авто-ризации в текстовом файле (формировать его следует спомощью утилиты htpasswd, входящей в состав Apache), вбазах MySQL или PostgreSQL.

Модуль redir позволяет задавать более гибкие условия

group ourlan {networks 192.168.0.0/24;badports [0:79],110,138,139,513,[6000:6010] ;bandwidth 16k;per_ip_bw 4k;http {

allow dstdomain * ;}

}group ouradmin {

networks 192.168.0.25/32;badports [0:79],110,138,139,513,[6000:6010] ;http {

allow dstdomain * ;}

}

http { denydstdomain ru ; allow dstdomain narod.ru ;

}

deny dstdomain include:baddomains.lst ;

Page 17: 026 Системный Администратор 01 2005

15№1, январь 2005

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

фильтрации трафика, чем правила deny и allow в группах.Помимо разрешения и запрета, запрос можно перенапра-вить на другой ресурс либо выполнить «внутреннюю» под-становку. В данной секции указывается полное имя фай-ла, содержащего правила «редиректа» (параметр file) ишаблон сообщения о запрете доступа (параметр template).Файл правил (по умолчанию /usr/local/etc/oops/redir_rules)содержит правила в следующем формате:

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

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

«Внутренние» объекты компилируются вместе с oops.В версии 1.5.23 файл redir.c содержит следующее опреде-ление «внутренних» объектов:

В этом же файле определяются и сами объекты. Напри-мер, перенаправление «internal:nospam_close» вернет кли-енту такую HTML-страницу вместо запрошенной:

Регулярные выражения строятся по стандартным дляUNIX правилам. Ниже дан пример файла redir_rules, демон-стрирующий некоторые особенности:

За пояснениями синтаксиса регулярных выражений мож-но обратиться, например, к странице справочного руковод-ства man grep(1), к разделу «REGULAR EXPRESSIONS».Приведенные выше правила на практике бесполезны, затохорошо демонстрируют различные возможности. Ниже при-водится более полезный файл:

Любые изменения в файлах правил «подхватываютсяна лету», не требуя перезапуска сервера. Ну и чтобы ука-занные правила распространялись на конкретную группу,в секции этой группы нужно указать опцию redir_mods созначением «redir». Oops позволяет создавать до 15 допол-нительных наборов правил перенаправления, которые опи-сываются в модулях с redir/1 по redir/15 с таким же синтак-сисом, что и redir, и могут быть назначены той или инойгруппе указанием имени модуля в строке redir_mods.

Чтобы oops работал как прозрачный прокси-сервер, до-полнительно нужно раскомментировать секцию «moduletransparent», и в секциях тех групп, которым будет позволе-но пользоваться его благами, нужно в параметр redir_modsдобавить значение «transparent». Ну и не забыть выполнитьперенаправление трафика в правилах firewall, например, так:

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

Ðåãóëÿðíîå_âûðàæåíèå [Äåéñòâèå]

static internal_doc_t redir_internals[] = {{"nospam1x1", "image/gif", sizeof(nospam1x1gif), ↵↵↵↵↵

3600, nospam1x1gif},{"nospam468x60", "image/gif", sizeof(nospam468x60gif), ↵↵↵↵↵

3600, nospam468x60gif},{"nospam_close", "text/html", sizeof(nospam_close)-1, ↵↵↵↵↵

3600, nospam_close},{"nospam_empty", "text/html", sizeof(nospam_empty)-1, ↵↵↵↵↵

3600, nospam_empty},{"nospam_js", "application/x-javascript", ↵↵↵↵↵

sizeof(nospam_js)-1, 3600, nospam_js}, {""}};

<html></html><SCRIPT LANGUAGE="JavaScript"> ↵↵↵↵↵<!--window.close()//--></SCRIPT>

# Åñëè çàïðîñ ñîîòâåòñòâóåò íåñêîëüêèì ïðàâèëàì,# ïðèìåíÿåòñÿ ïåðâîå (íà microsoft.com ìû ïîïàñòü íå ñìîæåì).*soft.*.*micro.* allow# Çàïðåùàåì äîñòóï íà âñå äîìåíû òðåòüåãî óðîâíÿ, èìÿ# êîòîðûõ ñîäåðæèò ñòðîêó amsand, çà èñêëþ÷åíèåì amsand.narod.ruhttp://.*amsand.narod.ru allowhttp://.*amsand\..+.ru# Ïðîâåðêà ðàáîòû «âíóòðåííèõ» ïåðåíàïðàâëåíèéhttp://.*/.*test1x1.* internal:nospam1x1http://.*/.*test468x60.* internal:nospam468x60http://.*/.*test_close.* internal:nospam_closehttp://.*/.*test_empty.* internal:nospam_emptyhttp://.*/.*test_js.* internal:nospam_js# Ëþáîé çàïðîñ, ñîäåðæàùèé â èìåíè ðåñóðñà óïîìèíàíèå# Àëüòàâèñòû, áóäåò ïåðåíàïðàâëåí íà ñòàðòîâóþ ñòðàíèöó

# ßíäåêñà (êñòàòè, âû äàæå íå ñìîæåòå âûïîëíèòü ïîèñê â òîì æå# ßíäåêñå ïî çàïðîñó «altavista.com», ïîñêîëüêó â ðåçóëüòàòå# áóäåò îòïðàâëåí çàïðîñ# «http://www.yandex.ru/yandsearch?rpt=rad&text=altavista.com»,# êîòîðûé òàê æå áóäåò ñîîòâåòñòâîâàòü äàííîìó ïðàâèëó)altavista.com http://yandex.ru# Ïåðåíàïðàâëÿåò íà ya.ru âñå çàïðîñû, èìåþùèå öèôðû â ÷àñòè# èìåíè, ñîîòâåòâòóþùåé äîìåíó 3-ãî óðîâíÿ, íàïðèìåð:# http://www.max2.dom.ru/# http://www3.w3c.org/index.htmlhttp://.*[[:digit:]]+.*\.[[:alnum:]]+\.[a-z]{2,4}/.* ya.ru#  îòâåò íà ëþáîé çàïðîñ, çàâåðøàþùèéñÿ ñèìâîëàìè shtml,# áóäåò âîçâðàùåíà ïóñòàÿ ñòðàíèöà (ñîäåðæèò òîëüêî òåã <br>)shtml$ internal:nospam_empty# Áóäåò çàïðåùåí äîñòóï ê ëþáîìó ðåñóðñó, àäðåñ êîòîðîãî# çàêàí÷èâàåòñÿ èìåíåì ôàéëà page ñ îäíèì èç ïåðå÷èñëåííûõ# ðàñøèðåíèéhttp://.*/page.(html|htm|phtml)$# Çàïðåùàåì äîñòóï êî âñåì ñàéòàì â çîíå com, äîìåííîå èìÿ# êîòîðûõ èìååò äëèíó 7-9 ñèìâîëîâ (3-5 ïëþñ ".com") è äëÿ# êîòîðûõ íå óêàçàíî èìÿ êîíêðåòíîãî ôàéëà èëè ïàïêè,# íàïðèìåð: http://qwer.com/http://.{3,5}\.com/?$

# ipfw add 1000 fwd localhost,3128 ↵↵↵↵↵ip from 192.168.0.0/24 to any dst-port 80

# Çàïðîñ ê ßíäåêñó áóäåò ïåðåíàïðàâëåí íà «àñêåòè÷íûé ïîèñê»,# ÷òî ìîæíî èñïîëüçîâàòü äëÿ ñíèæåíèÿ òðàôèêà, ñîçäàâàåìîãî# ïîëüçîâàòåëÿìèhttp://(www.)?yandex\.ru/?$ http://ya.ru# Áëîêèðóåì âñå çàïðîñû ñî ñëîâîì porno, â òîì ÷èñëå# è ôîðìèðóåìûå ïîèñêîâèêàìèporno# Âìåñòî ëþáûõ èçîáðàæåíèé âîçâðàùàåì «ïóñòîé» ðèñóíîê(gif|jpg|jpe|jpeg)$ internal:nospam1x1

Page 18: 026 Системный Администратор 01 2005

16

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

ты сервера в прозрачном режиме были освещены в статьеДмитрия Репина «Transparent proxy. Быть или не быть?»,журнал «Системный администратор», №4, апрель 2004 г.

Настало время выполнить инициализацию кэш-храни-лища:

После непродолжительной работы появятся файлы, опи-санные в секциях storage. Осталось запустить oops и убе-диться, что все работает как нужно. Для управления лучшевсего использовать утилиту oopsctl:

Прописываем адрес и порт нашего proxy в настройкахбраузера (если прокси-сервер непрозрачный) и проверяемработоспособность. Во время работы будут меняться пара-метры статистики (см. /var/run/oops/oops_statfile). Болееполную информацию можно просмотреть, выполнив следу-ющую команду:

Delta usage показывает использование процессора за пос-ледний Delta time. То есть в данном случае за последнюю61 секунду было использовано 195 мс процессорного вре-мени. Если говорить точнее, то эти цифры показывают, чтопредыдущий замер делался 61 секунду назад, и с тех поробщее время использования процессора (total usage) вы-росло на 195 мс. Собственно, на основе этих данных и счи-тается Curr. CPU: 195/61000*100 = 0.32%.

Остановка сервера выполняется командой:

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

Все ключи запуска можно посмотреть в man oopsctl илипо команде:

Вот вроде бы и все. Еще осталось позволить oops заг-ружаться при старте системы, для чего файл /usr/local/etc/rc.d/oops.sh.sample нужно переименовать в oops.sh.

В заключение отмечу, что формат access-файла oopsсовместим с форматом Squid, и для его анализа подойдетлюбой анализатор, разработанный для Squid.

Мои запросы и в этом плане минимальны, поэтому яиспользую простой сценарий на Python:

Результат выглядит примерно так (для каждого IP воз-вращается количество сессий и суммарный трафик в бай-тах и мегабайтах):

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

Дополнительную информацию и сам oops можно полу-чить на сайте проекта: www.oops-cache.org.

# oops �c /usr/local/etc/oops/oops.cfg �z

# oopsctl start

# oopsctl stat## -- General info --

Version : 1.5.23

Uptime : 5646sec, (0day(s), 1hour(s), 34min(s))

Last update : Fri Dec 17 16:03:54 2004

Clients : 1 (max: 8)

HTTP requests: 415

ICP requests: 0

Total hits : 96

Curr.req.rate: 0,00 req/sec (max: 2,68)

Tot.req.rate : 0,07 req/sec

Curr.hit.rate: 0,00 %

Tot.hit.rate : 23,13 %

Curr.icp.rate: 0,00 req/sec (max: 0,00)

## -- CPU --

Total usage : 22607ms

Delta usage : 195ms

Delta time : 61000ms

Curr. CPU : 0,32 % (0,03s+0,29u)

Aver. CPU : 0,40 % (0,11s+0,29u)

## -- storages --

Disks msg : Cleanup finished

Storage : /var/oops/storage/oops_storage0

Size : 200,00 MB

Free blks : 51197 blks (199,99Mb) 99,99 %

State : READY

Fileno : 7

Storage : /var/oops/storage/oops_storage1

Size : 200,00 MB

Free blks : 51197 blks (199,99Mb) 99,99 %

State : READY

Fileno : 9

## -- end of storages --

## -- modules --

. . . пропущено . . .

## -- end of modules --

## -- icp peers --

## -- end of icp peers--

# ./getstat10.0.0.203 | 749 | 4523870 (4.31) |

10.0.0.207 | 1 | 1123 (0.00) |

127.0.0.1 | 1 | 1298 (0.00) |

192.168.0.8 | 234 | 2871338 (2.74) |

66.32.79.217 | 2 | 0 (0.00) |

# oopsctl stop

# oopsctl reconfigure

# oopsctl help

#!/usr/local/bin/pythonimport systry:

logfile = sys.argv[1]except:

logfile = 'access.log'logs = open(logfile, 'r').readlines()traffic = {}counter = {}for log in logs:

splitted = log.split()ip = splitted[2]if traffic.has_key(ip):

traffic[ip] = traffic[ip] + int(splitted[4])counter[ip] = counter[ip] + 1

else:traffic[ip] = int(splitted[4])counter[ip] = 1

keys = traffic.keys()keys.sort()for ip in keys:

print '%s | %7d | %15d (%7.2f) |' % (ip.ljust(18), ↵↵↵↵↵counter[ip], traffic[ip], traffic[ip] / 1048576.0)

Page 19: 026 Системный Администратор 01 2005

17№1, январь 2005

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

Создавая сценарии, позволяющие автоматизировать раз-личные процессы в сети, зачастую необходимо программ-но управлять файловой системой NTFS, а именно: созда-вать, удалять, перемещать, копировать файлы и папки; из-менять их атрибуты и права доступа к ним. Такие сценариимогут быть созданы с помощью VBScript или JSсript. В дан-ной статье все примеры будут приведены на VBScript.

Основы программного управленияфайловой системойДля программного управления файловой системой NTFS спомощью VBScript рекомендуется использовать встроенныйобъект FileSystem Object, поддерживающий набор методов,перечисленных в таблице 1:

Для получения доступа к объектам FSO необходимосоздать переменную-объект и присвоить ей ссылку наобъект FileSystemObject:

После создания объекта становятся доступны его ме-тоды, свойства и дочерние объекты. Поскольку в даннойстатье будут рассмотрены вопросы, касающиеся операцийс файлами и папками, то некоторые объекты и наборы, та-кие как Drive(s) и TextStream, не будут рассмотрены.

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

Доступ к набору Folders можно получить, воспользовав-шись следующим шаблоном:

где path – путь к каталогу, например, «C:\FolderName» или«\\Server\ShareName».

В качестве обработчика ошибок рекомендуется исполь-зовать функцию FolderExists(), с помощью которой можноопределить существует ли каталог, по указанному пути:

Определение списка подпапокв указанной директорииФормирование списка осуществляется с помощью свойстваName набора SubFolders и Files. С помощью набораSubFolders определяется список папок, вложенных в ука-занный каталог, а с помощью Files – соответственно спи-сок файлов. Приведем пример, в котором будет определе-ны подпапки каталога Windows:

Определение списка всехвложенных подпапок в каталогеДля чтения всей структуры подкаталогов необходимо вы-шеописанный механизм поместить в функцию и сделать еерекурсивной1. Функция будет иметь два параметра – путь кабсолютному подкаталогу (PATH) и уровень вложенностиподкаталогов (IDX).

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

ПРОГРАММНОЕ УПРАВЛЕНИЕ ФАЙЛОВОЙ СИСТЕМОЙС ПОМОЩЬЮ VBScriptПРОГРАММНОЕ УПРАВЛЕНИЕ ФАЙЛОВОЙ СИСТЕМОЙС ПОМОЩЬЮ VBScript

ИВАН КОРОБКО

Òàáëèöà 1

Set fso=WScript.CreateObject(�Scripting.FileSystemObject�)

path="�"Set fso=WScript.CreateObject("Scripting.FileSystemObject")Set oFolders=fso.GetFolder(path)

path="�"Set fso=WScript.CreateObject("Scripting.FileSystemObject")If fso.FolderExists(path) thenSet oFolders=fso.GetFolder(path)�ElseMsgBox "Folder " + path + " Not Exists"End If

path="C:\Windows"Temp=""Set fso=WScript.CreateObject("Scripting.FileSystemObject")If fso.FolderExists(path) thenSet oFolders=fso.GetFolder(path)Set OSubFolders=oFolders.Subfolders

For each i In OSubFoldersTemp=Temp+i.Name+chr(13)

NextElseTemp= "Folder " + path + " Not Exists"End IfMsgBox Temp

1 Рекурсивная функция – это функция, вызывающая саму себя, при этом она обязательно передает параметры. Рекурсивные функции, как

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

Path="C:\RootFolder"i=0Dim Array() 'Îáúÿâëåíèå äèíàìè÷åñêîãî ìàññèâàSet fso=Wscript.CreateObject("Scripting.FileSystemObject")

Page 20: 026 Системный Администратор 01 2005

18

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

Шаблон рекурсивной функции:

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

Определение списка файлов,находящихся в директорииМетодика определения списка файлов, содержащихся вдиректории, та же, что и в случае определения списка под-каталогов. Разница заключается в том, что вызываетсянабор Files, а не SubFolder:

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

Определение атрибутов файловПолучив доступ к файлам, как это показано в предыдущемразделе, с помощью свойства Attributes можно определитьатрибуты файлов.

Свойство Attributes возвращает двоичное значение, рас-шифровка которых приведена в таблице:

Приведем пример чтения атрибута файла boot.ini:

Если атрибуты этого файла никто не изменял, то значе-ние свойства oFile.Attributes будет равно 39, что в соответ-ствии с таблицей обозначает, что boot.ini имеет следующиеатрибуты: только для чтения, скрытый, системный, архи-вный.

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

���..' Âûçîâ ôóíêöèè RecFolder â òåëå ñöåíàðèÿRecFolder index, path���..Function Recfolder (idx, path)���..���..���..Call Recfolder (idx+1, path)���..End Function

dim path_array()path="c:\windows"i=0temp=""detect(q)MsgBox "oFolders_count: "+cstr(detect(q))For j=0 to cstr(ubound(path_array)-1)path=cstr(path_array(j))temp=temp+cstr(j)+": "+path+chr(13)NextMsgBox tempFunction detect(c)i=0Set fso=Wscript.CreateObject("Scripting.FileSystemObject")Set oFolder=fso.GetFolder(path)Set oFolders=oFolder.SubFoldersRedim Preserve path_array(oFolders.count)detect=oFolders.count

For Each oF In oFolderspath_array(i)=path+"\"+cstr(oF.Name)i=i+1Next

End Function

path="c:\windows"Set WSHShell = WScript.CreateObject("WScript.Shell")Set fso=createobject("Scripting.filesystemobject")Set oFolder=fso.GetFolder(path)Set oFiles=oFolder.filesMsgBox "oFiles_count: "+cstr(oFiles.count)temp=""For each oFile in oFilestemp=temp & oFile.name & chr(13)Next

MsgBox text

Òàáëèöà 2

path="c:\boot.ini"Set WSHShell = WScript.CreateObject("WScript.Shell")Set fso=createobject("Scripting.filesystemobject")Set oFile=fso.GetFile(path)MsgBox oFile.Name&": "& oFile.Attributes

path="c:\boot.ini"Set WSHShell = WScript.CreateObject("WScript.Shell")Set fso=createobject("Scripting.filesystemobject")if fso.FileExists(path) then

Set oFile=fso.GetFile(path)Attr_value=oFile.Attributes

temp=A_detect()MsgBox oFile.Name&": "& temp

elseMggBox "Ôàéë " &path& " íå ñóùåñòâóåò"

end iffunction A_detect()

t=""if (Attr_value and &H01)> 0 Then ↵↵↵↵↵

t=t+"Òîëüêî äëÿ ÷òåíèÿ; "if (Attr_value and &H02)> 0 Then ↵↵↵↵↵

t=t+"Ñêðûòûé; "if (Attr_value and &H04)> 0 Then ↵↵↵↵↵

t=t+"Ñèñòåìíûé; "if (Attr_value and &H20)> 0 Then ↵↵↵↵↵

t=t+"Àðõèâíûé; "if (Attr_value and &H800)> 0 Then ↵↵↵↵↵

t=t+"Ñæàòûé; "A_detect=t

end function

Set oFolder=fso.GetFolder(path)Set oFolders=oFolder.SubFolders' Èçìåíåíèå ðàçìåðà äèíàìè÷åñêîãî ìàññèâàRedim Preserve Array(oFolders.count)

For Each of In oFoldersArray(i)=cstr(oF.Path) ' Çàïèñü ýëåìåíòîâ â ìàññèâi=i+1

Next'×òåíèå ýëåìåíòîâ ìàññèâà:Temp=""For i=Lbound(Array) to Ubound(Array)Temp=Temp+cstr(Array(i))+chr(13)+chr(10)NextMsgBox Temp

Page 21: 026 Системный Администратор 01 2005

19№1, январь 2005

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

Изменение атрибутов файловИзменение атрибутов файлов с помощью FSO осуществля-ется присвоением другого значения переменной oFile.Name.Значение может быть присвоено как в шестнадцатеричном,так и в десятеричном виде в (см. таблицу 2):

По умолчанию вновь созданный файл readme.txt имеетатрибут «Архивный»(32). Присвоив параметру oFile.Attributesзначение 39, файлу будут назначены следующие атрибу-ты: только чтение, скрытый, системный, архивный.

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

Создание и удаление папокСоздание и удаление каталогов осуществляется с помощьюметодов CreateFolder(path) и DeleteFolder(path) объекта FSO.Параметром каждого из этих методов является путь к ката-логу – path. Используя эти методы, желательно включать влистинг скрипта обработчик ошибок, который проверяет на-личие или отсутствие папки перед осуществлением каких-либо манипуляций с ней. Приведем два примера: первымиз них проиллюстрируем процесс создания новой папкиC:\TempFolder; во втором – процесс удаления этой папки.

Удаление папки:

Переименование, копированиеи перемещение папокКопирование папок осуществляется с помощью методаCopyFolder source, destination, overwrite, перемещение и пе-реименование – с помощью MoveFolder source, destination,overwrite. Каждый их этих методов имеет три параметра:

Source – обязательный параметр, в котором передает-ся строка с именем исходной папки (путем); путь можетвключать знаки подстановки, такие как «?» или «*». Реко-мендуется использовать знаки подстановки для копирова-ния или перемещения нескольких папок, одновременноудовлетворяющих заданному шаблону

Destination – обязательный параметр, задающий путь кпапке назначения в виде строки. Значение этого парамет-ра не может содержать символов подстановки. В том слу-чае если путь заканчивается «\» и папка-приемник не су-ществует, то она будет создана.

Overwrite – необязательный параметр, который прини-мает значение False(0) или True(1). Если он равен True, т.е.1 (по умолчанию), то целевая папка будет перезаписана.

Обратите внимание на то, что параметры указываютсябез скобок. Приведем примеры копирования и перемеще-ния папок. Копирование папки:

Удаление папки:

Копирование и перемещение файловКопирование и перемещение файлов осуществляются с по-мощью методов Copy и Move соответственно. Поскольку ис-пользование этих методов одинаково, то они будут рассмот-рены совместно. Шаблон вызова любого метода следующий:

где вместо «****» указывается название метода. Различиев использовании методов заключается в том, что при вы-зове метода Move после копирования файла осуществля-ется удаление первоисточника.

Приведем пример копирования файла:

Удаление файловУдаление файла осуществляется с помощью метода Delete,вызываемого аналогичным способом. Отличается лишьсинтаксис самого метода: у метода Delete, в отличие от Copyили Move, отсутствуют параметры:

path="c:\readme.txt"Set WSHShell = WScript.CreateObject("WScript.Shell")Set fso=createobject("Scripting.filesystemobject")Set oFile=fso.GetFile(path)

MsgBox oFile.Name&": "& oFile.AttributesoFile.Attributes=39

MsgBox oFile.Name&": "& oFile.Attributes

path="C:\TempFolder"Temp=""Set fso=WScript.CreateObject("Scripting.FileSystemObject")If fso.FolderExists(path)=0 thenfso.CreateFolder(path)Temp= "Folder " + path + " Created "ElseTemp= "Folder " + path + " Already Exists"End IfMsgBox Temp

path="C:\TempFolder"Temp=""Set fso=WScript.CreateObject("Scripting.FileSystemObject")If fso.FolderExists(path)<>0 thenfso.DeleteFolder(path)Temp= "Folder " + path + " Deleted"ElseTemp= "Folder " + path + " is Absent "End IfMsgBox Temp

OldPath="C:\TempFolderOld"NewPath="C:\TempFolderNew"

Set fso=WScript.CreateObject("Scripting.FileSystemObject")fso.CopyFolder OldPath, NewPath, 1

MsgBox "Ïàïêà " + OldPath + " ñêîïèðîâàíà â " + NewPath

OldPath="C:\TempFolderOld"NewPath="C:\TempFolderNew"

Set fso=WScript.CreateObject("Scripting.FileSystemObject")fso.MoveFolder OldPath, NewPath, 1

MsgBox "Ïàïêà " + OldPath + " ïåðåìåùåíà â " + NewPath

PathOld="C:\Folder\FileNameOld"PathNew="C:\Folder\FileNameNew"

Set fso=WScript.CreateObject("Scripting.FileSystemObject")If (fso.FileExistes(PathOld)) Then

Set oFile=fso.GetFile(PathOld)oFile.**** PathNew

End If

PathOld="C:\Folder\1.txt"PathNew="C:\Folder\2.txt"

Set fso=WScript.CreateObject("Scripting.FileSystemObject")If (fso.FileExistes(PathOld)) Then

Set oFile=fso.GetFile(PathOld)oFile.Copy PathNew

End If

Page 22: 026 Системный Администратор 01 2005

20

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

Управление правами доступана файлы и папкиСоздавая новую папку или файл на жестком диске с фай-ловой системой NTFS, новому объекту присваиваются пра-ва доступа по определенным правилам. Если разговор идето создании общих папок на сервере, то системного адми-нистратора, как правило, не устроят права доступа, на-значаемые по умолчанию: они должны быть изменены всоответствии с определенными правилами, описываемы-ми шаблоном. О том, как программно изменить права до-ступа на папки и файлы, и пойдет разговор в следующемразделе.

Библиотека ADsSequrity.dllПрограммное управление правами доступа к файлам и пап-кам можно реализовать с помощью библиотеки ADsSequrity.dll, входящей в комплект поставки ADSI ResourceKit (http://www.microsoft.com). Перед использованием биб-лиотеки ее необходимо зарегистрировать на компьютере,на котором будет запускаться сценарий.

Команда регистрации библиотеки выглядит следующимобразом:

Доступ к вышеуказанной библиотеке осуществляется спомощью функции CreateObject(«ADsSecurity») по следую-щему сценарию:

Как видно из примера, для управления правами необ-ходимо создать новый экземпляр объекта ADsSecurity иуказать к нему путь, который является параметром функ-ции GetSecurityDescriptor(). Таким образом, можно получитьдоступ к коллекции DiscretionaryAcl, членами которой явля-ются Trustee, AccessMask, AceType, AceCount и не фигури-рующий в данном шаблоне RemoveAcl:

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

Параметр AccessMask (см. рис. 1):

Параметр AccessFlags (см. рис. 2):

Параметр AceType (см. рис. 1, 3):

Также приведем таблицу, в которой описан набор стан-дартных атрибутов (см. рис. 3):

PathDel="C:\Folder\1.txt"Set fso=WScript.CreateObject("Scripting.FileSystemObject")If (fso.FileExistes(PathDel)) Then

Set oFile=fso.GetFile(PathDel)oFile.Delete

End If

regsvr32.exe /s ADsSequrity.dll

Set sec = CreateObject("ADsSecurity")Set sd = sec.GetSecurityDescriptor("FILE://c:\folder")Set dacl = sd.DiscretionaryAcl

For Each ace In daclWscript.Echo cstr(ace.Trustee)+" " + cstr(ace.AccessMask) + ↵↵↵↵↵

" " + cstr(ace.AceType) + chr(13)+chr(10)Next

Wscript.Echo dacl.AceCount

Òàáëèöà 3

Òàáëèöà 4

Òàáëèöà 5

Òàáëèöà 6

Òàáëèöà 7

Page 23: 026 Системный Администратор 01 2005

21№1, январь 2005

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

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

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

Изучив пример, можно обнаружить две особенности:! Для каждого нового добавляемого объекта необходимо

создать свой собственный объект AccessControlEntry, приэтом описание объекта GetSecurityDescriptor и ADsSecurityу них может быть общим.

! После добавления нового объекта должно пройти неко-торое время (особенно если сценарий находится на од-ном сервере, a объект, права доступа на который необ-ходимо изменить, на другом), прежде чем он станет до-ступен для последующих действий. Для этого необхо-димо сделать в сценарии паузу. Поскольку в VBScriptне существует такой функции, то предлагается вставитьпустой цикл For…Next, на выполнение которого требу-ется определенное время.

Удаление существующих объектовУдаление существующих групп или пользователей осуще-ствляется с помощью свойства RemoveAcl коллекции объек-тов DiscretionaryAcl.

Рассмотрев основы управления NTFS, читатель можетприступить к реализации более сложных задач.

Ðèñóíîê 1

Ðèñóíîê 2

Ðèñóíîê 3

Set sec = CreateObject("ADsSecurity")Set sd = sec.GetSecurityDescriptor("FILE://c:\Folder")Set dacl = sd.DiscretionaryAclSet ace = CreateObject("AccessControlEntry")ace.Trustee = "Domain\Administrator"ace.AccessMask = &h20000000ace.AceType = &h0ace.AceFlags = &h3dacl.AddAce ace1sd.DiscretionaryAcl = daclsec.SetSecurityDescriptor sdset dacl=nothingset sec=nothing

Set sec = CreateObject("ADsSecurity")Set sd = sec.GetSecurityDescriptor("FILE://c:\Folder")Set dacl = sd.DiscretionaryAclSet ace1 = CreateObject("AccessControlEntry")ace1.Trustee = "msk\corwin"ace1.AccessMask = &h20000000ace1.AceType = &h0ace1.AceFlags = &h3dacl.AddAce ace1for i=0 to 10000000nextSet ace2 = CreateObject("AccessControlEntry")ace2.Trustee = "msk\sneretin"ace2.AccessMask = &h20000000ace2.AceType = &h0ace2.AceFlags = &h3dacl.AddAce ace2sd.DiscretionaryAcl = daclsec.SetSecurityDescriptor sdset dacl=nothingset sec=nothing

Set sec = CreateObject("ADsSecurity")Set sd = sec.GetSecurityDescriptor("FILE://c:\2")Set dacl = sd.DiscretionaryAcl

For Each ace In daclIf (ace.Trustee="EveryOne")

dacl.RemoveAce aceend if

Nextsd.DiscretionaryAcl = daclset dacl=nothingset sec=nothing

Page 24: 026 Системный Администратор 01 2005

22

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

С ростом популярности беспроводных сетей 802.11 a/b/g,объединённых общим названием Wi-Fi, всё быстрее разви-вается новое направление на рынке организации услуг до-ступа в Интернет – создание публичных зон доступа, илиHOTSPOT. HOTSPOT – это место, где имеется доступ к бес-проводной сети. И если с беспроводной составляющейHOTSPOT (имеются в виду точки доступа) всё более-ме-нее понятно, то со средствами учёта и контроля пользова-телей по-прежнему возникают затруднения. Для разреше-ния этой проблемы многие производители сетевого обору-дования приступили к выпуску специализированного обо-рудования для формирующегося рынка услуг. Не стала ис-ключением и компания D-Link, представив шлюз для созда-ния зон коллективного доступа в Интернет DSA-3100 и чек-принтер DSA-3100P.

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

жении лимита трафика или времени.

Безусловно, эти функции можно реализовать даже намаломощной машине под управлением *nix. Однако D-Linkобещает нам решение этих задач при помощи простого внастройке шлюза, который сможет настроить даже сред-нестатистический пользователь. Кроме того, шлюз будетинтересен и более подготовленным пользователям, т.к. наего основе возможно построение полноценной биллинго-вой системы.

Устройство имеет три порта Ethernet:! WAN-порт – для подключения к сети Интернет.! LАN-порт (частная сеть) – подключаются клиенты, для

которых не требуется аутентификация (например, ло-кальная сеть кафе, в котором организован HOTSPOT).

! Authentication-порт – к этому порту подключается сеть,клиенты которой будут проходить аутентификацию пе-ред выходом в Интернет.

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

шлюза, с которой справится любой человек, имеющий ба-зовые знания по IP-сетям. Все настройки осуществляютсячерез встроенный веб-интерфейс. Оператор хотспота (че-ловек, пробивающий чеки на тикет-принтере) также не бу-дет загружен сложной работой. Добавление нового пользо-вателя происходит очень просто: в меню вводится количе-ство предоплаченных клиентом часов и нажимается кноп-ка «Print» на чек-принтере. В распечатанной карточке дос-тупа (которая, правда, больше похожа на чек) находитсявся необходимая для подключения к сети информация: ключWEP-шифрования, логин и пароль для авторизации. Припервой попытке пользователя обратиться к ресурсам Ин-тернета он перенаправляется на веб-страницу авторизации.Обмен авторизационной информацией происходит по про-токолу HTTPS, что повышает безопасность системы. Наслучай, если браузер клиента не поддерживает защищён-ное SSL-соединение (что бывает крайне редко), предусмот-рена возможность использования открытого HTTP. Мето-дика авторизации пользователей, построенная на базе Web,избавляет менеджера HOTSPOT от хлопот по установке инастройке на машинах пользователей дополнительногоклиентского ПО, управляющего авторизацией.

К вышеописанному виду относится большинствоHOTSPOT, которые создаются в аэропортах, на вокзалах,в выставочных комплексах и гостиницах. В них по обыкно-вению используется тарификация по времени на условияхпредоплаты. Шлюз D-Link DSA-3100 в паре с принтеромDSA-3100P идеально подходят для решения подобных за-дач – HOTSPOT может быть развернут всего за несколькочасов (в зависимости от масштабов) даже силами прихо-дящего админа или просто продвинутого пользователя.

Кроме простейших случаев, существуют более сложныеварианты – например, когда мы имеем не один, а целуюсеть HOTSPOT, причём необязательно в каждом из них естьоператор, принимающий платежи. Возможен, например,такой вариант: клиент активирует карточки предоплаты(скретч-карты) для зачисления денег на свой электронныйсчёт. В этом случае шлюз DSA-3100 становится большойважной шестерёнкой под названием NAS (Network AccessServer) в сложном механизме биллинговой системы. Аутен-тификация/Авторизация/Аккаунтинг (ААА) при этом прово-дятся через RADIUS-сервер.

Ещё одним важным свойством такой системы являетсято, что для того, чтобы она стала полноценным биллингом,

АНДРЕЙ ПЛАТОНОВ

HOTSPOT – ЭТО ПРОСТО!

Page 25: 026 Системный Администратор 01 2005

23№1, январь 2005

на правах рекламы

её, скорее всего, придётся немного доработать, что могутосуществить только самые упорные и опытные. Но не богигоршки обжигают!

RADIUS расшифровывается как Remote AuthenticationDial In User Service. Изначально данный протокол был со-здан для обслуживания больших модемных пулов, но реа-лизация получилась настолько удачной, что сейчас он час-то используется не только для DialUP, но и для IP-телефо-нии, организации доступа в VPN-сети.

Итак, раз заголовок нашей статьи «HOTSPOT – это про-сто!», мы рассмотрим самый простой вариант из всех воз-можных сложных вариантов и набросаем в общих чертаххотспотный биллинг, который и есть самое главное в хотс-поте. Средством сбора статистики будут шлюзы DSA-3100.Несмотря на взрывной рост популярности Linux-систем, наи-более распространенной и знакомой для большинства ос-тается Windows. Поэтому мы рассматриваем RADIUS-сервер именно на его основе. Безусловно, для опытногоюниксоида не будет проблемой связать DSA-3100, напри-мер, с freeradius, одним из важнейших достоинств которо-го является его бесплатность.

Для эксперимента мы использовали компьютер под уп-равлением Win2k Server и WinRadius 2.11 (http://www.itconsult2000.com), как и большинство программ под Windows,WinRadius небесплатен, однако эту проблему можно решитьтем или иным способом (например, купить ее).

Теперь более подробно о том, как будет выглядеть нашаучётно-биллинговая система и как она будет работать.Предположим, у нас есть некоторая опорная сеть, к кото-рой через DSA-3100 подключены все наши хотспоты. Шлюзкаждого хотспота настроен на работу с RADIUS, который всвою очередь взаимодействует с базой данных (в нашемслучае это будет msAcsess – как самый простейший вари-ант), в которой хранятся учётные записи пользователей и вкоторую будет складываться статистика.

Итак, проделаем следующее:! поставим WinRadius;! настроим WinRadius на взаимодействие с DSA-3100 и

БД MSAccess;! создадим пользователя на сервере RADIUS;! аутентифицируемся и посчитаем трафик (посмотрим,

как это всё записалось в БД);! сделаем маленький веб-интерфейс к биллинговой сис-

теме, реализующий некоторый функционал.

Настройка WinRadius

Настраиваем драйвер базы данных ODBCЭто требуется для работы нашего RADIUS с БД MSAccess(файл базы данных есть в дистрибутиве WinRadius –WinRadius.mdb). ODBC – это аббревиатура от OpenDataBase Connectivity (примерный перевод – открытая сис-тема связи с базами данных) – некий универсальный ин-терфейс к различным базам данных. Что-то вроде прослой-ки между пользовательскими приложениями и базами дан-ных, которая позволяет скрыть особенности той или инойБД и унифицировать свойства всех источников данных.

Page 26: 026 Системный Администратор 01 2005

24

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

! В поле «Data Source Name» вписываем «WinRadius».! В поле «Description» пишем что хотим.! Нажимаем «Select», ищем директорию, в которой уста-

новлен WinRadius, и находим там файл WinRadius.mdb.! Нажимаем «OK».

Настраиваем DSA-3100 на работус сервером RADIUS

Создаём 5 пользователей (больше, к сожалению, нельзя,демоверсия WinRadius не позволяет), всем назначаем ак-каунтинг на базе использованного трафика. Затем пробу-ем аутентифицироваться: на компьютере, который подклю-чён к Authentification-порту DSA-3100, набираем какой-либоURL, шлюз перехватывает http-запрос и выдаёт нам формудля аутентификации (всё, разумеется, под защитой SSL).Процесс аутентификации и завершение пользовательскойсессии отображается в окне WinRadius. Все данные, кото-рыми оперирует WinRadius, хранятся в базе данных (дан-ные – это пользовательские аккаунты и логи).

Откроем в MsAcсess файл WinRadius.mdb и посмотрим,как выглядит база данных нашего RADIUS – а выглядит онадовольно просто. Видим в ней несколько таблиц.

Таблица tbLogs (в ней записались все данные об объе-ме трафика, который прокачали 5 тестовых пользователей).

Таблица tbUsers (в которой мы видим созданных пользо-вателей).

Итак, вроде бы всё очень хорошо: пользователи аутен-тифицируются, и трафик считается. Единая база данныхпозволяет осуществлять роуминг между HOTSPOT, разбро-санными по всему городу. Между точками доступа внутрихотспотов также осуществляется роуминг при помощи про-токола IAPP (Inter Access Point Protocol). Однако чего-то всё-таки не хватает. А не хватает следующего: возможностипользователям просматривать текущее состояние своегосчёта, возможности пополнять счёт (чтобы это мог делатьсам пользователь или администратор/оператор системы).Кроме того, не помешает наличие возможности удобногоадминистрирования системы, в которой, например, будетнесколько NAS-серверов DSA-3100 (сеть хотспотов или ин-тернет-кафе), т.е. количество пользователей будет доволь-но приличным.

Как же всё это реализовать? Ответ напрашивается самсобой: нужно сделать пользовательский и администратор-ский веб-интерфейс, который будет брать/класть данные внашу базу данных. Пусть всё это работает на веб-сервере,работающем на том же компьютере, на котором работаетRADIUS. Веб-сервер мы поместим в зону, свободную дляпросмотра ( DSA-3100 позволяет это сделать), чтобы дажепользователи с нулевым и отрицательным балансом моглизайти на страницу статистики/пополнения счёта.

Выбираем веб-сервер: компьютер у нас под Win2k Server,значит, скорее всего, будем использовать Apache дляWindows или IIS (Internet Information Services). Если выбе-рем Apache, то будем писать веб-страницы со скриптамина PHP (Perl и т. д. и т. п.). Если же выберем IIS, тогда бу-дем использовать технологию ASP (Active Server Pages).Веб-страницы со скриптами в этом случае будем писать наVBS (Visual Basic Script – этот язык очень похож на бейсик,который все мы изучали в школе) или на JavaScrip. Есть,конечно, ещё много различных вариантов, на чём писать ичто использовать, я перечислил то, что лежит на поверхно-сти. Остановимся, пожалуй, на IIS с ASP и VBS – вариантнаиболее простой для понимания и освоения. Весь пере-численный функционал реализовывать не будем, но кое-что всё-таки покажем для примера.

Page 27: 026 Системный Администратор 01 2005

25№1, январь 2005

на правах рекламы

Создаём сайт на веб-сервере IIS! Control Panel →→→→→ Administrative Tools →→→→→ Internet Services

Manager (оснастка, управляющая IIS).! Правой мышкой по компьютеру →→→→→ New →→→→→ Web Site →→→→→

запустился мастер →→→→→ пишем название сайта (любое) →→→→→назначаем ему IP-адрес →→→→→ указываем папку, котораябудет домашним каталогом сайта (туда будем склады-вать веб-странички со скриптами) →→→→→ ничего не трога-ем, жмём «Next» →→→→→ «Finish». Сайт готов, он появился влевой половине оснастки.

Скрипт №1Для начала сделаем страницу со скриптом, который про-сто обращается к нашей БД и полностью извлекает оттудасодержимое таблицы tbLogs. Делать можно в чём угодно, втом числе и в блокноте (номера строк писать не надо – этодля удобства комментирования). Файл назовём bd.asp; со-храним его в домашний каталог сайта.

Разбор bd.asp:! Строки 1-6: здесь всё понятно – простой HTML.! Строка 8: значок «<%» открывает скрипт. При помощи ме-

тода CreateObject объекта Server создаётся соединениеADO – MyConnection (которое в свою очередь тоже явля-ется обьектом и имеет набор свойств и методов).

! Строки 10-13: при помощи метода OPEN объектаMyConnection открывается соединение с базой данныхRADIUS. В строке соединения (строки 11-13) задаются

параметры соединения с БД (по порядку): драйвер, имяфайла БД, директория с файлом БД (не забудьте впи-сать туда директорию, в которой лежит WinRadius.mdb),имя, пароль (пароль не задан и это, конечно же, надотоже исправить).

! Строка 15: при помощи метода Execute объекта MyConnection выполняем SQL-запрос и ответ помещаем впеременную rsLogs (которая является набором записей,содержащим результат запроса к БД). Структура этойпеременной определяется запросом, т.е. если на выхо-де будет таблица, то rsLogs будет иметь структуру дан-ной таблицы. Чтобы вывести данные из этой перемен-ной, надо организовать цикл, выполняющийся до техпор, пока набор записей не будет прочитан, что мы иделаем в последующих строках (22-28).

! Строки 17-21: делаем шапочку для таблицы, в которойбудут отображены данные, считанные из БД.

! Строка 22: начало цикла, в котором будем читать и вы-водить содержимое переменной rsLogs до тех пор, покаеё полностью не прочитаем (not rsLogs.EOF).

! Строки 23-26: выводим набор записей из rsLogs в таб-лицу на печать (т.е. на экран). Делаем это при помощиметода write объекта Response. Если содержимое вы-вода является HTML, то помещаем его в кавычки; еслисодержимое вывода какая-либо переменная, то пишемеё без кавычек. HTML и переменные можно чередоватьв выводе, объединяя их символом «&».

! Строка 27: перемещаемся на следующую строку набо-ра записей, содержащихся в rsLogs.

! Строка 28: идём в начало цикла.! Строка 30: закрываем теги <tr> и <table>, которые мы

открыли перед циклом вывода данных (22-28).! Строки 31-32: закрываем набор записей rsLogs и скрипт

символом «%>».! Строки 33-34: конец страницы.

Результат обращения к данной странице:

Набираем в браузере: http://IP веб-сайта/bd.asp.В ответ получаем содержимое таблицы БД, в которую

сложились логи с DSA-3100, выступающего в качестве NAS(думаю, что у всех всё заработало).

bd.asp1 <html>2 <head>3 <title>tbLogs</title>4 </head>5 <body bgcolor="#FFFFFF" text="#000000">6 ------ Òàáëèöà <b>tbLogs</b> ------- <br><br>78 <% set MyConnection = ↵↵↵↵↵

Server.CreateObject("ADODB.Connection")910 MyConnection.Open "Driver={Microsoft Access Driver ↵↵↵↵↵

(*.mdb)};" & _11 "DBQ=WinRadius.mdb;" & _12 "DefaultDir=C:\(radius)\WinRadius;" & _13 "Uid=Admin;Pwd=;"1415 set rsLogs=MyConnection.Execute ("SELECT * FROM tbLogs")1617 response.write "<table width=90% border=1 ↵↵↵↵↵

cellspacing=0 align=center><tr><td><b>happen</b></td>"18 response.write ↵↵↵↵↵

"<td><b>username</b></td><td><b>duration</b>"19 response.write ↵↵↵↵↵

"</td><td><b>input</b></td><td><b>output </b></td><td>"20 response.write "<b>fee</b></td></tr>"2122 do while not rsLogs.EOF23 response. write "<tr>"24 response.write "<td>" & rsLogs("happen") & ↵↵↵↵↵

"</td><td>" & rsLogs ("username") & "</td><td>" & ↵↵↵↵↵rsLogs("duration")

25 response.write "</td><td>" & rsLogs ("input") & ↵↵↵↵↵"</td><td>" & rsLogs ("output") & "</td><td>" & ↵↵↵↵↵rsLogs ("fee") & "</td>"

26 response. write "</tr>"27 rsLogs.movenext28 loop2930 response.write "</tr></table>"31 rsLogs.Close32 rsLogs = null %>33 </body>34 </html>

Page 28: 026 Системный Администратор 01 2005

26

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

Скрипт №2Теперь реализуем функционал, позволяющий пользовате-лю смотреть статистику своих соединений, страницу статис-тики защитим паролем. Вся обработка обращения пользо-вателя осуществляется одной страницей, в которой будетвыполняться та или иная часть скрипта в зависимости оттого, что пользователь введёт в поля «логин» и «пароль»(этот метод называется «рекурсивная обработка формы»).Файл назовём bd2.asp, его также сохраним в домашнемкаталоге сайта. Логика работы страницы следующая:1. Проверяем, введено ли что-нибудь в поля «логин» и «па-

роль»:! если оба поля не заполнены, или не заполнено ка-

кое-либо одно поле, то снова выдаём пустую форму(т.е. возвращаемся к пункту 1);

! если оба поля заполнены, то переходим к пункту 2.2. Обращаемся к БД и проверяем правильность логина и

пароля:! если пароль и логин правильные, то выдаём пользо-

вателю статистику его соединений;! если неправильные, выдаём сообщение «Неправиль-

ное или несуществующее имя пользователя или па-роль!».

Разбор bd2.asp :! Строки 1-6: здесь всё понятно – простой HTML.! Строка 7: значок «<%» открывает скрипт.! Строки 8,9: объявляем переменные, в которые считаем

из формы логин и пароль.! Строки 11,12: получаем логин и пароль из POST-запроса.! Строка 14: начало условия (проверяем введено ли имя

пользователя и пароль – сравниваем то, что получилииз запроса с пустотой).

! Строки 16-22: выводим чистую форму, если пользовательне заполнил оба или одно из полей «логин» и «пароль».

! Строка 24: конец условия.! Строка 25: конец скрипта.! Строка 26: начало нового скрипта, который будет вы-

полняться в том случае, если имя и пароль введены.! Строка 27-32: подключаемся к БД.

bd2.asp1 <html>2 <head>3 <title>tbLogs</title>4 <META http-equiv=Content-Type content="text/html; ↵↵↵↵↵

charset=windows-1251">5 </head>6 <body bgcolor="#FFFFFF" text="#000000">7 <%8 Dim sSearchLogin9 Dim sSearchPassword1011 sSearchLogin = Request.Form("login")12 sSearchPassword = Request.Form("password")1314 if sSearchLogin = "" or sSearchPassword = "" Then1516 response.write "<div align=center> <table ↵↵↵↵↵

cellpadding=10><tr><td ↵↵↵↵↵bgcolor=#CC6600>&nbsp;</td></tr></table>"

17 response.write "<p><b><font color=#CC6600>Mega ↵↵↵↵↵Wi-Fi network billing system ↵↵↵↵↵</font></b></p><p>&nbsp;</p> <p><br><br>"

18 response.write "--- Ñåðâåð ñòàòèñòèêè --- "19 response.write "<form name=form method=post ↵↵↵↵↵

action=bd2.asp><table align=center border=1><tr> ↵↵↵↵↵<td ><b>Ëîãèí:</b></td><td > "

20 response.write "<input type=text name=login> ↵↵↵↵↵</td></tr><tr><td ><b>Ïàðîëü:</b></td><td> "

21 response.write "<input type=password ↵↵↵↵↵name=password><input type=submit name=Submit ↵↵↵↵↵value=âõîä> </td></tr></table></form>"

22 Response.End2324 End If25 %>26 <%27 set Connection = Server.CreateObject("ADODB.Connection")2829 Connection.Open "Driver={Microsoft Access Driver ↵↵↵↵↵

(*.mdb)};" & _30 "DBQ=WinRadius.mdb;" & _31 "DefaultDir=C:\(radius)\WinRadius;" & _32 "Uid=Admin;Pwd=;"3334 strSQL="SELECT password FROM tbUsers ↵↵↵↵↵

WHERE username = " & "'"& sSearchLogin &"'"3536 set rsUsers=Connection.Execute (strSQL)37 pas=""38 do while not rsUsers.EOF

39 pas=rsUsers("password")40 rsUsers.movenext41 loop4243 If pas = sSearchPassword then4445 strSQL1="SELECT * FROM tbLogs ↵↵↵↵↵

WHERE username = " & "'"& sSearchLogin &"'"46 set rsLogs1=Connection.Execute (strSQL1)4748 response.write "<P align=center>Ëè÷íàÿ ñòàòèñòèêà ↵↵↵↵↵

ïîëüçîâàòåëÿ <b>" & sSearchLogin & "</b></p><br><br>"49 response.write "<table width=90% border=1 ↵↵↵↵↵

cellspacing=0x align=center><tr><td><b>íà÷àëî ↵↵↵↵↵ñåññèè</b></td>"

50 response.write "<td><b>username</b></↵↵↵↵↵td><td><b>ïðîäîëæèòåëüíîñòü [ìèí]</b>"

51 response.write "</td><td><b>input ↵↵↵↵↵[Mb]</b></td><td><b>output[Mb] </b></td><td>"

52 response.write "<b>ñòîèìîñòü [$]</b></td></tr>"53 do while not rsLogs1.EOF54 input=input+rsLogs1("input")55 output=output+rsLogs1("output")56 duration=duration+rsLogs1("duration")57 fee=fee+rsLogs1("fee")5859 response. write "<tr>"60 response.write "<td>" & rsLogs1("happen") & "</td><td> ↵↵↵↵↵

" & rsLogs1("username") & "</td><td>" & ↵↵↵↵↵round((rsLogs1("duration")/60),2)

61 response.write "</td><td>" & Round(((rsLogs1 ↵↵↵↵↵("input"))/1024/1024) ,3) & "</td><td>" & ↵↵↵↵↵Round(((rsLogs1 ("output"))/1024/1024) ,3)

62 response.write "</td><td>" & ((rsLogs1("fee")) /100) ↵↵↵↵↵& "</td>"

63 rsLogs1.movenext64 response. write "</tr>"65 loop6667 response.write "</tr></table>"68 response.write "<br><br><br><P ↵↵↵↵↵

align=center>__________________________________<br>"69 response.write "ñóììàðíûé èñõîäÿùèé òðàôèê: <b>" & ↵↵↵↵↵

round((output/1024/1024),3) & "</b> Mb<br><br>"70 response.write "ñóììàðíûé âõîäÿùèé òðàôèê: <b>" & ↵↵↵↵↵

round((input/1024/1024),3) & "</b> Mb<br><br>"71 response.write "ñóììàðíàÿ ïðîäîëæèòåëüíîñòü ñåññèé: ↵↵↵↵↵

<b>" & round((duration/60/60),2) & "</b> ÷àñîâ <br><br>"72 response.write "ðàñõîä çà îò÷¸òíûé ïåðèîä: <b>" & ↵↵↵↵↵

(fee/100) & "</b> $ ↵↵↵↵↵<br>__________________________________________<br></p>"

73 rsLogs1.Close74 rsLogs1 = null75 response.end7677 End If7879 response.write "Íåïðàâèëüíîå èëè íåñóùåñòâóþùåå èìÿ ↵↵↵↵↵

ïîëüçîâàòåëÿ èëè ïàðîëü!"80 %>8182 </body>83 </html>

Page 29: 026 Системный Администратор 01 2005

27№1, январь 2005

на правах рекламы

! Строка 34: формируем SQL запрос к БД, который выби-рает пароль для пользователя с именем, которое вве-дено в форму.

! Строка 36: выполняем запрос.! Строка 37: объявляем переменную «pas» и приравни-

ваем её к пустой строке.! Строки 38-41: читаем набор записей, в котором содер-

жится ответ на SQL-запрос, и присваиваем его значе-ние переменной «pas». Если бы в базе не нашлось па-роля для введённого имени, тогда бы переменная «pas»осталась бы пустой.

! Строка 43: если выбранный пароль совпадает с введён-ным, то выполняем с 45 по 76 строку; если не совпада-ет, тогда выполняем строку 80 – выдаём «Неправиль-ное или несуществующее имя пользователя или па-роль!».

! Строки 45-76: делаем запрос к БД, в ответ получаемвыборку для нужного пользователя. Выводим статис-тику на экран в удобной форме. Response.End (76 стро-ка) означает конец вывода.

! Строка 77: конец условия.! Строка 79: если условие не выполнилось, т.е. пользо-

ватель ввёл неправильный пароль или имя, – выдаёмсоответствующее сообщение.

! Строки 83-84: конец страницы.

Результат обращения к bd2.asp(результат выполнения скрипта)Заходим на страницу, получаем форму для ввода логина ипароля (неплохо было бы и здесь использовать SSL, чтобызлоумышленники не перехватили открытый POST-запросc логином и паролем, но о том, как прикрутить SSL к IISкак-нибудь в другой раз – это довольно-таки легко сделатьпри помощи пакета OpenSSL).

Вводим правильные логин и пароль, получаем резуль-тат (если логин или пароль неправильные, то ничего неполучаем).

Поздравляю! Мы написали хотспотный биллинг.

ВыводыНа первый взгляд всё довольно сложно и запутанно. Но еслиразобраться, ничего сложного нет: NAS-серверы, в роли ко-торых выступают DSA-3100, проводят аутентификациюпользователей и пишут CDR-подобную статистику в еди-ную базу данных RADIUS. Для реализации различных до-полнительных (практически любых) функций биллинга раз-рабатываем веб-интерфейс, для чего используем, напри-мер, ASP или PHP. Тарификация пользователей может осу-ществляться на основе использованного времени илипо трафику. В случае с одиночно стоящим хотспотом – сер-висный шлюз DSA-3100 и тикет-принтер DSA-3100P – яв-ляются биллингом во плоти, никаких гаек подкручивать ненадо, с построением хотспота справится любой, но тари-фикация будет вестись только по времени.

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

Я говорю следующее: есть простые HOTSPOT и для это-го подойдёт DSA-3100 – любой – опытный и не очень пользо-ватель может его себе поставить и всё заработает с пол-оборота. Но бывают сложные решения, и этот шлюз мо-жет, несмотря на всю его простоту, быть использован и длясложного решения.

Я показал на базе продуктов от Microsoft и RADIUS-сер-вере под Windows, какую роль будет выполнять шлюз в этомслучае. Microsoft – это просто, визуально, понятно любому.Либо можно использовать связку: Linux + (WEB)Apache/php+ (БД)Oracle + (RADIUS)Radiator + NAS(DSA-5100).

Видимо, наиболее применимы эти устройства будут дляорганизации точек HOTSPOT в кафе, ресторанах, гостини-цах и прочих заведениях. Но возможно их использование идля серьёзных операторских решений, потому как любойуважающий себя биллинг поддерживает протокол RADIUS.При помощи данных устройств можно легко интегрироватьHOTSPOT в сеть сотового оператора. Такое решение, на-пример, представил «Енисейтелеком» (это ведущий опе-ратор сотовой связи в Красноярском крае) на выставке«Связь – ИНФОКОМ 2004»: пользователи отправляли smsна сервисный номер оператора и получали в ответ sms-со-общение с именем и паролем для доступа в Интернет. Шлюзвзаимодействовал с биллингом оператора (он поддержи-вал протокол RADIUS), деньги за пользование услугой сни-мались с сотового счёта абонента. Очень оригинальная икомфортная с точки зрения пользователя HOTSPOT схемадоступа к услуге.

Вместе с тем шлюз DSA-3100 сможет сэкономить нема-ло времени на настройку авторизации и тарификации ад-министратору обычной проводной (в том числе домашней)сети, предоставив в его распоряжение надежную системуавторизации по IP + MAC в совокупности с авторизациейпо логину и паролю.

Page 30: 026 Системный Администратор 01 2005

28

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

ОРГАНИЗАЦИЯ ОБЩЕГО ДОСТУПА В ИНТЕРНЕТИ ЗАЩИТЫ ОТ ВТОРЖЕНИЙ НА ОСНОВЕKerio WinRoute Firewall 6

РОМАН МАРКОВ

Page 31: 026 Системный Администратор 01 2005

29№1, январь 2005

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

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

Выбор оборудования и первоначальнаянастройка системы и локальной сетиОписываемая система будет крайне непритязательна к ап-паратным ресурсам. Фактически требования совпадают стребованиями устанавливаемой операционной системы. Тоесть для среднего сервера, предназначенного для предос-тавления общего доступа в Интернет на скорости до 128Кбит/сек для 5-7 пользователей, достаточно будет компью-тера Celeron 300-400 МГц, 128 Мб RAM, 5-10 Гб HDD.

Исходя из опыта автора данной статьи, можно такжесказать, что роль такого сервера (Маршрутизатор, Прокси-сервер, Firewall, Почтовый сервер, FTP-сервер) для 10-15пользователей прекрасно может выполнять компьютер сле-дующей конфигурации: Intel Celeron 733, 256 Мб RAM, HDD10 Гб IDE с установленной операционной системой Windows2000 Server.

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

Если количество пользователей колеблется от 20 до 50,то для абсолютной уверенности в надежности и скоростиработы подобного сервера рекомендуется использоватьследующую конфигурацию оборудования: Intel Pentium II-III(Celeron) 1000-1500 МГц, 512 Мб RAM, HDD 18 Гб SCSI. Ноэто уже вопрос финансов. SCSI-диски рекомендуется ис-пользовать для надежности и увеличения скорости досту-па к кэшу прокси-сервера. Крайне рекомендуется исполь-зовать SCSI-диски, если вы будете применять систему ста-тистики по пользователям – процедура записи и анализажурнала запросов очень сильно нагружает именно диско-вую систему.

Настройка операционной системыНа внутреннем сетевом интерфейсе не должно быть про-писано шлюза по умолчанию! В качестве DNS-сервера нанем прописываем либо DNS-сервер провайдера (если нетдомена Windows 2000), либо внутренний DNS-сервер ло-кальной сети, в случае если Active Directory поднят. Реко-

мендую в свойствах сетевого окружения сразу переимено-вать подключения, например «LAN» и «Internet», чтобы вбудущем не путаться. Во втором случае надо будет настро-ить внутренний сервер DNS. В консоли управления DNS-сервером правой клавишей мыши кликаем по нужному сер-веру и выбираем «Свойства». Закладка «Пересылка»(Forwarding). Ставим галочку «Разрешить пересылку» изадаем внутренний адрес нашего сервера общего досту-па. Если внутренний DNS-сервер совпадает с нашим сер-вером общего доступа, то прописываем здесь DNS-серверпровайдера.

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

Затем заходим на закладку «Корневые ссылки» (RootHints). Удаляем там все, что видим, так как разрешениемDNS занимается провайдер, а не ваш шлюз напрямую. Ина-че при некорректной настройке вы рискуете получить до-вольно большой паразитный трафик от DNS-запросов ккорневым интернет-серверам. Подробная инструкция по на-стройке DNS-сервера домена Windows 2000/2003 приведе-на в октябрьском номере журнала – в статье «Установка инастройка W2K Server».

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

Внимание: рекомендуется подключать кабель внешнейсетевой карты (к интернет-провайдеру) только после уста-новки Kerio WinRoute Firewall. В противном случае вы рис-куете тут же подвергнуться вирусной атаке. Из опыта авто-ра статьи: иногда достаточно нескольких минут работы безмежсетевого экрана, чтобы поймать червя семейства Blasterили Sasser.

Обязательно снимите галочки с привязок «Клиент длясетей Microsoft» и «Служба доступа к файлам и принтерам»в свойствах внешнего интерфейса.

После этого приступаем к установке Kerio WinRouteFirewall 6.

УстановкаДистрибутив скачиваем с официального сайта http://www.kerio.com/kwf_download.html. Это trial-версия, работа-ющая в течение 30 дней – срока, достаточного для тести-рования продукта. Потом необходимо приобрести лицен-зию. Trial-версия полностью функциональна.

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

Page 32: 026 Системный Администратор 01 2005

30

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

нируем использовать WinRoute для организации VPN-ка-нала между сетями, то снимаем галку «VPN Support». Фай-лы помощи на чешском языке нам тоже вряд ли понадобят-ся. Поэтому снимаем галку «Czech» внутри опции «HelpFiles». Переходим к следующему экрану.

Создаем первую учетную запись администратора и па-роль.

Внимание! Поменяйте имя предложенной записи «Admin»на другое. Задайте и подтвердите для нее сложный пароль(в противном случае вы рискуете подвергнуться атаке зло-умышленников). Переходим к следующему экрану. Про-грамма предупреждает нас о том, что после установки поумолчанию будет блокирован любой сетевой трафик, по-этому если вы в момент установки конфигурируете серверобщего доступа удаленно – укажите внутренний IP-адрес,с которого необходимо разрешить доступ к удаленному кон-фигурированию. Для дальнейшего конфигурированияWinRoute через Интернет необходимо будет добавить со-ответствующее разрешение в Traffic Policy. Например, IP-адрес рабочей станции, с которой производится удаленноеконфигурирование.

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

Помните, что если вы конфигурируете компьютер, вхо-

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

Итак, регистрируемся с учетной записью администра-тора любым возможным способом. Если предлагают запу-стить консоль администрирования WinRoute – отказываем-ся. В меню «Пуск →→→→→ Программы →→→→→ Kerio →→→→→ WinRouteFirewall» запускаем Engine Monitor. В системном трее по-явится значок WinRoute. Щелкаем по нему правой клави-шей мыши и выбираем «Startup Preferences». В открывшем-ся окне устанавливаем обе галочки. Первая – задает авто-матический запуск сервиса WinRoute, а вторая – автомати-ческий запуск его монитора в системном трее.

Дважды щелкаем на значке WinRoute в трее и вводимадрес нашего сервера WinRoute, а также данные создан-ной нами учетной записи администратора. Если WinRouteустановлен на этом же компьютере – оставляем в поле ад-реса «Localhost».

Запустится мастер (Network Rules Wizard), который по-может произвести первоначальную настройку. Тут есть дваварианта – либо воспользоваться мастером, либо отказать-ся от него и настроить все вручную. Если вы доскональнопонимаете, что именно необходимо настраивать, можновыбрать второй метод. Мы опишем настройку при помощимастера, так как она без особых хлопот позволяет органи-зовать настройку защиты и общего доступа «за 7 кликовмышью».

Page 33: 026 Системный Администратор 01 2005

31№1, январь 2005

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

Настройка при помощи мастераСоглашаемся с предложением мастера продолжить на-стройку. На втором шаге выбираем тип нашего соедине-ния с Интернетом. В нашем случае это «Ethernet, DSL, cablemodem or other». На следующем шаге выбираем тот сете-вой адаптер, который подключен к сети Интернет. Если всписке не появился нужный нам адаптер – подключите се-тевой кабель к нему и заново запустите мастера. Шаг 4позволит нам решить – к каким именно внешним сервисамразрешено будет обращаться клиентам локальной сети.Рекомендуемый минимум: HTTP и HTTPs. Если помимопросмотра веб-страниц клиенты локальной сети должны по-лучать почту с внешних почтовых ящиков по протоколамPOP3, IMAP, а также отправлять по SMTP – устанавливаемнеобходимые галочки. То же самое с доступом к внешнимFTP-серверам. Прямое разрешение имен DNS через Интер-нет для клиентов локальной сети не является необходи-мым – наш шлюз будет перенаправлять такие запросы ивозвращать ответы. Затем отвечаем на вопрос, будем лимы использовать VPN-соединение средствами WinRoute.

На шаге 6 можно указать внутренние сервера, к кото-рым необходимо дать доступ из внешней сети, т.е. Интер-нета. Например, внутренние Web, FTP или почтовые сер-вера. Если мы вообще не хотим предоставлять доступ к на-шей сети извне – не добавляем никаких правил.! Добавим доступ из Интернета к удаленному управле-

нию рабочим столом (Terminal Services) нашего шлюза.Нажимаем Add… В поле «Service is running on» – указы-ваем «Firewall». В поле «Service» выбираем «RDP».

! Теперь добавим доступ к внутреннему веб-серверу, рас-положенному на другом компьютере с IP-адресом192.168.0.5. Снова нажимаем Add… В поле «Service isrunning on» – указываем «IP address – 192.168.0.5». Вполе «Service» выбираем «HTTP».

По аналогии конфигурируем доступ из Интернета к дру-гим внутренним службам.

Шаг 7 предоставляет возможность организовать общийдоступ для клиентов локальной сети наружу при помощитехнологии NAT. Соглашаемся с предложением мастера(галочка «Enable NAT»).

Если мы согласны с указанными настройками, то на 8-мшаге нажимаем кнопку «Далее».

Все, первоначальные настройки сделаны!

Настройка базы пользователейТеперь наша задача – создать или импортировать из базыActive Directory учетные записи пользователей. Если домен-ная структура не используется, то всех пользователей при-дется завести вручную. Заведение пользователей вручнуюаналогично описанной ниже процедуре создания шаблонаавтоматически импортируемых пользователей (Define UserTemplate).

Открываем консоль Users and Groups. Сначала созда-дим две основные группы: Admins и Users. В группу Adminsмы включим учетные записи администраторов нашего шлю-за, а в группу Users – обычных пользователей, которыедолжны будут получать доступ в Интернет. Добавляем вгруппу Admins единственного на данный момент пользова-теля нашего брандмауэра – учетную запись, с которой мырегистрируемся для конфигурирования WinRoute, выбира-ем опцию «Full Access to administration» и, при необходимо-сти, все нижеследующие галочки.

Опишем их назначение:! Users can override WWW content rules – разрешает

пользователям доступ к запрещенным в Content Rulesресурсам. Установка этой опции делает доступными всепросматриваемые ресурсы, независимо от явных зап-ретов в правилах.

! Users can unlock URL rules – пользователи могут раз-блокировать запрещенные ссылки. При посещении зап-рещенной ссылки пользователю выдается окно с ука-занием, что посещение данного ресурса запрещено пра-вилами, однако предлагается отменить этот запрет на-жатием на ссылку «Unlock».

! Users can dial RAS connection – пользователи имеют пра-во инициировать соединение через RAS (модемное под-ключение, например).

! Users can connect using VPN – пользователи имеют пра-во инициировать VPN-соединение.

! Users are allowed to use P2P networks – пользователямразрешено пользоваться P2P-сетями (Kazaa, Edonkey ипр.).

Затем открываем консоль Users and Groups, в ней –Users. Переходим на закладку – Authentication Options. Ус-танавливаем опцию «Always require users to be authenticatedwhen accessing web pages». Опция «Automatically logout userswhen they are inactive» задает период в минутах, после ко-торого пользователь, не проявлявший активности, будетотключен от брандмауэра. В этом случае при следующемобращении к веб-ресурсам окно аутентификации появитсявновь. Данная опция позволяет предотвратить использова-ние «чужого» входа в систему для просмотра веб-страниц.То есть, даже если пользователь оставил свой компьютернезаблокированным, через указанное время происходит от-ключение его сеанса доступа в Интернет.

Если мы импортируем учетные записи пользователейиз домена Active Directory, то переходим к закладке ActiveDirectory/NT Domain и устанавливаем опцию Enable ActiveDirectory authentication.

Если же используется домен NT, то устанавливаем га-лочку Enable NT Domain authentication в нижней части зак-ладки.

Page 34: 026 Системный Администратор 01 2005

32

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

Задаем имя домена. Далее у нас есть два пути:Нажимаем Import Users Accounts Now и отмечаем гал-

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

Более рациональный способ. Разрешаем автоматичес-кий импорт учетных записей из Active Directory – AutomaticallyImport User Accounts from Active Directory. Указываем имясервера, с которого будет производиться чтение учетныхзаписей, а также специальную учетную запись, единствен-ное предназначение которой – получить доступ Read-Onlyк базе AD. Пользователи будут добавляться в базу WinRouteпо мере их обращения к ресурсам Интернета. То естьWinRoute проверяет, существует ли в домене указаннаяучетная запись и если указанные пользователем при пер-вом входе данные совпадают с данными домена – пользо-ватель автоматически прописывается в базу WinRoute иполучает стандартные настройки. Их создание описанониже.

Нажимаем кнопку Define User Template. Указываем груп-пу пользователей, к которой автоматически будут причис-ляться новые пользователи (в нашем случае – Users). Взакладке Rights оставляем все по умолчанию – No accessto administration и никаких Additional Rights (либо указыва-ем те, которые необходимы. Описание дополнительных правприведено выше). В закладке Quota задаем лимит трафи-ка по умолчанию. Есть возможность задать два типа огра-ничений – на суточный трафик, и на суммарный месячный.Причем оба параметра могут существовать одновремен-но. То есть даже если пользователю задан месячный ли-мит на 100 Мб, можно указать, что за день он не имеет пра-ва использовать более 4 Мб. Тогда вы гарантированно из-бавляетесь от проблем, связанных с использованием все-го месячного лимита за один день и последующего обива-ния вашего порога с криками: «Интернет нужен мне по ра-боте! Немедленно верните Интернет!». Здесь же можно ука-зать, на какой именно трафик устанавливается лимит – вхо-дящий, исходящий или суммарный. Чаще всего оплачива-ется входящий трафик, хотя бывают и другие тарифы. Уточ-

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

Generate Alert Message Only – пользователь получит со-общение о превышении персонального лимита, но не ли-шится доступа в Интернет.

Do not allow the user to open new connection – запрещаетпользователю создавать новые соединения, однако те, ко-торые в данный момент активны, продолжат свое существо-вание. Например, если пользователь закачивает большойфайл и его лимит оказывается превышен на середине про-цесса закачки – WinRoute все равно позволит скачать этотфайл, а затем запретит доступ.

Kill all users connections immediately – наиболее полез-ная и долгожданная для многих администраторов опция.При превышении персонального лимита все соединенияпользователя отключаются. В отличие от предыдущего пун-кта, даже если пользователь закачивает большой файл, придостижении лимита все его соединения отключаются. Сле-дует помнить, что небольшая погрешность все-таки суще-ствует, так как счетчики не обновляются мгновенно. То естьв зависимости от скорости соединения пользователь все-таки немного превысит допустимый трафик (при высокойскорости величина превышения может колебаться до 1 Мб).

В закладке Content Rules можно принудительно запре-щать или разрешать использование различных скриптов,таких как ActiveX, Java-Script и пр.

Настройка клиентовНастройка клиентов крайне проста. В свойствах сетевогоподключения по локальной сети указываем шлюз по умол-чанию (Default Gateway) – внутренний адрес созданногонами сервера общего доступа. В качестве DNS-серверауказываем либо внутренний DNS-сервер (при наличии до-мена Active Directory), либо тот же внутренний адрес наше-го шлюза.

Все! Принципиально новое неоспоримое преимуществонового продукта от Kerio в том, что можно забыть про ука-зание прокси-сервера в свойствах приложений. При поступ-лении запроса от клиента WinRoute 6 сам определяет еготип (браузер, FTP и т. д.) и обрабатывает соответствующимобразом. Больше не нужно заботиться о том, чтобы клиен-ты использовали прокси-сервер для просмотра веб-страниц,для контроля расхода интернет-трафика. Kerio WinRouteFirewall 6 принудительно подсчитает трафик.

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

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

Page 35: 026 Системный Администратор 01 2005

33№1, январь 2005

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

На этом минимальная настройка для полноценной ра-боты закончена. Далее будут описаны продвинутые концеп-ции: использование фильтра Cobion, ручная настройкаTraffic Policy и пр. Акцентирую ваше внимание, что настрой-ку Traffic Policy вручную рекомендуется проводить толькоесли вы в совершенстве знаете механизмы обмена в IP-сетях. В противном случае рискуете подвергнуть локаль-ную сеть атакам злоумышленников, а также предоставитьпользователям полный неконтролируемый доступ к вне-шним ресурсам.

Настройка фильтров HTTP, FTP и CobionПереходим в консоль Content Filtering. Выбираем HTTP.Рассмотрим доступные закладки в порядке их использова-ния:

URL Rules: Правила фильтрации контента по вхожде-нию значений в URL ресурса. По умолчанию (и для приме-ра) здесь уже созданы несколько правил. Разрешающие –для Windows Update и Kerio Update. А также запрещающие:для фильтрации рекламы и трафика по категориям в филь-тре Cobion. Kerio умеет подменять баннеры своими соб-ственными изображениями, чтобы форматирование стра-ницы не рушилось. Можно либо выводить «пустое место»,либо перенаправлять запрос на другой ресурс. Комплекс-ное использование и тонкая настройка этих фильтров ус-пешно решают проблему запрета доступа к огромному ко-личеству нежелательных ресурсов. Использование фильт-ров Cobion позволяет ограничивать доступ к ресурсам нена основе маски URL, а по простому смысловому вхожде-нию. Рассмотрим настройку фильтров на конкретном при-мере, поясняя неоднозначные действия. Итак:

Закладка URL Rules: Оставляем правила WindowsUpdate и Kerio Update как есть. Устанавливаем галку направиле «Remove Advertisement and banners», открываемправило двойным щелчком мыши. Можно переименоватьправило так, как удобно, а также настроить особенностиего применения.

If user accessing the URL is – здесь можно выбрать рас-пространение правила на всех пользователей, либо указатьпринадлежность пользователя к группе.

And URL matches criteria – задает категорию ресурсов,на которые распространяется правило. Можно указать мас-

ку, с которой начинается ссылка, выбрать группу адресов,указать на поиск в рейтинге фильтра Cobion, а также ука-зать, что необходимо производить данное действие надресурсами, которые не имеют DNS-имени, а адресуютсяпростым указанием IP-адреса. Наиболее удобные и рацио-нальные способы – это задание групп адресов, а также ис-пользование фильтра Cobion. Группе может соответство-вать много разных критериев, которые рассматриваются попринципу «OR» (логическое ИЛИ), а смысловые фильтрыCobion вообще отличаются интеллектуальным механизмоманализа запрашиваемого контента.

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

Закладка Advanced: здесь можно задать дополнитель-ные критерии правила:

Valid at time interval – задает интервал времени, в тече-ние которого действует правило.

Valid for IP address group – задает группу IP-адресов, накоторую будет распространяться это правило.

Используя эти параметры, можно гибко настраивать пра-вила фильтрации. Например, задав группу IP-адресов итребуемый интервал действия правила, можно запретитьпосещать указанные категории ресурсов в рабочее времядля группы компьютеров. Например, создавая правило с«URL begin with *» и указывая рабочий временной интер-вал, мы запретим указанной группе пользоваться доступомв Интернет в рабочее время. Или наоборот – во внерабо-чее. Все зависит от корпоративной политики предприятия.

В Denial Options задается выводимое сообщение, кото-рое появляется при совпадении условий запроса и прави-ла. Можно перенаправлять такие запросы на заданный URL.

В закладке Content Rules задаются правила фильтра-ции, описанные выше, в разделе создания пользовательс-ких шаблонов (Define User Template).

Настроим правило с использованием Cobion-фильтра.Оно уже прописано по умолчанию в HTTP-Policy – «Denysites rated in Cobion categories». По умолчанию фильтры вCobion отключены. Подключим необходимые вручную. От-крываем правило и проверяем, что данный трафик запре-щен (Deny access to Web site), а в URL matches criteria уста-новлен переключатель: «Is rated by Cobion Content Ratingsystem». Затем нажимаем справа кнопку «Select Rating» игалочками отмечаем категории, которые необходимо зап-ретить. Каждая категория обладает определенным «весом»,который суммируется и, исходя из него, принимается ре-шение о разрешении/запрете объектов. В правом нижнемуглу можно настроить «суммарный вес» объектов, при ко-торых запрос к сайту будет отклонен. После этого любаяпопытка посетить сайт, запрещенный с точки зрения CobionRating, окончится выдачей запрещающей страницы с моти-вацией этого запрета. То есть пользователь не просто по-лучает отказ сервера, а видит сообщение о том, что дан-ный ресурс входит в запрещенную категорию, с указаниемее названия.

Закладка Content Rules задает правила фильтрацииHTML-объектов для всего трафика.

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

Page 36: 026 Системный Администратор 01 2005

34

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

оправдывает включение кэширования, особенно если за-дан большой «срок жизни» объектов (TTL). Например, нетсмысла кэшировать содержимое сообщений форумов илиновостных агентств. Кэширование можно настроить либона обработку всех запросов без исключения (режимTransparent proxy), либо только тех, что исходят от программс явными установками параметров прокси-сервера.

Параметр HTTP protocol TTL – срок хранения объектов вкэше до их обновления с оригинальных сайтов. При помощикнопки URL Specific Settings можно задавать исключения дляресурсов по маске. Например, если HTTP protocol TTL уста-новлен в «1», а в URL Specific Settings добавить URL: *forum*и выставить TTL=0, то ресурсы, содержащие в любом местеURL вхождение «forum», кэшироваться не будут.

В Cache Options задаются параметры кэширования дан-ных. Опишем их назначение:

Continue Aborted Download – продолжает закачку объек-тов, даже если пользователь ее отменил. Не рекомендует-ся устанавливать эту опцию, так как потребляемый трафикувеличится непомерно.

Keep aborted file in cache – сохраняет в кэше частичнозакачанные файлы. Рекомендуется установить. Так как приповторном обращении частичный файл будет взят из кэша.

Cache responses «302 Redirect» – сохраняет в кэше пе-ренаправления запросов.

Use server supplied Time-to-Live – использует параметрTTL, передаваемый целевым сервером. Можно активиро-вать эту опцию, однако это решение спорно, так как некор-ректно настроенный администратором ресурса параметрTTL может задать объекту слишком большой срок жизни вкэше. Соответственно, пользователи при обращении к ре-сурсу получат устаревшую информацию.

Ignore server Cache-Control directive – игнорирует пара-метр TTL, передаваемый запрашиваемым сервером.

Always validate files in cache – проверяет обновлениефайла на исходном сервере при каждом запросе, незави-симо от TTL. Наверное, самый оптимальный параметр на-стройки, так как минимизирует риск выдачи клиенту уста-ревшей информации из кэша.

На закладке Proxy Server включается непрозрачный про-кси-сервер, который и указывается явно в интернет-прило-жениях. В принципе, если без него все работает – указы-вать приложениям работу через него не требуется. Этопринципиальное отличие от предыдущего продукта (KerioWinRoute Pro 4) оказалось очень приятным нововведениемдля администраторов. В URL Groups задаются группы ад-ресов, которые потом можно использовать при созданииправил фильтрации.

Forbidden Words – набор правил для смыслового-филь-тра, который также используется для фильтрации контента(описано выше). Он анализирует информацию подобно по-исковой системе. То есть рассматривается не только самассылка, но и ее содержание. В этом и есть главное отличиесмыслового фильтра от обычных URL-Access-Rules. Спра-ва внизу задается лимит «суммарного веса» наличия на зап-рашиваемой странице запрещенных слов. Изменяя это зна-чение, а также значения каждого слова, можно добитьсяоптимальной работы фильтра. Для удобства слова можнообъединять в группы. Каждому запрещенному слову необ-

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

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

Помимо этого WinRoute 6 имеет встроенный «CobionOrange Filter». Включить его можно через cледующую кон-соль «Configuration →→→→→ Advanced Options →→→→→ Cobion Settings».

Система оценки содержания Cobion – часть системыCobion, интегрированная в WinRoute. Она позволяетWinRoute оценивать содержание веб-страниц по категори-ям. Фильтр Cobion использует динамическую международ-ную базу данных, которая включает URL и классификациюинтернет-ресурсов. Каждый раз, когда пользователь пыта-ется получить доступ к веб-странице, WinRoute посылаетзапрос оценки этой страницы. Согласно классификациистраницы пользователю будет разрешен или запрещен до-ступ к странице. Для ускорения работы данные, которыебыли уже оценены, кэшируются и используются в течениезаданного сервером периода.

На практике совокупность трех фильтров (URL, ForbiddenWords и Cobion) зарекомендовала себя с лучшей стороны.Процент корректного определения запрещенных ресурсовочень велик. Однако, как и любая подобная система, онануждается в тонкой настройке в процессе эксплуатации. Дляэтого существуют многочисленные настройки, описанныевыше, а также Cobion White List – список ресурсов, которыене требуется оценивать при помощи запросов к базе Cobion.

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

Отдельного внимания заслуживает раздел Antivirus. Вдистрибутив встроен антивирусный продукт McAffee для ска-нирования всего трафика, проходящего через WinRoute 6.Здесь задается периодичность проверки обновлений (ре-комендую выставить 1 час). Помимо проходящего HTTP- иFTP-трафика есть возможность сканировать SMTP- и POP3-трафик, отрезая зараженные вложения и (при необходимо-сти) добавляя в тему письма модифицируемое сообщение.Кроме встроенного McAffee, имеется возможность подклю-чать внешние антивирусы (из списка).

В настройках антивируса имеется возможность опове-щать пользователя по e-mail о том, что он пытался скачатьинфицированный объект, перенаправлять зараженныеписьма администратору, сохранять инфицированные объек-ты в карантине, а также добавлять в тему письма сигналь-ные строки. Однако оповещение по e-mail (в отличие от pop-up-сообщений) не является удобным и актуальным, поэто-му проще просто блокировать объект. К сожалению, воз-можность посылать пользователю мгновенные всплываю-щие сообщения об обнаружении вируса в его трафике от-сутствует.

Kerio WinRoute Firewall – очень мощное и многофункци-ональное средство для защиты и организации общего дос-тупа в Интернет. Описанные возможности составляют лишьполовину его функциональности. Система имеет прекрас-ную встроенную систему помощи (на английском языке),которая поможет получить ответы на многие вопросы, свя-занные с конфигурированием продукта.

Page 37: 026 Системный Администратор 01 2005

35№1, январь 2005

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

ДЕНИС БАТРАНКОВЧто такое снапшотТе, кто знаком с системами архивирования в базах данных,знают, что такое снапшот. Snapshot с английского перево-дится как снимок. Здесь используется термин из фотогра-фии, поскольку действие этой технологии аналогично сним-ку фотоаппарата. По сути снапшот – это зафиксированнаямгновенно в определенный момент времени копия файло-вой системы, какого бы большого размера она ни была. Со-здав такой снапшот, можно заняться архивированием этойогромной «фотографии» на различные внешние носители:магнитную ленту, CD- или DVD-диски. Вся прелесть в том,что, во-первых, все создается мгновенно, во-вторых, самафайловая система продолжает изменяться, а вот ее снап-шот (снимок) – нет и, в-третьих, тут нет заблокированныхфайлов. И действительно, идея неплоха: уже не нужно пол-ностью останавливать базу данных, чтобы выполнить ее ар-хивацию. Перед созданием образа базы данных со снапшо-та нужно лишь притормозить все файловые операции и ски-нуть буферы из памяти на диск так, чтобы не было опера-ций, «сфотографированных» посередине выполнения. Дляэтого XP предоставляет сервис VSS, основанный на COM.

Производители могут использовать различные терми-ны для обозначения снапшотов: срез, теневая копия, вир-туальный образ, но общая идея их работы от этого не ме-няется. Мне нравится понятие снимок. В операционной си-стеме Windows (версии NT, 2000, XP, 2003) эта технологияреализована специальными драйверами снапшотов от раз-личных производителей. Microsoft начал поддерживать этутехнологию в Windows XP и 2003 в виде сервиса VolumeShadow Copy Service (VSS).

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

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

На мой взгляд, лучше всех реализованы снапшоты уфирмы Storagecraft (http://www.storagecraft.com/products/vsnap.html), поскольку их технология в виде теневой копиидиска не требует дополнительного места на других дисках,как у Microsoft, – вся нужная драйверу информация сохра-няется в свободные сектора этого же диска. Кроме того,только у них я встретил режим ColdSnap, который позволя-ет сделать снимок сразу на этапе загрузки операционнойсистемы – в момент монтирования файловой системы. Тоесть образ файловой системы (и в том числе системноготома) можно делать так, как это делает Symantec Ghost призагрузке с дискеты или загрузочного CD-ROM.

Нестандартное использование снапшотов

В программе ShadowUser от компании ShadowStor (http://www.shadowstor.com/products.html) тоже используется идеяснапшотов. Здесь появилась возможность смонтироватьфайловую систему не на реальном диске, а на снапшоте.Этот режим называется ShadowMode. Теоретически снапшо-ты предназначены только для чтения, но здесь оригинальновоплощена идея записи на снапшот. Над образом файло-вой системы (который сохраняется на жестком диске неиз-менным) при загрузке устанавливается фильтр файловой

ЗАЩИТА ФАЙЛОВОЙ СИСТЕМЫ ПРИ ПОМОЩИНЕСТАНДАРТНОГО ИСПОЛЬЗОВАНИЯ СНАПШОТОВВ ПРОГРАММЕ ShadowUser

Page 38: 026 Системный Администратор 01 2005

36

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

системы. Грубо говоря, в режиме ShadowMode этот фильтрэмулирует новую файловую систему, которая на самом делене меняет ничего в образе файловой системы на диске, апросто запоминает изменения, которые делают пользовате-ли, программы и другие сервисы ОС. То есть эту новую фай-ловую систему можно сравнить опять же с фотографией, накоторой вы можете пририсовать всем усы, но в реальностиусов у них не появится. Все изменения пишутся в незанятыесектора, не затрагивая реальную файловую систему. И всеэти изменения будут потеряны, как только вы перегрузитекомпьютер. Можете даже выдернуть питание из компьюте-ра – ничего c настоящей файловой системой не случится,поскольку ее никто не меняет. Драйвер работает так неза-метно, что не оставляет своих следов нигде – ни в MBR, ни втаблице разделов, ни во внутренних структурах FAT, FAT32или NTFS. С точки зрения драйвера снапшотов в режимеShadowMode дисковое пространство делится на три части:область, занятая файловой системой (таблицы, директории,файлы), область, свободная для записи, и из неё выделяет-ся область, занятая драйвером, в которой хранится инфор-мация об измененных секторах. Операционная система ипользователь ничего не знают об этой области и рассматри-вают две последние области как свободное место. В случаеесли в процессе работы драйвер займет всё свободное про-странство на диске, то возникнет ошибка записи – писать-тонекуда. Тут помогает только перезагрузка.

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

Кроме того, при помощи обычной перезагрузки можноизбавиться от накопленного за время работы мусора: cookies,файлов истории explorer, spyware, который так и норовит про-писаться в домашнюю страничку explorer. Можно даже тес-тировать другие продукты в этом режиме, чтобы в случаенеудачи перезагрузить компьютер и получить очищенную отнового продукта файловую систему.

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

Типичные ситуации, когда необходим режим ShadowMode:! Любое интернет-кафе может успешно использовать эту

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

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

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

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

! Сервера, где важно время восстановления после краха.Например, время на восстановление сервера после ха-керской атаки, в результате чего было изменено содер-жимое сайта, равно времени одной перезагрузки! Есливеб-сервер при этом записывает различные данные вбазу данных, в которой информация должна постояннопополняться, то можно исключить из ShadowMode дирек-торию, где лежат сами данные – чтобы они были всегдаактуальны в случае восстановления всего остального.Нужно заметить, что вы должны обдуманно исключатьдиректории из ShadowMode, поскольку хакеру ничего непомешает воспользоваться этой «дыркой». Для работыс серверами предназначен другой продукт: ShadowServer.

В продукте ShadowUser учтено, что пользователь долженхранить где-то свои документы, которые ему не хотелось быпотерять после перезагрузки. Чтобы избежать этого, вы мо-жете добавить некоторые папки в список так называемыхисключаемых директорий, и все файлы и содержимое этихдиректорий будут сохраняться во время работы не на снап-шоте, а на реальном диске. Исключать рекомендуется пап-ку, где хранится ваша почта и рабочие документы. Крометого, можно указать имена исключаемых файлов при помо-щи маски. Например, укажите *.doc, и все ваши документыWord будут попадать прямо на диск, минуя снапшот. К сожа-лению, в этом случае на диск будут записаны, в том числе

Page 39: 026 Системный Администратор 01 2005

37№1, январь 2005

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

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

Если в процессе работы в режиме ShadowMode пользо-ватель обнаруживает, что ему нужно сохранить данные, аон забыл указать какую-то директорию для исключения изснапшота, то есть несколько способов сохранить их. Во-пер-вых, можно, кликнув на нужной папке правой кнопкой и выб-рав пункт Commit, переписать данные этой папки со снап-шота на реальный диск. Во-вторых, в момент перезагрузкиможно скинуть на реальный диск все измененные данные –для этого нужно выбрать опцию Full System Save. Эта опера-ция требует времени, но это лучше, чем потерять работу,сделанную за день. Администратор может запретить пользо-вателю эту операцию, установив пароль.

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

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

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

Становится легче обслуживать Windows: достаточноодин раз и навсегда все установить, настроить и включитьShadowMode. Можно на этот случай воспользоваться услу-гами стороннего администратора. К сожалению, это не за-щищает от уязвимостей, которые до сих пор находят (и, ве-роятно, будут находить) в Windows, поэтому обновлять опе-рационную систему периодически придется. Но даже еслиимеющиеся уязвимости будут как-то использованы зло-умышленником, то ему сложно будет установить и затемвоспользоваться программой удаленного управления, сниф-фером или трояном на уязвимой рабочей станции, посколь-ку все это будет жить до следующей перезагрузки. Дажеесли вирус сможет разрушить файловую систему, то этотакже вылечится перезагрузкой. На мой взгляд, фраза насайте www.shadowstor.com о том, что «ShadowUser полно-стью избавляет от новых вирусов», не совсем точна. Дей-ствительно, раньше не было утилиты, которая бы моглаудалить любой новый вирус, который еще неизвестен ан-тивирусу. Программа ShadowUser в силу своей природыделает это обычной перезагрузкой компьютера. Но суще-ствует другая опасность, что во время сессии ShadowModeзараженный компьютер может являться сам источникомвируса или компьютерного червя. Уже были случаи, когдакомпьютер, зараженный компьютерным червем, сканиро-вал соседние компьютеры и заражал их по сети без учас-тия пользователя, пользуясь ошибками переполнения бу-фера сетевых служб. Так делали в свое время черви Sasser,Kibuv и Lovesan, пользуясь ошибками в LSASS и DCOM RPCWindows. В результате, перезагружая по очереди несколь-ко зараженных в сети компьютеров, даже защищенныхShadowMode, мы просто будем перекидывать червя с од-ного компьютера на другой, а полного лечения не добьем-ся, пока не выключим все компьютеры. Таким образом,ShadowUser лишь очередная преграда на пути новых виру-сов, но не последняя. К сожалению, антивирусы тоже пло-хо сдерживают вирусные эпидемии, поскольку антивирус-ные компании как правило выпускают обновленные базысигнатур новых вирусов уже после начала эпидемии.

Хочется заметить также, что не совсем верна фраза:«Вся информация пропадает после перезагрузки». Для про-двинутого пользователя не очень сложно посмотреть, чтонаходится в свободных секторах, не занятых файловой си-стемой. Ведь именно в них хранится та информация, кото-рая была записана в прошлую сессию ShadowMode. Я ду-маю, что в продукт необходимо добавить процедуру запол-нения этих мест нулями после окончания каждой сессииShadowMode. Мне часто бывает интересно узнать, что былоизменено на диске после установки какой-либо програм-мы на компьютер. Пока я пользуюсь утилитой SysinternalsFilemon, которая показывает список файлов, к которым об-ращались процессы. Мне очень не хватает утилиты для изу-чения и сравнения изменений файловой системы «до» и«после». Хотелось бы от программ, реализующих техноло-гию снапшотов, получить такую функциональность. Наде-юсь, эта функция тоже скоро будет реализована.

Page 40: 026 Системный Администратор 01 2005

38

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

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

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

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

Джинн из бутылки, или недостаткирешений из коробкиЗачем изобретать велосипед, когда на рынке представленомножество готовых решений – как программных (ASProtect,FLEX LM, Extreme Protector), так и аппаратных (HASP, Sentinel,Hardlock)? Ответ – стойкость защиты обратно пропорцио-нальна ее распространенности, особенно если она допус-кает универсальный взлом (а все вышеперечисленные ре-шения его допускают). Даже начинающий хакер, скачавшийруководство по борьбе с HASP, за короткое время «отвя-жет» программу, особенно если защита сводится к триви-альному:

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

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

От чего защищатьсяЧаще всего программы защищают от несанкционирован-ного копирования, ограничения времени испытательного ис-пользования, реконструкции оригинального алгоритма и мо-дификации файла на диске и памяти.

Защита от копирования,распространения серийного номераОт несанкционированного копирования в принципе защи-щает привязка к машине (как это сделать с прикладногоуровня, см. в статье [1]). «В принципе» потому, что пользо-вателям очень не нравится, когда ограничивают их свобо-ду, поэтому привязывайтесь только к носителю (лазерномудиску). Нет никакой необходимости выполнять проверку прикаждом запуске программы, требуя наличия диска в при-воде (а сможет ли ваша программа «увидеть» его по сети?),достаточно проверки на этапе инсталляции. Не надо бо-яться, что это ослабит защиту – в любом случае при нали-чии ключевого диска, программа отвязывается элементар-но. Цель «привязки» – противостоять не хакерам, а пользо-вателям. О том, как создать диск, не копируемый копиров-щиками защищенных дисков (Alcohol, CloneCD), можно про-читать в [2] или [3] .

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

КАК ЗАЩИЩАЮТ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕКАК ЗАЩИЩАЮТ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

КРИС КАСПЕРСКИ

…Важно не только научиться. Важно не научиться.Не научиться бывает подчас трудней.

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

Л. Озеров«Выбор и предпочтение»

Потребность в защитных механизмах растет с каждым днем, но качество их реализации падаетвниз стремительным домкратом. Давным-давно сломан HASP, FLEX LM, ASProtect и другиешироко разрекламированные решения, лишний раз подтверждая, что вы не можете доверятьникакому коду, кроме своего собственного, но что делать, если вы и в себе не уверены?Эта статья перечисляет основные ошибки, совершаемые разработчиками, и дает советыпо усилению защиты.

if (IsHaspPresent() != OK) exit();

Page 41: 026 Системный Администратор 01 2005

39№1, январь 2005

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

гистрации (удалять файл с диска категорически недопус-тимо!). Только не возлагайте на этот механизм большихнадежд – пользователь может поставить брандмауэр (прав-да, локальные брандмауэры легко обойти, см. [4]) или жевовсе работать на машине, изолированной от сети.

Защита серийным номером (далее по тексту – s/n) непрепятствует несанкционированному копированию, но есливсе серийные номера различны, можно вычислить пользо-вателя, выложившего свой s/n в сеть. То же самое относит-ся и к парам имя пользователя/код активации (далее по тек-сту – u/r).

Идея: пусть сервер генерирует дистрибутивный файлиндивидуально на основе регистрационных данных, пере-данных пользователям. Тогда его u/r не подойдет к чужимфайлам и весь дистрибутив придется выкладывать в сетьцеликом, что намного проблематичней, и к тому же далеконе каждый пользователь рискнет скачивать двоичный файлиз ненадежных источников.

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

Для предотвращения деинсталляции/повторной инстал-ляции никогда не оставляйте никаких «скрытых» пометок вреестре или файловой системе. Во-первых, «уходя, заме-тай следы», а во-вторых, пользователь может запускатьвашу программу из-под эмулятора ПК (Microsoft Virtual PC,VM Ware), – современные аппаратные мощности это ужепозволяют. Он просто переформатирует виртуальный диск,уничтожая все следы пребывания вашей программы. Со-храняйте количество запусков в обрабатываемых програм-мой документах (естественно, в нетривиальном формате,который непросто подправить вручную). Противостоять это-му очень трудно!

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

Защита от реконструкции алгоритмаЧтобы хакер не смог реконструировать алгоритм защитно-го механизма и слегка «доработать» его напильником (илиже попросту «подсмотреть» правильный пароль), обязатель-но используйте многослойную динамическую шифровку поs/n или u/r. Тогда без s/n, u/r взлом программы станет не-возможным. Не проверяйте CRC s/n! Чтобы убедиться в пра-вильности ввода s/n, проверяйте CRC расшифрованногокода (восстановить исходный s/n по его CRC на достаточ-ных аппаратных мощностях вполне возможно, но CRC рас-шифрованного кода криптоаналитику вообще ни о чем не

говорит!). Игнорируйте первые четыре символа s/n, поса-див на них подложный расшифровщик – обычно хакерыставят точку останова на начало s/n, но не на его середину.Еще лучше, если каждый из нескольких расшифровщиковбудет использовать «свою» часть s/n. Спрашивайте имя,компанию, прочие регистрационные данные, делайте с нимисложные манипуляции, но никак их не используйте – пустьхакер сам разбирается, какие из них актуальные, а какиенет.

Шифровка называется динамической, если ни в какоймомент весь код программы не расшифровывается цели-ком, в противном случае хакер может снять с него дамп, ипривет! Расшифровывайте функцию перед вызовом, а повыходу из нее – зашифровывайте вновь. Используйте не-сколько независимых шифровщиков и перекрытия шифроб-локов, иначе хакер расшифрует программу «руками» са-мого расшифровщика, просто передавая ему номера/ука-затели зашифрованных блоков, и сбросит дамп. Многослов-ная шифровка: делаем на каждом «слое» что-то полезное,затем расшифровываем следующий слой и т. д. Программ-ный код как бы размазывается между слоями, вынуждаяхакера анализировать каждый из них. Если же весь про-граммный код сосредоточен в одном-единственном слое,количество слоев шифровки, «оборачивающих» его, неимеет никакого значения и ничуть не усложняет взлом.

Разбавляйте защитный код (и в особенности код рас-шифровщика) большим количеством мусорных инструк-ций – процедуру размером в 1 Мбайт за разумное времядизассемблировать практически нереально. Мусор легкогенерировать и автоматически (ищите в вирусных журна-лах полиморфные движки) – следите только за тем, чтобывизуально он был неотличим от полезного кода. Еще луч-ший результат дают виртуальные машины, выполняющиеэлементарные логические операции (Сети Петри, СтрелкаПирса, Машина Тьюринга). Даже если хакер напишет де-компилятор, на реконструкцию алгоритма уйдет вся остав-шаяся жизнь (подробнее см. [5]).

При использовании однослойной шифровки размазы-вайте расшифровщик по телу программы, никогда не рас-полагайте весь код расшифровщика в конце модуля – тог-да переход на оригинальную точку входа может быть рас-познан по скачкообразному изменению регистра EIP. Кста-ти, стартовый код, внедряемый компиляторами в програм-му, в большинстве случаев начинается с обращения к FS:[0](регистрация собственного обработчика исключений) – по-чаще обращайтесь к этой ячейке из расшифровщика, непозволяя хакеру быстро определить момент завершениярасшифровки (вызовы должны следовать из разных мест,иначе хакер просто наложит фильтр, благо современныеотладчики это позволяют).

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

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

FILE *f = 0; main(){if (!f) f = fopen(,,)�}

Page 42: 026 Системный Администратор 01 2005

40

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

Защита от модификации на диске и в памятиМодификацию кода предотвращает проверка целостности,причем следует проверять как целостность самого файла,так и целостность дампа в памяти (хакер может модифици-ровать программу на лету, или даже ничего не модифици-ровать, а на время перехватить управление и проэмулиро-вать несколько следующих команд, или же просто изменитьзначение регистра EAX после выполнения команды типаTEST EAX, EAX или подобной ей).

Перехвату управления/эмуляции противостоять практи-чески невозможно, а вот предотвратить модификацию лег-ко – используйте несистематические коды Рида-Соломона(см. [6]). Чтобы взломать программу, хакеру потребуется нетолько разобраться, какие именно байты следует подправитьдля взлома программы, но и рассчитать новые коды Рида-Соломона, а для этого ему придется написать собственныйкодировщик, что не так-то просто (несистематическое коди-рование изменяет все кодируемые байты, в отличие от сис-тематического кодирования, где к программе просто допи-сывается «контрольная сумма», проверка которой можетбыть легко «отломана»). Опять-таки это актуально толькодля многослойной динамической шифровки, в противномслучае хакер просто дождется завершения декодированиякодов Рида-Соломона и снимет беззащитный дамп.

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

Проверяя целостность кода, не забывайте о перемещае-мых элементах. Если программа/динамическая библиотекабудет загружена по адресу, отличному от указанного в PE-заголовке, системный загрузчик автоматически скорректи-рует все ссылки на абсолютные адреса. Либо избавьтесь отперемещаемых элементов (ключ /FIXED линкера MS Link),либо, что лучше, проверяйте только ячейки, не упомянутыев relocation table.

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

От кого защищатьсяАрсенал современных хакеров состоит преимущественноиз: дизассемблера, отладчика, дампера памяти и монито-ра обращений к файлам/реестру. Это очень мощные сред-ства взлома, но с ними все-таки можно справиться.

АнтидизассемблерДизассемблер – в девяти из десяти случаев это IDA Pro. Су-ществует множество приемов, приводящих ее в замешатель-

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

АнтиотладкаЕще ни одному из отладчиков не удалось полностью скрытьсвое присутствие от отлаживаемой программы, и потомуон может быть обнаружен. Чаще всего используется ска-нирование реестра и файловой системы на предмет нали-чия популярных отладчиков, проверка флага трассировки,чтение содержимого отладочных регистров/IDT, замер вре-мени выполнения между соседними командами и т. д. (еслихотите узнать больше, наберите «anti-debug» в Google). Од-нако запрещать пользователю иметь отладчик категоричес-ки недопустимо – защита должна реагировать лишь на ак-тивную отладку. К тому же все эти проверки элементарнообнаруживаются и удаляются. Надежнее трассировать са-мого себя, подцепив на трассировщик процедуру расшиф-ровки или генерировать большое количество исключитель-ных ситуаций, повесив на SEH-обработчики процедуры, де-лающие что-то полезное. Попутно: оставьте в покое soft-ice – в хакерском арсенале есть и альтернативные отлад-чики.

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

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

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

Вместо fopen/fseek/fread используйте файлы, проециру-емые в память, они намного сложнее поддаются монито-рингу, но это уже тема отдельного разговора.

Page 43: 026 Системный Администратор 01 2005

41№1, январь 2005

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

АнтидампДамперам противостоять проще простого. Их много раз-ных, но нет ни одного по-настоящему хорошего. ЗатирайтеPE-заголовок в памяти (но тогда не будут работать функ-ции типа LoadResource) или по крайней мере его часть (отом, какие поля можно затирать, читайте в [7]). Выключай-те временно неиспользуемые страницы функцией VirtualProtect(.,PAGE_NOACCES,), а перед использованием вклю-чайте их вновь. Впрочем, хакер может уронить NT в «синийэкран», получив образ подопытного процесса в свое рас-поряжение. Однако при использовании динамической мно-гослойной шифровки толку от этого образа будет немного.

Как защищатьсяНикогда не давайте хакеру явно понять, что программавзломана! Тогда ему остается найти код, выводящий ру-гательное сообщение (а сделать это очень легко) и по-смотреть, кто его вызвал – вот сердце защитного меха-низма и локализовано. Используйте несколько уровнейзащиты. Первый – защита от ввода неправильного s/n инепредумышленного нарушения целостности программы(вирусы, дисковые сбои и т. д.). Второй – защита от хаке-ров. Обнаружив факт взлома, первый уровень «ругается»явно, и хакер быстро его нейтрализует, после чего в игрувступает второй, время от времени вызывающий зависа-ния программы, делающий из чисел «винегрет», подме-няющий слова при выводе документа на принтер и т. д.При грамотной реализации защиты нейтрализация второгоуровня потребует полного анализа всей программы. Даза это время можно десять таких программ написать! Вто-рой уровень никогда не срабатывает у честных пользова-телей, а только у тех, кто купит «крак». Если же вы бои-тесь, что второй уровень случайно сработает в результа-те ошибки, лучше вообще не беритесь за программиро-вание, это не для вас.

Не показывайте хакеру, каким путем регистрируетсязащита. Это может быть и ключевой файл, и определеннаякомбинация клавиш, и параметр командной строки. Ни вкоем случае не считываете s/n или u/r через WM_GETTEXT/GetWindowText, вместо этого обрабатывайте нажатия оди-ночных клавиш (WM_CHAR, WM_KEYUP/WM_KEYDOWN),прямо из основного потока ввода данных, и тут же их шиф-руйте. Смысл шифровки в том, чтобы вводимая пользова-телем строка нигде не присутствовала в памяти в явномвиде (тогда хакер просто поставит на нее точку останова, имогучий soft-ice перенесет его прямо в самый центр защит-ного механизма). Интеграция с основным потоком вводапредотвращает быстрый взлом программы. Точка остано-ва на WM_XXX ничего не дает, поскольку не позволяетбыстро отличить обычные вводимые данные от s/n.

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

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

Избегайте прямого вызова API-функций. Наверняка ха-кер поставит на них точку останова. Используйте болеепрогрессивные методики – копирование API-функций в своетело, вызов не с первой машинной команды, распознаниеи дезактивация точек останова (подробности в «Запискахмыщъх’а». Солон-Р, 2004 г.).

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

Создайте несколько подложных функций, дав им осмыс-ленные имена типа CheckRegisters, – пусть хакер тратитвремя на их изучение!

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

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

Литература:1. Мешков В. Пакетные команды интерфейса ATAPI. – Жур-

нал «Системный администратор», №9, сентябрь 2004 г.2. Касперски К. Техника защиты CD. БХВ-Петербург, 2004 г.3. Касперски К. Искажение TOC как средство борьбы с

несанкционированным копированием диска. – Журнал«Системный администратор», №9, сентябрь 2003 г.

4. Касперски К. Побег через брандмауэр плюс терминали-зация всей NT. – Журнал «Системный администратор»,№5, май 2004 г.

5. Касперски К. Техника и философия хакерских атак. Со-лон-Р, 2005 г.

6. Касперски К. Коды Рида-Соломона в практических реали-зациях, или информация, воскресшая из пепла III. – Жур-нал «Системный администратор», №11, октябрь 2003 г.

7. Касперски К. Путь воина – внедрение в pe/coff-файлы. –Журнал «Системный администратор», №6, июнь 2004 г.

Page 44: 026 Системный Администратор 01 2005

42

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

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

IPCop (http://www.ipcop.org) представляет собой базиру-ющуюся на GNU/Linux систему, которая может быть исполь-зована для построения брандмауэра как в небольших домаш-них сетях, так и в сетях предприятий. Это его основное на-значение. Но кроме организации межсетевого экрана, инст-рументы, входящие в IPCop, позволяют:! регулировать входящий и исходящий трафик;! наблюдать за событиями, происходящими в сети;! предупреждать о нападении;

! организовать виртуальную частную сеть (Virtual privatenetwork – VPN), которая позволяет безопасно соединятьсети через Интернет;

! назначать компьютерам IP-адреса посредством DHCP;! синхронизировать время, используя NTP;! кэшировать веб-страницы и данные службы DNS;! выдавать информацию об использовании системных ре-

сурсов.

Дополнительно ко всему удобно и просто конфигуриро-вать систему посредством веб-интерфейса. Для работы до-статочно компьютера с процессором 386 с 32 Мб ОЗУ и300 Мб жесткого диска. Это, естественно, минимальные тре-бования. При организации кэширования веб-страниц и ре-гистрации сетевых событий, а также в больших сетях тре-бования к оборудованию возрастают.

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

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

СЕТЕВОЙ ПОЛИЦЕЙСКИЙThe bad packets stop here!

Page 45: 026 Системный Администратор 01 2005

43№1, январь 2005

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

пировании настроек и обновлении системы. Забегая впе-ред, скажу, что имеется скрипт http://www.timbutterfield.com/computer/ipcop/backup, позволяющий производить эту опе-рацию через сеть. Можно обойтись даже без CD-ROM и ус-тановить дистрибутив, используя http. IPCop может быть ус-тановлен и на Compact Flash, в руководстве по установкеесть упоминания по этому поводу. Ядром поддерживаютсянекоторые PCMCIA-, SCSI- и USB-устройства, список про-тестированого оборудования можно найти в «IPCopHardware Compatibility List». Кроме того, начиная с версии1.4.0, кроме Intel-архитектуры, поддерживаются и Аlpha-про-цессоры. Помимо основного сайта дополнительную инфор-мацию об IPCop можно получить и на других сайтах – http://www.ipcops.net, http://sourceforge.net/projects/ipcop.

Установка IPCopНесмотря на такие большие возможности, дистрибутив по-лучился довольно компактным, чуть меньше 40 Мб. Передустановкой разработчики настоятельно рекомендуют почи-тать инструкцию по установке, которую можно найти какна сайте проекта, так и в установочном iso-образе, полу-ченном с сайта. Весь процесс не должен занять больше10-15 минут времени. Но главное, помните, что все данныена используемом жестком диске будут уничтожены, т.к. про-грамма установки автоматически создает разделы. Дляудобства работы предусмотрено использование четырехсетевых устройств:! Red – опасное интернет-соединение.

! Green – безопасная внутренняя сеть.! Orange – DMZ (De-Militarized Zone) для серверов, кото-

рые должны быть доступны из Интернета.! Blue – беспроводная полудоверенная сеть (до версии 1.3.0

wireless-сети выводились либо в Green-, либо в Orange-зоны).

Процесс установки происходит в графической среде спонятными подсказками и минимальным участием пользо-вателя. Единственное, что в списке из более 20 языков, дос-тупных при установке, нет русского, может, это кому-то по-кажется неудобным, уже после установки можно выбрать рус-ский. А так выбираем источник установки, далее программапредупреждает об уничтожении данных на жестком диске,после чего создаются разделы с файловой системой, копи-руются данные, и если есть сохраненная на дискете конфи-гурация, то можно восстановить настройки. Следующимшагом настраиваются сетевая «Green-карта», клавиатурнаяраскладка, часовой пояс, имя компьютера в сети, парамет-ры ISDN, использование DHCP на Green-интерфейсе, видсетевой конфигурации (например, green + orange + red) инастраиваются остальные сетевые устройства, устанавли-ваются пароли для пользователей root и admin, после чегосистема перезагружается. Теперь все дальнейшие настрой-ки производятся, используя SSH (в версии 1.4.1 вместо 22порта почему-то используется 222) или через веб-интерфейс.

Для удобства администрирования системы при помощикомандной строки предусмотрена программа /usr/local/sbin/

Page 46: 026 Системный Администратор 01 2005

44

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

setup, которая поможет малоопытному пользователю не за-путаться в неизвестных командах. Запустив ее, при помо-щи меню можно выполнить большую часть необходимыхопераций: изменить раскладку клавиатуры, имя узла и до-мена, пароли пользователей, сетевые настройки. Если в ва-шем распоряжении только компьютеры под управлениемWindows, в составе которых нет необходимых утилит дляудаленного доступа по SSH, в таком случае можно восполь-зоваться свободными утилитами вроде PuTTY (http://www.chiark.greenend.org.uk/~sgtatham/putty) или WinSCP(http://winscp.sourceforge.net/eng/). Какую из них использо-вать – дело вкуса, мне больше нравится WinSCP, к тому жеон доступен и в виде плагина к FAR.

Набрав на другом компьютере из внутренней сети встроке браузера:

при этом вызов будет перенаправлен на защищенное соеди-нение https://Green _address:445 (его также можно использо-вать). Далее регистрируемся как пользователь admin и по-лучаем возможность настроить все необходимые парамет-ры посредством веб-интерфейса. Для удобства восприятияв System – GUI Setting можно выбрать русский язык интер-фейса (примечание: после этого программа /usr/local/sbin/setup откажется работать, ссылаясь на недопустимый языксистемы). Пользователю доступны семь вкладок («Систе-ма», «Состояние», «Сеть», «Службы», «Файервол», «ВЧС»

и «Логи») с подпунктами в каждой. Так, в меню «Система»можно скачать обновления нажатием одной кнопки, изме-нить пароли, настроить доступ по SSH, сохранить настрой-ки на дискету, выключить маршрутизатор и ознакомитьсяс создателями. В меню «Состояние» – получить данные играфики о работе системы (запущенные сервисы и загру-женные модули, состояние памяти и заполнение дисковыхразделов и пр.), сети (в том числе таблицы маршрутизациии трассировка связи по IPTables). В подпунктах вкладки«Сеть» указываются параметры модемного соединения(только для RED). В меню «Службы» выбираются парамет-ры и запускаются: прокси-сервер Squid и DNS-сервера,DHCP-сервер для Green-интерфейса, параметры предпоч-тительных Network Time Server, выставить приоритеты сер-висов, включить использование NIDS Snort для тех сете-вых интерфейсов, где хотите контролировать происходя-щее. В этом же пункте можно занести данные об IP-адре-сах и именах известных узлов в файл /etc/hosts, для тогочтобы лишний раз не обращаться к DNS-серверам. Еслинеобходимо запретить доступ к некоторым сайтам, то са-мым простым решением будет занести в этот же файл при-близительно такую конструкцию, вставив нужное имя (спи-сок некоторых «ненужных» сайтов можно найти по адресуhttp://ssmedia.com/utilities/hosts).

Во вкладке «Файервол» всего два пункта. В одном из

http://Green _address:81/

0.0.0.0 www. Site_1.com0.0.0.0 www. Site_2.org

Page 47: 026 Системный Администратор 01 2005

45№1, январь 2005

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

Уважаемые читатели!

Продолжается подписка на журнална I-полугодие 2005 года.

Если вы не успели подписатьсяна все шесть выпусков следующего полугодия,вы сможете приобрести недостающие номера

через интернет-магазины

Доставка почтой в любую точку России.

них выставляются параметры перенаправления портов, вовтором задаются правила iptables для внешнего сетевогоинтерфейса (по умолчанию очень строгие). В «ВЧС» в удоб-ной и понятной форме можно указать параметры VPN-со-единения OpenSWAN, для чего необходимо просто запол-нить пункты, указав IP-адреса, вид соединения (Host-to-Net,Net-to-Net) и выбрать/создать сертификат. И наконец, вовкладке «Логи» получить доступ к журналам приложений,при этом возможен просмотр событий по дням, месяцам иэкспорт. Разобраться с настройкой системы при помощивышеуказанных меню, думаю, особого труда не составит.Если что, на сайте имеются подробные руководства (на ан-глийском языке) по администрированию IPCop и настрой-ке VPN.

Расширение возможностей IPCopКак бы там ни было, но несмотря на довольно неплохие воз-можности этого дистрибутива, через некоторое время адми-нистратору, скорее всего, захочется их расширить. В прин-ципе админ с опытом работы в UNIX-системах сам способендобавить необходимые компоненты, но IPCop ориентированименно на легкость в использовании, в том числе и на нео-пытного пользователя. В расширении возможностей систе-мы может помочь документ «IPCop Addons» (http://ipcop.org/cgi-bin/twiki/view/IPCop/IPCopAddons), в котором даны ссыл-ки и краткие описания всех проектов и скриптов, так илииначе связанных с добавлением функциональности этому ди-стрибутиву.

Первый проект, на который удалось выйти (Unofficial)IPCop Firewall Addon Server (http://firewalladdons.sourceforge.net/index.html), располагает рядом инструментов, по-зволяющих существенно нарастить функциональностьIPCop, в основном между Red- и Green-интерфейсами. Приэтом работать с предлагаемыми расширениями под силу иновичку, имеющему некоторые навыки удаленного адми-нистрирования. Пакеты рассортированы по девяти группам(Proxy Servers, Entertainment, VPN, Servers, Utilities, Logging,Modems/NICS, Miscellanous, Language PAKS). Из необходи-мого хочется отметить наличие контекстного фильтра Cop+,построенного на основе Dansguardian с автоматическойзакачкой «черных списков» (есть еще SquidGuard, но ондолго не обновлялся). Далее MOD BlockOutTraffic позволя-ет блокировать исходящий трафик для Blue-интерфейса, ру-ководствуясь прописанными IP- и MAC-адресами, а ещеNmap и IPTraf, без которых тяжелее организовать нормаль-ное администрирование сети, для улучшения безопаснос-ти подойдет DSLogcheck и Tripwire. И еще много различныхMOD, в том числе такие как редактор Joe и MidnightCommander. Все пакеты, имеющие префикс GUI в назва-нии, будут доступны после установки через веб-интерфейс,CLI только из консоли. При установке следует также обра-щать внимание на версии Addon-сервера и IPCop, для ко-торого был написан MOD, хотя, возможно, некоторые ути-литы удастся заставить работать и с другой версией. С MODуправляться очень просто и легко. Первым делом скачива-ем сам Аddon-сервер, на момент написания статьи это былаверсия 2.2, т.е. пакет addons-2.2-CLI-b2.tar.gz. Переносимэтот пакет при помощи SSH или дискетой, затем распако-вываем и устанавливаем.

Теперь если посмотреть на веб-браузер, то обнаружит-ся еще одна вкладка – ADDONS, являющаяся менеджеромустановленных MOD, плюс отсюда же можно закачать наIPCop необходимые MOD. Сами же MOD устанавливаютсяаналогично серверу, после чего в соответствующих вклад-ках появится дополнительный подпункт. Как создать свойMOD, довольно подробно описано в документе «How to writeyour own MOD».

Из других полезных, на мой взгляд, утилит расширениястоит обратить также внимание на linetest (http://alquanto.de/goodies/linetest), который позволяет автоматически пере-ключаться на резервное соединение в случае пропаданияосновного канала. Если же просто нужно перезапустить со-единение, то в «IPCop Addons» приведены примеры скрип-тов. Большое количество различных скриптов расширения,в том числе для подсчета трафика, вывода различных ди-аграмм, дополнения для squid, найдете по адресуwww.zpdee.net/~joecat. Для проверки входящей почты напредмет наличия вирусов и спама используйте комплектCopfilter (http://www.madlener.tk), включающий в себя такиеприложения, как spamassassin, clamscan и пр. В общем,можно существенно повысить функциональность системы.

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

# tar vxzf addons-2.2-CLI-b2.tar.gz -C /# cd /addons# ./setup �u èëè ./setup �i

Page 48: 026 Системный Администратор 01 2005

46

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

В первой части статьи мы говорили о том, как защищатьсервисы с помощью программы stunnel. SSL-шифрованиеданных выполняется посредством OpenSSL. Как обычно,все, о чем шла речь, работало под управлением FreeBSD4.10. Чтобы проверить, как эта конструкция будет жить напятой ветке, я перенес тестовое окружение на FreeBSD 5.3.Так что теперь мы будем работать на этой платформе. Про-цедура установки и настройки практически ничем не отли-чается от того, что было описано в первой части статьи,если, конечно, следовать официально рекомендованномупути и ставить все из портов.

Продолжим рассмотрение новых способов примененияstunnel. На предложение шифровать http-трафик с помо-щью stunnel большинство читателей, cкорее всего, посмот-рит на меня с некоторой долей удивления во взгляде, а коекто, возможно, даже покрутит пальцем у виска. А ведь оничастично правы. Зачем использовать внешнюю утилиту,

если для этой задачи у нас есть отлично работающий Apacheи mod_ssl? Но все же не Apache единым жив администра-тор. Во многих организациях используется Samba. Для об-легчения жизни вместе с ней поставляется программаSWAT, которая позволяет управлять демонами, принтера-ми, правами и учетными записями пользователей с помо-щью веб-интерфейса. Беда в том, что в качестве веб-сер-вера, отображающего интерфейс управления, использует-ся не Apache, а собственная разработка. С точки зренияэкономии ресурсов такое решение вполне оправданно, ведьApache даже в самом обглоданном состоянии все равнобудет содержать в себе больше возможностей, чем нам не-обходимо для выполнения задачи. На первый взгляд всеочень хорошо, но, к сожалению, реализация веб-сервераSWAT не поддерживает никакого шифрования. А это зна-чит, что пароли, имена, явки, адреса конспиративных квар-тир и прочие секреты передаются по сети с помощью стан-

ЗАЩИТА СЕТЕВЫХ СЕРВИСОВС ПОМОЩЬЮ stunnelЧАСТЬ 2

ЗАЩИТА СЕТЕВЫХ СЕРВИСОВС ПОМОЩЬЮ stunnelЧАСТЬ 2

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

Page 49: 026 Системный Администратор 01 2005

47№1, январь 2005

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

дартного HTTP. Переносить интерфейс на Apache лениво,да и трудозатраты себя не оправдают, а взять на себя мис-сию переписывать SWAT для поддержки SSL рискнет тожене каждый. Невооруженным глазом видно, что в нашем по-ложении применение stunnel – это как раз то, что докторпрописал.

Сразу после инсталляции SWAT вписываем директивывызова в /etc/services следующим образом:

Ну а в /etc/inetd.conf будет такая строка:

Это значит, что SWAT принимает входящие соединенияна порт 901. Из этой точки мы можем пойти несколькимипутями. Повесить stunnel на порт 902 и соответственно нанем принимать SSL-соединения. Затем расшифровыватьданные и отдавать их на порт 901.

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

Для приема соединений на порту 901 и передачи рас-шифрованных данных на порт 901 нужно дописать в кон-фигурационный файл /usr/local/etc/stunnel/stunnel.conf воттакие строки:

Второй способ состоит в том, чтобы прикрепить swat кпорту 901 на локальной петле 127.0.0.1, а stunnel на порт901 внешних интерфейсов. Примеры методики, которой

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

Третий способ выглядит оригинальнее. Вешаем stunnelна порт 901 и при появлении входящих соединений само-стоятельно, то есть без помощи inetd, запускаем SWAT.

С воплощением в жизнь этого способа могут возник-нуть проблемы. Во-первых, потому что мы работаем отимени пользователя stunnel, а значит, и SWAT будет запу-щен с такими же правами. Это можно обойти с помощьюsudo. А вот вторая неувязка немного сложнее: после запус-ка сервер stunnel уходит в chroot и значит не сможет рабо-тать с файлами, находящимися за пределами /var/tmp/stunnel/. Это можно будет победить переназначением chrootдля stunnel в директорию, где живет Samba.

На этом можно завершить рассмотрение приемов об-ращения с stunnel, который работает в качестве одиночно-го демона и общается только с SSL-клиентами.

Теперь хотелось бы продемонстрировать методику ра-боты для случая, когда ни клиент, ни сервер не умеют ра-ботать с SSL. В качестве примера будут выбраны серверMySQL, работающий под управлением FreeBSD, и стандар-тный консольный клиент MySQL под управлением Linux.Впрочем, клиент необязательно должен быть консольным,в его качестве может выступать любая программа, умею-щая дружить с сервером MySQL через сеть. Схема взаимо-действия будет выглядеть примерно так (см. рис. 1).

На рабочей станции MySQL-клиент общается с клиен-том stunnel, ждушим входящих соединений на порту127.0.0.1:3307. Stunnel-клиент шифрует полученные данныеи отдает их через сеть демону stunnel, работающему на сер-вере баз данных. Тот, в свою очередь, расшифровываетпакеты и передает их MySQL-серверу. Обратная цепочкаработает с точностью до наоборот.

swat 901/tcp# Samba web configuration tool

swat stream tcp nowait/400 root ↵↵↵↵↵/usr/local/sbin/swat swat

[swats]accept = 902connect = 901

[swats]accept = 901exec = /usr/local/bin/swatexecargs = swat

Ðèñóíîê 1

Page 50: 026 Системный Администратор 01 2005

48

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

Для простоты восприятия материала вместо созданиянового SSL-сертификата будем использовать тот, что со-здали в первой статье. Сетевой адрес сервера базы дан-ных 10.10.21.29, а рабочая станция соответственно имеетадрес 10.10.21.75.

Как я уже говорил, рабочая станция у нас функциони-рует под ALT Linux. К сожалению, в официальном репози-тарии пакетов Sysyphus хранится stunnel весьма просро-ченной версии. К тому же в личной переписке человек,ответственный за сборку пакета, упомянул, что не плани-рует обновлять его в ближайшее время. Поэтому придет-ся проводить самостоятельную компиляцию из исходни-ков. Берем пакет с официального сайта http://stunnel.org,распаковываем, настраиваем и собираем. Всем желаю-щим подправить установки по умолчанию предлагаетсявоспользоваться ключами команды configure, благо их до-статочно много.

Создаем пользователя, от имени которого будет рабо-тать stunnel.

И, конечно же, проверяем, что из этого вышло.

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

Затем копируем с сервера в папку клиента /usr/local/etc/stunnel/certs/ сертификат и ключ.

Создаем файл /usr/local/etc/stunnel/mysql-client.conf сле-дующего содержания:

# mysql> use mysq;

> INSERT INTO user VALUES ('localhost.unreal.net','root','Rw8304MH',

'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','' ,'','',

0,0,0);

> flush privileges;

> quit;

А на сервере соответственно создаем /usr/local/etc/stunnel/mysql-client.conf и вписываем в него вот это:

Запускаем stunnel с обеих сторон:

Не забываем с помощью:

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

На рабочей станции пытаемся соединиться с MySQL-сервером. И, скорее всего, получаем ошибку.

Дело в том, что демон stunnel после расшифровки от-дает данные серверу MySQL от имени сетевого интерфей-са 127.0.0.1. Соответственно, MySQL считает, что мы при-соединяемся к нему с localhost. К сожалению, под FreeBSDизбавиться от этого никак нельзя. Для Linux выход из ситу-ации есть, но о нем мы поговорим в следующей статье. Длятого чтобы как-то обойти эту неприятность, добавьте пользо-вателя [email protected] в таблицу users и не забудь-те обновить текущие привилегии.

После этого соединение клиента MySQL с сервером дол-жно пройти как по маслу.

В принципе работа stunnel под Linux почти ничем не от-личается от работы под FreeBSD. Единственная загвоздкабудет в том, что вместо inetd придется использовать xinetd.Думаю, что читатель, работающий с Linux, без труда смо-жет самостоятельно разобраться с этими мелкими несход-ствами.

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

# tar zxvf stunnel-4.05.tar.gz# cd stunnel-4.05# ./configure# make all# make install

# adduser stunnel

# id stunneluid=502(stunnel) gid=503(stunnel) groups=503(stunnel)

# mkdir /var/tmp/stunnel# mkdir /usr/local/etc/stunnel/certs/

# chown stunnel:stunnel /var/tmp/stunnel ↵↵↵↵↵/usr/local/etc/stunnel/certs/

# chmod �R 700 /var/tmp/stunnel ↵↵↵↵↵/usr/local/etc/stunnel/certs/

cert = /usr/local/etc/stunnel/certs/mailserver.certkey = /usr/local/etc/stunnel/certs/mailserver.keychroot = /var/tmp/stunnel/pid = /stunnel.pidsetuid = stunnelsetgid = stunneldebug = 7output = /var/log/stunnel.logclient = yes[mysqls]accept = 127.0.0.1:3307connect = 10.10.21.29:3307

cert = /usr/local/etc/stunnel/certs/mailserver.certkey = /usr/local/etc/stunnel/certs/mailserver.keychroot = /var/tmp/stunnelpid = /stunnel.pidsetuid = stunnelsetgid = stunneldebug = 7output = /var/log/stunnel.log[mysqls]accept = 10.10.21.29:3307connect = 3306

# stunnel /usr/local/etc/stunnel/mysql-client.conf# stunnel /usr/local/etc/stunnel/mysql-server.conf

netstat �na | grep LISTEN

# mysql -h 127.0.0.1 -P 3307 -u root -pERROR 1130: Host 'localhost.unreal.net' is not allowed to connect

to this MySQL server

Page 51: 026 Системный Администратор 01 2005

bugtraq

49№1, январь 2005

Удаленный отказв обслуживании в OpenBSDПрограмма: OpenBSD 3.5, 3.6.Опасность: Высокая.Описание: Уязвимость обнаружена в реализации TCP-сте-ка в OpenBSD. Удаленный атакующий может послать сис-теме пакеты со специально сформированным значением вTCP timestamp option и вызвать панику системы.URL производителя: http://www.openbsd.org.Решение: Установите патчи: ftp://ftp.openbsd.org/pub/OpenBSD/patches/3.5/common/027_rtt.patch и ftp://ftp.open-bsd.org/pub/OpenBSD/patches/3.6/common/010_rtt.patch.

Переполнение буферав WebAgent websql CGI-приложениив MySQL MaxDBПрограмма: MySQL MaxDB WebAgent 7.5.00.18.Опасность: Высокая.Описание: Уязвимость позволяет удаленному пользовате-лю вызвать переполнение буфера и выполнить произволь-ный код с правами SYSTEM.

Уязвимость существует из-за ошибки при проверке дан-ных в websql CGI-приложении. Значение параметра пароляконвертируется в юникод и копируется в стек. Если строкабудет длиннее 264 символов, то сохраненные значения дляeip и ebp будут перезаписаны. Удачная эксплуатация этойуязвимости позволит атакующему выполнить произвольныйкод на уязвимой системе с привилегиями SYSTEM.URL производителя: http://www.mysql.com/products/maxdb.Решение: Ограничьте доступ к административным ресур-сам системы с помощью межсетевого экрана.

SQL-инъекция в модуле SGalleryдля PHP-NukeПрограмма: SGallery 1.01.Опасность: Высокая.Описание: Уязвимость обнаружена в модуле SGallery дляPHP-Nuke. Удаленный пользователь может выполнить про-извольные SQL-команды, получить инсталляционный путьк директории и в некоторых случаях выполнить произволь-ные команды на уязвимой системе.

В зависимости от настроек удаленный пользователь мо-жет выполнить произвольный php-сценарий на сервере спривилегиями веб-сервера.

Сценарий imageview.php некорректно обрабатываетданные в переменных idalbum и idimage. Удаленный атаку-ющий может с помощью специально сформированного URLвыполнить произвольные SQL-команды на текущей базеданных. Пример:

Удаленный пользователь может узнать путь к устано-вочной директории на сервере, если переменные idalbum иidimage не определены.URL производителя: http://www.ser.acmetelecom.ru.Решение: Способов устранения уязвимости не существу-ет в настоящее время.

http://[target]/nuke75/modules/Sgallery/ ↵↵↵↵↵imageview.php?idimage=-99/**/UNION/

**/SELECT /**/pwd/**/FROM/**/nuke_authors/**/WHERE/**/ ↵↵↵↵↵radminsuper=1

Целочисленное переполнениев Kazaa в протоколе Sig2DatПрограмма: Kazaa lite k++.Опасность: Высокая.Описание: Обнаружено две уязвимости в менеджере пи-ринговых сетей Kazaa.

Целочисленное переполнение в протоколе Sig2Dat по-зволяет вызвать отказ в обслуживании или выполнить про-извольный код на уязвимой системе. Уязвимость существу-ет в параметре Length в байтах. Удаленный пользовательможет передать значение, превышающее 999 999 999 и выз-вать переполнение целочисленных. Удачная эксплуатацияуязвимости позволит выполнить произвольный код на це-левой системе. Пример:

Уязвимость в параметре File позволяет выйти за преде-лы директории и создать файл в любом месте раздела, ис-пользуя символы перехода между каталогами (‘../’). Приме-ры:

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

<A HREF="sig2dat://%7CFile:dev-catz5%28.bin%7CLength:999999999999999999999999999%20Bytes,364489KB%7CUUHash:=DEfm3HmvILkNcbY7j5NGa%2BD11CQ=%7C/">CLICKHERE</A>

<A HREF="sig2dat://%7CFile:../../../../../../Docume~1/AllUsers/Start Menu/Programs/Startup/cool.bat%7CLength:373236528%20Bytes,364489KB%7CUUHash:=DEfm3HmvILkNcbY7j5NGa%2BD11CQ=%7C/">CLICK HERE</A><script>var ifor (i=1;i<10000;i++){mylocation="<iframe src='sig2dat://% CFile:../../../../../../Docume~1/All Users /StartMenu/Programs/Startup/cool"+i+".bat %7CLength:373236528%20Bytes, 364489KB%7CUUHash:=DEfm3HmvILkNcbY7j5NGa%2BD11CQ=%7C/'></iframe>";document.write(mylocation);}</script>

Выполнение произвольного кодапри обработке .psd-файловв ImageMagickПрограмма: ImageMagick версии до 6.1.8-8.Опасность: Высокая.Описание: Уязвимость существует в файле coders/psd.c приобработке .psd-файлов. Удаленный пользователь может со-здать специально сформированный документ в форматеPhotoshop, который при обработке ImageMagick вызоветпереполнение буфера и позволит злоумышленнику выпол-нить произвольный код на системе.URL производителя: http://www.imagemagick.org.Решение: Установите обновление: ht tp://www.imagemagick.org/www/download.html.

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

Page 52: 026 Системный Администратор 01 2005

50

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

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

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

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

ВСЕ В ОДНОМ, ИЛИ HogwashКАК ПРИМЕР Gateway-IDSВСЕ В ОДНОМ, ИЛИ HogwashКАК ПРИМЕР Gateway-IDS

Page 53: 026 Системный Администратор 01 2005

51№1, январь 2005

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

вать защищенный канал через Интернет. Каждое из этихсредств имеет свои особенности, эффективность и, конеч-но же, недостатки.

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

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

Задачу можно существенно упростить, если опуститьсяс сетевого уровня вниз на один уровень (т.е. уровень дан-ных) и начать работать непосредственно с кадрами. Вне-дрение такого устройства не потребует изменения сетевыхконфигураций и может быть произведено в любой частисети. Кадры после анализа будут просто передаваться надругой интерфейс. И главное, поскольку устройство не име-ет своего IP-адреса, то хотя его работа, в общем, и будетзаметна нападающему по косвенным признакам (например,неудаче при проведении атаки) из-за того, что фильтрациюкак таковую скрыть просто невозможно, но идентифициро-вать устройство будет довольно тяжело (оно незаметно дляtraceroute).

Кстати, работа связки «брандмауэр + мост», позволяю-щей обходиться в такой системе без IP-адресов, была опи-сана еще в конце прошлого века в документе «LinuxBridge+Firewall Mini-HOWTO» (в русском переводе «Мини-HOWTO: Совместное использование мостов и Firewall вLinux»). Вручную возиться со всем этим сейчас не придет-

ся, так как данная идея получила дальнейшее развитие впроектах вроде ebtables (http://ebtables.sourceforge.net), ко-торые представляют уже готовое решение, позволяющеебез особых проблем собрать подобную систему. На дан-ный момент код ebtables официально включен в ядро 2.6,на указанном выше сайте можно найти патчи к еще попу-лярной в народе версии 2.4. Кроме фильтрации кадров,ebtables позволяет изменять Ethernet MAC-адреса внутрикадров и параметры маршрутизации, также никто не зап-рещает использовать ebtables совместно с iptables/ip6tables/arptables, хотя особого смысла в этом лично я не вижу. Каки в iptables, в ebtables имеется возможность контроля засоответствием MAC- и IP-адресов. Правила также имеютсхожий синтаксис, поэтому освоить работу с ebtables весь-ма просто.

Конечно, есть и различия, исходящие из особенностейработы этих утилит. Так, кадр Ethernet будет отброшен рань-ше, чем IP-датаграмма. Кроме того, ebtables берет за осно-ву МАС-адрес, который сравнивается с IP-адресом, а iptablesпоступает с точностью наоборот. Но не ebtables герой этойстатьи. Итак, если возможна фильтрация Ethernet-кадров,то почему бы не использовать и систему обнаружения атакна втором уровне? Преимущества данного подхода очевид-ны. Кроме невозможности идентификации, такая системасможет не только определять угрозы, но и тут же останав-ливать их, отбрасывая кадры, изменяя настройки таблицмаршрутизации или фильтров брандмауэра.

Проект HogwashТакой подход показался настолько логичным и простым ре-шением проблемы, что когда в 1996 году Джейсон Ларсон(Jason Larson) и Джед Хейл (Jed Haile) столкнулись с необ-ходимостью защиты веб-сервера, был сразу же написан на-чальный вариант системы, позволяющей отфильтровыватьопасные пакеты использовавшиеся для вторжения. Первоевремя проект носил название Scrub и был простым фильт-ром пакетов, работающим на втором уровне. Постепеннобыл разработан язык описания атак и движок детектиро-вания, который в 1999 году был заменен кодом Snort (раз-витие последнего к тому времени шло полным ходом). Приэтом проект изменил свое название на SnortScrub, кото-рое, впрочем, тоже долго не продержалось, и по маркетин-говым соображениям было изменено на Hogwash. В про-цессе добавления новых функциональных возможностейдвижок Snort оказался малопригодным для массовой об-работки кадров. Поэтому в текущей и пока еще не дове-денной до финала версии 0.5 происходит возрождение ста-рого движка «H2». Совместимость со Snort будет сохране-на и вынесена в отдельный слой. На данном этапе Hogwashпозволяет анализировать информацию и регистрироватьбольшие потоки данных в режиме реального времени. Си-стема, построенная с применением Hogwash, способна ре-агировать на сканирование, некоторые атаки, направлен-ные на переполнение буфера, определение типа ОС (OS

ebtables -A FORWARD -p IPv4 --ip-src 192.168.1.4 ↵↵↵↵↵-s ! 00:11:22:33:44:55 -j DROP

iptables -A FORWARD -s 192.168.1.4 -m mac ↵↵↵↵↵--mac-source ! :11:22:33:44:55 -j DROP

Page 54: 026 Системный Администратор 01 2005

52

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

fingerprinting) и другие. Hogwash относится к классу GatewayIntrusion Detection System и может быть настроен для рабо-ты в трех режимах:! Классическая система обнаружения атак (IDS).! Встроенная система предотвращения атак (IPS) –

Scrubber.! Контроллер обманных (HoneyPot) систем.

В первом случае Hogwash работает подобно любой дру-гой системе обнаружения атак (рис. 1), контролируя прохо-дящий трафик на одном или нескольких интерфейсах и ге-нерируя предупреждения. При этом система способна раз-рывать подозрительные TCP-соединения и отбрасывать па-кеты. Необходимо отметить, что сборка всего потока не про-изводится. Если в принятом пакете имеется частичное со-впадение с правилом, то будет принята его следующаячасть, и если правило совпадет полностью, то пакеты, при-надлежащие данному сеансу, будут отброшены. Для обна-ружения сканирования Hogwash отслеживает каждый но-вый сеанс связи (tcp, udp, icmp) в течение 60 секунд, и еслиобнаруживается один и тот же источник, то все пакеты, при-ходящие с него, отбрасываются. Аналогичная реакция име-ет место и при обращении с одного источника к 20 уни-кальным портам и 5 адресам.

При применении в качестве IPS, Hogwash активно про-сматривает трафик (рис. 2). При этом он способен не толь-ко отбрасывать пакеты и изменять параметры маршрути-зации, но и переписывать их содержимое (т.н. процедура«промывки» пакетов), убирая опасные данные. Конечно,ничто не мешает использовать его и как обычный пакет-ный фильтр. В этом режиме поддерживается одновремен-ное наблюдение за 16 интерфейсами. Подключение систе-мы в данном режиме к сети полностью прозрачно, так какона не имеет собственного IP-адреса. Это практически иде-альное (и к тому же труднообнаруживаемое) устройство дляостановки всех известных атак.

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

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

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

Установка HogwashКак уже упоминалось ранее, работа над версией 0.5 еще неполностью закончена, так как в ней произведена первая по-пытка возрождения движка «H2» вместо Snort. Однако сто-ит отметить, что она является полностью работоспособной иготовой к применению. Учитывая более адаптированный дляработы на втором уровне движок и некоторые изменения внастройках и размещении файлов, я рекомендую остановитьсвой выбор именно на ней, так как в дальнейшем будет лег-че осваивать новые версии и обновлять продукт. Также сто-ит отметить, что в версии 0.4 используется Snort 1.8.6, име-ющий проблемы с безопасностью (http://www.iss.net/issEn/delivery/xforce/alertdetail.jsp?oid=21951), заключающиеся ввозможности выполнения произвольного кода, который мо-жет быть специально помещен в захваченных сетевых паке-тах. С другой стороны, для версии 0.4 можно использоватьготовые правила Snort, а для 0.5 пока придется пользовать-ся имеющимся набором правил и при необходимости состав-лять их самому. Кроме того, новый движок имеет только 17параметров для формирования правил, и их явно недоста-точно, особенно для работы с UDP-пакетами.

Hogwash на сегодняшний день из операционных системподдерживает только Linux, не требует наличия в ядре сте-ка IP, так что при желании его можно отключить, что толькоповысит общую защищенность. Также желательно наличиеMySQL, куда будут заноситься правила и «отловленные»данные, поскольку при большом их количестве скорость об-работки существенно возрастет. Исходный код Hogwashсвободно доступен и распространяется по лицензии GPL.Сайт проекта http://hogwash.sourceforge.net.

Установка пакета происходит не просто, а очень просто:

На данный момент сценарий конфигурации не имеет ни-каких дополнительных параметров настройки.

# tar xzvf devel-0.5-latest.tar.gz# cd devel-0.5

# ./configure

Ðèñóíîê 1

Ðèñóíîê 2

echo "0" > /proc/sys/net/ipv4/ip_forward

Ðèñóíîê 3

Page 55: 026 Системный Администратор 01 2005

53№1, январь 2005

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

Размещение файлов по каталогам производится вруч-ную. Для начала скопируем в положенное место основнойисполняемый файл.

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

Для примера возможных настроек пакет содержит дваконфигурационных файла stock.config и test.config.

Теперь можно открыть файл stock.config и познакомить-ся с настройками.

Для удобства работы все настройки разбиты по груп-пам: system, interface, IPList, action, module, routing. Имеет-ся также экспериментальная секция mangling.

Раздел «system» содержит общие параметры, которыеможно оставить без изменения.

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

В поле Type можно выставить следующие значения:linux_raw (Linux), obsd_bpf (OpenBSD), osx_bpf (MacOS X),solaris_dlpi (Solaris, пока еще не полностью работоспособ-ный вариант) и tcpdump. Для type= tcpdump в interface вме-

сто NAME указывается имя файла, куда будут записывать-ся результаты, и значение Threads в большинстве случаевдолжно равняться 0. Необязательное поле Role содержитподсказку для Hogwash, необходимую при возможном кон-фликте IP- и МАС-адресов, и может понадобиться для ра-боты с обманными системами. Возможны четыре значения:Internal (внутренний интерфейс), External (внешний интер-фейс), Normal (обычный, т.е. без возможного конфликта) иHoney (сюда подключена обманная система и возможнаподмена адресов, чтобы нападающий ничего не заподоз-рил). Пример настройки секции:

Списки IPLists необходимы для использования в прави-лах и других частях файла конфигурации. Для удобстваможно задать любое число списков. Имя также может бытьлюбым, но чтобы было легче ориентироваться, рекоменду-ется выбирать осмысленные названия. Возможно исполь-зование как отдельного адреса, так и списка адресов, в томчисле, и в CIDR-нотации (Classless Internet Domain Routing).0.0.0.0/0 означает «любой адрес».

Пример:

Возможно объединение списков.

В секции action создаются наборы реакций на обнару-жение тех или иных событий, которые затем будут исполь-зованы в правилах. Всего возможно создание 64 наборовреакций. Например:

****************************

Configure script for Hogwash

****************************

Checking OS.................LINUX

Checking for a C compiler.../usr/bin/gcc

Checking endian-ness........LITTLE

Checking for MySQL..........Found

Checking for daemon.........Found

Checking for freopen........Found

Checking for dlopen.........Found

Done.

# make

# cp ./hogwash /usr/sbin/

# mkdir /etc/hogwash# cp -R rules /etc/hogwash/

# cp ./stock.config /etc/hogwash# mkdir /var/log/hogwash

<system>Name=Hogwash SensorID=1001Threads=1# êîëè÷åñòâî ïîòîêîâ, ïðåäíàçíà÷åííûõ äëÿ îáðàáîòêè ïàêåòîâ,# êàê ïðàâèëî, îäèí ïîòîê íà îäèí èíòåðôåéñ (ò.å. Threads=1),# ïðè ðàáîòå íà ìíîãîïðîöåññîðíûõ ñèñòåìàõ èëè â êëàñòåðàõ# çíà÷åíèå ìîæíî óâåëè÷èòü.AlertHeader=%ac %m/%d/%y %h:%min:%s %sip:%sp->%dip:%dp# ýòà íåîáÿçàòåëüíàÿ ñåêöèÿ óêàçûâàåò ôîðìàò çàãîëîâêîâ# ïðåäóïðåæäåíèé, ìîæíî èçìåíèòü íà ëþáîé äðóãîé,# íåîáõîäèìûå äàííûå ïðèâåäåíû â òàáëèöå 1.</system>

<interface NAME>Type=INTERFACE TYPE# è äâå íåîáÿçàòåëüíûõ îïöèè# ïîêà ïîääåðæèâàåòñÿ òîëüêî ýòîò ïðîòîêîë, ïîýòîìó ìîæíî# åãî îïóñòèòüProto= EthernetRole = INTERFACE ROLE</interface>

<interface eth0>Type=linux_rawProto=EthernetRole=Normal</interface>

<IPList WebServers>10.34.10.0/16</list><IPList DNSServers>0.0.0.0/0</list><IPList FTPServers>23.3.14.1010.2.10.3-10.2.10.6</list><IPList HonePotServer>23.3.14.111</list><IPList Green>192.168.100.0/24</list>

<IPList AllServers>WebServersDNSServersFTPServers10.14.10.1</list>

<action default>response=alert console# âûâîä ñîîáùåíèÿ íà êîíñîëüresponse=alert file(/var/log/hogwash/hogwash.alert)# çàïèñü ïðåäóïðåæäàþùåãî ñîîáùåíèÿ â óêàçàííûé ôàéëresponse=dump packet(/var/log/hogwash/packet.log)# çàõâàò ïàêåòà, êîòîðûé ñãåíåðèðîâàë ñîîáùåíèå è çàïèñü â ôàéë</action><action drop>

Page 56: 026 Системный Администратор 01 2005

54

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

Возможны также и другие реакции:! Запись предупреждения в syslog:

! Посылка предупреждения в сетевой или UNIX-сокет:

! Запись предупреждения в базу данных:

! Отправка предупреждения по e-mail:

! Экспериментальная опция, позволяющая отсылать па-кеты, удовлетворяющие определенным правилам, наHoneyPot-систему. В качестве параметров указывают-ся временная задержка и адреса, с которых не должнопроисходить переключение на HoneyPot. При timeout = -1перенаправление на ложный сервер будет производить-ся без задержки.

Режим требует наличия трех сетевых карт.

Плюс ко всему на данный момент имеется недорабо-танная, а потому и не описанная в документации опцияresponse=route sip(<interface>, <sip>,<sip>), позволяющаявнести изменения в таблицу маршрутизации и отослатьисходящие пакеты с определенным IP-адресом в другоеместо, например, в систему-ловушку. Однако очень труднопредставить ситуацию, когда адрес атакующего будет из-вестен заранее. К сожалению, в версии 0.5 исчезла воз-можность «промывки» пакетов, опции replace в списке дей-ствий нет. Объяснений от разработчиков по этому поводуне последовало, возможно, это явление временное и свя-зано с переходом на новый движок, а может быть, разра-ботчики посчитали эту возможность лишней, т.к. для оста-новки вторжения достаточно отбросить пакет или перенап-равить нападающего на обманную систему.

Секция module служит для подключения сторонних мо-дулей, которые производят дополнительные проверки, не-

зависимо от того, в каком режиме сейчас работает Hogwash(IDS, IPS или управление обманными системами). На мо-мент написания статьи в каталоге modules лежало четыреготовых модуля:! ATS и ATS2 от All Traffic Summary Logging, предназначе-

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

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

! Модули WebUnique и DNSUnique позволяют находить ра-нее неизвестные атаки, направленные на эти сервисы,путем сбора данных и их дальнейшего анализа для вне-сения изменений в настройки сервисов или код скрип-тов. Общая идея примерно такова. Большинство «нор-мальных» посетителей сайта будут постоянно и помногураз обращаться к одним и тем же страницам, и толькозлоумышленник с большой вероятностью постараетсякаждый раз загрузить что-либо уникальное. DNSUniqueреализует эту идею в отношении DNS.

Относительно недавно появился еще один простой мо-дуль covert, демонстрирующий некоторые скрытые меха-низмы обнаружения. На сегодняшний день он работаеттолько с протоколом ICMP.

Наконец, рассмотрим секцию routing, включающую ре-жим маршрутизации пакетов. Если этой секции нет, тоHogwash будет работать в режиме IDS. В самом простомслучае, когда требуется маршрутизация, т.е. кадры отправ-ляются только на нужный интерфейс (такая система имеетвозможности Flood Protection), секция выглядит так.

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

response=alert consoleresponse=alert file(/var/log/hogwash/hogwash.alert)response=dump packet(/var/log/hogwash/packet.log)response=drop# îòáðàñûâàíèå ïàêåòà (èãíîðèðóåòñÿ ïðè ðàáîòå â IDS-ðåæèìå)</action><action log>response=alert consoleresponse=alert file(/var/log/hogwash/hogwash.alert)</action>

<routing>MacFilter(eth0, eth1, �)</routing>

response=bns(<timeout>, <GreenList>)

<action honeypot>response=alert consoleresponse=alert file(/var/log/hogwash/hogwash.alert)response=bns(3600, Green)</action>

<module ATS2>filename=(/var/log/hogwash/TEST_%y_%m_%d_%h.ats)</module>

23442543 03/12/2004 19:38:35-19:38:35

192.168.1.1:80<-192.168.1.58:24567 - T 4:4 U 0:0 I 0:0 O 0:0

<module WebUnique>dbase=hogwash5user=hogwashpassword=passwordhost=localhostservers=WebServerslogfile=WebUnique.log</module><module DNSUnique>dbase=hogwash5user=hogwashpassword=passwordhost=localhostservers= DNSServerslogfile= DNSUnique.log</module>

response=alert syslog(facility=LOG_AUTH, ↵↵↵↵↵priority=LOG_INFO, options=LOG_NDELAY|LOG_PID)

response=alert socket(www.logger.com:12345)

response=alert mysql(user=hogwash,dbase=hogwash5, ↵↵↵↵↵host=localhost,port=3306,pass=password, ↵↵↵↵↵logpackets=1)

response=email(host, from, to, subject)

Page 57: 026 Системный Администратор 01 2005

55№1, январь 2005

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

SBridge(eth0, eth1). Опция Broadcast() включает специфи-ческую обработку широковещательных Еthernet-сообщений(в реальной системе ей трудно найти применение). ОпцииSIP(INTERFACE IPLIST) и DIP(INTERFACE IPLIST) схожи.Первая пропускает через указанный интерфейс все паке-ты, у которых IP-адрес источника указан в списке, втораяпропускает только те, у которых IP-адрес назначения име-ется в списке. Использовав в этой секции опциюbns(<InternetIF>, <ProductionIF>, <HoneyIF>, <BlackList>),например, «bns(eth0,eth1,eth2, BlackList)», можно перенап-равлять пакеты, подпадающие под действие response=bns,на HoneyPot-систему. В данном случае BlackList содержитсписок адресов, которые всегда должны перенаправлять-ся в ловушку. Желательно, чтобы HoneyPot имел такие женастройки, что и основная система, но вот IP-адреса у нихдолжны быть обязательно одинаковыми, иначе нападаю-щий заметит подлог и убежит (что тоже в принципе хоро-шо, хотя и не всегда желательно).

Правила обнаружения атак описываются весьма гибко.Например, при обнаружении попытки запуска на одном из веб-серверов команды cmd.exe, правило может выглядеть так.

Или, в случае UNIX-систем:

В правила может быть включена разнообразная инфор-мация, например, IP-адреса, интерфейсы, номера портов,тип протокола верхнего уровня, содержащегося в Еthernet-кадре (IP, ARP и т. д) или IP-датаграмме (TCP, UDP, ICMP,IGMP, PIM, OSPF), содержимое пакетов, код и тип ICMP,сюда же заносятся предупреждающие сообщения, выводи-мые при обнаружении совпадения и требуемая реакция.Сейчас разработчики работают над прямой совместимос-тью с правилами Snort (данная функция будет частью фи-нальной версии Hogwash 0.5).

<rule>ip dst(WebServers)tcp nocase(/bin/sh)message=attempt to execute /bin/shaction= drop</rule><rule>icmp type(8)message=%sip-%dip icmp echo requestaction=log</rule>

Òàáëèöà 1. Âîçìîæíûå äàííûå, âûâîäèìûå â ñîîáùåíèè

На момент написания статьи в базу было занесено 7 358правил, описания которых находились в следующих 7 фай-лах: general.rules, jason.rules, nikto.rules, nimda.rules,stock.rules, test.rules и x11.rules. Основным является файлstock.rules, остальные при необходимости подключаются внем инструкциями вроде <include nikto.rules>. При желанииправила можно занести в MySQL.

Теперь, когда все готово, можно запускать Hogwash.

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

Для автоматического запуска при старте системы луч-ше всего написать простенький скрипт.

Тело сценария:

Изменяем права доступа.

И далее любым приемлемым способом прописываемзапуск hogwash.sh в стартовых скриптах. Например, дляSlackware можно поступить так:

Все, теперь Hogwash будет добросовестно защищатьваши сети.

Hogwash является простым в инсталляции и использо-вании Gateway-IDS. Систему такого типа достаточно тяже-ло обнаружить: утилиты вроде traceroute не замечают ее и,таким образом, риск проведения DOS сводится к миниму-му. Быстрая настройка и небольшое число регулируемыхпараметров делают Hogwash хорошим средством защитысетей. Возможность автоматической отсылки пакетов наложные системы является несомненным достоинством,позволяющим вовремя заметить проблемные участки сети.Вполне возможно, что будущее сетевой безопасности какраз за Hogwash и ему подобными решениями. Как говорит-ся, поживем – увидим.

Ссылки:1. An introduction to gateway intrusion detection systems –

http://www.blackhat.com/presentations/bh-usa-02/bh-us-02-haile-hogwash.ppt

2. Securing an Unpatchable Webserver... HogWash! – http://www.securityfocus.com/infocus/1208

<rule>ip dst(WebServers)tcp dst(80)tcp nocase(cmd.exe)message=%sip:%sip->%dip:%dp cmd.exe attemptaction=default</rule>

# /usr/sbin/hogwash -c stock.conf -r stock.rules &

# mcedit /etc/hogwash/hogwash.sh

#!/bin/bashPATH=/bin:/sbin:/usr/bin:/usr/sbincd /etc/hogwashkillall hogwashecho "0" > /proc/sys/net/ipv4/ip_forwardhogwash -c stock.conf -r stock.rules �d

# chmod 700 /etc/hogwash/hogwash.sh

# echo /etc/hogwash/hogwash.sh >> /etc/init.d/rc.local

Page 58: 026 Системный Администратор 01 2005

56

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

Как было показано в статье «Внутренний веб-сервер» (жур-нал «Системный администратор», №10(23), октябрь 2004 г.),веб-сервер достаточно удобно использовать для быстрогоразвертывания несложных приложений, занимающихся сбо-ром, обработкой и выдачей пользователям тех или иныхданных. Один из немногих недостатков такого подхода, какбыло указано, заключается в том, что не всегда удаетсяраспечатать качественный отчет, который не стыдно былобы представить начальству или отослать по электроннойпочте, не вынуждая получателя заниматься копированием-вставкой тела письма и его предпечатной (или в общемплане – предварительной) обработкой.

Наиболее универсальным путем решения указаннойпроблемы является формирование XML-документа, рабо-тать с которым умеют многие программы. Однако в даннойстатье я хочу рассмотреть другой, менее универсальный,но более удобный для конечного пользователя способ – не-посредственное формирование файла в формате Excel вCGI-сценарии. Дальнейшее изложение предполагает, чтовы знакомы с языком Perl и его применением для CGI-сце-нариев, умеете настраивать веб-сервер, а также имеетепредставление о СУБД PostgreSQL (или какой-нибудь дру-гой). Будет рассматриваться работа под FreeBSD, поэтомупотребуется также знание базовых принципов UNIX-систем,хотя заставить все описанное работать под Windows, ду-маю, особого труда не составит. У пользователей Linux ни-каких проблем возникнуть также не должно.

Для решения поставленной задачи будем использоватьимеющийся в коллекции CPAN (http://cpan.org) Perl-модульSpreadsheet::WriteExcel, установить который во FreeBSDможно также и из коллекции портов (/usr/ports/textproc/p5-Spreadsheet-WriteExcel), что представляется мне более удоб-ным.

На момент написания статьи актуальной была версия2.11. Данная версия позволяет создавать файлы в форматеBIFF8, поддерживающем Unicode. Следовательно, необхо-димо будет все текстовые строки преобразовывать в UTF8.Подробнее об этом будет сказано далее, при рассмотре-нии конкретных примеров. К сожалению, от этой версии мнене удалось добиться правильного отображения имени лис-та, содержащего русские символы. Работа с одной из пре-дыдущих версий 0.43 (несмотря на значительный разрыв

номеров версии, от 2.11 ее отделяет не более года), реали-зующей, по всей видимости, формат BIFF7 и использую-щей стандартную кодировку Windows, позволяющую сохра-нять данные в cp1251, никаких проблем ни с кодировкойданных, ни с кодировкой имени листа не выявила. Но по-скольку Unicode – это, пожалуй, единственное решениепроблем различных кодировок, то на пути к его безраздель-ному господству придется претерпеть некоторые неудоб-ства.

Итак, что позволяет делать модуль WriteExcel? Он пре-доставляет скрипту на языке Perl ряд функций для записиданных в файл Excel. В качестве примера создадим про-стейший xls-документ с помощью следующего сценария:

ПУТЕШЕСТВИЕ ИЗ Perl В ExcelИСПОЛЬЗОВАНИЕ Spreadsheet::WriteExcelДЛЯ ФОРМИРОВАНИЯ ОТЧЕТОВ

СЕРГЕЙ СУПРУНОВ

Ïðèìåð 1#!/usr/bin/perl -w# Spreadsheel::WriteExcel tests# Ñòàíäàðòíûé ìîäóëü äëÿ îñóùåñòâëåíèÿ ïåðåêîäèðîâîêuse Encoding;# Ìîäóëü äëÿ ðàáîòû ñ ôàéëàìè Exceluse Spreadsheet::WriteExcel;# Ïîäàâëåíèå ïðåäóïðåæäåíèé î ìíîãîáàéòíûõ ñèìâîëàõnowarnings �utf8�;# Ôîðìèðóåòñÿ HTTP-çàãîëîâîêprint "Content-Type: text/html\n\n";print '<H3>Spreadsheet::WriteExcel test</H3>';# Ñîçäàåòñÿ xls-ôàéëmy $workbook = Spreadsheet::WriteExcel-> ↵↵↵↵↵

new('../public_html/excel/test.xls');# Ñîçäàåòñÿ «ðàáî÷èé ëèñò» ñ èìåíåì Reportmy $worksheet = $workbook->add_worksheet('Report');# Îáúÿâëÿåòñÿ ôîðìàò ÿ÷ååê, èñïîëüçóåìûé â äàëüíåéøåìmy $tabformat = $workbook->add_format();$tabformat->set_border();# Ïðèìåð âûâîäà äàííûõ áåç ïåðåêîäèðîâêè$worksheet->write(1, 1, 'Ðóññêèé òåêñò ñ ðàìêîé', $tabformat);# Âûâîä ASCII-òåêñòà$worksheet->write(�B3�, 'English text.');# Âûâîä äàííûõ ñ ïåðåêîäèðîâêîé$worksheet->write(3, 1, decode(�koi8-r�, ↵↵↵↵↵

' Ðóññêèé òåêñò ñ ðàìêîé '), $tabformat);# Ññûëêà íà ñôîðìèðîâàííûé ôàéëprint "<A href='/excel/test.xls'>Ðåçóëüòàò</A>";

Page 59: 026 Системный Администратор 01 2005

57№1, январь 2005

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

Обратите внимание на строку Spreadsheet::WriteExcel->new(..), которая создает объект (соответствующий тому, чтов терминах Excel именуется «книгой»), с которым в даль-нейшем будет вестись вся работа. В качестве параметраконструктору new() передается имя создаваемого файла(если файл расположен вне текущего каталога, требуетсяуказать полное имя, включающее абсолютный или относи-тельный путь к файлу).

Данный файл должен существовать и быть доступнымдля записи сценарием либо сценарий должен иметь правана создание файла в указанном каталоге. Поскольку пре-доставлять сценариям право писать в один из каталоговдерева веб-сервера – не самая лучшая идея (так как в слу-чае взлома сервера у злоумышленника будет больше шан-сов «нагадить»), то имеет смысл для этих целей создать спе-циальную папку (например, /var/tmp/excel) или использовать/var/tmp. Хотя, с другой стороны, в этом случае мы не смо-жем создать ссылку на сформированный файл для непос-редственного скачивания, и придется использовать сцена-рий, который будет отдавать файлы пользователю через http,например, такой:

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

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

Еще один путь решения проблемы временных файлов –выдача данных, формируемых модулем Spreadsheet::Write-Excel, непосредственно в стандартный поток вывода вмес-то сохранения на диск. Начало примера 1 в этом случаебудет выглядеть так:

В случае если скрипт, создающий файл, работает какCGI-сценарий и должен возвращать данные с использова-нием протокола HTTP, перед началом формирования вы-ходного потока нужно будет передать браузеру заголовокс указанием mime-типа application/vnd.ms-excel, который по-зволит идентифицировать передаваемые данные именнокак файл в формате Excel. Здесь используется минималь-ный заголовок, более подробный приведен выше, вgetexcel.cgi. Это тоже хороший способ, но из недостатковследует указать на невозможность повторного использо-вания уже сформированного файла. Необходимость в этомвозникает нечасто, но все же возникает (например, еслиданные меняются реже, чем их запрашивают пользовате-ли, то между изменениями данных разумно было бы отда-вать пользователю уже сформированный отчет, а не созда-вать его заново). Обратите внимание, что в этом случаекоманды print (и прочие, осуществляющие вывод в стан-дартный поток) могут использоваться только для форми-рования HTTP-заголовка. Весь остальной вывод (выводданных) должен осуществляться исключительно силами па-кета Spreadsheet::WriteExcel.

Вернемся к нашему примеру 1. Объект, соответствую-щий файлу, у нас уже создан, теперь нужно создать лист(для этого используется метод add_worksheet) и можно при-ступать к записи данных. Для записи используется методлиста write, формат которого может быть одним из следую-щих:

То есть адрес ячейки можно задавать как в формате«A1», так и номерами строки и столбца. Ячейке A1 соот-ветствуют строка 0 и столбец 0.

Необязательный параметр format передает объект, со-здаваемый методом «книги» $workbook->add_format(). Он

Ïðèìåð 2. Ñöåíàðèé getexcel.cgi#!/usr/local/bin/perl -w# getexcel.cgiuse CGI;$root = '/var/tmp/excel';# Ïîëó÷àåì èìÿ ôàéëà èç HTTP-çàïðîñà$cgi = CGI->new();$file = $cgi->param('file');# Âûðåçàåì íåáåçîïàñíûå ñèìâîëû � èìÿ ôàéëà ìîæåò ñîäåðæàòü# òîëüêî öèôðû è áóêâû â íèæíåì ðåãèñòðå.# Ðàñøèðåíèå íå óêàçûâàåòñÿ$file =~ s/[^a-z0-9]//g;$file = "$root/$file.xls";# Îòêðûâàåì ôàéë íà ÷òåíèå, óñòàíàâëèâàåì äâîè÷íûé ðåæèìopen(F, "$file") || &nosuchfile;binmode(F);# Ôîðìèðóåì íóæíûé çàãîëîâîêprint "Content-Disposition: form/data; name=\"$file\"; ↵↵↵↵↵

filename=\"$file\"\n";print "Content-Type: application/vnd.ms-excel; ↵↵↵↵↵

name=\"file.xls\"\n";print "Content-Transfer-Encoding: binary\n\n";# Âûâîäèì ñîäåðæèìîå ôàéëàwhile(<F>) { print;}close(F);

#----------------------------------- subssub nosuchfile { print "Content-Type: text/html\n\n"; print "<H3>Ôàéë '$file' íå íàéäåí.</H3>"; return(-1);}

#!/usr/bin/perl -w# Spreadsheel::WriteExcel testsuse Encode;use Spreadsheet::WriteExcel;nowarnings �utf8�;print "Content-Type: application/vnd.ms-excel\n\n";my $workbook = Spreadsheet::WriteExcel->new('-');. . .

$worksheet->write(cell, text[, format])$worksheet->write(rownum, colnum, text[, format])

Page 60: 026 Системный Администратор 01 2005

58

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

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

Поскольку версия 2.11 модуля WriteExcel подразумева-ет запись данных в формате Unicode, то все текстовые стро-ки требуется преобразовать в формат UTF8. (Чтобы посмот-реть на результат вывода текста без перекодировки, в при-мер 1 добавлена строка, выводящая в одну из ячеек рус-ский текст непосредственно). Для этого я использую стан-дартный модуль Encode, функция которого decode(charset,string) осуществляет преобразование строки string, храня-щейся с использованием кодировки charset, во «внутрен-нее представление Perl» (как сказано в man Encode). В моемслучае «внутренне представление» совпадает с UTF8, по-этому дальнейших преобразований не требуется. Но тот жеman Encode предупреждает, что может быть и по-другому,поэтому в общем случае может потребоваться использо-вать также функцию encode() для получения нужной коди-ровки. Ну и чтобы подавить вывод предупреждений «Widecharacter in print at…», которые формируются при попыткевывода оператором print многобайтных символов, исполь-зуется прагма «no warnings “utf8”».

Еще одно замечание о Spreadsheet::WriteExcel – посколь-ку в самом модуле используется прагма Perl use strict, то дажеесли вы предпочитаете более вольный стиль, переменные,используемые им ($workbook, $worksheet, $tabformat) дол-жны быть объявлены до использования, например, как my.В противном случае модуль выдаст сообщение «Can’t usean undefined value…» (невозможно использовать неопреде-ленное значение), и xls-файл сформирован не будет (точ-нее, сам файл создастся, но будет пустым). Хотя аварий-ного завершения работы сценария в этом случае не проис-ходит.

Для общего представления о модуле Spreadsheet::Write-Excel изложенного, думаю, достаточно. Перейдем к болеесодержательному примеру. Пусть у нас в базе данных естьтаблица с тарифами на услуги доступа в Интернет по тех-нологии ADSL, и требуется предоставить абонентам воз-можность как ознакомиться с ними на html-странице, так изагрузить файл в формате Excel, содержащий эту инфор-мацию. Конечно, тарифы меняются не так часто, и, вероят-но, проще было бы решить поставленную задачу разработ-кой статической страницы и заранее созданным файломExcel. Тем не менее, этот пример хорош как раз своей про-стотой.

Итак, в какой среде нам предстоит работать. База дан-ных PostgreSQL, веб-сервер Apache с поддержкой CGI, Perlс установленным модулем Spreadsheet::WriteExcel. Все этоработает под FreeBSD 5.3.

Таблица тарифов создана такой командой:

Назначения полей следующие:

Для примера заполним таблицу несколькими записями:

Для простого вывода этих данных на html-страницу вседостаточно банально:

Результат тоже вполне обычен (рис. 1, внешний вид оп-ределяется подгружаемой таблицей стилей /__serv__/main.css).

test=> create table trf_adsl (trfname varchar,test(> payment numeric(7,2),test(> traflimit numeric(5),test(> overlimit numeric(5,2),test(> comment varchar);CREATETABLE

Ïðèìåð 3. Ñöåíàðèé showtrf.cgi#!/usr/local/bin/perl -w# showtrf.cgiuse DBI;$dbh = DBI->connect('dbi:Pg:dbname=test', 'serg', '');$hres = $dbh->selectall_hashref('SELECT * ↵↵↵↵↵

FROM trf_adsl', 'traflimit');print <<__ENDHTML__;Content-Type: text/html<LINK rel='stylesheet' type='text/css' href='/_serv_/main.css'><H2>Òàðèôû íà óñëóãè äîñòóïà â Èíòåðíåò ïî ADSL</H2><TABLE border='1'><TR> <TH>Òàðèôíûé ïëàí <TH>Àáîíåíòñêàÿ ïëàòà <TH>Âêëþ÷åííûé òðàôèê <TH>Ñòîèìîñòü<BR>ñâåðõëèìèòíîãî<BR>òðàôèêà <TH>Ïðèìå÷àíèå</TR><TR>__ENDHTML__@sorted = keys %$hres;@sorted = sort(@sorted);foreach $payment (@sorted) {

print "\t<TD>${$$hres{$payment}}{'trfname'}\n";print "\t<TD id='nr'>${$$hres{$payment}}{'payment'}\n";print "\t<TD id='nr'>${$$hres{$payment}}{'traflimit'}\n";print "\t<TD id='nr'>${$$hres{$payment}}{'overlimit'}\n";print "\t<TD>${$$hres{$payment}}{'comment'}\n";print "</TR><TR>\n";

}print "</TR></TABLE>\n";

Ðèñóíîê 1

test=> select * from trf_adsl;

trfname | payment | traflimit | overlimit | comment

--------------------------------+------------+-----------+------------+---------------------------------------

"Свободный" | 0.00 | 0 | 2.30 | Мин. предоплата – 300 руб.

"Сотка" | 200.00 | 100 | 2.15 |

"Школьный" | 250.00 | 120 | 2.05 |

"Студенческий" | 300.00 | 150 | 2.00 | До 1.06.2005

"Корпоративный" | 1200.00 | 750 | 1.55 |

(записей: 5)

Page 61: 026 Системный Администратор 01 2005

59№1, январь 2005

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

Создать файл в формате Excel не намного сложнее. При-веду код сценария полностью, а ниже дам ряд пояснений:

Для тестирования я выбрал сохранение формируемогофайла в папке /excel дерева каталогов веб-сервера (см. путьв тексте примера), для которой установлены соответству-ющие права, позволяющие сценарию создавать в нем фай-лы. Почему на реальных системах так делать не следует,мы уже обсуждали. Имя файла формируется динамическис использованием значения текущего времени (см. пере-менную $fn). Сделано это для того, чтобы на стадии тести-рования не тратить время на борьбу с ретивыми браузера-ми и прокси-серверами, норовящими сэкономить вам тра-фик за счет кэширования, а также чтобы сохранить исто-рию экспериментов.

После создания рабочего листа $ws с помощью методакниги add_format() описываются несколько объектов, кото-рые будут отвечать за форматирование ячеек. Свойстваячеек можно задавать как непосредственно в параметрахadd_format (см. $textfmt и $tabfmt), так и с помощью мето-дов объекта формата после его создания (см. $headfmt).

Заголовок и «шапка» таблицы формируются «вручную»с явным указанием ячеек, куда текст помещается. Методmerge_range() действует аналогично write(), но позволяетобъединить несколько ячеек.

Далее в цикле выполняется выборка из хэша результа-тов запроса к БД, и соответствующие ячейки заполняютсяданными из таблицы trf_adsl. Здесь для метода write() удоб-нее использовать «раздельную адресацию», когда ячейкаопределяется номерами строки и столбца.

Переменная $tmp и вычисления длины нужны для того,чтобы установить ширину столбцов, позволяющую целикомвидеть содержимое ячеек. Вообще проблема вычисленияширины столбца достаточно сложна, чтобы подходить к ней«академически». Я предпочитаю некоторое сочетание ме-тодов «на глазок» и «подогнать». Результат получаетсявполне приемлемым при минимуме затрат сил и времени.А именно, первоначальную ширину столбцов я определяюподбором по ширине заголовков (результат занесен в мас-сив @rowidth). В дальнейшем пользуюсь тем, что в Excelширина столбца задается в символах стандартного шриф-

Ïðèìåð 4. Ñöåíàðèé exceltrf.cgi#!/usr/local/bin/perl -w# exceltrf.cgi# Ïîäêëþ÷åíèå íóæíûõ ìîäóëåéuseDBI;use Encode;use Spreadsheet::WriteExcel;nowarnings �utf8�;# Ôóíêöèÿ ïåðåêîäèðîâêè èç koi8-r â utf8sub koi2utf {

$text = shift;return decode(�koi8-r�, $text);

}# Çàïðîñ ê áàçå äàííûõ$dbh = DBI->connect('dbi:Pg:dbname=test', 'serg', '');$hres = $dbh->selectall_hashref('SELECT * ↵↵↵↵↵

FROM trf_adsl', 'traflimit');# Ñîçäàåì «êíèãó» è ëèñò ñ èìåíåì «ADSL»$fn = 'tr' . time() . '.xls';my $wb = Spreadsheet::WriteExcel-> ↵↵↵↵↵

new('../public_html/excel/' . $fn);my $ws = $wb->add_worksheet(�ADSL');# Çàäàåì àëüáîìíîå ðàñïîëîæåíèå ëèñòà$ws->set_landscape();# Ôîðìàò òåêñòà, èñïîëüçóåìûé äëÿ ôîðìèðîâàíèÿ çàãîëîâêàmy $textfmt = $wb->add_format(font => 'Arial', size => 18, color => 'blue', italic => 1);$textfmt->set_merge();# Ôîðìàò «øàïêè» òàáëèöûmy $headfmt = $wb->add_format();$headfmt->set_bold();$headfmt->set_align('center');$headfmt->set_align('vcenter');$headfmt->set_text_wrap();$headfmt->set_border();$headfmt->set_bottom(6);my $mygray = $wb->set_custom_color(40, '#AAAAAA');$headfmt->set_bg_color($mygray);# Ôîðìàò îñòàëüíûõ ÿ÷ååê òàáëèöûmy $tabfmt = $wb->add_format(num_format => '0.00', ↵↵↵↵↵

border => 1);# Îáúåäèíåíèå ÿ÷ååê A1-E1$ws->merge_range('A1:E1',

koi2utf('Òàðèôû íà óñëóãè äîñòóïà â Èíòåðíåò ïî ADSL'),$textfmt);

# Âûâîä «øàïêè» òàáëèöû$ws->write('A3', koi2utf('Òàðèôíûé ïëàí'), $headfmt);$ws->write('B3', koi2utf('Àáîíåíòñêàÿ ïëàòà'), $headfmt);$ws->write('C3', koi2utf('Âêëþ÷åííûé òðàôèê'), $headfmt);$ws->write('D3', koi2utf('Ñòîèìîñòü ñâåðõëèìèòíîãî ↵↵↵↵↵

òðàôèêà'), $headfmt);$ws->write('E3', koi2utf('Ïðèìå÷àíèå'), $headfmt);# Íà÷àëüíûå çíà÷åíèÿ øèðèíû ñòîëáöîâ@rowidth = (15, 10, 10, 15, 15);# Îñíîâíóþ òàáëèöó âûâîäèì, íà÷èíàÿ ñ 4-é ñòðîêè$row = 3;# Ïîñòðî÷íûé âûâîä òàáëèöû@sorted = keys %$hres;@sorted = sort(@sorted);foreach $payment (@sorted) {

$tmp = ${$$hres{$payment}}{'trfname'};if(length($tmp) > $rowidth[0]) ↵↵↵↵↵

{ $rowidth[0] = length($tmp); }$ws->write($row, 0, koi2utf($tmp), $tabfmt);$tmp = ${$$hres{$payment}}{'payment'};if(length($tmp) > $rowidth[1]) ↵↵↵↵↵⎯⎯⎯⎯⎯ { $rowidth[1] = length($tmp); }$ws->write($row, 1, koi2utf($tmp), $tabfmt);$tmp = ${$$hres{$payment}}{'traflimit'};

if(length($tmp) > $rowidth[2]) ↵↵↵↵↵{ $rowidth[2] = length($tmp); }

$ws->write($row, 2, koi2utf($tmp), $tabfmt);$tmp = ${$$hres{$payment}}{'overlimit'};if(length($tmp) > $rowidth[3]) ↵↵↵↵↵

{ $rowidth[3] = length($tmp); }$ws->write($row, 3, koi2utf($tmp), $tabfmt);$tmp = ${$$hres{$payment}}{'comment'};if(length($tmp) > $rowidth[4]) ↵↵↵↵↵

{ $rowidth[4] = length($tmp); }$ws->write($row, 4, koi2utf($tmp), $tabfmt);$row++;

}# Óñòàíàâëèâàåì óòî÷íåííóþ øèðèíó ñòîëáöîâfor($i = 0; $i < 5; $i++) { $ws->set_column($i, $i, $rowidth[$i] + 3);}# Âûâîäèì ññûëêó, ïî êîòîðîé ìîæíî äîáðàòüñÿ# äî ñôîðìèðîâàííîãî ôàéëàprint <<__ENDHTML__;Content-Type: text/html<A href="/excel/$fn">$fn</A>__ENDHTML__

Page 62: 026 Системный Администратор 01 2005

60

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

та. Поскольку шрифт для основного текста я не меняю, топросто выполняется поиск наибольшей длины строки, ко-торая будет заноситься в столбец, и если она превышаетпервоначальные значения в @rowidth, – производится кор-ректировка. Ну и при установке ширины столбцов (цикл forв конце сценария) еще добавляю 3 символа «про запас».

Результат представлен на рис. 2.Теперь осталось собрать все воедино. Итоговый файл

я приводить не буду – он просто объединяет предыдущиедва (showtrf.cgi и exceltrf.cgi) таким образом, чтобы при об-ращении к странице тарифы выводились на экран, и одно-временно формировался бы файл, ссылка на который бу-дет появляться на этой же странице. Файл с требуемымименем в итоговом варианте лучше создать заранее (мож-но даже пустой, например, командой touch), а с каталога, вкотором он размещен, снять права на запись. Впрочем,различные способы решения проблемы «временных фай-лов» были указаны выше, и окончательный выбирать всеже вам.

Ðèñóíîê 2

Вот, пожалуй, и все, что я хотел сказать в этой статье.Можно было бы подробней пройтись по методам записи вячейки, форматированию, способам указания формата ли-ста и т. д. Однако все это очень детально и понятно описа-но в справочном руководстве man Spreadsheet::WriteExcel(эту же справку можно получить и через perldoc – кому какудобнее), к тому же с массой наглядных примеров, так чтоя уже не смогу написать лучше.

Скажу лишь, что модуль содержит ряд специализиро-ванных методов вывода помимо универсального write (на-пример, write_number, write_string, write_formula и т. д.), ко-торые могут быть использованы для конкретизации типазаносимых в ячейку данных.

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

Список методов изменения формата ячеек также намно-го богаче, чем было показано в статье. В общем, можносказать, что Spreadsheet::WriteExcel позволяет делать прак-тически все, что вы можете сделать в Excel вручную (за ис-ключением разве что макросов).

В заключение замечу, что описанный модуль в паре соSpreadsheet::ParseExcel (который позволяет извлекать дан-ные из xls-файлов) можно использовать и для непосред-ственной обработки файлов Excel, например, чтобы сфор-мировать какой-нибудь годовой отчет на основе ежемесяч-ных. Возможно, это выглядит несколько громоздко, но всеже позволяет сократить объем рутины, которую так илииначе приходится делать.

ИТОГИ КОНКУРСА

В августовском номере журнала за прошлый год редакцией был объявлен конкурс на лучшие статьи, описывающиеуспешный опыт в области системного администрирования. В течение нескольких месяцев в редакцию приходили мате-риалы и предлагались интересные темы. В итоге несколько конкурсных статей опубликованы в октябрьском и ноябрьс-ком номерах журнала – это материалы Романа Гребенникова, Сергея Супрунова, Ивана Коробко и Дениса Батранкова.Всем авторам опубликованных материалов перечислен гонорар за статьи.

Победителем признан Денис Батранков, приславший ста-тью «Поиск троянов вручную» (№10, октябрь 2004 г.) Авто-ру вручается подписка на журнал «Системный админист-ратор» на 2005 год, а также подшивка прошлых номеровжурнала.

Уважаемые читатели!

Конкурс продолжается – присылайте свои материалы, самые интересные будут опубликованы на страницахжурнала. Итоги следующего этапа конкурса будут подведены в июльском номере журнала. Успехов!

Условия участия и подробности смотрите на сайте журнала www.samag.ru в разделе «Конкурс».

68

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

В этой статье вы найдете ответы на следующие вопросы:� Что делать, если вы предполагаете, что на вашем ком-

пьютере с Windows установлена программа-шпион илитроян?

� Как найти троянскую программу или spyware, если вашантивирус или AdWare ее не находит?

Статья для начинающих системных администраторов иопытных пользователей Windows описывает возможные спо-собы поиска троянских программ и также описывает, как ис-пользовать для этого поиска программы и утилиты из стан-дартной поставки Windows 2000, XP и 2003 и программысторонних разработчиков: netstat, msconfig, msinfo32, tlist,Sysinternals TCPView, CurrPorts, WinTasks, Security TaskManager, Starter, Winpatrol, Sysinternals Autoruns, SysinternalsProcessExplorer, MoveOnBoot, Microsoft PortReporter, SystemSafety Monitor.

Если коротко описать процесс поиска программы, вы-полняющей нежелательные действия, то алгоритм обычнотакой:� Обновить базу данных установленного на вашем ком-

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

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

� Просмотреть логи персонального firewall. Если firewallне смог заблокировать несанкционированные соедине-ния трояна в силу своей недостаточной функциональ-ности или неправильной настройки, то есть надежда,что он хотя бы запротоколировал, какие соединениябыли пропущены в Интернет. Если хорошего персональ-ного firewall нет, то хотя бы включите встроенный вWindows XP firewall, который называется ICF (как это сде-лать, описано на http://www.microsoft.com/rus/windowsxp/using/howto/networking/icf.asp). Протоколы встроенногоfirewall можно посмотреть с помощью любого текстово-го редактора, открыв файл C:\WINDOWS\ pfirewall.log.Но лучше использовать более удобные утилиты, ссыл-ки на которые легко найти при помощи Google (напри-мер, набрав в строке поиска «XP firewall logger»).

Первый пункт достаточно понятен и помогает в 80% слу-чаев. За третий пункт нужно браться в самом запущенномслучае и еще лучше со специалистом по компьютерной бе-зопасности (далее КБ). Давайте попробуем выполнить дей-ствия, описанные во втором пункте. Тем более что при вни-мательном выполнении всех операций можно найти и убитьлюбую гадость, засевшую в вашем компьютере.

Возникает вопрос, нужно ли отключаться от Интернета,если мы ищем вирус или троян? Вам понадобятся различ-ные утилиты для поиска трояна (какие конкретно будет опи-сано далее). Если эти утилиты уже есть или на жесткомдиске, или на компакт-диске, или у вас есть возможностьсходить за нужными дисками, или скачать и записать накомпакт-диск нужные программы на другом незараженномкомпьютере, то необходимо отключиться от Сети. Это нуж-но сделать, чтобы предотвратить дальнейшую утечку ин-формации с компьютера. Отключаться нужно даже от ло-кальной сети, например, сети офиса или домашней сети,чтобы не заражать соседние компьютеры.

Однако иногда встречаются особо запущенные случаи,

ДЕНИС БАТРАНКОВ

ПОИСК ТРОЯНОВ ВРУЧНУЮ

конкурсная статьяконкурсная статьяконкурсная статьяконкурсная статьяконкурсная статья

69№10(23), октябрь 2004

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

в которых приходится скачивать нужные программы черезИнтернет. Например, я однажды приехал в гости к родствен-никам в Сибирь, обрадовался наличию компьютера с мо-демным доступом к Интернету, сел за него и, нажав по при-вычке <Ctrl-Alt-Del>, сразу обнаружил трояна в списке про-цессов. Поскольку нужных программ под рукой не было,пришлось лечить вручную. Единственной «защитой» этогокомпьютера с Windows XP был гордо стоящий антивирус сбазами вирусов двухгодичной давности. В Windows дажене был включен ICF.

К сожалению, подавляющее большинство пользовате-лей неопытны и несведущи в вопросах компьютерной бе-зопасности. Компьютеры на платформе Intel и операцион-ная система Windows являются высокотехнологичными про-дуктами. Ведь даже среди тех, кто пользуется общеизвест-ной программой Microsoft Word, не так много людей, ктоизучал его на курсах или хотя бы читал к нему документа-цию. Что тут говорить про образованность в области ком-пьютерной безопасности.

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

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

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

Некоторыми проявлениями троянских программ явля-ются:� несанкционированные соединения c различными хоста-

ми в Интернете;� открытые программами соединения, ожидающие под-

ключения извне;� попытка открыть ненужные для нормальной деятельно-

сти файлы на локальном диске;� добавление себя в списки автозапуска;� маскировка под стандартные системные процессы и раз-

мещение в системной папке Windows.

Находим троянскую программу,которая ждет входящего соединенияОбычно авторы таких программ называют свои програм-мы «программами удаленного управления». Типичной ил-люстрацией этого вида троянских программ является BackOrifice (см. описание http://www.viruslist.com/viruslist.html?id=3957&gloss=8227). Такие программы позволяют делать на

вашем компьютере все что угодно: скачивать файлы, рас-сылать спам, быть прокси-сервером, участвовать в DOS-атаке, быть плацдармом для других атак, естественно, врамках функций, предоставляемых им имеющейся опера-ционной системой. В данном случае мы рассматриваемверсии Windows: 2000 SP4, XP SP1, 2003.

Такие программы открывают TCP-порт на компьютережертвы, устанавливают его в состояние LISTENING и ждут,когда хакер подключится на этот порт. Таким образом, намнужно выявить все процессы, которые открыли TCP-порты икоторые находятся в состоянии LISTENING, и решить, одоб-ряете ли вы это соединение или нет. То же самое можно ска-зать про UDP-порты – за ними тоже надо смотреть, с един-ственным отличием, что у них нет состояний – с этих пор-тов может как приниматься информация, так и отсылаться.С ходу можно сказать, что если у вас обычный компьютер,подключенный к выделенной линии или через модем в Ин-тернет, то в идеале у вас не дожно быть слушающих портов.Даже если приложения или сервисы Windows открыли этипорты, то они должны быть закрыты персональным firewall.

Чтобы выявить программы, которые ожидают (и уста-навливают) соединения в Windows XP и Windows 2003, мож-но, конечно, воспользоваться стандартной утилитой netstatc параметрами -ano. (Параметр -а заставляет netstat пока-зывать все имеющиеся подключения и ожидающие порты,-n преобразует вывод адресов и портов в числовой формат,-o отображает для каждого подключения идентификаторпроцесса, создавшего это подключение). В Windows 2000ключ -o еще не был изобретен. Например:

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

Если вы увидели у себя много TCP-соединений в состо-янии LISTENING, то не пугайтесь – это, скорее всего, нетрояны, а работающие по умолчанию стандартные серви-сы Windows.

C:\Documents and Settings\User>netstat -ano

Активные подключения

Имя Локальный адрес Внешний адрес Состояние PID

TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 856

TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4

TCP 0.0.0.0:1025 0.0.0.0:0 LISTENING 1028

TCP 0.0.0.0:4928 0.0.0.0:0 LISTENING 3660

TCP 0.0.0.0:4929 0.0.0.0:0 LISTENING 3660

TCP 0.0.0.0:4946 0.0.0.0:0 LISTENING 3660

TCP 0.0.0.0:6213 0.0.0.0:0 LISTENING 3660

TCP 0.0.0.0:6218 0.0.0.0:0 LISTENING 3660

TCP 0.0.0.0:6247 0.0.0.0:0 LISTENING 3660

TCP 0.0.0.0:6253 0.0.0.0:0 LISTENING 3660

TCP 0.0.0.0:6299 0.0.0.0:0 LISTENING 3660

TCP 0.0.0.0:6344 0.0.0.0:0 LISTENING 3660

TCP 0.0.0.0:9762 0.0.0.0:0 LISTENING 2324

TCP 0.0.0.0:10641 0.0.0.0:0 LISTENING 2884

TCP 0.0.0.0:10676 0.0.0.0:0 LISTENING 2324

TCP 0.0.0.0:10892 0.0.0.0:0 LISTENING 2324

TCP 127.0.0.1:111 0.0.0.0:0 LISTENING 2676

TCP 127.0.0.1:143 0.0.0.0:0 LISTENING 2676

TCP 127.0.0.1:3044 0.0.0.0:0 LISTENING 1608

TCP 127.0.0.1:3045 0.0.0.0:0 LISTENING 1028

TCP 127.0.0.1:3046 0.0.0.0:0 LISTENING 1028

TCP 127.0.0.1:3085 0.0.0.0:0 LISTENING 2324

TCP 127.0.0.1:5335 0.0.0.0:0 LISTENING 3232

TCP 127.0.0.1:8888 0.0.0.0:0 LISTENING 3232

№9(22) сентябрь 2004подписной индекс 81655

www.samag.ru

Linux на страже Windows:обзор системы резервного копированияBackupPC

GRSecurity – система безопасностидля Linux

Роутер без диска

Windows XP Service Pack 2глазами системного администратора

Возможно ли повышение точности IDS

PostgreSQL:графический клиент pgAdmin

FreeBSD tips: устанавливаем VPN

Восстановление данныхна NTFS-разделах

Пакетные команды интерфейса ATAPI

PHP 5 – пришествие неизбежно

Linux на страже Windows:обзор системы резервного копированияBackupPC

GRSecurity – система безопасностидля Linux

Роутер без диска

Windows XP Service Pack 2глазами системного администратора

Возможно ли повышение точности IDS

PostgreSQL:графический клиент pgAdmin

FreeBSD tips: устанавливаем VPN

Восстановление данныхна NTFS-разделах

Пакетные команды интерфейса ATAPI

PHP 5 – пришествие неизбежно

№10(23) октябрь 2004подписной индекс 81655

www.samag.ru

Знакомство с Cooperative Linux

Идеальный карманный компьютердля системного администратора

Bluetooth + Linux

Настройка squidдля использования авторизациииз домена Windows 2000

Установка и настройка W2K Server

Четырехузловой кластерс балансировкой нагрузкибез внешнего массива данных

PostgreSQL: функции и триггеры

Внутренний веб-сервер

STAT – совсем другая IDS

Поиск троянов вручную

Знакомство с Cooperative Linux

Идеальный карманный компьютердля системного администратора

Bluetooth + Linux

Настройка squidдля использования авторизациииз домена Windows 2000

Установка и настройка W2K Server

Четырехузловой кластерс балансировкой нагрузкибез внешнего массива данных

PostgreSQL: функции и триггеры

Внутренний веб-сервер

STAT – совсем другая IDS

Поиск троянов вручную

№11(24) ноябрь 2004подписной индекс 81655

www.samag.ru

Утилита nLite:формируем свой дистрибутивWindows XP/2000/2003

Мониторинг UNIX-серверовc помощью Nagios и SNMP

Использование бездисковыхLinux-станций с загрузкой по сети

Пакетный фильтр OpenBSD

Танцуем самбу

Linare – настольный дистрибутив Linux

Иммунная система для компьютера

Пассивный перехват трафика

Запись дисков CD-R/RW в Linux

Создание и настройкасервера терминалов

Утилита nLite:формируем свой дистрибутивWindows XP/2000/2003

Мониторинг UNIX-серверовc помощью Nagios и SNMP

Использование бездисковыхLinux-станций с загрузкой по сети

Пакетный фильтр OpenBSD

Танцуем самбу

Linare – настольный дистрибутив Linux

Иммунная система для компьютера

Пассивный перехват трафика

Запись дисков CD-R/RW в Linux

Создание и настройкасервера терминалов

№12(25) декабрь 2004подписной индекс 81655

www.samag.ru

Единая учетная запись для Windowsи UNIX в Active Directory

Копирование файловв автоматическом режимес множества компьютеров через SSH

Защита сетевых сервисовс помощью stunnel

Использование аппаратных ключейв целях аутентификации в Linux

Система обнаружения атак SHADOW

Биллинг для АТС на базе PostgreSQL

Обработка переадресованныхhttp-запросов

Автоматизация FTP с помощью Python

Единая учетная запись для Windowsи UNIX в Active Directory

Копирование файловв автоматическом режимес множества компьютеров через SSH

Защита сетевых сервисовс помощью stunnel

Использование аппаратных ключейв целях аутентификации в Linux

Система обнаружения атак SHADOW

Биллинг для АТС на базе PostgreSQL

Обработка переадресованныхhttp-запросов

Автоматизация FTP с помощью Python

Page 63: 026 Системный Администратор 01 2005

bugtraq

61№1, январь 2005

Удаленное выполнениепроизвольного кода в GNU QueueПрограмма: Queue 1.30.1.Опасность: Высокая.Описание: Уязвимость позволяет удаленному пользовате-лю выполнить произвольный код на уязвимой системе.Уязвимость обнаружена в файлах queue.c и queued.c. Уда-ленный пользователь может выполнить произвольный кодна уязвимой системе.URL производителя: www.gnu.org/software/queue/queue.html.Решение: На данный момент исправление существует дляLinux Debian: http://security.debian.org/pool/updates/main/q/queue.

Выполнение произвольного кодаи отказ в обслуживаниив Midnight CommanderПрограмма: Midnight Commander до 4.5.55 версии.Опасность: Высокая.Описание: Несколько уязвимостей в Midnight Commanderпозволяют удаленному пользователю вызвать отказ в об-служивании и выполнить произвольный код на уязвимойсистеме.

Множественные уязвимости форматной строки в фай-лах src/utilunix.c и vfs/fish.c позволяют удаленному пользо-вателю вызвать отказ в обслуживании или выполнить про-извольный код на уязвимой системе с привилегиями пользо-вателя, запустившего mc.

Множественные переполнения буфера в файлах src/key.c, vfs/sfs.c, vfs/direntry.c, gtkedit/syntax.c, src/wtools.c, src/utilunix.c, src/boxes.c, src/charsets.c и vfs/cpio.c дают возмож-ность злоумышленнику вызвать отказ в обслуживании ивыполнить произвольный код.

Уязвимости в файле gtkedit/syntax.c позволяют удален-ному пользователю вызвать отказ в обслуживании прило-жения.

Уязвимость существует в файле src/profile.c. Удаленныйпользователь может вызвать отказ в обслуживании с по-мощью специально сформированных заголовков сессий.

Уязвимость в файле src/find.c позволяет удаленномупользователю вызвать отказ в обслуживании посредствомсоздания указателя на нулевое разыменование.

Отказ в обслуживании возможен из-за ошибки в файлеgtkedit/editcmd.c при попытке освободить не размещенныев памяти данные.

Уязвимость в файле src/key.c позволяет атакующемуобратиться к уже освободившейся памяти и вызвать отказв обслуживании.

Удаленный пользователь может вызвать отказ в обслу-живании, управляя несуществующими дескрипторами фай-лов. Уязвимость существует в файле vfs/direntry.c.

Уязвимость в файле fish.c позволяет удаленному пользо-вателю выполнить произвольные программы на системе из-за недостаточной обработки символов в именах файлов.

Переполнение буфера в файле extfs.c позволяет уда-ленному пользователю вызвать отказ в обслуживании.URL производителя: http://www.ibiblio.org/mc.Решение: Установите обновление: http://savannah.gnu.org/cgi-bin/viewcvs/mc/mc.

Выполнение произвольного кодав IBM DB2Программа: IBM DB2 7.x, 8.1.Опасность: Высокая.Описание: Обнаружено переполнение буфера в IBM DB2.Локальный атакующий может выполнить произвольный кодна уязвимой системе.

Уязвимость существует в функции generate_distfile. Ло-кальный атакующий может послать функции с помощьюdb2dbappext.dll специально сформированный третий пара-метр, вызвать переполнение стека и выполнить произволь-ный код на уязвимой системе.

Уязвимость существует в функции rec2xml. Удаленныйатакующий может послать функцию с длинным третьим па-раметром и выполнить произвольный код на уязвимой сис-теме.URL производителя: http://www-306.ibm.com/software/data/db2/udb.Решение: Установите обновление: http://www.ibm.com/software/data/db2/udb/support/downloadv8.html и http://www.ibm.com/software/data/db2/udb/support/downloadv7.html.

Выполнение произвольного кодав telnetd-sslПрограмма: telnetd-ssl.Опасность: Высокая.Описание: Уязвимость форматной строки обнаружена вtelnetd-ssl. Удаленный атакующий может выполнить произ-вольный код на уязвимой системе.

Уязвимость обнаружена в файле telnetd/telnetd.c при об-работке SSL-сообщений. Удаленный атакующий может вы-полнить произвольный код на уязвимой системе.Решение: На момент публикации решение существуеттолько для Debian Linux.

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

Множественные уязвимостив AntiGen for DominoПрограмма: AntiGen версии до 7.0 SR5 for Domino, build 745для Solaris.Опасность: Высокая.Описание: Обнаруженные уязвимости позволяют обойтиограничения при сканировании файлов и вызвать отказ вобслуживании.

Уязвимость при обработке вложений в теле MIME мо-жет позволить злонамеренному ПО обойти некоторые фун-кции сканирования.

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

Ошибка при сканировании защищенных паролем RAR-архивов, вложенных в письма, может аварийно завершитьработу антивируса.URL производителя: http://www.sybari.com.Решение: Установите обновление: http://www.sybari.com.

Page 64: 026 Системный Администратор 01 2005

62

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

Нити, называемые ещё «легковесными процессами» и уп-равляющими потоками, – это части кода, принадлежащиеодному процессу, разделяющие общее адресное простран-ство, но способные выполняться параллельно и асинхрон-но, что позволяет разделять вычисления между отдельны-

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

НИТИ В PERL

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

Page 65: 026 Системный Администратор 01 2005

63№1, январь 2005

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

threads vs forkВсе знают о системном вызове fork, который создаёт точ-ную копию процесса. При этом новый процесс получает своёсобственное адресное пространство и начинает существо-вать независимо от родителя. Такое ветвление процессов –широко распространённая практика в многозадачных сре-дах, способных выполнять сразу несколько потоков команд.Но ветвление – не единственный способ воспользоватьсяпреимуществами многопотоковости.

Другой подход – создание нитей (threads). При обычномfork-подходе одно отдельное адресное пространство обра-батывается одним потоком команд. Но согласитесь, что нетникаких принципиальных ограничений на количество пото-ков команд, работающих в одном адресном пространстве.Такие потоки и принято называть нитями.

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

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

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

Поддерживаются ли нити вашим Perl?Немного истории. Механизм создания нитей появился ещё вPerl версии 5.005, но первая его реализация обладала мас-сой изъянов. Поэтому в Perl 5.6 появился новый код, на-званный ithreads, а в версии 5.8 был добавлен интерфейс-ный модуль, позволяющий создавать нити.

Документация настоятельно советует отказываться отстарого подхода к созданию и управлению нитями и какможно быстрее переходить на технологию ithreads, т.к. вPerl 5.10 (работа над которым уже идёт) старый подход, ско-рее всего, не будет поддерживаться. Поэтому я не буду ка-саться старой технологии управления нитями.

Итак, речь пойдёт о самой последней версии Perl 5.8.Но это ещё не всё. Чтобы интерпретатор поддерживал

нити, он должен быть собран с соответствующими опция-ми. Интерпретаторы, поставляемые с разными системами,могут отличаться. Так, например, Perl 5.8, поставляемый сFreeBSD 5.3, не поддерживает нити, и его следует пере-компилировать. Perl, входящий в дистрибутив SuSE Linux9.1, напротив, собран с поддержкой нитей, и для их исполь-зования не требуется никаких дополнительных усилий.

Как узнать, способен ли ваш интерпретатор Perl управ-

лять нитями? Посмотреть его настройки командой «Perl -V».Если вы хотите увидеть все характеристики Perl на вашемвеб-сервере, то можете выполнить на нём, скажем, вот та-кой CGI-сценарий.

Во всей полученной информации нас будут интересо-вать две переменные: use5005threads и useithreads. Еслиобе они не определены, то ваш интерпретатор не можетсоздавать нити. Если определена только первая, значит,ваш интерпретатор поддерживает только старый механизмсоздания нитей. Если определена только вторая – вы име-ете то, что надо, – поддерживается новый аппарат управ-ления нитями. Наконец, если определены обе – это стран-но; скорее всего, Perl был сконфигурирован некорректно, иничего работать не будет из-за несовместимости старой иновой технологии.

Итак, у вас должен быть Perl версии 5.8, а переменныеuse5005threads и useithreads должны иметь значения «нео-пределённое» и define соответственно. Если это так, про-должим изучение механизма ithread.

Создание нитейИнтерфейс управления нитями реализован в модуле threads.Для создания нити используется метод create, который тре-бует один обязательный аргумент – ссылку на функцию, закоторым может следовать список аргументов. Метод воз-вращает объект-дескриптор нити. Простейший пример:

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

Можно использовать анонимные функции. В нашем при-мере первые две строки можно объединить в конструкцию:

Кроме метода create существует и метод new, являю-щийся просто псевдонимом первого. Поэтому допустим идругой синтаксис:

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

Для запуска нити предусмотрено два метода.

#!/usr/bin/perluse Config;print "Content-Type: text/plain\n\n";print join "\n", map {$_.' => '. (defined $Config{$_}? ($Config{$_} eq ''? '[EMPTY STRING]': "'$Config{$_}'"): '[UNDEFINED]')} sort keys %Config;

sub thread_function { print "Ok!\n" }$thread = threads->create(\&thread_function);$thread->join;

$thread = threads->create(sub { print "Ok!\n" });

$thread = new threads(sub { print "Ok!\n" });

threads->create(sub { print "Ok!\n" })->join;

Page 66: 026 Системный Администратор 01 2005

64

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

Первый мы уже видели, это join. Второй – detach.Метод join запускает новую нить, при этом выполнение

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

Как вы видите, наша функция &f получает один аргу-мент, печатает фразу «WAIT »+аргумент, ждёт одну секун-ду, печатает «DONE »+аргумент и возвращает результат –строку «RESULT »+аргумент.

Мы создаём две нити. Дескриптор $a соответствует нити,выполняющей функцию &f с параметром «A», а $b – «B».

Далее мы запускаем обе нити.Как вы думаете, сколько времени потребуется на вы-

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

То есть произошёл запуск нити A, она напечатала пер-вую строку и «заснула» на секунду. Не дожидаясь пробуж-дения A, началось выполнение нити B (строка «WAIT B»).Пока B спала, проснулась A и вывела результат на печать.Далее проснулась B. Когда все нити отработали, програм-ма завершилась.

Давайте чуть усложним наш код:

Теперь нить A выполняется две секунды, а нить B – по-прежнему одну.

Результат будет таков:

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

Метод detach работает иначе. Запущенная нить стано-вится полностью автономна, а запускающий код продол-жает выполняться, не дожидаясь её завершения. Поэтомуметод detach не возвращает результат работы; последнийпросто теряется.

Несколько слов о других возможностяхмодуля threadsМодуль thread содержит ещё несколько полезных функций.

Название метода threads->self говорит само за себя, онвозвращает дескриптор текущей нити.

Метод threads->tid возвращает более удобный целочис-ленный идентификатор текущей нити. Каждая нить полу-чает свой уникальный идентификатор. Основная програм-ма является нитью номер ноль.

Метод threads->object($tid) возвращает дескриптор, со-ответствующий идентификатору, или undef, если нити с за-данным $tid не существует.

Метод threads->yield (теоретически) сообщает операци-онной системе, что текущая нить может уступить остатоккванта времени, выделенного ей, другому процессу илинити. Эта функция может быть весьма полезна, но факти-чески она реализована далеко не во всех операционныхсистемах и зачастую просто не производит никаких дей-ствий.

И наконец, метод threads->list возвращает список объек-тов, которые уже созданы методом create (или new), но покане были запущены ни методом join, ни detach.

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

#!/usr/bin/perl -wuse strict;use threads;sub f { my ($a)=@_; print "WAIT $a\n"; sleep 1; print "DONE $a\n"; return "RESULT $a\n";}my $a = threads->create(\&f, 'A');my $b = threads->create(\&f, 'B');print $a->join;print $b->join;

WAIT A

WAIT B

DONE A

RESULT A

DONE B

RESULT B

#!/usr/bin/perl -wuse strict;use threads;my $a;sub f { my $aa=$a; $a=7; return "DONE (a=$aa)\n" }$a=0;my $kida = threads->create(\&f);$a=1;my $kidb = threads->create(\&f);$a=2;print "(a=$a)\n";print $kida->join;$a=3;print "(a=$a)\n";print $kidb->join;

#!/usr/bin/perl -wuse strict;use threads;sub f { my ($a, $t)=@_; print "WAIT $a\n"; sleep $t; print "DONE $a\n"; return "RESULT $a\n";}my $kida = threads->create(\&f, 'A', 2);my $kidb = threads->create(\&f, 'B', 1);print $kida->join;print $kidb->join;

WAIT A

WAIT B

DONE B

DONE A

RESULT A

RESULT B

Page 67: 026 Системный Администратор 01 2005

65№1, январь 2005

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

Несмотря на использование ключа -w и модуля strict, ниошибок, ни предупреждений этот пример не вызовет. Тоесть глобальная переменная $a доступна в функции &f. Нодавайте посмотрим, что же выдаст эта программа:

Удивлены? Ничего странного, функция &f, выполняемаяв нити, видит то значение глобальной переменной, котороеимелось на момент создания нити (вызов create).

Дело в том, что при создании нити методом create илиnew происходит копирование всех глобальных переменныхв локальный контекст нити, с которым она и работает. По-этому изменение значения $a в коде нити (в функции &f)никак не влияет на значение $a, которое доступно из ос-новной программы или из других нитей.

Именно поэтому нити рекомендуется создавать какможно раньше, пока программа не успела аккумулироватьбольшой объём данных; не следует перегружать код гло-бальными переменными. Иначе создание нити, вернее ко-пирование данных (очень скоро мы убедимся, что это несовсем копирование «один к одному»), может занять де-сятки (!) секунд и привести к существенному перерасходупамяти.

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

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

В результате его работы мы получим нечто подобное:

Как видите, мы создали глобальный указатель $b наглобальную переменную $a. В основной программе и внут-ри нити указатель имеет разные значения. В первом слу-чае он хранит адрес переменной $a, во втором – адрес ко-пии $a, созданной в момент создания нити. Именно это яимел в виду, когда говорил, что копирование глобальныхпеременных – это не совсем копирование. Значение ссыл-ки будет изменяться даже при передаче её в качестве аргу-мента. Таким образом, Perl не позволяет обмануть его изакрывает все возможные лазейки для доступа к одним итем же глобальным переменным из разных нитей.

Для разделения данных существует специальный наборинструментов.

Разделение данныхМодуль thread::share предоставляет все необходимые сред-ства для создания разделяемых переменных и корректнойработы с ними. Он может использоваться только в сочета-нии с модулем threads. В противном случае все методымодуля thread::share не выполняют никаких действий.

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

Например:

Share имеет несколько специфических особенностей.Во-первых, в последних двух командах этого примера

следует обязательно использовать полное имя функции&share с явным указанием типа.

Во-вторых, разыменование ссылок осуществляетсятолько на один уровень. То есть share($a) эквивалентноshare(\$a), но не эквивалентно share(\\$a).

В-третьих, обобществление массивов и хэшей приво-дит к обобществлению всех их элементов и ключей.

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

Вот иллюстрация:

Последняя строка приведёт к ошибке: «Invalid value forshared».

Ошибки не возникнет, если мы чуть изменим код, сде-лав $b разделяемой:

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

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

#!/usr/bin/perl -wuse strict;use threads;my $a;my $b=\$a;sub f { print "in thread b=$b\n" }my $kid = threads->create(\&f);print "in main b=$b\n";$kid->join;

in thread b=SCALAR(0x8237bb8)

in main b=SCALAR(0x81691e8)

# ñîçäà¸ì ðàçäåëÿåìûé ñêàëÿðmy $a; share($a);# ñîçäà¸ì ðàçäåëÿåìûé ìàññèâmy @a; share(@a);# ñîçäà¸ì ðàçäåëÿåìûé õýømy %a; share(%a);# óêàçàòåëü íà ðàçäåëÿåìûé ìàññèâmy $a=&share([]);# óêàçàòåëü íà ðàçäåëÿåìûé õýø (!)my $a=&share();

my $a; share($a);my $b;$a=\$b;

my $a; share($a);my $b; share($b);$a=\$b;

my $a : shared = 1;

(a=2)

DONE (a=0)

(a=3)

DONE (a=1)

Page 68: 026 Системный Администратор 01 2005

66

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

Как видите, каждый вызов нити должен увеличивать $aна единицу. Мы вызываем нить дважды, но увидим ли мы врезультате двойку? Совсем не обязательно! Обе нити вы-полняются параллельно, и может сложиться такая ситуа-ция, что локальные переменные $c будут инициализирова-ны до того момента, когда хотя бы одна из нитей изменитзначение общей переменной $a. Тогда обе $c будут равнынулю, после инкремента – единице, и $a получит значениеодин. Это произойдёт почти наверняка, если чуть модифи-цировать функцию &f:

Более того, даже простой инкремент нельзя считатьатомарной (неделимой) операцией. И даже если мы изме-ним &f следующим образом:

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

Блокировка переменныхДля разрешения подобных проблем модуль threads::sharedпредлагает различные средства блокировки. Наиболее ча-сто используется функция lock. Эта функция блокирует пе-ременную в пределах её области видимости. То есть в пре-делах блока, ограниченного фигурными скобками.

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

Корректно функцию &f в нашем примере можно пере-писать так:

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

Пример:

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

Вот пример такой ситуации:

Эта программа, скорее всего, зависнет «намертво». При-чина проста: обе нити выполняются практически одновре-менно. Каждая блокирует одну из двух переменных (пер-вый вызов lock), а потом обе ждут, когда будет снята бло-кировка другой переменной (второй вызов lock). Ни однане может уступить, и весь конгломерат «зависает» в не-скончаемом ожидании.

Надёжной стратегией, позволяющей избежать такихситуаций, является строгое соблюдение порядка установ-ки блокировок. Допустим, всегда блокировать $a раньше,чем $b; и никогда иначе.

У блокировки есть несколько важных свойств.Во-первых, важно понимать, что lock действует анало-

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

Во-вторых, повторный вызов lock для той же перемен-ной в той же области видимости не выполняет никаких дей-ствий:

В этом примере второй вызов lock не выполнит никакихдействий. Программа продолжит работу.

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

#!/usr/bin/perl -wuse strict;use threads;use threads::shared;my $a : shared = 0;sub f { my $c=$a; $c++; $a=$c; }my $p=threads->create(\&f);my $q=threads->create(\&f);$p->join;$q->join;print "$a\n";

sub f { my $c=$a; sleep 1; $c++; $a=$c; }

sub f { $a++ }

sub f { lock($a); $a++;}

sub f { { lock($a); $a++ } { lock($b); $b++ } # çàáë. òîëüêî $b}

#!/usr/bin/perl -wuse strict;use threads;use threads::shared;my $a : shared;my $b : shared;my $p=threads->create( sub { lock($a); sleep 1; lock($b) } );my $q=threads->create( sub { lock($b); sleep 1; lock($a) } );$p->join;$q->join;

{ lock($x); lock($x);}

sub a { $x++; # $x îñòàëàñü çàáëîêèðîâàíà}sub b { lock($x); a();}

Page 69: 026 Системный Администратор 01 2005

67№1, январь 2005

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

Другие возможности модуляuse threads::sharedМодуль содержит ещё несколько очень полезных инстру-ментов, связанных с блокировкой. Очень коротко расска-жу про них. За более подробной информацией обращай-тесь к руководству perldoc threads::shared.

Функция cond_wait служит для временного снятия бло-кировки с переменной. Допустим, вы заблокировали пере-менную, но хотите временно предоставить к ней доступдругим нитям. Тогда вы вызываете cond_wait. Блокировкас переменной снимается, и выполнение cond_wait приоста-навливается. Теперь ваша нить ждёт, пока другая нить про-делает необходимые манипуляции с переменной. Когдаработа с переменной завершена, нить (выполнявшая дей-ствия) должна сообщить о том, что переменная ей большене нужна, вызвав функцию cond_signal для этой же пере-менной. Тогда cond_wait снова блокирует переменную изавершается, позволяя первой нити продолжить работу.

Допустим вызов функции cond_wait с двумя параметра-ми. Тогда она снимает блокировку со второго и ждёт, когдапоступит сигнал для первого аргумента.

Функция cond_timedwait выполняет аналогичные дей-ствия, но позволяет задать тайм-аут. Она также снимаетблокировку и ждёт сигнала или наступления тайм-аута.Если наступил тайм-аут, cond_timedwait возвращает ложь,если был получен сигнал – истину.

Функцию cond_timedwait можно вызывать и с тремя ар-гументами, тогда она действует аналогично cond_wait сдвумя аргументами, но отслеживает ещё и тайм-аут.

Для отправки сигналов существует две функции: cond_signal и cond_broadcast. Обе получают один аргумент – пе-ременную и посылают сигнал для cond_wait. Разница со-стоит только в том, что если сразу несколько нитей ожида-ют сигнала, то cond_signal посылает сигнал только однойиз них (причём неизвестно, какой), а cond_broadcast посы-лает сигнал всем.

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

СемафорыКлассическим средством синхронизации являются семафо-ры. Для нитей они реализованы в модуле Thread::Semaphore,который предоставляет всего три функции: new – создатьсемафор, down – опустить семафор (в железнодорожномпонимании – закрыть проезд), up – поднять семафор.

Проще всего представить семафор как счётчик. Функ-ция up увеличивает счётчик на единицу. Функция downуменьшает счётчик на единицу, и если счётчик становитсяравен нулю (или меньше), то down останавливается и ждёт,когда семафор поднимется. Так семафоры сигнализируют,занят ресурс или свободен, и позволяют ехать по рельсамтолько одному паровозу (для всех других семафор закрыт).

Помните наш пример, демонстрирующий, какие пробле-

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

Вот пример безопасного кода, не использующего функ-цию lock; обходящего возможные проблемы только сред-ствами семафоров:

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

Все три метода – new, up и down – можно вызывать саргументом. Это должно быть целое число, которое new ин-терпретирует как начальное значение счётчика, а up и down –как величину, на которую следует изменить счётчик.

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

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

use threads;use Thread::Semaphore;$|=1;my $s = Thread::Semaphore->new(2);my $a : shared = 0;sub f { my ($name, $time, $greed)=@_; print "$name: Ïûòàþñü îïóñòèòü ñåìàôîð, çàõâàòèâ ↵↵↵↵↵

$greed øò. ðåñóðñîâ\n"; $s->down($greed); print "$name: Ñåìàôîð îïóùåí, ðàáîòàþ ñ ↵↵↵↵↵

$greed øò. ðåñóðñîâ $time ñ.\n"; sleep $time; print "$name: Ïîäíèìàþ ñåìàôîð\n"; $s->up($greed);

use threads;use Thread::Semaphore;my $s = new Thread::Semaphore;my $a : shared = 0;sub f { $s->down; $a++; $s->up;}my $p=threads->create(\&f);my $q=threads->create(\&f);$p->join;$q->join;print "$a\n";

Page 70: 026 Системный Администратор 01 2005

68

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

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

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

Чтобы Perl выдавал сообщения незамедлительно, нампришлось отключить буферизацию $|=1.

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

Как видите, мы достигли поставленной цели: наш на-бор нитей использует одновременно не более чем две еди-ницы ресурса.

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

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

ОчередиОчереди позволяют передавать данные между нитями, незаботясь ни о синхронизации, ни о блокировке. МодульThread::Queue предоставляет полный набор инструментовдля работы с очередями: новая очередь создаётся мето-дом new, метод enqueue помещает данные в очередь (ар-

гумент – скаляр или список), метод dequeue извлекает дан-ные из очереди.

Причём, если очередь пуста, то метод dequeue ждёт,пока в очереди не появятся данные.

Приведу простой пример использования очередей:

Здесь нить асинхронно помещает данные в очередь, аосновная программа (нить номер ноль) «прослушивает» этуочередь.

Я бы хотел обратить ваше внимание на несколько ас-пектов.

Во-первых, нам не только не пришлось заботиться облокировке переменных и передаче/приёме сигналов, но ивообще не понадобилось подключать модуль threads::shareи обращаться к разделяемым переменным – мы вполнеобошлись глобальными. Это не значит, что все сложности,возникающие при работе с глобальными переменными,описанные выше, исчезли. Это значит только то, что мо-дуль Thread::Queue обходит их сам.

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

В документации perldoc perlthrtut есть очень интересныйпример. Программа ищет простые числа; всё написано нанитях и очередях. Предложенный там код выгодно отлича-ется от моих примитивных примеров, приводимых в этойстатье. Для компактности и максимальной наглядности я всвоих примерах создаю только столько нитей, сколько не-обходимо для демонстрации той или иной возможности,передавая функциям аргументы-константы. Пример вperlthrtut порождает нити в том количестве, какое необхо-димо, динамически разветвляя процесс вычислений (болееста штук, если ничего не менять). Я бы с удовольствиемрассмотрел здесь подобный пример, но боюсь, что эта за-

{lock($a); $a++}}foreach (qw/A B C D E F/) { threads->create(\&f, $_, 1+int(rand(3)), ↵↵↵↵↵

1+int(rand(2)))->detach;}for (my $i=0; $a<6; $i++) { print "Èä¸ò ñåêóíäà $i\n"; sleep 1;}

A: Пытаюсь опустить семафор, захватив 2 шт. ресурсов

A: Семафор опущен, работаю с 2 шт. ресурсов 1 с.

B: Пытаюсь опустить семафор, захватив 1 шт. ресурсов

C: Пытаюсь опустить семафор, захватив 1 шт. ресурсов

D: Пытаюсь опустить семафор, захватив 2 шт. ресурсов

E: Пытаюсь опустить семафор, захватив 2 шт. ресурсов

F: Пытаюсь опустить семафор, захватив 2 шт. ресурсов

Идёт секунда 0

A: Поднимаю семафор

B: Семафор опущен, работаю с 1 шт. ресурсов 1 с.

C: Семафор опущен, работаю с 1 шт. ресурсов 2 с.

Идёт секунда 1

B: Поднимаю семафор

Идёт секунда 2

C: Поднимаю семафор

D: Семафор опущен, работаю с 2 шт. ресурсов 3 с.

Идёт секунда 3

Идёт секунда 4

Идёт секунда 5

D: Поднимаю семафор

E: Семафор опущен, работаю с 2 шт. ресурсов 1 с.

Идёт секунда 6

E: Поднимаю семафор

F: Семафор опущен, работаю с 2 шт. ресурсов 3 с.

Идёт секунда 7

Идёт секунда 8

Идёт секунда 9

F: Поднимаю семафор

my $q=Thread::Queue->new;$q->enqueue('text');$q->enqueue(1, 2, 3);my $var=$q->dequeue;

#!/usr/bin/perl -wuse strict;use threads;use Thread::Queue;my $q=Thread::Queue->new;sub f { $q->enqueue("I'm going sleep"); sleep 1; $q->enqueue("I'm waiking up"); $q->enqueue(undef);}my $p=threads->create(\&f);$p->detach;while (my $t=$q->dequeue) { print "He say: '$t'\n";}

Page 71: 026 Системный Администратор 01 2005

69№1, январь 2005

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

дача не сможет уложиться в рамки журнальной статьи. Темне менее приведённых здесь фактов более чем достаточ-но, чтобы понять, как работает пример из perlthrtut. К томуже он снабжён краткими, но исчерпывающими коммента-риями (на английском языке). Рекомендую взглянуть на неговсем, кто заинтересовался.

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

Удачной идеей будет изолировать весь threads-зависи-мый код в отдельный модуль. А полной переносимости мож-но достичь, если создать модуль-дублёр, выполняющий теже функции, но не требующий поддержки нитей. Тогда мож-но подключать тот или другой модуль, в зависимости отконкретной ситуации:

Функция import не является встроенной функцией Perl.Эту функцию традиционно содержит модуль. Возможно, дляподключения вашего модуля будет достаточно оператораrequire.

И снова threads vs fork.Отличие нитей от ветвленияТеперь, когда мы уже знакомы с особенностями нитей, да-вайте подведём некоторые итоги: чем лёгкие процессы от-личаются от обычных дочерних процессов. Мы уже многоговорили о преимуществах, давайте просуммируем и не-достатки.

Основное обстоятельство, накладывающее серьёзныеограничения на производительность нитей, то, что каждаяиз них получает копию всех данных, доступных родителю.Впрочем, дочерние процессы, порождённые с помощью fork,тоже получают копию данных родителя. Создание такойкопии приводит не только к излишнему расходу памяти, нои к существенным затратам процессорного времени. Мыуже видели, что при «копировании» Perl выполняет ряд до-полнительных действий, например, корректирует ссылки.

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

Следует заметить, что разделяемые переменные тре-буют немного больше памяти и работают чуть медленнееобычных.

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

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

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

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

Также неудачной идеей является сочетание fork- иthreads-подходов. В разных операционных системах реа-лизации fork- и thread-механизмов могут очень сильно от-личаться. Совместное использование этих двух подходовможет привести к непредсказуемым результатам. Самыйпростой вопрос: должен ли процесс, порождённый вызо-вом fork, наследовать все нити родителя, или он станет ко-пией только одной вызывающей нити? Ответ на этот воп-рос различен для разных операционных систем.

По тем же причинам не следует использовать сигналы(системный вызов kill) для синхронизации нитей.

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

Одним словом, нити гораздо более капризны, чем до-черние процессы. Технологию создания нитей нельзя счи-тать столь же зрелой и стандартизованной, как техноло-гию порождения дочерних процессов. И прежде чем вы нач-нёте использовать нити в больших проектах, обязательноознакомьтесь со страницами документации perldoc threads,threads::shared, Thread::Queue, Thread::Semaphore, perlthrtut(в которой дано несколько дополнительных ссылок) и доку-ментацией на вашу операционную систему. Не помешает ипотестировать критичные узлы отдельно, прежде чем вно-сить окончательные изменения.

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

...use Config;...die "ß ðàáîòàþ òîëüêî ñ íèòÿìè\n" unless ($Config{'useithreads'});...

use Config;BEGIN { if ($Config{'useithreads'}) { require my_threads_dep; import my_threads_dep; } else { require my_threads_indep; import my_threads_indep; }}

Page 72: 026 Системный Администратор 01 2005

70

web

Ещё каких-то лет пять назад человек, занимающийся раз-работкой сайтов, мог гордо именовать себя веб-мастером,не вызывая при этом иронических усмешек у коллег. В этопонятие входили дизайн, вёрстка, веб-программирование,и в объявлениях о приёме на работу часто мирно ужива-лись требования по знанию Perl и Photoshop. Теперь, разу-меется, многое изменилось, и в резюме веб-программистасчитается дурным тоном упоминать навыки работы с гра-фическими пакетами, даже если таковые и присутствуют.Тем не менее если вы работаете в небольшом проекте, вбюджете которого не предусмотрен многочисленный штатсотрудников, то время от времени у вас может возникнутьнеобходимость в самостоятельном создании кое-какой гра-фики – кнопочек, маркеров, пиктограмм, фоновых изобра-жений, которые нужны для любого веб-интерфейса. В об-щем случае такие задачи решаются использованием гото-вой библиотеки изображений или приглашением знакомо-го дизайнера (как правило, за солидный гонорар – две, ато и три бутылки пива). Проблема, решение которой изло-жено ниже, не так стандартна и немного сложнее, хотявстречается не так уж редко.

Итак, представим, что вы разрабатываете/ведёте бил-линг, или складскую систему, или… в общем, приложение,использующее базу данных и несущее достаточно сложнуюлогику. Представим также (хотя это и сложнее), что ника-ких особых проблем у вас нет – приложение работает кор-ректно, новая функциональность добавляется относитель-но легко, небольшие корректировки много времени не от-нимают. В целом вы довольны, но кроме вас в офисе тру-дятся менеджеры, бухгалтеры, начальство, и вот у после-днего возникают довольно своеобразные требования. Вчастности, шефа не устраивают ваши отчёты, генерирую-щиеся в виде аккуратных HTML-таблиц, ему нужны графи-ки, причём графики красивые и ежедневно (ежечасно?!)обновляющиеся. Не рисовать же их руками?

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

нимальным количеством кода. Существует некоторое ко-личество готовых библиотек для разработки графиков, на-пример, автор этих строк в своё время использовал доволь-но удачную разработку – phplot (http://www.phplot.com), нобезусловным лидером в этом отношении является объект-но-ориентированная библиотека JpGraph.

Среди её преимуществ можно выделить возможностьпостроения множества видов графиков, неограниченногочисла графиков одного типа в одном изображении, сглажи-вание линий, заполнение фонов диаграмм и гистограмм гра-диентной заливкой, генерация карт-изображений и кэширо-вание рисунков. Стандартная версия библиотеки бесплатна(существует и коммерческая версия pro, в которой доступнынекоторые дополнительные возможности, в частности, по-строение штрих-кодов). В статье речь пойдет о стандартнойверсии, о возможностях коммерческой читатель может оз-накомиться на сайте производителя – http://www.aditus.nu/jpgraph/jpg_proversion.php. Ещё одним достоинством этогопродукта является прекрасная документация, идущая вме-сте с дистрибутивом. На самом деле подробность докумен-тации ставит под сомнение необходимость чтения этой ста-тьи, но автор этих строк, как наверняка и кто-нибудь из вас,попадал в ситуацию, когда времени на обстоятельное изу-чение руководства просто нет, и я попытался изложить этотматериал для того, чтобы программист по его прочтениимог немедленно приступить к работе.

Постановка задачиДля примера возьмём вполне реальную проблему из прак-тики небольшого интернет-провайдера. Необходимо напи-сать скрипт, строящий график распределения входящеготрафика по дням за определённый период (скажем, за пос-ледние десять дней). Естественно, график должен строитьсядинамически и генерироваться по запросу на внутреннемвеб-сайте компании. Будем считать, что веб-сервер с под-держкой PHP уже установлен.

Все нижеописанные действия проводились на веб-сер-вере Apache версии 1.3.31 (Win32), работающем под управ-лением Windows 2000 Server. Версия интерпретатора PHP –4.3.9 с поддержкой библиотеки GD2, версии 2.0.28. PHP былустановлен как модуль.

ИнсталляцияВ целом установка библиотеки JpGraph никаких сложнос-тей не вызовет. Нужно просто скачать архив с библиотекой,

JpGraphДИНАМИЧЕСКАЯ ГРАФИКА – ЭТО ПРОСТО

JpGraphДИНАМИЧЕСКАЯ ГРАФИКА – ЭТО ПРОСТО

КИРИЛЛ СУХОВ

Page 73: 026 Системный Администратор 01 2005

71№1, январь 2005

web

расположенный по адресу http://www.aditus.nu/jpgraph.php,и распаковать его в папку документов вашего веб-серве-ра. До установки следует убедиться, что PHP у вас версиине ниже 4.01 (рекомендуется 4.3х) и скомпилирован с под-держкой библиотеки GD (для доступа к последним возмож-ностям JpGraph, GD2).

Графические форматы, с которыми работает библиоте-ка, определяются возможностями установленной GD и ав-томатически выбираются JpGraph в следующем порядке:«PNG», «GIF», «JPG».

Для проверки установки GD руководство по JpGraph ре-комендует следующий простой сценарий:

Если тест прошёл удачно и изображение было создано,можно устанавливать библиотеку и начинать работу, но дляреализации поставленной задачи необходимо выполнитьещё несколько действий. Прежде всего вы должны обеспе-чить поддержку TTF-шрифтов (они нам обязательно пона-добятся, об этом далее). Для этого PHP должен быть со-бран с поддержкой TTF, а также с FreeType 1 или FreeType 2библиотеками, и несколько (как минимум два) шрифтов ус-тановлены в системе.

Следующий этап – настройка нелатинских шрифтов.Понятно, что в данном случае необходимости в китайскихсимволах у нас нет, а для использования кириллицы необ-ходимо отредактировать файл jpg-config.inc. В нём имеют-ся следующие настройки:

После установки значений обоих параметров в true не-обходимо убедиться, что на сервере имеются стандартныеюникодные шрифты (обычно они лежат в директории типа/usr/X11R6/lib/X11/fonts/TTF/) и проверить, поддерживают лиони кириллицу. В случае их отсутствия шрифты следует ус-тановить, например с Windows-машины (должен заметить,что при установке под Windows проблем с кириллицей вооб-ще не возникает). После этого в том же файле jpg-config.incследует прописать путь к шрифтам:

Теперь всё готово. Для проверки и ознакомления с воз-можностями инструмента раскроем в браузере файл src/examples/testsuit.php из дистрибутива библиотеки. Мы уви-дим около трёхсот графиков диаграмм и рисунков, кликнувпо каждому из которых, можно увидеть исходный код при-мера. Самый лёгкий способ начать работу с библиотекой –взять наиболее подходящий пример и методом «научного

тыка» подогнать его под свои нужды. Когда передо мнойвстала необходимость быстро построить график, я так исделал, но, разумеется, для полноценной работы с библио-текой необходимо разобраться в её свойствах и методах,поэтому далее мы будем строить график «с нуля».

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

Для построения графика используем следующий код:

Если всё установлено правильно, в результате должнаполучиться картинка, показанная на рис. 1 (пример дан впредположении, что ваш скрипт test.php расположен в пап-ке src/examples/, если это не так, отредактируйте пути кбиблиотеке).

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

В первых двух строчках кода мы подключаем базовуюбиблиотеку jpgraph.php и один из модулей (plot extensions),в данном случае это jpgraph_line.php, необходимый для по-строения линейных графиков. Затем создаём объект клас-са Graph, задав его размеры, и выбираем масштаб оси X(метод SetScale()). Потом создается объект класса plot (гра-фик), параметры которого задаются созданным нами ра-нее массивом, сохранённым в переменной $traff. В после-дних двух строчках график добавляется в объект Graph иметодом Stroke() Graph выводится в браузер.

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

$im = ImageCreate (50, 100)or die ("Cannot create a new GD image.");$background_color = ImageColorAllocate ($im, 255, 255, 255);$text_color = ImageColorAllocate ($im, 233, 14, 91);ImageString ($im, 1, 5, 5, "A Simple Text String", $text_color);header ("Content-type: image/png");ImagePng ($im);

// Special unicode cyrillic language supportDEFINE("LANGUAGE_CYRILLIC",false);// If you are setting this config to true the conversion// will assume that the input text is windows 1251, if// false it will assume koi8-rDEFINE("CYRILLIC_FROM_WINDOWS",false);

DEFINE('TTF_DIR',�);

<?$traff = array(350, 280, 450, 615, 588,755, 547,320, ↵↵↵↵↵

380, 810); // òðàôèê (Ìá)$days = array (9, 10, 11, 12, 13, 14, 15, 16, 17, 18); // äàòû?>

include ("../jpgraph.php");include ("../jpgraph_line.php");$graph = new Graph(450, 200,"auto");$graph->SetScale( "textlin");$lineplot =new LinePlot($traff);$graph->Add( $lineplot);$graph->Stroke();

Ðèñóíîê 1

$graph->xaxis->SetTickLabels($days);

Page 74: 026 Системный Администратор 01 2005

72

web

Теперь добавим заголовок и подписи к осям (для чегонам понадобится устанавливать шрифты).

Задача в первом приближении выполнена.

Теперь осталось добавить удобочитаемость. Выполня-ем следующие действия.

Устанавливаем отступы и поля для подписи к оси Y (по-скольку с ней проблемы):

Добавляем маркеры и подписи к ним:

«Раскрашиваем» график, добавляем фон и тень:

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

Полный код, генерирующий эту картинку, приведен насайте журнала http://www.samag.ru/source.

Всё, что осталось сделать, – это сохранить весь код вфайле (например, my_graph.php) и в нужном месте веб-стра-ницы вставить тег рисунка с указанием на этот файл (<imgsrc=”my_graph.php”).

Что внутри?Теперь давайте разберёмся с внутренним устройством биб-лиотеки. Как уже было упомянуто, для построения любогоизображения необходимо включить в сценарий основноймодуль – файл jpgraph.php и один или несколько модулей,ответственных за построение изображения требуемоготипа. Все они содержатся в папке \src, хотя могут быть пе-ренесены оттуда в любое удобное для вас место. (При этом,разумеется надо соблюдать некоторые зависимости. Так,внутренний модуль jpgraph_gradient.php никогда явно неподключается к сценарию, но используется другими моду-лями и без него не обойтись при генерации любого изобра-жения, использующего градиентную заливку.) Ниже пере-числены основные модули.! jpgraph_line.php – уже знакомое нам расширение для по-

строения линейных графиков.! jpgraph_bar.php – модуль для построения баров (гистог-

рамм).! jpgraph_log.php – модуль для отображения логарифми-

ческих зависимостей.! jpgraph_error.php – модуль для вывода графических со-

общений об ошибках (для чего это нужно – далее).! jpgraph_pie.php – модуль для построения плоских диаг-

рамм.! jpgraph_pie3d.php – модуль для построения 3D-диаг-

рамм.! jpgraph_gantt.php – модуль для построения графиков

Ганта.! jpgraph_radar.php, jpgraph_polar.php – модули позволя-

ют строить «центростремительную графику».! jpgraph_regstat.php – модуль для построения сглажен-

ных графиков.! jpgraph_scatter.php – модуль для отображения распре-

деленных по плоскости элементов и векторов.! jpgraph_iconplot.php – модуль для работы с иконками,

которые могут быть добавлены к графикам.! jpgraph_plotband.php – модуль для работы с группами

данных на графиках.! jpgraph_canvas.php – модуль для возможности построе-

ния произвольных графиков.! jpgraph_canvtools.php – модуль для возможности пост-

роения произвольных форм.

С полным списком подключаемых модулей вы можетеознакомиться в соответствующем разделе документации.

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

ров.! jpgraph_odo.php – модуль для отображения одометри-

ческих данных.! jpgraph_barcode.php – модуль для построения линейных

штрих-кодов.! jpgraph_pdf417.php – модуль для построения штрих-ко-

дов PDF417 2D.

Усложняем задачуТеперь, используя полученную информацию, посмотрим, начто ещё способна библиотека JpGraph.

$graph->SetMargin(60,40,40,40);$graph->yaxis->SetTitlemargin(40);

$lineplot->mark->SetType(MARK_IMG_DIAMOND, 'blue', 0.3);$lineplot->value->Show() ;$lineplot->value->SetColor("darkgray");$lineplot->value->SetFont(FF_FONT0,FS_BOLD);$lineplot->value->SetFormat(" %01.0f Mb");

$lineplot ->SetColor("blue");$graph->SetColor('cadetblue1');$graph->SetMarginColor('lightblue3');$graph->SetShadow();

Ðèñóíîê 2

Ðèñóíîê 3

$graph->title->SetFont(FF_VERDANA,FS_NORMAL,12);$graph->xaxis->title->SetFont(FF_VERDANA,FS_NORMAL,8);$graph->yaxis->title->SetFont(FF_VERDANA,FS_NORMAL,8);$graph->title->Set("Òðàôèê");$graph->xaxis->title->Set("Ïåðèîä");$graph->yaxis->title->Set("Òðàôèê (Mb)");

Page 75: 026 Системный Администратор 01 2005

73№1, январь 2005

web

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

Сначала представим исходные данные:

Теперь строим сглаженный график, подключив для это-го ещё один модуль:

Общая схема та же, что и в случае с простым графи-ком, но в данном случае мы создаём объект Spline(), опи-санный в модуле jpgraph_regstat.php. Быть может, резуль-тат не очень впечатляет, но довести его до приличного видабольшого труда не составит.

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

Теперь расставляем маркеры:

И координатную сетку:

Результат:

Бары (гистограммы)Указанное в заголовке представление данных было бы какраз наиболее уместным в предыдущем случае, но мы, сле-дуя наказам менеджмента, используем эту визуализациюнесколько для другого – для отображения количества под-ключённых клиентов. Опять берём два массива:

И строим простую гистограмму:

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

Сначала добавим подписи к столбцам и заголовки:

include "../jpgraph.php";include "../jpgraph_line.php";include "../jpgraph_regstat.php";$spline = new Spline($days,$traff);list($newx,$newy) = $spline->Get(100);$g = new Graph(300,200);$g->SetMargin(30,20,40,30);$g->SetScale('linlin');$g->xaxis->SetLabelFormat('%0.0f');$lplot = new LinePlot($newy,$newx);$g->Add($lplot);$g->Stroke();

include "../jpgraph_scatter.php";

$splot = new ScatterPlot($traff, $days);$splot->mark->SetFillColor('[email protected]');$splot->mark->SetColor('[email protected]');$g->Add($splot);

$g->xgrid->Show();

Ðèñóíîê 4

$pepl = array(8, 16, 10, 7, 4,12, 7,15, 11, ↵↵↵↵↵22); // êîëè÷åñòâî ïîäêëþ÷åíèé

$days = array (9, 10, 11, 12, 13, 14, 15, 16, 17, 18); // äàòû

$width=480;$height=280;$graph = new Graph($width,$height,'auto');$graph->SetScale("textlin");$graph->SetBox();$graph->xaxis->SetTickLabels($days);$bplot = new BarPlot($pepl);$bplot->SetWidth(0.5);$graph->Add($bplot);$graph->Stroke();

Ðèñóíîê 6

$graph->title->SetFont(FF_VERDANA,FS_BOLD,11);$graph->title->Set("Ïîäêëþ÷åíèÿ");$graph->subtitle->SetFont(FF_VERDANA,FS_NORMAL,9);

$traff = array(810,480, 550, 715, 688, 785, 847,902, 350, ↵↵↵↵↵280, 450, 615, 588,755, 547,320, 380); // òðàôèê (Ìá)

$days = array (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ↵↵↵↵↵13, 14, 15, 16, 17); // äàòû

Ðèñóíîê 5

Page 76: 026 Системный Администратор 01 2005

74

web

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

Я не думаю, что данный код требует каких-либо объясне-ний. Всё вполне интуитивно понятно.

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

ДиаграммыДля демонстрации этой возможности также не будем дале-ко уходить от реальности. Пусть на круговой диаграмменеобходимо отобразить распределение потребляемого тра-фика. Допустим, что трафик, израсходованный физичес-кими лицами за текущий месяц, составил 54.36 Гб, юриди-ческими – 64.57 Гб, и, наконец, 6.75 Гб ушли на внутренниенужды провайдера. Следующими несколькими строчкамикода (обратившись к расширению PieGraph) рисуем про-стую круговую диаграмму:

Результат показан на рис. 8. Как видите, проценты реа-лизации библиотека вычисляет сама (мелочь, а приятно).

Добавляем заголовок и для пояснения создаем легенду(пояснения к диаграмме или карте, иначе говоря «услов-ные обозначения»). Легенду можно добавить практическико всем объектам JpGraph, она представляет собой само-стоятельный объект:

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

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

Для начала подключаем ещё один модуль:

Заменяем вид диаграммы:

Выделяем служебный трафик:

Изменяем цвета по умолчанию:

$graph->title->SetFont(FF FF_VERDANA,FS_BOLD,8);$graph->title->Set("Ðàñïðåäåëåíèå òðàôèêà");$graph->legend->SetColor('navy');$graph->legend->SetFillColor('lightgreen');$graph->legend->SetLineWeight(1);$graph->legend->SetFont(FF_ARIAL,FS_NORMAL,8);$graph->legend->SetShadow('[email protected]',3);$graph->legend->SetAbsPos(10,100,'right','bottom');$legends = array('Ôèç ëèöà','Þð Ëèöà','Ñëóæåáíûé');$p1->SetLegends($legends);

Ðèñóíîê 9

include ("../jpgraph_pie3d.php");

//$p1 = new PiePlot($data);$p1 = new PiePlot3D($data);

$p1->ExplodeSlice(2);

$graph->subtitle->Set("(Äåêàáðü 2004)");$bplot->value->Show();$bplot->value->SetFont(FF_ARIAL,FS_BOLD,8);$bplot->value->SetAlign('left','center');$bplot->value->SetColor("white");$bplot->value->SetFormat('%.0f');$bplot->SetValuePos('max');

$graph->SetMarginColor('white');$graph->SetBackgroundGradient('white','lightblue', ↵↵↵↵↵

GRAD_HOR,BGRAD_PLOT);$graph->SetFrame(false);$graph->xaxis->SetFont(FF_VERDANA,FS_NORMAL,8);$graph->xaxis->SetLabelMargin(10);$graph->xaxis->SetLabelAlign('right','center');$graph->yaxis->scale->SetGrace(20);$bplot->SetShadow();$bplot->SetFillGradient('green','blue',GRAD_HOR);

Ðèñóíîê 7

<?include ("../jpgraph.php");include ("../jpgraph_pie.php");$data = array(54.36, 64.57, 6.75);$graph = new PieGraph(300,200);$p1 = new PiePlot($data);$graph->Add($p1);$graph->Stroke();?

Ðèñóíîê 8

Page 77: 026 Системный Администратор 01 2005

75№1, январь 2005

web

Наконец, убираем совершенно неуместную в данномслучае рамку:

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

Дополнительные возможности

КэшированиеЛюбой программист, работавший с библиотекой GD, зна-ет, как сильно генерация изображений потребляет систем-ные ресурсы. Если подобный график требуется создаватьраз в сутки – ничего страшного, но если в вашем офиседесяткам менеджеров требуются эти данные ежеминутно,создание графиков на лету порождает серьёзные пробле-мы с производительностью. Поэтому нельзя переоценитьещё одну впечатляющую возможность JpGraph – управля-емое кэширование изображений. Под этим термином здесьподразумевается сохранение созданного изображения насервере, на заранее заданный период времени. В самомделе, данные по ежедневному трафику обновляются раз всутки, соответственно более одного раза за 24 часа созда-вать изображение не имеет смысла. Для этого в объявле-нии нового класса указываем (кроме размеров графа) имяфайла, в котором будет сохранено изображение, и периодактуальности данного кэша в минутах:

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

Сообщения об ошибкахЕсли при обращении к какому-либо объекту или методубиблиотеки была допущена ошибка, в браузер вместо изоб-ражения отправляется графическое сообщение об ошиб-ке, аналогичное показанному на рис. 10.

Для чего это нужно? Всё просто. Основной способ пе-редачи изображений, созданных JpGraph, – использование

$p1->SetSliceColors(array('skyblue3','yellow3','darkred'));

$graph->SetFrame(false);

Ðèñóíîê 10

$graph = new Graph(450, 200, "traf�, 1464, true);

тега <img>. Если бы не этот механизм, в случае возникно-вения вышеописанной ошибки в браузер выводилось быне привычное для разработчика сообщение, а рамка отсут-ствующего рисунка, которая, разумеется, жизнь програм-мисту никак не облегчает. Более того, при работе с биб-лиотекой имеет смысл писать свои обработчики ошибок сграфическим выводом (благо её возможности это вполнепозволяют) к таким распространённым сбоям, как неудач-ный запрос к базе данных или неполадки при работе с фай-ловой системой.

Что в перспективеБиблиотека JpGraph живёт и развивается, обрастая новы-ми модулями. Неожиданное препятствие на пути её исполь-зования возникло в связи с переходом разработчиков напятую версию языка PHP с совершенно другой объектноймоделью. Это общая проблема любых ОО-библиотек, за-точенных под PHP 4. Язык обрёл новые возможности, но,как это нередко бывает, потерял частично обратную совме-стимость.

Так, уже первый пример из скрипта tessuit.php на новомдвижке выдаёт ошибку. Что делать? Можно, конечно, под-править код библиотеки (причём, скорее всего, отказавшисьот некоторых возможностей), но можно и немного подож-дать. Создатели JpGraph держат руку на пульсе прогресса,и уже доступна альфа-версия библиотеки JpGraph 2, ори-ентированная на пятую версию PHP (вернее, на новуюобъектную модель). Мне кажется, что внесенные измене-ния не будут препятствовать разработчикам, а напротив,помогут освоить новые горизонты.

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

Как уже упоминалось, JpGraph – не единственное сред-ство для работы с графикой на PHP. Широко распростра-нены такие инструменты, как мощнейший по возможнос-тям, но, к сожалению, коммерческий пакет для работы сделовой графикой ChartDirector, или библиотека по работес готовыми изображениями ImageMagic.

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

При написании данного материала были использова-ны статья Александра Шиляева «JpGraph и русский язык»(http://detail.phpclub.ru/article/jpgraph_ru) и перевод руковод-ства по Jpgraph, выполненный Екатериной Жемойтук.

Ðèñóíîê 11

Page 78: 026 Системный Администратор 01 2005

76

bugtraq

Отказ в обслуживаниив MaxDB Web AgentПрограмма: MySQL MaxDB Web Agent версии до 7.5.0.21,SAP DB Web Agent.Опасность: Высокая.Описание: Две уязвимости в MySQL MaxDB Web Agent иSAP DB Web Agent позволяют удаленному пользователювызвать отказ в обслуживании.

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

Уязвимость существует из-за недостаточной фильтра-ции данных в HTTP-заголовках. Удаленный пользовательможет с помощью специально сформированных HTTP-за-головков вызвать отказ в обслуживании приложения.URL производителя: http://www.mysql.com/products/maxdb.Решение: Установите обновление: http://dev.mysql.com/downloads/maxdb/7.5.00.html.

Выполнение произвольного кодав Kerberos 5 в библиотеке libkadm5srvПрограмма: krb5-1.3.5 и более ранние версии.Опасность: Высокая.Описание: Обнаружено переполнение буфера в Kerberos 5в административной библиотеке libkadm5srv при обработ-ке истории паролей. Удаленный пользователь может вы-полнить произвольный код на уязвимом KDC-хосте.

Уязвимость обнаружена в функции add_to_history() фай-ла src/lib/kadm5/srv/svr_principal.c. При определенной полити-ке безопасности паролей злоумышленник может выполнитьпроизвольный код на KDC (Key Distribution Center)-хосте.URL производителя: http://web.mit.edu/kerberos/advisories/MITKRB5-SA-2004-004-pwhist.txtРешение: Установите патч: http://www.mozilla.org/products/mozilla1.x и http://web.mit.edu/kerberos/advisories/2004-004-patch_1.3.5.txt.

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

Выполнение произвольного кодав HP-UX ftpd debug loggingПрограмма: HP-UX 11.00, 11.04, 11.11, 11.22.Опасность: Высокая.Описание: Обнаружено переполнение буфера в HP-UX ftpd.Удаленный атакующий может выполнить произвольный кодна уязвимой системе.

Уязвимость существует, если ftpd-демон сконфигуриро-ван посредством /etc/inetd.conf и ведет лог отладки с пара-метром v (конфигурация по умолчанию). Удаленный атаку-ющий может послать демону специально сформированнуюкоманду, вызвать переполнение стека и выполнить произ-вольный код на уязвимой системе с привилегиями ftpd-про-цесса. Для эксплуатации этой уязвимости не требуется ав-торизация на сервере.URL производителя: http://www.hp.com.Решение: Установите патчи с сайта производителя.

Удаленный отказ в обслуживаниив службах ITS, CME и SRST на Cisco IOSПрограмма: Cisco IOS 12.1YD, 12.2T, 12.3 и 12.3T.Опасность: Высокая.Описание: Обнаружен отказ в обслуживании в Cisco IOS,сконфигурированной с поддержкой Telephony Service (ITS),Cisco CallManager Express (CME) или Survivable Remote SiteTelephony (SRST). ITS, CME и SRST являются службами,которые позволяют контролировать IP-телефоны с помощьюпротокола SCCP (Skinny Call Control Protocol). Удаленныйпользователь может послать специально сформированныепакеты на SCCP-порт (2000) устройства и вызвать его пе-резагрузку. Большое количество таких пакетов приведет котказу в обслуживании системы.URL производителя: http://cisco.com.Решение: Установите обновления с сайта производителя.

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

Уязвимость существует в сценарии authform.inc.php. Уда-ленный атакующий может изменить значение глобальнойпеременной $path_pre на внешний URL и выполнить произ-вольный php-сценарий на системе с привилегиями севера.URL производителя: www.phprojekt.com.Решение: Установите обновление: http://www.phprojekt.com/files/4.2/lib.zip.

Несколько уязвимостейв Sybase Adaptive Server EnterpriseПрограмма: Sybase Adaptive Server Enterprise 12.5.2 и бо-лее ранние версии.Опасность: Критическая.Описание: Обнаружено три критических уязвимости вSybase Adaptive Server Enterprise. Подробности не сообща-ются.URL производителя: http://www.sybase.com/products/databaseservers/ase.Решение: Установите исправление: http://www.sybase.com/products/informationmanagement/adaptiveserverenterprise.

Выполнение произвольного кодаNetscape Directory Server на HP-UXПрограмма: HP-UX B.11.00, B.11.11, B.11.23Опасность: Критическая.Описание: Обнаружена уязвимость в Netscape DirectoryServer на HP-UX при использовании LDAP. Удаленныйпользователь может выполнить произвольный код на уяз-вимой системе.

Уязвимость существует из-за переполнения буфера вNetscape Directory Server. Злоумышленник может вызватьотказ в обслуживании или выполнить произвольный код науязвимой системе.Решение: Установите исправления с сайта производителя.

Page 79: 026 Системный Администратор 01 2005

77№1, январь 2005

на правах рекламы

Один из важнейших классов инструментов, используемыхпри создании сайтов, – так называемые веб-сервисы, по-зволяющие дополнить сайт новыми функциями. Общеиз-вестный пример – счетчики, например, популярные в Рос-сии www.spylog.ru или www.hotlog.ru. Вы регистрируетесь,копируете на свои страницы фрагмент HTML-кода и полу-чаете доступ к подробным статистическим отчетам о посе-щаемости сайта. Другой пример – сервисы, предоставляе-мые известными поисковыми системами, такими как Googleили Yandex. С их помощью вы можете создать форму дляпоиска информации на вашем сайте.

Веб-сервисы обладают целым рядом важных досто-инств.

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

Во-вторых, авторы сервисов постоянно совершенству-ют свои продукты, и это автоматически отражается на ва-шем сайте.

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

К сожалению, на сегодня число веб-сервисов для раз-работчиков сайтов весьма ограниченно. Кроме счетчикови поисковиков, можно назвать системы перевода на дру-гие языки, такие как www.translate.ru. Но подобные реше-ния пока не завоевали популярности среди авторов сай-тов. Хотя, казалось бы, что может быть логичнее: добавитьдля иностранных посетителей кнопочку «перевести мойсайт на такой-то язык». Конечно, перевод будет «корявым».Но иногда это лучше, чем его полное отсутствие.

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

Пожалуй, самая оригинальная из них – антивируснаязащита. Множество людей заражаются вирусами черезобычные веб-страницы, легкомысленно согласившись ин-сталлировать какой-нибудь модуль ActiveX. WebWarper уда-ляет опасный код со всех просматриваемых страниц. Спра-шивается: зачем защищать посетителя на моем собствен-ном сайте, на котором никаких вирусов нет? И правда не-зачем, если сайт столь незатейлив, что на нем нет ни рек-ламы, ни ссылок на внешние ресурсы. Если же есть – ктопоручится, что посетители, уйдя по ссылке на чужой сайтили, скажем, увидев рекламу с баннерной сети, не подце-пят какой-нибудь троян или вирус? А как вы думаете, когоони в этом обвинят? Очень вероятно, что вас – особенноесли заражение произошло через рекламу или вскоре пос-ле ухода с вашей страницы.

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

Не менее ценным может оказаться сжатие данных. Стра-ницы, «пропущенные» через WebWarper, незаметно дляпользователя сжимаются в полтора-три раза (нечто вродеизвестного zip). Сейчас все больше людей переключаетсяс модемов на кабельные сети с помегабайтной оплатойтрафика. В России, увы, цены пока не настолько низкие,чтобы объемом трафика можно было пренебречь. При ак-тивной работе в Интернете за месяц можно запросто из-расходовать от нескольких сотен до нескольких тысяч руб-лей. Если на вашем сайте посетитель потратит вдвое мень-ше трафика, он это оценит.

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

Далее, WebWarper является анонимайзером. Не каждо-му сайту нужна анонимность его посетителей. Но бываютслучаи, когда уместно предложить пользователям смотретьваши страницы и сайты, на которые у вас есть ссылки, ано-нимно, не «засвечивая» свой настоящий IP. В конце кон-цов, приватность – изначальное право посетителя. Кромеулучшения сайта, WebWarper предлагает обмен ссылками:сайты, использующие его для оптимизации, попадают всписок на webwarper.net. Это неплохой способ продвиже-ния ресурса, учитывая популярность сервиса. (В открытойстатистике рейтинга SpyLOG на сегодня приведены такиеданные: ~6000 посетителей в день, 4,5 млн. посетителей завсю историю, 5-е место в группе «Бесплатные интернет-сервисы».) Главная русскоязычная страница проекта: http://webwarper.net/wwr. Возможности, аналогичные перечислен-ным, обеспечивают также некоторые другие инструменты.

Прежде всего нужно сказать про mod_gzip: бесплатныймодуль к веб-серверу Apache. Если на сервере инсталли-рован mod_gzip, то все веб-страницы автоматически сжи-маются тем же методом, что и в случае WebWarper. Эторешение – для профессионалов, хорошо ориентирующих-ся в UNIX и имеющих достаточные права для установки мо-дулей Apache. (Возможно, в будущем большинство хостинг-компаний станут инсталлировать mog_gzip изначально: тог-да эта возможность станет доступна «чайникам».)

Что касается антивирусной защиты WebWarper, то ана-логичная фильтрация может поддерживаться коммерчес-кими брандмауэрами, установленными между вашим сер-вером и внешним миром. Также существуют веб-сервисы,специализирующиеся на анонимайзинге: например, http://anonymouse.ws.

ВЕБ-СЕРВИС ДЛЯ РАЗРАБОТЧИКОВ САЙТОВ

ДАНИИЛ АЛИЕВСКИЙ

Page 80: 026 Системный Администратор 01 2005

78

hardware

В третьей части статьи рассматривается порядок использо-вания мультимедийных команд стандарта SCSI (SCSI Multi-Media Commands) для записи многосессионных CD-R/RWдисков в режиме TAO (Track-at-Once).

Работоспособность всех примеров программ была про-верена для ОС Linux, ядро 2.4.28. В ядре включены режимSCSI-эмуляции для ATAPI-устройств (SCSI host adapteremulation for IDE ATAPI devices) и поддержка SCSI Genericдрайвера. Использовались следующие модели приводовдля чтения и записи CD-R/RW и DVD-R/RW дисков:! TEAC CD-W524E 1.0E! MITSUMI CR-48XATE! _NEC CD-RW NR-9400A R800! ASUS DRW-1604P 1.09

Работа над ошибкамиПрежде чем приступить к рассмотрению основного мате-риала, устраним ошибки, допущенные во второй части ста-тьи [5]. Проблема заключается в следующем – при попыткезаписи информации с использованием привода ASUS про-грамма аварийно завершает выполнение со следующим со-общением:

Здесь Sense Key = 0x02, ASC = 0x04, ASCQ = 0x08, чтоозначает LOGICAL UNIT NOT READY, LONG WRITE INPROGRESS (устройство не готово к работе, выполняетсяоперация длинной записи). Остановка выполнения програм-мы всегда происходит на секторе номер 320. Аналогичнымобразом ведут себя приводы MITSUMI и _NEC. С приводомTEAC подобной проблемы не возникало. В чем причина этойошибки? Дело в том, что каждый привод имеет внутреннийбуфер для данных, и при записи информация сначала по-падает в этот буфер, а затем из него переносится на диск.Буфер имеет ограниченную ёмкость, определить которуюможно при помощи команды READ BUFFER CAPACITY. Фор-мат этой команды приведён на рис.1.

Если поле BLOCK установлено в 0, устройство вернётблок данных следующего формата (рис.2):

Здесь Length of the Buffer – размер буфера в байтах,Available Length of Buffer – размер неиспользуемой (доступ-ной) области буфера в байтах.

Модифицируем листинг из второй части – при записиинформации будем контролировать размер доступной об-ласти внутреннего буфера устройства при помощи функ-ции read_buff_cap():

Контроль за размером доступной области буфера бу-дет выполняться в функции write_iso, в цикле записи ин-формации (полный листинг этой функции находится в [5]):

Результат работы программы (привод ASUS):

ЗАПИСЬ ДИСКОВ CD-R/RW В LINUXЧАСТЬ 3

ВЛАДИМИР МЕШКОВ

lba - 320

Sense data: 0x70 0x00 0x02 0x00 0x00 0x00 0x00 0x0e 0x00 0x00

0x00 0x00 0x04 0x08 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00

Driver status=0x28

Cannot write image.iso

Ðèñóíîê 1. Ôîðìàò êîìàíäû READ BUFFER CAPACITY

Ðèñóíîê 2. Ôîðìàò áëîêà äàííûõ î áóôåðå óñòðîéñòâà, BLOCK = 0

__u32 read_buff_cap(){

__u8 read_buff_cap_cmd[10];__u8 data_buff[12];__u32 buff_alen = 0;memset(read_buff_cap_cmd, 0, 10);read_buff_cap_cmd[0] = 0x5C;read_buff_cap_cmd[8] = 0x0C;send_cmd(read_buff_cap_cmd, 10, SG_DXFER_FROM_DEV, ↵↵↵↵↵

data_buff,0x0C, 20);memcpy((void *)&buff_alen, data_buff + 8, 4);buff_alen = __swab32(buff_alen);printf("\tAvailable length - %u\n", buff_alen);return buff_alen;

}

int write_iso(__u8 *file_name){

....while(read(in_f, write_buff, CD_FRAMESIZE) > 0) {

read_buff_cap();printf("lba - %6d", lba1);lba = __swab32(lba1);memcpy((write_cmd + 2), (void *)&lba, 4);lba1 += 1;send_cmd(write_cmd, 10, SG_DXFER_TO_DEV, ↵↵↵↵↵

write_buff, CD_FRAMESIZE, 20);}return 0;

}

Page 81: 026 Системный Администратор 01 2005

79№1, январь 2005

hardware

Как только доступная область буфера становится рав-ной нулю, устройство на попытку передачи ему информа-ции отвечает LOGICAL UNIT NOT READY, LONG WRITE INPROGRESS. Один из вариантов решения данной пробле-мы – подождать, пока буфер устройства освободится, азатем продолжить запись, например:

Такой вариант устраивает ASUS, но MITSUMI и _NECтак просто не сдаются и, попав в цикл, не хотят его поки-дать. Спецификация SFF8090i [1] при возникновении тако-го рода ошибки требует повторить команду записи (см.п.14.48 WRITE(10) command):

Именно таким образом поступает dvdrecord. Запустивего с ключом -v, мы увидим следующую картину:

CDB – это Command Descriptor Block (дескриптор коман-дного блока), 2A – код команды WRITE_10. Зафиксировавошибку LONG WRITE IN PROGRESS, программа dvdrecordв соответствии с требованием спецификации повторно по-сылает устройству команду записи.

Исходя из вышеизложенного, внесём исправления втекст программы для записи ISO-образа на CD-R/RW диск.Изменениям подвергнутся функция посылки пакетной ко-манды устройству send_cmd() и функция записи write_iso:

Текст функции write_iso() целиком приводить не будем,рассмотрим только ключевой фрагмент – посылку устрой-ству командного пакета:

Команда WRITE_10 будет посылаться устройству до техпор, пока не будет успешно выполнена или не произойдетошибка, отличная от SK/ASC/ASCQ = 02/04/08 «NOT READY.LONG WRITE IN PROGRESS».

Исходный текст утилиты, выполняющей запись данныхна CD-R/RW диск находится по адресу http://bob.netport.com.ua/iso2сd.tar.gz. На этом закончим изучение односессион-ных CD-дисков и рассмотрим, что нужно сделать для того,чтобы создать многосессионный диск.

Запись многосессионного дискаДля создания многосессионного диска необходимо присво-ить полю Multi-session страницы параметров режима записи

Available length - 1267712

lba - 0 Available length - 1175552

lba - 1 Available length - 1173504

lba - 2 Available length - 1171456

........

lba - 317 Available length - 526336

lba - 318 Available length - 524288

lba - 319 Available length - 0

lba - 320

Sense data: 0x70 0x00 0x02 0x00 0x00 0x00 0x00 0x0e 0x00 0x00

0x00 0x00 0x04 0x08 0x00 0x00 0x00 0x00 0x00 0x00

0x00 0x00

Driver status=0x28

Cannot write image.iso

while(read_buff_cap() == 0) continue;

While writing is occurring, if WRITE (10) command or WRITE (12)

command cannot be terminated immediately due to insufficient buffer

capacity, the logical unit may terminate the WRITE command with

CHECK CONDITION status, 2/04/08 LOGICAL UNIT NOT READY,

LONG WRITE IN PROGRESS and the host shall issue the same WRITE

command again. After logical unit becomes ready due to sufficient buffer

capacity for the WRITE command, the WRITE command shall be

performed normally.

Executing 'write_g1' command on Bus 0 Target 1,

Lun 0 timeout 200s

CDB: 2A 00 00 00 3A 01 00 00 1F 00

dvdrecord: Input/Output error, write_g1: scsi sendcmd: no error

CDB: 2A 00 00 00 3A 01 00 00 1F 00

Status: 0x2 (CHECK CONDITION)

Sense buffer: 70 00 02 00 00 00 00 0E 00 00 00 00

04 08 00 00

Sense Key: 0x2 Not Ready, Segment 0

Sense Code: 0x04 Qual 0x08 (logical unit not ready,

Long write in progress) Fru 0x0

Sense flags: BLK 0 (not valid)

cmd finished after 0x000 s timeout 200s

Executing 'write_g1' command on Bus 0 Target 1,

Lun 0 timeout 200s

CDB: 2A 00 00 00 3A 01 00 00 1F 00

cmd finished after 0x000 s timeout 200s

int send_cmd(__u8 *cmd, __u8 cmdlen, int direction, ↵↵↵↵↵__u8 *data, __u32 datalen, unsigned int timeout)

{sg_io_hdr_t io_hdr;__u8 sense_buffer[32];

#define SK sense_buffer[2]#define ASC sense_buffer[12]#define ASCQ sense_buffer[13]

memset(&io_hdr, 0, sizeof(sg_io_hdr_t));io_hdr.interface_id = 'S';io_hdr.cmd_len = cmdlen;io_hdr.mx_sb_len = sizeof(sense_buffer);io_hdr.dxfer_direction = direction;io_hdr.dxfer_len = datalen; // ðàçìåð äàííûõio_hdr.dxferp = data; // óêàçàòåëü íà áëîê äàííûõio_hdr.cmdp = cmd;io_hdr.sbp = sense_buffer;io_hdr.timeout = timeout * 1000;if(ioctl(sg_fd, SG_IO, &io_hdr) < 0) {

perror("SG_IO ioctl");return -1;

}if((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) {

if(io_hdr.sb_len_wr > 0) {/* Åñëè SK/ASC/ASCQ == 02/04/08 (Not Ready. Long Write* in Progress), òî íåîáõîäèìî ïîâòîðèòü êîìàíäó WRITE_10*/

if((SK == NOT_READY) && (ASC == 0x04) && ↵↵↵↵↵(ASCQ == 0x08)) return 1;syslog(LOG_INFO,"Command: 0x%02X", io_hdr.cmdp[0]);syslog(LOG_INFO,"Sense data (SK/ASC/ASCQ): ↵↵↵↵↵

0x%02X/0x%02X/0x%02X",SK,ASC,ASCQ);}if(io_hdr.masked_status)

syslog(LOG_INFO, "SCSI status = 0x%x\n", ↵↵↵↵↵io_hdr.status);

if(io_hdr.host_status)syslog(LOG_INFO, "Host status = 0x%x\n", ↵↵↵↵↵

io_hdr.host_status);if(io_hdr.driver_status)

syslog(LOG_INFO, "Driver status = 0x%x\n", ↵↵↵↵↵io_hdr.driver_status);

return -1;}return 0;

}

while(1) {ret = send_cmd(write_cmd, 10, SG_DXFER_TO_DEV, ↵↵↵↵↵

write_buff, BUFF_SIZE, 20);if(ret == 1) continue; // LONG WRITE IN PROGRESSif(ret == 0) break;if(ret < 0) return -1; // îøèáêà çàïèñè!

}

Page 82: 026 Системный Администратор 01 2005

80

hardware

значение 11b (см. [1, 2]). В этом случае при формированииLead-In-области указатель B0 таблицы содержания диска(Table of Contents, TOC) будет содержать координаты началаследующей области программ (формат TOC и пример чтениябыли рассмотрены в [3]). Формирование образа, который бу-дет записан первым, ничем не отличается от формированияобраза для односессионного диска. Каждый новый записы-ваемый образ должен содержать ссылку на предыдущий, что-бы драйвер файловой системы мог собрать содержимое всехсессий в единое целое. Для этого при формировании ISO-образа (кроме первого) в опциях утилиты mkisofs необходи-мо указать стартовые координаты первого трека последнейсессии и координаты следующей возможной области про-грамм. Назовем эти координаты A и B. При помощи cdrecordзначения A и B определяются следующим образом:

где X, Y и Z – это координаты устройства (msinfo – это со-кращение от multi-session information). После выполнениякоманды мы получим два числа – искомые стартовые ко-ординаты. Эти числа необходимо указать в соответствую-щих опциях mkisofs (опция -C, см. man mkisofs) при подго-товке образа для записи.

Рассмотрим два способа определения значений A и B.Оба способа подразумевают чтение таблицы содержаниядиска (TOC), только в первом случае мы читаем «сырую»таблицу (RAW TOC), в во втором – информацию о сессиях.

При помощи функции read_raw_toc() прочитаем RAW TOC:

Пересчёт координат из MSF-формата в LBA выполняетмакрос MSF2LBA следующего вида:

Теперь возьмём диск, на котором записано три сессии,и посмотрим на результат работы функции read_raw_toc():

Указатель A0 третьей сессии (запись 12) содержит в полеPMin номер первого трека последней сессии. Это значениеравно 3. Запись 15 в полях PMin/PSec/PFrame содержит

cdrecord -dev=X,Y,Z -msinfo

/* Ôîðìàò çàïèñè TOC (ñì. [1, 2]) */typedef struct {

__u8 snum; // Session Number__u8 ctrl :4; // Control__u8 adr :4; // ADR__u8 tno; // TNO (always 0)__u8 point; // POINT__u8 min; // AMIN__u8 sec; // ASEC__u8 frame; // AFRAME__u8 zero; // 0__u8 pmin; // PMIN__u8 psec; // PSEC__u8 pframe; // PFRAME

} toc_t;int read_raw_toc(){

int i;__u8 read_toc_cmd[10];__u8 *data_buff; // ðåçóëüòàòû ÷òåíèÿ TOC__u16 toc_data_len = 0; // äëèíà çàïèñåé TOC__u32 lba;int toc_entries = 0; // ÷èñëî çàïèñåé TOCint last = 0; // íîìåð ïîñëåäíåé ñåññèètoc_t *t;data_buff = (__u8 *)malloc(0xFFFF);memset(data_buff, 0, 0xFFFF);memset(read_toc_cmd, 0, 10);read_toc_cmd[0] = READ_TOC;read_toc_cmd[2] = 2; // Format Field = 10b - RAW TOCread_toc_cmd[7] = 0xFF;read_toc_cmd[8] = 0xFF;send_cmd(read_toc_cmd, 10, SG_DXFER_FROM_DEV, ↵↵↵↵↵

data_buff, 0xFFFF, 20);/* Ðàçìåð TOC */

*((__u8 *)&toc_data_len) = data_buff[1];*((__u8 *)&toc_data_len + 1) = data_buff[0];

/* ×èñëî çàïèñåé TOC */toc_entries = (toc_data_len - 2)/11;

/* ×èñëî ñåññèé */last = data_buff[3];printf("×èñëî ñåññèé íà äèñêå - %d\n", last);t = (toc_t *)malloc(toc_data_len);memset((void *)t, 0, toc_data_len);memcpy((void *)t, data_buff + 4, toc_data_len);free(data_buff);printf("Entry\tSession\tPoint\tMin\tSec\tFrame\ ↵↵↵↵↵

tPMin\tPsec\tPFrame\tLBA\n");for(i = 0; i < toc_entries; i++) {

printf("%d\t", i);printf("%d\t", (t + i)->snum);printf("%X\t", (t + i)->point);printf("%d\t", (t + i)->min);printf("%d\t", (t + i)->sec);printf("%d\t", (t + i)->frame);printf("%d\t", (t + i)->pmin);printf("%d\t", (t + i)->psec);printf("%d\t", (t + i)->pframe);

#define PMIN(i) (t + i)->pmin#define PSEC(i) (t + i)->psec#define PFRAME(i) (t + i)->pframe#define MIN(i) (t + i)->min#define SEC(i) (t + i)->sec#define FRAME(i) (t + i)->frame#define POINT(i) (t + i)->point

if((POINT(i) == 0xC0) || (POINT(i) == 0xC1)) {printf("\n");continue;

}/* Êîîðäèíàòû íà÷àëà ñëåäóþùåé âîçìîæíîé îáëàñòè ïðîãðàìì* ñîäåðæèò óêàçàòåëü B0 â ïîëÿõ Min/Sec/Frame. Ïåðåâîäèì* ýòè êîîðäèíàòû â LBA-ôîðìàò, ñ ó÷åòîì òîãî, ÷òî ïåðåä* òðåêîì íàõîäèòñÿ Pre-gap îáëàñòü ðàçìåðîì 150 ñåêòîðîâ*/

if(POINT(i) == 0xB0) lba = MSF2LBA(MIN(i), SEC(i), ↵↵↵↵↵FRAME(i)) + 150;else lba = MSF2LBA(PMIN(i), PSEC(i), PFRAME(i));printf("%u\n", lba);

}free(t);return 0;

}

#define MSF2LBA(Min, Sec, Frame) (((Min * 60 + Sec) * 75 + ↵↵↵↵↵Frame) - 150)

Page 83: 026 Системный Администратор 01 2005

81№1, январь 2005

hardware

стартовые координаты этого трека – 5/15/35, или 23510 вLBA-формате. Координаты начала следующей возможнойобласти программ содержит указатель B0 в полях Min/Sec/Frame (запись 16) – 7/13/59 (32534 в LBA-формате).

Второй способ определения значения числа A – чтениеинформации о сессиях. Для этого в поле Format командно-го блока READ TOC/PMA/ATIP (см. спецификацию [2], табл.441) должно принять значение 1. Блок информации о сес-сиях имеет вид, представленный на рис. 3.

Здесь First и Last Complete Session Number – номерапервой и последней завершенной сессии, First Track NumberIn Last Complete Session – номер первого трека в после-дней завершенной сессии, Start Address of First Track in LastSession – стартовый адрес этого трека. Формат блока ин-формации о сессиях описывает следующая структура:

Чтение блока информации о сессиях выполняет функ-ция read_ms_info():

Осталось узнать значение числа B – стартового адресаследующей возможной области программ. Этот адрес явля-ется адресом невидимого трека (invisible track), и определитьего можно при помощи команды READ TRACK INFORMATION.Формат этой команды и пример использования был рассмот-рен в [5]. Следующая функция выполняет чтение искомогоадреса:

В результате работы двух рассмотренных функций –read_ms_info() и read_track_info() – мы получим для имеюще-гося в нашем распоряжении трехсессионного диска значе-ния чисел А и В: A = 23510 и B = 32534. Теперь можно сфор-мировать ISO-образ для записи на диск четвертой сессии:

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

Формат данных, возвращаемых устройством по этойкоманде, представлен на рис. 5.

Необходимую нам информацию содержит поле DiskStatus. Поле может принимать следующие значения:! 00b – Empty Disk, диск пустой, не содержит информации;! 01b – Incomplete Disk, незавершенный диск, на который

можно дописывать информацию;! 10b – Finalized Disk, диск завершен, информацию допи-

сывать нельзя.

Поле State of last Session описывает состояние после-дней сессии на диске. Поле может принимать следующиезначения:

Ðèñóíîê 3. Áëîê èíôîðìàöèè î ñåññèÿõ

typedef struct {__u8 res1;__u8 ctrl :4;__u8 adr :4;__u8 first_trk; // íîìåð ïåðâîãî òðåêà ïîñëåäíåé ñåññèè__u8 res2;__u32 start_addr; // ñòàðòîâûé àäðåñ òðåêà

} ms_info_t;

void read_ms_info(){

// íîìåð ïåðâîãî òðåêà ïîñëåäíåé ñåññèèint first_trk = 0;__u8 read_toc_cmd[10]; // CDB - Command Descriptor Block__u8 data_buff[12];__u32 start_addr = 0; // ñòàðòîâûé àäðåñ òðåêàms_info_t *ms_info;memset(data_buff, 0, 12);ms_info = (void *)(data_buff + 4);

/* Ôîðìèðóåì CDB */memset(read_toc_cmd, 0, 10);read_toc_cmd[0] = READ_TOC;read_toc_cmd[2] = 1; // Format = 1, ↵↵↵↵↵

Multi-session Informationread_toc_cmd[8] = 12; // ðàçìåð áëîêà äàííûõsend_cmd(read_toc_cmd, 10, SG_DXFER_FROM_DEV, ↵↵↵↵↵

data_buff, 12, 20);first_trk = ms_info->first_trk;start_addr = __swab32(ms_info->start_addr);printf("Ïåðâûé òðåê ïîñëåäíåé ñåññèè - %d\n", ↵↵↵↵↵

first_trk);printf("Ñòàðòîâûé àäðåñ òðåêà - %u\n", start_addr);return;

}

__u32 read_track_info(int trk_num){

__u8 read_track_info_cmd[10];__u8 data_buff[40];__u32 lba = 0;memset(data_buff, 0, 40);memset(read_track_info_cmd, 0, 10);read_track_info_cmd[0] = 0x52;read_track_info_cmd[1] = 1;read_track_info_cmd[5] = trk_num; // 0xFF - ↵↵↵↵↵

invisible trackread_track_info_cmd[8] = 40;send_cmd(read_track_info_cmd, 10, ↵↵↵↵↵

SG_DXFER_FROM_DEV, data_buff, 40, 20);memcpy((void *)&lba, (void *)(data_buff + 8), 4);return __swab32(lba);

}

mkisofs -R -J -C 23510,32534 -M [èìÿ ôàéëà óñòðîéñòâà] ↵↵↵↵↵-o track-04.iso [âõîäíîé ôàéë]

Ðèñóíîê 4. Ôîðìàò êîìàíäû READ DISK INFORMATION

Page 84: 026 Системный Администратор 01 2005

82

hardware

! 00b – пустая сессия (Empty Session);! 01b – незавершенная сессия (Incomplete Session);! 11b – сессия завершена (Complete Session).

Установленный в «1» бит Erasable свидетельствует отом, что в приводе находится диск CD-RW, DVD-RAM, DVD-RW или DVD+RW.

Назначение остальных полей приведено в специфика-ции [2], п. 6.27 «READ DISK INFORMATION Command».

Чтение информации о диске выполняет функция read_disk_info():

Если диск позволяет выполнить запись новой сессии(disk_status == 1), то алгоритм работы программы следую-щий:! при помощи системного вызова stat определяется раз-

мер записываемого образа в блоках по 2048 байт (ре-жим Data Mode 1):

! резервируется место для нового трека (командаRESERVE TRACK), при этом размер трека равен разме-ру файла-образа в блоках. Формат команды RESERVETRACK был рассмотрен в [5]:

! при помощи команды READ TRACK INFORMATION оп-ределяется стартовый адрес зарезервированного тре-ка, и начиная с этого адреса на диск выполняется за-пись данных.

Полный текст программы для записи многосессионныхдисков находится по адресу: http://bob.netport.com.ua/iso2cd_multi.tar.gz.

Литература:1. ATAPI DVD Devices, ftp://ftp.seagate.com/sff/INF-8090.PDF2. SCSI MultiMedia Command Set, http://www.t10.org/ftp/t10/

drafts/mmc5/mmc5r01.pdf.3. Мешков В. Пакетные команды интерфейса ATAPI. – Жур-

нал «Системный администратор», № 9(22), сентябрь2004 г. – 70-84 с.

4. Мешков В. Запись дисков CD-R/RW в Linux. Часть 1. –Журнал «Системный администратор», № 11(24), ноябрь2004 г. – 56-62 с.

5. Мешков В. Запись дисков CD-R/RW в Linux. Часть 2. –Журнал «Системный администратор», № 12(25), де-кабрь 2004 г. – 68-75 с.

int read_disk_info(){

__u8 read_disk_info_cmd[10];__u8 data_buff[34];memset(data_buff, 0, 34);memset(read_disk_info_cmd, 0, 10);read_disk_info_cmd[0] = 0x51;read_disk_info_cmd[8] = 34;send_cmd(read_disk_info_cmd, 10, SG_DXFER_FROM_DEV, ↵↵↵↵↵

data_buff, sizeof(data_buff), 20);switch(data_buff[2] & 3) {case(0):

printf("Äèñê ïóñòîé\n");break;

case(1):printf("Ìîæíî äîïèñûâàòü èíôîðìàöèþ\n");break;

case(2):printf("Çàïèñü íåâîçìîæíà\n");break;

default:break;

}

return 0;}

#include <sys/stat.h>struct stat s;memset((void *)&s, 0, sizeof(struct stat));

/* argv[1] - èìÿ ôàéëà-îáðàçà, ïåðåäàåòñÿ* â êîìàíäíîé ñòðîêå ïðîãðàììû*/

if(stat(argv[1], &s)) {perror("stat");exit(errno);}

/* Ðàçìåð ôàéëà-îáðàçà â áëîêàõ */track_size = s.st_size/CD_FRAMESIZE;

void reserv_track(__u32 track_size){

__u8 reserv_track_cmd[10];__u32 size = 0;memset(reserv_track_cmd, 0, 10);reserv_track_cmd[0] = 0x53;size = __swab32(track_size);memcpy((void *)(reserv_track_cmd + 5), ↵↵↵↵↵

(void *)&size, 4);send_cmd(reserv_track_cmd, 10, SG_DXFER_NONE, ↵↵↵↵↵

NULL, 0, 20);return;

}Ðèóíîê 5. Áëîê èíôîðìàöèè î äèñêå, âîçâðàùàåìûé ïî êîìàíäåREAD DISK INFORMATION

Page 85: 026 Системный Администратор 01 2005

bugtraq

83№1, январь 2005

Обход ограничений во многихперсональных межсетевых экранахПрограмма: ZoneAlarm/ZoneAlarm Pro версии до 5 ветки,Kerio все версии, Agnitium Outpost Firewall все версии,Kaspersky Anti-Hacker все версии, Look ’n’ Stop все версии,Symantec’s Norton Personal Firewall все версии, Panda PlatinumInternet Security все версии, Omniquad Personal Firewall всеверсии.Опасность: Высокая.Описание: Обнаружена уязвимость во многих персональ-ных межсетевых экранах. Злоумышленник может обойтиограничения безопасности и выполнить произвольные дей-ствия на уязвимой системе.

Уязвимость обнаружена в приложениях, которые исполь-зуют ярлыки или предоставляют графический интерфейсдля изменения текущих настроек межсетевого экрана и незапрашивают ввод пароля. Злоумышленник может с помо-щью троянской программы или другого приложения, спо-собного использовать «Sending Key Method» и «MouseControl Method», обойти ограничения безопасности.

Большинство брандмауэров используют опцию запоми-нания настроек и автоматически генерируют соответству-ющие правила, что позволяет злоумышленнику лишь од-нократно использовать эту уязвимость.Решение: Исправление существует лишь для ZoneAlarm (5версия не уязвима).

Удаленное выполнение произвольногокода в HTML Help ActiveX controlПрограмма: Microsoft Windows 2000 Service Pack 3, MicrosoftWindows 2000 Service Pack 4, Microsoft Windows XP ServicePack 1, Microsoft Windows XP Service Pack 2, MicrosoftWindows Server 2003.Опасность: Критическая.Описание: Уязвимость в HTML Help ActiveX control позво-ляет удаленному пользователю раскрыть чувствительнуюинформацию или выполнить произвольный код на уязви-мой системе.

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

Удаленное выполнениепроизвольного кода в Indexing Serviceв различных версиях Microsoft WindowsПрограмма: Microsoft Windows XP Service Pack 1, MicrosoftWindows Server 2003.Опасность: Критическая.Описание: Уязвимость в Indexing Service позволяет удален-ному пользователю выполнить произвольный код на уяз-вимой системе.

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

Уязвимость может эксплуатироваться удаленно, так какСлужба индексирования может быть сконфигурированачерез Internet Information Service. Патч также выпущен дляWindows 2000 Server, однако эта система неуязвима. Под-робнее смотрите соответствующее уведомление.URL производителя: http://www.microsoft.com.

Отказ в обслуживании при обработкеWCCP-сообщений в SquidПрограмма: Squid 2.5.Опасность: Средняя.Описание: Уязвимость обнаружена в Squid при обработкеWCCP-сообщений. Удаленный пользователь может вызватьотказ в обслуживании.

Удаленный пользователь может послать специальносформированный WCCP_I_SEE_YOU-пакет с значениемполя number of caches, не равным промежутку 1-32 и под-менным адресом. Если WCCP разрешен на системе (WCCPне является настройкой по умолчанию), то Squid аварийнозавершит свою работу.URL производителя: http://www.squid-cache.orgРешение: Установите патч от производителя: http://www.squ id -cache .o rg /Vers ions /v2 /2 .5 /bugs /squ id -2.5.STABLE7-wccp_denial_of_service.patch.

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

Переполнение буфера в службе LDAPна Hitachi Directory ServerПрограмма: Hitachi Directory Server 2Опасность: Средняя.Описание: Уязвимость в службе LDAP на Hitachi DirectoryServer позволяет злоумышленнику выполнить произволь-ный код на целевой системе.

Удаленный пользователь может отослать специальносформированный LDAP-пакет целевой службе, вызвать пе-реполнение буфера и аварийно завершить работу LDAP-службы или выполнить произвольный код.URL производителя: http://www.hitachi-support.com.Решение: Исправление описано по адресу: http://www.hitachi-support.com/security_e/vuls_e/HS05-001_e/01-e.html.

Получение административных привилегийв Oracle Database ServerПрограмма: Oracle Database Server 9i, 10g.Опасность: Средняя.Описание: Уязвимость позволяет удаленному авторизован-ному пользователю получить административные привиле-гии на сервере баз данных.

Удаленный авторизованный пользователь может вне-дрить PL/SQL-команды и получить административный дос-туп к базам данных.URL производителя: http://www.oracle.com.Решение: Установите обновление с сайта производителя.

Page 86: 026 Системный Администратор 01 2005

84

образование

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

ATutor является системой управления обучения – Web-based Learning Content Management System (LCMS). Исполь-зование которой позволяет преподавателям легко органи-зовывать различные курсы обучения. Студенты же получа-ют адаптивную и простую среду обучения. Администрато-ру новая система особых хлопот не доставит. Внешний видможно сменить буквально за пару щелчков мышки, доступ-ность исходного кода и открытые инструменты, применяе-мые для построения сервера курсов, позволяют в случаекрайней необходимости внести и более серьезные измене-ния. Кроме того, с самого начала разработчиками был взяткурс на поддержку продуктом всевозможных стандартов,что позволило бы в будущем легко интегрировать и сто-ронние разработки.

Так, ATutor – первая LCMS, полностью подчиняющаясяспецификации доступности W3C WCAG (Web ContentAccessibility Guidelines, http://www.w3.org/WAI/WCAG1AA-Conformance) 1.0 уровня AA+. Соответствие этим рекомен-дациям позволяет сделать ресурс доступным, в том числеи для пользователей с различными нарушениями здоровья.Хотя стоит отметить, что с 19 ноября 2004 года доступнаследующая версия спецификации W3C WCAG 2.0 (http://www.w3.org/TR/2004/WD-WCAG20-20041119), поэтому в пос-леднее время ведется работа для достижения полного со-ответствия стандарту.

Также соответствие спецификациям W3C XHTML 1.0 га-рантирует, что ATutor при необходимости обеспечит рабо-ту или интеграцию с любыми другими приложениями, под-держивающими стандарты. Некоторые такие приложениядоступны на сайте проекта, разговор о них пойдет далее.Чтобы иметь возможность использовать курсы, написан-ные для других e-learning обучающих систем, система под-держивает спецификации IMS (Instructional ManagementStandards, http://www.imsproject.org) и SCORM (SharableContent Object Reference Model, http://www.adlnet.org). В на-стоящий момент основным источником сторонних курсовдля пользователей ATutor является TILE learning objectsrespository (http://barrierfree.ca/tile). Хотя инструменты для ра-боты с ним еще несовершенны, пока реализован поиск иимпорт, без проверки целостности. Продукт распространя-ется по лицензии GPL, домашняя страница проекта http://www.atutor.ca/atutor.

Установка сервера курсовУстановка, как и процесс обновления системы, не являет-ся сложной. Для возможности дальнейшей работы необхо-димо будет пройти шесть шагов, каждый из которых дол-жен закончиться успешно. Первоначально необходимоиметь компьютер с:! Веб-сервером Apache 1.3.x (Apache 2.x разработчика-

ми не рекомендуется).! PHP версии > 4.2.0 (лучше > 4.3.0) с включенной под-

держкой zlib и MySQL.! MySQL версий > 3.23.x и > 4.0.12 (версии 4.1.x и 5.x офи-

циально не поддерживаются).

Как видите, об операционной системе в требованиях несказано ни слова. И это правильно, т.к. все вышеперечис-ленные компоненты могут работать как на различных ва-риантах UNIX-систем, так и под управлением MS Windows.Я тестировал работу сервера ATutor на компьютере с уста-новленной Windows XP Professional, и в нескольких дистри-бутивах GNU/Linux, включая и такой экзотический в нашихкраях, как Fermi Linux. Но в качестве рабочей платформыбыл выбран проверенный временем Slackware 9.1 с неко-торыми обновлениями.

На момент написания статьи была актуальна ATutor-1.4.2. Размер системы составлял чуть более 1 Мб. Для ус-тановки требуется распаковать архив в корневой каталогдокументов веб-сервера. Например, для Slackware.

После чего в текущем каталоге образуется подкаталогATutor. Теперь запускаем веб- и MySQL-серверы и набира-ем в строке браузера http://IP_your_server/[path_to_atutor]/ATutor/. В качестве клиентского браузера хорошо подходятбольшинство из базирующихся на коде Mozilla (Netscape7+, Firefox, Galeon) и Microsoft Internet Explorer 4+, а вот какбудет выглядеть страница в Opera и Konqueror, уже зави-сит от версии. Если Apache настроен правильно, то вы уви-дите картинку (рис. 1) и для продолжения установки доста-точно нажать на ссылку.

Если вместо данной страницы будет выведен исходныйтекст документа или показано содержимое каталога, тоизмените настройки в файле httpd.conf. В первом случае вфайле должны быть раскомментированы следующие стро-ки (возможно, они будут находиться во внешнем файле,подключаемом инструкцией Include).

ОБУЧЕНИЕ ПРИ ПОМОЩИ ATutorОБУЧЕНИЕ ПРИ ПОМОЩИ ATutorСЕРГЕЙ ЯРЕМЧУК

# cd /var/www/htdocs# tar xzvf /home/source/ATutor-1.4.2.tar.gz

Ðèñóíîê 1

Page 87: 026 Системный Администратор 01 2005

85№1, январь 2005

образование

Во втором случае в директиве DirectoryIndex долженбыть обязательно указан параметр index.php.

Если что-то не получается, в Интернете достаточно мно-го материала на тему LAMP (Linux+Apache+MySQL+PHP).

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

Установка проблем вызвать не должна, так как в случаенеудачи программа дает вполне внятную подсказку. Напри-мер, смотрите рис. 3 и рис. 4, система предупреждает, чтоне может записать информацию в файл config.inc.php и пред-лагает изменить параметры доступа к данному файлу сhmoda+rwx (по окончанию процесса установки все надо вернутьна свои места chmod a-xw). Теперь можно зайти на сервер,использовав введенный во время установки логин и пароль.

Что умеет ATutor?ATutor поддерживает три типа пользователей – админист-

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

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

Система поддерживает три вида курсов: публичные –доступные всем, защищенные – требующие регистрации, ичастные, требующие кроме регистрации подтверждения до-ступа инструктором. Курсы, доступные текущему пользова-телю, отображаются в «Browse Courses». Экспорт содержа-ния возможен в IMS/SCORM-совместимые пакеты, которыемогут просматриваться автономно и/или добавляться в дру-гую e-learning систему. Для связи с учениками реализовано

LoadModule php4_module libexec/libphp4.soAddModule mod_php4.cAddType application/x-httpd-php .php

DirectoryIndex index.html index.php

Ðèñóíîê 2

Page 88: 026 Системный Администратор 01 2005

86

образование

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

AChecker – экспериментальная разработка AdaptiveTechnology Resource Center (http://atrc.utoronto.ca), позволя-ющая определять доступность ресурсов в сети.

ACollab (http://www.atutor.ca/acollab) представляет собойединую рабочую среду для групп пользователей, занимаю-щихся совместными исследованиями и разработкой доку-ментации. Кстати, он может использоваться и как самосто-ятельное приложение.

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

По умолчанию интерфейс только английский. Для осталь-ных языков используются языковые модули, которые уста-навливаются отдельно. Модуль русского языка лежит по ад-ресу http://prdownloads.sourceforge.net/atutor/atutor.1.4.2.ru?download. Хотя, по данным на сайте, перевод еще не закон-чен. Если нужного языка в списке нет и есть желание пере-вести, то перед началом работы следует ознакомиться сдокументом «Thing You Should Know Before Translating», на-ходящимся на сайте проекта.

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

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

Кроме упомянутых в статье add-on, есть еще и другиеразработки, их интеграция в ATutor планируется в будущем.Одной из них является ATalker (http://www.atutor.ca/atalker),представляющий собой text-to-speech-сервер, основой ко-торого послужил festival (http://www.cstr.ed.ac.uk/projects/festival). В ATutor он будет использоваться для озвучки уро-ков, что может быть полезно, например, ученикам со сла-бым зрением.

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

Более полную информацию о продукте можно найти насайте проекта.

Ðèñóíîê 3

Page 89: 026 Системный Администратор 01 2005

87№1, январь 2005

образование

Ðèñóíîê 4

Ðèñóíîê 5

Page 90: 026 Системный Администратор 01 2005

88

образование

Надежность NTFS – это одно, а ошибочно удаленные фай-лы – совсем другое. Файловая система, даже такая мощ-ная, как NTFS, бессильна защитить пользователя от себясамого. Но вот предусмотреть «откат» последних выпол-ненных действий она вполне может (тем более что тран-закции и журналирование в NTFS уже реализованы). Досовершенства остается всего лишь шаг. Увы! Microsoft топ-чется на месте, все никак не решаясь его сделать (задел,оставленный для будущих версий?). «Защита» от непред-намеренного удаления реализована исключительно на ин-терфейсном уровне, а это не только неудобно, но и нена-дежно. Хорошо, если удаленный файл сохранился в «Кор-зине», но что делать, если там его нет? Эта статья расска-зывает о методах ручного восстановления файлов, в томчисле и с отсутствующей файловой записью, когда «покой-ника» приходится собирать по кластерам.

Внутри FILE_DISPOSITION_INFORMATIONIRP_MJ_SET_INFORMATION/ FILE_DISPOSITION_INFOR-MATION – это пакет, посылаемый драйверу при удалениифайла (имейте это в виду при дизассемблировании). Что-

бы уметь восстанавливать удаленные файлы, необходимоотчетливо представлять, что происходит в процессе удале-ния файла с NTFS-раздела, а происходит при этом следую-щее:! корректируется файл /$MFT:$BITMAP, каждый бит ко-

торого определяет «занятость» соответствующей фай-ловой записи (FILE Record) в MFT («0» – запись не ис-пользуется);

! корректируется файл /$BITMAP, каждый бит которогоопределяет «занятость» соответствующего кластера(«0» – кластер не используется);

! файловые записи, соответствующие файлу, помечают-ся как удаленные (поле FLAG, находящееся по смеще-нию 16h от начала FILE Record сбрасывается в ноль);

! ссылка на файл удаляется из двоичного дерева индек-сов (технические подробности этого животрепещущегопроцесса здесь опускаются, поскольку восстановить таб-лицу индексов вручную сможет только гуру, да и зачем?в NTFS индексы играют вспомогательную роль – прощепереиндексировать директорию заново, чем восстанав-ливать сбалансированное B*tree-дерево);

ВОССТАНОВЛЕНИЕ NTFS – UNDELETE СВОИМИ РУКАМИ

КРИС КАСПЕРСКИ

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

Но ведь за ними остается выжженная земля!Если OS/360 оставила за собой шлейф идей, людей,

что оставляет за собой Windows?

Алексей Бабий«Из жизни первобытных программистов»

Продолжая говорить о NTFS, сегодня мы рассмотримтехнику восстановления удаленных файлов с помощьюпростейшего дискового редактора (типа Disk Probe)и утилиты chkdsk, а также дадим несколько советовпо поводу создания собственного инструментария,который может быть запрограммирован на любомязыке, имеющем доступ к win32 API.

Page 91: 026 Системный Администратор 01 2005

89№1, январь 2005

образование

! обновляется атрибут $STANDART_INFORMATION ката-лога, хранившего удаляемый файл (время последнегодоступа и т. д.);

! в /$LogFile обновляется Sequence Number (изменения,происходящие в журнале транзакций мы не рассматри-ваем);

! Update Sequence Number следующих файловых записейувеличивается на единицу: сам удаляемый файл, теку-щий каталог, /$MAF, /$MFT:$BITMAP, /$BITMAP, /$BOOT,/$TRACKING.LOG.

Каталоги удаляются практически точно так же, как ифайлы (с точки зрения файловой системы, каталог тожефайл, только особый – с двоичным B*tree-деревом индек-сов внутри).

Ни в том, ни в другом случае физического удаления фай-ла не происходит, и он может быть легко восстановлен дотех пор, пока не будет затерта принадлежащая емуFILE Record, хранящая резидентное тело файла или спи-сок отрезков (run-list) нерезидентного содержимого. Утра-та FILE Record очень неприятна, поскольку в этом случаефайл придется собирать по кусочкам руками, и чем силь-нее он фрагментирован – тем сложнее эта задача. В отли-чие от FAT, NTFS не затирает первого символа именем фай-ла, чем значительно упрощает свое восстановление.

Автоматическое восстановление файлаУтилиты, восстанавливающие удаленные файлы, не вхо-дят в комплект штатной поставки Windows NT, и их прихо-дится приобретать отдельно (а ведь в MS-DOS такая ути-лита была!). Опасаясь угробить файловую систему оконча-тельно, большинство из них избегает прямой записи надиск – вместо этого вам предлагается считать удаленныйфайл и переписать его в другое место (но только не на самвосстанавливаемый раздел). Не слишком-то удачное реше-ние! А если на остальных дисках свободного места нет иливосстанавливаемый диск имеет всего лишь один логичес-кий раздел?

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

С другой стороны, утилиты, вносящие изменения непос-редственно в саму NTFS, рискуют серьезно повредить дис-ковый том, после чего ему не помогут даже профессиона-лы. Настоящие хакеры не доверяют никакому коду, кромесвоего собственного, особенно если исходные тексты не-доступны, а документация туманна и двусмысленна. Раз-личные версии NTFS отличаются друг от друга. Последниерадикальные изменения произошли в Windows XP (NTFSверсии 3.1) – массив последовательности обновления

(Update Sequence Number-n-Array) переместился на шестьбайтов вперед, а его место было отдано под выравниваниеи поле номера текущей файловой записи (Number of thisMFT Record). Восстанавливающая утилита должна не толь-ко поддерживать вашу версию файловой системы, но и бе-зошибочно отличать ее ото всех остальных (при обновле-нии Windows 2000 до Windows XP обновления файловой си-стемы не происходит вплоть до переформатирования дис-ка). Попробуй потом объясни начальству, «это не я, это онавсе испортила!».

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

Ручное восстановление файлапо FILE RecordНачнем с простейшего. Файл только что удален, и принад-лежащая ему FILE Record еще не затерта. Как найти его надиске? Существует два способа – «теоретический» и «прак-тический». Теоретический исключительно надежен, но тре-бует дополнительных телодвижений, которых можно избе-жать, приняв ряд практических допущений.

Теоретически: извлекаем из boot-сектора указатель наMFT, извлекаем из нее первую запись (она описывает $MFT),находим атрибут $DATA (80h), декодируем список отрезков(data runs) и последовательно читаем все записи в MFT,анализируя содержимое атрибута $FILE_NAME (30h) – имяфайла (кстати, таких атрибутов у файла может быть не-сколько). Этот же атрибут хранит ссылку на материнскуюдиректорию – если несколько одноименных файлов удале-ны из различных директорий, мы должны разобраться, ка-кой из них наш.

Практически: в девяти из десяти случаев $MFT-файл нефрагментирован и располагается практически в самом на-чале диска. Имена файлов хранятся по смещению EAh отначала сектора, в начале которого расположена сигнатура«FILE*» («FILE0» – в NTFS 3.1). Поэтому мы просто запус-каем любой дисковый редактор (например, Disk Probe изкомплекта Support Tools от Microsoft), вводим имя восста-навливаемого файла в юникоде и ищем его по смещениюEAh (в NTFS 3.1 – F0h) от начала сектора.

Ðèñóíîê 1. Óòèëèòà GetDataBack çà âîññòàíîâëåíèåì óäàëåí-íûõ ôàéëîâ

Page 92: 026 Системный Администратор 01 2005

90

образование

Когда же искомое вхождение будет найдено, смотрим:находится ли в начале сектора сигнатура «FILE*»/«FILE0»,и если нет – продолжаем поиск. Двухбайтовое поле по сме-щению 16h от начала сектора содержит флаги записи: 00h –запись не используется или была удалена, 01h – запись ис-пользуется и описывает каталог, 02h – запись использует-ся и описывает директорию. Встречаются и другие значе-ния (04h, 08h… что они обозначают – неизвестно, можетбыть, вы сможете пролить свет на этот вопрос?).

Исправляем 00h на 01h, записываем изменения и… Ни-чего не выходит?! А что вы хотели! Ведь помимо этого не-обходимо еще, во-первых, сообщить файлу /$MFT:$BITMAP,что данная MFT-запись вновь используется, во-вторых, ото-брать у файла /$BITMAP номера кластеров, принадлежа-щие восстанавливаемому файлу, в-третих, перестроитьдвоичное дерево индексов, хранящее содержимое катало-га. Первые два пункта не проблема, но вот над последнимпридется попыхтеть. Или… просто запустить chkdsk с клю-чом /F. Он самостоятельно найдет «потерянный» файл ивнесет все необходимые изменения в файловую систему.От нас потребуется только установить флаг по смещению16h в единицу, а остальное – его забота. После этих нехит-рых манипуляций файл оказывается в своем родном ката-логе. Восстановленный!

Разгребая кластерные обломкиС нерезидентными файлами, хранящими свое тело вне MFT,ситуация обстоит не так плачевно, хотя проблем тоже хва-тает. Порядок размещения файла на диске хранится в run-list внутри файловой записи в MFT (теперь уже затертой), ипотому возможен лишь контекстный поиск по содержимо-му. Запускаем диск-редактор, вводим последовательность,заведомо содержащуюся в удаленном файле, но не встре-чающуюся во всех остальных, и нажимаем «search». Дляускорения поиска можно искать только в свободном диско-вом пространстве (за это отвечает файл /$BITMAP). Извес-тные мне редакторы пренебрегают этой возможностью (азря!), однако утилиту «продвинутого» поиска несложно на-писать и самостоятельно.

Нефрагментированные файлы восстанавливаются эле-ментарно. Просто выделяем группу секторов и записыва-ем ее на диск (только ни в коем случае не на сам восста-навливаемый том!). Единственная проблема – как опреде-лить оригинальную длину? Некоторые типы файлов допус-кают присутствие «мусора» в своем хвосте (и тогда намостается следовать правилу «лучше перебрать, чем недо-брать»), а некоторые нет!

Если конец не удается определить визуально (например,pdf-файлы завершаются сигнатурой «%%EOF»), проанали-зируйте заголовок файла – среди прочей полезной инфор-мации обычно там присутствует и его размер. Тут все за-висит от структуры конкретного файла, и универсальныхрекомендаций дать невозможно.

Если файл фрагментирован – ситуация практически без-надежна. Чтобы собрать разрозненные цепочки кластероввоедино, необходимо хорошо знать содержимое удаленно-го файла. В этом смысле NTFS восстанавливается намно-го хуже, чем FAT. Последовательность фрагментов файла,хранящаяся в File Allocation Table в виде однонаправленно-го списка, очень живуча. Если список не поврежден, доста-точно лишь найти его первый элемент (а сделать это про-ще простого, поскольку он будет указывать на заголовокфайла с вполне предсказуемым содержимым). Даже еслисписок «разрубить» на несколько частей, они продолжатжить собственной жизнью и нам останется лишь подобратькомбинацию, как их правильно склеить воедино. Списокгибнет лишь при полном затирании FAT, что случается, пря-мо скажем, нечасто. В NTFS же порядок фрагментов фай-ла хранится в крохотных списках отрезков, и их гибель –обычное дело, после чего мы остаемся один на один с мил-лионом беспорядочно разбросанных кластеров. Текстовыефайлы восстанавливаются без труда, но что делать, еслиэто электронная таблица, графическое изображение илиархив? Без знания стратегии выделения дискового про-странства тут никуда. Порядок, в котором драйвер файло-вой системы находит подходящие свободные фрагменты,не определен и варьируется в зависимости от множестваобстоятельств, однако кое-какие закономерности в нем всеже присутствуют.

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

Ðèñóíîê 2. Ðó÷íîå âîññòàíîâëåíèå ôàéëà ñ ïîìîùüþ Disk ProbeC:\chkdsk D: /F

Тип файловой системы: NTFS.

Проверка файлов завершена.

Проверка индексов завершена.

Восстановление потерянных файлов.

Восстановление потерянного файла test.txt в файле каталога 5

Замена неправильного идентификатора безопасности для файла 29

Проверка дескрипторов безопасности завершена.

Исправление ошибок в атрибуте BITMAP основной таблицы файлов.

Windows сделала изменения в файловой системе.

1068290 КБ всего на диске.

20 КБ в 2 файлах.

4 КБ в 9 индексах.

0 КБ в поврежденных секторах.

7894 КБ используется системой.

7392 КБ занято под файл журнала.

1060372 КБ свободно на диске.

Размер кластера: 2048 байт.

Всего кластеров на диске: 534145.

530186 кластеров на диске.

Ðèñóíîê 3. Âîññòàíîâëåíèå óäàëåííîãî ôàéëà ïðè ïîìîùè chkdsk

Page 93: 026 Системный Администратор 01 2005

91№1, январь 2005

образование

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

Просматривая карту диска, представленную файлом/$BITMAP, мы можем в точности восстановить порядок раз-мещения фрагментов удаленного файла, наскоро собравих воедино. Во всяком случае, теоретически. Практическиже на этом пути нас ждут коварные препятствия. С момен-та создания восстанавливаемого файла карта свободногодискового пространства могла капитально преобразиться.Всякое удаление файлов высвобождает одну или несколь-ко дыр, хаотично перемешивающихся с дырами восстанав-ливаемого файла, искажая картину. Как этому противосто-ять? Сканируем MFT в поисках записей, помеченных какудаленные, но еще не затертых. Декодируем run-list и вы-черкиваем соответствующие им фрагменты из списка кан-дидатов на восстановление. Это существенно сужает кругпоиска, хотя количество комбинаций, в которые можно со-брать фрагментированный файл, по-прежнему остаетсявелико. Но это еще что…

Самое «интересное» начинается, когда на диск одно-временно записываются несколько файлов (например, ска-чиваемых с помощью ReGet из Интернета) или файл по-степенно увеличивает свой размер (набираете дипломнуюработу в Word?), а в это время на диск записываются дру-гие файлы. Когда к существующему файлу дописывается

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

Хуже всего поддаются восстановлению документы, со-зданные в MS Office, и вот почему: приложение создаетбольшое количество резервных копий редактируемого фай-ла как в текущем каталоге, так и в каталоге %TEMP%. Воти разберись, какой фрагмент какому файлу принадлежит!

Проще всего восстанавливаются ZIP-архивы. Для этоговам даже не потребуется запускать дисковый редактор.Откройте временный файл на запись, сделайте seek наразмер свободного дискового пространства, закройте файл.А теперь обработайте его утилитой pkzipfix.exe (или запус-тите стандартный pkzip.exe с ключом Fix). В «исправлен-ном» файле волшебным образом появятся все уцелевшиеZIP-архивы! Внутренняя структура ZIP-архива такова, чтоpkzipfix легко распознает даже переупорядоченные блоки,поэтому высокая степень фрагментации ему не помеха.

Дефрагментация тоже происходит интересно. Стандар-тное API-дефрагментации в силу малопонятных ограниче-

Фрагментация и ее исследованиеСуществуют по меньшей мере две методики исследованиястратегии выделения дискового пространства: статическаяи динамическая. В первом случае мы просто запускаемдисковый редактор (предпочтительно Disk Explorer отRuntime Software) и анализируем run-list уже существующихфайлов, записанных в различное время и различными спо-собами (можно, например, скопировать файл с одного ме-ста в другое или попеременно увеличивать размер несколь-ких файлов – стратегии выделения свободного простран-ства в обоих случаях будут различны). Статический подходполезен тем, что дает бесценный статистический резуль-тат для всего тома целиком, однако, определяет лишь ко-нечный результат, но не путь, которым он был достигнут.

Ðèñóíîê 4. Ñòàòèñòè÷åñêèé àíàëèç ñòðàòåãèè âûäåëåíèÿ äèñ-êîâîãî ïðîñòðàíñòâà, âûïîëíÿåìûé ïðè ïîìîùè Disk Explorerîò  Runtime Software

Дисковый монитор Марка Руссиновичка (http://www.sysinternals.com) позволяет заглянуть в «святая святых» фай-ловой системы и увидеть, как именно она выделяет диско-вое пространство для файлов. Особенно интересно запус-кать его параллельно с дефрагментатором и chkdsk – тай-ное сразу становится явным.

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

Ðèñóíîê 5. Äèíàìè÷åñêèé  àíàëèç  ñòðàòåãèè  âûäåëåíèÿäèñêîâîãî ïðîñòðàíñòâà, âûïîëíÿåìûé ïðè ïîìîùè äèñ-êîâîãî ìîíèòîðà Ìàðêà Ðóññèíîâè÷à

Page 94: 026 Системный Администратор 01 2005

92

образование

ний оперирует не единичными кластерами, а блоками! Ми-нимальный размер блока составляет 16 кластеров, причемначало блока должно быть кратно 16 кластерам в файле!Как следствие – количество мелких дыр после дефрагмен-тации только возрастает, а непрерывных областей свобод-ного пространства практически совсем не остается.

Кстати говоря, перемещать внутрь MFT-зоны тоже ни-чего нельзя. «На томе С: свободно 17%, но только 5% дос-тупно для использования дефрагментатора диска. Для эф-фективной работы дефрагментатор требует по крайнеймере 15% доступного свободного места» – знакомое сооб-щение, не правда ли? «Недоступное» для дефрагментато-ра место находится внутри MFT-зоны (как мы помним, приформатировании диска под $MFT-файл резервируется 10%от емкости тома, а затем по мере исчерпания дисковогопространства $MFT-файл усекается наполовину, и освобо-дившееся пространство заселяется пользовательскимифайлами).

Таким образом, для гарантированной работы дефраг-ментатора ему нужно 10% + 15% = 25% свободного диско-вого пространства. Не слишком ли высокая плата за деф-рагментацию? Если же у вас свободно свыше 25%, настоя-тельно рекомендуется создать на диске временный файл ивыполнить seek, чтобы заполнить все более или менее круп-ные дыры, не давая их изуродовать дефрагментатору (ес-тественно, после дефрагментации этот файл нужно уда-лить).

Кстати говоря, на сжатые файлы ограничение в 16 кла-стеров не распространяется, поэтому мелкие файлы очень

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

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

где «X:» – буква логического диска (подробности – в MSDN,или, как нынче модно его называть, – Platform SDK).

Не думайте, что все уже написано задолго до вас! Ути-лит, пригодных для профессионального восстановления дан-ных, под NTFS до сих пор нет (во всяком случае в открытойпродаже). Те же, что есть, страдают массой нелепых ограни-чений (например, не могут ограничить диапазон секторногопоиска только свободным/занятым пространством). Так чтодерзайте!

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

CreateFile("\\.\X:",  GENERIC_READ,  FILE_SHARE_READ,  0,  ↵↵↵↵↵OPEN_EXISTING, 0, 0),

Page 95: 026 Системный Администратор 01 2005
Page 96: 026 Системный Администратор 01 2005
Page 97: 026 Системный Администратор 01 2005

95№1, январь 2005

подписка на I полугодие 2005

Российская Федерация! Подписной индекс: 81655

Каталог агентства «Роспечать»! Подписной индекс: 87836

Объединенный каталог «Пресса России»Адресный каталог «Подписка за рабочим столом»Адресный каталог «Библиотечный каталог»

! Альтернативные подписные агентства:Агентство «Интер-Почта» (095) 500-00-60, курьерскаядоставка по МосквеАгентство «Вся Пресса» (095) 787-34-47Агентство «Курьер-Прессервис»Агентство «ООО Урал-Пресс» (343) 375-62-74

! Подписка On-linehttp://www.arzy.ruhttp://www.gazety.ruhttp://www.presscafe.ru

СНГВ странах СНГ подписка принимается в почтовых отделе-ниях по национальным каталогам или по списку номенкла-туры АРЗИ:! Азербайджан – по объединенному каталогу российских

изданий через предприятие по распространению печа-ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21)

! Казахстан – по каталогу «Российская Пресса» черезОАО «Казпочта» и ЗАО «Евразия пресс»

! Беларусь – по каталогу изданий стран СНГ через РГО«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)

! Узбекистан – по каталогу «Davriy nashrlar» российскиеиздания через агентство по распространению печати«Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,5/3, офис 33)

! Армения – по списку номенклатуры «АРЗИ» через ГЗАО«Армпечать» (375005, г.Ереван, пл.Сасунци Давида, д.2)и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул.Сарья-на, 22)

! Грузия – по списку номенклатуры «АРЗИ» через АО«Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская, 29)и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахурдия, 42)

! Молдавия – по каталогу через ГП «Пошта Молдавей»(МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)по списку через ГУП «Почта Приднестровья» (МD-3300,г.Тирасполь, ул.Ленина, 17)по прайслисту через ООО Агентство «Editil Periodice»(2012, г.Кишинев, бул. Штефан чел Маре, 134)

! Подписка для Украины:Киевский главпочтампПодписное агентство «KSS»Телефон/факс (044)464-0220

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

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

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

Page 98: 026 Системный Администратор 01 2005

96

СИСТЕМНЫЙ АДМИНИСТРАТОР№1(26), Январь, 2005 год

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[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»Тираж 8000 экз.

Журнал зарегистрированв Министерстве РФ по делам печати,телерадиовещания и средств мас-совых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002г.)

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

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

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

! Магазин «Компьютерная и деловая книга» (Ленинский проспект, строение 38).! Выставочный компьютерный центр «Савеловский» (Киоск у главного входа).! Выставочный компьютерный центр «Буденовский».! Книжная ярмарка «Центральная». Mагазин «Деловая и учебная литерату-

ра» (м. Тульская, Варшавское шоссе, д.9. эт. 5, павильон 515-09).! ТЦ «Электроника на Пресне». Mагазин «Техкнига» (павильон 8-9).! Редакция «Учительская газета» (Ананьевский переулок, д. 4/2, стр. 1).

On-line магазины:

! www.allsoft.ru! www.linuxcenter.ru! www.linuxshop.ru! www.bolero.ru

«Кто купил Corel Linux?»или Обзор возможностейнастольного дистрибутиваXandrosКомпания Xandros была основана вмае 2001 года в Канаде с целью созда-ния и продвижения на рынок недорогой,дружественной пользователю настоль-ной операционной системы на базеLinux, которая составила бы конкурен-цию Microsoft Windows – «CompleteLinux Desktop Solution». В августе тогоже года компания приобрела CorelLinux OS. Именно она легла в основувыпущенного некоторое время спустяXandros Desktop 1.0. Будучи наследни-ком Corel Linux, Xandros Desktop OSведет свою родословную от проектаDebian, разработки которого и исполь-зуются по сей день для поддержания ко-довой базы. Таким образом, Xandros, посути, является коммерческой разно-видностью Debian, подобной LibranetGNU/Linux и Linspire, а значит, он со-вместим с пакетами DEB, репозитари-ями apt и прочими «прелестями циви-лизации».

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

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

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

Unformat для NTFSCлучилось самое страшное: вы потеря-ли весь NTFS-раздел целиком. Случай-но отформатировали или пережили раз-рушительный дисковый сбой. Где-тотам остались миллиарды байт бесцен-ных данных теперь уже недоступныхоперационной системе. Как вернуть ин-формацию к жизни? В этой статье ав-тор делится советами ручного и авто-матического восстановления.

Уважаемые читатели!

НЕ ПРОПУСТИТЕ ПОДПИСКУна первое полугодие 2005 года

подробная информация на стр. 95