Академический Документы
Профессиональный Документы
Культура Документы
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
В этой версии установщика, как и в предыдущей, снова
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-версия ничем не уступает, а если учесть то, что пакеты,
в нее входящие, имеют более «свежие» индексы, то и пре-
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.
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
Как правило, выискивать области, подвергшиеся специальной доработке, приходится вручную. А тут – на тебе: на блюдечке с голубой
каемочкой.
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, достаточно щелкнуть по нему мышью всего один раз. Это может показаться непривыч-
ным.
ПРОКСИ-СЕРВЕР 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
Например, ввод в адресной строке браузера адреса http://www.yandex.ru увеличит значение http_hits на 1 (запрошена одна страница), а
http_requests увеличится при этом на 30-40, поскольку для каждого объекта, размещаемого во внешнем файле (рисунки, css, js-файлы и т. д.)
формируется отдельный HTTP-запрос.
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
Если действие не указано, то пользователю возвраща- За пояснениями синтаксиса регулярных выражений мож-
ется страница «Просмотр страницы запрещен», созданная но обратиться, например, к странице справочного руковод-
на основе шаблона, указанного в параметре template. ства man grep(1), к разделу «REGULAR EXPRESSIONS».
«Внутренние» объекты компилируются вместе с oops. Приведенные выше правила на практике бесполезны, зато
В версии 1.5.23 файл redir.c содержит следующее опреде- хорошо демонстрируют различные возможности. Ниже при-
ление «внутренних» объектов: водится более полезный файл:
16
администрирование
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
Рекурсивная функция – это функция, вызывающая саму себя, при этом она обязательно передает параметры. Рекурсивные функции, как
и правила, используются для чтения иерархической структуры.
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, отсутствуют параметры:
Библиотека ADsSequrity.dll
Программное управление правами доступа к файлам и пап-
кам можно реализовать с помощью библиотеки ADs
Sequrity.dll, входящей в комплект поставки ADSI Resource
Kit (http://www.microsoft.com). Перед использованием биб-
лиотеки ее необходимо зарегистрировать на компьютере,
на котором будет запускаться сценарий.
Команда регистрации библиотеки выглядит следующим
образом:
Параметр AccessFlags (см. рис. 2):
regsvr32.exe /s ADsSequrity.dll
Òàáëèöà 5
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
АНДРЕЙ ПЛАТОНОВ
С ростом популярности беспроводных сетей 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
осуществить только самые упорные и опытные. Но не боги
горшки обжигают!
Настраиваем 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) задаются (думаю, что у всех всё заработало).
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 в совокупности с авторизацией
по логину и паролю.
РОМАН МАРКОВ
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 поднят. Реко- ложат выбрать необходимые компоненты. Если мы не пла-
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 и
пр.).
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 – задает категорию ресурсов, вание уже скачанных объектов для ускорения доступа к ним
на которые распространяется правило. Можно указать мас- и экономии трафика. Однако экономия трафика не всегда
34
безопасность
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, и к учителю все равно при- ращались процессы. Мне очень не хватает утилиты для изу-
дется обращаться. чения и сравнения изменений файловой системы «до» и
Несомненным плюсом программы является уменьшение «после». Хотелось бы от программ, реализующих техноло-
стоимости владения. Если хранить документы только на гию снапшотов, получить такую функциональность. Наде-
файл-сервере, то кажется сомнительной необходимость ан- юсь, эта функция тоже скоро будет реализована.
Л. Озеров
«Выбор и предпочтение»
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 рас- ся неработоспособным. Дизассемблируете стандартный
шифрованного кода криптоаналитику вообще ни о чем не «Блокнот» – он именно так и устроен.
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 г.
СЕТЕВОЙ ПОЛИЦЕЙСКИЙ
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/
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 или дискетой, затем распако-
вываем и устанавливаем.
АНДРЕЙ БЕШКОВ
В первой части статьи мы говорили о том, как защищать если для этой задачи у нас есть отлично работающий 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
И, конечно же, проверяем, что из этого вышло. # 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
СЕРГЕЙ ЯРЕМЧУК
В сегодняшнем далеко не благоприятном мире Интернет нию и межсетевой экран, отсекающий ненужный трафик.
администраторы должны проявлять особую бдительность Системы обнаружения атак позволяют выявить вторжение
при защите вверенных им сетей. В своей работе они ис- на различных стадиях, сканеры уязвимостей оценивают об-
пользуют средства различного характера. Здесь и марш- щую защищенность сети и, наконец, существуют виртуаль-
рутизаторы, отправляющие пакеты по целевому назначе- ные частные сети, при помощи которых можно организо-
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
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>
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
СЕРГЕЙ СУПРУНОВ
Как было показано в статье «Внутренний веб-сервер» (жур- номеров версии, от 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(). Он
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'}; ширина столбца задается в символах стандартного шриф-
ИТОГИ КОНКУРСА
В августовском номере журнала за прошлый год редакцией был объявлен конкурс на лучшие статьи, описывающие
успешный опыт в области системного администрирования. В течение нескольких месяцев в редакцию приходили мате-
риалы и предлагались интересные темы. В итоге несколько конкурсных статей опубликованы в октябрьском и ноябрьс-
ком номерах журнала – это материалы Романа Гребенникова, Сергея Супрунова, Ивана Коробко и Дениса Батранкова.
Всем авторам опубликованных материалов перечислен гонорар за статьи.
безопасность конкурсная статья безопасность Победителем признан Денис Батранков, приславший ста-
в которых приходится скачивать нужные программы через вашем компьютере все что угодно: скачивать файлы, рас-
Как найти троянскую программу или 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
Уважаемые читатели!
Конкурс продолжается – присылайте свои материалы, самые интересные будут опубликованы на страницах
журнала. Итоги следующего этапа конкурса будут подведены в июльском номере журнала. Успехов!
60
bugtraq
НИТИ В 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 управ- Для запуска нити предусмотрено два метода.
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 не позволяет обмануть его и
закрывает все возможные лазейки для доступа к одним и Проблемы, возникающие при работе
тем же глобальным переменным из разных нитей. с разделяемыми переменными
Для разделения данных существует специальный набор Потенциальные трудности, связанные с разделяемыми пе-
инструментов. ременными, проще проиллюстрировать примером:
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);
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 выполняет ряд до- всей возможной осторожностью. Но с увеличением доли
полнительных действий, например, корректирует ссылки. многопроцессорных машин она, безусловно, будет совер-
К счастью, вы можете свести эти затраты практически шенствоваться, развиваться и стандартизироваться. А при
к нулю, ограничив количество глобальных переменных или аккуратном использовании она позволяет уже сейчас ка-
полностью отказавшись от таковых. Это, как известно, во- чественно усовершенствовать ваши программы, значитель-
обще хороший стиль программирования. но повысив их производительность.
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. В нём имеют-
ся следующие настройки:
72
web
Сглаженный график Результат:
В вышеприведенном примере необходимость сглаживать
линии графика отсутствует, но для того, чтобы просто про-
демонстрировать эту возможность, мы сделаем это, немно-
го расширив диапазон значений.
Сначала представим исходные данные:
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";
Ðèñóíîê 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, выполненный Екатериной Жемойтук.
76
на правах рекламы
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
ству командного пакета:
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 страницы параметров режима записи
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);
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;
} значения:
struct stat s;
memset((void *)&s, 0, sizeof(struct stat));
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];
82
bugtraq
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
Ðèñóíîê 3
86
образование
Ðèñóíîê 4
Ðèñóíîê 5
Алексей Бабий
«Из жизни первобытных программистов»
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 не затирает первого символа именем фай-
ла, чем значительно упрощает свое восстановление.
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 – тай-
ное сразу становится явным.
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
по каталогу
агентства
«Пресса
России»
РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
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