067 Системный Администратор 06 2008

Page 1

РО ТИ РАС РА КУ Ж ПИ

НИ НО К У ВО ЛЫ ГО ЗА ДНИ ТЯ Е НУ ЛИ С

ЛИ

Ь

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

Так видит журнал читатель, оформивший подписку:

№6(67) июнь 2008

КО НЕО НЧ ЖИ ИЛ ДА ИС НН ЬД О ЕН ЬГ И ЗА

П АВ ОС РА ЛЕ Л ОТ НА П У РА СК БО А ТЕ

УЕ ХА Л

ВО ТП УС К

КА

БЫ СТ

№6(67) июнь 2008 подписной индекс 20780 www.samag.ru

Что представляет собой система мониторинга GroundWork Monitor btrfs от Oracle: наш ответ ZFS Какие документы нужны, чтобы подтвердить право на использование свободного ПО? Endian Firewall 2.2: продвинутый Linux-шлюз Как построить информационный портал с помощью JBoss Portal OpenSolaris 2008.05: что нового?

ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Роспечать – 20780, 81655 Пресса России – 88099, 87836 Интер-почта – тел. (495) 500-00-60

Настраиваем Apache+PHP+MySQL на базе OpenBSD 4.3 Оцениваем технологию Adobe AIR Дефекты проектирования Intel Core 2 Duo


Реклама

Реклама


в номере 3 ТЕНДЕНЦИИ РЕПОРТАЖ 4 Мир! Труд! May Perl!

17-18 мая в Москве прошла конференция YAPC: Russia 2008 «May Perl». Кирилл Сухов

АДМИНИСТРИРОВАНИЕ 8 Управляем объектами в Active Directory Часть 2

Залог успешного чтения параметров программным способом – верное определение типа данных считываемой переменной и использование соответствующего алгоритма чтения. Иван Коробко

14 Что представляет собой система мониторинга GroundWork Monitor

Современные системы и сети можно сравнить с живым организмом, настолько они сложны и взаимосвязаны. Как только начинает болеть один компонент, сразу это сказывается и на других. Без постоянного наблюдения за работой отдельных cервисов и систем можно пропустить серьезную болезнь. Сергей Яремчук

18 Endian Firewall 2.2: из Италии с любовью

Организация шлюза в Интернет – типовая задача, которую с разным успехом решает множество специализированных продуктов. Нужен ли нам еще один? Валентин Синицын

22 Обзор OpenSolaris 2008.05

OpenSolaris 2008.05 демонстрирует текущий результат разработки новой системы управления пакетами и средами загрузки. Андрей Соколов

28 OpenBSD 4.3: что новенького?

Последние новшества и изменения, вошедшие в финальный релиз открытой операционной системы OpenBSD 4.3. Влад Глаголев

32 Настраиваем связку Apache + PHP + MySQL на базе ОС OpenBSD 4.3

Предположим, у вас возникла необходимость в развертывании веб-сервера с поддержкой PHP и MySQL. Данную задачу просто решить, имея под рукой свежий дистрибутив OpenBSD 4.3. Остается только прикрутить к нему PHP и MySQL. Максим Гришков

36 btrfs от Oracle: наш ответ ZFS

Цели и задачи, которые ставят перед собой разработчики новой файловой системы btrfs от компании Oracle, впечатляют даже после знакомства с особенностями ZFS, которую, казалось бы, никто не сможет превзойти еще много лет. Андрей Пешеходов

ЗАКОН ЕСТЬ ЗАКОН 45 Какие документы нужны, чтобы подтвердить право на использование свободного ПО?

В новой рубрике юрист Юлия Штокало отвечает на вопросы читателей.

№6, июнь 2008

АДМИНИСТРИРОВАНИЕ «1С» 46 Технологический журнал «1С:Предприятие 8.1»

Система «1С:Предприятие 8.1» обеспечивает возможность ведения технологического журнала, в котором помещается информация от всех приложений, относящихся к «1С:Предприятие». Андрей Луконькин

БЕЗОПАСНОСТЬ 50 Дефекты проектирования Intel Core 2 Duo – аналитический обзор с точки зрения безопасности

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

WEB 60 Корпоративный информационный портал, который построил Джек

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

72 Оцениваем технологию Adobe AIR

С бурным развитием технологий все больше и больше стирается грань между Интернетом и системами пользователей. Появляется много сервисов, заменяющих стандартные настольные программы. Идет бурное освоение десктопа интернет-приложениями, и свидетельством тому – новая технология от Adobe. Александр Майоров

80 PHP-GTK – вторая попытка

После нескольких лет разработки и тестирования общественности был представлен новый релиз – пакет PHPGTK2. Он представляет собой интерфейс PHP для работы с библиотекой GTK2 и предназначен для построения на этом языке полноценных настольных оконных приложений. Кирилл Сухов

РЕТРОСПЕКТИВА 88 Долгая счастливая жизнь – история компании IBM

Мы называем наш век компьютерным, общество – информационным, и тесно связываем будущее человечества с технологиями. Мечтательные мысли писателей-фантастов становятся будничным явлением. Это статья о компании, которая сделала все, чтобы будущее наступило быстрее. Наверно, она и была главным конструктором этого будущего. International Business Machines – IBM. Илья Александров

92 КНИЖНАЯ ПОЛКА 44, 49, 59, 71

BUGTRAQ


Реклама


тенденции Open Source-проекты продолжают отказываться от CVS По изменению в репозитарии исходников свободной операционной системы FreeBSD от 1 июня стало известно, что разработчики уже начали использовать систему управления версиями Subversion вместо CVS. Важно заметить, что CVS-хранилище исходного кода FreeBSD является одним из старейших и крупнейших: его история насчитывает около 12 лет и около 180 тысяч изменений. Ветвь последнего релиза, RELENG_7, содержит более 42 тысяч файлов (482 Мб). Тема перехода с CVS на Subversion активно обсуждалась на мероприятии DevSummit, проходившем в рамках конференции BSDCan 2008. И некоторые существенные недостатки CVS (например, невозможность переименовывать/перемещать файлы, плохая работа с ветвями при непрекращающемся процессе разработки и добавлениях в дерево, неатомарные коммиты) окончательно убедили разработчиков в том, что от этой системы пора отказываться. Вскоре стало известно о том, что постепенный отказ от CVS наблюдается и в проекте Mozilla. Правда, разработчики Firefox предпочли не Subversion, а еще более современное средство. Они уже начали вносить свои изменения в исходный код в mozilla-central – новое дерево Mozilla, управляемое Mercurial. При этом новый репозитарий mozillacentral предназначен только для кода Firefox, XULRunner, Gecko. Остальные проекты Mozilla (Thunderbird, SeaMonkey и др.) вольны самостоятельно решать, какую систему контроля версий они будут использовать.

Intel и Acer придают новый импульс GNU/Linux на ноутбуках

Финансовую выгоду Linux пояснил Дэвид Драммонд (David Drummond), управляющий директор в британском отделении Acer: «Операционная система от Microsoft обычно стоит порядка 50 фунтов стерлингов за штуку. Для ПК стоимостью в 1000 фунтов это несущественно, но для компьютера ценой в 200 фунтов это очень важный фактор». Кроме того, компания Canonical, занимающаяся поддержкой и продвижением популярного Linux-дистрибутива Ubuntu, анонсировала новую редакцию своей системы, предназначенную специально для «нетбуков», – Ubuntu Netbook Remix. Она призвана упростить жизнь пользователю, предоставив ему все удобства десктопной версии Ubuntu с небольшими доработками. В качестве последних отмечается появление специальной панели, обеспечивающей быстрый запуск приложений для работы в сети. Они покрывают стандартный функционал, к которому относится работа с электронной почтой и IM-сообщениями, веб-браузер, онлайн-доступ к фотографиям, видео и музыке. В своем пресс-релизе Canonical описывает Ubuntu Netbook Remix как отличный выбор для производителей устройств типа netbooks, поскольку этот дистрибутив – готовое и проверенное решение, позволяющее им быстро выйти на конкурентный рынок. Сообщается также, что Canonical уже работает с рядом производителей оборудования (Original Equipment Manufacturers, OEM) по вопросам предварительной установки Ubuntu на устройства, которые появятся позже в этом году.

Подготовил Дмитрий Шурупов по материалам www.nixp.ru

В начале июня тайваньский компьютерный производитель Acer представил первый в мире компьютер на базе процессора Intel Centrino Atom – так называемый «нетбук» (netbook), который получил название Aspire One. На него предварительно устанавливается операционная система GNU/Linux. Термин netbooks был введен компанией Intel и нацелен на продвижение ее процессора Intel Atom, предназначенного для использования в ультрапортативных компьютерах. Такие устройства в первую очередь ориентированы на работу в сети Интернет. Aspire One основан на процессоре Intel Centrino Atom N270 с тактовой частотой 1,6 ГГц и включает в себя 512 Мб или 1 Гб оперативной памяти (RAM), 8 Гб Flashкарту для хранения данных, 8,9-дюймовый дисплей, поддерживающий разрешение 1024x600. В качестве предварительно устанавливаемой на Aspire One операционной системы используется Linpus Linux – дистрибутив от тайваньской компании Linpus Technologies, основанный на Fedora и ориентированный на азиатский рынок. Одновременно с этим в Acer объявили о намерении устанавливать Linux и на свои лаптопы. В Acer видят два основных преимущества Linux: функционирование и цена. Предустановленный Linux-дистрибутив будет запускаться значительно быстрее Windows, время работы устройства от батареи увеличится с 5 часов до 7. А разница в цене, достигаемая путем предварительной установки на компьютеры Linux вместо Windows, позволит Acer сделать более выгодные предложения на рынке недорогих устройств.

№6, июнь 2008


репортаж

Мир! Труд! May Perl!

17-18 мая 2008 года в Москве в аудиториях Высшей школы экономики прошла конференция YAPC:Russia 2008 «May Perl».

К

онференция такого формата состоялась в России впервые. В ноябре 2007-го в Москве уже проходила встреча разработчиков в «младшем» формате – Perl Workshop, спустя полгода организаторы (Moscow.pm-московская группа Perlпрограммистов, perl6.ru, deeptext.net) сумели довести уровень мероприятия до настоящей Yet Another Perl Conference, серии форумов, объединяющих Perl-разработчиков по всему миру. От Perl Workshop, YAPC отличается как количеством докладов и участников, так и международным характером мероприятия.

День первый – Lambda, POE и MVC Приведённые в введении новости содержались во вступительном слове Андрея Шитова (Moscow.pm). После него

начались доклады. Слово взял Дмитрий Карасик (Copenhagen.pm), рассказавший о модуле IO::Lambda, предназначенном для асинхронного программирования асинхронного ввода-вывода. Модуль отличается использованием техник функционального программирования (отсюда название), а Дмитрий – живостью изложения и интересной подачей материала. Затем конференция разделилась на два потока. В одной аудитории Дмитрий Осиенко (Eludia.pm) делился с коллегами опытом разработки корпоративных информационных систем на MVC-платформе Eludia. Хоть это и был рассказ представителя компании о собственной разработке, доклад перерос в обсуждение методов построения внутрикорпоративных информационных систем. Алексей Карпанов (Rambler) сооб-

щил о методах и инструментах профилирования Perl-кода (цитата: «Сколько ни есть профилировщиков для Perl – все кривые, но...»). Познавательный доклад был подкреплён блиц-выступлением о применении профайлинга при построении Рамблер-почты, состоявшимся на следующий день («Компиляция шаблонов в машинный код», ни больше, ни меньше). Доклад Анатолия Шарифулина (RostovOnDon.pm) «My POE» стал, наверное, самым интересным в первый день конференции. Впрочем, тем, кто уже давно в курсе технологии работы событийной машины Perl, он мог показаться излишне обзорным, но таких было не очень много. Изучение технологии продолжилось на мастер-классе «POE в повседневной жизни». К сожалению, занятие, обещавшее быть интересным,


репортаж чуть не было испорчено своеобразием доступа в Интернет, реализованного местными администраторами (цитата: «Кто бы мог подумать, что Интернетом называется только HTTP и только через прокси, который выдаёт DNS и только Explorer?»). Ивану Серёжкину (Yandex) пришлось демонстрировать решение средствами POE на ходу скорректированной задачи, но делал он это настолько интересно и, я бы сказал, с артистизмом, что кажется, не будь трудностей с сетью, их стоило бы придумать. В основной аудитории тем временем прошёл доклад Руслана Закирова «Сайт на Jifty за пару часов», в котором рассказывалось об основных принципах организации этого относительно нового MVC-каркаса. После перерыва последовал доклад Сергея Антонинко (UMI.CMS) «Аргументы в пользу XSLT». Он несколько выбивался из общей тематики конференции, так как непосредственно про Perl не было сказано почти ничего, но зато были очень ярко продемонстрированы преимущества технологии XSLT в веб-разработке. Надо сказать, что сделано это было интересно и убедительно, но мне показалось, что вопрос «причём здесь Perl», повисший с начала доклада, так и висел до его окончания. Очень интересным оказался доклад Николая Лавлинского «Построение совместимых Perl/mod_perl-систем с веб-интерфейсом». Было рассказано об особенностях конфигурации вебсервера Apache для организации mod_ perl-хостинга, а также использовании модуля SOAP::Lite для создания системы управления сайтом. Доклад Александра Котова «Perl и Web2.0» на самом деле был посвящен значению этого языка в современном мире веб-разработки. Александр привёл анализ рынка труда, анализ книжных новинок, показывающий востребованность различных в той или иной степени конкурентных технологий. Выводы напрашивались средней утешительности – хоть Perl и уступает по востребованности некоторым языкам, зато его положение (а, следовательно, и ниша) стабильно. Впрочем, народ откровенно веселился. Дело в том, что при демонстрации графиков популярности различных средств

№6, июнь 2008

Регистрация участников (Иван Сережкин «сканирует» очередного посетителя)

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

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

ром гонга Алекса Капранова. Все было очень здорово и слушалось на одном дыхании. Запомнился док лад Карасика, про «секретные операторы» в Perl, провокационная речь «CGI.pm – зло?!» Анатолия Шарифулина, «Презентации в стиле Такахаси» Алекса Капранова и особенно блиц Ивана Сережкина, который не произнёс не слова, просто набирал в редакторе текст, сорвав аплодисменты. Доклад Сережкина «ООП. Пэррот. Можно использовать» ввёл слушателей в дебри практики написания и использования модулей для будущего Perl 6 (цитата: «Он только родится, опа, а модули уже есть»). Основная мысль – работать с Parrot уже не только можно, но и нужно. И как можно больше!

Слушатели мастер-класса про POE (организаторы ожидали гораздо меньше посетителей этого мастер-класса)


репортаж Ярослав-Александр Литот (Oxigen) в докладе «Perl + виртуализация» рассказал про построение системы хостинг-виртуализации и способах управления виртуальными машинами. В докладе «UTF Perl Practicе» Владимир Перепелица (Агава) говорилось о функциях utf8 и о состоянии поддержки Unicode в Perl. Его речь вызвала большое количество вопросов, завязалась небольшая дискуссия. Далее последовал доклад Ильи Общадко (Travel.ru) об истории разработки и архитектуре CMS Travel.ru, которая, несомненно, представляет интерес для изучения. Отдельно были представлены убедительные обоснования выбора Perl как языка разработки крупнейшего туристического портала. В последнем докладе Егор Шиповалов рассказал о различных реализациях ORM в Perl, провёл их сравнительный анализ, продемонстрировал практическое применения модуля DBIx:: Class. На этом двухдневный марафон был окончен, и появилась возможность перевести дух и подвести итоги. В самом начале конференции всем участникам раздали задания на Perl Golf – традиционного соревнования программистов. Были поставлены две задачи, которые требовалось решить с использованием минимума символов. Первая – написать, используя только управляющие конструкции и регулярные выражения, проверку делимости числа на 11. Вторая с чуть более сложным условием. При заданном блоке строк из пробелов и символов # требовалось найти максимальное число символов #, попадающих в любой из прямоугольников, площадью точно равных заданному на STDIN числу N и всеми своими клетками, лежащими внутри заданного блока. В конце конференции были подведены итоги, с раздачей слоников, причём отмечены были не только самые короткие, но и наиболее интересные решения. В заключение хотелось бы поблагодарить организаторов и лично Андрея Шитова за хорошо проведённое мероприятие. По-моему, первая российская конференция YAPC вполне удалась.

Текст Кирилла Сухова, фотографии Андрея Шитова

Анатолий Шарифулин и Иван Сережкин ведут мастер-класс «POE в повседневной жизни»

Спонтанное выступление Руслана Закирова о том, как зарабатывать на публикации модулей

Выступление Александра Котова о рынке Perl-программистов было одним из докладов, привлекших большое внимание


Реклама


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

Управляем объектами в Active Directory Часть 2

Иван Коробко Залог успешного чтения параметров программным способом – верное определение типа данных считываемой переменной и использование соответствующего алгоритма чтения.


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

В

предыдущей статье [6] мы рассмотрели типы объектов, существующие в Active Directory; было рассказано о методике создания объектов на примере учетной записи пользователя, узнали, что происходит в Active Directory в процессе создания учетной записи. В этой статье уделим внимание типам данных объектов в Active Directory и методике их чтения. Чтение/изменение свойств объекта осуществляется одним из следующих способов: n программным способом; n с помощью мастера MMC-консоли Active Directory.

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

Изменение свойств объекта программным способом

'Определение имени домена Set oRoot = GetObject("LDAP://rootDSE") LdapDomain = "LDAP://" & oRoot.Get("DefaultNamingContext") 'составление и обработка SQL–запроса Query = "SELECT ПЕРЕМЕННАЯ FROM '" & LdapDomain & "' ↵ WHERE objectclass='group' and name='Test'" Set st = objConn.Execute(Query) 'Вывод результата типа данных переменной wscript.echo VarType(st.Fields("ПЕРЕМЕННАЯ").Value)

Методика чтения данных из Active Directory Рассмотрим методику чтения параметров следующих типов данных: n Long (VarType = 3) – длинное число; n Date (VarType = 7) – дата-время; n String (VarType = 8) – строка; n Object (VarType = 9) – объект; n Array (VarType = 8192+х) – массив элементов.

Каждое свойство в каталоге в Active Directory хранится в определенном формате, поэтому чтение данных осуществля- Тип данных Long (VarType = 3) ется по алгоритму, пригодному для чтения каждого из ти- Длинному числу в интерпретации VBScript соответствует пов данных. Одной из важнейших задач является опреде- тип данных Long. В таблице 2 приведены характерные для ление типа данных объекта, значение которого необходи- учетной записи пользователя параметры, соответствующие мо получить или изменить.

Определение типа данных объекта Информация в Active Directory хранится в объектах. Для определения типа объекта в VBScript обычно используют функцию VarType(), которая имеет следующий синтаксис: Value=VarType(VarName)

где: n VarName – переменная, тип которой необходимо определить; n Value – возвращаемое функцией значение. Функция VarType() возвращает числовое значение, по которому из таблицы 1 можно определить тип данных объекта. Шаблон сценария, в котором реализовано определение типов данных переменной с помощью функции VarType(), приведен в листинге 1. Особое внимание стоит уделить чтению данных из массивов. Во время определения типа данных массива функция VarType() возвращает сумму, состоящую из двух слагаемых. С помощью первого слагаемого, равного 8192, идентифицируется массив данных. С помощью второго – элементы массива. Например, если массив состоит из чисел (Integer), то функция VarType() возвратит значение 8194 = 8192 + 2. Поскольку элементами массива не могут быть пустые значения (vbEmpty), то функция VarType(Array) никогда не возвратит значение 8192. Листинг 1. Шаблон использования функции VarType() 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn

№6, июнь 2008

Таблица 1. Значения, возвращаемые функцией VarType()

Константа

Значение

Описание

vbEmpty

0

Empty (пустое значение)

vbNull

1

Null (не содержит данных)

vbInteger

2

Integer

vbLong

3

Long

vbSingle

4

Single (число с плавающей точкой)

vbDouble

5

Double (число с плавающей точкой)

vbCurrency

6

Currency

vbDate

7

Date

vbString

8

String

vbObject

9

Object

vbError

10

Error

vbBoolean

11

Boolean

vbVariant

12

Variant (используется только с массивами)

vbDataObject

13

Object

vbByte

17

Byte

vbArray

8192

Array

Таблица 2. Параметры объектов типа Long для учетной записи пользователя Переменная

Комментарий

Пример

codePage

Код страны. Используется для переключения языка интерфейса. Появился в Windows 2003. В настоящее время не используется

0

instanceType

Значением параметра описывается статус объекта на сервере. Возможные значения – 1, 2, 4, 8, 16, 32. По умолчанию принимает значение 4

4

primaryGroupID

Идентификатор группы безопасности, назначенной по умолчанию (см. вкладку MemberOf свойств пользователя). RID группы Domain Users, назначаемой по умолчанию, равен 513

513

userAccountControl

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

805306368

countryCode

0


администрирование Таблица 3. Параметры типа Date всех типов объектов Переменная

Комментарий

Пример

createTimeStamp

Дата и время создания объекта. При попытке получить значение с помощью функции GetObejct() выдает ошибку

20070222080007.0Z

modifyTimeStamp

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

20080507120605.0Z

whenCreated

Дата и время создания объекта. Значение совпадает со значением параметра createTimeStamp. Используется для совместимости с доменами Windows NT. Чтение данных с помощью функции GetObejct() осуществляется корректно

20070222080007.0Z

Дата и время последнего изменения свойств объекта. Значение совпадает со значением параметра modifyTimeStamp. Используется для совместимости с доменами Windows NT. Чтение данных с помощью функции GetObejct() осуществляется корректно

20080507120605.0Z

whenChanged

YYYYMMDDHHMMSS.MS Z

Рисунок 1. Параметры в формате Generalized–Time

этому типу данных. При чтении данных значение типа Long автоматически преобразуется к строке (String). Чтение данных осуществляется с помощью ADODB-соединения или функции GetObject(). В том случае, когда известен путь к объекту, стоит отдать предпочтение функции GetObject(), поскольку этот способ значительно проще (см. листинг 2а). Листинг 2а. Чтение значений типа Long с помощью функции GetObject() Set obj = GetObject("LDAP://CN=Test,OU=Group,DC=msk, ↵ DC=ru") Wscript.Echo obj.sAMAccountType

Когда точное местоположение объекта неизвестно, то необходимо выполнить поиск объекта в Active Directory по заданным критериям, однако в запросе можно задать путь к объекту явным образом (см. листинг 2б) – как в функции GetObject(). Для реализации функции поиска используют ADODB-соединение провайдера ADsDSOObject. Листинг 2б. Чтение значения строковых параметров с помощью ADODB–соединения 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'Составление и обработка SQL–запроса Query = "SELECT sAMAccountType ↵ FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата wscript.echo st.Fields("sAMAccountType").Value

Тип данных Date (VarType = 7) В Active Directory присутствует ряд обязательных для всех объектов параметров, к их числу относятся параметры ти-

10

па Date, характеризующие дату и время создания и изменения объектов (см. таблицу 3). Данные в формате датавремя в процессе чтения автоматически преобразуются в строку. Несмотря на это, для получения понятного всем значения необходимо преобразовать это значение в соответствии с алгоритмом (см. листинг 3а и 3б). В Active Directory эти параметры хранятся в формате Generalized-Time. Значения параметров этого типа имеют следующую структуру (см. рис. 1, таблицу 3):

где: YYYY – год, MM – месяц, DD – день, HH – час, ММ – минута, SS – секунда, MS – доля секунды, Z (от Zero) – обозначает нулевой меридиан. Чтение параметров в формате Generalized-Time рекомендуется осуществлять с помощью ADODB-соединения (листинг 3а), поскольку значения параметров createTimeStamp и modifyTimeStamp невозможно получить с помощью функции GetObject(). Это связано с тем, что функция первоначально использовалась для чтения данных через провайдер WinNT (листинг 3б). К ним относятся параметры whenCreated и whenChanged. Листинг 3а. Чтение параметров в формате UTC–Time 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'Составление и обработка SQL–запроса Query = "SELECT createTimeStamp ↵ FROM 'LDAP://CN=Ivan\, Petrov,CN=Users,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата wscript.echo vartype(st.Fields("createTimeStamp").Value) wscript.echo (st.Fields("createTimeStamp").Value)

Результатом работы сценария является дата и время в привычном для человека формате (см. рис. 2). Листинг 3б. Чтение параметров в формате UTC–Time ' Только для параметров whenCreated, whenChanged set objUser = GetObject("LDAP://CN=Ivan\, ↵ Petrov,CN=Users,DC=msk,DC=ru") WScript.echo objUser.Get("whenCreated")

Тип данных string (VarType = 8) Большинство данных в каталоге Active Directory хранится в строковом виде. В таблице 4 приведено описание полей, которые чаще всего используются в сценариях. Чтение данных осуществляется с помощью функции GetObject() или универсального способа – с помощью ADODB-соединения. Первый способ (см. листинг 4а) хорош своей лаконичностью: всего две строки. Его основной недостаток – необходимо знать LDAP URL-путь к объекту. Рисунок 2. Чтение Когда точное местоположение параметра в формате объекта неизвестно, используют Generalized–Time


администрирование Temp = 0 For k = 0 To UBound(TempKey) Temp = Temp + (TempKey(k) * 256^k) Next End If

возможность поиска ADODB-соединения (см. листинг 4б). В приведенном примере механизм поиска объекта не использован. (Поиск объекта осуществляется на основе SQLзапроса, в котором указан путь к корневой папке домена.) Путь к объекту задан в явном виде. Во всех трех примерах продемонстрировано чтения одного и того же параметра.

lngHigh = objDate.HighPart lngLow = objDate.LowPart If (lngLow < 0) Then lngHigh = lngHigh + 1 End If If (lngHigh = 0) And (lngLow = 0 ) Then dtmDate = #1/1/1601# Else dtmDate = #1/1/1601# + (((lngHigh * ↵ (2 ^ 32))+ lngLow)/6/10^8 - Temp)/1440 End If ConvertTime=dtmDate End Function

Листинг 4а. Чтение значения строковых параметров Set obj = GetObject("LDAP://CN=Test,OU=Group,DC=msk, ↵ DC=ru") Wscript.Echo obj.cn Листинг 4б. Чтение значения строковых параметров с помощью ADODB–соединения 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'Составление и обработка SQL–запроса Query = "SELECT cn ↵ FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата wscript.echo st.Fields("cn").Value

Тип данных array (VarType = 8192+х)

Возвращаемое значение функции VarType складывается из двух составляющих: 8192 (array) + х. В данном выражении х – число, обозначающее тип данных элементов массива. Так, массив, элементы которого являются строками, возвращает значение 8200 = 8192 + 8; если массив состоит из бинарных элементов, то возвращаемое значение – 8209 = 8192 + 17 (см. таблицу 6). Массивы, возвращаемые Active Directory, как правиТип данных object (VarType = 9) ло, состоят из неопределенных элементов (Variant = 12). Хранящаяся в Active Directory информация, соответствую- Функция в этом случае возвращает значение 8204 = 8192 + щая типу данных Large Integer, воспринимается интерпре- 12. Элементами массива в данном случае является либо татором VBScript как объект (см. таблицу 5). строка, либо число, которое при получении значений элеВсе данные типа Object, хранящиеся в Active Directory, ментов автоматически преобразуется в строку (см. лиссчитываются с помощью функции Get(). Впоследствии по- тинг 7). Чтение массива осуществляется с помощью циклученное значение складывают из двух: HighPart (Дата) ла For…Each. и LowPart (Время). Пример чтения в листинге 5. Таблица 4. Параметры типа String для учетной записи пользователя

Листинг 5. Получение значения типа Object Set obj = GetObject("LDAP://CN=Ivan\, ↵ Petrov,CN=Users,DC=msk,DC=ru") Set objUSN = obj.Get("uSNChanged") Wscript.Echo Abs(objUSN.HighPart * 2^32 + objUSN.LowPart)

Часть параметров, например pwdLastSet (см. таблицу 5) имеет несколько другую методику чтения, которая также используется для полей accountExpires, uSNChanged, lastLogonTimestamp, lastLogon, badPasswordTime. Значение параметра pwdLastSet – промежуток времени от 1 января 1601 года по настоящее время с точностью 100 миллисекунд. Преобразование данных осуществляется с помощью функции (см. листинг 6). Листинг 6. Чтение параметра lastLogonTimestamp (accountExpires, lastLogon, pwdLastSet) Set obj = GetObject("LDAP://CN=Ivan\, ↵ Petrov,CN=Users,DC=msk,DC=ru") Set objUSN = obj.Get("lastLogonTimestamp") Wscript.Echo ConvertTime(objUSN) Function ConvertTime(objDate) Set objShell = CreateObject("Wscript.Shell") Key="HKLM\System\CurrentControlSet\Control\ ↵ TimeZoneInformation\ActiveTimeBias" TempKey = objShell.RegRead(Key) If (VarType(TempKey) = 3) Then Temp = TempKey ElseIf (VarType(TempKey)=12) Then

№6, июнь 2008

Переменная

Комментарий

Пример

cn

Составное имя пользователя (cn – сокращение от Canonical Name), формирующееся из фамилии (поле givenName), имени (поле sn) и необязательного инициала (поле initials)

Ivan, Petrov

displayName

Отображаемое имя. Его значение идентично составному имени пользователя (поле cn). Используется для совместимости с доменами Windows NT

Ivan, Petrov

distinguishedName

Составной путь (DC) к объекту в соответствии c RFC 1779, 2247

CN=Ivan\,Petrov, CN=Users,DC=msk, DC=ru

mail

Адрес электронной почты в формате UPN. Заполняется после создания ящика электронной почты для учетной записи пользователя

IPetrov@msk.ru

sAMAccountName

Имя пользователя для входа в сеть. Используется для совместимости пространств имен Active Directory c доменами на основе Windows NT

IPetrov

sn

Фамилия пользователя (sn – сокращение от Second Name)

Petrov

userPrincipalName

UPN-имя пользователя, описанное в RFC 822. Это основной формат имен, используемый в Active Directory

IPetrov@msk.ru

givenName

Имя учетной записи пользователя. Является обязательным параметром

Ivan

initials

Инициалы пользователя. Необязательный параметр длиной до 6 символов

V

11


администрирование Листинг 7. Чтение массива строк с помощью ADODB–соединения 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'составление и обработка SQL–запроса Query = "SELECT OBJECTCLASS ↵ FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата For each el in st.Fields("OBJECTCLASS").Value wscript.echo el Next

В Active Directory присутствует два массива бинарных элементов, которые необходимо выделить отдельно: SID (параметр objectSID) и GUID (параметр objectGUID) объекта. В связи с этим функция VarType() возвращает значение 8209 = 8192 + 17. После того как элементы массива считаны, их необходимо преобразовать в понятный всем вид (см. рис. 3) с помощью функции HEX.

Шаблон чтения данных Суммируя сказанное, заметим, что грамотно написанный сценарий чтения каких-либо данных из Active Directory имеТаблица 5. Параметры типа Object для учетной записи пользователя Переменная

Комментарий

Пример

uSNChanged

Порядковый номер изменений свойств объекта, отсчитывающийся с момента создания объекта. Количество изменений, произошедших с объектом, равно разности uSNChanged – uSNCreated

794175

uSNCreated

Значением является порядковый номер изменений, сделанных в Active Directory на момент создания объекта

794169

accountExpires

Дата и время, по истечении которых учетная запись пользователя будет автоматически заблокирована. Если значение равно 0 – функция дезактивирована

9223372036854775807

lastLogon

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

128555016510096179

pwdLastSet

Дата и время последней смены пароля

128527377084375000

Таблица 6. Параметры типа Array для учетной записи пользователя Переменная

Комментарий

Пример

description

Комментарий, описание объекта. Как ни странно – это не строка, а массив символов

Тестовая учетная запись

memberOf

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

Domain Users Test

objectClass

Список идентификаторов класса, к которому относится объект

Top Person

objectGUID

Глобальный идентификатор объекта

93 C5 2A A1 1D AF 10 42 AA 3E 7A 33 0F A3 E3 96

objectSID

Идентификатор безопасности объектов

01 05 00 00 00 00 00 05 15 00 00 00 2C 8F EC FB

Рисунок 3. Преобразование SID–объекта

12

ет следующую структуру. Сначала с помощью ADODB-соединения получают доступ к каталогу Active Directory, указывая в запросе названия полей, значения которых необходимо получить. Затем определяется тип данных объекта и в зависимости от этого – считывание объекта по указанному алгоритму. Конечно, возникает вопрос: «Если я знаю название поля и я точно знаю его тип данных – зачем использовать функцию VarType(). Ведь это усложняет сценарий, делает его громоздким?» Да, вопрос правомерный. Ответ на него очень прост: «Если всем параметрам присвоены значения, то все именно так – в функции VarType() нет необходимости. Однако на практике это не так. Более того. Часто создают сценарии, чтобы выявить незаполненные поля. Если поле не заполнено, например поле description, то функция VarType() возвратит значение NULL (см. таблицу 1).» В листинге 8 приведен пример чтения данных с проверкой функцией VarType(). Листинг 8. Рекомендуемый сценарий чтения данных из AD 'Создание ADODB–соединения Set objConn = CreateObject("ADODB.Connection") Set objCom = CreateObject("ADODB.Command") objConn.CommandTimeout = 120 objConn.Provider = "ADsDSOObject" objConn.Open "Active Directory Provider" Set objCom.ActiveConnection=objConn 'Составление и обработка SQL–запроса Query = "SELECT description, cn ↵ FROM 'LDAP://CN=Test,OU=Group,DC=msk,DC=ru'" Set st = objConn.Execute(Query) 'Вывод результата wscript.echo st.Fields("cn").Value temp = "" if VarType(st.Fields("description").Value)>8192 then For Each description In st.Fields("description ").Value temp = temp + description Next Else temp = "Поле description пусто" End If Wscrit.Echo temp

Обратите внимание, что в сценарии осуществляется проверка типа данных только для переменной description. Это связано с тем, что параметру cn всегда присвоено значение, поскольку оно является обязательным. Объект без этого параметра не может существовать.

Заключение В следующей статье будут рассмотрены основные вкладки учетной записи пользователя в MMC-консоли Active Directory. Поговорим о правилах назначения типов данных и исключениях из этих правил, а также о соответствиях полей мастера и параметров в Active Directyory. 1. Коробко И. Администрирование сетей Windows с помощью сценариев. //СПб.: БХВ-Петербург, 2007. – 368 с.: ил. – (Системный администратор). ISBN 978-5-9775-0140-8. 2. RFC 822. Standard for the format of ARPA internet text messages. 3. RFC 1779. A string representation of distinguished names. 4. RFC 2247. Using Domains in LDAP/X.500 Distinguished Names. 5. RFC 2251. Lightweight Directory Access Protocol (v3). 6. Коробко И. Управляем объектами в Active Directory. Часть 1. //Системный администратор, №5, 2008 г. – С. 4-9.



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

Что представляет собой система мониторинга GroundWork Monitor

Сергей Яремчук Современные системы и сети можно сравнить с живым организмом, настолько они сложны и взаимосвязаны. Как только начинает болеть один компонент, сразу это сказывается и на других. Без постоянного наблюдения за работой отдельных cервисов и систем можно пропустить серьезную болезнь. 14


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

С

егодня на рынке присутствует большое количество различных систем мониторинга, как коммерческих, так и бесплатных. К сожалению, не каждый администратор по разным причинам сможет или захочет использовать популярные Open Source-решения вроде Nagios [3] или Cacti [4]. Некоторые посчитают их требующими значительных затрат времени в настройке. Примерно на таких администраторов и рассчитана система мониторинга GroundWork Monitor [1]. Проект предлагает три версии своей системы: Community Edition, Proffesional и Enterprise. Версия Community Edition распространяется свободно по лицензии GNU GPL и обеспечивает все необходимые возможности по наблюдению за серверами, устройствами и приложениями. Речь в статье пойдет именно об этом варианте. Тем более что Community Edition построен на той же кодовой базе, что и старшие версии продукта. Поэтому при необходимости версию можно повысить без серьезной перестройки системы. Изначально Community Edition поддерживает сто устройств, чего обычно хватает для сети небольшого или среднего размера. В зависимости от архитектуры сети и приложений это число может быть больше. В основу GroundWork Monitor взяты 15 популярных Open Source-продуктов: Nagios, Cacti, RRDtool, nmap, MySQL и другие, которые объединены в единую систему, позволяющую увидеть все реально происходящие события. Для управления и вывода информации используется понятный веб-интерфейс, построенный на базе Monarch (MONitor ARCHitecture) [5] и Fruity [6]. Интерфейс, к сожалению, не локализован, но при базовом знании английского и понимании процесса в нем без проблем и быстро осваиваешься. Удобство настроек обеспечивается в том числе и наличием подготовленных профилей, позволяющих быстро подключить сервис. Сегодня имеются профили для telnet, smtp, ftp и некоторых других. GroundWork Monitor имеет систему поиска новых устройств в сети, что очень упрощает администрирование и подготовку к работе.

№6, июнь 2008

Окно мониторинга позволяет наблюдать за системами в реальном времени

Для предупреждения проблем пре- образней и интересней. Так, есть ISOдусмотрены тесты производительнос- образ готовой к использованию систи, позволяющие оценить задержки темы и образ для виртуальной маи увидеть узкие места. шины VMware, построенные на базе Поддержка Community Edition осу- CentOS. Кроме того, есть и deb-пакет ществляется сообществом пользова- для Ubuntu 6.06. Последний без пробтелей GroundWork Monitor. Кроме этого, лем устанавливается в Ubuntu 7.04, на сайте доступны видеоуроки, в кото- 7.10 и Debian 4 (Etch). рых разъяснены базовые настройки. Кроме этого, на странице закачки доступны модули для совместной раВерсии и релизы боты с системами мониторинга Nagios В настоящее время на сайте проек- и Ganglia, WMI-модуль для мониторинта доступны две версии продукта: 5.1 га Windows-систем и другие. и 5.2.1. Версия 5.2.1 некоторое время Для самостоятельной установки после выхода не была анонсирована понадобится модуль perl-DBI, сервер на сайте, но уже была доступна на стра- Apache с поддержкой PHP и MySQL, а также Java JDK. Их можно установить нице проекта на SourceForge [2]. По функциональности они прак- из репозитария дистрибутива. тически не отличаются. В 5.2.1 обновCсылки на все нужные RPM-палены программы Nagios 2.10 и плаги- кеты для RHEL и SLES есть на сайте ны 1.4.10, в том числе и NSCA до 2.7.2. GroundWork Monitor. В общем, установПлюс устранены некоторые ошибки ка GroundWork Monitor при помощи пав Monarch. кетов проблем не вызывает. Программа установки вначале анаДля доступа к серверу в версии лизирует систему на совместимость для VMware следует использовать и список установленных приложений учетную запись GroundWork с паролем с выдачей рекомендации по устране- monitor или root с паролем opensource. нию недостатков. В остальном версии Пароль для входа в систему монитопохожи. Кроме комплектации. ринга будет подсказан после регистТак, 5.2.1 доступна только в виде рации в системе (admin/admin). пакетов для дистрибутивов RHEL 4 и 5, а также SLES 9 и 10. Пакеты соб- Веб-интерфейс раны для архитектур i386 и x86_64. Визуально интерфейс разбит на две Варианты версий несколько разно- части. В левой находится группа ме-

15


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

Вывод информации по статусу сервисов на отдельном узле

Отчеты Nagios

ню, справа отображаются параметры и настройки. Чтобы добавить пользователя, имеющего право подключаться в GroundWork Monitor, следует перейти в меню «Administration». Для удобства управления используются группы, права назначаются на основе ролей. По умолчанию имеются две роли: Administrators и Operator.

16

Во второй пользователи имеют право только на просмотр некоторых отчетов и статуса работы контролируемых объектов (в терминологии GroundWork Monitor – Subscriptions). При необходимости можно добавить или удалить параметры. Добавить новую возможность очень просто, ее следует указать в списке «Add

View to this role» и нажать «Add View». Как вариант создается отдельная группа с нужными правами. Другие нас тройки во вк ла дке «Administration» позволяют установить или удалить специфические для системы мониторинга пакеты и изменить тему оформления. Правда, в поставке всего одна такая тема и где взять другие – не ясно. Во вкладке «Status» в реальном времени выводится статус работы систем и сервисов. Информация в общем доступна в виде круговых диаграмм (отдельно для узлов и сервисов) и подробнее в таблицах. В подменю «Trouble View» собраны ссылки на узлы и сервисы, статус которых должен вызывать беспокойство администратора. Найти нужный объект при большом количестве контролируемых систем поможет поиск. Кроме этого, похожие параметры сгруппированы в левом столбце, те, у которых зафиксированы проблемы, подсвечиваются восклицательным знаком. Выбор единичного параметра покажет подробную информацию о его работе (текущий статус, время последней проверки и так далее). Подробный статус мониторинга любого сервера доступен в «Monitoring Server». Здесь полностью показана информация по каждому сервису на выбранном узле, процессам, производительности и запросам системы мониторинга. Во вкладке «Performance» можно настроить вывод, в том числе и в реальном времени, отдельных параметров производительности, любой из систем, подключенных к серверу GroundWork Monitor. Настройка проста. При помощи раскрывающегося списка выбираем узел, после чего в следующем столбце будут показаны параметры, которые можно контролировать. Выбираем нужные и нажимаем «Add Data Set(s)». Затем внизу выбираем тип графика и период времени. Добавление узлов и сервисов производится в меню «Configuration EZ». Предусмотрено несколько вариантов: ручное добавление, импорт настроек и выбор «Discover» позволит просканировать сеть в поиске объектов при помощи nmap. Схожие узлы сгруппированы в Hosts Group.


администрирование В меню «Profile» собраны варианты мониторинга выбранных узлов: ping, ssh и snmp. Информация, необходимая для отсылки предупреждений для пользователей, и временные промежутки, в которых разрешена их отправка, указываются в подвкладке «Notifications». В настройках можно указать адрес электронной почты и адрес пейджера (SMS). На последний в отличие от e‑mail будут отсылаться короткие сообщения. В подвкладке «Commit» находится меню проверки конфигурационных файлов и перезапуска Nagios. Другим вариантом настройки является пункт меню «Configuration», который представляет собой удобный интерфейс к конфигурационным файлам Nagios. Для добавления нового узла или сервиса предлагается понятный мастер. В меню «Escalations» настраиваются объекты, на которых будет отсылаться Notifications при возникновении проблем. Вкладка «WrappIt» позволяет подключить другое вебприложение, котрое будет доступно из окна GroundWork Monitor и настроить однократную аутентификацию (Single Sing-on). Настройки контроля производительности производятся в «Performance Configuration». В большинстве случаев трогать здесь ничего не приходится, хотя, нажав «Modify», можно изменить параметры любого выбранного запроса. Любимая администраторами карта доступна в вкладке «Nagios Map». Отчеты по любому узлу и сервису за выбранный период можно сгенерировать, зайдя в меню «Nagios Report».

Мониторинг Windows‑систем Для мониторинга Windows-систем нам понадобится версия nrpe (Nagios Remote Plugin Executor) – nrpe_nt [7] и архив WMI Plugins, взятый с сайта GroundWork Monitor. Распаковываем nrpe_nt в любой каталог, например C:\nrpe_nt. Исполняемый файл NRPE_NT.exe и конфигурационный файл nrpe.cfg находятся в подкаталоге bin. Cоздаем дополнительно подкаталог C:\NRPE_NT\ Plugins\V2, в который копируем все файлы с расширением VBS из архива WMI Plugins. Файл V2_nrpe_commands.cfg перемещаем в bin и подключаем его в nrpe.cfg, добавив строку: include=C:\NRPE_NT\bin\V2_nrpe_commands.cfg

В этом же файле разрешаем подключение сервера Nagios, указав его IP-адрес в параметре allowed_hosts. Если на компьютере несколько сетевых карт, то соединения от сервера Nagios будут приниматься со всех. Ограничить единственным интерфейсом можно при помощи параметра server_address. И наконец, указав: dont_blame_nrpe=1

разрешаем использование аргументов командной строки. Теперь в интерпретаторе cmd.exe, переходим в каталог

№6, июнь 2008

bin и запускаем nrpe_nt в качестве сервиса (нужны соответствующие права). C:\nrpe_nt\bin>nrpe_nt -i

NRPE_NT Service sucessfully installed!

В списке сервисов должен появиться «Nagios Remote Plugin Executor for NT/W2K», настроенный на ручной запуск. Запускаем его. C:\nrpe_nt\bin>net start nrpe_nt Служба "Nagios Remote Plugin Executor for NT/W2K" запускается..... Служба "Nagios Remote Plugin Executor for NT/W2K" успешно запущена.

В случае неудачи описание ошибки можно найти в nrpe_nt.log. Теперь новый сервис будет доступен в окне GroundWork. Проверить правильность работы скрипта в Windows можно при помощи сервера сценариев: > cscript //nologo C:\NRPE_NT\Plugins\V2\ ↵ verify_wmi_status.vbs -h 127.0.0.1 OK - Microsoft Windows XP Professional, SP 2.0

Или свободное место на дисках. > cscript //nologo check_disks_percentage_space_used.vbs ↵ -h 127.0.0.1 -inst * -w 40 -c 60

Команда на сервере GroundWork Monitor для проверки версии ОС на компьютере с IP-адресом 192.168.1.5 выглядит так: # /usr/local/groundwork/nagios/libexec/check_nrpe ↵ -H 192.168.1.5 -c show_os -a 127.0.0.1

В документации подробно описан процесс настройки работы клиентов через защищенное SSL-соединение.

Заключение Знакомство с GroundWork Monitor оставило только положительные эмоции. Даже отсутствие локализации не затрудняет настроек, все просто и понятно и находится на своем месте. В случае проблем сразу же приходит сообщение на указанный почтовый адрес и SMS-сообщение. Система отчетов позволяет проанализировать все процессы во времени. Удачи! 1. Сайт проек та GroundWork Monitor – http://www.ground workopensource.com. 2. Страница на SourсeForge – http://sourceforge.net/projects/ gwmos. 3. Бешков А. Установка Nagios. //Системный администратор, № 2, 2003 г. – C. 6-14. 4. Яремчук С. Cacti – простой и удобный инструмент для мониторинга и анализа сети. //Системный администратор, № 4, 2007 г. – C. 22-27. 5. Сайт проекта Monarch – http://sourceforge.net/projects/ monarch. 6. Сайт проекта Fruity – http://sourceforge.net/projects/fruity. 7. Сайт проекта nrpe_nt – http://www.miwi-dv.com/nrpent.

17


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

Endian Firewall 2.2: из Италии с любовью

Валентин Синицын Организация шлюза в Интернет – типовая задача, которую с разным успехом решает множество специализированных продуктов. Нужен ли нам еще один?

Н

азвание этого продукта наводит на мысли о путешествиях Гулливера, остро- и тупоконечниках или, на худой конец, порядке следования байтов. Подозреваю, что на родном языке его разработчиков – итальянском – это слово тоже значит чтонибудь хорошее, хотя документальных подтверждений тому мне обнаружить не удалось. Как бы там ни было, под именем Endian скрывается специализированный дистрибутив Linux, реализующий функции брандмауэра, интернет-шлюз (с поддержкой нескольких подключений), хот-спота (только в коммерческой версии) и контроля за сетевыми угрозами (Unified Threat Management, UTM).

18

Endian Firewall (EFW) поставляет- (за исключением младшей модели – ся в двух основных редакциях: свобод- Mini – обладающей пассивным-охлажной (GPLv2) и бесплатной Community дением и настольным корпусом) мони коммерческой Appliance. Последняя, тируются в стандартной девятнадцатив свою очередь, подразделяется на ап- дюймовой стойке и имеют высоту 1U. паратные (Mini, Mercury, Macro, Macro Как правило, в продуктах, облаX2 – в порядке наращивания возмож- дающих открытой и закрытой версиностей) и программную (Software) раз- ями, первая служит своего рода тесновидности. Endian Firewall Software товым полигоном для второй: на ней Appliance можно установить на любой обкатываются новые идеи и функции, x86-совместимый компьютер подходя- которые (после стабилизации) ложатщей мощности (рекомендуется 1 ГГц ся в основу бизнес-решения. В слуи 512 МБ оперативной памяти, а также чае с Endian, похоже, все происхоне менее 4 ГБ на жестком диске, при- дит наоборот: Community-версия повод CD-ROM, клавиатура и монитор лучается путем урезания стандартпонадобятся только на этапе инстал- ного Endian Firewall (он же – Software ляции и устранения неполадок). Фир- Appliance) и при этом еще проходит менные аппаратные решения Endian свое собственное тестирование! Так,


администрирование на момент написания обзора, Endian Firewall Community 2.2 находился в ста- Основные компоненты Endian дии релиз-кандидата, тогда как ком- Firewall 2.2 мерческая версия готовилась отме-  Ядро Linux 2.6.22.18.  Apache 1.3.33 (для веб-интерфейса). тить первый месяц продаж.  Squid 2.6STABLE-18 и DansGuardian О «родословной» Endian Firewall 2.9.9.3. ходят противоречивые слухи. Официальный сайт [1] лаконично сообщает, что-де он «includes a Hardened деюсь, что так и будет), к вашим усLinux Based Operating System» (имен- лугам все блага современной цивино так, большими буквами, как имя лизации: административный веб-инсобственное); DistroWatch.com утверж- терфейс с элементами AJAX (русский дает, что в основе дистрибутива ле- язык здесь присутствует, хотя перевод жит Red Hat Enterprise Linux, а Вики- и не полон) и SSH. Для их использовапедия и вовсе предлагает почти биб- ния необходимо только настроить «зелейскую историю в духе: «IPCop ро- леный» (GREEN) сетевой интерфейс, дил Endian, SmoothWall родил IPCop, указав его IP-адрес и маску подсети а SmoothWall родился от LFS и Red (по умолчанию это 192.168.0.15/24; есHat». Беглый анализ системы пока- ли вы намереваетесь включить EFW зывает, что каждый из них по-своему в существующую локальную сеть, знаправ: скрипты инициализации и схема чения, естественно, придется подпрахранения настроек явно были позаимс- вить) – что и делает инсталлятор нетвованы у SmoothWall/IPCop (сейчас посредственно перед тем, как начать они, по правде сказать, уже достаточ- копирование файлов. Не удивляйтесь, но сильно модифицированы), а распро- что у вас никто не спросит пароль root – странение всего дистрибутива в виде это задача следующего этапа. Первая загрузка тут же выдает набора RPM-пакетов и выбор языка Python для реализации большей части встраиваемую природу EFW с голособственных функций (кроме, пожалуй, вой: вместо традиционного приглашевеб-интерфейса – он написан на Perl, ния ввести имя пользователя и пароль более традиционном для дистрибути- вам сообщат, по какому адресу достувов такого класса) – это влияние Red пен веб-интерфейс и предложат «серHat. К слову сказать, для EFW выпуска- висное меню» из трех вариантов: вход ется комплект разработчика и исход- в систему, сброс настроек и установка ные тексты (тоже в форме RPM-паке- заводских параметров и перезагрузка. тов), однако на момент написания дан- Вся пост-инсталляционная настройка ной статьи они относились к предыду- и сопровождение происходит через веб-интерфейс (см. рис. 1), доступный щей версии – 2.1. по протоколу HTTPS. SSL-сертификат является самоподписанным, кроме тоНа первый взгляд Процесс установки Endian Firewall го, он удостоверяет доменное имя (коCommunty (и, на до полагать, не - торое автоматически генерируется Communty) вполне стандартен: сис- при установке и может быть изменетема задает минимум вопросов на но впоследствии), а доступ из локальанглийском, итальянском или немец- ной сети с большой вероятностью буком языках – на выбор пользователя – дет происходить по IP-адресу – в оби занимает весь жесткий диск (не за- щем, предупреждения браузера можбудьте сохранить с него ценные дан- но спокойно проигнорировать. Когные). Единственным сюрпризом явля- да вы откроете веб-интерфейс в перется последовательная консоль: ес- вый раз, вам (совсем как при знакомли на компьютере, отведенном вами стве с новой точкой доступа или бесдля EFW, есть COM-порт и вам посчас- проводным маршрутизатором) предлотливится найти нуль-модемный кабель, жат выбрать язык и часовой пояс, приможете начисто избавиться от клавиа- нять лицензию (GPLv2), восстановить туры с монитором и, в случае возник- резервную копию настроек (полезно, новения неполадок, входить в систе- если вы переустанавливали дистриму через Minicom или HyperTerminal, бутив) и ввести пароль администратокак в старые добрые времена. Ну а по- ра для доступа через Web, а также пака дистрибутив работает, как часы (на- роль root. Затем откроется мастер, со-

№6, июнь 2008

 Антивирус: ClamAV 0.93 и Amavisd 2.5.4.  Антиспам: SpamAssasin 2.2.7 и Pyzor 0.4.

 OpenVPN 2.1.  Ntop 3.3.  OpenSSH 3.9p1. стоящий из семи шагов. Вас попросят указать, какие зоны будет обслуживать брандмауэр, а также распределить по ним сетевые интерфейсы и настроить стандартные параметры (IP-адреса, маски, имя хоста и т. д.). Endian Firewall использует стандартную нотацию сетевых зон: зеленая (GREEN) – локальная (доверяемая) сеть, оранжевая (DMZ) – демилитаризированная зона, красная (RED) – Интернет и синяя (BLUE) для беспроводных клиентов. В каждой зоне должен находиться как минимум один сетевой интерфейс, при этом каждый интерфейс может быть ассоциирован лишь с одной зоной. Для красной зоны поддерживаются следующие типы подключений: Ethernet (статический и DHCP), PPPoE, ADSL (PCI и USB), ISDN, аналоговый/UMTS-модем (только в коммерческой версии – и почему бы?), а также специальный вариант Gateway (шлюз), который используется в тех редких случаях, когда машина с EFW не имеет красного интерфейса (то есть не подключена к Интернету напрямую), а для доступа в сеть используется внешний маршрутизатор. Все эти варианты подробно описаны в распространяющемся по лицензии GFDL англоязычном руководстве Endian Firewall [2], которое, на момент написания материала, было помечено как «разрабатываемое» («work in progress»). На наш взгляд, подсистема настройки сети реализована в EFW не самым лучшим образом. Она, должно быть, прекрасно справлялась со своей задачей в предыдущих версиях продукта, но в 2.2, после реализации поддержки нескольких внешних каналов (uplink), стала несколько путаной. Предположим, у вас есть два Ethernet-интерфейса, подключенных к различным провайдерам, и вы хотите организовать с их помощью отказоустойчивость; красная зона же, по определению, одна. Вы не можете просто расширить ее на обе сетевых кар-

19


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

Рисунок 1. Веб-интерфейс Endian Firewall выполнен не слишком просто, но со вкусом

Рисунок 2. «Диаграммы Ганта» для фильтров Squid

ты, поскольку в данном случае они будут включены в мост с одним общим IP-адресом. Для решения данной задачи и были предложены внешние каналы, редактор которых доступен в меню «Networking → Interfaces». Внешний канал обладает таким же набором параметров, что и красная зона (впрочем, здесь есть одно, но важное исключение: uplink может быть PPTP-подключеним. Будем считать, что это не архитектурное решение, а просто ошибка) – уже это наталкивает на мысль о «неполной нормализации», хотя сама идея – разделить «локальные» параметры настройки (IP-адрес, маску подсети, имя хоста и т. п.) от глобальных (адрес шлюза в сети провайдера) кажется вполне здравой, особенно если рассмотреть систему, у которой будет более одного канала в Сеть в каждый момент времени. Внешний канал может служить назначением (destination)

20

правила маршру тизации, задаваемого по соседству («Networking → Routing»). Прискорбно, но маршрутизация на основе политик (policy routing) в Community-версии не поддерживается, так что решать, что и куда посылать, можно лишь на основании сетевых адресов отправителя и получателя. С маршрутизацией тесно связана другая тема – фильтрация пакетов. В основе ее реализации в EFW лежит, конечно, Netfilter [3], сложность правильной настройки которого (посредством утилиты iptables) уже вошла в хрестоматию стандартных «страшилок» начинающего Linux-администратора. Неудивительно, что Endian Firewall, как и многие другие проекты, стремится скрыть ее за набором человеко-понятных правил. Последние разбиты по группам: Portforwarding/NAT, исходящий трафик (Outgoing traffic), обмен данными между зонами (Inter-

zone traffic), VPN и доступ к системе. Настройки по умолчанию вполне разумны: из любой зоны разрешен исходящий трафик к внешним DNS-серверам и отправка наружу «пингов», беспроводные клиенты (зона BLUE), кроме этого, могут обращаться к веб-серверам по протоколам HTTP/HTTPS, ну а локальным компьютерам (зона GREEN) доступны сверх этого FTP, POP3/IMAP, SMTP и их защищенные разновидности. Все, что не разрешено явно, запрещено, поэтому вам, вероятно, придется добавить, как минимум, правила, открывающие доступ к сетям обмена мгновенными сообщениями (кстати, во встроенном списке сервисов присутствуют ICQ и MSN Messenger, но нет Jabber – для него номера портов придется вводить вручную). Впрочем, фильтрацию исходящего трафика можно и отключить. Правила взаимодействия между зонами более простые – их суть сводится к тому, чтобы полностью изолировать DMZ (оранжевая зона) и беспроводных клиентов от локальной сети. Опять же, в реальной ситуации может потребоваться оставить некоторые хорошо определенные лазейки – скажем, активировать для зоны BLUE доступ по протоколу SMB. Разрешать все бессмысленно – тогда уж проще не выделять специальную зону. Как и в случае с исходящим трафиком, межзонный брандмауэр можно выключить. Правила доступа к системе стоят особняком. Во-первых, встроенные записи нельзя редактировать (возможно, разработчики опасаются, что излишне ретивый пользователь отрежет себе доступ к административному интерфейсу), во-вторых, они всегда активны. Доступ к админис тративному веб -интерфейсу разрешается из любой внутренней зоны (т.е. GREEN,BLUE,ORANGE и VPN), а вот SSH-соединение можно установить только из «зеленой» сети. По умолчанию, ICMP-запросы из красной сети не принимаются, и это следует иметь в виду при общении со службами поддержки интернет-провайдеров.

Только через мой... шлюз Следующая важная вкладка, на которую можно обратить внимание, – это Proxy. Традиционно под данным тер-


администрирование мином понимается веб-кэш наподобие Squid [4], но Endian реса 192.168.0.129-192.168.0.190 (разумеется, если вы не меFirewall идет гораздо дальше: здесь собраны прокси-серве- няли подсеть, выбранную по умолчанию). ры для HTTP, FTP, SMTP/POP3, SIP и даже DNS. Большая Из других сервисов можно перечислить систему обнаручасть из них обеспечивает также антивирусный (ClamAV) жения вторжений Snort [5] и сетевой монитор Ntop [6]. А вот и антиспам (SpamAssassin/Pyzor) контроль. чего в EFW, по сравнению с его предком – SmoothWall – Начнем, пожалуй, с World Wide Web. Его проксирова- не достает, так это системы обновлений. Это тем более ние и фильтрация осуществляются традиционной связкой странно для дистрибутива, обеспечивающего безопасность Squid и DansGuardian. Прокси-сервер может быть как про- целой сети, единственная уязвимость в котором может призрачным, так и обычным, причем эта настройка задается вести к очень серьезным последствиям. в отдельности для каждой зоны (т.е. можно, например, разВ целом же Endian Firewall можно назвать весьма разрешить свободный доступ в Интернет из локальной сети витым и законченным решением. и принудительно «заворачивать» на прокси беспроводных Огорчает только отсутствие в свободной редакции неклиентов). Поддерживаются всевозможные механизмы ав- которых функций, строго говоря, не являющихся корпораторизации: локальная (NCSA), LDAP (в том числе, в домене тивными (той же маршрутизации по политикам). Схема подActive Directory), Windows (наверное, было бы уместнее на- держки нескольких внешних каналов также могла бы быть писать NTLM и не вводить людей в заблуждение, тем более более удобной, но если перед вами стоит задача обеспечто в руководстве раздел по HTTP-прокси еще пока не на- чить доступ в Интернет для малой или средней сети и возписан) и Radius, а также политики. С помощью последних можностей IPCop/SmoothWall уже не хватает, на данный проможно ограничить порты, доступные для проксирования, дукт определенно стоит обратить свое внимание. веб-клиенты и MIME-типы, а также указать, какие фильтры и когда будут доступны: скажем, активировать филь- 1. Официальный сайт Endian Firewall – http://www.endian.com. трацию содержимого лишь в рабочее время. Конфигурация 2. Endian Firewall Reference Manual r. 2.2.0.2 – http://docs.endian. фильтров отображается в графическом виде внизу страниcom/2.2/en. цы (см. рис. 2), и можно легко видеть, какой участок неде- 3. Проект Netfilter отвечает за фильтрацию пакетов в ядре Linux – ли остался неохваченным. http://www.netfilter.org. Вторым по популярности интернет-протоколом являет- 4. Прокси-сервер Squid – http://www.squid-cache.org. ся электронная почта. Endian Firewall предоставляет прокси 5. Система обнаружения вторжений Snort – http://www.snort.org. для POP3 и SMTP. Это может показаться странным, но в до- 6. Сетевой монитор Ntop – http://www.ntop.org. кументации по их поводу не говорится практически ничего, а доступные настройки несколько сбивают с толку. Рискну, однако, упомянуть одну интересную функцию – защиту от спама. На чем можно тренировать спам-фильтр в POP3прокси, у которого и собственной базы сообщений-то нет? По мнению разработчиков EFW – на любом удаленном сервере с поддержкой IMAP4, достаточно лишь рассортировать хранящиеся на нем сообщения на спамовые и хэмовые (а еще лучше – делать это на регулярной основе, к примеру, попросив пользователей перемещать спам в определенную папку). POP3-прокси позволяет выискивать и помечать спам-сообщения, на какой (внешний) ящик они бы ни приходили – это выглядит интересным, но не снижает нагрузки на интернет-канал организации, так что пользы от такой фильтрации будет едва ли больше, чем от локальной (средствами почтового клиента получателя).

Реклама

Мы – за безопасные связи Разумеется, Endian Firewall может быть не только посредником, но и предоставлять сервисы сам по себе. Особого упоминания заслуживает VPN. EFW поддерживает две технологии: IpSec и OpenVPN; мы будем говорить о последней. Доступны два режима работы: OpenVPN-сервер и OpenVPNклиент (также известный как Gw2Gw – «шлюз/шлюз»; он пригодится, например, при подключении сети филиала к центральному офису). Примечательно, что OpenVPN-сервер запускается в режиме Bridged (а значит, удаленные клиенты смогут работать со всеми протоколами, полагающимися на широковещательную доставку: от Half-Life до SMB Browse) и перевести его в Routing средствами GUI нет никакой возможности. Для VPN-клиентов зарезервированы ад-

№6, июнь 2008

21


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

Обзор OpenSolaris 2008.05

Андрей Соколов Технологии будущих версий Solaris доступны для ознакомления уже сегодня. OpenSolaris 2008.05 демонстрирует текущий результат разработки новой системы управления пакетами и средами загрузки.

Что такое OpenSolaris 2008.05

86‑й сборке Solaris Nevada. Он предназначен только для x86-архитектуры как для 32-битной, так и 64-битной версии. Есть поддержка различных языков, включая русский. В дистрибутив входят традиционные технологии, как DTrace, ZFS, контейнеры, функции предсказуемого самовосстановления, а также новинки – система управления пакетами IPS, напоминающая APT из Debian, и утилита управления несколькими средами загрузки. Пакеты IPS, которые отсутствуют в исходном установочном образе, например инструменты разработки, можно загрузить после установки. Поддерживаются как пакеты IPS, так и пакеты SVR4. Программы из образа LiveCD распространяются под различными лицензиями, позволяющими бесплатно использовать, копировать и распространять их.

OpenSolaris 2008.05 – это выпущенный в начале мая 2008 года первый релиз предназначенного для конечных пользователей бинарного дистрибутива на основе Solaris Nevada. Разрабатывать такой дистрибутив взялись участники проекта Indiana, поставив перед собой задачу – создать образ LiveCD для установки операционной системы и окружения рабочего стола с возможностью установить при необходимости дополнительные программы из репозиториев, доступных по сети. Проект ведет свою историю с июня 2007 года и поддерживается в основном компанией Sun Microsystems, а его руководителем является перешедший на работу в эту корпорацию основатель Debian GNU/Linux Ян Мердок. Название выбрано не случайно – лидер проекта родом из одноименного штата. Основной центр документации по Indiana нахо- Установка дится на веб-узле http://opensolaris.org/ ОС OpenSolaris можно установить в каos/project/indiana/documents. честве системы с одновариантной заВ ходе реализации проекта Indiana грузкой или как часть мультизагрузочбыли созданы еще два предваритель- ной среды. Находящаяся в одном из... ных релиза для разработчиков: в но- первичном разделе операционная сисябре 2007 г. и в феврале 2008 г. Пла- тема Windows будет автоматически обнируется, что следующие версии дис- наружена, и в результате в меню GRUB трибутива будут появляться каждые появятся варианты загрузки: Windows 6 месяцев. или OpenSolaris. OpenSolaris 2008.05 основан на Если установлена ОС Linux или

22

Linux и Windows и загрузка осуществляется с помощью программы GRUB, перед установкой ОС OpenSolaris требуется сохранить содержимое файла меню GRUB /boot/grub/menu.lst. По завершении загрузки эту информацию потребуется внести в файл /boot/grub/ menu.lst, расположенный на файловой системе OpenSolaris. Важно отметить, что при установке ОС OpenSolaris в мультизагрузочной системе, в которой установлена ОС Linux, раздел Solaris должен находиться перед разделом свопинга Linux, так как оба вида разделов имеют одинаковые идентификаторы. Перед установкой OpenSolaris 2008.05 следует убедиться, что компьютер удовлетворяет следующим системным требованиям: 512 Мб оперативной памяти и 3 Гб дискового пространства (рекомендуется 10 Гб). Далее нужно добыть LiveCD. Образ размером 686 Мб доступен для скачивания на страничке http://www.opensolaris. com/get/. Заказать CD можно, заполнив форму по адресу: https://www2.sun.de/ dct/forms/reg_us_2307_228_0.jsp. LiveCD позволяет загрузить рабочий стол GNOME с небольшим набором прикладных программ. При загрузке с LiveCD предоставляется возможность выбора локали и раскладки клавиатуры. В обоих случаях можно


администрирование указать русскую. Переключение раскладки клавиатуры с русской на английскую и наоборот осуществляется традиционным для Solaris способом: Ctrl+пробел. В системе после загрузки имеются 2 учетные записи: jack с паролем jack и root с паролем opensolaris. Служба nwam обеспечивает автоматическое управление сетевыми интерфейсами. OpenSolaris поставляется с приличным количеством драйверов для многих устройств, но в целом спектр поддерживаемых устройств не так широк, как у Windows или даже Linux. Поэтому перед установкой рекомендуется воспользоваться программой Device Driver Utility, ярлык которой расположен на рабочем столе. Эта утилита позволяет оценить возможность полноценной работы OpenSolaris на данной машине и определить какие дополнительные драйверы для этого потребуются. Для поиска драйверов можно посетить следующие сайты: n http://www.sun.com/bigadmin/hcl – официальный список поддерживаемого оборудования со ссылками на сайты с драйверами; n http://homepage2.nifty.com/mrym3/ taiyodo/eng – большая коллекция драйверов для сетевых карт. Запуск инсталлятора осуществляется двойным щелчком по ярлыку «Установить OpenSolaris» на рабочем столе LiveCD. Процесс установки сделан очень простым, ориентированным на начинающего пользователя. Во время установки щелчком по кнопке «Далее» предстоит преодолеть семь форм: «Добро пожаловать». Содержит информацию о том, где можно получить справочные сведения по установке и началу работы. «Диск». На данном шаге следует выбрать первичный раздел на одном из дисков для установки OpenSolaris или создать такой раздел на выбранном устройстве. На отведенном под OpenSolaris разделе создаются более мелкие структурные единицы – слайсы. Всего их может быть 10, каждому присваивается номер от 0 до 9. В ходе установки будут выделены три слайса: загрузочный (с номером 8, содержащий программу загрузки и таблицу слайсов), корневой (с номером 0, для

№6, июнь 2008

Device Driver Utility

пула ZFS) и для свопа (с номером 1). жены. Во время установки все содерКроме перечисленных, существует жимое существующего раздела Solaris слайс с номером 2, представляющий перезаписывается, данные на нем сособой весь раздел. Просмотреть ин- хранить невозможно. Существующие формацию из таблицы слайсов, сфор- расширенные разделы не отображамировавшейся в ходе установки, мож- ются в ходе установки OpenSolaris, одно при помощи утилиты format. В верх- нако первичный раздел, в котором расней части формы отображаются до- положены расширенные разделы, явступные диски и их размеры в гига- ляется видимым. байтах и предлагается выбрать диск. «Часовой пояс». Здесь можно Далее следует выбрать параметр «Ис- ввести правильный часовой пояс, дапользовать весь диск» или «Разбить ту и время для устанавливаемой сисдиск». В нижней части формы отобра- темы. В верхней части панели отображаются существующие разделы диска. жается карта мира, на которой отмеЕсли невозможно прочитать таблицу чены крупные города. В нижней части существующих разделов, отобразится панели расположены раскрывающипредлагаемое разбиение. В этом слу- еся списки. Часовой пояс можно вычае все данные на диске будут уничто- брать с помощью карты или раскрыТаблица 1. Функциональность утилиты pkg Создание образа

pkg image-create [-FPUz] -a

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

pkg install [-nv] pkg_fmri

Поиск пакетов

pkg search [-lr] [-s server] token

Обновление всех пакетов образа

pkg image-update [-nv]

Отображение информации о состоянии пакетов

pkg list [-aHsuv] pkg_fmri

Проверка того, что пакеты установлены корректно

pkg verify -[fv] pkg_fmri

Отображение информации о пакете

pkg info [--license] pkg_fmri

Отображение атрибутов действий

pkg contents [-Hm] [-o attribute] [ -s sort_key] [-t action_type]

Удаление пакетов

pkg uninstall [-nrv] pkg_fmri

Добавление информации о доступных репозиториях

pkg set-authority [-P] [-k ssl_key] [-c ssl_cert] [-O origin_url] authority

Удаление информации о репозитории

pkg unset-authority authority

Отображение информации о репозиториях

pkg authority [-H] authority

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

pkg refresh

23


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

Инсталлятор. Форма «Диск»

«Установка». Отображает принятые параметры установки, предоставляет возможность вернуться к предыдущим формам для изменения настроек или нажать кнопку «Установить» для начала установки. «Завершить». Появляется после завершения установки, предоставляет возможность просмотра журнала установки, а также перезагрузки компьютера. Во время первой загрузки системы производится настройка служб, поэтому она значительно дольше последующих. В результате установки будет получена система, окружение рабочего стола которой построено на базе X.Org и GNOME 2.20.2. В комплекте будут следующие приложения: проигрыватели Rhythmbox и Totem, логические игры, графический редактор GIMP, программа просмотра изображений на цифровом фотоппарате Gtkam, браузер Firefox, почтовые клиенты Evolution и Thunderbird, клиент обмена мгновенными сообщениями (ICQ, jabber, IRC…) Pidgin, программа просмотра документов Evince.

Управление пакетами

Package Manager

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

24

Система управления пакетами в OpenSolaris 2008.05 называется Image Packaging System(IPS). На данный момент работа над ней еще не завершена, поэтому разработчики рекомендуют только экспериментальное внедрение. Текущая версия удовлетворяет только 4 из 7 требований, сформулированных сообществом (http:// www.opensolaris.org/os/project/indiana/ resources/problem_statement). Программное обеспечение для OpenSolaris распространяется в виде пакетов, представляющих собой коллекции устанавливаемых объектов: файлов, каталогов, ссылок, драйверов – а также информации о зависимостях. Каждый элемент этой коллекции по терминологии IPS называется действием. Место, куда устанавливаются пакеты, в IPS обозначается понятием «образ». Образ выступает как IPS-клиент, взаимодействующий с IPSсервером (репозиторием). Установленная OpenSolaris 2008.05 представляет собой образ, настроенный на репозиторий http://pkg.opensolaris.org/:80. Установка пакета в один образ никак не


администрирование влияет на другой образ, что особенно важно при организации зон. Утилита IPS pkg позволяет создавать образы, устанавливать, искать, обновлять, удалять пакеты в образе, при этом полностью проверяя зависимости между ними. Она может быть вызвана со следующими параметрами (см. таблицу 1). В формате команды параметр pkg_ fmri представляет собой идентификатор пакета. В идентификаторе pkg:// opensolaris.org/library/libc@5.11,5.110.75:20071001T163427Z: n opensolaris.org – это репозиторий; n libc – это название пакета, после которого через символ «собака» идет строка версии из четырех компонентов:  5.11 – версия компонента;  5.11 – версия сборки;  0.75 – версия ветки;  20071001T163427Z – код времени. Не все составные части pkg_fmri обязательны. Например, установка openoffice выполняется по команде: «pkg install openoffice». Более подробную информацию о возможностях утилиты pkg можно получить по команде «man pkg». Как вариант для управления пакетами можно использовать графическое приложение Package Manager, имеющее интуитивно понятный интерфейс и похожее на Synaptic. Однако его возможности значительно уступают возможностям pkg. Существуют инструменты, позволяющие разработчикам создавать собственные репозитории (pkg.depotd) и располагать пакеты в них (pkgsend). Планируется реализовать зеркалирование сетевого репозитория, службу автоматического обновления и группировку пакетов. В таблице 2 приведены доступные в Интернете репозитории и количество пакетов в них.

Управление средами загрузки Под средой загрузки понимается набор критически важных для работы OpenSolaris файловых систем. При выполнении команды «pkg image-update», обновляющей все установленные в текущем образе па-

№6, июнь 2008

Таблица 2. Количество пакетов в имеющихся репозиториях

кеты до их последней версии, создается клон – загружаемая копия текущей среды загрузки. Обновление пакетов выполняется в клоне, а не в исходной среде загрузки. После успешного завершения изменений в клоне он становится активной средой загрузки, и после перезагрузки системы в меню GRUB появляется пункт загрузки с этого клона. Исходная среда тоже представлена в меню GRUB. Поэтому, если загрузка обновленной среды завершится неуспешно, можно после перезагрузки в меню GRUB выбрать исходную. Таким образом, неудачное обновление пакетов теперь не потребует переустановки или восстановления из резервной копии – достаточно вернуться в прежнее загрузочное окружение. В отличие от клона снимок – это доступная только для чтения копия файловой системы или среды загрузки в определенный момент времени. Загрузка со снимка невозможна. Создавать снимки и клоны сред загрузки и управлять ими можно при помощи утилиты /usr/sbin/beadm. Команды beadm позволяют выполнять действия над средами загрузки в целом, а не над отдельными наборами данных (файловыми системами, снимками и клонами). Теперь не требуется пользоваться для этого сериями команд ZFS над каждым отдельным набором данных и ручным конфигурированием меню GRUB. Утилита beadm может быть запущена со следующими параметрами (см. таблицу 3).

http://pkg.opensolaris.org/:80

4464

http://pkg.sunfreeware.com:9000/

296

http://blastwave.network.com:10000/

1714

себе будущее этой операционной системы. Приятно видеть почти полную русификацию и справку на русском языке. В то же время русификация еще не доведена до конца: достаточно странным кажется смешение русских пунктов с английскими в меню GNOME, при установке информация о состоянии установки англоязычная, в то время как все остальные надписи русские. Несмотря на то что OpenSolaris 2008.05 позиционируется как дистрибутив, ориентированный на конечного пользователя, в нем отсутствует некоторая важная для применения на десктопах функциональность: по умолчанию невозможна перезагрузка от имени непривиллегированного пользователя, аудио и видео не проигрываются. Еще одним недостатком является то, что в терминале не воспринимаются весьма полезные клавиши PgUp, PgDown, Home, Insert. В свете того, что обычному пользователю не хочется ничего настраивать, а надо, чтобы работало все и сразу, я считаю целесообразным выпускать не только LiveCD, а еще и LiveDVD. При загрузке с LiveDVD должна быть возможность слушать музыку и смотреть фильмы, то есть проигрыватели должны быть не просто для видимости, но еще и функционировать. Большее количество прикладных программ, расположенных на носителе большего размера, позволит привлечь больЗаключение А теперь позволю себе порассуж- шее количество людей: всех тех, у кодать на счет области применения го нет возможности и желания выкачивать пакеты из Интернета. OpenSolaris 2008.05. Будем ждать следующих релизов Данный дистрибутив идеально подходит для знакомства с технологиями с доделанной IPS и исправленными OpenSolaris, позволяет представить недостатками. Таблица 3. Функциональность утилиты beadm Выбор активной среды загрузки

beadm activate beName

Создание новой среды загрузки из снимка или клонированием существующей

beadm create [-a] [-e non-activeBeName | beName@snapshot] [-o property=value] ...[-p zpool] beName

Создание снимка текущей среды загрузки

beadm create beName@snapshot

Удаление среды загрузки или снимка

beadm destroy [-f] beName | beName@snapshot

Отображение информации о средах загрузки

beadm list [-a | [-ds] [-H] [beName]

Монтирование среды загрузки

beadm mount beName mountpoint

Переименование среды загрузки

beadm rename beName newBeName

Отмонитрование среды загрузки

beadm unmount beName

25


ь т а р г и ми ы а р в е а ар т н п с с ые р о н о н т т о а с в, к вм е ш о о з с и р » р хп Три трато ыш а

ни с ыгр и з да. о м о р д г а в 8 ти е 200 ный с и м а и е ч т у д уго Сис я ть л « н о и п л р а п ор о м Вас т Журн т в е о а в ный ш м я а е с л т ь г с т пр и «Си води х о а р л п т ода. ур на шах: г ы ж буду 8 р в г 0 20 ды g.ru оз ы о е a р к и m д в е a о w.s с тия льны ое полуг w а а w ч и у ц а с пе на л Д ля тор р в е у т а и ж з йте в. тыщ ор» а о т О с л а а р а н т  сь н ни с ». ж ур е з и т з и м й и р д у а егистрир кий П йте коды с н и ру дм ар  З зделе «А но активи ра ль зов: и р п в ледовате а оды к ш е ы с т р о руй и о з ыг  П в р и 3 т »: ак тьс я З и д А д. о Р о в « ды г о о з 8 р к и п 0 е р 0 т т руй за 2 ий П Буде и 9 к в , с и 8 н т №7, дми »: ак А в А о год. В л Д 8  а « 0 н 0 р з оды 2 у к и ж а р е з т з П 2 уй й ода. 1 г р и , и к 1 8 и в 1 с 0 20 10, мин ак т и е : № и д » д А в о И о  «ТР на л олуг р п з у и е ж р о з йП тор и в к и а с з д м и н ур на ло в А  хж е с в з и


з и р П й и к с н и м Ад РАЗ»

из « р П с к ий н и м атор к и Ад н о мму к ур с ы К ер ы  ук ты е в д ы р о н е р с б е че еп  У граммны ыделенны в ро  П туальные ир  В А» В Д « р из П й и нс к и м атор д к и А н о мму к ур с ы К ер ы  ук ты е в д ы р о н е р с б е че еп  У граммны ыделенны в ро  П туальные ир  В РИ» Т « з При й и к нс Адми тбук ы оу  Н бные курс родукты че еп У ы н м  р ам г о р  П

.. . я с т е а н и ч а н о к ь л о Все т

Более подробную информацию о сроках и правилах проведения розыгрышей призов смотрите на сайте журнала – www.samag.ru


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

OpenBSD 4.3: что новенького?

Влад Глаголев Данная статья знакомит с последними новшествами и изменениями, вошедшими в финальный релиз открытой операционной системы OpenBSD 4.3. 28


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

К

ак известно, релизы OpenBSD Дело в том, что составляющая часть выходят дважды в год: 1 мая Столлман о свободе OpenBSD и 1 ноября, и перед нами оче- К каждому релизу команда OpenBSD вы- портов OpenBSD – это скрипты (как и в люредной релиз OpenBSD 4.3 (http://www. пускает комикс и размещает его на сайте бой другой системе управления програм(http://www.openbsd.org/lyrics.html#43) с не- мным обеспечением), написанные разраopenbsd.org/43.html). Изменений, как всегда, очень мно- которыми комментариями, а также песню ботчиками. Они отвечают за скачивание го, и это отразилось на всей ОС: начи- в форматах ogg и mp3. Не буду вдаваться исходных кодов, компиляцию и установная от корректировок в пакетном филь- в музыкальные предпочтения разработчи- ку. В них также отмечается, под какой литре и заканчивая поддержкой новых ков, а посмотрим, чему посвящены их худо- цензией распространяется устанавливаежественные старания в выпуске 4.3. мый продукт, и в некоторых случаях (как с процессорных архитектур. В этот раз команда OpenBSD опроверг- Java Development Kit) пользователю прихоOpenBSD – это полноценная операционная система, включающая в се- ла представления о свободе одного из име- дится самостоятельно скачивать дистрибя не только ядро (kernel), но ещё и ог- нитых личностей в мире Open Source – Ри- бутивы программ и только потом испольромный набор встроенных программ чарда Столлмана (Richard Stallman), основа- зовать систему управления пакетами для (userland). Именно это делает OpenBSD теля проекта GNU и Free Software Foundation. их установки. Чистота кода была в очередной раз дотакой близкой к UNIX, где множество Связано это с ситуацией, когда в списках программ напрямую зависит от сис- рассылки OpenBSD Ричард упрекнул раз- казана упорными усилиями, и разработчитемных вызовов. Такой подход пред- работчиков (http://marc.info/?l=openbsd- ки OpenBSD придумали на эту тему комикс ставляет каждую UNIX-подобную опе- misc&m=119730630513821&w=2) в том, что к грядущему релизу. Начинается комментасистема портов не полностью «чиста» в ли- рий со смешной истории Ричарда Столлмарационную систему уникальной. Так, большинство программ для цензионном плане, и призвал людей не ис- на в самолёте, а последние строки заканчиваются следующим: «That man is a false OpenBSD (например, tar) были перепи- пользовать эту операционную систему. Конечно же, такие изречения вызвали leader. He is a hypocrite. There may be some саны в своё время под лицензии BSD/ ISC, что сделало её в большинстве слу- волну негодования у пользователей и раз- people who listen to him. But we don't listen чаев независимой от «свободы» GNU. работчиков OpenBSD. Они сразу же «сбе- to people who do not follow their own stupid В последние релизы также вхо- жались» и стали опровергать ляп, который rules». В общем, судите сами. дит X.Org (под кодовым названием допустил всем известный RMS. Xenocara). X.Org в OpenBSD представОтмечу, что большое внимание ляет собой постоянно обновляющуюся  auich (карточки Intel (ICH)); ветку X.Org 7 с множественными моди- в течение разработки было уделе eso (ESS Technology Solo-1 PCI фикациями исходников разработчика- но беспроводным устройствам, но об AudioDrive); этом в конце статьи. ми из команды OpenBSD. n 64-битная адресация блоков в файловой системе FFS: обеспечивает Новшества Новшества в ядре поддержку дисков, разделов и файn Долгожданная многопроцессорная в пользовательском ловых систем, размер которых преподдержка для архитектур sparc64 окружении вышает 2 Тб; (исключением пока является лишь Новые программы: n автоматическое размонтирование n snmpd/snmpctl – SNMP-сервер Sun Enterprise 10000) и mvme88k файловых систем на USB-устройи программа его управления; (MVME188 и MVME188A). ствах; n OpenBSD теперь может похвас- n pcidump – позволяет получить n улучшена производительность радетализированную информацию таться поддержкой систем класса боты с Flash-устройствами посредо подключенных PCI-устройствах; K (K200 и K410) для архитектуры ством включения DMA (что увелиn ldattach – служит для привязки обhppa. чило скорость записи/чтения); работчика к последовательному n Множество новых драйверов доn упрощена конфигурация балансиинтерфейсу, что позволяет отправбавлено для архитектуры sgi. ровки нагрузки CARP; лять/получать данные через него. n Улучшена поддержка оборудоваn несуществующие разделы в fstab ния в системе, включающая драйпросто игнорируются, что теперь Обновление функционала: веры для широкого спектра устне будет мешать монтированию ниn добавлена поддержка X11 для арройств (более 30 новых чипсетов): жеследующих разделов; хитектуры sgi;  с е т е в ы х к а р т ( B C M 5 9 0 6 / n автоматическое определение разn некоторые драйверы аудиоустBCM5906M 10/100 и BCM5755 делов EXT2 для архитектур sparc ройств поддерживают многокаи sparc64; 10/100/Gigabit); нальное воспроизведение и запись n в основной файл пакетного филь аудиокарт (VIA Envy24); (если железо это обеспечивает):  RAID-контроллеров (Dell CERC6/ тра PF (pf.conf) теперь можно под c m p c i (C - M e d i a C M I 8 3 3 8 , PERC6 и LSI SAS1078); ключать дополнительные; CMI8738, CMI8768);  температурных сенсоров (TI n поддержка IPv6 для демона sppp;  auvia (встроенные устройства n псевдоустройства svnd теперь моTHMC50, Analog ADM1022/1028); AC'97 VIA VT82C686A, VT8233,  и другой экзотической перифегут работать с блоковыми устройстVT8235, VT8237); рии. вами;

№6, июнь 2008

29


администрирование n улу чш е на работа пр о г раммы

 добавлена поддержка совмест-

disklabel, добавлена возможность определения разделов NTFS; n SCSI -д райверы теперь более надёжны на многопроцессорных системах; n TCP-ответы на высокофрагментированные пакеты теперь формируются без опасения за повреждение памяти ядра; n установка длины ключей AES 192 и 256 бит для IPSEC в конфигурационном файле.

ной работы с snmpd (для отправки SNMP-треппинга);  добавлена поддержка DNSтрансляций, основанных на UDP; n OpenSSH 4.8:  добавлена поддержка chroot для sshd;  sf tp -ser ver теперь вс троен в sshd;  снят лимит на использование 100 файловых дескрипторов (теперь он определяется динамически в зависимости от количества доступных дескрипторов);  множество других улучшений (http://www.openssh.com/txt / release‑4.8).

Новые возможности системы портов: n программа make была переработана с целью обеспечения многозадачной/параллельной сборки (multijob/parallel build): на многопроцессорных системах это значительно повышает производительность сборки портов из исходников. Изменения в процессе установки/ обновления: n поддержка консоли для всех существующих (поддерживаемых) платформ; n определение скорости консоли и автоматическое создание /etc/ttys на этапе установки; n запоминание DNS-серверов при рестарте процесса установки; n образы установочных дисков теперь доступны и для архитектуры vax. Обновления основных встроенных программ: n OpenBGPD 4.3: улучшена корректная обработка префиксов, приводящих к возникновению маршрутных «петель» (route loops); n OpenNTPD 4.3: реализовано более изящное управление изменением IP-адресов клиентов, улучшения в обработке ошибок и системного протоколирования; n OpenOSPFD 4.3: опции командной строки теперь синхронизированы с bgpd; n relayd 4.3 (hoststated/hoststatectl были переименованы в relayd/ relayctl):  улучшены синтаксис конфигурационного файла;  поддержка перезапуска;  поддержка фильтров для URL;

30

Более 4900 портов, в состав которых входят: n GNOME 2.20.3; n KDE 3.5.8; n Xfce 4.4.2; n GNUstep 1.14.2; n Mozilla Firefox/Thunderbird 2.0.0.12; n MySQL 5.0.51a; n PostgreSQL 8.2.6; n OpenMotif 2.3.0; n OpenOffice.org 2.3.1. Статистика портов для поддерживаемых архитектур для релиза 4.3: n i386: 4782; n amd64: 4708; n powerpc: 4634; n sparc64: 4613; n alpha: 4233; n hppa: 3971; n arm: 3377; n sparc: 3159; n sh: 2046; n mips64: 1897; n m68k: 830; n vax: 296. Известно, что Open Source-сообщество сильно своим единством и взаимопомощью. OpenBSD – яркий пример этому. Сторонние разработчики помогают улучшать свои продукты, а команда OpenBSD в свою очередь включает в состав своей ОС эти наработки. Основные из них в версии 4.3: n Xenocara (базируется на X.Org 7.3 (+ патчи), freetype 2.3.5, fontconfig

2.4.2, Mesa 7.0.2, xterm 232 и многие другие составляющие); n GCC 2.95.3 (+ патчи) и 3.3.5 (+ патчи); n Perl 5.8.8 (+ патчи); n улучшенная версия Apache 1.3, с поддержкой SSL/TLS и DSO; n OpenSSL 0.9.7j (+ патчи); n Groff 1.15; n Sendmail 8.14.1 (вместе с libmilter); n BIND 9.4.2 (+ патчи); n Lynx 2.8.5rel.4 с поддержкой HTTPS и IPv6 (+ патчи); n Sudo 1.6.9p12; n Ncurses 5.2; n KAME IPv6; n Heimdal 0.7.2 (+ патчи); n Arla 0.35.7; n Binutils 2.15 (+ патчи); n Gdb 6.3 (+ патчи). Конечно же, такому функционалу необходима хорошая «текстовая» поддержка для того, чтобы с ним разобраться. OpenBSD – одна из лучших операционных систем по качеству документирования, точности и актуальности описанных драйверов, системных и программных функций. К выходу релиза 4.3 было обновлено, добавлено и переработано несколько тысяч строк документации.

И напоследок Спустя несколько дней после официального выхода OpenBSD 4.3 в дерево исходников (ветка -current) была добавлена поддержка WPA/WPA2 для беспроводных устройств, что предвещает интересные тенденции в развитии операционной системы на ноутбуках и других портативных устройствах (где сейчас в основном и используется WPA). Поэтому дождёмся осени и релиза OpenBSD 4.4, который обещает быть ещё более дружелюбным к пользователям.


Реклама


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

Настраиваем связку Apache + PHP + MySQL на базе ОС OpenBSD 4.3

Максим Гришков Предположим, у вас возникла необходимость в развертывании веб-сервера с поддержкой PHP и MySQL. Данную задачу просто решить, имея под рукой свежий дистрибутив ОС OpenBSD 4.3, поскольку базовая установка данной ОС уже содержит настроенный и готовый к работе вебсервер Apache версии 1.3. Остается только прикрутить к нему PHP и MySQL. 32


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

С

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

Установка СУБД MySQL Устанавливаем пакет mysql-server:

Соглашаемся, что пользователю root можно заходить только с localhost: Disallow root login remotely? [Y/n] y ... Success!

Удаляем тестовую БД:

# pkg_add -v mysql-server parsing mysql-server-5.0.51a <--- ---> mysql-server-5.0.51a: complete --- mysql-server-5.0.51a ------------------You can find detailed instructions on how to install a database in /usr/local/share/doc/mysql/README.OpenBSD. Using MySQL in an OpenBSD environment If you are installing MySQL for the first time, you have to create a default database first. In order to create the database, please run /usr/local/bin/mysql_install_db

Следуя совету, создаем системные таблицы в служебной БД: # /usr/local/bin/mysql_install_db Installing MySQL system tables... OK Filling help tables... OK PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /usr/local/bin/mysqladmin -u root password 'new-password' /usr/local/bin/mysqladmin -u root -h bsd.my.domain password 'new-password' Alternatively you can run: /usr/local/bin/mysql_secure_installation

Настраиваем безопасность с помощью скрипта mysql_ secure_installation, для этого запускаем СУБД: # /usr/local/bin/mysqld_safe &

Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success!

Соглашаемся перезагрузить таблицу привилегий, для того чтобы изменения вступили в силу: Reload privilege tables now? [Y/n] y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL!

Настройка безопасности закончена. Поскольку в OpenBSD Аpache сконфигурирован для работы в chroot-окружении в директории /var/www, а сокет MySQL находится по адресу /var/run/mysql/mysql.sock, возникает проблема – Apache «не видит» директорию /var/run и сокет MySQL. Решить проблему можно, создав жесткую ссылку на файл MySQL сокета mysql.sock: # mkdir -p /var/www/var/run/mysql # ln -f /var/run/mysql/mysql.sock /var/www/var/run/mysql/mysql.sock

Для того чтобы активировать запуск СУБД MySQL во время загрузки, необходимо добавить следующую строчку в файл /etc/rc.conf.local: mysqld=YES

Запускаем скрипт настройки безопасности: # /usr/local/bin/mysql_secure_installation

Вводим пустой пароль пользователя root: Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation.

Соглашаемся установить пароль для пользователя root и вводим пароль: Set root password? [Y/n] y New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success!

Удаляем анонимного пользователя: Remove anonymous users? [Y/n] y ... Success!

№6, июнь 2008

После этого добавляем скрипт для запуска mysqld в файл /etc/rc.local после строки «starting local daemons» перед строкой «echo '.'»: if [ X"${mysqld}" == X"YES" -a -x ↵ /usr/local/bin/mysqld_safe ]; then echo -n " mysqld"; /usr/local/bin/mysqld_safe ↵ --user=_mysql --log --open-files-limit=256 & for i in 1 2 3 4 5 6; do if [ -S /var/run/mysql/mysql.sock ]; then break else sleep 1

OpenBSD

В мае этого года команда разработчиков OpenBSD объявила о выходе очередного релиза этой операционной системы под номером 4.3 (подробности см. на стр. 28-30). Операционная система OpenBSD берет начало от программной платформы Berkeley Software Distribution (BSD), разрабатывавшейся специалистами Калифорнийского университета в Беркли. Проект OpenBSD был основан Тео де Раадтом, одним из глав-

ных разработчиков NetBSD. В конце 1995 года в результате раскола в команде NetBSD Раадт был вынужден прекратить работы над этой операционной системой и заняться собственным делом. Основное внимание при разработке OpenBSD уделяется безопасности. Участники проекта подчеркивают, что за более чем десятилетнюю историю OpenBSD в базовых версиях операционной системы были выявлены только две уязвимости, допускающие удаленную эксплуатацию.

33


администрирование echo -n "." fi done # # Создаем MySQL-сокет в chroot-окружении Apache mkdir -p /var/www/var/run/mysql sleep 2 ln -f /var/run/mysql/mysql.sock ↵ /var/www/var/run/mysql/mysql.sock fi

Установка и настройка СУБД MySQL закончена.

Установка PHP # pkg_add -v php5-core <--- ---> php5-core-5.2.5p2: complete --- php5-core-5.2.5p2 ------------------To enable the php5 module please create a symbolic link from /var/www/conf/modules.sample/php5.conf to /var/www/conf/modules/php5.conf. ln -s /var/www/conf/modules.sample/php5.conf /var/www/conf/modules The recommended php configuration has been installed to /var/www/conf/php.ini. Don't forget that the default OpenBSD httpd is chrooted into /var/www by default, so you may need to create support directories such as /var/www/tmp for PHP to work correctly.

Следуя полученным советам, активируем модуль php5 путем создания символической ссылки: # ln -s /var/www/conf/modules.sample/php5.conf ↵ /var/www/conf/modules

А также создаем директорию /var/www/tmp, принадлежащую пользователю www из группы www (apache), необходимую для корректной работы РНР в chroot-окружении: #mkdir /var/www/tmp #chown www:www /var/www/tmp

Устанавливаем модуль php5-mysql # pkg_add -v php5-mysql <--- ---> php5-mysql-5.2.5: complete --- php5-mysql-5.2.5 ------------------You can enable this module by creating a symbolic link from /var/www/conf/php5.sample/mysql.ini to /var/www/conf/php5/mysql.ini. ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/mysql.ini

Следуя полученному совету, активируем модуль php5mysql путем создания символической ссылки: # ln -fs /var/www/conf/php5.sample/mysql.ini ↵ /var/www/conf/php5/mysql.ini

Замечание: почему-то был создан пустой файл /var/ www/conf/php5.sample/mysql.ini, исправим это: cat extension=mysql.so > ↵ /var/www/conf/php5.sample/mysql.ini

Добавляем другие необходимые модули РНР, например, MCRYPT, GD, MHASH:

34

# pkg_add -v php5-mcrypt <--- ---> php5-mcrypt-5.2.5: complete --- php5-mcrypt-5.2.5 ------------------You can enable this module by creating a symbolic link from /var/www/conf/php5.sample/mcrypt.ini to /var/www/conf/php5/mcrypt.ini. ln -fs /var/www/conf/php5.sample/mcrypt.ini /var/www/conf/php5/mcrypt.ini

Активируем модуль php5-mcrypt путем создания символической ссылки: # ln -fs /var/www/conf/php5.sample/mcrypt.ini ↵ /var/www/conf/php5/mcrypt.ini

Устанавливаем модуль php5-mhash: # pkg_add -v php5-mhash

Далее аналогично php5-mcrypt. Замечание: если во время установки системы вы не устанавливали компонент xbase43.tgz (базовая установка X11), то необходимо устанавливать пакет php5-gd-5.2.5-no_x11, в остальных случаях – php5-gd-5.2.5. Делается это при помощи параметра -i утилиты pkg_add: # /usr/local/bin/mysql_install_db Ambiguous: choose package for php5-gd 0: <None> 1: php5-gd-5.2.5 2: php5-gd-5.2.5-no_x11

Вводим с клавиатуры «2» и жмем клавишу <Enter>. Your choice: 2

Далее аналогично php5-mcrypt.

Настройка автозапуска Apache Для того чтобы активировать запуск веб-сервера Apache во время загрузки, необходимо изменить значение флага httpd_flags в файле /etc/rc.conf.local: httpd_flags="" # for normal use: "" (or "-DSSL" after reading ssl(8))

Заключение Потратив в результате выполнения вышеперечисленных несложных операций около 15 минут времени, имеем рабочую связку Apache+PHP+MySQL. Преимуществами такого подхода являются простота реализации, изначальная ориентированность ОС на обеспечение наивысшего уровня безопасности, а недостатком, на мой взгляд, не самая свежая версия веб-сервера Apache. Удачи! 1. Вышла операционная сис тема OpenBSD 4.3 – http:// www.astera.ru/software/?id=57346. 2. H ow-to: O p en B S D 3 . 8 +A pac he +PH P+MySQ L – ht t p: // www.freeyourbox.org/tutorials/bsd/obsd3.8_apache_php_ mysql.html. 3. Установка OpenBSD 4.2 – http://www.lissyara.su/?id=1589. 4. Package Management – http://www.openbsd.org/faq/faq15.html.


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

Handy Backup Server – решение проблемы резервного копирования для малого и среднего бизнеса Программа резервного копирования корпоративной информации Handy Backup Server компании «Новософт» представляет собой мощное серверное решение для защиты данных в Windowsсетях малых и средних предприятий.

П

ри весьма умеренной стоимости, Handy Backup Server сочетает в себе самые современные технологии, позволяющие оптимизировать процесс резервного копирования серверов, рабочих станций, а также подключаемых к сети мобильных устройств. В каждом из этих случаев можно не только выполнять полное и инкрементальное копирование отдельных файлов и папок, но и создавать образы жестких дисков и их разделов. Программа умеет сохранять данные практически на все известные носители, а также RAID-массивы, сетевые диски и передавать их на удаленные серверы по протоколам FTP и SFTP. Notes, баз данных MySQL, MS Access, Взаимодействие серверной час- FoxPro, MS SQL и других, совмести Handy Backup Server с рабочими тимых с протоколом ODBC. Причем станциями осуществляется при помо- в случае с MS SQL, базы копируютщи программ-агентов, дающих дос- ся как по протоколу ODBC, так и с иступ к данным на компьютерах-клиен- пользованием «родного» Microsoft API. тах прямо из приложения. Стандартная Такой способ позволяет избегать ошилицензия включает 20 агентов для ус- бок и дает возможность скопировать тановки на рабочие станции. всю базу целиком, включая таблицы, Помимо резервирования пользо- хранимые процедуры, функции, пакевательских файлов, программа вы- ты и триггеры. полняет автоматический поиск, копиHandy Backup Server предлагарование и восстановление информа- ет системному администратору полции, как правило, хранимой на сер- ный набор инструментов, делающих верах – баз и конфигураций «1С», резервное копирования корпоративгрупп хранения MS Exchange и Lotus ной информации быстрым, безопас-

№6, июнь 2008

ным и полностью автоматическим – ZIP‑сжатие, 128-битное шифрование, планировщик задач, возможность запуска в качестве сервиса Windows, когда данные резервируются в фоновом режиме, при этом не создавая помех работе пользователей. Процессы программы по умолчанию имеют низкий приоритет и активизируются только тогда, когда высвобождаются системные ресурсы. Получить подробную информацию о программе, а также загрузить пробную версию можно на сайте продукта по адресу http://www.handybackup.ru/ handybackup-server.shtml.

35


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

Btrfs от Oracle: наш ответ ZFS

Андрей Пешеходов Файловая система ZFS от Sun Microsystems, вышедшая в 2005 году, явилась настоящим прорывом в области архитектуры универсальных файловых систем общего назначения. Однако цели и задачи, которые ставят перед собой разработчики новой файловой системы btrfs от компании Oracle, впечатляют даже после знакомства с особенностями ZFS, которую, казалось бы, никто не сможет превзойти еще много лет.

B

trfs, о начале разработки которой было объявлено в июне 2007 года, находится сейчас на стадии альфа-версии. Тем не менее основные ее возможности ясны, и многие из них можно попробовать уже сейчас. Посмотрим подробнее, что именно предлагает пользователям Chris Mason – основной разработчик btrfs: n Поддержка доступных на запись снапшотов.

36

n Поддержка субтомов – множественных именованных корней в одной файловой системе с общим пулом хранения. n Поддержка сложных многодисковых конфигураций – RAID уровней 0, 1, 5, 6 и 10, а также реализация различных политик избыточности на уровне объектов ФС – то есть возможно назначить, к примеру, зеркалирование для какого-либо каталога или файла.

n Copy-on-write (COW)-журналирование.

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


администрирование ные проблемы с производительностью. В btrfs распределенное блокирование реализовано для верхних уровней всех B-деревьев. Алгоритмы обработки метаданных продуманы таким образом, чтобы не удерживать блокировки на разделяемых данных во время ожидания ввода/вывода. В ZFS этому вопросу также уделено серьезное внимание. n Поддержка ACL. n Защита от потери данных. n Выбор хэш-алгоритма. n Поддержка NFS. n Флаги совместимости, необходимые для изменения дискового формата в новых версиях btrfs с сохранением совместимости со старыми. n Резервные копии суперблока, по крайней мере – по одной на устройство. n Скоростные приоритеты для дисков. Диск-итемы btrfs (своего рода дескрипторы дисков пула; их роль и структура будут показаны ниже) имеют поля для хранения показателей производительности устройства. Эти счетчики учитываются при выборе устройства для размещения данных того или иного типа. Аллокатор также стремится выбирать наименее занятый диск для равномерного распределения нагрузки по всему пулу. n Гибридные пулы. btrfs старается перемещать наиболее используемые данные на самое быстрое устройство, вытесняя с него «залежавшиеся» блоки. Эта политика хорошо согласуется с появившейся недавно моделью использования SSD (Solid State Drive). В частности, компания Sun Microsystems планирует c 2008 года начать выпуск серверов с небольшими SDD, используемыми в качестве быстрой памяти для наиболее «популярных» данных. К слову сказать, в ZFS возможности приоретизации дискового трафика не предусмотрено, поэтому Sun вынуждена будет реализовывать ее на более высоких уровнях, теряя универсальность такого решения. Справедливости ради стоит заметить, что поддержка приоритетов устройств может быть относительно легко добавлена и в ZFS – правда, ценой изменения дискового формата. n Балансировка данных между устройствами в btrfs возможна сразу после добавления диска к пулу, отдельной командой – а не только постепенно, в процессе использования (как это реализовано в ZFS). n Диски для горячей замены, поддержка которых появилась и в ZFS. n Онлайн-конфигурирование RAID будет реализовано на уровне объектов файловой системы – субтомов, снапшотов, файлов. Возможно будет также устанавливать некоторые параметры ввода-вывода для каталогов – с наследованием этих свойств всеми дочерними объектами. n Выделение и резервирование objectid. В настоящее время вновь выделенный objectid (аналог номера inode) представляет собой число, равное последнему objectid+1. Более оптимальным будет резервирование диапазона objectid каждым каталогом, для чего планируется вести специальный итем (итемом здесь называется объект B-дерева, инкапсулирующий какие-либо сторонние,

№6, июнь 2008

не относящиеся к самому дереву данные). Код выделения inode также должен искать «дыры» в пространстве ключей, а не просто инкрементировать последний. n Производительность вызова fsync(), фиксирующего на диск все «грязные» данные, является для btrfs большей проблемой, нежели для других ФС, т.к. объем побочного дискового трафика (за счет множества метаданных, разбросанных по разным B-деревьям) достаточно велик. Решением проблемы видится создание своеобразного журнала логических операций и частичный сброс только пользовательских данных. При частичной фиксации вызов fsync() будет сбрасывать на диск изменившиеся части только одного дерева, занося информацию об остальных модификациях в особый итем дерева корней. Смонтированная после крэша ФС будет считывать эти данные и вносить оставшиеся изменения уже во время эксплуатации пула, незаметно для пользователя. n Directory-операции с деревом корней. Дерево корней в btrfs хранит глобальную информацию о субтомах и снапшотах пула, а также о других группах метаданных. Со временем дерево корней станет настоящим каталогом и будет поддерживать все характерные системные вызовы. n Конвертер из ext2/3/4.

Дизайн Btrfs реализована на простых и хорошо известных механизмах. Все они должны давать хороший результат и сразу после mkfs, но более важным разработчики сочли сохранение хорошей производительности на старой, интенсивно используемой файловой системе. Btrfs, как и подавляющее большинство современных файловых систем, начинается с суперблока, отстоящего на 16 Кб от начала диска. Его структура описана в ctree.h: /* * Суперблок btrfs — по сути, список всех B-деревьев пула */ struct btrfs_super_block { u8 csum[BTRFS_CSUM_SIZE]; /* контрольная сумма */ u8 fsid[16]; /* UUID файловой системы */ __le64 bytenr; /* номер этого блока */ __le64 flags; };

__le64 __le64 __le64 __le64 __le64 __le64 __le64

magic; /* 8 байт, "_B5RfS_M" */ generation; /* ID транзакции */ root; /* указатель на дерево корней */ chunk_root; /* указатель на дерево сегментов */ total_bytes; /* размер ФС в байтах */ bytes_used; /* использовано байт */ root_dir_objectid; /* objectid корневого * каталога */ __le64 num_devices; /* количество устройств в пуле */ __le32 sectorsize; /* размер сектора */ __le32 nodesize; /* размер узла дерева */ __le32 leafsize; /* размер листа дерева */ __le32 stripesize; __le32 sys_chunk_array_size; u8 root_level; /* глубина основного дерева ФС */ u8 chunk_root_level; /* глубина дерева сегментов */ struct btrfs_dev_item dev_item; /* дескриптор этого * устройства */ char label[BTRFS_LABEL_SIZE]; /* символьная метка * ФС */ u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];

Устройства файловой системы описываются dev-итема-

37


администрирование ми, которые в настоящее время являются частью суперблока, а в будущем будут вынесены в отдельное B-дерево, продублированное на каждом из дисков: struct btrfs_dev_item { __le64 devid; /* ID устройства */ __le64 total_bytes; /* размер устройства */ __le64 bytes_used; /* использовано байт */ __le32 io_align; /* оптимальное выравнивание */ __le32 io_width; /* оптимальная пропускная * способность */ __le32 sector_size; /* размер сектора диска */ __le64 type; /* тип устройства */ __le32 dev_group; /* информация о группе */ u8 seek_speed; /* скорость перемещения головки * диска */ u8 bandwidth; /* максимальная полоса пропускания */ u8 uuid[BTRFS_UUID_SIZE]; /* UUID файловой системы, * которой принадлежит * диск */ };

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

Структура B-дерева

итем, листья же разбиты на две секции, растущие к середине узла. В начале листового узла хранятся итемы фиксированного размера, в конце – данные этих итемов. Данные итема интерпретируются на более высоких уровнях согласно полю type соответствующего ключа. Заголовок блока дерева содержит контрольную сумму содержимого блока, UUID (Universally Unique Identifier – универсальный уникальный идентификатор стандарта OSF DCE) файловой системы, которой принадлежит блок, уровень блока в дереве и смещение, по которому блок располагается на диске. Эти поля позволяют проверить целостность метаданных при чтении. В будущем планируется также хранить здесь 64-битный sequence-номер, который будет содержаться также и в родительском для данного блока узле. Это позволит файловой системе обнаруживать и исправлять фантомные записи на диск (когда блок пишется по ошибочным координатам). Контрольная сумма дочернего узла не хранится в его родителе для упрощения отката транзакции. Sequence-номер будет эквивалентен времени вставки блока в дерево, в то время как контрольная сумма вычисляется еще до размещения блока и к тому же меняется при каждой модификации блока. Поле generation соответствует ID транзакции, в рамках которой был размещен или переразмещен данный блок. Оно позволяет легко поддерживать инкреметальные бэкапы (снапшоты) и подсистему COW-транзакций – совершенно так же, как это сделано в ZFS.

Реализация B-дерева btrfs (это классическое B+ дерево Структуры данных файловой системы с данными в листьях и указателями в узлах) обеспечива- Каждый объект файловой системы имеет objectid, динамиет базовую функциональность для эффективного хране- чески выделяемый при его создании. Свободный objectid – ния и поиска большого количества типов данных. Btree-код просто «дыра» в пространстве ключей B-дерева файлознает только о трех структурах: ключи, итемы и заголовки вой системы. Поле offset ключа хранит логическое смещеблоков (см. ctree.h): ние данных в пределах описываемого объекта. Например, для файловых экстентов это будет смещение экстента от /* начала файла. Поле type содержит идентификатор типа * Каждый блок дерева (листовой или внутренний) начинается итема, а также зарезервированное пространство для рас* с заголовка блока */ ширения в будущем. struct btrfs_header { u8 csum[BTRFS_CSUM_SIZE]; /* контрольная сумма * блока */ u8 fsid[BTRFS_FSID_SIZE]; /* UUID файловой системы, * содержащий блок */ __le64 bytenr; /* адрес блока на диске */ __le64 flags; u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; /* UUID дерева * сегментов * (см. ниже) */ __le64 generation; /* ID транзакции */ __le64 owner; /* ссылка на родителя блока */ __le32 nritems; /* количество итемов в блоке */ u8 level; /* уровень блока в дереве */ }; /* Ключ */ struct btrfs_key { u64 objectid; u8 type; u64 offset; }; /* Итем */ struct btrfs_item { struct btrfs_disk_key key; /* Ключ */ __le32 offset; /* Смещение пакета данных в листе */ __le32 size; /* Длина пакета данных */ };

Внутренние узлы дерева содержат только пары ключ-

38

Inodes Inodes хранятся в структуре btrfs_inode_item (ctree.h), поле offset ключа inode-итема всегда равно нулю, поле type – единице. Таким образом, математически, ключ inode-итема всегда наименьший для данного объекта. Inode-итем, очевидно, хранит традиционные stat-данные: struct btrfs_inode_item { __le64 generation; /* ID транзакции создания файла */ __le64 size; /* Размер файла в байтах */ __le64 nblocks; /* Количество занимаемых блоков */ __le64 block_group; /* Предпочитаемая группа блоков */ __le32 nlink; /* Счетчик ссылок на файл */ __le32 uid; /* UID владельца */ __le32 gid; /* GID владельца */ __le32 mode; /* Маска типа и прав доступа */ __le64 rdev; /* [minor:major] для устройств */ __le16 flags; /* Флаги */ __le16 compat_flags; /* Флаги */ struct btrfs_timespec atime; /* Времена доступа, * модификации, * и т. д. */ struct btrfs_timespec ctime; struct btrfs_timespec mtime; struct btrfs_timespec otime; };


администрирование Поле compat_flags введено для реализации совместимости со старыми версиями файловой системы. Те или иные биты отведены под флаги версии во всех структурах данных btrfs для того, чтобы безопасно изменять дисковый формат ФС даже после официального релиза.

Файлы

ся TEA-хэш, но могут быть добавлены и другие алгоритмы (определяется по полю flags в inode каталога). Второй способ индексирования используется вызовом readdir(), возвращающем данные в порядке возрастания номеров inodes, приближенном к порядку следования блоков на диске (согласно принятой политике размещения). Этот способ дает большую производительность при чтении данных большими пакетами (бэкапы, копирование и т. д.), а также позволяет быстро проверить линковку inode с каталогом (подсчет количества ссылок на файл при fsck). Этот индекс состоит из objectid каталога, константы BTRFS_DIR_INDEX_KEY и inode objectid.

Содержимое маленьких файлов (размером не более блока) может храниться прямо в B-дереве, в данных экстентитема. В этом случае поле offset ключа экстент-итема хранит смещение данных внутри файла, а поле size структуры btrfs_item показывает, сколько места в листе занимает данный итем. Таких своеобразных экстент-итемов может быть несколько на файл. Учет ссылок на экстенты Большие файлы хранятся в экстентах. Структура Учет ссылок на объекты – основа любой файловой систеbtrfs_file_extent_item содержит ID транзакции размещения мы с поддержкой снапшотов. Для каждого экстента, выэкстента (поле generation) и пару [смещение,длина], опи- деленного дереву или файлу, btrfs записывает количество сывающую его положение на диске. Эскстент также хра- ссылок в структуре btrfs_extent_item. Деревья, хранящие нит логические смещения и длину в уже существующем эту информацию, служат также картами размещенных экэкстенте. Это позволяет btrfs безопасно писать в середи- стентов файловой системы. Некоторые деревья не поддерну длинного экстента без предварительного перечитыва- живают учета ссылок и защищаются только COW-журнания старых данных файла (относящихся к предыдущему лированием. Однако структура экстент-итемов одинакова для всех выделенных блоков. снапшоту, к примеру). struct btrfs_file_extent_item { __le64 generation; u8 type; /* * Дисковое пространство, используемое экстентом. * Блоки конторольных сумм включены */ __le64 disk_bytenr; __le64 disk_num_bytes;

/* * Логиическое смещение данного экстента в файле * (без учета блоков контрольных сумм). Это позволяет * экстент-итему указывать в середину существующего * экстента, разделяя его между двумя снапшотами * (если в новом снапшоте изменились данные) */ __le64 offset;

};

/* Логическое количество блоков (без учета * контрольных сумм)*/ __le64 num_bytes;

Контрольные суммы данных файла хранятся в B-дереве в csum-итеме с соответствующим objectid (структура btrfs_csum_item, ctree.h). Поле offset ключа csum-итема указывает на смещение защищаемого пакета данных от начала файла. Один такой итем может хранить несколько контрольных сумм. Csum-итем используется только для файловых экстентов, встроенные в дерево маленькие файлы защищаются контрольной суммой в заголовке блока. Если csum-итем для некоторого пакета данных не представлен, пакет считается не инициализированным – при чтении возвращается блок нулей (в будущем поведение в этом случае будет выбираться пользователем при создании ФС – может возвращаться также код ошибки EIO).

Каталоги Каталоги btrfs индексируются двумя способами. Для поиска по имени файла используется индекс, составленный из objectid каталога, константы BTRFS_DIR_ITEM_ KEY и 64‑битного хэша имени. По умолчанию использует-

№6, июнь 2008

Группы блоков Группы блоков позволяют оптимизировать аллокатор путем разбиения диска на участки длиной от 256 Мб. Для каждого участка доступна информация о свободных блоках. Поле block_group каждого inode хранит номер предпочитаемой группы блоков, в которой btrfs будет стараться разместить новые данные объекта. Группа блоков – надстройка над сегментом (см. ниже), позволяющая быстро оценить количество свободного пространства и тип (данные/метаданные) без обращения к дереву сегментов, которое происходит, когда найден сегмент, располагающий достаточным пространством и подходящим типом. struct btrfs_block_group_item { __le64 used; /* использовано блоков */ __le64 chunk_objectid; /* objectid соответствующего * сегмента */ __le64 flags; /* флаги */ }

Группа блоков имеет флаг, показывающий, данные или метаданные она хранит. При создании ФС 33% групп блоков выделяются под метаданные, 66% – под данные. При заполнении диска это предпочтение может быть пересмотрено, однако в любом случае btrfs старается избежать смешивания данных и метаданных в одной группе блоков. Это решение существенно улучшает производительность fsck и уменьшает количество перемещений головок диска при отложенной записи ценой небольшого увеличения количества перемещений при чтении.

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

39


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

Обратные ссылки Обратные ссылки в btrfs служат для: n учета всех владельцев ссылки на экстент для корректного его освобождения; n обеспечения информации для быстрого поиска ссылающихся на данный экстент объектов, если некоторый блок нуждается в исправлении или переразмещении; n упрощения перемещения блока при урезании ФС и других операциях управления пулом.

Обратные ссылки на файловые экстенты На файловые экстенты могут ссылать следующие объекты: n снапшоты, субтома и различные их поколения; n разные файлы внутри одного субтома; n разные смещения внутри одного файла. Структура обратной ссылки такова (ctree.h): struct btrfs_extent_ref { __le64 root; /* objectid корня субтома */ __le64 generation; /* номер поколения дерева, * владеющего ссылкой */ __le64 objectid; /* objectid файла, владеющего * ссылкой */ __le64 offset; /* смещение в файле */ };

При выделении файлового экстента эти поля заполняются следующей информацией: objectid корня субтома, id транзакции, inode objectid и смещение в файле. При захвате ссылки на лист новая обратная ссылка добавляется для каждого файлового экстента. Это похоже на создание экстента, однако поле generation инициализируется идентификатором текущей транзакции. При удалении файлового экстента или некоторого снапшота находится и удаляется соответствующая обратная ссылка.

Обратные ссылки на btree-экстенты Ссылки на btree-экстенты могут захватывать следующие объекты: n различные субтома; n разные поколения одного субтома. Хранение всеобъемлющей информации для полноценного обратного отображения потребовало бы хранения наименьшего ключа данного листового блока в обратной ссылке. Это неудобно, так как при каждой модификации (на-

40

пример, изменении поля offset, что происходит часто) этого ключа пришлось бы модифицировать и ссылку. Вместо этого btrfs хранит только objectid наименьшего ключа на том же уровне, что и данный блок. Поиск по дереву останавливается на уровень выше, чем записано в обратной ссылке. В некоторых деревьях btrfs учет обратных ссылок не ведется: например, в деревьях экстентов и корней. Обратные ссылки в этих деревьях всегда имеют поле generation=0. При размещении блока дерева создается обратная ссылка: n objectid корня субтома; n id транзакции или ноль; n уровень узла; n наименьший objecid узла. Уровень хранится в поле objectid структуры btrfs_extent_ref, так как максимальный уровень равен 255, а минимальный objectid 256. Таким образом btrfs отличает файловые обратные ссылки от btree-ссылок. Если ссылка на блок захватывается неким объектом, в дерево также вставляется обратная ссылка с соответствующими данными о владельце и транзакции.

Построение ключа обратной ссылки Обратная ссылка имеет четыре 64-битных поля, которые хэшируются в единственно 64-битное значение, что помещается в поле offset ключа. Поле objectid ключа соответствует ID описываемого объекта, а поле type инициализируется константой BTRFS_EXTENT_REF_KEY.

Снапшоты и субтома Субтома представляют собой именованные B-деревья, содержащие иерархию файлов и каталогов, и имеют inodes в дереве корней. Субтом может быть ограничен квотой на количество блоков; на все блоки и файловые экстенты, принадлежащие субтому, ведется учет ссылок для поддержки снапшотов. Предельное количество субтомов в файловой системе btrfs – 264. Снапшоты по внутренней структуре идентичны субтомам, однако их корневой блок изначально разделяется с другим (родительским) субтомом. Когда снапшот создан, файловая система увеличивает количество ссылок на корневой блок, и далее подсистема COW-транзакций фиксирует изменения, сделанные в корневых блоках субтома и снапшота, уже в разных местах. Снапшоты btrfs доступны на запись и бесконечно рекурсивны. При необходимости создания read-only снапшота его блочная квота устанавливается в единицу сразу при инициализации.

Корни B-деревьев Каждая файловая система формата btrfs состоит из нескольких корней B-деревьев. Только что созданная ФС имеет корни для: n дерева корней; n дерева выделенных экстентов; n дерева default-субтома. Дерево корней содержит корневые блоки для дерева эк-


администрирование стентов, а также корневые блоки и имена деревьев для каждого субтома и снапшота в ФС. При фиксации транзакции указатели на корневые блоки обновляются по COW-семантике в этом дереве, и его новый корневой блок записывается в суперблок btrfs. Дерево корней организовано в виде каталога всех других деревьев файловой системы и имеет directiry-итемы для хранения имен снапшотов и субтомов. Каждый субтом имеет objectid в этом дереве и не менее одной структуры btrfs_root_item. Directory-итемы отображают имена субтомов на их root-итемы Так как ключ root-итема обновляется на каждой транзакции, directory-итем ссылается на номер поколения, что позволяет всегда найти наиболее новую версию какого-либо корня. Структура root-итема (ctree.h): struct btrfs_root_item { struct btrfs_inode_item inode; /* inode-описатель */ __le64 root_dirid; /* obhectid основного дерева * субтома */ __le64 bytenr; /* размер */ __le64 byte_limit; /* квота */ __le64 bytes_used; /* использовано байт */ __le32 flags; __le32 refs; /* количество ссылок */ struct btrfs_disk_key drop_progress; u8 drop_level; u8 level; };

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

Рисунок 1. B-деревья btrfs

ализации поддержки многодисковых конфигураций, она потеряла бы большинство из своих сильных сторон: обработку и корректировку ошибок записи с помощью контрольных сумм, перемещение данных между устройствами и, как следствие, возможность изменения размера тома, гибкие политики выделения, зеркалирование метаданных даже на единственном диске. Именно поэтому в btrfs, как и в ZFS, реализован собственный уровень объединения устройств, не полагающийся на существующие на уровне ядра ОС программные RAID-системы. В настоящее время btrfs поддерживает конфигурации RAID0, RAID1 и RAID10, реализация RAID5 и RAID6 запланирована.

Сегменты (storage chunks)

Сегментом btrfs называется обособленный участок диска с логической адресацией. Все указатели на экстенты работают с сегментными адресами вместо физических дисковых. Суперблок имеет особую секцию, отображающую Многодисковые конфигурации Btrfs, как и основной ее аналог – ZFS – поддерживает ор- сегменты на дисковые адреса через дерево сегментов. ганизацию сложных пулов хранения из нескольких дисков. Код сегментации – единственная часть btrfs, имеющая дело с физическими адресами. Весь остальной драйвер раОсновные ее возможности в этой области таковы: n зеркалирование метаданных в конфигурации до N зер- ботает с сегментами. Каждый сегмент располагает пространством, выдекал (N>2); ленным с одного или нескольких устройств, для реализаn зеркалирование метаданных на одном устройстве; ции зеркала или распределенного хранилища (stripe). Миn зеркалирование экстентов данных; n обнаружение ошибок записи с помощью контрольных нимальный размер сегмента btrfs равен 256 Мб, средний – 1/100 объема устройства. сумм и их коррекция из зеркальной копии; Каждый сегмент располагает единственным деревом n распределенные (stripped) экстенты данных; n различные политики зеркалирования на одном уст- размещенных экстентов и имеет обратную ссылку на это дерево. ройстве; n эффективное перемещение данных между устройстваРазрешение сегментных адресов ми; Каждому устройству, добавляемому к файловой системе, n эффективное переконфигурирование хранилища; n динамическое выделение пространства для каждого назначается 64-битный идентификатор (device id). Информация обо всех устройствах пула отсортирована по device субтома. id в особом B-дереве. Каждый корень дерева в ФС свяЕсли бы btrfs полагалась на device mapper или MD для ре- зан с единственным деревом сегментов для разрешения

№6, июнь 2008

41


администрирование Разрешение ID дисков Идентификатор устройства хранится в суперблоке диска. Устройства сканируются утилитой btrfsctl для построения списка дисков, назначенных файловой системе с данным UUID. Деревья сегментов также хранят информацию о каждом из устройств, так что корректность списка может быть проверена во время монтирования (см. рис. 2).

Btrfs для администратора

Рисунок 2. Трансляция сегментных адресов

сегментных адресов. ID сегмента продублирован в каждом блоке дерева, поэтому может использоваться во время fsck.

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

Управление сегментами Логическая адресация позволяет достаточно просто перемещать сегменты. Дерево выделенных экстентов, владеющее данным сегментом, располагает информацией о занятых/свободных участках сегмента, и может гибко и эффективно управлять копированием только необходимых данных. Устройства в файловой системе могут быть удалены или сбалансированы благодаря перемещению сегментов. На вновь добавленное устройство могут быть перенесены существующие сегменты с других дисков (для балансировки нагрузки). Диск может использоваться и только для новых размещений. Восстановление зеркальных пулов осуществляется путем обхода дерева выделенных экстентов, проверки наличия недоступных дисков и следования по обратным ссылкам размещенных на них сегментов. Каждый сегмент исправляется индивидуально, так что можно ограничить исправление обходом только тех сегментов, которые действительно используются.

42

Попробуем btrfs в работе. Исходные тексты модуля ядра и утилит стабильной на данный момент версии 0.14 доступны по ссылке [2]. Модуль ядра собираем и устанавливаем так (не забываем, что он зависит от CONFIG_ LIBCRC32C): make make

-C /lib/modules/`uname -r`/build SUBDIRS=$PWD ↵ modules -C /lib/modules/`uname -r`/build SUBDIRS=$PWD ↵ modules_install

Набор утилит btrfs-progs использует libuuid, которая входит в состав e2fsprogs – то есть при сборке нужны соответствующие заголовки. В дистрибутивах необходимый пакет называется e2fsprogs-devel или libuuid-devel. Сборка btrfsprogs производится вполне привычно: make make install

Теперь попробуем создать и смонтировать файловую систему на одном диске – здесь все вполне традиционно: modprobe btrfs mkfs.btrfs /dev/sda1

mkfs.btrfs можно использовать с опциями:

n -b, --byte-count – задает размер файловой системы; n -l, --leafsize – задает размер листового узла дерева; n -n, --nodesize – задает размер внутреннего узла дерева;

n -s, --sectorsize – задает размер минимального выделяемого элемента (не менее физического сектора диска). Монтируем субтом default (создается по умолчанию): mount -t btrfs /dev/sda1 /mnt/test

Можно смонтировать не какой-либо субтом, а все дерево корней: mount -t btrfs /dev/sda1 /mnt/test -o subvol=.

Тогда содержимое субтома default окажется в папке /mnt/ test/default. Создать новый субтом можно командой: btrfsctl -s new_subvol /mnt/test


администрирование Видим, что теперь в папке /mnt/test 2 элемента: default и new_subvol. Посмотрим, как btrfs создает снапшоты:

Также в btrfs-progs включена программа-конвертер файловой системы из ext3. В версии 0.14 пакета утилит код конвертера имеется, однако сборка его по умолчанию отклюbtrfsctl -s new_subvol_snap /mnt/test/new_subvol чена, так как безопасно использовать его пока рано. Если риск возможной потери данных вас не пугает, собрать и исТакже с помощью btrfsctl можно поменять размер фай- пользовать его можно так: ловой системы (если она еще не занимает весь диск или cd btrfs-progs в пул было добавлено новое устройство): btrfsctl -r +4g /mnt/test

Btrfs версии 0.14 – первый релиз с поддержкой многодисковых пулов. К существующей файловой системе можно добавлять устройства, но пока нельзя удалять (пока также не понятно, как удалять снапшоты у субтома). Обработка ошибок чтения или аппаратуры также еще толком не оттестирована, так что проверка работы btrfs в экстремальных условиях еще не возможна. Создадим btrfs на двух дисках: mkfs.btrfs /dev/sda1 /dev/sda2

Организуем распределенный пул (stripe): mkfs.btrfs -m raid0 /dev/sda1 /dev/sda2

Зеркало: mkfs.btrfs -m raid1 /dev/sda1 /dev/sda2

Этой командой можно создать ФС, не зеркалирующую метаданные на одном диске: mkfs.btrfs -m single /dev/sda1

После создания btrfs команде mount можно передавать любой из дисков. Однако следует учитывать, что после выгрузки модуля btrfs.ko (после перезагрузки в том числе) необходимо пройтись по всем дисковым устройствам вашей системы командой:

make convert ./btrfs-convert /dev/sda4

Простота реализации подобного конвертера основана на том, что btrfs почти не имеет метаданных с фиксированным дисковым положением (практически, это только суперблок). Более того, COW-семантика btrfs позволяет сохранить нетронутой оригинальную ext3 с возможностью отката на нее даже после внесения изменений в btrfs-копии. Конвертер использует libe2fs для чтения метаданных ext3, и размещает метаданные btrfs только в свободных блоках оригинальной файловой системы. Работает он в такой последовательности: n копирует первый мегабайт диска в «запас»; n читает каталоги и inodes, создает их копии в btrfs; n вставляет ссылки на блоки данных ext3 в метаданные btrfs. Первый мегабайт диска копируется в альтернативное местоположение, на его место записываются метаданные btrfs. Остальные блоки, используемые ext3, благодаря COW-журналированию не перезаписываются. Откат обратно к ext3, очевидно, представляет собой восстановление первого мегабайта диска. Конвертер создает снапшот, содержащий данные ext3 на момент конверсии. Блоки метаданных ext3 заносятся в отдельный файл, который может быть смонтирован как читаемая копия оригинальной ext3. Смонтируем снапшот ext3: mount -t btrfs /dev/sda4 /mnt/test -o subvol=ext2_saved

Смонтируем образ оригинальной ФС:

btrfsctl -a

mount -t ext3 -o loop /mnt/test/image /mnt/ext3

Или передать ей только используемые устройства:

Выполнить откат можно так:

btrfsctl -A /dev/sda1

umount /mnt/ext3 umount /mnt/test btrfs-convert -r /dev/sda4

Команда btrfs-show выдаст список всех обнаруженных файловых систем с их UUID и задействованными устройствами. Добавить новый диск в пул можно так: mount -t btrfs /dev/sda1 /mnt/test -o subvol=. btrfs-vol -a /dev/sda3 /mnt/test

Файловую систему можно сбалансировать – то есть распределить часть данных и метаданных между существующими и вновь добавленным диском: btrfs-vol -b /mnt/test

№6, июнь 2008

Если необходимости в откате больше нет и нужно освободить место, занимаемое метаданными ext3, достаточно удалить файл image в снапшоте ext2_saved. Если есть желание избавиться от всех данных ext3 – удаляем сам снапшот. 1. Официальный сайт проекта – btrfs.wiki.kernel.org. 2. Исходники btrfs – www.kernel.org/pub/linux/kernel/people/mason/ btrfs. 3. «Архитектура ZFS» – www.filesystems.nm.ru/my/zfs_arch.pdf.

43


bugtraq Множественные уязвимости в Sun Java System Active Server Pages

Множественные уязвимости в GnuTLS Программа: GnuTLS версии до 2.2.4. Опасность: Высокая. Описание: 1. Уязвимость существует из-за ошибки проверки границ данных при обработке сообщений «Client Hello», содержащих расширение Server Name. Удаленный пользователь может с помощью специально сформированного TLS-пакета вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. 2. Уязвимость существует из-за ошибки разыменования нулевого указателя при обработке TLS-пакетов, содержащих большое количество сообщений «Client Hello». Удаленный пользователь может с помощью специально сформированного TLS-пакета аварийно завершить работу приложения. 3. Уязвимость существует из-за ошибки при обработке знаковых переменных в функции _gnutls_ciphertext2 compressed() в файле lib/gnutls_cipher.c. Удаленный пользователь может с помощью специально сформированных TLS-данных вызвать переполнение буфера и аварийно завершить работу приложения. URL производителя: www.gnu.org/software/gnutls. Решение: Установите последнюю версию 2.2.5 с сайта производителя.

Программа: Sun Java System Active Server Pages 4.0.2, возможно, более ранние версии. Опасность: Высокая. Описание: 1. Уязвимость существует из-за того, что неизвестный файл, который подключается в различных ASP-приложениях, недостаточно проверяет входные данные перед созданием файлов на системе. Удаленный пользователь может создать и изменить произвольные файлы на системе. Для успешной эксплуатации уязвимости требуется доступ к административному серверу (порт 5100/TCP). 2. Уязвимость существует из-за того, что пароли и конфигурационные данные хранятся в корневой директории веб-сервера. Удаленный пользователь может получить доступ к потенциально важным данным, включая хеши паролей пользователей. Для успешной эксплуатации уязвимости требуется доступ к административному серверу (порт 5100/TCP). 3. Уязвимость существует из-за недостаточной обработки входных данных в некоторых ASP-приложениях. Удаленный пользователь может с помощью специально сформированного HTTP-запроса, содержащего символы обхода каталога, просмотреть или удалить произвольные файлы на системе. Для успешной эксплуатации уязвимости требуется доступ к административному серверу Переполнение буфера в Samba (порт 5100/TCP). Программа: Samba 3.0.29 и более ранние версии. 4. Уязвимость существует из-за ошибки проверки гра- Опасность: Высокая. ниц данных при обработке запросов в ASP-сервере. Уда- Описание: Уязвимость существует из-за ошибки проверленный пользователь может с помощью специально сфор- ки границ данных при обработке SMB-пакетов в функции мированного запроса вызвать переполнение стека и выпол- receive_smb_raw() в файле lib/util_sock.c. Удаленный польнить произвольный код на целевой системе. зователь может с помощью слишком длинного SMB-паке5. Уязвимость существует из-за недостаточной обработ- та вызвать переполнение динамической памяти и выполки входных данных в некоторых ASP-приложениях. Удален- нить произвольный код на целевой системе. Для успешной ный пользователь может с помощью специально сформи- эксплуатации уязвимости злоумышленник должен обманом рованного HTTP-запроса, содержащего метасимволы, вы- заставить пользователя подключиться к злонамеренному полнить произвольные команды на системе. Для успеш- серверу (нажать на ссылку типа «smb://») или отправить спеной эксплуатации уязвимости требуется административ- циально сформированные пакеты демону nmbd, сконфигуный доступ к приложению. рированному как основной браузер домена. 6. Уязвимость существует из-за ошибки дизайна при об- URL производителя: www.samba.org. работке аутентификации. Удаленный пользователь может Решение: Установите последнюю версию 3.0.30 с сайта отправить специально сформированные запросы на порт производителя. 5102/TCP и обойти процесс аутентификации. URL производителя: www.sun.com/software/chilisoft/ Переполнение буфера index.xml. в IBM Lotus Sametime Решение: Установите последнюю версию 4.0.3 с сайта про- Программа: IBM Lotus Sametime 7.5.1 изводителя. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки проверки Уязвимость в реализации Secure Shell границ данных в Community Services Multiplexer (StMux.exe) в Cisco IOS при обработке URL. Удаленный пользователь может с поПрограмма: Cisco IOS 12.4. мощью слишком длинного HTTP-запроса, отправленного Опасность: Средняя. Sametime-серверу, вызвать переполнение стека и выполОписание: Множественные уязвимости существуют из-за нить произвольный код на целевой системе. ошибок в реализации SSH. Удаленный пользователь мо- URL производителя: www-142.ibm.com/software/sw-lotus/ жет вызвать перезагрузку устройства. sametime. URL производителя: ww.cisco.com Решение: Установите исправление с сайта производителя. Решение: Установите исправление с сайта производителя, Составил Александр Антипов доступное для зарегистрированных клиентов.

44


закон есть закон Какие документы нужны, чтобы быть ссылка на то, что программное подтвердить право на использова- обеспечение распространяется по этой ние свободного ПО? Не раз встречал лицензии бесплатно. Данное указание упоминания, что нужны нотариаль- в лицензии GPL есть. но заверенные переводы открытых Свободное программное обеспелицензий и пр. чение может быть приобретено по Для подтверждения права на исполь- договору (коробочный вариант, диск зование свободного программного с программой и пр.). При этом лиценобеспечения предпочтительнее сде- зия GPL не запрещает взимать плату лать нотариально заверенный перевод за передачу экземпляра программы лицензий используемого программно- и оказание услуг по гарантийной подго обеспечения. Заверение перевода держке программы. Если свободное производится в соответствии со ст. 81 программное обеспечение передаваОснов законодательства РФ о нотари- лось по договору с российской оргаате. К переводу прилагается текст ли- низацией, то должны прилагаться: доцензии на английском языке. говор; накладные; акты приемо-переСейчас очень часто можно услы- дачи программного обеспечения; дошать мнение о том, что после введе- кументы, подтверждающие факт опния в действие четвертой части ГК РФ латы по договору; а также лицензии лицензии на свободное программное на программное обеспечение с их пеобеспечение на территории России реводом на русский язык. применяться не могут. Мотивируется такой ответ ссылкой на п. 5 ст. 1235 ГК Если свободное ПО было скачано РФ, в соответствии с которым лицензи- из Глобальной сети, как быть в этом ат обязуется уплатить лицензиару ука- случае? занное в лицензионном договоре воз- Теперь рассмотрим вариант, когда свонаграждение, если договором не пре- бодное программное обеспечение скадусмотрено иное. Однако из анализа чивается из Глобальной сети. На такое процитированной выше статьи следу- программное обеспечение нужно сдеет возможность заключения как воз- лать перевод используемых лицензий мездных, так и безвозмездных лицен- (предпочтительнее нотариально завезионных договоров. Для действитель- ренный) с приложением текста лиценности данного договора в нем должна зий на английском языке; распеча-

тать страницу сайта, с которой производилось его скачивание; рекомендую также записать ссылки. Обычно сайты, с которых можно скачать свободное программное обеспечение, имеют раздел, в котором описываются права на использование скачиваемых с сайта программ (раздел legal). Рассмотрим на примере продукта фирмы – Ubuntu: http://www.ubuntu.com/legal, указанная ссылка приведет пользователя к разделу, регламентирующему права на распространяемое программное обеспечение. Данная страница вместе со страницей, с которой производилось скачивание, распечатывается, переводится, перевод желательно заверить нотариально. Остается разобрать еще один вопрос. В тексте GPL прописано, что юридическую силу для сторон имеет только английский текст лицензии, соответственно перевод текста на русский язык носит рекомендательный характер. Согласно действующему законодательству государственным языком в России является русский язык, но иностранные языки могут применяться в коммерческой деятельности организации. Такое использование иностранного языка определяется договорами с деловыми партнерами фирмы (ст. 22 ФЗ «О языках народов РФ»). А поскольку, скачивая и устанавливая программу, мы принимаем условия лицензии, по которой она распространяется, то юридически мы присоединяемся к лицензионному договору, по которому она распространяется. Подводя итог, отмечу, что указанный выше перечень док ументов не прописан в законодательстве, их рекомендуется приготовить на случай проверки правоохранительных органов, данные документы в случае проверки предоставляются проверяющим для ознакомления. Но даже в случае изъятия компьютерной техники на экспертизу, при условии, что на них установлено только бесплатное программное обеспечение, фирму нельзя привлечь к ответственности.

Рубрику ведет юрист Юлия Штокало Присылайте Ваши вопросы по адресу sekretar@samag.ru или оставляйте на форуме журнала www.samag.ru/forum.

№6, июнь 2008

45


администрирование «1С»

Технологический журнал «1С:Предприятие 8.1»

Андрей Луконькин Система «1С:Предприятие 8.1» обеспечивает возможность ведения технологического журнала, в котором помещается информация от всех приложений, относящихся к «1С:Предприятие». 46


администрирование «1С»

Т

ехнологический журнал представ- Состав В элемент <log> могут быть вложеляет собой совокупность катало- конфигурационного ны элементы <event> и <property>, сосгов и текстовых файлов, в кото- файла logcfg.xml тав которых определяет условие зарые система записывает информацию По мере выхода новых версий плат- писи в журнал каждого события и усо работе некоторых внутренних меха- формы «1С:Предприятие» отслежи- ловия записи каждого свойства сонизмов платформы «1С:Предприятие». ваемые события могут меняться и до- бытия. Технологический журнал может ис- полняться, но общий принцип структуСобытие включается в журнал, еспользоваться разработчиками при- ры остается единым. ли оно удовлетворяет всем условикладных решений для анализа разям внутри хотя бы одного из элемен<config …> личных режимов работы системы, тов <event>. Условия задаются эле <log …> … </log> например для получения информаментами: <log …> … </log> <dump … /> ции об ошибочных и исключительn eq – равно; </config> ных ситуациях в конфигурации и техn ne – не равно; нологической платформе, информаЭлемент <config> определяет на- n gt – больше; ции о запуске и завершении прило- стройки технологического журнала. n ge – больше или равно; жений, установке и разрыве соедине- Он может содержать несколько эле- n lt – меньше; ний, действиях пользователей и адми- ментов <log> и один элемент <dump>. n le – меньше или равно; нистраторов. Элемент <log> определяет каталог n like – соответствие маске. Файлы журнала имеют текстовый технологического журнала. Его атриформат, каждый файл содержит со- бут location – это имя каталога, в котоНапример: бытия за 1 час. ром будет размещаться технологичес<event> Тех н ол о г ич е с к и й ж у р н а л м о - кий журнал. Атрибут history – это коли<eq property="Name" value="PROC"/> жет вестись на любом компьютере, чество часов, через которое информа</event> на котором инсталлирована система ция будет удаляться из технологичес«1С:Предприятие 8.1». кого журнала. Это означает, что в технологичесЗа параметры ведения технологиНапример: ком журнале будут создаваться запического журнала отвечает конфигуси о событиях с именем PROC. <log location="c:\1c8logs" ↵ рационный файл logcfg.xml, в котором Возможные имена групп событий history="12"> описываются: смотрите в таблице. n каталог, в котором будут располаЭто означает, что файлы будут храЭлемент <property> определяет усгаться файлы технологического ниться 12 часов в каталоге c:\1c8logs. ловия попадания в журнал значения журнала; Элемент <dump> определяет ката- ключевого свойства события, имя коn состав информации, которая бу- лог для записи дампов аварийного за- торого является значением атрибудет помещаться в технологичес- вершения программы. Чтобы отклю- та name. кий журнал; чить запись дампов, нужно в элементе Элемент <property name="all"> n время, в течение которого хранят- <dump> установить значение парамет- </property> включает записи в журнал ся файлы технологического журна- ра «create = "0"» или «create = "false"». всех свойств событий. ла; Возможные имена групп событий n параметры дампа, создаваемого PROC События, относящиеся к процессу целиком и влияющие на дальнейшую работоспособность при аварийном завершении припроцесса. Например: старт, завершение, аварийное завершение и т.п. ложения. Файл logcfg.xml должен быть помещен в подкаталог conf каталога загрузочных модулей «1С:Предприятие» (обычно это каталог C:\Program Files\ 1cv81\bin). Если файл logcfg.xml отсутствует или содержит ошибки, то технологический журнал считается выключенным и не создается. Следует избегать использования комментариев (конструкции типа <!-- содержание комментария -->). Важно! При создании записей технологического журнала работа системы замедляется. Это нужно учитывать в случаях, когда снижение производительности может быть критичным.

№6, июнь 2008

SCOM

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

EXCP

Исключительные ситуации приложений системы «1С:Предприятие 8.1», которые штатно не обрабатываются и могут послужить причиной аварийного завершения серверного процесса или подсоединенного к нему клиентского процесса

EXCPCNTX

События, которые начались, но не закончились в момент возникновения нештатной ситуации

SDBL

События, связанные с исполнением запросов к модели базы данных «1С:Предприятие 8.1»

QERR

События, связанные с обнаружением ошибок компиляции запроса или ограничения на уровне записей и полей базы данных

PERR

События, связанные с обнаружением ошибок работы с настройками пользователя

CONN

Установка или разрыв клиентского соединения с сервером

ADMIN

Управляющие воздействия администратора кластера серверов «1С:Предприятия 8.1»

DBV8DBEng

Исполнение операторов SQL файловой СУБД

DBMSSQL

Исполнение операторов SQL СУБД Microsoft SQL Server

DBPOSTGRS

Исполнение операторов SQL СУБД PostgreSQL

DB2

Исполнение операторов SQL СУБД DB2

CALL

Удаленный вызов

TLOCK

Управление транзакционными блокировками в управляемом режиме

47


администрирование «1С» ровками и ожидания, превысившие 10 секунд (длительность событий выражается в сотнях микросекунд). <config xmlns="http://v8.1c.ru/v8/tech-log"> <log location="c:\v81\logs" history="8"> <event> <eq property="Name" value="EXCP"/> </event> <event> <eq property="Name" value="TLOCK"/> <gt property="Duration" value="100000"/> </event> <property name="all"/> <property name="Context"> <event> <eq property="Name" value=""/> </event> </property> </log> <dump location="c:\v81\dumps" create="1" type="2"/> </config>

Рисунок 1. Форма обработки «Настройка технологического журнала»

Этот конфигурационный файл определяет, что технологический журнал будет содержать только обращения «1С:Предприятие» к СУБД и информацию об ошибочных ситуациях. <config xmlns="http://v8.1c.ru/v8/tech-log"> <log location="C:\\1cv81\logs" history="8"> <event> <eq property="Name" value="DBV8DBEng"/> </event> <event> <eq property="Name" value="DBMSSQL"/> </event> <event> <eq property="Name" value="DBPOSTGRS"/> </event> <event> <eq property="Name" value="DB2"/> </event> <event> <eq property="Name" value="EXCP"/> </event> <property name="all"> </property> </log> </config>

Рисунок 2. Окно редактирования отслеживаемых событий

Файл logcfg.xml легко создается в любом текстовом редакторе, но также можно воспользоваться внешней обработкой «Настройка технологического журнала» с диска ИТС (февраль 2008 г.). Используя визуальный редактор, можно добавлять записываемые события, свойства и условия отображения свойств. После редактирования появляется готовый текст конфигурационного файла, который можно сохранить или скопировать.

Используя свойства элемента <property>, в технологический журнал можно записывать контекст исполнения двух видов: контекст встроенного языка и интерфейсный контекст. Чтобы включить запись контекста, нужно среди фильтров свойств записать элемент <property name="context"> или элемент <property name="all">. Рассмотрим несколько примеров использования технологического журнала. Такой конфигурационный файл определяет вывод в технологический журнал всех событий вместе со всеми свойс- Заключение твами. Журнал будет сохраняться в течение 8 часов. Таким образом, использование технологического журнала позволяет зафиксировать широкий спектр действий <config xmlns="http://v8.1c.ru/v8/tech-log"> и событий, а также дает возможность проанализировать <log location="C:\\1cv81\logs" history="8"> возникшие проблемы при работе с «1С:Предприятие». <event> <ne property="Name" value=""/> На базе технологического журнала построена вся работа </event> специализированной конфигурации «1С:Центр управле<property name="all"> </property> ния производительностью» (см. выпуск журнала №3(64) </log> за март 2008 года). </config> Также возможно создание собственных систем, испольСледующий конфигурационный файл будут регистри- зующих структурированные файлы журнала для проведеровать все исключительные ситуации, связанные с блоки- ния анализа данных.

48


bugtraq Несколько уязвимостей в IBM Lotus Domino Web Server Программа: IBM Lotus Domino версии до 7.0.3 Fix Pack 1 (FP1) и 8.0.1. Опасность: Высокая. Описание: 1. Уязвимость существует из-за недостаточной обработки входных данных в сервлете веб-контейнера. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта. 2. Уязвимость существует из-за ошибки проверки границ данных в Lotus Domino Web Server. Удаленный пользователь может с помощью слишком длинного HTTP-заголовка Accept-Language вызвать переполнение стека и выполнить произвольный код на целевой системе. URL производителя: www.lotus.com/products/product4.nsf/ wdocs/dominohomepage. Решение: Установите последнюю версию 7.0.3 Fix Pack 1 (FP1) или 8.0.1 с сайта производителя.

Переполнение буфера в CA Secure Content Manager

Переполнение буфера в Evolution Программа: GNOME Evolution 2.22.1, возможно, более ранние версии; Novell Evolution 2.22.1, возможно, более ранние версии. Опасность: Высокая. Описание: 1. Уязвимость существует из-за ошибки проверки границ данных при обработке строк временной зоны, содержащихся во вложениях iCalendar. Удаленный пользователь может с помощью слишком длинной строки вызвать переполнение статического буфера и выполнить произвольный код на целевой системе. Для успешной эксплуатации уязвимости плагин ITip Formatter должен быть отключен. 2. Уязвимость существует из-за ошибки проверки границ данных при ответе на запрос iCalendar при включенном виде календаря. Удаленный пользователь может внедрить слишком длинное свойство DESCRIPTION во вложение iCalendar, вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. Для успешной эксплуатации уязвимости пользователь должен принять запросы iCalendar и ответить на них из окна Calendars. URL производителя: www.novell.com/products/desktop/ features/evolution.html. Решение: В настоящее время способов устранения уязвимости не существует. Некоторые производители Linux-систем выпустили исправления.

Программа: CA eTrust Content Manager 8.0. Опасность: Высокая. Описание: 1. Уязвимость существует из-за ошибки проверки границ данных в службе HTTP Gateway (icihttp.exe on port Множественные уязвимости 8080/TCP) при обработке определенных FTP-команд. Уда- в Black Ice Barcode SDK ленный пользователь может с помощью слишком длинно- Программа: Black Ice Barcode SDK 5.01, возможно, более го ответа для команд LIST и PASV вызвать переполнение ранние версии. стека и выполнить произвольный код на целевой системе Опасность: Высокая. с привилегиями учетной записи SYSTEM. Описание: 1. Уязвимость существует из-за использова2. Уязвимость существует из-за ошибки проверки гра- ния небезопасного метода DownloadImageFileURL() в BIDIB. ниц данных в службе HTTP Gateway (icihttp.exe on port 8080/ BIDIBCtrl.1 ActiveX (BIDIB.ocx)-компоненте. Удаленный польTCP) во время преобразования списка FTP-директорий зователь может с помощью специально сформированного и файлов в HTML. Удаленный пользователь может с помо- веб-сайта загрузить злонамеренный файл в произвольную щью слишком длинной строки вызвать переполнение стека директорию на системе. и выполнить произвольный код на целевой системе с при2. Уязвимость существует из-за ошибки в BIDIB. вилегиями учетной записи SYSTEM. BIDIBCtrl.1 ActiveX-компоненте при обработке метода URL производителя: www3.ca.com/Solutions/Product. «DownloadImageFileURL()». Удаленный пользователь может с помощью специально сформированного веб-сайта переasp?ID=4673. Решение: Установите исправление с сайта производителя. дать уязвимому методу слишком длинные аргументы, вызвать повреждение памяти и выполнить произвольный код на целевой системе. Целочисленное переполнение 3. Уязвимость существует из-за ошибки проверки грав OpenOffice ниц данных в BITIFF.BITiffCtrl.1 ActiveX (BITiff.ocx)-компоненПрограмма: OpenOffice 2.4 и более ранние версии. те при обработке аргументов в методе SetByteOrder(). УдаОпасность: Высокая. ленный пользователь может с помощью специально сфорОписание: Целочисленное переполнение обнаружено мированного веб-сайта передать слишком длинные арв функции rtl_allocateMemory(). Удаленный пользователь гументы уязвимому методу, вызвать переполнение стека может с помощью специально сформированного докумен- и выполнить произвольный код на целевой системе. та вызвать переполнение динамической памяти и выпол- URL производителя: www.blackice.com/barcode.htm. нить произвольный код на целевой системе. Решение: В настоящее время способов устранения уязвиURL производителя: www.openoffice.org. мости не существует. Решение: Установите последнюю версию 2.4.1 с сайта проСоставил Александр Антипов изводителя.

№6, июнь 2008

49


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

Дефекты проектирования Intel Core 2 Duo Аналитический обзор с точки зрения безопасности

Крис Касперски Процессоры Intel Core 2 Duo (и не только они одни!) содержат множество ошибок, приводящих к сбоям программного обеспечения, зависаниям операционной системы и даже возможности удаленного захвата управления компьютером! Часть ошибок обходится программным путем, часть – обновлением микрокода ЦП или прошивки BIOS, оставшиеся – неисправимы и требуют смены процессора. Насколько реальны эти угрозы? Попробуем разобраться!

К

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

50

сили единичный характер и учитывались разработчиками компиляторов. Сейчас они представляют разве что познавательный интерес. Легендарный «Hamarsoft's 86BUGS list», насчитывающий свыше сотни ошибок, недокументированных машинных команд и особенностей их поведения, последний раз обновлялся в 1994 году, после чего отправился на свалку истории, захлебнувшись в потоке дефектов, обнаруженных в первых моделях Pentium-

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


безопасность тановленного бита в src. Как вам нравится тот факт, что если src равен нулю, то содержимое dst становится неопределенным, то есть там может оказаться любой мусор, что серьезно осложняет отладку программ. Допустим, на машине разработчика установлен ЦП, оставляющий dst неизменным, и разработчик (или его компилятор) закладывается именно на такое поведение ЦП. А вот у конечного пользователя dst может сбрасываться в нуль, нарушая работоспособность программы и заставляя разработчика теряться в догадках, с какого момента программа пошла разнос. Обычно в таких случаях все списывается на Windows или «у вас на компьютере вирусы, переустановите операционную систему… ах, вы уже ее переустановили?! ну тогда мы не знаем, разбирайтесь со своей машиной сами». Кстати, это уже давно не ошибка, а вполне документированная особенность. Intel даже приводит псевдокод команды BSF во втором томе «Instruction Set Reference»: Листинг 1. Псевдокод команды BSF с «узаконенной» ошибкой IF SRC = 0 THEN ZF := 1; DEST is undefined; ELSE ZF := 0; temp := 0; WHILE Bit(SRC, temp) = 0 DO temp := temp + 1; DEST := temp; OD; FI;

С такими «особенностями» можно еще и смириться, но куда прикажете девать эпизодически возникающие исключения на 486+, возникающие при загрузке регистра CR3 (указатель на каталог страниц) в регистр общего назначения? Конечно, непредвиденные исключения можно и подавить, что делает Linux и OpenBSD. Делать-то она это делает, но… местами. А местами не делает. Обращения к регистру CR3 происходят из многих функций ядра, а ядро пишет целая армия разработчиков, часть из которых осведомлена об этом дефекте, а часть – даже не подозревает. В результате мы имеем нестабильно работающую систему. Windows не пытается сражаться с этим. А зря. Запрещение кэширо-

№6, июнь 2008

Ошибка деления в Pentium Самая громкая ошибка в Pentium была обнаружена в 1995 году и продемонстрирована на следующем примере: x – (x/y)*y, результат которого (если только y != 0), должен быть равен нулю, однако при определенных значениях x и y (x = 4195835, y = 3145727) процессор выдавал… 256! Потрясающая точность, однако! Журналисты подхватили сенсацию, вынудив Intel пойти на замену процессоров, чего она изначально делать не хотела, до-

казывая, что людям, далеким от математики, точные вычисления не нужны, а вероятность проявления ошибки на произвольном (а не умышленно подготовленном) наборе данных близка к нулю. С тех пор сообщений об ошибках в ЦП как будто бы не отмечалось. И потому заявление Тео де Раадта, что Core 2 Duo содержит огромное количество ошибок, многие из которых допускают удаленный захват управления, стало очередной сенсацией года.

вания на запись в некоторых моделях ду (а то и комбинации команд) через процессоров разрушает содержимое серию агрессивных тестов, результакэша, откуда процессор продолжа- ты которых так или иначе отражаются ет брать ранее скэшированные дан- в документации или же «specification ные (уже разрушенные), и чтобы про- updates». В частности, последние грамма не «грохнулась», кэш необхо- обновления спецификации на Intel димо очистить программным образом, Core 2 Duo в любой момент можно последовательно считывая ячейки па- скачать с официального сайта Intel: мяти – неважно какие – лишь бы за- http://www.intel.com/design/core2duo/ полнить его. Поскольку считываемые documentation.htm#specupdt, раздел данные не были модифицированы, erraata которого на момент написато при последующем поступлении дан- ния этих строк (май 2008) насчитывает ных в кэш ранее прочитанные ячейки 126 ошибок, многие из которых критипамяти не будут вытесняться ни в кэш ческие и затрагивают не только ядервышестоящего уровня, ни в оператив- ный, но и прикладной уровень. ную память, замещаясь новыми данныНемногим лучше обстоит ситуация ми. На прикладном уровне такая ситу- с серверными процессорами: Intel Xeon ация, конечно, маловероятна, да и не- Quad-Core 5400 и его младший собрат льзя на прикладном уровне управлять Xeon Dual-Core 5100 насчитывают по 54 кэшированием, но вот драйверы сов- официально признанных дефекта кажсем другое дело! Если некоторый ре- дый. И даже Itanium 9000, рекомендогион памяти используется для обмена ванный фирмой Intel для критических данными с внешним устройством (ви- инфраструктур (massive, mission-critical деоконтроллером или платой телемет- computing), хранит в своих недрах 85 рии), владельцы «неправильных» про- «жуков», способных обрушить сервер цессоров окажутся очень «рады» все- в любой момент. А ведь это одно из савозможным артефактам на экране мых дорогих и тщательно протестиромонитора и неверным телеметричес- ванных произведений Intel, ориентироким результатам. Стоит ли удивлять- ванное на корпоративный сегмент рынся, что x86 не используются в крити- ка, который ошибок не прощает и на коческих инфраструктурах, где работают простые и тщательно протестированные микроконтроллеры? Впрочем, мы отвлеклись, хотя это весьма полезное отвлечение, позволяющие читателю понять, что далеко не все странности поведения программного обеспечения имеют программную природу и дефекты процессоров в спонтанно вспыхивающих «голубых экранах смерти» играют далеко не последнюю роль. Производители ЦП ведут с дефектами проектирования ожесточенРисунок 1. Intel Core 2 Duo со всеми ную борьбу, прогоняя каждую команошибками, которые в нем только есть

51


безопасность Текст сообщения Тео де Раадта, опубликованный в конце июня 2007 года В настоящий момент разработчики программного обеспечения и производители железа заняты разработкой «костылей», исправляющих серьезные ошибки в процессорах серии Intel Core 2, содержащих адское количество багов, и некоторых из этих багов не просто мелкие дефекты проектирования, а реальные дыры, которые несомненно могут быть использованы для атак с прикладного уровня. Ряд ошибок невозможно ни исправить, ни найти обходное решение для предотвращения их возникновения. Intel ограничивается тем, что предоставляет техническую информацию производителям BIOS и ведущим разработчикам коммерческих операционных систем. Open Source-сообщество брошено на произвол судьбы. Вот полная (текущая) errata: http:// download.intel.c om /design /pro c es sor/ specupdt/31327914.pdf (ссылка не работает, т.к. номер спецификации постоянно обновляется, и последняя версия может быть найдена по базовой ссылке: http://www.intel.com/design/core2duo/ documentation.htm?iid=prod_core2duo+ tab_techdocs#specupdt. – Прим. переводчика):  Мы готовы биться об заклад, что ошибок на самом деле гораздо больше, чем анонсировано – с каждым месяцем errata становится все больше и больше (так оно и оказалось в последствии. – Прим. автора).  Intel существенно преуменьшает значимость обнаруженных ошибок – практически все операционные системы вляпаются в эти баги.  В сущности MMU (Memory Management Unit – блок управления памятью) подвергся существенным конструктивным

изменениям и работает совсем не так, как в предыдущем поколении x86-процессоров. Мало того, что он превратился в сплошное скопище «тараканов», Intel сделала решительный шаг вперед, определив, по ее выражению, «новые методы обработки страничных таблиц» (см. стр. 58 – тут не совсем понятно, что именно смотреть и где, поиск по фразе в Google выдает ссылки только на сообщение Тео де Раадта и ни одного документа от самой Intel. – Прим. автора).  Некоторые ошибки имеют прямое отношение к технике «переполнения буферов» (самая популярная разновидность атак на сегодняшний день. – Прим. автора), где защита от записи или атрибут «неисполняемый» нагло игнорируются процессором. Другие ошибки связаны с некогерентностью (т.е. несогласованностью) инструкций сопроцессора или же производят разрушения памяти – вне области, отведенной в пользование прикладного процесса, посредством последовательности «обычных» (т.е. непривилегированных) машинных инструкций.  Все это кажется совершенно невероятным, но это факт! Вот краткий сводный конспект ошибок Core 2 Duo для нетехнических людей: http:// www.geek.com/images/geeknews/2006Jan/ core_duo_errata__2006_01_21__full.gif (тут Theo de Raadt слегка противоречит сам себе, поскольку приводит конспект совсем другой errata, с другими ошибками и другой нумераций, поэтому перечисленные ниже номера ошибок не имеют к нему никакого отношения. – Прим. автора). Примечание: некоторые ошибки типа AI65, AI79, AI43, AI39, AI90, AI99 пугают нас так, что душа, минуя пятки, спуска-

ется прямо в преисподнюю. Эти «штучки» не могут быть исправлены программным путем, т.е. посредством модификации исходного кода операционной системы и/или приложений, и некоторые из них затрагивают все операционные системы, выпущенные до середины 2008 года, поскольку MMU любых Intel/AMD и совместимых с ними процессоров всегда управлялся одним и тем же способом. И вот теперь Intel говорит нам, что TLB-буферы, входящие в состав MMU, должны «сбрасываться» на совершенно иной манер. Но даже сделав это, ошибки процессора, перечисленные в errata, не позволят создать стабильно работающей операционной системы. Как уже говорилось, в обозначенном списке скрываются 20-30 ошибок, которые не могут быть преодолены программным путем на уровне операционной системы, и эти ошибки создают потенциальную угрозу для атаки на машину. Готов поставить на заклад кучу денег, что по крайней мере 2-3 из них реально способны на это. Например, AI90 подходит для атаки на некоторые операционные системы (двоичные сборки OpenBSD в конфигурации по умолчанию к ним не относятся). В настоящий момент я бы не рекомендовал приобретать машины, построенные на базе Intel Core 2, до тех пор пока дефекты проектирования не будут исправлены (что, по моим подсчетам, займет больше года). Intel должна стать более «прозрачной» (а не зажимать технические детали, рассылая их только разработчикам BIOS и коммерческих операционных систем. – Прим. автора). Между тем мне хотелось бы отметить, что AMD с каждым днем становится все менее и менее полезной для Open Source-сообщества, поскольку количество ошибок, обнаруженных в ее процессорах, растет не менее стремительно.

щищенностью, пришел в ярость, и набросился на производителей Core 2 Duo с обличительными заявлениями в стиле: «Как дальше жить и что нам делать?!», тут же подхваченными прессой и ставшими достоянием широкой общественности, постепенно начинающей осознавать, что помощи нет и не будет. Ситуация очень серьезна – достаточно большое число ошибок не только приводит к краху системы, но и (теоретически) допускает возможность удаленного захвата управления, поскольку некоторые инс…и грянул гром трукции при определенных обстоятельствах выполняютОзнакомившись с очередной errata на Core 2 Duo, Тео де ся не так, как ожидалось, например, программа, написанРаадт (Theo de Raadt), ведущий разработчик операционной ная на JavaScript, интенсивно работающая с кэшем, мосистемы OpenBSD, славящейся своей надежностью и за- жет вызывать направленный удар по памяти, искажая адтором помимо Intel имеются и другие игроки, впрочем, сталкивающиеся с теми же самыми проблемами. Мир не совершенен, никто из нас не без греха. Обновлять микрокод ЦП, прошивку BIOS (а в критических случаях – и сами процессоры!) нужно так же регулярно, как накладывать заплатки на операционные системы и прочее программное обеспечение. Ах да, операционные системы… С них-то все и началось!

52


безопасность рес возврата или другие указатели вомодному Server 2008, для которого n 99% машинного времени процессор на функции. заплаток нет и не предвидится. Что же «спит», практически не нагреваясь; Ряд ошибок процессора «сотруд- тогда говорить о «морально устарев- n при активной работе одного или несничает» с ошибками программного шем», но все еще работающем парке кольких блоков процессора теплопереполнения. Широко распростра- Windows 2000, XP, Server 2003?! выделение резко возрастет; нена ошибка неявного приведения тиНо вернемся к исходному сообще- n для отвода тепла с крохотной плопов (кастинга) – signed int в unsigned int. нию Тео де Раадта, опубликованному щади приходится применять высоОгромное количество программ, напи- в конце июня 2007 года, когда обнарукооборотные вентиляторы, характесанных на Си, хранят длину копируе- женных ошибок было вдвое меньше, ризующиеся высоким уровнем шумого блока памяти в переменной ти- чем сейчас: http://marc.info/?l=openbsdма, с которым очень сложно (и допа signed int, передавая ее функции misc&m=118296441702631. рого!) бороться. Вот производители типа memcpy() и выполняя при этом и перешли на адаптивную схему охпроверку «if (len > MAX) return -1», за- Сенсация или реальная лаждения, автоматически повышабывая о том, что если len < 0, то дан- угроза? ющую обороты вентилятора при нагреве кристалла и практически осная проверка проходит на «ура», а вот Интересно разобраться, что же так нав процессе передачи аргумента len пугало Тео де Раадта и насколько ветанавливающую лопасти во время функции memcpy() происходит неяв- лика вероятность атаки на Core 2 Duo, процессорного сна. ное преобразование типов в unsigned тем более, что за время, прошедшее int и, поскольку на x86-процессорах с момента публикации, количество обНекоторые производители использнаковый бит является старшим би- наруженных ошибок удвоилось. Ана- зуют внешний термодатчик, но большая том, то memcpy пытается скопировать лизировать ошибки мы будем в поряд- часть полагается на показания процеспо меньшей мере 2 Гб памяти (при 32- ке, обозначенном де Раадтом, с уче- сора – так и дешевле, и точнее, но есразрядном int). Вот именно, что «пы- том специфики операционных сис- ли DTS не работает, то возникает прятается». В ходе копирования функция тем семейства NT (Windows 2000, XP, мая угроза перегрева кристалла, осонепременно «врезается» в регион, не- Server 2003/2008, Vista), Linux и ли- бенно если хакер загрузит его на полдоступный на запись, и генерируется нейки BSD – Free, Net и Open, приво- ную мощность, что очень легко сдеисключение, приводящее к аварий- дя официальную информацию из errata лать Java-скрипитом или Flash-роликом. ному завершению программы (хотя со всеми выкладками и рассуждения- Кратковременный перегрев для ЦП в Windows-системах есть надежда, что ми, а местами – сценариями реализа- в общем-то не опасен, но вот систематический «перекал» ведет к необратив процессе копирования удастся пере- ции атаки. записать адрес обработчика исключемой деградации кристалла. Первым, ний до наступления исключения, пере- AI65: Температурное как правило, гибнет кэш, и система нахватывая управления при его генера- прерывание не генерируется чинает выдавать критические ошибки ции, но техника SafeSEH предотвраща- при выходе текущей приложений и выбрасывать голубые экет такой вариант развития событий). температуры за пределы раны смерти. Однако в процессоре Core 2 Duo име- n Проблема: когда DTS (Digital Таким образом, атаковать систему ется целый класс ошибок, приводяThermal Sensor – цифровой тем- не нужно. Она и сама умрет через кащих к преждевременному прерыванию пературный сенсор) достигает од- кое-то время. копирования блока памяти, когда его ного из установленных порогоразмер превышает размеры адресного вых значений, процессор генери- AI79: Инструкции пространства. В нормальных програмрует прерывание, протоколируя записи с префиксом мах такие ошибки никак не проявляютданное событие в журнале (IA32_ REP при определенных ся, поскольку никто из программистов THERM_STATUS MSR (019Ch) би- обстоятельствах могут не копирует блоки памяти по 4 Гб или ты [9,7]). Вследствие конструктив- завесить ЦП более того, но вот хакеры… им преного дефекта при достижении поро- n Проблема: во время выполнения ждевременное прерывание копироваговой температуры (что индицирусерии инструкций записи, предния очень на руку – отличное средство ется MSR-регистром IA32_THERM_ варенных префиксом REP (REP для «дозированного» переполнения STATUS бит [31]) DTS не генерирует STOSx/MOVSx), содержимое пробуфера в условиях неявного преобрапрерывания и не устанавливает бимежуточного буфера может выгрузования signed int в unsigned int. ты журнала, даже если было пройжаться в память до того, как туда Разработчики OpenBSD попытадено одно из пороговых значений. поступят актуальные данные. Поведение процессора зависит от полись заткнуть самые крупные дыры, n Последствия: при выходе темпепереписав код ядра так, чтобы исклюратуры кристалла за пороговые рядка выполнения инструкций, вречить или хотя бы снизить вероятность границы процессор не генерирует менных характеристик «спекулясобытий, ведущих к проявлению ошипрерывания. тивных» переходов и временных бок, но вот остальные программист- n Решение: не найдено. характеристик некэшируемого буские коллективы, выражаясь образфера записи. Этот дефект распроным языком, даже не почесались, В общем, не такой уж и страшный страняется на все операции записи и в первую очередь это относится к но- дефект, хотя… учитывая, что: с префиксом REP.

№6, июнь 2008

53


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

AI43: Параллельные записи в «чистые» страницы памяти на многопроцессорных системах ведут к неопределенному поведению

n Проблема: когда логический

Рисунок 2. Сводный конспект основных ошибок Core 2 Duo, на который ссылается Theo de Raadt

n Последствия: проявления дефекта варьируются от зависания процессора или операционной системы. n Решение: дефект можно обойти на уровне BIOS. Да… тут есть о чем задуматься. Инструкции REP STOSx/MOVSx отно-

54

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

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


безопасность женеры их очень любят. Инженеры вообще любят неожиданности, подстерегающие их в непредвиденных местах. Но чего тут гадать. Все предельно ясно. Флаг модификации, являясь разделяемым ресурсом, весьма придирчив к порядку, и все операции с ним должны быть упорядочены теми или иными механизмами синхронизации. Даже не сколько сам этот бит, а его окружение. Модифицировать отдельные биты процессор не обучен и он оперирует машинными словами (длина которых не обязательно равна двум байтам, в данном контексте – это минимальная порция обмена с памятью, которая, на Core 2 Duo по одним данным составляет 16, по другим – 32, а по третьим – 64 бита). Процессор сначала читает машинное слово целиком в свой внутренний буфер, взводит/сбрасывает один или несколько бит, после чего записывает его обратно. А теперь представим, что процессоров у нас два и они одновременно обращаются к одному и тому же слову. Тогда повторная установка уже установленного бита приведет к его сбросу! Операционная система будет считать, что данная страница не была модифицирована и потому при нехватке памяти не станет выгружать ее в файл подкачки, что приведет к необратимой потери данных! Как это можно использовать для атаки?! Завесить систему – это ерунда, при желании можно разрушить дисковый кэш, для этого нужно организовать операции записи одних и тех же файлов из двух (или более) разных потоков, параллельно с этим «съедая» всю свободную оперативную память. На NTFS самым главным файлом является $MFT, хранящий информацию обо всех остальных файлах тома. Прямое обращение к нему операционная система блокирует, но вот косвенное – создание/удаление/изменение атрибутов одних и тех же файлов из разных Рисунок 3. Сводный конспект основных ошибок Core 2 Duo, на который ссылается потоков – допускает даже с гостевыTheo de Raadt (продолжение) ми правами. А крах дискового тома – чается питание или зависает система, как ни странно 4 Кб – т.е. размеру одэто пострашнее зависания. Кстати говоря, автору уже не пер- то содержимое кэш-буфера теряет- ной страницы), то это дает все основавый раз приходилось восстанавливать ся целиком, в результате чего том ос- ния для заключения, что конструктивдиски, разрушенные именно таким об- тается в более или менее работоспо- ный дефект в процессорах проявляразом. Причем очень необычным об- собном состоянии, но вот когда теря- ется намного чаще, чем этого следоразом. Обычно, если внезапно отклю- ется лишь часть изменений (равная, вало ожидать.

№6, июнь 2008

55


безопасность Грубым решением проблемы является переход в однопроцессорный режим, что осуществляется добавлением ключа /ONECPU в boot.ini). Конечно, производительность при этом падает, но если целостность данных превыше производительности – это не такая уж и безумная мера. А надеяться на производителей BIOS… где гарантия, что они действительно справятся с ошибкой?!

AI39: Запрос кэш-линейки L1-кэша из одного ядра разрушает модифицированную кэш-линейку другого ядра, приводя к непредсказуемому поведению системы

n Проблема: когда запрос данных из Ядра 1 приводит к «промаху» L1-кэша, запрос перенаправляется к L2-кэшу. Если же данная кэшлинейка уже находится в L1-кэше Ядра 2 и была им модифицирована, при определенных обстоятельствах Ядру 1 возвращается неверный результат. n Последствия: непредсказуемое поведение системы. n Решение: BIOS может справиться с этой проблемой.

Как известно, многоядерные процессоры имеют разделяемый (один на всех) L2-кэш и «индивидуальные» L1‑кэши, фактически являющиеся частью ядра. В грубом приближении мы имеем обыкновенную многопроцессорную систему с разделяемой внешней памятью и внутрипроцессорной кэш-памятью. Для поддержания памяти в согласованном состоянии используются специальные когерентные протоколы, разработанные десятки лет тому назад. Казалось бы, в чем проблема?! А в том, что создатели Core 2 Duo или забыли о когерентности (ну это уж вряд ли), либо, что более вероятно, реализовали ее неправильно. Насколько часто разные ядра работают с одними и теми же порциями данных? Очень часто! Ведь при переключении контекстов потоки, стартовавшие на одном ядре, рано или поздно оказываются на другом! Последние версии операционных систем линейки NT, Linux и BSD наконец-то научились отличать ядра от физических процессоров (в многопро-

56

цессорных системах) и потому стараются по возможности избегать переброски потоков с одного ядро на другое, поскольку при этом придется заново заполнять L1-кэш. Есть даже специальные API-функции для закрепления потоков за определенным процессором (ядром), но на практике они не используются, и программисты предпочитают доверять системному планировщику, алгоритм которого оптимизируется разработчиками операционной системы с учетом «характера» процессоров, имеющихся на рынке. Но в распоряжении планировщика – сотни потоков и обычно только два (редко четыре) ядра. Так что избежать «передислокаций» потоков невозможно, точнее, возможно, но уж слишком неэффективно. Как можно использовать данный дефект для атаки? Самое простое – ничего не делать с системой. Она и сама упадет. Разрушение дисковых данных достаточно маловероятно, хотя и не исключено на 100%, а вот критические сбои приложений и голубые экраны смерти – вполне ожидаемое явление. Действительно, если программа чтото записала в память (на самом деле в кэш, но это уже не важно), а при последующем чтении не обнаружила никаких изменений, тут может произойти все что угодно. Автору удалось реализовать разрушение кучи (динамической памяти) путем циклического выделения/освобождения крошечных блоков в Java-скрипте, следствием чего явился крах браузера. Чисто теоретически возможно разрушить кучу так, чтобы передать управление на shell-код, но для этого необходимо учитывать множество специфичных деталей, неизвестных удаленному атакующему, хотя в принципе достаточно предсказуемых. Шторм запросов к любому драйверу (например, шторм IP-пакетов) также потенциально способен вызывать крах системы, но, учитывая, что шторма зачастую вызывают BSOD даже на «правильных» процессорах (из-за ошибок синхронизации, допущенных разработчиками драйверов), очень трудно определить, с каким дефектом мы имеем дело: с программным или аппаратным. Тем не менее хакерский потенциал у атак данного типа весьма весомый, что главным

образом обуславливается простотой их реализации. Самое непонятное в этой истории – какое отношение имеет BIOS с «разборкам» внутри процессора?! Единственное разумное предположение – BIOS просто заливает обновленный микрокод, предоставленный Intel. По‑другому справиться с проблемой навряд ли получится.

AI90: Атрибут доступа к странице памяти может быть установлен до генерации исключения

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

Вот мы и добрались до дефекта, особо отмеченного Тео де Раадтом в качестве подходящего кандидата для атаки на операционные системы (за исключением OpenBSD в конфигурации по умолчанию). Что же это за операционные системы такие?! В NT лимиты сегментов кода, данных и стека «распахнуты» на все адресное пространство, нижнюю половину которого занимает прикладной код, верхнюю – операционная система. Так что за пределами кодового сегмента вообще ничего нет. Да и чтобы добраться до его конца, необходимо сначала как-то попасть на уровень ядра, где можно делать что угодно и без всяких дефектов процессора (правда, в Core 2 Duo есть еще один интересный дефект, обнаруженный


безопасность автором и не описанный в последней errata – при выполнении кусочка инструкции, находящегося в самом конце кодового сегмента, декодер, определяя длину инструкции по первым байтам, пытается считать ее продолжение, которого нет, в результате чего происходит «заворот» в начало сегмента, первой странице которого также присваивается атрибут доступа, после чего генерируется исключение, которое хакеру необходимо отловить, чтобы система не свалилась в BSOD, но что это даст?! Младшие страницы адресного пространства специально сделаны недоступными в NT для отлова обращения по нулевым указателям, свидетельствующих о том, что программа обращается к невыделенной области памяти, и Windows передает ей исключение, которая та может обработать тем или иным образом, но чаще всего обработчик конструктивно непредусмотрен, и тогда система завершает работу приложения в аварийном режиме. Установка атрибута доступа на первую страницу приведет к подавлению исключения, и программа упадёт не в момент обращения к нулевому указателю, а чуть позже – когда попытается обработать считанный оттуда мусор. Не слишком-то большое достижение, к тому же легко реализуемое на прикладном уровне без обращения к дефектам процессора). Правда, 16-разрядные приложения имеют свои собственные 16-разрядные лимиты, и теоретически благодаря ошибке в процессоре атакующий может получить доступ к данным, которые ему читать не положено. В смысле по атрибутам страниц не положено, а так… если атакующий может запускать приложения, то отформатировать диск или удалить все файлы – быстрее и надежнее. А вот из 32-разрядного приложения вызвать 16-разрядное, ну не то чтобы невозможно, но все-таки достаточно сложно (имеется в виду вызов из shell-кода, исполняющегося в 32-разрядном приложении). Другими словами, на Windows этот дефект не оказывает ровным счетом никакого воздействия. А что на счет BSD и Linux? Штатные ядра также исповедуют плоскую

№6, июнь 2008

Рисунок 4. Сводный конспект основных ошибок Core 2 Duo, на который ссылается Theo de Raadt (продолжение)

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

shell-кода уже назрела – произошло вот что: нестандартные ядерные расширения урезали лимиты стека и сегмента данных (расположенных в начале) и отобрали у них атрибут «исполняемый». А за ними расположили сегмент кода. Вот если бы они поступили в обратном порядке (сначала код, потом стек и данные), то у хакеров была бы потенциальная возможность досту-

57


безопасность n Последствия: программное обеспечение должно либо отслеживать некорректное #PF исключение, предшествующее #GP исключению, так же как #PF исключению перед #DB. n Решение: не найдено.

Рисунок 5. Windows использует «плоскую» модель памяти с «распахнутыми» границами сегментов

па к недоступным данным, вот только… стек и куча доступы и так… без всяких дефектов процессора. Конечно, можно предположить, что где-то есть операционная система, в которой сначала идут пользовательские сегменты кода и данных, а потом расположен сегмент операционной системы, хранящий данные, защищенные от чтения, поскольку, будучи прочитанными, они позволят повысить уровень своих привилегий, например, но… если такая операционная система и есть, то это не Linux, не Windows, не BSD и не QNX… а какая-то студенческая поделка. Вопрос: какой интерес ее атаковать?! Короче, на этот дефект процессора можно вообще не обращать внимания. Ну разве что при разработке новых операционных систем, радикально отличающихся от уже существующих.

AI99: Обновление атрибутов директории кодовых страниц без «инвалидации» TLB может привести к некорректной обработке исключения #PF

Наконец-то мы добрались до дефекта, который Тео де Раадт характеризует как «ну вот, теперь нам Intel говорит, что TLB нужно обрабатывать совершенно иным путем, не похожим на старый». Ох и врет! Intel ничего такого не говорит, признавая за собой дефект и расписываясь в бессилии найти приемлемое обходное решение. Дефект, конечно, серьезный, и остается только удивляться, как существующие операционные системы ухитряются работать на Core 2 Duo, не падать каждые шесть-семь минут (хотя, возможно, они и падают, но не так часто). Выход только один – ждать новой ревизии процессора, с исправленной ошибкой обработки TLB (после чего все будет «как при бабушке»), либо же модифицировать (причем весьма значительно) ядро операционной системы, чтобы оно стабильно работало и на дефектных ЦП. Microsoft выпуском такой заплатки не озаботилась, хотя похоже, что при ее манерах обращения с TLB обозначенный дефект не особо и мешает. А вот де Раадт доработал ядро OpenBSD, застраховав систему от возможных «сюрпризов» со стороны процессора. Естественно, ядро исправить (да еще таким необычным способом) – это не просто две строчки кода местами поменять, так что его можно понять. Кому хочется отдуваться за чужие ошибки?! А между тем ошибок в процессорах много…

Заключение

Разработчики популярных операционных систем за последние годы существенно усилили их защиту, и золотое время отказ) обычно обрабатывается с другими исключени- атак на переполняющиеся буферы закончилось. Основные ями, перечисленными в порядке увеличения приори- лазейки уже закрыты, и поиск реально «работающих» дыр тета: #DB (Debug Exception – отладочное исключение), требует все больших и больших усилий. Но усилило ли это Segment Limit Violation (исключение выхода за пределы общую безопасность?! Едва ли. Это только раззадорило Сегмента), #GP (General Protection Fault – общее нару- хакеров, спровоцировав активный поиск принципиально шение защиты). Вследствие дефекта проектирования, новых методов атак. #PF исключение обрабатывается некорректно, при наНетронутую целину дефектов железа хакеры толькоступлении одного из следующих событий: только начали осваивать. До сих пор не представлено ни  PDE (Page Directory Entry – запись каталога страниц) одного proof-of-concept exploit и не зафиксировано случамодифицируется без «инвалидации» (to invalidate – ев вторжения, основанных на ошибках ЦП, однако… в атделать недействительным) соответствующей запи- мосфере определенно что-то происходит. Что-то такое.., си TLB (Translation Look-aside Buffer – буфер обрат- не предвещающее ничего хорошего. ной трансляции); Впрочем, не будем изображать из себя пророков, пре транзакция исполнения машинной инструкции на- доставив событиям развиваться своим чередом, а сами ходится на стыке двух страниц, причем выполняет- тем временем приложим максимум усилий по обеспечеся одно из следующих условий: нию собственной безопасности, скачивая свежие прошив линейный целевой адрес соответствует модифи- ки BIOS и выбирая продукцию тех производителей, котоцированной PDE; рым можно верить и которые действительно борются с де PTE (Page Table Entry – запись таблицы страниц) фектами процессоров, отмечая свои достижения в сопродля целевого линейного адреса имеет сброшен- водительных файлах. Что же касается операционных сисный бит доступа; тем, то в линейке BSD – OpenBSD несомненный лидер, Linux  транзакции предшествует одно из двух следующих все на одно лицо, и особой разницы между ними нет (у одисключений: них одни недостатки, у других – другие). Microsoft похоже  #DB и #PF; бороться в ошибками процессоров вообще не собирается,  #GP и #PF. а это большой минус.

n Проблема: исключение #PF (Page Fault – страничный

58


bugtraq Отказ в обслуживании в OpenSSL

Обход ограничений безопасности в Snort

Программа: OpenSSL версии 0.9.8f и 0.9.8g. Опасность: Средняя. Описание: 1. Уязвимость существует из-за ошибки двойного освобождения памяти при обработке данных расширения имени сервера. Удаленный пользователь может вызвать отказ в обслуживании приложения, использующего OpenSSL. Для успешной эксплуатации уязвимости OpenSSL должен быть собран с использованием TLS-расширений имени сервера. 2. Уязвимость существует из-за неизвестной ошибки, которая позволяет удаленному пользователю, контролирующему злонамеренный сервер, вызвать отказ в обслуживании клиентского приложения, использующего OpenSSL, когда «Server Key exchange message» не участвует в клиентском TLS-рукопожатии. URL производителя: www.openssl.org. Решение: Установите последнюю версию 0.9.8h с сайта производителя.

Программа: Snort версии до 2.8.1. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки дизайна при обработке фрагментированных IP-пакетов. Когда Snort получает фрагментированный пакет, осуществляется проверка значения Time To Live (TTL) и сравнение его со значением начального фрагмента. Если разница между значениями TTL-фрагментов больше, чем сконфигурировано (максимальное значение 5), фрагмент будет проигнорирован. Удаленный пользователь может с помощью фрагментированных валидных IP-пакетов обойти все правила фильтрации Snort. URL производителя: www.snort.org. Решение: Установите последнюю версию 2.8.1 с сайта производителя.

Обход ограничений безопасности в Skype Программа: Skype 3.6.0.248, возможно, более ранние версии. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки проверки расширений файлов в «file:» URI-обработчике. Удаленный пользователь может изменить регистр в расширении файла или указать файл, который не содержится в списке опасных файлов (список состоит из следующих расширений: .ade, .adp, .asd, .bas, .bat, .cab, .chm, .cmd, .com, .cpl, .crt, .dll, .eml, .exe, .hlp, .hta, .inf, .ins, .isp, .js), это приведет к тому, что приложение не отобразит окно предупреждения об опасном типе файла. URL производителя: www.skype.com. Решение: Установите последнюю версию 3.8.0.139 с сайта производителя.

Множественные уязвимости в IBM DB2 Программа: IBM DB2 9.1. Опасность: Средняя. Описание: 1. Уязвимость существует из-за неизвестной ошибки в плагинах разработки CLR-хранимых процедур в Visual Studio. 2. Уязвимость существует из-за ошибки проверки границ данных в функции SQLRLAKA(). Удаленный пользователь может вызвать переполнение стека. 3. Уязвимость существует из-за неизвестной ошибки, связанной с созданием файлов на административном сервере. Локальный пользователь может повысить свои привилегии на системе. 4. Уязвимость существует из-за ошибок проверки границ данных в XQUERY, XMLQUERY, XMLEXISTS и XMLTABLE. Удаленный пользователь может вызвать переполнение буфера. URL производителя: www-306.ibm.com/software/data/ db2/9. Решение: Установите исправление с сайта производителя.

№6, июнь 2008

Утечка памяти в vsftpd в Red Hat Linux Программа: Fedora 7, 8, 9; Red Hat Enterprise Linux (v. 5 server); Red Hat Enterprise Linux Desktop Workstation (v. 5 client); rPath Linux 1.x. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки в исправлении для Red Hat-платформ, которая привела к тому, что vsftpd dthcbb 2.0.5 не освобождает распределенную память при обработке пользовательских команд, если включена опция deny_file в конфигурационном файле vsftpd.conf. Удаленный пользователь может подключиться к удаленному серверу, выполнить большое количество CWD-команд и потребить все доступные ресурсы на системе. URL производителя: www.redhat.com. Решение: Установите исправление с сайта производителя.

Множественные уязвимости в MDaemon Программа: MDaemon 9.6.5, возможно, более ранние версии. Опасность: Средняя. Описание: 1. Уязвимость существует из-за ошибки разыменования нулевого указателя при обработке HTTP-запросов, отправленных интерфейсу WordClient (порт 3000/ TCP). Удаленный пользователь может с помощью специально сформированного HTTP POST-запроса, отправленного WorldClient.dll, аварийно завершить работу службы WordClient. 2. Уязвимость существует из-за ошибки проверки границ данных в WordClient-интерфейсе при обработке Replyзапросов с, например, слишком длинным полем Subject. Удаленный пользователь может с помощью специально сформированного e-mail-сообщения вызвать переполнение стека и выполнить произвольный код на целевой системе. Для успешной эксплуатации уязвимости требуется действительная учетная запись. URL производителя: www.altn.com/products/default.asp/ product_id/MDaemon. Решение: В настоящее время способов устранения уязвимости не существует.

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

59


web

Корпоративный информационный портал, который построил Джек

Антон Борисов Представьте себе компанию, перешедшую с бумажного на электронный документооборот. Дайте ей фору в несколько лет, чтобы она обзавелась электронной почтой, разместила сайт в Сети, в общем и целом, увязла в электронной паутине. Дайте ей фору еще в несколько лет, и окажется, что активно идут попытки консолидировать ту информацию, что хранится внутри компании, и получаемую извне. Для вас это уже актуально? Тогда – полный вперед! 60


web Исторические предпосылки В середине 90-х годов прошлого века мы запомнили такие веб-порталы, как Excite, Webcrawler, Yahoo!, Lycos, Altavista. Эти сайты предоставляли такую информацию, как новости, погоду, биржевые сводки, поиск, а также ряд других сервисов. Зачастую она была представлена в виде отдельных веб-приложений (портлетов). По мере того как предприятия переходили на электронный документооборот, росла и их потребность в таких же порталах, что имеют Yahoo! и им подобные, но в рамках данного конкретного предприятия. Корпоративный информационный портал – это место для интеграции информации, процессов и сообщества людей в рамках организации. Отличительными чертами порталов являются: децентрализованные источники информации система управление содержимым (Content Management System). За счет того, что портал предоставляет унифицированную точку доступа к информации, появляется возможность настроить получение информации в той форме, которая наиболее удобна пользователю. Портал может состоять из следующих модульных подсистем: n визуальный слой – интерфейс вебпользователя; n персонализация – способность формировать динамический ответ пользователю в зависимости от его персонального профиля; n средства совместной работы – инструменты для обмена информацией между пользователями (электронная почта, общие ресурсы и т. д.); n портлеты – структуры, предназначенные для легкого подключения программных модулей и сервисов приложений; n поиск и навигация – когда содержимое портала скомпоновано по категориям и предоставлено средство поиска необходимой информации; n публикация и подписки – возможность авторизовать новое содержимое и публиковать его подписчикам; n администрирование и безопасность – планировщик страниц, средства мониторинга метаданных.

№6, июнь 2008

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

Рисунок 1. Структурная схема портала, созданного из портлетов

рованием в соответствии с GPL/LGPL/ MIT/Apache License. Примерами могут служить:

Рисунок 2. Портал администрации Воронежской области

Рисунок 3. Исполнительная власть Москвы реализует программу «Одно Окно»

61


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

Сферы применения

Рисунок 4. JBoss Portal успешно развернут

Назначение порталов может быть различным. Это может быть портал компании, портал органа власти, портал госуслуг, портал вуза. Все они призваны служить какой-либо определенной цели, которые детально описаны по ссылке [1]. Приведу лишь примеры реализации порталов. Корпоративные порталы: n ОАО «Вымпелком» – http://www.msk. beeline.ru; n Steelcase Inc. – http://www.steelcase. com; n Siemens AG – http://siemens.com. Порталы органов власти:

n Еврейская автономная область – http://www.eao.ru;

n администрация Воронежской области – http://www.govvrn.ru;

n администрация Тульской области – http://admportal.tula.ru;

n Министерство экономического развития РФ – http://www.economy. gov.ru. Порталы госуслуг:

n Федеральное агентство по техни-

Рисунок 5. Может показаться, что за внешней простотой скрывается простой механизм, однако это не так

n WebSphere Portal Server – J2EE/ком- дарт (Java Specification Request 168 или мерческое лицензирование;

JSR168) для корпоративных порталов,

n Microsoft Office Sharepoint Server – построенных на основе Java. Цель данASP.NET/коммерческое лицензирование; n Oracle Application Server Portal – J2EE/коммерческое лицензирование; n Sun Java System Portal Server – J2EE/смешанное лицензирование; n Jetspeed – J2EE/Apache License; n JBoss Portal – J2EE/LGPL; n Liferay Portal – J2EE/MIT. Однако в 2003 году появляется инициатива использовать единый стан-

62

ного стандарта – предоставить единый API для взаимодействия между порталами и портлетами. Поэтому если вы запустили на предприятии портал, который поддерживает стандарт JSR168, то у вас высокие шансы, что портлеты, созданные в соответствии с данным стандартом, заработают и у вас. Что же такое портлет на самом деле? В первую очередь это веб-приложение, которое запущено на сервере приложений Java, например Tomcat. И во-вторых, это компонент, который

ческому регулированию и контролю – http://www.gost.ru; n электронная приемная города Москвы («Одно Окно») – http:// oo.mos.ru; n проект портала Зеленограда с его мобильными услугами – http://zelao. mobi; n портал госуслуг Республики Киргизия – http://www.govservices.kg. Порталв вузов:

n Брянская сельскохозяйственная академия – http://www.bgsha.com;

n Санкт-Петербургский университет информационных технологий, механики и оптики – http://www.ifmo.ru; n порта л информационной поддержки ЕГЭ – http://ege.edu.ru; n портал непрерывного образования преподавателей – http://www.neo. edu.ru;


web

Рисунок 6. В административном режиме начинаем формировать свой портал

n Казанский государственный технический университет – ределенные предпосылки, что портальное решение будет http://www.kai.ru;

n Академия управления ТИСБИ – http://www.tisbi.ru. В качестве международного портала стоит взглянуть на пример Индии – http://india.gov.in и на пример поискового портала – http://lycos.com. Что интересно, у такой разноплановой компании, как Microsoft, есть рекомендательный документ, как следует строить порталы, в частности, портал органов государственной власти [2].

Проблема выбора Почему был выбран именно JBoss Portal? На то было несколько причин: n хотелось отказаться от привязки к какой-либо конкретной операционной системе; n иметь поддержку Java-приложений; n иметь программное решение на открытых стандартах; n иметь возможность хранить данные в различных СУБД. Для первых трех пунктов в качестве аргумента выступила связка JAVA + JSR168. Что касается СУБД, то работа со следующими базами – MySQL, PostgreSQL, Oracle, MSSQL, HyperSonic DB – также оказалась достаточной. Ну и напоследок: за спиной JBoss стоит компания RedHat, которую врядли можно соблазнить эфемерными проектами. В 2006 году компания JBoss была куплена последней и преобразована в структурное подразделение – RedHat Middleware LLC. Напомню, что на протяжении уже больше десяти лет RedHat работает флагманом, который медленно, но верно двигает информационный рынок в части Linux-решений. Поэтому есть оп-

№6, июнь 2008

развиваться и в будущем. Этот факт тоже внес свою лепту в выбор JBoss Portal.

Установка портала Итак, забираем дистрибутив с JBoss Portal [3], создаем в системе пользователя с именем jboss. Распаковываем, например, в директорию jboss-portal. Впоследствии при упоминании JBOSS_HOME будем знать, что подразумевается директория /home/jboss/jboss-portal. Но перед стартом проведем несколько операций с СУБД. В данном примере выбран MySQL. Шаг 1. Создаем в MySQL-хранилище новую базу с именем html_data: mysql> create database html_data charset = utf8;

Шаг 2. Для пользователя jbossuser разрешаем доступ к этой базе, как с локального хоста, где крутится JBoss

Рисунок 7. Для каждой языковой группы посетителей можно назначить нужные названия страниц

63


web Portal, так и с рабочего места, откуда будут вноситься изменения в структуру базы: mysql> grant select, insert, update, delete, create, ↵ drop on html_data.* to 'jbossuser'@'localhost'; mysql> grant select, insert, update, delete, create, ↵ drop on html_data.* to 'jbossuser'@'192.168.194.128'; mysql> grant select, insert, update, delete, create, ↵ drop on html_data.* to 'jbossuser'@'192.168.194.1' ↵ identified by 'jboss';

Шаг 3. Зайдем в MySQL-хранилище под именем пользователя jbossuser: ab@abc:~> mysql -u jbossuser html_data

Шаг 4. И создадим таблицу с названием news: mysql> create table news ↵ (id integer not null auto_increment, `text` text, ↵ primary key (id)) charset = utf8;

mysql> show variables like 'character%';

+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)

mysql> show variables like 'collation%'; +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | latin1_swedish_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-------------------+ 3 rows in set (0.00 sec)

И еще один шаг перед запуском портала. Дело в том, Шаг 5. Затем с рабочего места заполним эту таблицу что JBoss Portal хранит в базе данных не только имена пользначениями с помощью SQLyog. Шаг 6. Далее следует в JBoss Portal выставить, что сле- зователей портала, их электронные адреса и другую слудует использовать MySQL-хранилище, т.к. по умолчанию бу- жебную информацию, но и содержимое CMS (HTML-файлы). дет использоваться база в формате Hypersonic DB. Ясно, что по мере того как портал будет заполняться новой Для этого из директории $JBOSS_HOME/setup/ сле- информацией (читай, новыми HTML-страницами), то будет дует скопировать файл portal-mysql5-ds.xml в директорию расти и размер базы. Но есть вариант, использовать вне$JBOSS_HOME/server/default/deploy/. Файл, который исполь- шнее хранение – непосредственно на диске, а не в базе. Для зуется по умолчанию, portal-hsqldb-ds.xml, нужно либо уда- этого изменим значения параметров externalBLOBs в файлить, либо переименовать как portal-hsqldb-ds.xml.original. ле $JBOSS_HOME/server/default/deploy/jboss-portal.sar/portalЗатем в файле portal-mysql5-ds.xml следует поменять cms.sar/META-INF/jboss-service.xml с «false» на «true»: имя пользователя и его пароль, от имени которого будет со<param name="externalBLOBs" value="true"/> здана портальная база. Примерное содержимое файла: <datasources> <local-tx-datasource> <jndi-name>PortalDS</jndi-name> <connection-url>jdbc:mysql://127.0.0.1:3306/ ↵ jbossportal?useServerPrepStmts=false& ↵ jdbcCompliantTruncatio n=false</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>jbossdb</user-name> <password>jbossdb</password> </local-tx-datasource> </datasources>

Ключевые параметры выделены красным шрифтом. Не забудем также взять с сайта MySQL.com jdbc-коннектор [4] и скопировать его в $JBOSS_HOME/server/default/lib/ mysql-connector-java-5.1.6-bin.jar. Обращаю ваше внимание на то, что таблица в MySQL-базе хранится в UTF8-форме (см. «create table ... charset = utf8»). Это связано с тем, что внутри JBP используется несколько языковых интерфейсных схем, в частности испанская и французская. И чтобы минимизировать проблемы с перекодировкой между порталом и браузерами, было решено хранить в UTF8. Еще одно замечание – проследите, чтобы в файле my.cnf было явно указано, какая кодировка используется: [mysqld] character_set_server=utf8

В частности, моя рабочая система работает с такими параметрами:

64

Шаг 7. Запускаем портал: $ $JBOSS_HOME/bin/run.sh --host 192.168.194.1

Как видите, для доступа к порталу нужно вводить URI в виде http://192.168.194.1:8080/portal/, что представляется не совсем удобным. Варианты следующие: включить перенаправление входящих запросов с порта 80 на локальный порт 8080 и изменить расположение доступа к порталу – Context Path: # /usr/sbin/iptables -t nat -A PREROUTING -i eth0 ↵ -p tcp --dport 80 -j REDIRECT --to-port 8080

И поменяем Context Path в файле $JBOSS_HOME/server/ default/deploy/jboss-portal.sar/portal-server.war/WEB-INF/jbossweb.xml. Новое значение будет выглядеть как: <context-root>/</context-root>

Зайдя на адрес 192.168.194.1, вы увидите стандартное окно JBoss Portal.

Создаем простейшее представление Первым делом попробуем составить свой собственный портал, немного отличный от стандартного.


web Для этого заходим под пользователем admin (его имя и пароль высвечиваются в портлете Welcome – название шапки «Greetings!»). Следуем в меню «Admin», что находится среди Dashboard, Admin, Logout, и во вкладке «Portal Objects» увидим, что существует 3 портала – admin, default и template. Причем портал default выбран текущим, что и понятно из названия и пометки в виде галочки. Вводим название создаваемого портала, например myPortal. Нажимаем на кнопку «Create Portal» и затем нажимаем на ссылку «Make Default». Зайдя по адресу http://192.168.194.1, можно полюбоваться на новый пустой портал (см. рис. 5). Первым делом попробуем создать несколько страниц, которые наполним текстом и добавим на них несколько Рисунок 8. Размещаем на страницу портлеты портлетов. Заодно и поменяем тему, чтобы можно было отличить наш портал от тысячи таких же, построенных на JBoss Portal. Создадим 4 страницы с названиями: «Страница1», «Страница2», «Страница3» и «Страница4». Лучше писать их названия в латинской раскладке, а затем назначить русский перевод. Итак, выбираем нужный портал – myPortal. В этом окне в поле «Create a page named:» набираем Page1 и подтверждаем, нажав на кнопку «Create page». Аналогично для остальных страниц. Первую страницу делаем страницей по умолчанию. Зайдем на вкладку для страницы Page1, названную «Display Names». Здесь для каждого языка можно сделать свой собственный перевод названия страниРисунок 9. Работаем в CMS-редакторе цы. Зачем это нужно? Представьте, что на страницы портала заходят зывает, что страница не найдена. Впро- Type: «Portlets»), так называемые виджеты (Content Type: «widget/netvibes»), посетители из различных языковых чем, это еще впереди. Переходим к наполнению страниц. виджеты с сайта google.com (Content групп, в качестве примера: из Франции, Германии, США и русскоязыч- На заглавную давайте поместим не- Type: «widget /google») или непосные пользователи. Чтобы каждому из сколько стандартных портлетов из со- редственно скомпоновать из различних страница показывалась не толь- става дистрибутива, вторую страницу ных HTML-документов (Content Type: ко как «Page1», но и как «Seite1», «La сделаем композитной из нескольких «cms»). Разместим портлеты Who's Page1», «Страница1», и придуман дан- HTML-страниц, а на остальные помес- Online и User на данной странице тим свои собственные портлеты: один (см рис. 8). ный раздел. Для второй страницы предвариНеобходимо заполнить поле с на- сторонний – GooglePortlet и один, козванием и выбрать язык локализации. торый делает выборку из MySQL-хра- тельно нужно создать несколько HTMLфайлов. Для этого переходим в раздел Внимание, если вы ввели локализа- нилища. Мы находимся во вкладке «Portals → CMS и создаем там файлы: content1. цию для русского языка, а в браузере клиента она не будет использоваться, myPortal portal → Page1 page layout». html, content2.html, content3.html. Нажито для сложных портальных решений Мы можем поместить на страницу пре- маем на кнопку «Select Action...» и вывозможны случаи, когда портал пока- дустановленные портлеты (Content бираем «Create File» (см. рис. 9).

№6, июнь 2008

65


web Во встроенном HTML-редакторе придумываем содержимое, редактируем и украшаем, а затем публикуем, нажав на «Create» (см. рис. 10). Аналогично для двух других файлов. В итоге должно получиться оформление, как на рис. 11.

Добавление собственных портлетов Портлетов, идущих в комплекте дистрибутивной поставки, не так уж и много. Поэтому возникает законный вопрос, а что нужно сделать, чтобы разместить портлет стороннего производителя? Как мы помним, JBP работает на Java, и спецификация JSR168 для него распространяется в полной мере. Поэтому те портлеты, которые спроектированы в полном соответствии с указанной спецификацией, должны запусРисунок 10. В итоге структура очередной страницы портала состоит из нескольких титься и на нашем портале. HTML-страниц Поисковые службы для любого пор<portlet-class>com.plumtree.portlet.portlets. ↵ тала, как мне кажется, являются одной из главных состав GooglePortlet</portlet-class> ных частей. Закономерно, что был выбран механизм поиска <init-param> <name>key</name> компании Google – GooglePortlet. Если вы помните, то в 2002 <value>NC8jGG8c+SYzP3IuclPD+a0lFjAj87Yd</value> году они представили свой сервис, известный как Google </init-param> SOAP Search API. Разработчикам предлагалось, однажды Размещаем портлет в JBP, скопировав его в директозарегистрировавшись на сайте Google, получить доступ рию $JBOSS_HOME/server/default/deploy. к весьма удобному интерфейсу поисковой машины. И затем аналогичным образом, так же как мы поступили Забираем архив с GooglePortlet по адресу [5], затем архив с jar-файлом от Google SOAP API по ссылке [6]. Чтобы с идущими в комплекте стандартными портлетами, размеспортлет заработал, следует разместить googleapi.jar в путь тим его на третьей странице. Полюбоваться поиском можпеременной classpath. Либо поместить его в сам портлет, но, перейдя на раздел «Страница3» портала и набрав, например, «BMW AG» (см. рис. 12). в директорию lib. Для более серьезных решений, когда сайт давно приНо и это пока не все, следующий шаг – это размещение ключевого файла от поискового сервиса Google. сутствует в Глобальной паутине и проиндексирован поисНа данный момент генерация новых ключей приос- ковиком, можно сделать контекстный поиск. Например, сформировав запрос вида «Слово_для_потановлена, поэтому воспользуемся уже существующим ключом (если он у вас есть) либо используем ключ иска + Название_Своей_Компании», где «Слово_для_поNC8jGG8c+SYzP3IuclPD+a0lFjAj87Yd. Его следует помес- иска» берется из собственного портлета, а «Название_Своей_компании» подставляется в строку запроса из этого же тить в файл portlet.xml в раздел <init-param>. портлета. С другими особенностями Google API можно ознакомиться на сайте GoogleDuel [7]. И наконец, пора разместить свой собственный портлет на последней странице портала. Он несложен, производит выборку новостных событий из базы и выводит ее результат в тело портлета. Воспользуемся примером портлета «Hello, World», правда, добавив несколько конструкций для доступа в MySQL-хранилище. Этот пример можно забрать со страницы JBoss Labs [8]. Оригинальный портлет выглядит следующим образом: Рисунок 11. А так выглядит «составная» страница в окне браузера пользователя

66


web package org.jboss.portlet.hello;

19

}

import import import import import import import

20 21 22 23

protected void doView(RenderRequest rRequest, ↵ RenderResponse rResponse) throws PortletException, ↵ IOException, UnavailableException { rResponse.setContentType("text/html"); PrintWriter writer = rResponse.getWriter();

javax.portlet.GenericPortlet; javax.portlet.PortletException; javax.portlet.RenderRequest; javax.portlet.RenderResponse; javax.portlet.UnavailableException; java.io.IOException; java.io.PrintWriter;

public class HelloWorldPortlet extends GenericPortlet { protected void doView(RenderRequest rRequest, ↵ RenderResponse rResponse) throws PortletException, IOException, UnavailableException { rResponse.setContentType("text/html"); PrintWriter writer = rResponse.getWriter(); writer.write("Hello World!"); writer.close(); } }

Модифицированный портлет: 1 package org.jboss.portlet.samplesql; 2 3 4 5 6 7 8

import import import import import import import

javax.portlet.GenericPortlet; javax.portlet.PortletException; javax.portlet.RenderRequest; javax.portlet.RenderResponse; javax.portlet.UnavailableException; java.io.IOException; java.io.PrintWriter;

9 import java.sql.*; 10 import java.util.Properties; 11 public class SampleSQLPortlet extends GenericPortlet 12 { 13 14 15 16 17 18

Connection conn = null; String url = "jdbc:mysql://localhost:3306/"; String userName = "jbossuser"; String password = ""; public void init() {

24 try 25 { 26 Class.forName ↵ ("com.mysql.jdbc.Driver").newInstance ( ); 27 conn = DriverManager.getConnection (url, ↵ userName, password); 28 Statement s = conn.createStatement ( ); 29 s.executeQuery ("SELECT * from ↵ html_data.news order by id"); 30 ResultSet rs = s.getResultSet ( ); 31 while (rs.next ( )) 32 { 33 int uid = rs.getInt (1); 34 String name = rs.getString(2); 35 String name3 = name.replaceAll("\n", ↵ "<br>"); 36 writer.println("<b>NewsID: " + uid + ↵ "</b>, content: " + name3 + ↵ "<br><hr>"); 37 writer.flush(); 38 } 39 rs.close ( ); 40 s.close ( ); 41 } catch (Exception e) { System.err.println ↵ ("Cannot connect to server" + e); 42 } 43 44

finally {

45 if (conn != null) 46 { 47 try 48 { 49 conn.close ( ); 50 } catch (Exception e) { /* ignore close ↵ errors */ } 51 }

Рисунок 12. Поисковый портлет от Google в действии

№6, июнь 2008

67


web 52 writer.println("<br><b>(TM) BoldText</b>"); 53 writer.close(); 54 } 55 } 56 }

В данном примере мы расширили функционал стандартной функции портлета doView(), добавив обработку запроса к MySQL-хранилищу (строки 24-41) по адресу localhost:3306, под именем пользователя jbossuser и с пустым паролем (строки 13-16). Выборка осуществлена запросом (строка 29): "SELECT * from html_data.news order by id"

Так как портлет – это веб-приложение, то представление в нем уже является HTML-страницей. Поэтому весь тот текст, что мы выводим из базы, нужно выводить как HTML. В этой связи все переводы строк заменены на их HTML-эквиваленты (строки 34-35), плюс мы еще выделили жирным номер новости (строка 36). Не забудьте поменять название портлета в файле сборки build.xml c «helloworldportlet» на «samplesqlportlet», а также в файлах-ресурсах в директории resources/samplesqlportletwar/WEB-INF/. Сборка портлета относительно проста:

чески скопирована и в директорию разворачивания портала и автоматически им развернута. 17:21:07,200 INFO [TomcatDeployer] deploy, ctxPath=/samplesqlportlet, warUrl=.../tmp/deploy/tmp41874samplesqlportlet-exp.war/ 17:21:07,262 INFO [PortletAppDeployment] Parsing /samplesqlportlet/jboss-portlet.xml 17:21:07,285 INFO [PortletAppDeployment] These instances have been found in -object.xml, you should put them in the file /home/ jboss/jboss-portal-2.6.4/server/default/./tmp/deploy/tmp41874samplesqlportlet-exp.war/WEB-INF/portlet-instances.xml 17:21:07,285 INFO [PortletAppDeployment] <?xml version="1.0" encoding="utf-8" standalone="yes"?> <deployments> <deployment> <instance> <instance-id>SampleSQLPortletInstance</instance-id> <portlet-ref>SampleSQLPortlet</portlet-ref> </instance> </deployment> </deployments>

При этом в портале, в административном режиме, вы увидите, что появился наш портлет под именем SampleSQL PortletInstance (см. рис. 13). Его-то и размещаем на четвертой странице. Выглядит, на мой взгляд, любопытно (см. рис. 14).

Смена визуальной цветовой «одежки»

Конечно, было бы интересно сделать сайт визуально различимым, хотя бы в цветовой гамме. Для этого в стандартной установке присутствуют следующие темы: industrial, ant clean; ant renaissance, maple, nphalanx и mission-critiсal. В частности, industrial выглядит вот так. Готовый портлет можно найти в директории Sample Вы обратили внимание, что в примерах используется SQLPortlet/output/lib. Его следует переписать в директо- отнюдь не стандартная тема. Все правильно, тема называрию горячего разворачивания портала либо сделать раз- ется «havana-affair» и может быть загружена с сайта JBoss, ворачивание портлета в автоматическом режиме. Для это- подраздел portletswap: http://www.jboss.org/portletswap/ го в build.xml вносим конструкцию копирования в нужное downloads/layouts. нам место: Давайте рассмотрим, что же из себя представляет тема. Распаковав файл havana_affair.zip, мы видим, что со<target name="deploy" depends="clover-yes, clover-no"> держимое темы (графические файлы и CSS-раскладка) <javac srcdir="${src.dir}" хранятся в директории havana_affair.war. Тема, как и порdestdir="${classes.dir}" classpath="${libs}" тлеты, может быть развернута в реальном режиме – такdebug="off" же как и портлеты, данную директорию нужно переписать optimize="on" deprecation="on" в $JBOSS_HOME/server/default/deploy. compiler="${compiler}"> Посмотрим на CSS-раскладку темы – файл «portal_ <include name="main/org/jboss/portlet/**/*.java"/> </javac> style.css». За описание портальных страниц отвечают теги: #body, #spacer, #header-container, #header, #logoName. <!-- portal-hello-lib.jar --> <jar jarfile="${build.lib}/samplesqlportlet-lib.jar"> Так, тэг #body выглядит следующим образом: <fileset dir="${classes.dir}"/> </jar>

<mkdir dir="${build.resources}/samplesqlportlet-war/ ↵ WEB-INF/lib"/> <copy file="${build.lib}/samplesqlportlet-lib.jar" ↵ todir="${build.resources}/samplesqlportlet-war/ ↵ WEB-INF/lib"/> <!-- portal-hello.war --> <jar jarfile="${build.lib}/samplesqlportlet.war"> <fileset dir="${build.resources}/ ↵ samplesqlportlet-war"/> </jar>

#body { background-image: url(images/portal_background.gif); background-repeat: repeat-x; background-color: #d5d9be; margin: 0px; padding: 0px; font-family: Georgia, "Times New Roman", Times, serif; font-size: 12px; color: #353634; }

Что это означает – страницы будут «залиты» фоновым рисунком из файла portal_background.gif. Причем если рисунок представляет собой полоску, то фон страницы будет составлен из множества таких полосок – за это отве</target> чает параметр «background-repeat: repeat-x». Цвет страниТогда каждая новая сборка портлета будет автомати- цы в нашем примере: #d5d9be (в hex-нотации R-G-B). Ис<copy todir="/home/jboss/jboss-portal/server/ ↵ default/deploy" file="${build.lib}/ ↵ samplesqlportlet.war"/>

68


web пользуется шрифт, указанный в параметре font-family с размером в 12 пунктов. Его цвет – #353634. Как видите, с дизайнерской точки зрения понятно. Первым делом после установки портала хочется поменять логотип компании – в тэге #logoName за это отвечает параметр backgroundimage. Осталось только не запутаться с другими тэгами, отвечающими за более тонкую раскладку, такими как, например, #regionA, #regionB, #regionC, UL#tabsHeader. Они подробно описаны в документации к порталу, поэтому если вы хотите сделать «лицо» компании действительно эксклюзивным, то прочитайте раздел «24. Layouts and Themes» из JBossPortal Reference Guide. Стоит также отметить, что за представление портлетов отвечают тэги вида .portlet-название. Например, .portletcontainer, .portlet-titlebar-title, .portlettitlebar-decoration и другие. Так, тэг .portlet-body управляет цветовой гаммой портлета

Рисунок 13. В списке портлетов появился и наш

.portlet-body { background-color: #fafaf9; }

В свете вышеизложенного можно и нужно попросить вашего дизайнера поработать над вашим собственным стилем. Знание CSS, разметки страницы и артистический вкус – и вас запомнят. Темы, как и портлеты, разворачиваются в «горячем» режиме – копированием в директорию deploy. Пару слов об управляемости портлетов. Как мы уже показали выше, портлеты разворачиваются в реальном времени – нет смысла останавливать портал, копировать единичные портлеты и запускать заново портал. Если вы составляете свой собственный портлет, то внимательно следите за тем, как вы составляете параметры (файлы-ресурсы должны иметь корректные параметры). В противном случае портлет не развернется. Мы рас с м от р ел и од н у и з с амых простых реализаций портлета – SampleSQLPortlet. От него не требуется какой-то сложной динамики. Главная его задача – выводить информацию из локальной базы (см. рис. 15). Добавив более сложную бизнеслогику, мы можем сделать его интеллектуальнее, например, выводить информацию за последние несколько

№6, июнь 2008

Рисунок 14. Результат выборки MySQL-базы в теле портлета

Рисунок 15. Информация, что будет выводить SampleSQLPortlet

69


web ные вложения, стоит посоветовать подписаться на техническую поддержку от JBoss. Понятно, что за советы у нас не очень любят платить, но, с другой стороны – ничего бесплатного на дороге не валяется. И если компания свободна во временных рамках, то это классический пример, когда оплата за продукт неявным образом переходит на оплату труда своих же сотрудников. По мере роста масштабов производства и, соответственно, потоков информации зацикливаться на стоимости продукта и его внедрении уже не имеет смысла. В этом случае коммерческие решения выливаются в следующие примерные суммы: n IBM WebSphere Portal Server – 51500 долларов за процессор; n IBM WebSphere Portal Express – 2300 долларов за пакет на 20 пользователей или лицензия за каждый CPU до 39999 долларов; Рисунок 16. К MySQL-базе можно подключаться с помощью, n Oracle AS Portal – лицензия за одного пользователя – например, SQLyog 200 долларов или лицензия за каждый CPU – 10000 долдней. Отмечу также, что обновление содержимого данной ларов; базы (html.data) не представляет из себя что-то архислож- n Oracle AS Portal Standard Edition One – лицензия за одное (см. рис. 16, 17). ного пользователя – 149 долларов или лицензия за кажВ качестве инструмента обновления мы использовали дый CPU – 4995 долларов. SQLyog, но также можно использовать и любое другое решение, в зависимости от квалификации оператора и посНа фоне курсов для JBoss Portal 2250 евро выглядит тавленных задач. впечатляюще. Сравнение, конечно же, не совсем корректГде взять дополнительные портлеты? Например, на сай- ное, но позволяет судить о масштабах цен. те JBoss в разделе portletswap. Также можно обратиться к И в качестве заключения процитирую Юлия Матеворесурсам https://gems.dev.java.net, http://www.adenin.com/ сова (директора аналитического департамента Dresdner Intranet-Suite/Enterprise-Portal.aspx, http://www.syncex.com, Kleinwort Wasserstein): «Сейчас в России многие компании http://portlet-opensrc.sourceforge.net. малого бизнеса предпочитают не вкладывать средства в развитие внутренних IT-решений, ограничиваясь корЦена вопроса поративным сайтом для сотрудников. Как правило, такой При проектировании портала стоит помнить, что ваш вы- подход не приносит компании особой пользы и не влияет бор не ограничивается JBoss Portal. Вы можете взять, на- на эффективность ее деятельности. Однако при дальнейпример, конкурентные продукты – Liferay, uPortal, GridSphere шем расширении оргструктуры все равно, рано или позд(они все принадлежат к классу Open Source) и попробовать но, приходится использовать хотя бы минимальный пакет построить портальное решение с их помощью. С финансо- IT-услуг. Иначе эта самая расширенная оргструктура превой точки зрения вы оплачиваете только свои собственные вратится в колосса на глиняных ногах». издержки, и, как правило, они будут значительно ниже покупки коммерческих решений. 1. http://www.kck.ru/kcksite/kckmain2008.nsf/pages/spheres_ Тем компаниям, что принадлежат к сегменту малого all.html. и среднего бизнеса (SMB) и ценят время на разворачива- 2. http://www.microsoft.com/Rus/Government/Solutions/portal/ ние, но не видят возможности пойти на крупные капитальarchitecture/default.mspx.

Рисунок 17. Заполнять новыми значениями базу легче простого

70

3. http://downloads.sourceforge.net/jboss/ jboss-portal-2.6.4-bundled.zip. 4. http://dev.mysql.com/downloads/connector/ j/5.1.html. 5. http://prdownloads.sourceforge.net/portletopensrc/GooglePortlet.zip?download. 6. http://debian.fmi.uni-sofia.bg/~hiena / googleapi.zip. 7. http://www.googleduel.com/apiexample. php. 8. http://labs.jboss.com/portal/portletswap/ portlets_tutorial.html. 9 http://en.wikipedia.org/wiki/JSR_168. 10. http://en.wikipedia.org/wiki/Enterprise_ portal.


bugtraq Переполнение буфера в ядре Linux

Множественные уязвимости

Программа: Linux kernel версии до 2.6.25.5 и 2.4.36.6. в Cisco Service Control Engine Опасность: Средняя. Программа: Cisco Service Control Engine 1000; Cisco Service Описание: Уязвимость существует из-за ошибки проверки Control Engine 2000. границ данных в модулях ip_nat_snmp_basic и cifs в ASN.1 Опасность: Средняя. BER декодере. Удаленный пользователь может с помощью Описание: 1. Уязвимость существует из-за ошибки при обспециально сформированных BER-кодированных данных работке попыток авторизации на SCE SSH-сервере. Удавызвать отказ в обслуживании или скомпрометировать це- ленный пользователь может создать большое количестлевую систему. во подключений и вызвать нестабильную работу устройсURL производителя: www.kernle.org. тва или перезагрузку. Уязвимость существует в SCE 1000 Решение: Установите последнюю версию ядра 2.6.25.5 или и 2000 в версиях до 3.1.6. 2.4.36.6 с сайта производителя. 2. Уязвимость существует из-за наличия некорректных операций ввода/вывода при обработке легитимного SSH-траМножественные уязвимости фика на SCE-интерфейсе управления совместно с некоторыв Cisco ASA и PIX ми задачами по управлению. Удаленный пользователь моПрограмма: Cisco Adaptive Security Appliance (ASA) 7.x, 8.x; жет вызвать отказ в обслуживании устройства. Уязвимость Cisco PIX 7.x, 8.x. существует в SCE 1000 и 2000 в версиях до 3.0.7 и 3.1.0. Опасность: Средняя. 3. Уязвимость существует из-за ошибки в процессе авОписание: 1. Уязвимость существует из-за неизвестной торизации в SCE SSH-сервере, которая не связана с часошибки при обработке TCP ACK-пакетов. Удаленный поль- тотой попыток входа или другими задачами. Злоумышлензователь может с помощью специально сформированного ник может попытаться использовать определенные учетные пакета вызвать отказ в обслуживании устройства. Уязви- данные для попытки смены метода аутентификации, что момости подвержены версии 7.1.x, 7.2.x и 8.0.x. жет сказаться на производительности системы. Уязвимость 2. Уязвимость существует из-за неизвестной ошибки существует в SCE 1000 и 2000 в версиях до 3.1.6. при обработке TLS-протокола. Удаленный пользователь мо- URL производителя: ww.cisco.com. жет с помощью специально сформированного TLS-пакета Решение: Установите исправление с сайта производителя, вызвать перезагрузку устройства. Уязвимости подверже- доступное для зарегистрированных клиентов. ны версии 8.0.x и 8.1.x. 3. Уязвимость существует из-за неизвестной ошибки Выполнение произвольного кода в Instant Messaging Inspection. Удаленный пользователь мо- в ядре Linux жет вызвать отказ в обслуживании устройства. Для успеш- Программа: Linux kernel 2.6.18, возможно, другие версии. ной эксплуатации уязвимости Instant Messaging Inspection Опасность: Средняя. должен быть включен. Уязвимости подвержены версии Описание: Уязвимость существует из-за недостаточной 7.2.x, 8.0.x и 8.1.x. проверки входных данных в функции dccp_feat_change() 4. Уязвимость существует из-за неизвестной ошибки, ко- файла net/dccp/feat.c в подсистеме DCCP (Datagram торая позволяет вызвать перезагрузку устройства посред- Congestion Control Protocol). Удаленный пользователь моством специально сформированного трафика (например, жет вызвать переполнение буфера и выполнить произвольс помощью сканера уязвимостей/портов) на порт 443/TCP. ный код на целевой системе. 5. Уязвимость существует из-за неизвестной ошибки, URL производителя: www.kernel.org. которая приводит к некорректной работе списков контроля Решение: В настоящее время способов устранения уязвидоступа. Удаленный пользователь может обойти ограниче- мости не существует. Некоторые производители Linux-сисния ACL. Уязвимости подвержены версии 8.0.x. тем выпустили исправления. URL производителя: www.cisco.com. Решение: Установите исправления с сайта производителя. Спуфинг-атака в Net-SNMP Программа: Net-SNMP версии до 5.4.1.1, 5.3.2.1 и 5.2.4.1. Отказ в обслуживании в Apache mod_proxy Опасность: Низкая. Программа: Apache 2.2.8 и 2.0.63, возможно, более ран- Описание: Уязвимость существует из-за ошибки при проние версии. верке подлинности HMAC-дайджеста. Удаленный польОпасность: Низкая. зователь может с помощью специально сформированноОписание: Уязвимость существует из-за ошибки в функ- го SNMPv3-пакета, с неполным однобайтным HMAC-дайции ap_proxy_http_process_response() при перенаправле- джестом, увеличить возможность удачной подмены до 1 нии промежуточных ответов. Удаленный пользователь мо- из 256 пакетов. жет заставить модуль mod_proxy отправить большое коли- URL производителя: net-snmp.sourceforge.net. чество промежуточных ответов клиенту и потребить боль- Решение: Установите последнюю версию 5.4.1.1, 5.3.2.1 или 5.2.4.1 с сайта производителя. шое количество памяти на системе. URL производителя: www.apache.org. Составил Александр Антипов Решение: Установите исправление из SVN-репозитория производителя.

№6, июнь 2008

71


web

Оцениваем технологию Adobe AIR

Александр Майоров С бурным развитием технологий все больше и больше стирается грань между Интернетом и системами пользователей. Появляется много сервисов, заменяющих стандартные настольные программы. Идет бурное освоение десктопа интернет-приложениями, и свидетельством тому – новая технология от Adobe.

Суть проблемы В последнее время наблюдается некоторый спад тотального доминирования ОС семейства Windows от компании Microsoft. Многие корпоративные секторы начали переходить на альтернативные системы. Также идет рост развития смартофонов и прочих мобильных персональных устройств. В связи

72

с этим наблюдается повышенный интерес к кроссплатформенному программированию. И это понятно. Писать для каждой платформы свою версию ПО с учетом всевозможных особенностей очень дорогое удовольствие. Многие знают о языке Java компании Sun Microsystems, девизом которого является выражение «Написано однажды –

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


web му на J2ME, работающее одинаково хорошо в полноэкранном режиме на разных телефонах). Для работы такого ПО на каждой платформе должна быть установлена среда выполнения Java (Java Runtime Environment, JRE). Также с бурным развитием Интернета все больше пользователей подключаются к Глобальной сети, и все больше появляется всевозможных веб-сервисов, не уступающих по своей функциональности настольным приложениям, а порой даже превосходящих их по некоторым параметрам. Достаточно привести в качестве примера Gmail и Google Documents. Представьте себе, что сервис Gmail мог бы работать даже в оффлайновом режиме и мог бы запускаться не только через браузер, но и как самостоятельное настольное приложение. И вам не обязательно было бы все время иметь соединение с Интернетом для работы данного сервиса. Например, вы находитесь в метро с ноутбуком. У вас тем не менее открыт Gmail, оформленный в виде нативной программы, и вы пишете письмо. Нажимаете кнопку «Отправить», и Gmail сообщает вам, что письмо поставлено в очередь на отправление. Замечательно, не правда ли? Как такое возможно, спросите вы? Если бы мы писали такое приложение, то общая схема работы должна была быть следующей: n проверка соединения с Интернетом; n если соединение установлено – отправляем почту; n если соединение не установлено – сохраняем почту в локальной базе данных, например SQLite. При следующем коннекте с Интернетом отправляем почту. Это примерное описание, но суть понятна. Но мало того, что веб-приложение должно синхронизироваться с локальной системой. Хотелось бы, чтобы оно было написано единожды, но работало на разных платформах, причем одинаково хорошо. Более того нужно, чтобы приложением возможно было воспользоваться на разных компьютерах, при этом не было бы необходимости синхронизировать данные. Все должно храниться на сервере, а на локальный компьютер кеширо-

№6, июнь 2008

вались бы только часто используемые Adobe Integrated Runtime – это не просто средство для разработки данные. Фантастика? Ну почему же. Средствами Java такое вполне ре- многофункциональных мультимедийализуемо. Но мы сказали, что это веб- ных сетевых RIA-приложений (Rich приложение, а значит оно и написа- Internet Applications), но и среда выно с применением таких инструмен- полнения для веб-сервисов на работов как DHTML, XML, JS, CSS и так чем столе. Особенностью таких продалее. Выходит, что нам надо бы пи- грамм является обладание привлекасать отдельно веб-версию и клиент- тельным интерфейсом и, конечно же, скую версию приложения, а это, в свою возможность работы как онлайн, так очередь, говорит о том, что надо при- и оффлайн. менить уйму разных технологий, языПо сути AIR-приложение – это наков программирования и инструмен- бор взаимосвязанных файлов, растов разработки. Все это накладыва- пространяемых в виде некого AIR-конет свои определенные трудности и за- тейнера. Среда исполнения AIR обесставляет разработчиков осваивать печивает дополнительный функциомного инструментов разработки, со- нал файлам, упакованным в AIR-арответственно, тратить на это больше хив. В обычном браузере или Flashсил и времени. плейере такого функционала, естесА что, если в качестве инструмен- твенно, нет. та программирования для написания Таким образом становится ясна такого клиентского настольного при- двойственная природа AIR. С одной ложения мы бы использовали те же стороны, это программа запуска Flashсамые инструменты что и для WEB? приложений, которая может показатьА само приложение выполнялось бы ся лишь усложненной версией старого в некоторой среде исполнения по ти- Flash-плейера. пу Java-приложений. И весь наш серС другой стороны, она предназнавис был бы доступен как из браузеров чена для запуска приложений, напи(естественно, с ограничениями, накла- санных на DHTML и JavaScript, что стадываемыми браузерами), так и в ви- новится возможным благодаря мехаде отдельного самостоятельного при- низму браузера Webkit, являющимся ложения, работающего независимого неотъемлемой частью Adobe AIR. от того, есть ли в данный момент соПоявление такой технологии являединение с Интернетом. Причем оди- ется серьезным шагом в сторону оснаково вне зависимости от ОС, на ко- воения настольных систем интернетторой это приложение исполняется приложениями. Если раньше веб-разв данный момент! работчик мог работать исключительно в пределах окна браузера, при этом Воздушное решение приходилось (да и сейчас приходитот Adobe ся до сих пор) учитывать особенносКомпания Adobe решила попытаться ти разных версий, то теперь открывасделать миф реальностью и начала ются поистине большие перспективы: разработку проекта под кодовым наз- разработчик может быть гораздо бливанием Apollo, который в последствии же к обычному пользователю, создабыл переименован в Adobe AIR (Adobe вая новые продукты, более тесно инIntegrated Runtime). Эта технология как тегрированные с привычной для польраз и создана для веб-разработчиков, зователя средой. И при этом исполькоторые хотели бы не просто создавать зуются все те же инструменты разравеб-сервисы, но и писать обычные на- ботки и языки. стольные приложения для десктопСреди основных достоинств тасистем. Раньше это означало бы, что ких приложений компания Adobe вывеб-разработчик должен переквали- деляет быстроту создания и внедрефицироваться в системного програм- ния, а также простоту и удобство исмиста и освоить языки программиро- пользования. Интерактивным прилования типа C/C++, Java, ObjectPascal жениям будут присущи и некоторые или что-то подобное. Но теперь, с вы- особенности традиционных настольходом новой платформы, это не обяза- ных программ, в частности, возможтельно. Adobe AIR позволяет частично ность работы с хранящимися локальрешить эту проблему. но файлами, функции взаимодействия

73


web  Prototype;  Dojo;  Ext JS;  Adobe Spry;  Aflax;  jQuery;  Mootools;  Rico;  Scriptaculos.

Инструментарий

Рисунок 1. Среда разработки Aptana Studio

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

Возможности AIR К основным возможностям, которыми обладает Adobe AIR, можно отнести встроенный браузерный движок, позволяющий использовать все возможности DHTML, CSS, JavaScript и Flash в едином рабочем пространстве. При разработке приложений программист одновременно может использовать Javascript для доступа к возможностям Flash, а Flash-программист, в свою очередь, к JavaScriptбиблиотекам. В итоге можно создавать гибридные приложения, сочетающие в себе плюсы обеих технологий. Имеется встроенное хранилище данных на базе SQLite, в котором приложение может хранить пользовательскую информацию на локальной системе. AIR-приложения имеют доступ к файловой системе на пользовательском компьютере, что позволяет осуществлять работу с файлами пользователя. Есть поддержка «Drag'n'Drop», что обеспечивает возможность «перетаскивания» данных между приложениями посредством мыши, как и во многих настольных приложениях. Поддержка прозрачности окон, возможность работы с буфером обмена и мультимедиа (звуком, видео (FLV), экраном). Возможна асинхронная работа с сетевыми ресурсами, поддержка отправки и загрузки данных. Доступна работа с PDF и управление цифровыми правами на кон-

74

тент. Создана возможность для самостоятельного обновления приложений встроенными программными средствами. Все основные возможности Adobe AIR по пунктам: n File I/O API (встроенное API для работы с файловой системой пользователя); n SQLite API (API для работы с SQLIte из Adobe AIR-приложений); n Flash Player 9; n полнофункциональный HTML; n с в я з ь м е ж д у A c t i o n S c r i p t 3 и JavaScript; n поддержка drag-and-drop; n поддержка буфера обмена; n ассоциация с типами файлов; n иконки приложения; n поддержка PDF. Наряду с вышедшей бетой Adobe Flex 3 Adobe AIR является основой комплексной платформы компании, делающей возможным для разработчиков создание RIA-приложений и их доставку на устройства под управлением всех основных ОС. На сегодняшний день платформа поддерживает три операционные системы: Windows, MacOS и Linux. При разработке AIR-приложений можно использовать следующие технологии и библиотеки: n Flash/Flex; n DHTML; n XML; n CSS; n JavaScript:  Yahoo User Interface (YUI);

В то время как для Windows и MacOS доступна уже 3-я бета, то для Linux доступна всего лишь альфа-версия. Поэтому приложения AIR для GNU/Linux пока не могут работать в полном объеме и использовать весь заявленный разработчиками функционал. Более того, Adobe AIR доступна не для всех GNU/Linux-платформ. Альфа-версия Linux AIR поддерживает следующие ОС: Red Hat Desktop 4, RHEL 5, Novell Desktop 9, SUSE 10, Ubuntu 6.06. Требует рабочую среду GNOME или KDE, а также наличия композитных менеджеров Beryl, Compiz, Compiz-fusion для поддержки эффектов прозрачности. Не поддерживаются уведомления об обновлениях, регистрация типов файлов, запуск приложений из браузера, сочетания клавиш, печать, автозапуск приложений, отображение PDF и SWF внутри DHTML, стек протоколов Ipv6. Нет возможности корректной работы с кириллицей. Несомненно, все эти недостатки исправят в ближайшем будущем, и разрыв между версиями для разных платформ сократится. А пока лучше всего пробовать технологию на ОС семейства Windows или MacOS, хотя и под GNU/Linux стоит посмотреть (лично я, мягко говоря, не был в восторге от 1-й альфы, установленной под OpenSUSE 10.3). Прежде чем приступить к разработке, следует скачать и установить необходимый набор инструментов. Альфа-версию Adobe AIR для GNU/Linux можно скачать по этой ссылке: http:// labs.adobe.com/downloads/air_linux.html. Бета-версии для Windows и MacOS доступны на странице http://labs.adobe. com/downloads/air.html. Помимо самой среды исполнения для разработки AIR-приложений вам необходим AIR SDK. Он состоит из следующих основных компонентов: n AIR runtime;


web n ADT; n ADL. ADT – AIR Developer Tool – утилита, позволяющая создавать AIR-архивы (файлы с расширением air) для распространения. По сути это утилита, создающая инсталятор вашего AIR-приложения. ADL – AIR Debug Launcher, является ключевым компонентом в AIR SDK. C его помощью вы тестируете AIR-приложение, перед созданием финального релиза. AIR SDK доступна на сайте Adobe по адресу http://www. adobe.com/products/air/tools. Также там доступны средства разработки. AIR SDK можно скачать как отдельно, так и в виде расширения для Adobe Dreamweaver, что, несомненно, будет очень удобно разработчикам. Но лично мне показалось, что писать под AIR более удобно в специализированной студии Aptana Studio (http://www.aptana.com), основанной на Eclipse (см. рис. 1). Сам AIR SDK подключается к студии плагином. Естественно, никто не мешает просто подключить плагин в самой Eclipse. Особенно приятно, что эта среда разработки кроссплатформенная и существует почти для всех операционных систем.

Пишем приложение После того, как вы установите среду Adobe AIR (см. рис. 2) и скачаете SDK, можно приступать к работе. С установкой среды проблем возникнуть не должно, так как даже для GNU/Linux-систем среда распространяется в виде бинарных пакетов. Что касается SDK, то это просто набор файлов и программ, которые можно установить куда угодно. Допустим, если это ОС Windows, то можете распаковать архив прямо в корень, в директорию C:\AirSDK, так будет удобней работать. Тут уже вы сами решаете, как вам лучше сделать. Создайте директорию для ваших AIR-проектов, допустим это C:\AirProjects. Теперь почти все готово. Кстати, хочу сказать, что я буду показывать, как писать приложение без всевозможных дополнительных инструментов, таких как Aptana Studio. Дело в том, что таким образом вы лучше всего сможете понять архитектуру системы. А впоследствии, если вы всерьез займетесь разработкой на AIR, лучшим решением будет использовать специализированные инструментальные средства. Просто та же Aptana Studio при создании приложения за вас генерит стартовый код, как и все студии вобщем-то, что не очень годится для первого знакомства и понятия сути и идеологии разработки. Также хочется сказать, что в статье не будет рассматриваться разработка сложного приложения, качество и возможности вашего AIR-приложения будут зависеть только от того, насколько хорошо вы знакомы с DHTML, Javascript, CSS, Flash, AJAX и прочими языками и технологиями, доступными для разработки на AIR. Скажу лишь, что хорошим учебником могут стать уже написанные приложения на AIR. Дело в том, что после инсталяции AIR-архив распаковывается в директорию с установленным приложением. И вам будут доступны некоторые файлы, из которых можно почерпнуть немало интересного. Также можно поискать в Интернете, благо статей на эту тему хватает, а с развитием технологии их будет становиться все больше и больше. Итак, приступим. Не будем нарушать традиции, нач-

№6, июнь 2008

Рисунок 2. Установка среды Adobe AIR

нем с банального «Hello World», так как нам надо понять суть создания приложений на AIR. Создаем в нашей директории проектов новую папку, назовем ее HiPeople (надоело писать «хелловорлд»). В директории вашего проекта структуру вы задаете сами, как считаете нужным. Если это простое приложение, то можно все скинуть в кучу. Если вы делаете сложное приложение, то лучше разделять файлы. Минимальное разделение можно сделать таким образом: создать для каждого типа файлов свои директории. Например, для нашего проекта в директории C:\AirProjects\ HiPeople создаем следующую иерархию: n air; n css; n js; n dhtml; n xml; n icons. Далее условимся, что корневой директорией проекта будем называть каталог C:\AirProjects\HiPeople\ для краткости. Чтобы среда AIR могла понять, что у нас за программа и как ее запускать, нужно создать так называемый файлдескриптор приложения. Это обычный XML-файл, в котором описываются основные свойства нашей будущей программы, например, такие как: название и автор ПО, размеры и свойства главного окна, иконки и многое другое. Без этого файла AIR-приложение работать не сможет. Итак, в корневом каталоге проекта создаем файл descriptor.xml. Содержимое файла приведено ниже: <?xml version="1.0" encoding="utf-8" standalone="no"?> <application xmlns="http://ns.adobe.com/air/application/1.0"> <id>majorsoft.ru.example.HiPeople</id> <filename>main</filename> <name>HiPeople!</name> <version>0.1</version> <description>MajoRSofT</description> <initialWindow> <content>index.html</content> <title/> <transparent>false</transparent> <visible>true</visible> <minimizable>true</minimizable> <maximizable>false</maximizable> <resizable>false</resizable> <width>600</width>

75


web <height>400</height> <x>200</x> <y>200</y> <minSize>400 200</minSize> <maxSize>1280 1024</maxSize> </initialWindow> <icon> <image16x16>icons/AIRApp_16.png</image16x16> <image32x32>icons/AIRApp_32.png</image32x32> <image48x48>icons/AIRApp_48.png</image48x48> <image128x128>icons/AIRApp_128.png ↵ </image128x128> </icon> </application>

Некоторые записи файла нуждаются в пояснении:

n Параметр id – должен принимать уникальное значение и не должен совпадать с другими приложениями. Для разделения имен используются точки. Можете взять на вооружение такую схему генерации имен: адрес_вашего_сайта.ru.класс_приложения.название_данного_ приложения. Тогда вы не запутаетесь в именах, и имя точно будет уникальным. Этот параметр обязательный. n Параметр filename – используется для создания директории установки на системе пользователя. Параметр обязательный. n Параметр version – служит для контроля версий. Обязательный параметр. n Параметр name – имя, отображаемое в инсталяторе при установке вашего приложения. Устанавливается опционально по вашему желанию. То есть его можно даже не писать, если не хотите. n Параметры description, title, copyright – говорят о своем предназначении сами за себя и не нуждаются в описании. Устанавливаются опционально. n Раздел initialWindow – настройки главного окна приложения. Обязательный раздел. Без него приложение работать не будет. Этот раздел содержит:  Параметр content – стартовая страница приложения. Обязательный параметр. Не будем нарушать традиции веб-разработчиков и назовем наш стартовый файл index.html. n Раздел icon – служит для описания доступных иконок приложения и устанавливается опционально. Если в вашем приложении нет иконок, то опустите этот раздел. Параметров намного больше, но о них вы можете прочесть самостоятельно в документации. Могу сказать еще про пару параметров, которые могут быть интересны, но не обязательны для установки. n Параметр installFolder – позволит вам установить директорию для установки по умолчанию. Этот путь высвечивается в инсталяторе при установке вашего AIRпакета. n Параметр programMenuFolder – позволяет задать директорию, которая высвечивается в «Start → Programs» в Windows. Параметр не обязателен и устанавливается только для ОС Windows. С дескриптором закончим. Перейдем к нашему файлу стартового окна index.html. <html><head> <link href="/css/main.css" rel="stylesheet" type="text/css"> <title>My first application</title>

76

<script type="text/javascript" ↵ src="/air/AIRAliases.js"></script> </head><body> <div class="class1">Hi, people!</div> </body></html>

Для примера хватит. В файле css/main.css , как вы поняли, я создал описание стилей моего приложения. Вдаваться в подробности по поводу CSS не вижу смысла. Теперь в директорию air нашего проекта скопируйте файл AIRAliases. js из директории, куда вы устанавливали SDK. Для примера у меня этот путь выглядит так: C:\AirSDK\frameworks. Это файл для создания псевдонимов AIR API, осуществляющий быстрый доступ к классам среды. Настал черед тестирования нашего приложения. Для этого нам понадобится утилита ADL. Она находится в папке bin в директории с SDK. Запускаете консоль и пишете команду: adl descriptor.xml

Так как пути не прописаны, то вам придется указывать полные пути до утилит и файлов. Вы можете прописать пути в переменные окружения вашей ОС (способ зависит от ОС), можете написать простейший сценарий для запуска вашего приложения на тест, чтобы каждый раз не писать весь путь руками в консоли. Для Windows это будет файл такого типа: @echo off C:\AirSDK\bin\adl.exe descriptor.xml pause

Положите этот файл в корневую директорию проекта, назовите run.cmd и запустите. Для пользователей Windows есть еще 1 способ. Достаточно перетащить мышкой ваш файл дескриптора на приложение adl.exe, и оно запустится, приняв в качестве аргумента ссылку на ваш файл дескриптор. После запуска вы увидите окно с заданными параметрами и нашей надписью. Теперь попробуем использовать Javascript в нашем приложении. Попробуем загрузить текстовый файл и вывести его содержимое. Добавьте в файл index.html следующие строки: <div> <div id="divLocalFile">Empty...</div> <input type="button" onclick="document.getElementById('divLocalFile'). ↵ innerHTML = readLocalFile('LocalFile.txt')" value="Load local file" > </div>

Потом добавьте в файл js/main.js код следующего содержания: function readLocalFile(name) { name || alert('Empty file name!');

var file = new air.File("app:/" + name); var content = '';

if (file.exists) { var fp = new air.FileStream(); fp.open(file, air.FileMode.READ); if (fp.bytesAvailable > 0)


web { content = fp.readUTFBytes ↵ (fp.bytesAvailable); } fp.close(); return content; } else { return "File " + name + " not exists!"; } }

Как видите, ничего сложного. Мы открываем файл, который должен находиться внутри нашего проекта, на что указывает app:/ в имени файла. После чего создается объект air.File, с информацией о нашем файле. Например, размер файла можно узнать, обратившись к свойству объекта size: alert(file.size). Таким образом только что было продемонстрировано, как можно работать с File/IO API, реализованном в AIR. Кстати, для отладки не обязательно использовать alert() как привыкли многие веб-разработчики. В AIR есть специальная функция для этих целей. Если вы хотите вывести на консоль отладочную информацию, то используйте air.trace(). Вывод будет осуществляться именно в консоль, а не в виде всплывающих окон. Также в комплекте есть специализированный инструмент для отладки приложений – интроинспектор. Эта консоль своего рода Firebug для Adobe AIR. Чтобы им воспользоваться, добавьте в директорию air нашего приложения файл AIRIntrospector.js из AIR SDK. В index.html добавьте строчку: <script type="text/javascript" ↵ src="/air/AIRIntrospector.js"></script>

Теперь, после запуска приложения, вы можете нажать клавишу <F12>, и будет запущен интроинспектор, который поможет вам отладить приложение. Вернёмся к нашему приложению. Как вы видели, для того, чтобы обратиться к файлу, который находится в директории с нашим приложением, надо добавить префикс app:/. Соответственно, если вам надо обратиться к файлу из другой директории, то укажите путь до нее вместо префикса app. Кстати, пути можно вычислять и другим способом. Например, нашу строчку: var file = new air.File("app:/" + name);

можно заменить следующей: var file = air.File.applicationDirectory.resolvePath(name);

Если вам надо взять файл с рабочего стола, к примеру, то можно это сделать так: var file = air.File.desktopDirectory.resolvePath(name);

Теперь давайте посмотрим, как осуществляется навигация. Все ваши ссылки на странице будут открываться внутри приложения. Если вы создадите файл test.html и сделаете ссылку на него, то страница будет открыта в этом же окне приложения. Если вы хотите открыть в новом AIR-окне,

№6, июнь 2008

то напишите в ссылке «target="_blank"». То есть схема поведения понятна, здесь все то же самое, что и в обычных браузерах. Но вот если вы хотите открыть ссылку именно в браузере пользователя, который у него стоит, то для этого можно написать небольшую Javascript-функцию. В файл js/main.js добавьте следующий код: function openUrlInStandartBrowser(url) { air.navigateToURL( new air.URLRequest(url) ); }

В файле index.html для проверки функции достаточно написать: <a href="#" onclick="openUrlInStandartBrowser ↵ ('http://majorsoft.ru/')">Open link in browser</a>

Рассказывать про то, как отсылать файлы на сервер посредством XMLHttpRequest() не буду, так как по этой теме вы точно найдете документацию. Лучше расскажу, как отправить файлы на сервер средствами AIR, и не просто, а через механизм «Drag & Drop». Итак, для начала напишем функцию инициализатор: var target = null; function init() { target = document.getElementById('target'); target.addEventListener("dragover", dragOver); target.addEventListener("drop", dropHandler); }

Добавьте эти строки в файл main.js. В файле index.html надо добавить вызов загрузчика: <body onLoad="init()">

и создать слой, который будет принимать «Drag&Drop» сообщения: <div id="target" style="border:1px solid ↵ #ccc;height:100px">Drag & Drop</div>

Что мы сделали? В функции init() мы повесили на слой с id = target обработчики «Drag&Drop» сообщений. Теперь их надо описать. Добавляем в main.js: function dragOver(event) { event.preventDefault(); } function onComplete(event) { target.innerHTML = ↵ "UploadComplete!"; } function dropHandler(event) { var request = new air.URLRequest ↵ ("http://majorsoft.ru/air_test_upload.php"); request.method = air.URLRequestMethod.POST; var files = event.dataTransfer.getData ↵ ("application/x-vnd.adobe.air.file-list"); for (i in files) { files[i].addEventListener ↵ (air.Event.COMPLETE, onComplete); files[i].upload(request, "uploadedFile"); // Вывод сообщений в консоль для контроля работы. // В финальной версии эта строка не нужна air.trace("File " + files[i].name + " is upload..."); } }

Все. Как написать скрипт-обработчик на том же PHP, думаю, рассказывать нет смысла. Речь идет не об этом. Те-

77


web не указан. Генерация сертификата осуществляется следующим образом: C:\AirSDK\bin\adt -certificate -cn SelfSigned -ou Dev ↵ -o "HiPeople" -c US 2048-RSA MyCert.pfx 123

Последний параметр «123» в данной строке – это ваш пароль. Он пригодится при создании AIR-архива. Пароль вы задаете сами. Мне для теста проще было написать «123». После того как выполните команду, должен быть сгенерирован файл MyCert.pfx, который и является нашим сертификатом для подписи приложения. Далее приступаем к созданию установочного пакета: C:\AirSDK\bin\adt -package -storetype pkcs12 ↵ -keystore MyCert.pfx HiPeople.air descriptor.xml ↵ index.html js/main.js css/main.css ↵ air/AIRAliases.js LocalFile.txt icons/*.pn Рисунок 3. Окно инсталлятора AIR-пакета

перь перетащите любые файлы в «Drag&Drop» область нашего приложения и они будут загружены на сервер. На этом хочу завершить вводный курс в программирование AIR-приложений. Для старта вполне хватит.

Сборка приложения После того как было написано и оттестировано приложение, его следует упаковать в AIR-контейнер, доступный для распространения. Делается это с помощью утилиты ADT из AIR SDK. Для работы ADT необходимо установить Java runtime (http://www.java.com/ru/download/index.jsp). AIR-контейнер должен быть подписан сертификатом. Таким образом проверяется подлинность AIR-приложения. Сертификаты известных разработчиков – это гарант качества приложения. Для тестирования можно использовать сертификат, который можно сгенерировать самостоятельно. Для продажи можно купить сертификаты, которые выдают, например, VerySign или Thawte. В нашем случае, когда пользователь устанавливает приложение, он видит, что «издатель»

Рисунок 4. Finetune-клиент

78

Мы перечисляем все файлы, которые обязательно идут в AIR-пакет. Будет запрошен ваш пароль, который вы писали при генерации сертификата. После этого на выходе получаем файл HiPeople.air весом до 40 Кб. Этот пакет мы и можем распространять и запускать на разных платформах. После установки на рабочем столе появится иконка нашего приложения, которая и позволит его запускать (см. рис. 3).

Обзор AIR-приложений На официальном сайте Adobe предлагаются готовые AIR-приложения (http://www.adobe.com/cfusion/exchange/ index.cfm?event=productHome&exc=24&loc=en_us). По некоторым из них я сделаю краткий обзор, дабы вы имели более полное представление о рассматриваемой технологии. Итак, первым в нашем импровизированном хит-параде идет программа WebKut (http://toki-woki.net/p/WebKut). Это простое, но от того не менее интересное AIR-приложение. С помощью WebKut вы сможете делать снимки вебстраниц или их частей буквально за секунду. Есть три возможности захвата скриншота: страница целиком, текущий вид или по выбору пользователя. Приложение очень удобное. Twhirl (http://www.twhirl.org) – интересная реализация клиента для популярного сервиса Twitter. Twhirl переносит любимый сервис на ваш рабочий стол, и больше не нужно постоянно обновлять страницу с твитами – за вас это делает приложение (см. рис. 5). ColorBrowser (http://code.google.com/p/colorbrowser) – удобный инструмент для работы с цветом. Есть возможность создавать шаблоны любимых цветов, а также наборы палитр. Полезный инструмент, пригодится дизайнерам. Клиент для музыкальной библиотеки Finetune (http:// finetune.com), расширяющий возможности сервиса с помощью AIR. Сервис представляет собой что-то среднее между настраиваемым радио и сервисом поиска музыкального контента. Напечатав название исполнителя, вы можете не только прослушать его композиции, но и получить список треков, которые подберет вам система рекомендаций. Есть возможность создания собственных списков проигрывания. Сервис предлагает возможность находить треки из музы-


web кальной библиотеки и на их основе создавать плей-листы (см. рис. 4). AOL Top 100 Videos (http://music.aol. com/help/syndication/desktop-widgets) – представляет собой небольшое AIRприложение с расширенными возможностями просмотра музыкальных клипов и текстового контента. Расширенные возможности ограничиваются просмотром видеоклипов в стандартном и полноэкранном режимах. Кроме того, можно поставить закладку понравившегося клипа и вернуться к его просмотру в любой момент.

Стоит ли овчинка выделки? Что ж, пришла пора разобраться, что мы делали и стоит ли это того. Сказать, что технология от Adobe так уж нова, не могу. Дело в том, что в Windows что-то подобное было уже давно, только выполнялось все это не в отдельной среде исполнения и работало только на ОС Windows. Я говорю про специальный браузер, который обрабатывал файлы с расширением HTA. Этот браузер очень напоминает браузер от Adobe AIR. Правда, его не надо было дополнительно устанавливать, в отличие от AIR. Там также описывалось приложение через XML. В качестве языка программирования использовалась технология WSH (Windows Script Host), позволяющая работать с XML + JScript + VBScript. Ваш покорный слуга в далеком двухтысячном году даже писал приложение, очень напоминающее стандартный WordPad и умеющий редактировать локальные файлы пользователя. По внешнему виду приложение также очень смахивало на нативное ПО. Для его распространения использовались самораспаковывающиеся архивы SFX. Adobe AIR чем-то напоминает вышеописанный подход к созданию приложений, но более в масштабном варианте, да к тому же с использованием более развитых технологий. По этой причине я и не могу сказать, что Adobe AIR – это действительно инновационная технология. Необходима ли данная платформа? Это спорный вопрос. Да, Adobe AIR действительно позволяет стирать грани между веб-приложениями и настольными программами. Используя возможности, предоставляемые DHTML, CSS, SWF, JS и т. д. Веб-ин-

№6, июнь 2008

терфейс можно оформить в стиле нативных программ. Однако следует понимать, что веб-интерфейс как клиентская часть веб-приложения будет существенно уступать по производительности и по возможностям обычным настольным приложениям, написанным с использованием компилируемых языков программирования, таких как C++ или Java. Набор инструментов, используемый при проектировании веб-интерфейсов, изначально для этого не предназначался. Платформа AIR действительно расширяет спектр возможностей, доступных веб-разработчику. Но практически единственный аргумент, подтверждающий полезность Adobe Air, состоит в том, что не нужно разрабатывать два приложения, для веба и для десктопа, достаточно разработать одно. Однако ясно, что технологии, используемые в Adobe AIR, изначально не предназначались для проектирования десктопных приложений, поэтому создавать их будет непросто, да и по возможностям они будут уступать традиционным программам. Более того, код для клиентской настольной части и для серверной все равно будет отличаться, так что говорить, что Adobe AIR – это панацея от написания лишнего кода, никак нельзя. Я считаю, что если есть надобность в написании кроссплатформенных приложений, то надо смотреть в сторону Java или С++ с использованием кроссплатформенных библиотек. А если учесть, что сейчас идет бурное развитие мобильных устройств и все больше становится пользователей Всемирной паутины, то тогда Adobe должен начать выпускать AIR для мобильных платформ, а это, увы, с использованием текущих инструментов будет очень затруднительным. Да и скорость таких приложений будет оставлять желать лучшего. Но это мое мнение. Стоит ли осваивать эту технологию – решать вам и только вам. То, что стоит хотя бы посмотреть и опробовать, – это бесспорно! Особенно веб-разработчикам. Также эта технология может возыметь и обратный эффект. Вроде бы делалось все для того, чтобы облегчить труд, но из-за ограниченности возможностей может возникнуть ситуация, что, чтобы решить задачу средствами AIR, надо будет писать много «косты-

Рисунок 5. Twitter-клиент на AIR

лей», в то время как на Java или C++ это решалось бы без проблем. А вообще, конечно, неплохая идея. И эта технология имеет право на жизнь. Более того, может, через несколько лет программирование на AIR станет такой же обыденностью, как и использование AJAX в нынешних веб-сервисах. Поживем – увидим. Уже сейчас написано достаточное количество программ для Adobe Air, позволяющее оценить технологию во всей красе (http://airapps.pbwiki.com/ FrontPage). В Linux-версии среды AIR на данный момент работают не все приложения. Список поддерживаемого ПО в GNU/Linux можно взять здесь: http://labs.adobe.com/technologies/air/ samples. Альфа-тестирование Adobe AIR для GNU/Linux должно закончиться 1 марта 2009 года. Выход финальной версии для всех заявленных платформ ожидается во второй половине 2009 года. 1. Статья про создание AIR-приложений в Aptana Studio – http://extjs.com/ blog/2007/06/29/building-a-desktopapplication-with-ext-air-aptana-and-redbull. 2. Цикл статей о программировании на Adobe AIR + ExtJS – http://dev.aol.com/ blog/bricemason/adobe-air-xdrive-picturesyncing-part-1. 3. Документация по Adobe AIR – http:// www.adobe.com/devnet/air/ajax/getting_ started.html. 4. С тат ья, д е м о н с т р и ру ю щ а я р аб о ту с AdobeAIR + Flex+ SQLite – http:// lifeflex.shaggysmile.com/air/flex_to_air_ migration.html.

79


web

PHP-GTK – вторая попытка Кирилл Сухов В день, который впоследствии будет затруднительно отмечать, а именно 29 февраля этого года, после нескольких лет разработки и тестирования, общественности был представлен новый релиз – пакет PHP-GTK2. Данный продукт представляет собой интерфейс PHP для работы с библиотекой GTK2 и предназначен для построения на данном языке, применяющемся преимущественно для веб-программирования, полноценных настольных оконных приложений.

Предыстория PHP-GTK (http://gtk.php.net), пакет для написания на PHP настольных GUI‑приложений появился на свет благодаря Андрею Змиевски (Andrei Zmievski), одному из основателей Zend inc. Андрея вдохновило появление пакетов PyGtk и GTK-Perl, и он решил попробовать сделать средства для работы с GTK+ на PHP. Заручившись поддержкой создателя PyGtk (инструмента для работы с Gtk+ на языке Python) Джеймса Хестриджа (James Henstridge), он начал работу. Чуть позже к ней присоединился программист Фрэнки Крованни (Frank'у Kromann'у). Первый релиз PHPGTK был представлен общественности 1 марта 2003 года. Проект зажил самостоятельной жизнью с собственным сайтом и CVS-репозитарием. Казалось бы всё было отлично – тысячи разработчиков получили в свои руки кроссплатформенный инструмент для разработки оконных приложений на PHP, но всё оказалось не так просто. Большинство программистов встретили этот продукт не с распростёртыми объятиями. Самый главный вопрос, который возникал, был «Зачем?» В самом деле, зачем нужен подобный инструментарий, когда настольные приложения можно писать на Си + Gtk или на MSVC++? Преимущества использования скриптового языка оценены не были, и широкого распространения технология не получила. Довольно долго о проекте мало что было слышно. Нет, редкие новости на сайте появлялись, было видно, что работа ведётся, но и только. И вот теперь у нас есть PHP-GTK 2. Какие новые возможности он нам даёт? В чём его отличия от предшественника? Сложится ли судьба этой версии удачней? Чтобы попытаться ответить на эти вопросы, предлагаю установить новинку и опробовать её в деле.

Установка Прежде всего следует обратить внимание на то, что PHPGTK2 работает с версией PHP-интерпретатора не ниже 5.1. Впрочем это не особенно важно, так как установка в большинстве случаев предполагает собственный экземпляр интерпретатора. Пакет доступен для платформ Windows, MacOS, Linux и (как сказано в документации) может быть установлен на большинство POSIX-совместимых операционных систем. Сначала попробуем установить этот пакет на операционную систему Linux (был использован дистрибутив OpenSUSE 10.3).

80

Сразу неважные новости – никаких скомпилированных бинарных пакетов пока недоступно, и ставить пакет придётся по старинке – из исходных текстов. Необходимо выбрать вариант установки – PHP-GTK2 предполагает два способа инсталляции – с использованием уже существующего PHP интерпретатора и отдельную, автономную установку с собственным интерпретатором. Второй способ рекомендован для неопытных пользователей, но мне кажется, он предпочтителен в любом случае, так как не только снимает требования по версиям PHP и GTK+ (2.6 на всякий случай), но и поможет избежать путаницы в конфигурациях. Итак, приступим: $ cvs -d :pserver:cvsread@cvs.php.net:/repository login $ cvs -d :pserver:cvsread@cvs.php.net:/repository co ↵ -r PHP_5_2 php-src

Таким образом, мы получили свежий PHP из репозитория. Теперь собираем и устанавливаем интерпретатор: $ cd php-src $ ./buildconf $ ./configure --prefix=/opt/php5_2 —disable-cgi

Всё получилось? Лично у меня не совсем (не угодил версией flex), но это привычные неприятности, будем надеяться, что скоро всё будет доступно из пакетов, а пока движемся дальше: $ $ $ $ $

make su make install echo extension=php_gtk2.so >> /opt/php5_2/lib/php.ini /opt/php5_2/bin/php-config --extension-dir | xargs ↵ echo 'extension_dir=' >> /opt/php5_2/lib/php.ini

Впрочем, строго говоря, мы проделали несколько больше работы, чем требуется, так как интерпретатор php можно было взять готовый, со страницы проекта. Но теперь от ручной работы не отвертеться – собираем сам пакет php‑gtk: $ $ $ $ $ $ $

cd .. cvs -d :pserver:cvsread@cvs.php.net:/repository co php-gtk cd php-gtk ./buildconf --with-phpize=/opt/php5_2/bin/phpize ./configure --with-php-config=/opt/php5_2/bin/php-config make make install

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


web $ ln -s /opt/php5_2/bin/php /usr/bin/php-gtk

И добавить одну строчку в конфигурационный файл php.ini:

$lblHello = new GtkLabel("Yes!\r\n'Hello php-gtk2!'"); $wnd->add($lblHello); $wnd->show_all(); Gtk::main(); ?>

extension=php_gtk2.so

Теперь запускаем наше приложение командой:

А теперь небольшая проверка:

$ php test.phpw

$ ln -s /opt/php5_2/bin/php /usr/bin/php-gtk linux-nsv7:/home/geol/Documents # /opt/php5_2/bin/php -m [PHP Modules] ctype date dom filter hash iconv json libxml pcre PDO pdo_sqlite php-gtk ...

Что и требовалось доказать – расширение php-gtk установлено. Под Windows всё гораздо проще – нужно скачать бинарный пакет, расположенный на http://gtk.php.net/download.php, и распаковать zip-архив в нужную директорию. В директорию php-gtk, образовавшуюся после распоковки архива, следует скопировать файлы php.exe (CLI-версия) и php5ts.dll, а также dll-файлы расширений PHP, которые планируется использовать. Теперь в системную переменную PATH, нужно добавить путь до php-gtk, и пакет готов к использованию. Впрочем, есть ещё более простой путь – использовать менеджер Gnope (http://gnope.org). Всё что тут требуется – скачать, запустить инсталлятор и следовать появляющимся инструкциям. После нескольких кликов мышкой мы получим полностью работоспособные PHP 5.1, GTK 2.6 и пакет PEAR.

Если всё прошло гладко, должен быть виден результат, аналогичный показанному на рис. 1. Теперь давайте разберёмся, как нам это удалось. Как видите, в первых строчках скрипта осуществляется проверка на существование загруженного модуля php‑gtk2, далее командой: $wnd = new GtkWindow();

создаётся новый объект – виджет, экземпляр класса окна. Пользователи первой верси php-gtk, наверное, обратят внимание на отсутствие амперсанда перед ключевым словом new. Всё верно – времена объектной модели PHP 4 прошли. Теперь задаём свойства окна: $wnd->set_title('php-gtk2'); //заголовок $wnd->set_default_size(200,300); //размер

Устанавливаем стильную иконку (стандартный набор представлений тулбар-иконок доступен в документации – http://gtk.php.net/manual/en/gtk.enum.stockitems.php): $pixbuf = $wnd->render_icon( Gtk::STOCK_EXECUTE, Gtk::ICON_SIZE_DIALOG ); $wnd->set_icon($pixbuf);

Далее позаботимся о корректном закрытии окна: $wnd->connect_simple('destroy', array('gtk', 'main_quit'));

В данном случае мы связываем сигнал destroy с обратным (callback) вызовом статического метода Gtk::main_quit, который будет применен при закрытии/уничтожении окна. Хеллоувордим Надо хорошо понимать, что в отличие от обычных PHPТеперь попробуем сваять небольшое демонстрационное скриптов, по завершении которых, как известно, интерпреприложение. Пока не будем отступать от канона и созда- татор завершает работу и осводим окошко, используя конструкции, несильно выходящие бождает память, здесь прилоза рамки первой версии пакета. жение продолжает выполняться. Сохраняем следующий код в файл test.phpw: Для завершения его работы мы использовали специальный сиг<?php нал, с которым связали обработif (!class_exists('gtk')) { чик обратного вызова. Если бы die("Please load the php-gtk2 module in your ↵ php.ini\r\n"); мы этого не сделали, завершить } работу приложения штатными $wnd = new GtkWindow(); средствами было бы нельзя. $wnd->set_title('hello php-gtk2'); Теперь, наверное, стоит ос$wnd->set_default_size(200,300); тановиться и коротко пояснить, о каких виджетах и сигна$pixbuf = $wnd->render_icon( Gtk::STOCK_EXECUTE, лах я говорю. Впрочем, если вы Gtk::ICON_SIZE_DIALOG уже работали с gtk, эти терми); Рисунок 1. $wnd->set_icon($pixbuf); ны должны быть вам знакомы, Здравствуйте, $wnd->connect_simple('destroy', array('gtk', 'main_quit')); в противном случае, поясняю: здравствуйте...

№6, июнь 2008

81


web n Виджет – любой компонент графического интерфей- лее одного потомка (при этом, являясь виджетом верхнего са, будь то главное окно программы, окно диалога, поле ввода или кнопка. n Контейнер – любой виджет, способный содержать в себе другие виджеты. n Сигнал – сообщение, создаваемое виджетом. Если вы никогда не сталкивались с механизмом сообщений, то ближайшим, (правда, грубым) аналогом будет механизм событий в JavaScript (onmousemove, onclick и т. д.). Действительно, некоторые сообщения довольно схожи – например при щелчке левой кнопки мыши на область, занимаемую виджетом, им генерируется сигнал «clickid» и т. д. Для обработки сигналов используются функции обратного вызова. Строчками: $lblHello = new GtkLabel("Yes!\n'Hello php-gtk2!"); $wnd->add($lblHello);

создается и добавляется в окно новый виджет – ярлык (label), с заданным текстом. Пока показом этого текста функционал нашего приложения и будет ограничен, посему осталось только сделать наше приложение видимым: $wnd->show_all();

Специально уточню, для пользователей первой версии пакета: в php-gtk2 метод show() тоже присутствует, но он сделает видимым только само окно приложения, без (в данном случае) ярлыка. Теперь запускаем приложение: Gtk::main();

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

Добавляем функциональность

уровня, сам этот объект ничьим потомком выступать не может). Несмотря на предупреждение, сценарий будет выполнен, но никакой кнопки в окне приложения мы не увидим. Выход заключается в использовании тегов контейнеров – GtkHBox или GtkVBox (разница между ними в ориентации компоновки): $wnd->set_icon($pixbuf); $wnd->connect_simple('destroy', array('gtk', 'main_quit')); $box = new GtkVBox(); $box->set_spacing(4); // Добавляем кнопку $button = new GtkButton('press me'); $button->set_relief(Gtk::RELIEF_HALF); // Добавляем надпись $lbl = new GtkLabel(date('Y-m-d h:i:s')); // Пакуем $box->pack_start($button, false,true,10); $box->pack_start($lbl, true, true); // Помещаем бокс в окно $wnd->add($box);

Командами pack_start() и/или pack_end() мы компонуем виджеты в контейнере-боксе, а его, в свою очередь, добавляем в основное окно программы. Теперь привяжем к кнопке желаемое исполняемое действие. Сначала напишем функцию, принимающую ссылку на объект окно, как параметр: function foo(GtkLabel $lbl){ $lbl->set_text(date('Y-m-d h:i:s')); }

теперь свяжем сигнал «clicked» кнопки с этой функцией уже знакомым оператором: $button->connect_simple('clicked', 'foo',$ll);

Как видите, третьим параметром является аргумент функции – ссылка на объект типа GtkLabel. Если бы пришлось передавать несколько аргументов, их следовало бы упаковать в массив. Если всё сделано правильно, после запуска скрипта мы можем насладиться результатом. (см. рис. 2).

Для демонстрации работы сигналов отяготим наше приложение работой – пусть при нажатии специальной кнопки в окошке будут показываться дата и время. Отличия В первую очередь добавим в окно программы ещё один Теперь самое время посмотреть, что же изменилось в PHPвиджет – эту самую кнопку: GTK по сравнению с первой версией. Разработчики заяв$button = new GtkButton('press me'); ляют, что постарались сделать $button->set_relief(Gtk::RELIEF_HALF); продукт максимально обратМетоды и свойства нового объекта подробно освещены но совместимым, но они же зав руководстве по php-gtk 2 (http://gtk.php.net/docs.php), озна- являют, что удалось это далекомиться труда не составляет, проблема в другом. При до- ко не во всем. Логично: если бы не было такой платы за пробавлении кнопки к основному окну: гресс, не было бы и прогресса. $wnd->add($button); К главному отличию в работе с новой версии пакета сам PHPскрипт даёт следующее сообщение об ошибке: GTK имеет косвенное отношение. Дело в новой объектной моGtk-WARNING **: Attempting to add a widget with type GtkButton to дели, появившейся в пятой верa GtkWindow, but as a GtkBin subclass a GtkWindow can only contain one widget at a time; it already contains a widget сии PHP. Теперь нет необходиof type GtkLabel Рисунок 2. Создали мости для передачи по ссылке нечто полезное... Ничего удивительного, GtkWindow не может иметь бо- на объект использовать амперну почти

82


web санд (&) и конструкции, которые в PHP-GTK1/PHP4 приводили к созданию копий, теперь нормально работают с экземплярами класса. В примере выше это уже было продемонстрировано. Вместе с PHP-GTK1 ушли в прошлое некоторые виджеты и методы. Рассмотрим таблицу с эквивалентами устаревших элементов в PHP-GTK 2. В документации также присутствует список устаревших методов, причём состоит он всего из одного элемента – вместо метода set_policy() теперь следует употреблять set_resizable. Впрочем, не стоит особенно обольщаться – там же указано, что таких методов (да и виджетов) потенциально может быть больше, просто не всё ещё задокументировано. Надеюсь, это будет исправлено в ближайшее время, а мы двигаемся дальше. Теперь пришло время создать что‑нибудь по-настоящему полезное.

Создаем кроссплатформенное приложение за 20 минут Сейчас мы создадим простую программу-ежедневник. Она должна будет включать календарь, поле для ввода записей, возможность их просмотра и удаления. При изучении руководства по PHP-GTK 2, можно обнаружить, что все компоненты, необходимые для создания графического пользовательского интерфейса такого приложения, уже присутствуют в пакете. Посему незамедлительно приступим. Прежде всего создадим главное окно: $window = new GtkWindow(); $window->set_title("GtkHBox and GtkVBox packing ↵ demonstration"); $window->set_position(Gtk::WIN_POS_CENTER); $window->connect_simple("destroy", array("gtk", ↵ "main_quit")); $window->set_default_size(400,400) ; $window->show();

Завершение программы – запуск жизненного цикла приложения: $window->show_all(); Gtk::main();

Строго говоря, пока метод show_all() тут не нужен, но сейчас мы обеспечим его работой. Сначала позаботимся о потомке окна (который, как мы помним, может быть только один): $vbox = new GtkVBox(false, 5); $window->add($vbox);

Теперь создадим и поместим в получившийся бокс необходимые нам элементы. Сначала ярлык: $label = new GtkLabel(); $label->set_text("My daily"); $label->set_justify(Gtk::JUSTIFY_LEFT); $vbox->pack_start($label, true, true, 5);

Далее создаём панель с кнопками – тут понадобится ещё один контейнер – объект GtkHButtonBox(): $hbbox = new GtkHButtonBox(); $hbbox->set_layout(Gtk::BUTTONBOX_SPREAD); $hbbox->set_spacing(15);

№6, июнь 2008

Эквиваленты устаревших элементов в PHP-GTK 2 Устаревший виджет

Замена

GtkCTree

GtkTreeView/GtkTreeStore

GtkCList и GtkList

GtkTreeView/GtkListStore

GtkCombo и GtkOptionMenu

GtkComboBox/GtkTreeModel

GtkItemFactory

GtkUIManager

GtkOldEditable

GtkEditable

GtkPixmap and GtkPreview

GtkImage/GdkPixbuf

GtkText

GtkTextView/GtkTextBuffer

Тут мы создали панель, задали стиль расположения кнопок и расстояние между ними. Теперь сами кнопки: $button1 = new GtkButton('Exit'); $button2 = new GtkButton('Add'); $button3 = new GtkButton('Clean');

Затем упаковываем их в tkHButtonBox, а его, в свою очередь, в основной контейнер приложения: $hbbox->add($button1) $hbbox->add($button2); $hbbox->add($button3); $vbox->pack_end($hbbox);

Продолжаем творить GUI. Познакомимся ещё с одним контейнером GtkHPaned. Он будет группировать элементы в нижней части наружного бокса: $vpane = new GtkHPaned(); $vpane->set_border_width(5); $vbox->pack_end($vpane);

Теперь создадим Календарь (элемент GtkCalendar()) и разместим его в левой части панели: $left = new GtkFrame(); $day=new GtkCalendar(); $left->add($day); $left->set_shadow_type(Gtk::SHADOW_IN); $vpane->add1($left);

С правой частью панели несколько сложнее. Следует подготовить её содержимое заранее. Сначала создаём текстовый буфер – объект для хранения и редактирования текста: $textBuffer = new GtkTextBuffer(); $textBuffer->set_text(date('Y-m-d h:i:s'));

Ещё один объект – GtkTextView() необходим для показа текстового буфера: $text = new GtkTextView(); $text->set_buffer($textBuffer);

В первой версии нашей программы не будем предоставлять возможность редактировать записи (чтобы уложиться в оговоренные 20 минут): $text->set_editable(false);

Теперь поле ввода записи. Тут подойдёт объект GtkEntry, представляющий собой однострочное поле ввода: $entry= new GtkEntry();

83


web function get_file_name(GtkCalendar $d){ $data=$d->get_date(); return join('-',$data); }

Необходимо отметить, что с функциями можно обращаться как угодно, в рамках привычного PHP-кода, за исключением одного – при использовании объектов в качестве параметров необходимо указывать их тип. Далее реализуем функцию добавления записи, с которой свяжем сигнал clicked кнопки «Add»: $button2->connect_simple('clicked', "add_note", ↵ $day,$entry, $textBuffer);

И тело функции: function add_note(GtkCalendar $d,GtkEntry ↵ $entry,GtkTextBuffer $bf){

Рисунок 3. Ежедневник. Пока примитивный, но уже вполне рабочий

Чтобы всё скомпоновать в правой части панели, сделаем ещё один контейнер и всё соберём: $r_vbox = new GtkVBox(false, 5); $r_vbox->pack_end($entry); $r_vbox->pack_end($text); $right = new GtkFrame(); $right->add($r_vbox); $right->set_shadow_type(Gtk::SHADOW_IN); $vpane->add2($right);

С интерфейсом всё. При запуске программы должно появляться окно, изображённое на рис. 3. Теперь определим функции нашего GUI-приложения и свяжем необходимые сигналы виджетов с их реализацией. Итак, при выборе даты на календаре должна открываться запись, соответствующая этой дате (если таковая существует). Связываем сигнал и функцию: $day->connect_simple('day-selected', 'get_day', $day, ↵ $textBuffer);

В данном случае day-selected – сигнал объек та GtkCalendar, возникающий при выборе текущей даты, объекты $day и $textBuffer выступают в роли параметров функции get_day(), которую мы сейчас и напишем: function get_day(GtkCalendar $d,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(file_exists('text/'.$f_name)){ $content=file_get_contents('text/'.$f_name); } else{ $content='No notes'; } $bf->set_text($content); }

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

84

$f_name=get_file_name($d); if(!is_file('text/'.$f_name)){ file_put_contents('text/'.$f_name, $entry->get_text()); }else{ $fd=fopen('text/'.$f_name,'a+'); fwrite($fd,"\n".$entry->get_text()); fclose($fd); } $content=file_get_contents('text/'.$f_name); $bf->set_text($content); }

Кнопка «Clean» должна при нажатии уничтожать все записи. Это реализовать еще легче. Связывание: $button3->connect_simple('clicked', "clean_note", $day, ↵ $textBuffer);

и реализация: function clean_note(GtkCalendar $d,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(is_file('text/'.$f_name)){ unlink('text/'.$f_name) ; } $bf->set_text('No notes'); }

Всё? Нет, мы забыли про кнопку «Exit». Тут просто: $button1->connect_simple('clicked', array("gtk", ↵ "main_quit"));

Вот и всё! Кроссплатформенное, вполне функциональное приложение работает! Правда, там есть ещё над чем потрудиться, это касается как внешнего вида, так и функциональности, но это я предлагаю выполнить самостоятельно. Полный код приложения приведён ниже: <?php // Создаём дирректорию для текстовых файлов if(!is_dir("text")){ mkdir("/text", 0700); } // Снабжаем файл именем, соответствующим дате function get_file_name(GtkCalendar $d){ $data=$d->get_date(); return join('-',$data); }


web // Получаем запись из файла и помещаем её на текстовое поле function get_day(GtkCalendar $d,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(file_exists('text/'.$f_name)){ $content=file_get_contents('text/'.$f_name); }else{ $content='No notes'; } $bf->set_text($content); }

$text->set_editable(true); $entry= new GtkEntry(); $right = new GtkFrame(); $r_vbox = new GtkVBox(false, 5); $r_vbox->pack_end($entry); $r_vbox->pack_end($text); $right->add($r_vbox); //$right->add($text); $right->set_shadow_type(Gtk::SHADOW_IN); $vpane->add2($right);

// Добавляем запись function add_note(GtkCalendar $d,GtkEntry ↵ $entry,GtkTextBuffer $bf){

$vbox->pack_end($vpane); $button1->connect_simple('clicked', array("gtk", ↵ "main_quit")); $button2->connect_simple('clicked', "add_note", ↵ $day,$entry, $textBuffer); $button3->connect_simple('clicked', "clean_note", ↵ $day, $textBuffer); $day->connect_simple('day-selected', 'get_day', ↵ $day, $textBuffer);

$f_name=get_file_name($d); if(!is_file('text/'.$f_name)){ file_put_contents('text/'.$f_name, $entry->get_text()); }else{ $fd=fopen('text/'.$f_name,'a+'); fwrite($fd,"\n".$entry->get_text()); fclose($fd); } $content=file_get_contents('text/'.$f_name); $bf->set_text($content); } // Уничтожаем запись function clean_note(GtkCalendar $d,GtkTextBuffer $bf){ $f_name=get_file_name($d); if(is_file('text/'.$f_name)){ unlink('text/'.$f_name) ; } $bf->set_text('No notes'); } $window = new GtkWindow(); $window->set_title("GtkHBox and GtkVBox packing demonstration"); $window->set_position(Gtk::WIN_POS_CENTER); $window->connect_simple("destroy", array("gtk", ↵ "main_quit")); $window->set_default_size(400,400) ; $window->show(); $vbox = new GtkVBox(false, 5); $window->add($vbox); $label = new GtkLabel(); $label->set_text("My daily"); $label->set_justify(Gtk::JUSTIFY_LEFT); $vbox->pack_start($label, true, true, 5); $label->show(); $hbbox = new GtkHButtonBox(); $hbbox->set_layout(Gtk::BUTTONBOX_SPREAD); $hbbox->set_spacing(15); $button1 = new GtkButton('Exit'); $button2 = new GtkButton('Add'); $button3 = new GtkButton('Clean'); $hbbox->add($button1); $hbbox->add($button2); $hbbox->add($button3); $vbox->pack_end($hbbox); $vpane = new GtkHPaned(); $vpane->set_border_width(5); $left = new GtkFrame(); $day=new GtkCalendar(); $left->add($day); $left->set_shadow_type(Gtk::SHADOW_IN); $vpane->add1($left); $textBuffer = new GtkTextBuffer(); $textBuffer->set_text(date('Y-m-d h:i:s')); $text = new GtkTextView(); $text->set_buffer($textBuffer);

№6, июнь 2008

$window->show_all(); Gtk::main(); ?>

Работа приложения показана на рис. 3. Для иллюстрации использования других, более «продвинутых», виджетов приведу код, ставший впоследствии основой для довольно функциональной системы управления заданиями, применяемой у нас в компании. В данном случае показано дерево групп задач, распределённых по различным отделам IT-департамента. Пояснения даны в комментариях к коду: <?php // Создаём горизонтальное меню $mbar = new GtkMenuBar(); // Добавляем пункт горизонтального меню $file = new GtkMenuItem('_File'); // Добавляем подменю $fmenu = new GtkMenu(); $file->set_submenu($fmenu); $mbar->add($file); $view = new GtkMenuItem('_View'); $vmenu = new GtkMenu(); $view->set_submenu($vmenu); $mbar->add($view); $edit = new GtkMenuItem('_Edit'); $emenu = new GtkMenu(); $edit->set_submenu($emenu); $mbar->add($edit); $mode = new GtkMenuItem('_Status'); $mmenu = new GtkMenu(); $mode->set_submenu($mmenu); $mbar->add($mode); // Теперь создаём пункты подменю для каждого пункта // в особо тяжких случаях разделяем пункты сепараторами // меню «File» $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_NEW)); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_OPEN)); $fmenu->add(new GtkSeparatorMenuItem()); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_SAVE)); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_SAVE_AS)); $fmenu->add(new GtkSeparatorMenuItem()); $fmenu->add(new GtkImageMenuItem(Gtk::STOCK_QUIT)); // Меню вид $vmenu->add(new GtkImageMenuItem ↵ (Gtk::STOCK_SORT_ASCENDING)); $vmenu->add(new GtkImageMenuItem(Gtk::STOCK_ZOOM_FIT));

85


web // Меню редактирования $emenu->add(new GtkImageMenuItem(Gtk::STOCK_COPY)); $emenu->add(new GtkImageMenuItem(Gtk::STOCK_CUT)); $emenu->add(new GtkImageMenuItem(Gtk::STOCK_PASTE)); // Меню статуса $mmenu->add(new GtkImageMenuItem(Gtk::STOCK_APPLY)); $mmenu->add(new GtkImageMenuItem(Gtk::STOCK_CONVERT)); $vbox = new GtkVBox(); $vbox->pack_start($mbar,false); // Создаём окно $wnd = new GtkWindow(); $wnd->connect_simple('destroy', array('gtk', 'main_quit')); $wnd->set_default_size(400,200); // Создаём древовидную структуру $store = new GtkTreeStore(64, 32); // Создаём «ветви» первого уровня (первый параметр// идентификатор родительского элемента. В данном случае // равен NULL) $support = $store->append(null, ↵ array('Support servise', 1)); $www = $store->append(null, array('Internet', 2)); $c1 = $store->append(null, array('1C', 1)); // Создаём дочерние элементы $store->append($c1, array('Stuff', 8)); $store->append($www, array('Site', 2)); $store->append($www, array('Ithernet', 12)); $store->append($support, array('Workstantions', 4)); // Создаём отображение дерева $tview = new GtkTreeView($store); $tview->set_enable_tree_lines(enabled); $cell_renderer = new GtkCellRendererText(); // Добавляем заголовки $tview->append_column(new GtkTreeViewColumn ↵ ('Department', $cell_renderer, 'text', 0)); $tview->append_column(new GtkTreeViewColumn ↵ ('Problems', $cell_renderer, 'text', 1)); // Разворачиваем дерево $tview->expand_all(); $vbox->pack_start($tview,false); // Помещаем его в окно и делаем видимым $wnd->add($vbox); $wnd->show_all(); Gtk::main(); ?>

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

Дизайнер пользовательских интерфейсов Glade2 Glade – это приложение для визуального построения графических интерфейсов, на основе GTK+. Оно входит во все популярные дистрибутивы Linux, но при необходимости может быть скачано с официального сайта проекта – http://glade.gnome.org. Glade позволяет проектировать графический интерфейс пользователя, просто набрасывая мышкой на будущее окно приложения компоненты из предоставленной палитры (см. рис. 6), и сохранять получившееся безобразие в XML-файл в формате GladeXML для последующего использования Gtk+ приложениями, реализованными на различных языках. В PHP-GTK также есть средства работы с GladeXML.

86

Интерфейс, показанный на рис. 5, будет сохранён в виде следующего glade-файла (листинг дан с сокращениями): <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> <!DOCTYPE glade-interface SYSTEM ↵ "http://glade.gnome.org/glade-2.0.dtd"> <glade-interface> <widget class="GtkWindow" id="window"> <property name="visible">True</property> <property name="title" ↵ translatable="yes">Glade</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position"> ↵ GTK_WIN_POS_NONE</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> <property name="type_hint"> ↵ GDK_WINDOW_TYPE_HINT_NORMAL</property> <property name="gravity"> ↵ GDK_GRAVITY_NORTH_WEST</property> <property name="focus_on_map">True</property> <property name="urgency_hint">False</property> <child> <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">0</property>

<child> <widget class="GtkNotebook" id="notebook1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="show_tabs">True</property> <property name="show_border">True</property> <property name="tab_pos">GTK_POS_TOP</property> <property name="scrollable">False</property> <property name="enable_popup">False</property>

<child> <widget class="GtkLabel" id="label4"> <property name="visible">True</property> <property name="label" translatable="yes"> ↵ Hellow Glade!</property> <property name="use_underline"> ↵ False</property> <property name="use_markup">False</property> <property name="justify"> ↵ GTK_JUSTIFY_LEFT</property> <property name="wrap">False</property> <property name="selectable">False</property> <property name="xalign">0.5</property> <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> <property name="ellipsize"> ↵ PANGO_ELLIPSIZE_NONE</property> <property name="width_chars">-1</property> <property name="single_line_mode"> ↵ False</property> <property name="angle">0</property> </widget> <packing> <property name="tab_expand">False</property> <property name="tab_fill">True</property> </packing> </child> <child> <widget class="GtkLabel" id="label1"> <property name="visible">True</property> ………………………………………….. <property name="single_line_mode"> ↵ False</property> <property name="angle">0</property> </widget> <packing> <property name="type">tab</property> </packing> </child>


web

Рисунок 4. Рабочее приложение

Рисунок 5. Допроектировались

Рисунок 6. Проектируем графический интерфейс с glade

<child> <placeholder/> </child>

<child> <widget class="GtkLabel" id="label2"> ………………………………………………. </widget> <packing> <property name="type">tab</property> </packing> </child> </widget> <packing> <property name="padding">0</property> <property name="expand">True</property> <property name="fill">True</property> </packing> </child> </widget> </child> </widget>

Gtk::main_quit(); }Gtk::main(); ?>

Как видите, с таким инструментарием создание функционального настольного приложения на PHP не только возможно, но и до безобразия легко осуществимо!

Заключение

PHP_GTK 2, кроме поддержки объектной модели PHP5, Glade и GTK2+, принёс с собой много новых виджетов, объектов, методов. Подробно об их работе лучше прочитать в документации проекта, которая, может, пока и недостаточно полна, но постоянно улучшается (кстати, в этом процессе можно принять участие). Целью же моего опуса было привлечь внимание к новому этапу данной технологии. Получит-ли PHP-GTK широкое распространение? Есть ли во</glade-interface> обще будущее у PHP в области настольных приложений? Использовать такой файл в качестве готового интерДа, конечно, возможности пакета по сравнению с перфейса можно следующим образом: вой версией значительно возросли, но будут ли они востребованы? Кинуться ли тысячи PHP-кодеров писать клиент<?php ские приложения? Мне кажется, такого в массовом не слу$glade = new GladeXML('testglade.glade'); чится, так как ниша настольных приложений давно и проGtk::main(); ?> чно занята более продвинутыми конкурентами. В то же время определённые продвижения в этом наЭто, разумеется, самый простой случай, но и в связыва- правлении вполне возможны. PHP, конечно, не потеснит нии сигналов объектов и событий нет ничего сложного: на этом рынке Java или C, но PHP-GTK-приложения вполне имеют право на жизнь. Нас ведь давно не удивляют GUI<?php программы написанные на Python? $glade = new GladeXML('testglade.glade'); $window = $glade->get_widget('wndClose'); $window->connect_simple('destroy', array('Gtk', ↵ 'main_quit'));

$button = $glade->get_widget('btnClose'); $button->connect_simple('clicked', 'onClickButton'); function onClickButton() { echo "button clicked!\r\n";

№6, июнь 2008

1. Официальный сайт проекта PHP_GTK – http://gtk.php.net. 2. Уваров А. PHP-GTK. //Системный администратор, №12, 2004 г. – С. 60-61 (http://www.samag.ru/cgi-bin/go.pl?q=articles; n=12.2004;a=13). 3. Документация на PHP-GTK 2 – http://gtk.php.net/manual/en. 4. Сайт проекта Glade – http://glade.gnome.org.

87


ретроспектива

Долгая счастливая жизнь – история компании IBM

Илья Александров Мы называем наш век компьютерным, общество – информационным и тесно связываем будущее человечества с технологиями. Мечтательные мысли писателей-фантастов становятся будничным явлением. Это статья о компании, которая сделала все, чтобы будущее наступило быстрее. Наверное, она и была главным конструктором этого будущего. International Business Machines – IBM.

Начало века. Предыстория

Томас мечтал заниматься не скучной монотонной работой, а открыть собстЧеловека, чье имя сейчас мало кому венное дело, и искал все возможные известно, но которому мир во многом способы, чтобы скопить деньги. Его обязан технологическим бумом, звали приглашают в фирму National Cash Томас Уотсон (Thomas Watson). После Register (NCR) на позицию менеджешколы парень прослушал курс в школе ра по продажам. Желание заработать коммерции и пошел работать бухгал- денег на открытие собственного бизтером в один из магазинов Нью-Йорка. неса сыграло с Томом злую шутку – он

88

и хозяин NCR были арестованы по делу о финансовых махинациях. Том Уотсон получил год тюрьмы. Он выходит на свободу, пытается найти работу. Среди прочих обращается в Computing Tabulating Recording (CTR) Corporation, фирму, занимающуюся в основном производством перфокарт и оборудования для их счи-


ретроспектива тывания. Это неудивительно, так как одним из основателей CTR был человек, создавший перфокарты как таковые. Также компания занималась производством часов и техники для офисов. Тому простили грехи, и он снова работает менеджером по продажам. Уотсону к тому времени исполняется почти сорок лет. Новый сотрудник принялся за дело с таким рвением, что в 1914 году, спустя 11 месяцев после начала работы Уотсона в CTR, его избирают президентом компании. Томас проводит ряд изменений. При нем начинается система премирования, поощрения особенно успешных сотрудников. Сделан упор на качество обслуживания клиентов, на уровень сервиса. В самой компании начинают пропагандировать особый корпоративный дух, проводятся встречи коллег после работы, спортивные соревнования, вечеринки. Девизом Томаса и всей CTR стал глагол «Думай!». Думать у них получалось. Компания выходит на международный рынок, прибыль увеличивается. Проходит переименование компании, теперь она называется International Business Machines. Сокращенно – IBM (см. рис. 1).

Первые годы IBM К 1920 году годовой доход, главным образом от продаж счетных машин по всему миру, достиг 20 миллионов долларов. Перфокарты и связанные с ними устройства продолжают оставаться основной продукцией компании. В 1928 году выпускают IBM Card – перфокарту, на которой объем информации был удвоен за счет формы и расположения на ней отверстий. Через несколько лет в США – «великая депрессия». Львиная доля бизнес-структур обанкротилась и прекратила свое существование. IBM продолжает оставаться на плаву, выплачивает своим сотрудникам достойную заработную плату. Многомиллионные доходы прошлых лет и международные продажи спасают компанию. Более того, в 1933 году IBM открывает свою техническую лабораторию. На тот момент одну из лучших в мире. В тридцать пятом году компания получает заказ непосредственно от правительства США – государству требовалось создание автоматического уче-

№6, июнь 2008

та занятости на 26 миллионов человек. IBM работала с правительством на протяжении всей своей истории, а первый заказ государственного департамента был еще в 1910 году, когда носившая еще старое название компания обеспечивала техническую поддержку во время переписи населения. Инженеры компании тогда же разрабатывают свою версию электронной печатной машинки, а в ближайшие годы она станет наиболее продаваемой продукцией IBM. К концу тридцатых доход IBM составляет порядка сорока миллионов долларов в год. Количество сотрудников достигает 11 тысяч человек. Открываются региональные представительства в 79 странах мира. Годы войны непросто сказались даже на экономике штатов, и IBM на своих заводах производит карабин M1 и другое стрелковое оружие, вместо печатных машинок. Согласно упорно обсуждаемым в Сети слухам, до войны, в тридцатых, инженеры IBM выполнили несколько заказов по разработке счетного оборудования для нацистской Германии. В официальной истории данный факт не отражен, и был ли он на самом деле – не до конца ясно. А в 1944 году происходит историческое событие. Выпуск Mark-1 (см. рис. 2). Один из первых ЭВМ пяти тонн весом. Благодаря использованию вакуумных ламп скорость обра-

Рисунок 1. Логотип компании

ботки информации увеличилась в сотни и тысячи раз. Для работы новинке был необходим двигатель мощностью в пять лошадиных сил. Операция сложения занимала у «Марка» меньше секунды. IBM от продаж техники широкого коммерческого потребления все больше переходит к узкоспециализированным научным разработкам.

Расцвет корпорации В начале пятидесятых IBM активно сотрудничает с министерством обороны США, поставляя свои разработки в технические центры. Система перехвата SAGE для комплекса ПВО стоила правительству тридцать миллионов долларов. Заработав себе авторитетное имя, инженеры IBM много работают вместе с учеными Массачусетского технологического института. В частности, одной из совместных разработок стала память на магнитных сердечниках – маленьких ферритовых колечках в несколько миллиметров диаметром. По этой технологии память дела-

Рисунок 2. Компьютер Mark 1

89


ретроспектива Голубой гигант У компании есть прозвище – «Big Blue», что буквально можно перевести как «большой синий» или голубой гигант. Точно сказать, откуда пошло это прозвище, нельзя, но существует несколько версий. Одна версия гласит, что название пошло от суперкомпьютеров, разрабатываемых в конце пя-

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

ли и спустя двадцать лет. В 1952 году В 1960 году – активное сотрудниIBM выпускает новый компьютер – мо- чество с NASA, участие в первой продель «701». Новый компьютер был в ра- грамме США по освоению космоса, зы мощнее «Mark-1», хранил информа- в которой IBM занималась техничесцию на магнитных лентах и использо- кой разработкой. Тогда же компания вался в научной среде. начинает поддержку Олимпийских игр. Тогда же происходит смена поколе- Но все основные силы сосредоточены ний в компании. Новым президентом на другом. Инженеры делают Systemстановится Том Уотсон-младший, сын 360. В новую разработку вложены субывшего руководителя компании. Уже масшедшие деньги, порядка 5 милпри нем с 1955 по 1960 годы IBM выпус- лиардов долларов США. В итоге – секает около ста двадцати компьютеров мейство компьютеров разных мощмодели «704» с возможностью прове- ностей с единой архитектурой и совдений операций с плавающей точкой местимым со всеми моделями дани улучшенной магнитной памятью. ного семейства программным обесВ 56 лет Артур Самюэль (Arthur печением. Samuel) создает одну из первых проВпервые стало возможно заменить грамм с искусственным интеллектом, устаревшие комплектующие новыми. ей стала программа шахматной иг- System-360 стал первым более-менее ры. Год спустя инженеры IBM научи- массовым компьютером, его выпускались общаться с компьютером не толь- ли по тысяче экземпляров в месяц. ко с помощью машинного кода нолей Чуть позже возникло понятие перии единиц – выходит язык программи- ферийного оборудования. Если раньрования Fortran. К концу пятидесятых ше компьютер можно было приобресоборот продаж IBM составляет почти ти лишь в сборке, то теперь покупатель миллиард долларов, девять из деся- мог выбрать комплектацию при заказе, ти компьютеров в Европе и США име- а позже модернизировать, заменить ют логотип «IBM». Компания ко всему комплектующие на более новые. прочему начинает производить принВ 1966 году Роберт Денард (Robert теры. Denard) изобретает технологию па-

Рисунок 3. IBM 5150

90

мяти DRAM, ставшую прорывом в области создания подсистем оперативной памяти.

Семидесятые и восьмидесятые. Премии и открытия IBM осваивает все новые сферы рынка. После принтера корпорация выпускает копировальный аппарат, после – систему распознавания речи. В 1971 году IBM презентует флоппи-диск, а дискета на долгое время становится основным способом переноса информации. В этом же году на Луну отправляется космический агрегат «Apollo», все компьютерное оборудование которого произведено в лабораториях IBM. NASA наградит компанию за вклад в освоение космоса. В 1973 с о з д ан же с тк ий д и с к IBM 33 40 с кодовым названием «Winchester». Новая технология с возросшей плотностью данных стала основной в этой отрасли на долгие годы, а слово «винчестер» в обиходе до сих пор. Еще одним подтверждением успехов компании стало награждение Нобелевской премией Лео Есаки (Leo Esaki), инженера фирмы, за разработки в области физики. Осваивая все новые пространства, в 1974 году у IBM появляется свое представительство в Советском Союзе. Компанию в нашей стране представлял сам Уотсон. Он постепенно отходит от руководящей должности и уступает пост Франку Кэрри (Frank Carry). Начало деятельности Франка знаменуется выпуском портативного компью-

Рисунок 4. Первые модели ноутбуков от IBM


ретроспектива тера IBM 5100. Дисплей в 5 дюймов, свой процессор, 64 килобайт памяти. А также титанический, более 20 килограммов, вес и цена от десяти до двадцати тысяч долларов. В 1981 году корпорация анонсирует новый персональный компьютер. Улучшенная модель – IBM 5150 (см. рис. 3). Цель – отбить рынок у конкурентов, сделать самый покупаемый компьютер. Разработка длится год, процессор заказывают у Intel, операционную систему – у Microsoft, которая тогда была еще очень скромной конторой. Так на компьютерах IBM появился DOS. Компактные размеры, возможность замены комплектующих и, самое главное, доступная цена, составлявшая порядка полутора тысяч долларов. 5150 стал главным домашним и офисным компьютером в мире, а журнал «TIME» назвал компьютер... «человеком года». В 1984 году появляется возможность объединять компьютеры IBM в одну сеть. Каждый предприниматель теперь считает хорошим тоном иметь у себя в офисе «локалку». В 1986 и 1987 годах сотрудники лаборатории IBM в Цюрихе забирают Нобелевскую премию два года подряд. Сначала награждают Герда Биннинга (Herd Binning) и Хейнрика Рохрера (Haynrick Rohrer) за изобретение нового способа макросъемки, позволяющего более точно изучить строение атомов. Год спустя Нобелевский комитет объявляет лауреатами Жорджа Беднорза (Jhoe Bednorse) и Алекса Мюллера (Alex Muller) за их работы в области сверхпроводимости при высоких температурах. IBM много занимается инвестициями в науку, спонсирует работу физиков и математиков. В 1984 компания один из главных спонсоров Олимпиады. В 1987 году продан миллион новых компьютеров PS/2. В дополнение к компьютеру корпорация создает операционную систему OS/2, на которую столько надежд у руководителей компании.

Хроники новейшей истории IBM 1990. IBM выпускает мощнейшие для своего времени суперкомпьютеры RISC/600. На производство подобных разработок компания затрачивает все больше средств. 1992. Выпуск серии ноутбуков ThinkPad (см. рис. 4). Ноутбуки помимо производительности примечательны стильным дизайном. 1993. Новым президентом компании становится Лу Герстнер (Luis Gerstner). Герстнер приходит в руководство в сложнейший период для компании. Убытки IBM за этот год составляют 5 миллиардов долларов. 1994. Новый микропроцессор. PowerPC 604 обрабатывает 40 Мб информации в секунду. 1995. Развитие IBM Global Network. Международная правительственная сверхскоростная компьютерная сеть, объединяющая порядка двух миллионов компьютеров.

не являются широко распространенными, хотя раньше Apple проявлял к ним огромный интерес. IBM сама позволила всем производить любые комплектующие для ПК и остаться лучшей во всем не могла по определению. Но в списке суперкомпьютеров доминирует все же IBM. Компания продолжает оставаться одним из важнейших партнеров для NASA. У корпорации представительство в 164 странах

1997. На борту космического корабля, изучающего поверхность Марса, работает IBM RS/6000. IBM остается главной «космической» IT-компанией. Гарри Каспаров играет матч против суперкомпьютера IBM Deep Blue. Противостояние заканчивается поражением тринадцатого чемпиона мира по шахматам. 1998. Выпуск процессора с тактовой частотой в один гигагерц. Техническая и информационная поддержка компанией Олимпийских игр в Нагано. 1999. 90% серверов в крупнейших компаниях мира – серверы, являющиеся продукцией от IBM. 2000. Активное сотрудничество IBM с разработчиками Linux. В частности, файловая система JFS – плод труда программистов IBM. Хотя изначально разрабатывалась она для операционной системы AIX, востребованной стала именно среди пользователей Linux.

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

n www.ibm.com; n en.wikipedia.org; n www.bugtraq.ru.

Заключение IBM была главной технологической компанией почти пятьдесят лет. Операционная система OS/2 канула в небытие, не выдержав противостояния с Microsoft. Процессоры IBM сегодня

№6, июнь 2008

Рисунок 5. Официальный сайт компании IBM

91


книжная полка

The Definitive Guide to the Xen Hypervisor David Chisnall

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

те с VMware ESX 3.5 пожалуй единственные гипервизоры готовые промышленному внедрению. Правда, скоро, с выходом Microsoft Hyper‑V, их будет уже три. А чем больше выбор, тем всегда лучше конечному пользователю. Книга написана автором в тесном сотрудничестве с командой XenSource (в настоящее время Citrix), что позволило получить глубокий взгляд внутрь архитектуры гипервизора. В том числе, издание содержит ключевую информацию для разработчиков, желающих оптимизировать свои приложения под виртуальное окружение. Книга состоит из трех частей: виртуальная машина Xen, устройства ввода/вывода и архитектура Xen. Вначале рассказывается, что же такое виртуализация, зачем она нужна, а также какие проблемы связаны

с виртуализацией на платформе x86. Далее – погружение в архитектуру гипервизора Xen и принципы работы с драйверами устройств. Рассмотрены работа с XenStore, утилиты пользователя, интерфейс прикладного программирования Xen, планировщик. Каждая глава заканчивается практическими упражнениями. Для работы с книгой крайне желательным является опыт работы с каким-либо GNU/Linux и знание языка программирования C. В качестве бонуса с книгой идет регистрационный ключ, дающий право на пользование электронной версией книги через веб-службу Safari.

n Издательство: n Год издания: n Количество страниц: n ISBN: n Цена:

Prentice Hall 2008 320 978-0132349710 ≈ $39,99

Компиляторы. Принципы, технологии и инструментарий. Второе издание Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман

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

92

«книги дракона» – учебника по теории разработки компиляторов. Неофициальное «фэнтезийное» название книга получила из-за рисунка на обложке, впервые появившемся еще в 1986 году. Данный же перевод основан на втором издании, вышедшем на языке оригинала два года назад. Учебник положен в основу курсов, преподаваемых в нескольких университетах, в частности Университете Колумбии, Гарварде и Стэнфорде. В первую очередь книга предназначена для студентов и преподавателей, тем не менее материал будет интересен всем, кто интересуется разработкой компиляторов. Для работы с изданием, в котором приведено большое число примеров, необходимо знание языков программирования C/C++ или Java. Книга состоит из двенадцати глав и двух приложений. В одном из приложений при-

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

n Издательство: n Год издания: n Количество страниц: n ISBN: n Цена:

«Вильямс» 2008 1184 978-5-8459-1349-4 ≈ 1510 руб. К н и г а п р е д о с т а в л е н а и з д ат е л ь с т в о м «Вильямс».


книжная полка

Виртуализация и Microsoft Virtual Server 2005. Полное и исчерпывающее руководство по Virtual Server 2005 Роджер Диттнер, Кен Мейджорз, Матиас тен Селдам, Туан Гротениус, Дэвид Рул мл., Джеффри Грин

Еще одно издание, посвященное виртуализации. На этот раз продукту, работающему внутри операционной системы, конкуренту VMware Server от компании Microsoft – Microsoft Virtual Server 2005. В книге рассматривается актуальная на данный момент версия сервера R2, правда, в описание не попали возможности, привнесенные пер-

вым пакетом обновлений SP1, вышедшим в конце 2007 года. В книге рассмотрены следующие темы: установка и настройка сервера Virtual Server и настройка веб-сайта администрирования Virtual Server; определение требований к ресурсам сервера, на который устанавливается Virtual Server; работа с виртуальными машинами, виртуальными сетями и дисками; введение в Automated Deployment Services (ADS) – службу, предназначенную для создания образов серверов и ведения общей базы инсталляций; создание виртуальных машин при помощи файлов сценариев; основные этапы создания виртуальной среды путем миграции физических серверов; решение проблем, возникающих при работе с ADS и Virtual Server

Migration Toolkit, а также в процессе миграции; интеграция систем, отличных от Windows с Microsoft Operations Manager 2005 при помощи Virtual Agents; разбор случаев, когда Virtual Server эффективен, а когда – нет. В целом, книгу можно порекомендовать всем, кто интересуется альтернативами продуктов VMware или продуктами виртуализации от Microsoft, а также планирует использовать в виртуальных средах операционные системы преимущественно от Microsoft.

n Издательство: n Год издания: n Количество страниц: n ISBN: n Цена:

«Бином» 2008 432 978-5-9518-0236-1 ≈ 474 руб. Книга предоставлена издательством «Бином».

Linux. Программирование в примерах. Основы. Третье русское издание Арнольд Роббинс

Это уже третье русское издание данной книги. Ее автор является профессиональным программистом и преподавателем с большим опытом. Из-под его пера вышли такие книги, как «Эффективное программирование на awk» и «UNIX in Nutshell». Основная концепция данной книги – изучение программирования в операционной системе GNU/Linux на основе реального исходного кода.

№6, июнь 2008

В качестве примеров взят код как из проекта GNU, так и из оригинального UNIX V7. Для того чтобы начать работать с книгой, достаточно знать основы языка C, как пишет автор, хотя бы на уровне книги Кернигана и Ричи «Программирование на языке C». Кроме того, необходимо владеть основными концепциями UNIX/Linux и уметь работать с базовыми командами операционной системы. В конце первой части книги под названием «Файлы и пользователи» вы получите достаточно знаний, чтоб попробовать написать аналог команды ls. В этой части рассматриваются такие темы как: аргументы, опции и переменные окружения; управление памятью на уровне пользователя; файлы и файловый ввод/вывод; каталоги и служебные данные файлов; общие

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

n Издательство: n Год издания: n Количество страниц: n ISBN: n Цена:

«КУДИЦ-Пресс» 2008 656 978-5-91136-056-6 ≈ 380 руб. К н и г а п р е д о с т а в л е н а и з д ат е л ь с т в о м «КУДИЦ-Пресс».

Обзор книжных новинок подготовил Андрей Маркелов

93


Реклама


подписка на 2008 год Российская Федерация

n Подписной индекс: годовой – 20780, полугодовой – 81655

Каталог агентства «Роспечать» n Подписной индекс: годовой – 88099, полугодовой – 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» n Альтернативные подписные агентства: Агентство «Интер-Почта» (495) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (495) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 ЛинуксЦентр www.linuxcenter.ru n Подписка On-line http://www.arzi.ru http://www.gazety.ru http://www.presscafe.ru

СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры «АРЗИ»: n Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению

печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)

n Казахстан – по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс»

n Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10)

n Узбекистан – по каталогу «Davriy nashrlar» российские издания через агентство по распространению печати «Davriy nashrlar» (7000029, г. Ташкент, пл. Мустакиллик, 5/3, офис 33) n Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Давида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Сарьяна, 22) n Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42) n Молдавия – по каталогу через ГП «Пошта Молдовей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17) по прайс-листу через ООО Агентство «Editil Periodice» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) n Подписка для Украины: Киевский главпочтамт Подписное агентство «KSS», тел./факс (044)464-0220

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

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

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

годовой полугодовой

**

№6, июнь 2008

95


СИСТЕМНЫЙ АДМИНИСТРАТОР №6(67), Июнь, 2008 год УЧРЕДИТЕЛИ Частные лица РЕДАКЦИЯ Генеральный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Главный редактор электронного приложения «Open Source» Дмитрий Шурупов Внештатные редакторы Алексей Барабанов Кирилл Сухов Валентин Синицын Виктор Гижевский Олег Щербаков Дмитрий Шурупов Александр Майоров Андрей Бирюков Андрей Уваров РЕКЛАМНАЯ СЛУЖБА тел./факс: (495) 628-8253 Евгения Тарабрина (доб. 119) reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Дмитрий Репин По вопросам распространения обращайтесь по телефону: Светлана Зобова (495) 628-8253 (доб. 121) 107045, г. Москва, Ананьевский переулок, дом 4/2, стр. 1 тел./факс: (495) 628-8253 Сайт журнала: www.samag.ru ИЗДАТЕЛЬ ООО «С 13» Отпечатано типографией ГП «Московская Типография №13» Тираж 17000 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.). За содержание статьи ответственность несет автор. Мнение редакции может не совпадать с мнением автора. За содержание рекламных материалов ответственность несет рекламодатель. Все права на опубликованные материалы защищены.

96

Вышел DVD-диск с архивом номеров журнала за 2007 год Что на диске? n Архив 12-ти номеров журнала «Системный администратор» за 2007 год.

n Архив всех выпусков электронного приложения «Open Source» за 2007 год.

n Программные продукты от партнеров журнала (триальные версии):

 Kerio MailServer 6.5;  Kaspersky® Internet Security 7.0;  Антивирус Касперского ® 7.0;  Система контроля доступа Zlock 2.0;  Прокси-сервер UserGate 4.2;  Handy Backup 5.8;  Paragon Drive Backup 8.51 Enterprise Server Edition;

 Network Inventory 1.6.0;  FastReport Server 1.0.10 demo;  ABBYY Lingvo 12;  WinRar 3.71;  Linux-дистрибутив Mandriva One 2008;  Linbox Rescue Server 20070703.

n Серверы/сети/администрирование:  FreeBSD 7.0-RELEASE;  Apache HTTP Server 2.2.8 (+ win32);  nginx 0.6.26, 0.5.35;  lighttpd 1.4.18;  ProFTPD 1.3.1;  PureFTPd 1.0.21;  vsftpd 2.0.6;  Sendmail 8.14.2;  Postfix 2.5.1, 2.6-20080221 (experimental);  Courier Mail Server 0.58.0;  Exim 4.69;  SpamAssassin 3.2.4;  DSPAM 3.8.0;  Policy Daemon 1.82;  SquirrelMail 1.4.13;  RoundCube 0.1-rc2;  MySQL 5.0.51a (+ win32);  PostgreSQL 8.3.0 (+ win32);  Firebird 2.0.3.12981 (+ win32);  SQLite 3.5.6 (+ win32);  Perl 5.10.0;  PHP: 5.2.5 (+ win32);  Python 2.5.2 (+ win32);  Ruby 1.8.6-p111, 1.9.0-1;  Nmap 4.53 (+ win32);  Ettercap 0.7.3.tar.gz (+ win32);  Ethereal 0.99.0 (+ win32);  Snort 2.8.0.2;  MRTG 2.16.1;  NuFW 2.2.9;

 tcpdump 3.9.8;  NeTAMS 3.4.1rc1;  IPStat 0.9.7.2;  Linux kernel 2.6.24.1;  BIND 9.4.2 (+ win32);  OpenSSL 0.9.8g;  OpenSSH 4.7p1;  Samba 3.0.28;  Squid Web Proxy Cache 2.6.STABLE18;  CUPS 1.3.6;  Clam AntiVirus 0.92.1 (+ Clamwin 0.92);  Webmin 1.400;  Bacula 2.2.8;  Amanda 2.5.2p1;

n Пользовательское ПО:  OpenOffice.org 2.3.1 (LinuxIntel, Win32Intel);  Mozilla Firefox 2.0.0.12 (Linux, win32);  Mozilla Thunderbird 2.0.0.12 (Linux, win32);  Mozilla Seamonkey (Linux, win32);  Mozilla Sunbird 0.7 (Linux, win32);  Pidgin 2.4.0 (+ win32);  SIM IM 0.9.4.3 (+ win32);  X-Chat 2.8.4 (+ 2.8.5e win32);  aMule 2.1.3 (+ win32);  GIMP 2.4.5 (+ 2.4.4 win32);  MPlayer 1.0rc2 (+ win32);  VLC media player 0.8.6e (+ win32);  WINE 0.9.56;  DOSBox 0.72 (+ win32);  DOSEMU 1.4.0;  Midnight Commander 4.6.1;  Vim 7.1 (+ gvim71);  7-Zip 457 (+ win32);  GnuPG 2.0.8 (+ w32cli 1.4.8).

Как получить диск в подарок? n Клиенты компании SecurIT, заказавшие Zserver в любой комплектации или более 50 лицензий Zlock, получат диск в подарок.

Где можно приобрести диск? n В редакции ж урна ла «Сис темный а дминистратор» по адресу: г. Москва, Ананьевский переулок 4/2, стр. 1, в офисе 13 (метро «Сухаревская»).

n В online-магазине Linuxcenter.ru. n Для обитателей и посетителей Савеловского рынка, диск можно купить в точке торговли печатными изданиями у главного входа.

Сколько стоит? Цена – 150 рублей.


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.