98
Роспечать – 20780, 81655 Пресса России – 87836 Интер-почта – тел. (495) 500-00-60 Так видит журнал читатель, который забыл оформить подписку: ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Так видит журнал читатель, оформивший подписку: НОВОГОДНИЕ КАНИКУЛЫ ЗАТЯНУЛИСЬ БЫСТРО РАСКУПИЛИ ТИРАЖ НЕОЖИДАННО ЗАКОНЧИЛИСЬ ДЕНЬГИ УЕХАЛ В ОТПУСК ПОСЛЕ ОТПУСКА АВРАЛ НА РАБОТЕ №5(30) май 2005 подписной индекс 81655 www.samag.ru Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl №5(30) май 2005 подписной индекс 81655 www.samag.ru Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl №5(42) май 2006 №5(42) май 2006 подписной индекс 20780 www.samag.ru Самый подробный материал о программе Sendmail в истории IT-журналистики! Настраиваем эффективную систему сетевой защиты Zorp Windows SharePoint Services: разбираем на практике возможности технологии Box Backup: узнайте всё о горячих резервных копиях! Лицензию? Вам какую? Как построить отказоустойчивый кластер с минимальным бюджетом Обзор дистрибутива Arch Linux Генная инженерия на службе распаковки PE-файлов

042 Системный Администратор 05 2006

Embed Size (px)

DESCRIPTION

№5(42) май 2006 подписной индекс 20780 www.samag.ru Н Е О Ж И Д А Н Н О Б Ы С Т Р О Р А С К У П И Л И Т И Р А Ж Н О В О Г О Д Н И Е П О С Л Е О Т П У С К А А В Р А Л Н А Р А Б О Т Е №5(42) май 2006 Почему MS SQL медленно работает? Ищем причины Почему MS SQL медленно работает? Ищем причины Настраиваем UPS под Linux

Citation preview

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

Роспечать – 20780, 81655Пресса России – 87836Интер-почта – тел. (495) 500-00-60

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

ПОДПИШИТЕСЬ И ЧИТАЙТЕ!

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

НОВОГОДНИЕ

КАНИКУЛЫ

ЗАТЯ

НУЛИСЬ

БЫСТР

О РАСКУПИЛИ

ТИРА

Ж

НЕОЖ

ИДАННО

ЗАКОНЧИЛИСЬ Д

ЕНЬГИ

УЕХАЛ В

ОТП

УСК

ПОСЛЕ ОТП

УСКА

АВРАЛ Н

А РАБОТЕ

№5(30) май 2005подписной индекс 81655www.samag.ru

Почему MS SQL медленно работает?Ищем причины

Строим защищенную беспроводную сеть:WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить удаленные файлы под BSD

Что важно знать об IP-телефонии

танавливаем Symantec Antivirus 9.0в корпоративной сети

Эффективно управляем полями пользователей в AD

Контролируем безопасность сетис помощью OSSIM

Интервью с Ларри Уоллом –создателем языка Perl

№5(30) май 2005подписной индекс 81655www.samag.ru

Почему MS SQL медленно работает?Ищем причины

Строим защищенную беспроводную сеть:WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить удаленные файлы под BSD

Что важно знать об IP-телефонии

танавливаем Symantec Antivirus 9.0в корпоративной сети

Эффективно управляем полями пользователей в AD

Контролируем безопасность сетис помощью OSSIM

Интервью с Ларри Уоллом –создателем языка Perl

№5(

42)

май

200

6

№5(42) май 2006подписной индекс 20780www.samag.ru

Самый подробный материал о программе Sendmail в истории IT-журналистики!

Настраиваем эффективную систему сетевой защиты Zorp

Windows SharePoint Services:разбираем на практикевозможности технологии

Box Backup: узнайте всё о горячих резервных копиях!

Лицензию? Вам какую?

Как построить отказоустойчивый кластер с минимальным бюджетом

Обзор дистрибутива Arch Linux

Генная инженерия на службе распаковки PE-файлов

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

1№5, май 2006

оглавление

ТЕНДЕНЦИИ3

IMHO

Узнай секреты WMI: события и провайдерыЧасть 2

28

Константин Леонтьевklеоnt@miсrоsоft.соm

Возможности технологии MS Windows SharePoint Services

20

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

Иван Хрипунов[email protected]

Артем Черневский[email protected]

Развитие IT-отдела связано с переходом от обслужи-вания базовой IT-инфраструктуры к созданию интра-нет-порталов и автоматизации бизнес-процессов. Эф-фективный инструмент для решения подобных задач – MS SharePoint.

Как работает Sendmail?Полезные подробности

12

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

Ещё лет десять назад само понятие «электронная поч-та» прочно ассоциировалось с программой Sendmail. Сейчас ситуация несколько изменилась, но проект Sendmail по-прежнему остаётся одним из лидеров.

Отказоустойчивый кластер с минимальным бюджетом

36

Сергей Довганюк[email protected]

Строим эффективный кластер и используем его в ка-честве платформы для критически важных приложений на примере СУБД Oracle 9i.

Arch Linux: руководство к быстрому старту42

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

Обзор дистрибутива Arch Linux.

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

Надежда умирает последней: история компании SGI. Часть 2

86

Дмитрий Мороз[email protected]

РЕТРОСПЕКТИВА

КНИЖНАЯ ПОЛКА

41, 69, 85 BUGTRAQ

Ключ к управлению системой и приложениями.

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

РЕПОРТАЖ4 Настраиваем эффективную систему сетевой защиты Zorp

48

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

ModSecurity – Open Source firewall седьмого уровня – позволяет защититься от угроз, типичных для веб-сер-вера. Но в обычной сети встречаются и другие серви-сы, нуждающиеся в защите.

Прихоти судьбы.Биография IT-просветителя

52

Оксана Родионова[email protected]

Когда-то, протестуя против навязанных жизнью ролей Алексей Сальников, директор крупнейшего в России IT-портала «ЦИТ Форум», вступил с судьбой в перего-воры. Мол, ты дай мне другой вариант самореализации, а я обещаю не ныть на крутых поворотах. Договор всту-пил в силу.

Используем средства библиотеки OpenSSLдля криптографической защиты данныхЧасть 2

70

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

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

Генная инженерия на службе распаковки PE-файлов

58

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

Алгоритм универсального распаковщика, «снимающе-го» даже сложные полиморфные протекторы.

Лицензию? Вам какую?76

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

Как часто мы слышим, что открытых лицензий на про-граммное обеспечение развелось слишком много. BSD, Apache, CDDL, GPL2/3, LGPL… Даже для юристов это настоящий кошмар. А что же тогда говорить о нас, про-стых (хотя и системных) администраторах?

92

ЧЕЛОВЕК НОМЕРА

Box Backup – горячие резервные копии 6

Алексей Коршунов[email protected]

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

СПЕШИТЕ ОФОРМИТЬ ПОДПИСКУ НА II ПОЛУГОДИЕ 2006 ГОДА!

WEB

Возможности поискового движка DataparkSearch

80

Иван Максимов[email protected]

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

Page 4: 042 Системный Администратор 05 2006
Page 5: 042 Системный Администратор 05 2006

3№5, май 2006

тенденции

тальных – на машинах представлены по две операцион-ные системы». Также он сообщил, что переход оставших-ся 3000 сотрудников на компьютеры с исключительно от-крытым программным обеспечением должен осуществить-ся приблизительно в течение ближайшего года. Переход персонала Novell с MS Windows и MS Office на Open Source начался в марте 2004 года. Тогда Дебра Андерсон (Debra Anderson), главный ИТ-руководитель Novell, выражала на-дежду, что большая часть сотрудников будет пользовать-ся операционной системой GNU/Linux и офисным пакетом OpenOffice.org к середине 2005 года.

Google начинает «Лето кода» 2006Крис Дибона (Chris DiBona) из компании Google в середине апреля объявил, что акция «Лето кода» состоится и в этом году. На участие в The Summer of Code 2006 уже подали за-явки многие популярные в сообществе Open Source орга-низации и проекты. Так, например, в списке можно найти Apache Software Foundation, Debian, FreeBSD Project, GCC, Gentoo, GNOME, KDE, NetBSD, Postgresql, Python Software Foundation, Subversion Corporation, The Perl Foundation, The Wine Project. Причем большая их часть подготовила и обна-родовала основные задачи, решение которых будет прохо-дить в рамках инициативы Google. Присылать свои разра-ботки в Google можно начиная уже с 1 мая. Основные тре-бования для желающих проявить себя и помочь проектам – нужно быть студентом в возрасте от 18 лет.

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

Red Hat купила JBossКомпания Red Hat сообщила о приобретении JBoss, извес-тной своим связующим Java-ПО. Сумма контракта оцени-вается в 350 млн. долларов. Информация о готовящемся поглощении JBoss какой-либо крупной организацией ИТ-индустрии циркулировала в СМИ не один месяц, однако ни у кого до недавнего времени не было определенности насчет того, кто же будет новым владельцем. Марк Флери (Marc Fleury), исполнительный директор и основатель JBoss, объяснил выбор Red Hat тем, что обе компании схожи в вы-бранной модели Open Source, и заинтересованностью в со-здании одной крупной фирмы, занимающейся ПО с откры-тым кодом и имеющей в своем арсенале полный набор про-дуктов и услуг. Это станет возможным благодаря интегра-ции разработок JBoss и Red Hat. JBoss станет независи-мым подразделением Red Hat, возглавляемым Флери, ко-торый будет отчитываться только перед главой Linux-ком-пании Мэтью Шуликом (Matthew Szulik).

Linspire запустила FreespireКомпания Linspire последовала примеру Red Hat и Novell и объявила об учреждении бесплатного Linux-дистрибу-тива, поддержкой которого будет заниматься сообщество разработчиков-энтузиастов, – Freespire. У дистрибутива бу-дет две редакции: обычная, в которую войдет не только ПО с открытым кодом, но и некоторые проприетарные продук-ты (некоторые кодеки, драйверы и т. п.), и «свободная», со-стоящая исключительно из Open Source. Выход первой бе-та-версии Freespire состоится в августе этого года. С более подробной информацией о новом проекте можно ознако-миться на www.freespire.org.

Китай назвали крупнейшим Linux-рынком в миреОчередное исследование специалистов из компании IDC показало, что Китай на данный момент является самым большим в мире рынком ОС GNU/Linux и Open Source. Бла-годаря росту заинтересованности в открытом ПО со сторо-ны государственных учреждений, банков и телекоммуника-ционных предприятий объем Linux-рынка Китая в 2005 году вырос почти на треть по сравнению с 2004 годом, составив 11,8 млрд. долларов. Особую роль в наблюдаемом явлении в IDC отводят местным компаниям China Standart Software и Red Flag Linux, которые активно продвигают Linux-реше-ния в различные отрасли. Но на пути дальнейшего распро-странения свободного ПО в азиатской стране стоят тради-ционные проблемы: недостаток опыта работы со системой и Linux-программистов, малая заинтересованность в откры-тых решениях среди обычных пользователей.

Персонал Novell медленно переходит на свободное ПОУже два года минуло с того момента, когда был дан старт миграции персонала компании Novell на GNU/Linux и OpenOffice.org, однако до сих пор у 60% служащих ус-тановлена и MS Windows. Рон Овсепян (Ron Hovsepian), президент Novell, на пресс-конференции в Сиднее (Авс-тралия) заявил, что «на данный момент у 2000 сотрудни-ков из 5000 установлена одна система, GNU/Linux, а у ос-

Page 6: 042 Системный Администратор 05 2006

4

репортаж

Конференция для разработчи-ков Solaris Day прошла 19 апре-ля в один день с NetBeans Day.

Эти два мероприятия стали отправ-ной точкой для впервые проводившей-ся в России акции Sun Tech Days (20-21 апреля). И несмотря на то что на Tech Days приехал с докладом легендарный Джеймс Гослинг, меня во всем этом 3-дневном празднике, организован-ном Sun, заинтересовало именно пер-вое событие, полностью посвященное операционной системе компании.

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

Какие докладыИз иностранных докладчиков Sun на конференцию прибыли два «техно-логических евангелиста»: Фрэнк Кар-рэн и Питер Карлсон. Первому и выпа-ла честь открывать Solaris Day в Моск-ве. Каррэна рассказал о том, что и как поменялось в процессе разработки ОС компании после открытия исходно-го кода, запуска проекта OpenSolaris, а также попутно в лаконичной форме сообщил общие сведения о новшест-вах Solaris 10.

Фрэнк акцентировал всеобщее вни-мание на том, что OpenSolaris не явля-ется дистрибутивом – это лишь кодовая база, на основе которой любой желаю-щий может создать свою систему. Сре-ди существующих на сегодняшний день подобных решений он выделил Nexenta OS, SchilliX и Belenix. Пример использо-вания OpenSolaris для построения пол-ноценной ОС уже с ближайшим рели-зом, естественно, покажет и сама Sun: Solaris 11 (и дальнейшие версии флаг-манской ОС) будет основываться на об-

можно увидеть изменения в последней версии Solaris?» – разработчики ука-зывают на значительно уменьшенное время загрузки системы (благодаря асинхронному запуску сервисов в SMF с учетом их зависимостей).

Питер Карлсон продолжил рас-крытие темы для разработчиков. Его доклад был посвящен общим вопро-сам миграции ПО с Linux на Solaris. Иногда он почти в сатирической ма-нере пытался показать достоинства ОС от Sun, провоцируя слушателей вопросами в стиле «неужели вам еще что-то нужно?» и просьбами «назвать программу, которой не хватает в этом списке!». (В это время за его спиной демонстрировались перечни привыч-ных для Linux-пользователей приложе-ний, доступных и для Solaris.) В общем, такой красноречивый тезис из докла-да Карлсона, как «Solaris is better Linux than Linux», очень точно отображает суть всего того, что он пытался донес-ти до публики.

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

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

Впервые в России: Solaris DayКорпорация Sun Microsystems оправдала свое название и озарила пасмурные московские будни, превратив их в День Solaris.

щедоступной кодовой базе, распро-страняемой под лицензией CDDL.

Выступление Каррэна заверши-лось курьезным случаем, вызванным вопросом слушателя о поддержке про-цессоров Itanium в Solaris. Он снача-ла не мог понять (сделал вид, что не мог?), о чем его спрашивают, а после того как несколько раз повторили сло-во «Itanium», он ответил отчетливым смешком в адрес этой разработки Intel, что изрядно повеселило весь зал. Пос-ле чего Фрэнк шутливо раскритиковал процессор, «с которым теперь никто не знает, что делать».

Затем на продолжительное время место докладчиков заняли наши со-отечественники. «Рубрику» для раз-работчиков открыл обзор Sun Studio 11, сообщение о котором разбили на две части. В первой рассказывалось о том, что из себя представляет данный про-дукт, из чего состоит и на что спосо-бен, а во второй – о способах оптими-зации, используемых в Sun Studio для повышения производительности со-здаваемого ПО.

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

Однако наибольший резонанс вы-звал доклад Андрея Дорофеева о но-вой системе управления сервисами в Solaris (Service Management Facility, SMF), во время которого появилась не-бывалая оживленность. Инновацион-ный подход Sun к работе с сервисами вызвал существенный интерес у слу-шателей. На вопрос: «Как наглядно

Page 7: 042 Системный Администратор 05 2006

5№5, май 2006

репортаж

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

Почему CDDL?Упоминание CDDL в первом докла-де Каррэна вкупе со словами, что это «истинное ПО с открытым кодом», по-будило меня к достаточно распростра-ненному в сообществе вопросу. Зачем Sun было придумывать очередную ли-цензию Open Source, когда их и так су-ществует изрядное множество? С та-ким вопросом, предварительно осве-домив ответчика о том, что собираюсь говорить на «религиозные» темы, я по-дошел к Фрэнку во время одного из пе-

его главных достоинствах и новшест-вах, – у Sun прибавилась острая необ-ходимость в продвижeнии OpenSolaris. Этот решительный шаг, что предприня-ла компания в недавнее время, и те-перь в Sun не без оснований делают ставку на дальнейшее развитие идеи использования модели Open Source. Чем больше им удастся заинтере-совать в этом сообщество, тем луч-шую они получат отдачу, необходи-мую для продуктов, лежащих в осно-ве их бизнеса, – это обычное правило, работающее для всех компаний, при-меняющих данную стратегию в отно-шении ПО с открытым кодом.

Бытует мнение, что OpenSolaris – последняя отчаянная попытка Sun со-хранить свои позиции на рынке сервер-ных операционных систем, где GNU/Linux-системы теснят UNIX-конкурен-тов. Если модель Open Source так по-могла Linux, то почему она не возымеет подобного эффекта для UNIX? Мнения на этот счет среди членов сообщест-ва, журналистов и аналитиков расхо-дятся – причем обычно не в пользу Sun. А вот в компании думают иначе. Кто был прав, как обычно, покажет время. Учитывая, что на OpenSolaris будет ос-нован уже следующий релиз Solaris, – это будущее вполне обозримо.

Дмитрий Шурупов

рерывов. Попутно я сослался на то, что даже Мартин Финк, один из глав-ных Linux-специалистов HP, не так дав-но на одной из конференций заметил, что лицензий на открытое ПО стало слишком много. Через некоторое вре-мя в дискуссию ввязался и стоявший рядом Питер Карлсон, который про-явил себя убедительным адвокатом CDDL. В общих чертах их идеология (защиты новой лицензии) сводится к тому, что разработчик должен иметь возможность самостоятельно решать, под какой лицензией ему опубликовы-вать продукт, но при этом есть потреб-ность в том, чтобы все модификации были доступны другим. В этом отно-шении Sun приглянулась MPL, однако и здесь потребовались некоторые поп-равки для того, чтобы сделать лицен-зию более универсальной (убрать при-вязку к Mozilla и к США).

Вместо заключенияУчастники конференции, не поле-нившиеся заполнить анкеты, получи-ли в подарок футболку с символикой OpenSolaris и лицензионную коробку Solaris с двумя DVD: редакциями этой ОС для x86 и для SPARC.

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

Вот уже пять лет подряд в конце мая это мероприятие со-бирает профессионалов в области разработок веб-прило-жений на РНР. Впервые в России в этом году на конферен-ции выступят два легендарных человека, имеющих непос-редственное отношение к созданию языка программиро-вания PHP: Расмус Лердорф (Rasmus Lerdorf) – основатель проекта PHP, и Андрей Змиевский – активный разработчик ядра и модулей PHP.

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

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

Программа конференции предусматривает: тематичес-кие выступления, мастер-класс по экстремальному про-граммированию на РНР, олимпиада по РНР-програмирова-нию. Впервые в 2006 году материалы конференции будут напечатаны в оффлайновой версии журнала «PhpInside».

Мы приглашаем принять учатие в данном мероприятии всех активных разработчиков веб-приложений и тех, кому это интересно! Поторопитесь, количество мест ограничен-но! По всем вопросам, связанным с регистрацией в качест-ве участников конференции обращайтесь к Максиму Смир-нову по телефону: +7 (495) 585-9261, или пишите по адре-су: [email protected].

Когда: 25-26 мая Где: г. Москва, Центральный Дом Предпринимателя,

ул. Покровка, д. 47/24, стр. 1 (м. Красные Ворота) Организаторы: Клуб разработчиков PHP и Интер-

нет-агентство WebProfy Подробности: www.phpconf.ru

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

Page 8: 042 Системный Администратор 05 2006

6

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

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

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

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

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

зервное копирование всех нужда-ющихся в этом файлов.

Ежедневно происходит копирова-ние изменённых за текущий день данных.

Еженедельно копируются все из-менённые за неделю данные.

Раз в две недели копируются все изменённые за этот период фай-лы или же объединяются архивы за две недели.

Схема повторяется до тех пор, по-ка не наступит новый месяц.

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

ной копии. Восстановление двухнедельной ко-

пии. Восстановление недельной копии. Восстановление копий по дням

в обратном порядке.

Box Backup – горячие резервные копии

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

Алексей Коршунов

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

7№5, май 2006

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

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

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

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

Громоздкость системы с большим количеством этапов.

Сравнительно большое количес-тво времени для восстановления, как единичных утраченных фай-лов, так и больших массивов.

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

Требуется помощь системного ад-министратора для работы с архи-вами.

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

Online-бэкапирование Box BackupСистема относится к так называемому online-резервному копированию. Поче-му оно носит такое название?

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

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

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

По мере обнаружения изменивших-ся файлов она переносит их в ар-хив.

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

Система Box Backup может рабо-тать в довольно внушительном спис-ке OS: OpenBSD; Linux; NetBSD; FreeBSD; Darwin / Mac OS X 10.5; Cygwin (Windows) (только клиент); Native Windows (только клиент); Solaris.

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

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

подразумевает огромный сетевой трафик и большую загрузку серве-ра бэкапов. Как решить эту прою-лему?

Чем обеспечивается безопасность копий?

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

Процедура удаленияФайлы, которые были удалены из сис-темы, на самом деле никуда не исче-зают. (Я говорю, разумеется, не о кли-ентском компьютере.) В резервной ко-

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

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

Безопасность резервного копированияОбеспечению безопасности уделено немало внимания. Авторизация клиента на сервере

бэкапов. Безопасность передачи данных. Шифрование данных. Защита структуры данных. Безопасность хранения данных.

Для авторизации клиента на сер-верной стороне системы Box Backup используется SSL. На каждом ком-пьютере, данные которого нуждают-ся в резервировании, создаётся SSL-сертификат, подписываемый на сер-вере.

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

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

8

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

Безопасность файлов в резервных копиях обеспечива-ется шифрованием. Каждый клиент системы Box Backup при конфигурировании создаёт уникальный ключ. С этим ключом шифруются все передаваемые файлы. И только имея ключ можно получить доступ в архив для просмотра или восстановления файлов.

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

Установка серверной части Box BackupЯ буду рассматривать установку Box Backup на примере системы Gentoo Linux. Установка в других системах будет отличаться только несколькими деталями.

Итак, сначала установим серверную часть системы. Ebuild Box Backup есть в стандартном дереве портов, так что мы воспользуемся стандартной процедурой установки па-кетов в системе Gentoo Linux.

Обратите внимание, что по умолчанию вам будет пред-ложено установить более старую версию системы – 0.09. Я бы рекомендовал проследовать по дереву портов до нуж-ной ветки и установить более новую версию, так как в неё внесли множество исправлений.

Разумеется, можно внести исправления в ваш /etc/portage/package.keywords, но я не вижу смысла делать это ради одного пакета (система не потребует других пакетов для своей работы).

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

Если в вашей системе для резервного копирования нет raid-контролера, а просто используются несколько дис-ков, Box Backup предлагает создать несколько директо-рий, которые обеспечат избыточность в случае ошибок на дисках.

Если raid установлен, то от применения этой структуры можно смело отказываться.

Для использования «raid» от Box Backup выполним сле-дующую команду:

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

Список параметров в этой команде:

/etc/boxbackup – директория, где будут созданы конфи-гурационные файлы. (Если вы устанавливаете систему не в Gentoo Linux, то по умолчанию используйте дирек-торию /etc/box);

2048 – размер блока файлов; /raid/0.0 и остальные – директории, где будут храниться

непосредственно бэкапы. Эти директории должны быть созданы вами. Автоматически они созданы не будут.

После того как файл конфигурации готов, создадим пользователя, от которого будет работать Box Backup.

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

Где: /etc/boxbackup – директория конфигурационных фай-

лов; hostname – имя компьютера; _bbstored – имя пользователя, от которого работает

система.

Если вы собирали пакет самостоятельно в другой сис-теме – для конфигурационных файлов используйте ди-ректорию /etc/box. Выполнение этой команды создаст ос-новной конфигурационный файл системы Box Backup /etc/boxbackup/bbstored.conf, в котором прописываются основные параметры. Присвоим нашему пользователю _bbstored права на директорию:

На этом конфигурирование серверной части системы Box Backup закончено. Остаётся лишь создать сертифи-кат SSL нашей системы и добавить учётные записи поль-зователей. Сделаем это после установки клиентской час-ти на машину, с которой будет производиться резервное копирование.

Установка клиентской части системы Box Backup в LinuxТак как мы говорим о Gentoo Linux и в предыдущем выво-де команды:

наверняка заметили флаг -client-only, то им и воспользуем-ся. Выполним на системе, нуждающейся в резервировании, следующую команду:

это установит в нашу систему клиента системы Box Backup. После того как клиент установлен, настроим его на рабо-ту с нашим сервером.

#emerge -av boxbackup

#cd /usr/portage/app-backup/boxbackup#emerge -av boxbackup-0.10.ebuild

#raidfile-config /etc/boxbackup 2048 /raid/0.0 /raid/0.1 ↵ /raid/0.2

#raidfile-config /etc/boxbackup 2048 /raid/0.0

#useradd _bbstored

#bbstored-config /etc/boxbackup hostname _bbstored

#chown -R _bbstored /etc/boxbackup/bbstored#chmod -R go-rwx /etc/boxbackup/bbstored

#emerge -av boxbackup-0.10.ebuild

#cd /usr/portage/app-backup/boxbackup#USE='client-only' emerge boxbackup-0.10.ebuild

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

9№5, май 2006

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

Здесь возможны два варианта: lazy – в этом режиме демон резервного копирования

bbackupd постоянно следит за изменениями файлов, и как только изменённый файл закрывается, – перено-сит его в резервную копию.

snapshot – работа этого режима понятна по его на-званию. Один раз в установленный вами промежуток времени запускается команда bbackupctl sync, полу-чив которую демон bbackupd начинает сканировать все указанные в конфигурационном файле директо-рии. В случае обнаружения несовпадений даты пос-леднего изменения файл переносится на сервер ре-зервных копий.

Какой режим предпочесть зависит напрямую от коли-чества файлов, нуждающихся в резервировании, загружен-ности компьютера и сетевого трафика. Думаю, зависимос-ти вполне очевидны. Скажу только, что если вы устанав-ливаете систему Box Backup на ноутбук, который часто ра-ботает вне локальной сети, где находится сервер бэкапов, то, наверное, стоит предпочесть режим snapshot.

Разумеется, никто не мешает вам установить сервер Box Backup так, чтобы он был доступен извне. Но в та-ком случае следует учитывать количество трафика, кото-рое будет создаваться компьютерами при резервном ко-пировании.

Запустим команду, которой создадим основной конфи-гурационный файл, ключ системы и SSL-сертификат для ав-торизации на удалённом сервере.

Где: /etc/boxbackup – место хранения конфигурационных

файлов; lazy – способ резервирования; 99 – имя учётной записи на сервере бэкапов (обычно

я использую просто последние цифры IP-адреса ком-пьютера);

hostname – сетевое имя сервера бэкапов (не укажите в данном параметре случайно имя вашего компьюте-ра!);

/var/bbackupd – место, где будут храниться временные файлы системы Box Backup (убедитесь, что там доста-точно свободного места);

/home – путь для резервного копирования (папки легко настраиваются в конфигурационном файле, и мы скоро об этом поговорим).

Теперь нам осталось только указать папки, резерв-ные копии которых мы хотим делать, и правила для них. Основной конфигурационный файл Box Backup клиен-та находится в директории /etc/boxbackup и называется bbackupd.conf.

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

Структура описания такова:

Где: home-directory и etc – в данном случае это условные

описания директорий для системы Box Backup. Именно под этими названиями они будут отображаться при за-просе в резервную копию.

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

ExcludeDir – это, как несложно догадаться, опция ис-ключения из резервирования некоторой подпапки.

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

Остальные опции не менее понятны и в отдельном опи-сании не нуждаются.

Режимы lazy и snapshot в конфигурационных файлах отличаются только параметрами:

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

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

SSL-сертификаты для серверной частиДля создания базовой структуры сертификатов запустим команду:

Если вы получили какие-либо ошибки при выполнении этой команды, убедитесь в первую очередь, что у вас уста-новлен пакет OpenSSL.

После формирования сертификата, подпишем его:

#bbackupd-config /etc/boxbackup lazy account_name ↵ hostname /var/bbackupd /home

BackupLocations{ home-directory { Path = /home ExcludeDir = /home/ftp ExcludeFilesRegex = *.(avi|AVI)$ } etc { Path = /etc }}

AutomaticBackup = no UpdateStoreInterval = 0 MinimumFileAge = 0 MaxUploadWait = 0

#bbstored-certs ca init

#bbstored-certs ca sign-server hostname-csr.pem

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

10

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

На этом подготовка сертификатов для серверной час-ти Box Backup завершена.

SSL-сертификаты для клиентской частиУ нас уже есть клиентский SSL-сертификат, нам нужно под-писать его на сервере, а заодно и скопировать на клиен-та сертификат с сервера. Для этого необходимо передать (scp, samba, ftp или другим способом) на сервер файл /etc/boxbackup/bbackupd/account_name-csr.pem.

Лучше всего поместить клиентский сертификат на сер-вере в папку /etc/boxbackup/bbackupd/.

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

Ответив на запрос «Yes», мы подпишем сертификат и увидим инструкцию о том, что нам необходимо скопиро-вать на клиента два файла: /ca/clients/account_name-cert.pem /ca/roots/serverCA.pem

На клиентской стороне эти файлы положим в /etc/boxbackup/bbackupd. Теперь осталось создать учётную за-пись для нашего клиента на резервирование.

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

Где: account_name – имя учётной записи в числовом виде

(например, как я уже говорил, последняя цифра в IP-ад-ресе клиента).

10000M – мягкий лимит на размер бэкапа. В данном слу-чае я выделил 10 Гб на пользователя (можно также ука-зать 10G).

15000М – жёсткий лимит на размер бэкапа.

После этого можно смело запускать сервисы клиента и сервера системы Box Backup. Система резервного копи-рования готово!

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

Команда:

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

Как вы видите, всё довольно прозрачно и понятно.Команда:

изменит допустимый объём резервной копии для данного пользователя. (Как я уже писал выше, объём можно ука-зывать и в гигабайтах.)

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

и, в случае возникновения ошибок, исправляем с помо-щью:

Ну и напоследок, команда:

удалит существующую учётную запись.

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

Эта утилита работает как удалённый шелл. Она не нуж-дается в работающем демоне bbackupd и позволяет общать-ся с сервером бэкапов посредством вводимых команд. Со-единение с сервером устанавливается при помощи всё тех же SSL-сертификатов и по-прежнему проходит при TLS-шифровании канала.

На рис. 1 показан вывод команды help. Как вы видите, доступно большое количество команд, среди которых есть даже compare, позволяющая сравнивать версии файлов на локальном жёстком диске и файлов, имеющихся в ре-зервной копии. Работа с bbackupquery в чем-то аналогич-на общению с ftp-сервером посредством консольного кли-ента, поэтому останавливаться на ней подробно я не бу-ду (см. рис. 2).

Графическая оболочка BoxiСуществует графическая оболочка для работы с бэка-пом. Проект под названием Boxi [1]. Она обладает спар-танским интерфейсом, но тем не менее позволяет гораз-до удобнee общаться с вашей резервной копией, нежели консольная bbackupquery и позволяет выполнять все ос-новные операции по работе с резервной копией. Такие как сравнение версий, удаление из архива, восстанов-ление файлов, обзор структуры каталогов и так далее (см. рис. 3).

#bbstoreaccounts create account_name 0 10000M 15000M

#bbstoreaccounts info account_name

Account ID: 00000003 Last object ID: 390831 Blocks used: 59659618 (116522.69Mb)

#bbstoreaccounts setlimit account_name 30000M 35000M

#bbstoreaccounts check account_name

#bbstoreaccount check account_name fix

#bbstoreaccounts delete account_name

#bbstored-certs /ca sign ↵ /etc/boxbackup/bbackupd/account_name-csr.pem

Blocks used by old files: 110818 (216.44Mb)Blocks used by deleted files: 1670369 (3262.44Mb) Blocks used by directories: 73637 (143.82Mb) Block soft limit: 61440000 (120000.00Mb) Block hard limit: 64000000 (125000.00Mb) Client store marker: 1145862657000000

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

11№5, май 2006

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

Однако на данный момент использование Boxi невоз-можно. Причина в том, что эта утилита может работать толь-ко с версией Box Backup 0.09, а как я уже писал выше, вер-сия 0.10 претерпела множество изменений и рекомендо-вана к уставновке. По словам разработчика этой утилиты, следующей версии Boxi, готовой к работе с Box Buckup 0.10, следует ожидать не ранее чем через три месяца.

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

Следует так же отметить, что для работы Boxi нуждает-ся во всех конфигурационных файлах Box Backup-системы. Поэтому при её использовании многие запускают процесс bbackupd не от системы, а от своего пользователя.

Резервное копирование Windows-системПока что я обходил вниманием использование системы ре-зервного копирования Windows-рабочих станций (и серве-ров, конечно). Объясню почему.

На сайте [2] вы можете найти Windows native client, ра-ботающий, как минимум, в системах семейства Windows 2000 и Windows XP. В архиве вы найдёте все необходимые файлы, которые рекомендуется скопировать в директорию c:\Program Files\Box Backup\.

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

На любой вашей Linux-системе, предварительно сохра-нив директорию /etc/boxbackup/bbackupd в надёжном мес-те, сформировать сертификаты для Windows-системы. А по-чему нет? Ведь не важно, где будет создан ключ шифро-вания и сертификат. После этого останется только подпи-сать вновь созданный сертификат и передать необходимые файлы на Windows-систему. И не забудьте вернуть содер-жимое папки bbackupd на его законное место.

Таким образом осуществление «горячего» резервного копирования на Windows рабочих станциях так же стано-вится весьма простой задачей.

В MS Windows вам точно так же доступны все опции кон-фигурационных файлов Box Backup и оба режима – lazy, snapshot. Для того чтобы проинсталировать bbackupd в ка-честве системного сервиса достаточно запустить команду:

Графическая оболочка Boxi также существует под Windows, но по описанным выше причинам она вам вряд ли пока пригодится, только если вы не собираетесь вернуться к версии 0.09 Box Backup.

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

FileEncKeys.raw. Поэтому настоятельно рекомендуется ско-пировать содержимое всех папок /etc/boxbackup/bbackupd в какое-то выделенное, защищённое от несанкционирован-ного доступа место, а также перенести на внешний носи-тель и убрать подальше.

В случае утраты ключа восстановление файлов из ар-хива станет невозможным.

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

Удачного вам горячего резервного копирования!

Ссылки:1. http://boxi.sourceforge.net2. http://boxbackup.hostworks.ca/index.php/0.10

Рисунок 1. Вывод справки утилитой bbackupquery

Рисунок 2. Список директорий (по меткам из конфигурационного файла)

Рисунок 3. Аскетичная Boxi

bbackupd -i

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

12

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

Среди системных администра-торов, особенно начинающих, бытует мнение, что Sendmail –

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

будут помнить червя Морриса, потряс-шего мир в 1988 году) серьёзно подор-вали доверие к Sendmail в плане защи-щённости системы.

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

эффективной, появилось более чёт-кое разделение на задачи, причём уже не все из них требуют наличия прав су-перпользователя. Говоря же о безопас-ности, надо признать, что последняя критическая уязвимость была обнару-жена сравнительно недавно – 22 марта 2006 года (к чести разработчиков, бы-ла она исправлена достаточно быстро). Но вот предпоследняя датируется аж 18 сентября 2003 года.

Конечно, если сравнивать Sendmail с такими альтернативами, как Postfix, Exim, Qmail, то по некоторым пара-метрам он проигрывает своим конку-

Как работает Sendmail?Полезные подробности

Современная жизнь немыслима без электронной почты. Ещё лет десять назад само понятие «электронная почта» прочно ассоциировалось с программой Sendmail. Сейчас ситуация несколько изменилась, но проект Sendmail по-прежнему остаётся одним из лидеров, и вполне заслуженно.

Сергей Супрунов

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

13№5, май 2006

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

рентам. Но только не в плане функциональности. Так что вряд ли стоит так просто сбрасывать его со счетов. Тем бо-лее что Sendmail по-прежнему остаётся почтовой програм-мой, устанавливаемой по умолчанию во FreeBSD, OpenBSD, Solaris и ряде других систем.

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

Всё, о чём будет идти речь сегодня, относится к вер-сии Sendmail 8.13.4 с последним патчем, работающей во FreeBSD 6.0 (используется дистрибутивная установка). Применимость утверждений, примеров конфигурации, пу-тей к файлам и т. д. к другим системам и версиям не про-верялась, но в большинстве случаев всё должно работать аналогично.

Учитывая, что на системах Linux в последнее время бо-лее распространён Postfix (за исключением некоторых дис-трибутивов), отвлекаться на особенности Sendmail в этих системах я не буду.

Архитектура и основы функционированияКак уже упоминалось, Sendmail является монолитной программой. Единственный двоичный файл – /usr/sbin/mailwrapper – отвечает за все функции, но вручную его обыч-но не запускают. Все же программы, которыми мы обычно пользуемся, являются не более чем простыми символьны-ми ссылками на этот «бинарник»:

Если говорить точнее, то собственно работа выполня-ется файлом /usr/libexec/sendmail/sendmail, а mailwrapper, как следует из его названия, является «обёрткой» к этому файлу. Система, как правило, пользуется ссылкой sendmail, остальные же запускаются администратором для решения конкретных задач.

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

Чем же они занимаются? Два верхних (с PID 596 и 600 соответственно) запускаются при старте системы и посто-янно присутствуют в памяти. Первый, как следует из опи-сания, обслуживает входящие соединения, поступающие на порты, выделенные для SMTP-соединений:

Как видите, помимо стандартного 25-го порта на обслу-живаемых интерфейсах (рассматриваемая система име-ет две сетевые карты – внешнюю, с условным IP-адресом 1.2.3.4, и внутреннюю – 10.0.0.254, а также непременный loopback-интерфейс 127.0.0.1) процесс 596 прослушивает порт 587. Этот порт (в /etc/services определён как «submission 587/tcp») предназначен согласно RFC 2476 для приёма но-вых писем от клиентов, чтобы не перегружать данной ра-ботой основной, 25-й порт, служащий для пересылки сооб-щений между серверами. (То есть более правильно в на-стройках почтовых клиентов – The Bat, Thunderbird, Outlook и проч. – указывать для исходящих соединений 587-й порт.) В настоящее время протокол Submission используется не слишком широко, и клиенты для отправки электронной поч-ты задействуют тот же 25-й порт, но ничего плохого в том, что данный порт открыт, в принципе нет. Тем более что дан-ная рекомендация (я про RFC 2476) рано или поздно должна стать популярной. UNIX-сокет на /var/run/logpriv (с дескрип-тором 4) используется для записи журнальной информации с помощью syslog (обратите внимание, что поскольку этот процесс sendmail работает с правами суперпользователя, то используется привилегированный сокет).

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

serg$ ls -l /usr/sbin | grep mailwrapper

lrwxr-xr-x 1 root wheel 21 11 ноя 10:01 hoststat -> /usr/sbin/mailwrapper-r-xr-xr-x 1 root wheel 5236 11 ноя 10:01 mailwrapperlrwxr-xr-x 1 root wheel 21 11 ноя 10:01 purgestat -> /usr/sbin/mailwrapperlrwxr-xr-x 1 root wheel 21 11 ноя 10:01 sendmail -> /usr/sbin/mailwrapper

serg$ ls -l /usr/bin | grep mailwrapper

lrwxr-xr-x 1 root wheel 21 11 ноя 10:01 mailq -> /usr/sbin/mailwrapperlrwxr-xr-x 1 root wheel 21 11 ноя 10:01 newaliases -> /usr/sbin/mailwrapper

serg$ ps awxo pid,user,command | grep sendmail | grep -v grep

596 root sendmail: accepting connections (sendmail) 600 smmsp sendmail: Queue runner@00:30:00 for /var/spool/clientmqueue (sendmail)83329 root sendmail: k35B3pRn083329 [59.42.1.71]: DATA (sendmail)83670 root sendmail: server N023143.ppp.ne.jp [61.20.23.14] cmd read (sendmail)

serg$ sockstat | grep 596

root sendmail 596 3 tcp4 1.2.3.4:25 *:*root sendmail 596 4 dgram -> /var/run/logprivroot sendmail 596 5 tcp4 127.0.0.1:25 *:*root sendmail 596 6 tcp4 10.0.0.254:25 *:*root sendmail 596 7 tcp4 *:587 *:*

Как всё начиналосьВ конце семидесятых Эрик Олман (Eric Allman), работая в Универ-ситете Беркли, бился над одной проблемой – как обмениваться электронной почтой в университетской сети, объединяющей не-сколько машин, взаимодействующих между собой по разным про-токолам. Существовали, конечно, отдельные программы, обеспе-чивающие взаимодействие каждой пары машин, но Эрику хоте-лось создать именно универсальную программу.

И вот в 1983 году появилась первая версия программы Sendmail, основанной на менее универсальной delivermail (раз-работанной для сети ARPANET). Первоначально созданная для BSD 4.1c, она постоянно развивалась, переносилась на дру-гие системы. Многие компании брали Sendmail за основу для пос-троения собственных почтовых программ.

В настоящее время наиболее известной и распространён-ной версией Sendmail является открытая программа, разрабаты-ваемая Sendmail Consortium при спонсорской помощи компании Sendmail Inc. Последняя выпущенная версия – 8.13.6.

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

14

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

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

Ах да, я же ещё не рассказал, что такое очередь! Ничего, скоро этот про-бел будет восполнен…

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

Передача сообщения от локаль-ного пользователя на удалённый сер-вер выполняется в следующем поряд-ке (см. рис. 2):1. Локальный клиент (MUA – Mail User

Agent), такой как утилита mail, вы-зывает процесс send-mail (выступа-ющий в роли MSA – Mail Submission Agent).

2. Процесс send-mail принимает со-общение, переданное клиентом, и подключается на 25-й порт хоста localhost.

3. Процесс, прослушивающий соеди-нения на 25-м порту, порождает до-черний процесс sm1 для обработки данного соединения.

4. Sm1, приняв сообщение и поста-вив его в очередь, предпринима-ет попытку передать его получате-лю, для чего составляет маршрут движения письма и устанавлива-ет соединение с первым сервером (в большинстве случаев он же яв-ляется и последним, т.е. сервером, непосредственно обслуживающим домен получателя).

5. Дождавшись подтверждения о при-ёме сообщения от удалённого сервера, sm1 удаляет сообщение из очереди и завершает работу.

В случае транзитной передачи сна-чала выполняются пункты 1-4 алгорит-ма приёма сообщения, затем выполня-ется доставка согласно пунктам 4-5 ал-горитма передачи локального сообще-ния (см. рис. 3).

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

Если доставить сообщение по на-значению с налёта не удалось (из-за проблем с каналом, блокировки почто-

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

Кто кому родительИтак, при обработке сообщения для локального клиента, выполняется сле-дующая последовательность действий (см. рис. 1):1. Удалённый сервер, желая передать

нам сообщение, отправляет запрос на соединение на 25-й порт нашего сервера.

2. Процесс sendmail, обслуживающий соединения (тот, который в приме-ре выше имеет PID 596), порожда-ет дочерний процесс (назовём его sm1).

3. Дочерний процесс sm1 проверя-ет возможность принять данное сообщение (анализируя конверт, прежде всего «rcpt to:») и в случае положительного ответа помещает сообщение в очередь, в файлы qf (заголовки) и df (тело сообщения). Причём qf обычно создаётся в па-мяти и записывается на диск толь-ко в случае невозможности пере-слать письмо сразу. То есть оче-редь – это каталог, куда временно сохраняются почтовые сообщения, проходящие через сервер элект-ронной почты (по умолчанию ис-пользуется /var/spool/mqueue).

4. Если запись пройдёт успешно, Sendmail подтверждает факт при-ёма сообщения (принимая тем са-мым на себя всю ответственность за его дальнейшую судьбу) и завер-шает соединение с удалённым сер-вером.

5. Далее sm1 анализирует заголовок сообщения и принимает решение о том, что нужно с ним делать. Если оно предназначено для локально-го пользователя, то вызывается ло-кальный агент доставки, LDA (Local Delivery Agent), которому даётся по-ручение положить письмо в почто-вый ящик пользователя.

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

Рисунок 1. Приём сообщения

Рисунок 2. Передача сообщения

Рисунок 3. Транзитная передача

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

15№5, май 2006

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

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

Возвращаясь к процессамКак видите, Sendmail может выступать в трёх ипостасях – MTA, MSA и MDA. В таких инструментах, как Postfix и Qmail, применяется понятная структура «одна задача – одна про-грамма». Здесь же всё делает один исполнимый файл. Так что не мудрено, что он обладает огромным количест-вом самых разных параметров. Перечислю здесь наибо-лее востребованные (за подробностями обратитесь к стра-нице man sendmail(8)): -b: этот ключ указывает на то, что необходимо выпол-

нить какое-то действие, и всегда дополняется уточня-ющим ключом;

-bd: работать в режиме демона; -bm: работать в режиме отправки сообщения – анало-

гично команде mail; -bs: выводить команды SMTP на стандартный вывод

(фактически, то же самое, что и «telnet localhost 25»); -bt: работать в режиме тестирования (позволяет выпол-

нить ряд команд, например, обработать адрес или оп-ределить MX-запись для хоста);

-bv: проверить адрес получателя (фактически, «раз-ворачивает» псевдонимы, показывая реального поль-зователя или скрипт, которые получат письмо). Сле-дующий пример показывает, что на моей системе ад-ресу postmaster соответствует скрипт maildigest.py, ис-пользуемый для обработки сообщений антивирусно-го пакета и сбора статистики по вирусной активности на узле:

Другие полезные ключи: -C: с помощью этого ключа вы можете указать альтер-

нативный файл конфигурации (отличный от /etc/mail/sendmail.cf).

-q: этот ключ задаёт период обработки очереди. Напри-мер, указанный как -q30m, он установит обработку оче-реди сообщений каждые 30 минут.

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

-d: эти ключи задают уровень отладки.

Вот, кстати, приём, позволяющий получить информа-цию о версии вашего Sendmail:

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

ные для решения конкретных задач. В таблице 1 приво-дится соответствие «специализированной» команды клю-чам программы sendmail.

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

Основы настройкиКак же всё это настраивается? Начиная с 4-й (если не оши-баюсь) ветви, в системе FreeBSD основные настройки со-средоточены в каталоге /etc/mail (ранее, по крайней мере в 3.5-RELEASE, они размещались непосредственно в /etc). Здесь вы найдёте следующие основные файлы: your.domain.mc: основной конфигурационный файл

(так называемый master config, или просто mc-файл). Его имя будет соответствовать доменному имени ваше-го сервера. Именно в него вносятся необходимые изме-нения, и на его основе автоматически будет собирать-ся рабочий файл sendmail.cf.

your.domain.submit.mc: конфигурационный файл для работы в режиме доставки сообщений, когда Sendmail не обслуживает внешние соединения, а только отправ-ляет почту от локальных пользователей (в этом слу-чае Sendmail запускается с правами обычного поль-зователя и использует для работы очередь /var/spool/clientmqueue).

sendmail.cf, submit.cf: рабочие файлы конфигурации, которые и использует Sendmail. Настоятельно не реко-мендуется вносить в них исправления вручную, хотя ник-то и не запрещает это делать. Просто нужно иметь в ви-ду, что в данном случае все сделанные вами изменения будут потеряны при первом же выполнении make install, поскольку утилита make при сборке cf-файлов руководс-твуется исключительно данными, содержащимися в mc-файлах. Безусловно, учитываются и m4-шаблоны, разме-щённые в /usr/share/sendmail/cf/, но их тоже лучше не из-менять.

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

access: этот файл позволяет управлять доступом к поч-товому серверу извне. Например, вы можете запретить доступ из конкретной подсети или разрешить пересылку (relaying) почты для некоторых нелокальных адресов.

local-host-names: список хостов (их доменных имён), для которых сервер Sendmail будет принимать почту.

root# sendmail -bv postmaster

"| /usr/local/scripts/maildigest/maildigest.py"... deliverable: mailer prog, user "| /usr/local/scripts/maildigest/maildigest.py"

Version 8.13.4

serg$ echo '' | /usr/sbin/sendmail -bt -d0 | grep Version

Таблица 1. Ключи sendmail и специальные ссылки

Команда sendmail Ссылка-аналог Назначение

sendmail -bi newaliases Пересоздаёт базу псевдонимов

sendmail -bp mailq Работа с очередью сообщений

sendmail -bh hoststat Статистическая информация

sendmail -bH purgestat Очистка статистики

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

16

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

Используется, в частности, для организации виртуаль-ного почтового хостинга.

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

То есть для обработки почты локального пользователя

account будет использоваться протокол UUCP с соот-ветствующим преобразованием адреса.

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

mailer.conf: конфигурационный файл для /usr/sbin/mailwrapper. Здесь задаётся соответствие «удобных» имён файлов, таких как mailq, реально вызываемому двоичному файлу. Например, согласно такой строке в этом файле:

если mailwrapper будет вызван по ссылке mailq, то он за-пустит программу sendmail, которая размещается по ука-занному пути. Собственно говоря, любая команда будет запускать этот файл (архитектура-то монолитная), но те-оретически здесь заложена возможность использовать для тех или иных задач внешние файлы или в дальней-шем безболезненно перейти на модульную структуру (это, в частности, используется в Postfix).

helpfile: здесь размещаются строки, которые Sendmail будет выводить во время SMTP-сеанса в ответ на ко-манды HELP.

Более подробно использование того или иного файла будет рассматриваться во второй части статьи.

Обратите внимание, что около aliases, access и ряда других будут размещаться файлы с таким же именем, но суффиксом «.db». Это базы (обычно в формате hash, но также поддерживаются dbm и btree), которые и использу-ет Sendmail в своей работе, чем достигается сокращение времени, расходуемого на разбор этих файлов. Следова-тельно, после внесения изменений в «хэшируемые» кон-фигурационные файлы вы должны пересоздавать соот-ветствующие базы.

Традиционно это выполняется командой makemap (для базы aliases – команда newaliases, являющаяся одной из ссылок на mailwrapper). Однако разработчики FreeBSD предоставили нам замечательный Makefile, который дела-ет большую часть работы по обслуживанию почтовой сис-темы, самостоятельно вызывая необходимые служебные утилиты.

В данном случае достаточно перейти в каталог /etc/mail и выполнить команду make:

При этом make самостоятельно определит, какие фай-лы были изменены, и пересоздаст соответствующие ба-зы. Если были изменения в конфигурационном mc-файле, то эта же команда построит на его основе cf-файл (напри-мер, your.domain.cf; далее нужно будет ещё выполнить make install, чтобы этот файл был скопирован как sendmail.cf). При желании вы можете явно указать, что именно должно быть пересобрано:

Как видите, всё предельно просто. Кстати, раз уж у нас зашла речь о Makefile, помимо сборки и установки конфи-гурационных файлов, он же позволяет управлять запуском/остановом/перезагрузкой необходимых процессов (make start, make stop, make restart соответственно). Можно даже работать по отдельности с каждым процессом:

Нужно заметить, что сами команды управления про-цессами размещаются в /etc/rc.sendmail. Makefile лишь вы-

Несколько слов про SMTPSimple Mail Transfer Protocol (SMTP) – простой протокол переда-чи электронной почты – является основным протоколом, на кото-ром основана работа электронной почты в сети Интернет. Описан он в RFC 821, который дополнен рядом других рекомендаций. На-иболее серьёзным дополнением (скорее даже заменяющим доку-ментом) является RFC 2821, описывающий расширенный протокол SMTP и более соответствующий современным реалиям.

SMTP является, скажем так, «терминальным» протоколом, то есть взаимодействие двух систем осуществляется путём об-мена текстовыми строками. Клиент (хост, инициировавший со-единение) передаёт на сервер (хост, принимающий соединение) команды, состоящие из четырёх букв и следующих далее пара-метров. Сервер отвечает трёхзначным числовым кодом с после-дующей строкой-пояснением.

Типичный пример SMTP-диалога может выглядеть таким об-разом:

Как видите, смоделировать работу SMTP-протокола достаточ-но просто. Но нужно заметить, что полная поддержка протокола – достаточно сложная задача, требующая учёта многих факторов.

serg$ telnet localhost 25Connected to localhost.Escape character is '^]'.220 server.ru ESMTP Sendmail 8.13.4/8.13.4; .. ..HELO me.domain.ru250 server.ru Hello localhost [127.0.0.1], pleased to meet youMAIL From: [email protected] 2.1.0 [email protected]... Sender okRCPT To: [email protected] 2.1.5 [email protected]... Recipient okDATA354 Enter mail, end with "." on a line by itselfHello! It’s a test message..250 2.0.0 k3BAK9Je017265 Message accepted for deliveryQUIT221 2.0.0 server.ru closing connectionConnection closed by foreign host.

root# cd /etc/mailroot# make

root# make aliases

/usr/sbin/sendmail -bi -OAliasFile=/etc/mail/aliases/etc/mail/aliases: 167 aliases, longest 47 bytes, 2529 bytes totalchmod 0640 /etc/mail/aliases.db

root# make restart-mspqroot# make stop-mta

mailq /usr/libexec/sendmail/sendmail

account.myserver.ru uucp-dom : account

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

17№5, май 2006

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

зывает этот сценарий с нужными параметрами. Обратите внимание, что в рассматриваемой версии FreeBSD запуск sendmail при загрузке системы может выполняться дру-гим сценарием – /etc/rc.d/sendmail. Это более соответству-ет принятому начиная с 5-й ветви порядку инициализации (он был позаимствован из NetBSD), но подобное «двоев-ластие» может в некоторых случаях привести к путанице и ошибкам (например, если вам нужно внести в эти файлы какие-то специфические изменения, то приходится особо следить за их синхронизацией).

Раз уж мы заговорили о сценариях инициализа-ции, рассмотрим параметры rc.conf, определяющие ра-боту Sendmail. Основные настройки сосредоточены в файле /etc/defaults/rc.conf. По умолчанию переменная sendmail_enable установлена в значение «NO», что под-разумевает работу Sendmail только для отправки сообще-ний локальных пользователей. MTA, обслуживающий вне-шние соединения, запускаться не будет. Чтобы разрешить работу Sendmail в режиме MTA, следует установить значе-ние этой переменной в «YES». Кстати, если вы хотите пол-ностью запретить работу Sendmail, используйте значение «NONE», а не «NO».

Обратите внимание на одну важную переменную:

Именно она определяет, какой из сценариев – /etc/rc.sendmail или /etc/rc.d/sendmail – будет использоваться при загрузке системы. По соображениям «однозначности» лучше оставить использование rc.sendmail, как это и пре-дусмотрено по умолчанию.

Подробнее узнать об опциях, которые вы можете изме-нить, можно в самом файле /etc/defaults/rc.conf – он доста-точно хорошо прокомментирован. Ну и при необходимос-ти что-то переопределить внесите соответствующие стро-ки в /etc/rc.conf (надеюсь, вы даже спросонья без запинки скажете, почему не рекомендуется делать изменения не-посредственно в default-скриптах).

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

Директива divert() служит для переключения режимов макропроцессора. Собственно, сама конфигурация начи-нается после divert(0), поэтому между указанными строка-ми часто помещают комментарии к файлу. Буквы dnl, при-сутствующие в конце каждой строки, в m4 означают конец

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

Тип операционной системы. Согласно данному пара-метру m4 будет выбирать необходимые для работы шаб-лоны (из /usr/share/sendmail/cf/ostype/), поэтому очень важ-но следить здесь за актуальностью информации (особен-но когда выполняется обновление системы на другую «вет-ку»). В первую очередь от этого параметра зависят приня-тые в той или иной системе полные имена агентов достав-ки (LDA), используемые флаги и т. д.

Ещё один параметр, влияющий на выбор шаблонов. Шаблоны можно найти в /usr/share/sendmail/cf/domain/, в большинстве случаев следует использовать домен «generic». Впрочем, если вам нужны специфические пара-метры, которые по тем или иным причинам вам не хотелось бы выносить в конфигурационный файл, можно создать здесь свой «доменный» шаблон (посмотрите здесь же при-меры для доменов Berkley.EDU) и использовать его.

Подобным образом указывается, на каких адресах и пор-тах следует прослушивать входящие соединения. Первая строка из приведённых (закомментированная) указывает ожи-дать входящие соединения на всех IPv4-интерфейсах. Если прослушивать нужно только конкретные интерфейсы, можно поступить так, как показано в последующих двух строках.

Эти строки задают использование файла local-host-names и указывают путь к нему.

Данные две директивы (сейчас они закомментированы)

mta_start_script="/etc/rc.sendmail"

divert(-1)dnl. . . . .divert(0)dnl

OSTYPE(freebsd6)dnl

DOMAIN(generic)dnl

dnl DAEMON_OPTIONS('Name=IPv4, Family=inet')dnlDAEMON_OPTIONS('Port=smtp,Addr=1.2.3.4,Name=MTA')dnlDAEMON_OPTIONS('Port=smtp,Addr=127.0.0.1,Name=MTA')dnlDAEMON_OPTIONS('Port=smtp,Addr=10.0.0.254,Name=MTA')dnl

FEATURE(use_cw_file)dnldefine('confCW_FILE', '-o /etc/mail/local-host-names')dnl

dnl FEATURE('accept_unqualified_senders')dnldnl FEATURE('accept_unresolvable_domains')dnl

Что такое UUCP?Unix to Unix Copy Program (UUCP) – некогда очень популярный протокол взаимодействия между удалёнными хостами. Пере-сылка электронной почты не была его единственной обязаннос-тью, но эта услуга была наиболее востребована. Sendmail, будучи разработанным как универсальный почтовый сервер, призванный объединить разнородные сети, обладает поддержкой этого про-токола (правда, реализация осуществляется сторонней програм-мой – во FreeBSD это Taylor UUCP, установить её можно из кол-лекции портов: /usr/ports/net/freebsd-uucp).

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

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

18

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

позволяют несколько ослабить требования стандартов. Пер-вая разрешает обслуживать не полностью квалифицирован-ных отправителей (т.е. не имеющих полного имени формата user@domain). Вторая допускает работу с доменами, для ко-торых не удалось определить их DNS-имя по IP-адресу.

Эти строки описывают пути к специальным файлам конфигурации. Обратите внимание, что имена баз указа-ны без суффикса «.db».

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

из указанных списков. Для таких адресов Sendmail выдаёт код 550 и разрывает соединение. Если же адреса в базе rbl-сервера нет, то соединение принимается. На страни-цах журнала уже неоднократно обсуждались недостатки такого подхода, так что использовать его следует с осо-бой аккуратностью.

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

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

Эта опция позволяет задать ряд дополнительных фла-гов, управляющих работой протокола SMTP. В данном слу-чае запрещается выполнять smtp-команды VRFY и EXPN, которые по умолчанию позволяют любому пользователю (в том числе и спамеру) достаточно легко проверить нали-чие на сервере конкретного почтового ящика и «развер-нуть» списки рассылки (если таковые имеются).

Ну а так указывается, какие агенты доставки будут ис-пользоваться. Здесь определены локальный агент достав-ки (LDA), и использование протокола SMTP для доставки на удалённые серверы (MDA). Закомментированная стро-ка отвечала некогда за подключение агента, работающего по протоколу UUCP, ныне практически вымершему.

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

После этого Sendmail будет перезапущен в новой кон-фигурации.

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

define('confMAX_DAEMON_CHILDREN','45')dnl

define('confPRIVACY_FLAGS', 'noexpn,novrfy')dnl

MAILER(local)dnlMAILER(smtp)dnldnl MAILER(uucp)

root# cd /etc/mailroot# makeroot# make installroot# make restart

Системы-конкурентыПо различным данным, среди наиболее популярных открытых сер-веров электронной почты наблюдается примерно такое соотно-шение: Sendmail – 24%, Postfix – 17%, Exim – 9%, Qmail – 4%. Если сравнить эти цифры с данными за 2001 год (соответственно 42%, 2%, 1%, 17%), то можно отметить довольно существенное сниже-ние доли Sendmail, прежде всего за счёт Postfix, активно исполь-зуемого на небольших серверах и домашних системах. Тем не ме-нее, Sendmail по-прежнему занимает лидирующие позиции.

В качестве основных характеристик конкурирующих откры-тых систем можно отметить следующие:

Postfix: выросший из IBM Secure Mailer разрабатывается как быстрая и безопасная альтернатива Sendmail. Отличается мо-дульной структурой, простым форматом конфигурационного фай-ла. Благодаря имитации взаимодействия Sendmail с операцион-ной системой миграция на Postfix может быть выполнена сравни-тельно безболезненно.

Exim: был разработан в 1995 году Филипом Хазелем (Philip Hazel) на базе MTA Smail для почтовой системы Кембриджского университета. Достаточно мощная и гибкая почтовая система. К её преимуществам также часто относят хорошую документирован-ность. Как и Sendmail, имеет монолитную архитектуру, но (по от-зывам) работает несколько быстрее.

Qmail: при разработке этого MTA (автор – Даниэль Бернштайн (Daniel J. Bernstein)) основной акцент делался на вопросах безопас-ности. Имеет модульную структуру. Для решения различных задач запускает процессы от имени разных пользователей, чем дости-гается максимальный уровень защищённости в случае обнаруже-ния проблем в одном из модулей. Довольно странную лицензию, допускающую распространение только в исходных кодах и сильно осложняющую развитие программы (текущая версия – 1.03 – да-тируется аж 1998 годом), можно назвать одной из причин, по ко-торым Qmail стремительно теряет популярность.

Существуют и другие MTA (например, Comminigate Pro), име-ющие свои достоинства и недостатки. В общем выбирать есть из чего.

define('confMAX_MESSAGE_SIZE', '12500000')dnl

FEATURE(mailertable, 'hash -o /etc/mail/mailertable')dnlFEATURE(access_db, 'hash -o -T<TMPF> /etc/mail/access')dnlFEATURE(virtusertable, 'hash -o /etc/mail/virtusertable')dnl

FEATURE(blacklist_recipients)dnldnl FEATURE('dnsbl', 'sbl.spamhaus.org')dnlFEATURE('dnsbl', 'relays.ordb.org')dnlFEATURE('dnsbl', 'dul.ru')dnlFEATURE('dnsbl', 'bl.spamcop.net')dnl

Page 21: 042 Системный Администратор 05 2006
Page 22: 042 Системный Администратор 05 2006

20

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

Microsoft Windows SharePoint Services (WSS), входящие в состав Windows Server 2003,

простой в применении инструмент для совместного создания, редакти-рования, публикации и поиска инфор-мации сотрудниками компании. Удоб-ный графический интерфейс и мно-жество встроенных шаблонов позво-лят быстро получить «осязаемый» ре-зультат. Являясь платформой-конс-труктором, Microsoft SharePoint име-ет тысячи примеров реализации раз-личных задач из области маркетин-га, оказания сервисных услуг, рабо-ты с персоналом, сбора отчетности и других. А расширенные возможнос-ти по настройке и добавлению ново-го функционала с помощью Microsoft FrontPage и Microsoft Visual Studio поз-волят модернизировать любое реше-ние на базе WSS соответственно за-дачам компании.

Большинство возможностей WSS вы сможете оценить на примере узла, на котором располагается телефон-

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

о сотруднике. Персональные – имя, фамилия,

фотография. Рабочие – место работы (отдел)

и должность. Контактная информация – но-

мера телефонов, адрес элект-ронной почты и т. д.

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

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

Создаем веб-узелЭто первое, что необходимо сделать. При создании сайта нужно задать имя узла и его URL-адрес: «Телефонный

справочник» и http://server01/phones соответственно. После ввода требу-емых параметров обязательным ша-гом является выбор шаблона сайта. Все стандартно поставляемые шаб-лоны описаны на странице выбора. Отдельно стоит упомянуть шаблоны для создания рабочих областей. Все рабочие области представляют собой веб-узлы, ориентированные на конк-ретную задачу. Вследствие этого у них немного изменена стандартная фун-кциональность. Например, для рабо-чих областей собраний WSS пред-ставляют более тесную интеграцию с Outlook 2003 и немного ограничен-ные возможности веб-узла.

Для нашего веб-сайта подойдет шаблон «Пустой узел». После создания мы автоматически попадаем на глав-ную страницу узла (см. рис. 1), ее ад-рес: http://server01/phones/default.aspx.

Создаем список контактовСамый простой путь реализовать теле-фонный справочник на узле WSS – со-

Возможности технологии MS Windows SharePoint Services

Иван Хрипунов, Артем Черневский

Развитие современного отдела информационных технологий неизбежно связано с переходом от обслуживания базовой IT-инфраструктуры компании к созданию интранет-порталов и автоматизации бизнес-процессов. Один из эффективных инструментов для решения подобных задач – Microsoft SharePoint.

Page 23: 042 Системный Администратор 05 2006

21№5, май 2006

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

здать список на основе шаблона «Кон-такты». Для создания списка на глав-ной странице узла: http://server01/phones/default.aspx в верхней панели ссылок выбираем «Создать».

На странице создания находим раздел «Списки» и выбираем нужный нам шаблон – «Контакты». Открывает-ся страница создания нового списка. При заполнении полей обратите вни-мание на следующие моменты: В поле «Имя» введите название

списка по-английски – Employees (сотрудники). При создании спис-ка или библиотеки документов SharePoint использует значение этого поля для создания адреса URL. Если это поле целиком состо-ит из национальных символов, ад-рес будет сформирован из стан-дартной строки: List, List1, DocLib и т. д. При наличии в этом поле сме-шанного набора символов (латинс-ких, национальных и спецсимволов «&, *» и т. д.) в URL попадут только латинские. Пробелы будут замене-ны кодами «%20». Если получив-шийся адрес уже существует, в ко-нец будет добавлена цифра. Исхо-дя из этого, рекомендуется при со-здании задавать имена латински-ми символами, заменяя пробелы знаками подчеркивания. Это обес-печит более удобное чтение и вос-произведение адреса URL. Впос-ледствии имя можно будет изме-нить, но адрес URL не изменится.

Выберите, будет ли список отобра-жаться на панели быстрого запус-ка. Для облегчения доступа к спис-ку с главной страницы отметим «Отображать этот список на пане-ли быстрого запуска? : Да».

Заполнив все поля, нажимаем кнопку «Создать». Попадаем на стра-ницу представления «Все контакты» (AllItems.aspx) вновь созданного спис-ка, его адрес – http://server01/phones/Lists/Employees/AllItems.aspx – легко читается и воспроизводится: сервер (server01); сайт телефонного справоч-ника (phones); списки (lists); сотрудни-ки (employees).

Имя файла представления можно не указывать – в этом случае откроет-ся представление по умолчанию.

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

На странице представления также присутствует панель ссылок или па-нель инструментов, она содержит сле-дующие команды: Создать элемент – создает новую

запись в списке; Фильтр – позволяет задать фильтр

по любому из представленных по-лей;

Изменить в таблице данных – по-казывает информацию в виде таб-лицы, по аналогии с листом Excel;

Связать с Outlook – открывает в приложении Outlook папку кон-тактов, связанную с данным спис-ком. Эта команда доступна толь-ко в списках, созданных с исполь-зованием шаблона «Контакты» или «События»;

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

Названия полей представлены ги-перссылками для осуществления сор-тировки.

Изменяем общие параметрыПереходим по ссылке «Изменить на-стройки и столбцы». Открывается страница настройки списка. Первый раздел – «Общие параметры» содер-жит ссылки на изменение общих на-строек списка, сохранение в качестве шаблона, удаление, настройку разре-шений на данный список. Перейдем по ссылке «Изменить общие параметры» и на открывшейся странице парамет-ров изменим в поле «Имя» название «Employees» на «Сотрудники».

Раздел «Утверждение содержимо-го» позволяет настроить утверждение каждого элемента списка. Это озна-

Рисунок 1. Вид веб-узла после создания

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

Доступ через интернет-браузер. Версионность документов. Удобная настройка прав на доступ са-

мими пользователями. Оповещение пользователей об изме-

нениях содержимого списков и библи-отек файлов.

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

Даже когда вы находитесь вне сети. Возможность задания дополнительных

свойств документов в списке. Блокировка файлов определенных ти-

пов от публикации. Быстрый контекстный поиск информа-

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

Статистика доступа к файлам и дан-ным.

Преимущества SharePoint перед «традицонными» средствами работы с данными – почтой и файловыми серверами

Page 24: 042 Системный Администратор 05 2006

22

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

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

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

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

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

Для переименования переходим по ссылке «Организация» в спис-ке полей и на открывшейся страни-це в поле «Имя столбца» вводим «От-дел» и сохраняем изменения. Мы по-меняли только название поля. Его имя, «Company», осталось неизменным. Это важно понимать и помнить при ра-

боте со списками и библиотеками до-кументов. Например, при запросе дан-ных этого списка с помощью веб-сер-висов WSS, возвращено будет поле «Company», а не «Отдел».

Представления спискаНа данный момент у нас есть только одно представление – «Все контак-ты». Давайте рассмотрим его настрой-ки подробнее.

Переходим по ссылке на имени представления, попадаем на страницу «Изменение представления». На стра-нице видим уже привычное деление на разделы.

В разделе «Имя» можно изменить название и имя файла для данного представления. Будьте осторожны – если вы измените имя файла пред-ставления, файл *.aspx будет переиме-нован. Пользователи, имеющие пря-мые ссылки на данный файл, получат ошибку 404.

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

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

Также обратите внимание на по-ле «Изменить (ссылка на изменение элемента)». Если показать это по-ле в представлении, то для каждого элемента будет отображена картин-ка со ссылкой на форму изменения элемента.

Отмеченные в данном представ-лении столбцы служат для просмот-ра краткой информации о сотруднике. Это его имя, организация и контакт-ная информация – телефоны и адрес электронной почты. Наверное, полез-нее будет выводить вместо домашнего номер сотового телефона сотрудника. Снимаем отметку напротив поля «До-машний телефон» и устанавливаем ее у поля «Сотовый телефон». Также для поля «Сотовый телефон» задаем поря-док 5 – такой же, как у поля с домаш-ним телефоном. Заметьте, что поря-док полей автоматически изменился. Тот факт, что поле «Домашний теле-фон» имеет порядок 6, не должен сму-щать – это поле не отображается, и при следующем изменении представления всем полям будет выставлен правиль-ный порядок следования.

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

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

Раздел «Фильтр» позволяет отоб-рать элементы списка по определен-ным критериям. Вы можете указать не-сколько значений фильтра. Добавление полей производится нажатием на ссыл-

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

23№5, май 2006

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

ку «Другие столбцы…». Интересным моментом здесь является использова-ние в качестве условия значений «[Се-годня]» для полей с датами и «[Я]» для полей «Создатель» и «Автор измене-ний». Например, при указании условия «[Сегодня]» для поля «Создано» в пред-ставлении будут показаны все элемен-ты списка, созданные сегодня. А усло-вие «[Я]» для поля «Создатель» позво-лит отображать в представлении все элементы списка, созданные текущим пользователем. Нам не требуется ука-зание каких-либо фильтров для наше-го списка. Поэтому оставим этот раздел без изменений, то есть должен быть от-мечен пункт «Отображать в этом пред-ставлении все элементы».

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

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

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

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

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

Мы рассмотрели все разделы пред-ставления и внесли необходимые прав-ки. Нажимаем на кнопку «Ок» для со-хранения результатов и вновь попада-ем на страницу «Настройка».

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

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

лаем в качестве примера. На странице представления «Все контакты» на па-нели инструментов нажимаем кнопку «Создать элемент» (см. рис. 2).

Открывается страница ввода ново-го элемента со всеми полями для ввода. Красными звездочками отмечены те поля, заполнение которых обязатель-но. В нашем случае – это поле «Фами-лия». Вводим данные во все поля и на-жимаем кнопку «Сохранить и закрыть» на панели инструментов. Возвраща-емся в представление «Все контакты» и видим, что запись добавлена.

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

Рисунок 2. Ввод данных о сотруднике

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

24

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

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

Третий способ – импорт контактов из адресной книги Outlook. В качестве источника может служить и глобаль-ная адресная книга сервера Exchange. Для такого импорта служит кнопка «Импортировать контакты» на панели инструментов списка. После нажатия на кнопку необходимо выбрать кон-такты для импорта из адресной кни-ги и ответить на запрос об импорте из Outlook.

Все описанные способы предпола-гают ручное обновление списка, а это не всегда удобно и, к сожалению, не га-

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

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

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

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

Для создания локальной копии списка на компьютерах пользовате-лей можно воспользоваться экспор-том в электронную таблицу или свя-зать данный список с Microsoft Office Outlook 2003. Экспортированные таким образом данные можно будет исполь-зовать в режиме оффлайн и при необ-ходимости синхронизировать.

Для экспорта списка в электрон-ную таблицу предназначена одноимен-ная ссылка, которая находится слева на панели «Действия». Имейте в виду, что при экспорте используются поля и данные текущего представления. Ра-нее мы создали представление «Табли-ца данных», его и можно использовать для экспорта. После нажатия на ссылку будет выдан запрос на открытие или со-хранение стандартного файла веб-за-проса Microsoft Office Excel 2003 –*.iqy, затем предупреждение Excel о безо-пасности открытия такого запроса. Эти запросы зависят от настроек безопас-ности Windows и Excel. После откры-тия на листе Excel отображается спи-сок с данными контактов сотрудников. Его можно сохранить и использовать локально. Впоследствии можно обнов-лять данные, запрашивая изменения на сервере, или редактировать список, отправляя данные на сервер, при нали-чии прав на эти операции.

Вы можете использовать список контактов в Outlook, для этого необ-ходимо на панели инструментов на-жать на кнопку «Связать с Outlook». В структуру папок Outlook будут до-бавлены «Папки SharePoint», где и бу-дут располагаться контакты из нашего списка. В папке Контакты в Outlook бу-дет добавлен раздел Общие контакты с данными из нашего списка на серве-ре. Этот список можно использовать автономно, и обновлять данные с сер-вера при необходимости. К сожалению, в Outlook нельзя редактировать дан-ные, полученные с серверов WSS. От-кройте карточку любого контакта и пос-мотрите, какие поля заполнены. Прото-кол передачи данных между SharePoint и Outlook поддерживает те поля, кото-рые по умолчанию присутствуют в спис-

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

По умолчанию на веб-узле существуют следующие группы: Читатель – доступ к веб-узлу только

на чтение. Участник – добавление содержимого

в существующие библиотеки докумен-тов и списки.

Веб-дизайнер – создание списков и библиотек документов; настройка страниц веб-узла.

Администратор.

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

Каждому списку, отдельно от разре-шений узла, могут быть назначены сле-

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

ми. Управление разрешениями списка. Управление списками.

Если права доступа на список не назна-чаются явно, то используются разрешения установленные для пользователя или груп-пы на уровне узла.

Также могут быть установлены разре-шения на уровне элементов списка. Поль-зователю можно разрешить просматривать все элементы списка или только свои; ре-дактировать все элементы, только свои или запретить редактирование элемен-тов. Эти разрешения не действуют при на-личии разрешения «Управление списками» у пользователя или группы, по умолчанию это право есть у группы «Администраторы» и «Веб-дизайнеры».

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

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

25№5, май 2006

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

ке, созданном на основе шаблона «Кон-такты». Мы не зря переименовали поле «Организация» в «Отдел» – иначе мы бы не смогли выгружать в Outlook све-дения об отделе, а они нам более важ-ны, раз речь идет о справочнике одной компании. Обратите внимание, что по-ле «Организация» в карточке контакта Outlook содержит сведения об отделе.

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

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

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

Для создания библиотеки на вер-хней панели ссылок нашего узла http://server01/phones выбираем «Со-здать». На странице создания идем по ссылке «Библиотека рисунков». Открывается страница создания но-вой библиотеки. Как видите, стра-ница аналогична странице создания списка. Добавлен лишь раздел «Вер-сии рисунков». В этом разделе любой библиотеки (рисунков, форм или до-кументов) можно включить поддержку версионности, то есть возможность сохранения и восстановления пре-дыдущих версий файла. Данная фун-

кциональность полезна при совмест-ной работе над документами, но тре-бует дополнительного дискового про-странства.

Заполняем поля на странице: В поле «Имя» вводим название по-

английски – photos (фотографии). В поле «Описание» вводим «Фото-

графии сотрудников». Выбираем, будет ли библиотека

отображаться на панели быстрого запуска.

В данной библиотеке поддержка версионности не нужна, поэтому отключаем ее.

Нажимаем кнопку «Создать». По-падаем в библиотеку рисунков, в пред-ставление по умолчанию «Все рисун-ки». Страница похожа на представле-ние списка.

Помимо представления «Все ри-сунки» в списке присутствует еще од-но. «Проводник» является стандарт-ным для всех библиотек документов и позволяет отображать файлы так, как если бы вы открыли папку в про-воднике Windows. Кстати, доступ к серверу SharePoint через провод-ник возможен – достаточно лишь ука-зать UNC-адрес. Для нашего сервера http://server01/phones/ путь будет вы-глядеть как \\server01\phones. При этом все компоненты веб-узла отображают-ся в виде папок и файлов. При работе с сайтом через проводник будьте вни-мательны – не удалите случайно слу-жебные папки или файлы!

Переименуем созданную библи-отеку на «Фотографии сотрудников». На панели «Действия» выберем «Из-менить настройки и столбцы», далее – «Изменить общие параметры» и в поле «Имя» введем новое название библио-теки. Сохраним изменения и вернем-ся в библиотеку.

У нас уже есть несколько записей в телефонном справочнике. Загрузим для них фотографии. На панели инс-трументов выберем «Добавить рису-нок». Здесь возможно указать один файл для загрузки в поле «Имя» или, перейдя по ссылке «Отправить не-сколько файлов», указать файлы в от-крывшемся окне проводника.Рисунок 3. Библиотека рисунков

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

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

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

Еще одним интересным моментом ис-

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

Взаимодействие с почтовым сервером

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

26

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

Стоит отметить, что для библио-теки рисунков для загрузки несколь-ких файлов открывается приложение Microsoft Office Picture Manager 2003, но только в том случае, если оно ус-тановлено. В Picture Manager нахо-дим нужные фотографии, выделя-ем их и нажатием кнопки «Отправить и закрыть» отправляем изображения в библиотеку.

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

использовать адрес электронной поч-ты или логин сотрудника. Мы так и сде-лаем (см. рис. 3).

Что дальше?Теперь нам надо добавить ссылку на фотографию в строку с контакта-ми сотрудника. Добавим в список но-вый столбец. Переходим на страницу настроек списка «Сотрудники», выби-раем «Добавить новый столбец». При-сваиваем имя столбца – photo. В слу-чае создания поля при вводе его име-ни, например, по-русски все символы будут заменены кодами. Это не меша-ет в дальнейшей работе, но все же ре-комендуется придерживаться правил именования с использованием латин-ских символов без пробелов.

Теперь необходимо выбрать тип столбца из следующих: Однострочный текст. В столбец

такого типа придется вводить ссыл-ку на рисунок вручную. В представ-лении будет отображаться актив-ная ссылка на фотографию.

Гиперссылка или рисунок. Дан-ные вводятся вручную, но отобра-жаться будет фотография.

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

Итак, вводим в поле «Формула» следующее:

Результатом работы формулы бу-дет полная ссылка на фото сотрудни-ка в библиотеке рисунков, основанная на его имени, которое указано в столб-це «Адрес электронной почты» до сим-вола «@». Каждый раз, когда вы буде-

Персонализация веб-сайтовWSS позволяют настраивать внешний вид страниц и представления списков индиви-дуально для каждого пользователя.

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

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

=СЦЕПИТЬ("http://server01/phones/ ↵ photos/";ЛЕВСИМВ ↵ ([Адрес электронной почты]; ↵ НАЙТИ("@";[Адрес электронной ↵ почты])-1);".jpg")

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

27№5, май 2006

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

Рисунок 4. Получившийся веб-узел

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

Сохраняем новый столбец. Теперь можно его переименовать, например, пусть его названием будет «Фото».

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

Переходим на главную стра-ницу сайта, в нашем примере это http://server01/phones. Заходим в вы-падающее меню «Изменить общую страницу». Если такого меню нет или оно называется «Изменить мою стра-ницу», возможно, у вас нет соответс-твующих прав. Краткое назначение пунктов меню: Добавить веб-части. Открыва-

ет страницу в конструкторе и окно со списком веб-частей. Кроме то-го, есть возможность поиска или импорта веб-части.

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

Изменить общие веб-части. От-крывает окно свойств выбранной веб-части для изменения ее на-строек.

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

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

Выберем пункт «Добавить веб-час-ти → Обзор». Перетащим мышкой веб-часть списка «Сотрудники» из правой части окна в левую.

Теперь необходимо настроить вне-шний вид веб-части – она не отобража-ет некоторых полей. Справа в заголовке веб-части нажмем кнопку со стрелкой вниз. Откроется меню веб-части. Его первые три пункта позволяют управ-лять отображением веб-части на стра-нице. Пункт «Свернуть» позволяет по-казывать только заголовок. Пункт «За-крыть» сделает веб-часть невидимой. Чтобы вновь ее отобразить, придет-ся открывать страницу во FrontPage или другом редакторе, совместимом с WSS. Для удаления веб-части со стра-ницы выберите «Удалить».

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

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

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

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

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

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

ЗаключениеСозданный в примере телефонный справочник вы можете модерни-зировать, расширив функциональ-ность и улучшив внешний вид. Для этого можно использовать редак-тор, совместимый с технологиями SharePoint, например Microsoft Office FrontPage 2003. Но это – тема для сле-дующих статей.

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

28

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

В предыдущей части статьи [1] мы подробно рассмотрели спо-собы, которые предоставляет

WMI системным администраторам для отслеживания и реакции на системные события. Из всех основных возмож-

ностей WMI нам осталось рассмотреть только специфику работы с различны-ми провайдерами. Как вы помните из предыдущей статьи [2], WMI на ниж-нем уровне имеет модульную расширя-емую архитектуру. Такая архитектура

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

Узнай секреты WMI: события и провайдерыЧасть II: ключ к управлению системой и приложениями

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

Константин Леонтьев

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

29№5, май 2006

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

но оформлены в виде DLL-библиотеки, взаимодействую-щей с WMI через COM+.

Замечу, что есть ряд провайдеров WMI, которые яв-ляются посредниками между WMI и другими широко рас-пространенными системами управления. К таким провай-дерам в частности относятся: WMI SNMP Provider и WMI Performance provider. Конечно же, в задачу системного ад-министратора не входит разработка провайдеров WMI – это удел программистов, однако весьма полезно иметь пред-ставление об основных провайдерах и их функциях.

В операционной системе Windows XP существует бо-лее 20 различных провайдеров WMI, каждый из которых решает свой собственный узкий набор задач. Кроме того, устанавливая драйверы, а также системное и прикладное программное обеспечение, вы можете обнаружить, что их разработчики включили в состав своего продукта допол-нительные WMI-провайдеры и классы. Из наиболее широ-ко известных программных продуктов, устанавливающих свои WMI-провайдеры, можно отметить следующие: Intel ProSet II, Citrix Metaframe и Presentation Server, Symantec Antivirus, Dell Open Manage, IBM DB2, HP Open View, Altiris Software Virtualization Solution, а также большинство продук-тов и сервисов Microsoft. Замечу, что это далеко не полный список, а лишь то, что наиболее часто встречается в кор-поративных сетях.

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

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

До выхода Windows XP эта задача оставалась на со-вести вызывающей программы и требовала от админис-тратора написания подпрограммы преобразования фор-матов. Несмотря на то что алгоритм этой подпрограммы довольно прост – это требовало дополнительных усилий. Пример такой подпрограммы представлен в листинге 1. Если взглянуть внимательно, то эта подпрограмма всего лишь разбирает дату и время, которые вернула система WMI, на составляющие и представляет в более удобном для чтения виде.

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

Некоторые усилия потребуются при отображении этих данных пользователю или сохранении их в отчете. С вы-ходом Windows XP эта задача стала решаться еще легче. В наборе объектов для сценариев WMI появился специаль-ный класс объекта SWbemDateTime. Он отвечает за пред-ставление даты и времени в удобном для чтения виде. То есть фактически проделывает ту же работу, что и фун-кция WMIDateStringToDate из листинга 1. Пример исполь-зования этого класса дан в листинге 2.

В дополнение к этим новым возможностям в самом ре-позитории WMI появились классы, представляющие ло-кальное время и часовой пояс не во внутреннем форма-те WMI, а в удобном для пользователя виде. Эти классы: Win32_LocalTime и Win32_TimeZone – удобное дополне-ние для работы с датами и временем. Кроме того, класс Win32_LocalTime рекомендуется использовать для отслежи-вания интервалов времени с помошью обработчиков собы-тий WMI, которым была посвящена предыдущая часть ста-тьи. Обратите внимане, что минимальный интервал време-ни, который позволяет отслеживать класс Win32_LocalTime, равен 1 секунде.

Сканирование хостов сети и провайдер PingПровайдер Ping предоставляет в репозиторий WMI всего один класс Win32_PingStatus. Они позволяют из сценариев

Листинг 1. Работа с датой и временем в WMI-сценариях. Работает на всех версиях ОС

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\cimv2")

Set objOS = objWMIService.ExecQuery("Select * ↵ from Win32_OperatingSystem")

For Each strOS in objOS

Листинг 2. Использование объекта SWbemDateTime. Работает только на Windows XP и новее.

Set dtmInstallDate = ↵ CreateObject("WbemScripting.SWbemDateTime")

strComputer = "."Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\cimv2")

Set objOS = objWMIService.ExecQuery("Select * ↵ from Win32_OperatingSystem")

For Each strOS in objOS dtmInstallDate.Value = strOS.InstallDate Wscript.Echo dtmInstallDate.GetVarDateNext

dtmInstallDate = strOS.InstallDate Wscript.Echo WMIDateStringToDate(dtmInstallDate)Next

Function WMIDateStringToDate(dtmInstallDate) WMIDateStringToDate = CDate(Mid(dtmInstallDate, ↵ 5, 2) & "/" & Mid(dtmInstallDate, 7, 2) & "/" & ↵ Left(dtmInstallDate, 4) & " " & ↵ Mid (dtmInstallDate, 9, 2) & ":" & ↵ Mid(dtmInstallDate, 11, 2) & ":" & ↵ Mid(dtmInstallDate, 13, 2))End Function

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

30

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

WMI посылать ICMP ECHO-запросы в сеть. Попросту пинго-вать хосты сети. К сожалению, этот провайдер поддержи-вается только в Windows XP и Windows Server 2003.

Если вам нужно написать сценарий WMI, который под-ключается к удаленной машине (как это делать, мы об-суждали в предыдущей статье [2]), то перед подключени-ем хорошо бы проверить – доступна ли эта машина. Ес-ли машина по сети не доступна (выключена или отсоеди-нена от сети), то подключение к WMI не состоится и в ваш сценарий будет возвращена ошибка. Сама по себе ошиб-ка не представляет большой проблемы, но перед тем как WMI вернет ее вам, пройдет довольно большой тайм-аут (около 30-60 секунд).

Таким образом, если вы запустите сценарий, который должен будет подключиться к 100 машинам по сети и 25 из них будут недоступны, то время выполнения сценария займёт от 15 до 30 минут.

Если мы сможем перед попыткой подключения к уда-ленной машине быстро проверить, доступна ли она, то это значительно сократит время ожидания. Вот как раз эту за-дачу и позволяет эффективно решать Ping. Вам следует не забывать, что проверка доступности хоста по ICMP эхо-запросу может быть неудачной и из-за применения в сети на маршруте следования пакета фильтрующих маршрути-заторов или firewall.

В операционных системах Windows 2000, а также Windows NT 4.0 и Windows 98 эту проблему можно было ре-шить только одним способом: запускать из сценария кон-сольную команду ping и разбирать то, что эта утилита вер-нула на STDOUT, или анализировать код возврата утили-ты PING. Пример представлен в листинге 3. Способ, конеч-но, не плохой, но не универсальный. Как известно, на ло-кализованных версиях Windows ответы команды ping вы-водятся на локальном языке. Поэтому для каждой языко-вой версии ОС пришлось бы писать свой разборщик выво-да – согласитесь, что это не удобно. С другой стороны ана-лиз кода возврата команды PING не позволяет понять при-чину ошибки при отправке ICMP-пакета.

Положение существенно поменялось с выходом Windows XP и Windows Server 2003 – теперь нет необходимости вы-зывать консольную команду ping. В нашем вооружении по-явился класс Win32_PingStatus. Запрос к этому классу поз-воляет выполнить это процедуру гораздо быстрее и проще. Этот способ не зависит от локализации операционной сис-

темы и предоставляет подробный отчет о статусе послан-ного ICMP-пакета и ответа на него.

Помимо мониторинга доступности хоста по сети, неза-менимый класс Win32_PingStatus позволяет решать и мно-жество других задач. В приведенном примере (см. лис-тинг 4) мы определяем MTU (Maximum Transmission Unit) трассы от нашего хоста к хосту удаленному. Для тех, кто не знаком с понятием MTU стека TCP/IP, я поясню: MTU – это максимальный размер пакета, который мо-жет быть передан по маршруту (трассе) от одного хоста до другого, не будучи фрагментирован (разрезан на час-ти для последующей сборки) ни одним промежуточным маршрутизатором.

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

Листинг 4. Определение максимального размера фрейма (MTU) трассы

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\CIMV2")

strDestAddress = "www.ya.ru"

If WScript.Arguments.Count > 0 Then strDestAddress = WScript.Arguments(0)End If

WScript.Echo "Посылаем ICMP-пакеты хосту: " & ↵ strDestAddress & " различного размера..."

varMaxPacket = 0For varBuffSize = 8 to 1472 step 8

Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM Win32_PingStatus where Address='" & ↵ strDestAddress & "' and BufferSize=" & varBuffSize & ↵ " and NoFragmentation=true and TimeOut=700" ,,48)

For Each objItem in colItems Select Case objItem.StatusCode Case 0 WScript.Echo "Ответ на ping-запрос за " & ↵ objItem.ResponseTime & " миллисекунд, ↵ TTL = " & objItem.ResponseTimeToLive & ↵ ", размер пакета ответа " & ↵ objItem.ReplySize Case 11001 WScript.Echo "Слишком маленький буфер" & ↵ ". Buffer Size is: " & varBuffSize Case 11002 WScript.Echo "Конечная сеть не доступна" & ↵ ". Buffer Size is: " & varBuffSize Case 11003 WScript.Echo "Конечный хост не доступен" & ↵ ". Buffer Size is: " & varBuffSize Case 11004 WScript.Echo "Протокол не доступен" & ↵ ". Buffer Size is: " & varBuffSize Case 11005 WScript.Echo "Конечный порт не доступен" & ↵ ". Buffer Size is: " & varBuffSize Case 11006 WScript.Echo "Недостаточно ресурсов" & ↵ ". Buffer Size is: " & varBuffSize Case 11007 WScript.Echo "Неверная опция IP" & ↵ ". Buffer Size is: " & varBuffSize Case 11008 WScript.Echo "Аппаратная ошибка" & ↵ ". Buffer Size is: " & varBuffSize Case 11009 If varMaxPacket = 0 Then varMaxPacket = ↵ varBuffSize - 8 WScript.Echo "Пакет превышает предельный ↵ размер трассы" & ". Buffer Size is: " & ↵ varBuffSize

Листинг 3. Старый способ, разбирающий вывод на STDOUT команды ping

strComputer = "www.ya.ru"

Set objShell = CreateObject("WScript.Shell")Set objScriptExec = objShell.Exec("ping -n 1 -w 700 –f ↵ –l 8 " & strComputer)

strPingResults = LCase(objScriptExec.StdOut.ReadAll)If InStr(strPingResults, "reply from") Then If InStr(strPingResults, "destination net unreachable") ↵ Then WScript.Echo strComputer & " не отвечает на ping." Else WScript.Echo strComputer & " отвечает на ping." End If Else WScript.Echo strComputer & " не отвечает на ping."End If

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

31№5, май 2006

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

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

Обработка системных журналовСледующий провайдер WMI, который может оказаться вам полезеным, – это провайдер системных журналов Windows. Классы, которые предоставляет в наше пользо-вание этот провайдер, имеют названия: Win32_NTLogEvent, W i n 3 2 _ N T Eve n t L o g F i l e , W i n 3 2 _ N T L o g Eve n t L o g , Win32_NTLogEventUser, Win32_NTLogEventComputer. Для нас наибольший интерес представляют первые два.

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

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

Следующий пример, приведенный на листинге 6, пока-зывает, как произвести очистку журнала приложений (хотя это может быть любой системный журнал аудита), исполь-зуя метод ClearEventlog класса Win32_NTEventlogFile. Поми-мо того, что нам необходимо указать привилегию Security, нам также необходимо открыть конкретный экземпляр объ-екта класса Win32_NTEventlogFile соответствующего жур-налу приложений.

Обратите внимание на единственный аргумент мето-да ClearEventlog: «c:\app.evt». Этот аргумент задает файл, в который при очистке журнала будет сохранено старое со-держимое журнала.

Работа с реестром из WMI и провайдер StdRegProvОдним из самых полезных провайдеров WMI является про-вайдер работы с реестром. В отличие от множества других провайдеров все его классы определены не в пространс-

Case 11010 WScript.Echo "Превышен интервал ожидания" ↵ & ". Buffer Size is: " & varBuffSize varBuffSize = varBuffSize - 8 Case 11011 WScript.Echo "Неверный запрос" & ↵ ". Buffer Size is: " & varBuffSize Case 11012 WScript.Echo "Неверный маршрут" & ↵ ". Buffer Size is: " & varBuffSize Case 11013 WScript.Echo "Достигнут максимальный ↵ TimeToLive" & ". Buffer Size is: " & ↵ varBuffSize Case 11014 WScript.Echo "Достигнут максимальный ↵ TimeToLive при сборке" & ↵ ". Buffer Size is: " & varBuffSize Case 11015 WScript.Echo "Ошибка параметра" & ↵ ". Buffer Size is: " & varBuffSize Case 11016 WScript.Echo "Требование снизить скорость ↵ передачи" & ". Buffer Size is: " & ↵ varBuffSize Case 11017 WScript.Echo "Переполнение опции IP" & ↵ ". Buffer Size is: " & varBuffSize Case 11018 WScript.Echo "Неверное назначение" & ↵ ". Buffer Size is: " & varBuffSize Case 11032 WScript.Echo "Установление соединения ↵ по IPSEC" & ". Buffer Size is: " & ↵ varBuffSize Case 11050 WScript.Echo "Общий сбой" & ↵ ". Buffer Size is: " & varBuffSize End Select Next

Next

WScript.Echo "Удалось определить MTU трассы: " & ↵ CStr(varMaxPacket + 28)

Листинг 5. Отслеживание событий в системных журналах аудита

strComputer = "."

Set objWMIService = GetObject("winmgmts: ↵ {impersonationlevel=impersonate,(security)}!\\" & ↵

Листинг 6. Очистка системного журнала приложений (Application Event Log)

strComputer = "."

Set objWMIService = GetObject("winmgmts: ↵ {impersonationlevel=impersonate,(security)}!\\" & ↵ strComputer & "\root\CIMV2")

Set objNTEventLog = objWMIService.Get ↵ ("Win32_NTEventlogFile.Name='C:\WINDOWS\system32\ ↵ config\AppEvent.Evt'")

objNTEventLog.ClearEventlog("c:\app.evt")

strComputer & "\root\CIMV2")

Set objEvents = objWMIService.ExecNotificationQuery _("SELECT * FROM __InstanceCreationEvent WHERE ↵ TargetInstance ISA 'Win32_NTLogEvent'")

Wscript.Echo "Ожидаем записи в системные журналы событий ..."Do While(True) Set objReceivedEvent = objEvents.NextEvent

Select Case ↵ CInt(objReceivedEvent.TargetInstance.EventType) Case 1 strType = "Ошибка" case 2 strType = "Предупреждение" case 3 strType = "Информация" case 4 strType = "Успешный аудит" case 5 strType = "Аудит отказа" End Select

WScript.Echo "----- Новое Событие -----" Wscript.Echo "Event ID: " & ↵ objReceivedEvent.TargetInstance.EventCode & ↵ " Значимость: " & strType & " Log: " & ↵ objReceivedEvent.TargetInstance.LogFile WScript.Echo "Сообщение: " & ↵ objReceivedEvent.TargetInstance.Message

Loop

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

32

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

тве имен root\CIMv2, а в пространстве имен root\default.В примере, приведенном в листинге 7, можно увидеть

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

Разберем пример, приведенный в листинге 7, под-робнее. Мы используем асинхронную технику обра-ботки внешних (extrinsic) событий WMI для класса RegistryValueChangeEvent.

В самом начале (сразу после подключения к репозито-рию WMI и классу StdRegProv) мы создаем ключ, измене-ние которого мы будем в последующем отслеживать. Да-лее мы регистрируем процедуру – обработчик событий (Event Sink) под названием REG_OnObjectReady. Объявля-ем мы ее с использованием метода CreateObject для класса WbemScripting.SWbemSink. Далее мы вызываем метод асин-хронной обработки событий WMI ExecNotificationQueryAsync. Этот метод подписывает наш сценарий (вернее его проце-дуру REG_OnObjectReady) на получение событий об изме-нении интересующего нас значения реестра. В данном при-мере это значение HKEY_LOCAL_MACHINE\SOFTWARE\aRegKey\MyValue. После того как обработчик зарегистри-рован, мы начинаем ожидать события изменения этого клю-

ча в цикле while, попутно делая раз в секунду (1000 милли-секунд) изменение этого самого ключа с помощью другого метода WMI: SetStringValue. Как только пройдет 20 секунд, и мы 20 раз изменим указанный выше ключ, цикл завер-шается, и в самом конце сценария мы отменяем подписку на события WMI вызовом метода Cancel объекта MySink, а также удаляем созданный ранее ключ реестра.

Работа с Active Directory через WMI Directory Service providerЕще один полезный и интересный провайдер WMI – это про-вайдер для работы со службой каталогов Microsoft Active Directory. Все классы этого провайдера определены в про-странстве имен root\deirctory\ldap. Сразу хочу обратить вни-мание, что существует альтернативное средство для рабо-ты с Active Directory из сценариев и приложений – это ADSI (Active Directory Services Interfaces). Объектная библиотека ADSI более проста и удобна в использовании, чем провай-дер WMI Directory Services, тем более что он является над-стройкой над всё тем же ADSI.

Зачем же тогда нужен этот провайдер?! – спросите вы. Все довольно просто – поскольку WMI универсальное средство мониторинга и управления системой Windows и ее компонентами, то есть необходимость интегрировать все средства управления системой через WMI. Кроме то-го, поскольку некоторые программные продукты по сво-ей архитектуре могут использовать только WMI, то зада-ча управления Active Directory должна быть решена и че-рез WMI в том числе.

В листинге 8 приведен пример простого сценария WMI, который модифицирует поле displayname указанного поль-зователя Active Directory.

При изменении свойств объектов Active Directory через WMI есть одна существенная особенность – необходимо яв-но определять, какие из атрибутов объекта вы хотите мо-дифицировать. Для этого их названия нужно перечислить в специальном объекте класса swbemnamedvalueset. В ос-тальном взаимодействие с классами провайдера службы

Листинг 8. Изменение свойств пользователя в Active Directory через WMI

strComputer = "."strUserID = "MyNew_WMI_User"

Set objWMIService = GetObject("Winmgmts:\\" & ↵ strComputer & "\root\directory\ldap")

Set objValSet = ↵ CreateObject("wbemscripting.swbemnamedvalueset")

objValSet.add "__PUT_EXT_PROPERTIES", ↵ array("ds_displayname")objValSet.add "__PUT_EXTENSIONS", trueobjValSet.add "__PUT_EXT_CLIENT_REQUEST", true

Set objEnum = objWMIService.ExecQuery( _ "select * from ds_user where ds_cn = '" & ↵ strUserID & "'", "WQL", 32)

For each objUser in objEnum objUser.ds_DisplayName = "Обновленноое поле ↵ DisplayName" objUser.put_ 1, objValSetNext

WScript.Echo "Свойства прользователя Active Directory ↵ обновлены"

Листинг 7. Работа с реестром через WMI

Sub REG_OnObjectReady(objObject, objAsyncContext) Wscript.Echo "Изменение в реестре: " & ↵ objObject.GetObjectText_()End Sub

'--------------------------------------------------------strComputer = "."Const HKEY_LOCAL_MACHINE = &H80000002strKeyName = "SOFTWARE\aRegKey"strValName = "MyValue"

Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\DEFAULT")Set objReg = objWMIService.Get("StdRegProv")

objReg.CreateKey HKEY_LOCAL_MACHINE, strKeyNameobjReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyName, ↵ strValName, "test0"

Set MySink = WScript.CreateObject( _ "WbemScripting.SWbemSink","REG_")

objWMIservice.ExecNotificationQueryAsync MySink, _ "SELECT * FROM RegistryValueChangeEvent WHERE " & ↵ "Hive = 'HKEY_LOCAL_MACHINE'" &_" AND KeyPath = ‘" & ↵ Join(Split(strKeyName, "\"), "\\") & "'" & ↵ " AND ValueName = '" & strValName &"'"

WScript.Echo "Ожидаем события..."

i = 0While (i < 20) Wscript.Sleep(1000) i = i + 1 objReg.SetStringValue HKEY_LOCAL_MACHINE, ↵ strKeyName, strValName, «test» & iWend

MySink.CancelobjReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyName

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

33№5, май 2006

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

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

Работа со счетчиками производительностиСледующий интересный провайдер – провайдер доступа к счетчикам производительности. Эти же самые счетчи-ки вы можете увидеть, когда используете утилиту System Monitor (Performance Monitor). Этот провайдер предостав-ляет две группы классов, олицетворяющих счетчики про-изводительности системы. К первой группе относятся клас-сы, представляющие ненормированные системные показа-тели. Эта группа классов имеет общую часть в их назва-нии – Win32_PerfRawData_, и наследуют все свои свойс-тва от класса Win32_PerfRawData. Ко второй группе отно-сятся классы, предоставляющие нормированные и форма-тированные данные. В их названии также имеется общая часть: Win32_PerfFormattedData_, а их свойства выведены из класса Win32_PerfFormattedData.

Пример работы с ненормированными счетчиками про-изводительности смотрите в листинге 9.

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

Видите – сам по себе исходный код сценария в лис-тинге 10 отличается от примера в листинге 9 только од-ной строкой. Эта строка – WQL-запрос: «SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor». В сущности, отличается только имя класса, набор его свойств в точности совпадает, однако сами значения свойств будут отличаться. Для каждого свойства существует специальная формула перевода из ненормированного значения в нормированное. Узнать эту формулу можно из файла Winperf.h.

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

Листинг 9. Использование неформатированных счетчиков(более быстрый доступ к данным)

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\CIMV2")Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM ↵ Win32_PerfRawData_PerfOS_Processor",,48)

For Each objItem in colItems Wscript.Echo "-----------------------------------" Wscript.Echo ↵ "Win32_PerfRawData_PerfOS_Processor instance" Wscript.Echo "-----------------------------------" Wscript.Echo "C1TransitionsPersec: " & ↵ objItem.C1TransitionsPersec Wscript.Echo "C2TransitionsPersec: " & ↵ objItem.C2TransitionsPersec Wscript.Echo "C3TransitionsPersec: " & ↵ objItem.C3TransitionsPersec Wscript.Echo "DPCRate: " & objItem.DPCRate Wscript.Echo "DPCsQueuedPersec: " & ↵ objItem.DPCsQueuedPersec Wscript.Echo "Frequency_Object: " & ↵ objItem.Frequency_Object Wscript.Echo "Frequency_PerfTime: " & ↵ objItem.Frequency_PerfTime Wscript.Echo "Frequency_Sys100NS: " & ↵ objItem.Frequency_Sys100NS Wscript.Echo "InterruptsPersec: " & ↵ objItem.InterruptsPersec Wscript.Echo "Name: " & objItem.Name Wscript.Echo "PercentC1Time: " & objItem.PercentC1Time Wscript.Echo "PercentC2Time: " & objItem.PercentC2Time Wscript.Echo "PercentC3Time: " & objItem.PercentC3Time Wscript.Echo "PercentDPCTime: " & objItem.PercentDPCTime Wscript.Echo "PercentIdleTime: " & ↵ objItem.PercentIdleTime Wscript.Echo "PercentInterruptTime: " & ↵ objItem.PercentInterruptTime Wscript.Echo "PercentPrivilegedTime: " & ↵ objItem.PercentPrivilegedTime Wscript.Echo "PercentProcessorTime: " & ↵ objItem.PercentProcessorTime Wscript.Echo "PercentUserTime: " & ↵ objItem.PercentUserTime Wscript.Echo "Timestamp_Object: " & ↵ objItem.Timestamp_Object Wscript.Echo "Timestamp_PerfTime: " & ↵ objItem.Timestamp_PerfTime Wscript.Echo "Timestamp_Sys100NS: " & ↵ objItem.Timestamp_Sys100NSNext

Листинг 10. Использование форматированных и нормированных счетчиков (все значения соответствуют System Monitor)

strComputer = "."Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\CIMV2") Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM ↵ Win32_PerfFormattedData_PerfOS_Processor",,48)

For Each objItem in colItems Wscript.Echo "-----------------------------------" Wscript.Echo ↵ "Win32_PerfFormattedData_PerfOS_Processor instance" Wscript.Echo "-----------------------------------" Wscript.Echo "C1TransitionsPersec: " & ↵ objItem.C1TransitionsPersec Wscript.Echo "C2TransitionsPersec: " & ↵ objItem.C2TransitionsPersec Wscript.Echo "C3TransitionsPersec: " & ↵ objItem.C3TransitionsPersec Wscript.Echo "DPCRate: " & objItem.DPCRate Wscript.Echo "DPCsQueuedPersec: " & ↵ objItem.DPCsQueuedPersec Wscript.Echo "Frequency_Object: " & ↵ objItem.Frequency_Object Wscript.Echo "Frequency_PerfTime: " & ↵ objItem.Frequency_PerfTime Wscript.Echo "Frequency_Sys100NS: " & ↵ objItem.Frequency_Sys100NS Wscript.Echo "InterruptsPersec: " & ↵ objItem.InterruptsPersec Wscript.Echo "Name: " & objItem.Name Wscript.Echo "PercentC1Time: " & objItem.PercentC1Time Wscript.Echo "PercentC2Time: " & objItem.PercentC2Time Wscript.Echo "PercentC3Time: " & objItem.PercentC3Time Wscript.Echo "PercentDPCTime: " & ↵ objItem.PercentDPCTime Wscript.Echo "PercentIdleTime: " & ↵ objItem.PercentIdleTime Wscript.Echo "PercentInterruptTime: " & ↵ objItem.PercentInterruptTime Wscript.Echo "PercentPrivilegedTime: " & ↵ objItem.PercentPrivilegedTime Wscript.Echo "PercentProcessorTime: " & ↵ objItem.PercentProcessorTime Wscript.Echo "PercentUserTime: " & ↵ objItem.PercentUserTime Wscript.Echo "Timestamp_Object: " & ↵ objItem.Timestamp_Object Wscript.Echo "Timestamp_PerfTime: " & ↵ objItem.Timestamp_PerfTime Wscript.Echo "Timestamp_Sys100NS: " & ↵ objItem.Timestamp_Sys100NSNext

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

34

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

совместимыми устройствами и системой WMI. Те, кто не-плохо знаком с SNMP, понимают, что в основе WMI и SNMP лежат похожие решения по хранению и представлению ин-формации. И WMI и SMNP поддерживают события (в тер-минологии SNMP это Trap-сообщения) и расширение базы данных (репозитория): в терминологии WMI это MOF-фай-лы, а в терминологии SNMP это базы MIB (Management Information Base).

В итоге при использовании SNMP-провайдера WMI ад-министратор получает в пространстве имен root\snmp пред-ставление всех необходимых устройств, поддерживающих протокол SNMP. Присылаемые SNMP-устройствами Trap-сообщения преобразуются в события WMI, которые можно также отслеживать. Для добавления информации из баз данных в формате SNMP MIB в репозиторий WMI сущест-вует специальная утилита smi2smir.exe.

При инсталляции ОС Windows по умолчанию провайдер SNMP WMI не устанавливается – его необходимо устанав-ливать через установку и удаление системных компонен-тов консоли Add/Remove Programs.

Затем необходимо произвести настройку SNMP-окру-жения. В эту задачу входит определение в свойствах про-странств имен раздела root\snmp так называемых SNMP-community для чтения, записи и оповещений, и импорти-ровать в репозиторий WMI MIB-файлы. Некоторую допол-нительную информацию по этой теме можно прочитать в библиотеке MSDN [4].

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

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

Устраняем ошибки в WMIВ данном разделе мы рассмотрим вопрос диагностики и устранения ошибок в WMI. Помимо штатного резерв-ного копирования и восстановления, выполнение которо-го доступно через консоль wmimgmt.msc. Существует еще ряд средств диагностики и восстановления WMI. Для то-го чтобы разобраться, как они работают, нужно вспомнить, что все элементы репозитория WMI могут быть описаны на языке MOF-файлов. Таким образом, используя компи-лятор MOF-файлов mofcomp.exe, вы можете заново вос-создать весь репозиторий WMI – главное для этого иметь эти самые исходные MOF-файлы. При компиляции некото-рые MOF-файлы могут быть помечены как компоненты ав-томатического восстановления – это означает, что при об-наружении серьезной ошибки в базе данных репозитория WMI запущенный процесс автоматического восстановле-ния самостоятельно скомпилирует и импортирует в репо-зиторий такие MOF-файлы. Для того чтобы пометить MOF-файлы как компонент автоматического восстановления при его компиляции, нужно добавить опцию – AUTORECOVER.

Таким образом, команда компиляции MOF файла должна выглядеть так:

Очевидно, что эти файлы должны быть доступны ло-кально, когда процесс автоматического восстановления будет запущен, поэтому при компиляции с этим ключом MOF-файлы копируются в папку %systemroot%\system32\wbem.

Относительно недавно (10 марта 2006 года) вышла об-новленная версия 1.1 сценария WMIDiag.vbs. Этот сцена-рий разработан специалистами Microsoft для дополнитель-ной диагностики WMI. Он обязательно должен запускать-ся локально на той машине, на которой следует провести диагностику. Он поддерживает множество ключей команд-ной строки для управления режимом своей работы. В час-тности его можно работать в «тихом режиме» (без вывода диагностических сообщений на экран – они будут записы-ваться в файл, в системный журнал и/или отправляться по электронной почте) или запускаться как задание Microsoft SMS 2003.

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

Подробное описание этого сценария (утилиты) с приме-рами и иллюстрациями можно найти по ссылке [5].

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

Ссылки и литература:1. Леонтьев К. Узнай секреты WMI: события и провайдеры.

Часть I: дополнительные возможности. – Журнал «Систем-ный администратор», №3, март 2006 г. – 6-13 с.

2. Леонтьев К. Вы все еще не используете WMI? Часть I. – Журнал «Системный администратор», №1, январь 2006 г. – 4-11 с.

Леонтьев К. Вы все еще не используете WMI? Часть II: пишем сценарии. – Журнал «Системный администратор», №2, фев-раль 2006 г. – 6-14 с.

3. Windows Management Instrumentation – http://msdn.microsoft.com/library/en-us/dnanchor/html/anch_wmi.asp.

4. Setting up the WMI SNMP Environment – http://msdn.microsoft.com/library/en-us/wmisdk/wmi/setting_up_the_wmi_snmp_environment.asp?frame=true.

5. WMIDiag – http://www.microsoft.com/technet/scriptcenter/topics/help/wmidiag.mspx.

mofcomp –AUTORECOVER <moffilename>

SELECT * FROM SNMP_DEVICE_ADDRESS WHERE ↵ SNMP_PROPERTY_NAME > 100

Page 37: 042 Системный Администратор 05 2006
Page 38: 042 Системный Администратор 05 2006

36

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

Когда работа предприятия зави-сит от функционирования сер-веров, всегда хочется быть уве-

ренным в их надежности. И надежность эту даже можно измерить.

Применительно к серверам эта ве-личина называется «доступность» или «готовность», измеряется в процентах и означает, сколько времени в году сервер исправно функционирует. Иде-альное ее значение – 100%.

В таблице 1 приведены типичные значения готовности и расчетное вре-мя простоя для каждой из них.

Что делать, чтобы увеличить этот показатель? Оптимальное решение – это дублирование всех узлов (т.е. сер-веров). Это решение позволит допи-сать к показателю готовности еще од-ну «9». А два функционально идентич-ных сервера, работающих как один, – это уже кластер.

Варианты построения кластера вы-бираются в каждом конкретном случае. Я хочу привести пример построения кластера на примере СУБД Oracle 9i.

Как я и писал выше, есть несколько вариантов решений. Их можно разде-лить по нескольким критериям: стои-мость решения, оперативность восста-новления системы после сбоя (см. таб-лицу 2).

Поскольку основное требование к кластеру – высокая степень доступ-

ности, то варианты из нижнего ряда второй таблицы отвергаем сразу. Рас-смотрим оставшиеся варианты с уче-том требуемого бюджета. Выбираем DRBD + Heartbeat.

Перевод статьи, посвященной бюд-жетным системам высокой готовности, в которой рассматривается выбран-ное нами решение, находится по ад-ресу: http://www.opennet.ru/docs/RUS/ha_cluster.

Назначение DRBD и HeartbeatDRBD – это блочное устройство, кото-рое позволяет организовывать зерка-лирование (RAID1-массив) через сеть. На каждом из узлов DRBD связыва-ет виртуальное устройство /dev/drbdX (Х – номер) и локальный раздел дис-ка, далее не доступный напрямую. За-пись информации осуществляется на первичном узле (DRBD разрешает за-пись только на первичном узле) на ус-тройство /dev/drbdX, которое переда-ет эти данные для записи на связан-ный локальный раздел диска и отсы-лает по сети на другие узлы кластера. Чтение данных происходит с локаль-ного раздела.

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

ется другой пакет, менеджер класте-ра – Heartbeat.

Свежую версию DRBD, на момент написания статьи, можно было взять по ссылке http://oss.linbit.com/drbd/0.7/drbd-0.7.17.tar.gz, а версию Heartbeat – http://linux-ha.org/download/heartbeat-2.0.2.tar.gz.

В нашем кластере два узла, один из них является ведущим (основным), второй ведомым (вторичным).

Конфигурация системыЗа основу берем однодисковый ва-риант дистрибутива ALT Linux Master 2.4.

В качестве узлов кластера ис-пользуются две системы. Одна (ос-новная) – это 2 х Xeon 2.8 ГГц, 1 Гб, 2 x RAID1 (/dev/sda и /dev/sdb; 4 дис-ка Seagate SCSI 73 Гб, 10000 rpm). Вторая проще – Athlon 1700+, 256 Мб, ATA WD 80 Гб (/dev/hda) + RAID1 (/dev/sda; 2 х ATA WD 80 Гб). На обоих уз-лах по две сетевые карты, одна бу-дет использоваться для выхода в кор-поративную сеть, вторая (желательно gigabit ethernet)– используется DRBD для синхронизации дисков. Скорость работы этого сетевого RAID-масси-ва не будет выше, чем скорость ва-шей сети. Еще соединим оба узла че-рез COM-порты (нуль модем) для то-го, чтобы Heartbeat мог с большей ве-

Отказоустойчивый кластер с минимальным бюджетом

Как с минимальным бюджетом эффективно построить отказоустойчивый кластер и использовать его в качестве платформы для критически важных приложений на примере СУБД Oracle 9i.

Сергей Довганюк

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

37№5, май 2006

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

роятностью определить, «умер» один из узлов кластера или нет. Может так случиться, что между узлами пропадет связь через Ethernet и тогда получится, что каждый узел бу-дет считать себя главным, справедливо полагая, что дру-гие узлы «мертвы» (т.н. split-brain или раздвоение личнос-ти), чего стоит всячески избегать.

На каждом из узлов должен быть выделен раздел для использования с DRBD. Выделим на обеих машинах по RAID1-массиву. Во время и после установки операцион-ной системы (вплоть до установки DRBD) они должны ос-таваться неиспользуемыми!

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

Затем устанавливаем DRBD и Heartbeat. Конфигуриру-ем их. Создаем раздел на основном узле кластера на за-пасенном RAID1-массиве. Oracle переносим во временную директорию. Настраиваем DRBD и монтируем созданный раздел к той директории, в которой был установлен Oracle (в нашем случае /D01) и переносим Oracle обратно из вре-менной директории. Проверяем работоспособность пос-леднего и работоспособность кластера в целом.

А теперь все то же самое подробнее.

Установка Oracle 9iСвои действия я основывал на информации из несколь-ких источниках: Руководство по установке, расположенное по адресу

http://www.surw.ru/~dalth/orafedora2.html. Этот матери-ал написан, на мой взгляд, очень грамотно.

Руководство «Установка БД Oracle 9.2.0.4.0 и Oracle Application Server 10g на RED HAT Enterprise Linux AS 2.1» рас-положенное по адресу: http://pm4u.narod.ru/oracle.htm – также замечательный материал.

Книга из официальной документации по Oracle 9i «Oracle 9i installation guide». Электронная версия распо-ложена по адресу: http://download-west.oracle.com/docs/html/A96167_01/toc.htm.

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

и

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

талог /D01. Итак.Для упрощения установки и автоматизации процесса за-

пуска Oracle будем использовать скрипты из пакетов oracle-preinstall и oracle9-tuning из репозитория Alt Linux:

Готовность, % Время простоя в год

99 3.5 дня

99.9 9 часов

99.99 52.5 минуты

99.999 5 минут

Таблица 1. Типичные значения готовности

Таблица 2. Варианты построения кластера

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

Вос

стан

овле

ние

в ре

альн

ом

(или

поч

ти) в

рем

ени

Использование встроенных средств Oracle для организации репликации в ре-альном времени между несколькими серверами (книга из документации под названием «Oracle Data Guard Concepts and Administration»)

«+» высокая надежность (в идеале, максимально возможная); гарантия сохранения информации на уровне транзакции; практически полная незаметность факта сбоя для пользователя «–» высокая стоимость лицензии Использование специализированных аппаратных средств (сервер с высоким

показателем доступности) «+» высокая надежность; «–» стоимость решения еще дороже, чем стоимость предыдущего варианта

DRBD и Heartbeat (http://www.drbd.org, http://www.linux-ha.org) «+» высокая надежность; низкая стоимость решения «–» возможные ошибки при записи данных из-за программного сбоя

(драйвер диска и т. д.) будут немедленно скопированы на все узлы кластера;

небольшая задержка при переключении с одного узла кластера на другой

Вос

стан

овле

ние

с за

держ

кой

TSync (http://tsyncd.sourceforge.net) и аналогичные средства (rsync, unison, и т. д.)

«+» простота конфигурирования «–» в зависимости от алгоритма может приводить к значительной

загрузке системы; синхронизация данных происходит при окончании работы с фай-

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

требует дополнительной настройки для автоматического переклю-чения с одного сервера на другой (возможно, что и на основе того же Heartbeat)

Средства Oracle для организации репликации (книга из документации под названием «Oracle 9i Advanced Replication»)

«+» работает в рамках лицензии Oracle Standard Edition; основано на встроенных механизмах Oracle «–» недостаток, общий для данной группы – отложенная синхронизация

altora1#> groupadd –g 789 oraclealtora1#> useradd –g oracle –u 1234 oracle

altora2#> groupadd –g 789 oraclealtora2#> useradd –g oracle –u 1234 oracle

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

38

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

/etc/profile.d/oracle9.sh – установки по умолчанию для всех пользователей. Нам лишь нужно установить и изменить под свою конфигурацию;

/etc/rc.d/init.d/oracle-lsnr – скрипт для запуска/оста-новки Oracle Listener;

/etc/rc.d/init.d/oracle-db – скрипт для запуска/останов-ки Oracle Database.

Устанавливаем (если этого не было сделано ранее) библиотеку libstdc++-libc6.1-1.so.2, она необходима для ус-тановки JRE. Устанавливаем gcc версии 2.96 и изменяем ссылку /usr/bin/gcc так, чтобы ссылалась на gcc-2.96 (пос-ле окончания установки Oracle не забудьте изменить ссыл-ку обратно).

Заменяем родной JRE (1.3.1.0.0) инсталлятора Oracle на JRE версии 1.3.1_17, взятый с сайта SUN (http://java.sun.com/j2se/1.3/download.html). После установки rpm-пакета переписываем JRE из директории /usr/java/jre1.3.1_17 в ди-ректорию первого диска инсталляции Oracle: /Disk1/stage/Components/oracle.swd.jre/1.3.1.0.0/1/DataFiles/Expand/jre/linux. Этим мы решаем проблему несовместимости glibc. И не забываем поменять владельца для JRE:

Стоит отметить, что таким способом можно решить проблему только с инсталлятором, клиентские GUI-прило-жения используют JRE версии 1.1.8. Для него мне не уда-лось найти подходящего обновленного JRE ни у SUN, ни на www.blackdown.org. Но в принципе клиентское GUI ПО на сервере не особо и нужно. Способ же, описанный в вышеупомянутом руководстве, работает для обоих ти-пов JRE.

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

Вы можете дать этому свое объяснение, но для себя я сделал вывод, что такова особенность работы мастера и/или JRE и просто надо иметь это в виду.

Остановкой Oracle управляет скрипт /$ORACLE_HOME/bin/dbshut. В этом скрипте на строках под номерами 79 и 84 расположены пары команд:

Нас интересует команда shutdown. Как вы наверное уже знаете, эта команда указывает Oracle завершить работу. В приведенном варианте команды Oracle ждет отключе-ния всех пользователей и после этого завершает работу. Но иногда так происходит, что Oracle не завершает работу даже после отключения всех пользователей, как бы «зави-сает». Для того чтобы переключения между узлами класте-ра происходили быстрее, советую слегка изменить коман-ду shutdown. Допишем к ней параметр immediate. Данный параметр указывает Oracle завершить работу не дожида-ясь отключения пользователей. Более подробно о команде можно прочитать в книге «Oracle9i Database Administrator’s Guide» из фирменной документации.

Копируем скрипты oracle9.sh, oracle-lsnr и oracle-db с главного узла на резервный и повторяем процедуру ус-тановки Oracle для резервного узла без создания базы. Та-ким образом, на обоих узлах Oracle будет работать в оди-наковом окружении.

На основном узле останавливаем Oracle, если он запу-щен, и копируем базу (т.н. холодная копия) на резервный узел в то же самое место, где она находится на основном узле. Файлы базы находятся в каталоге /$ORACLE_BASE/oradata/$dbname. Где $ORACLE_BASE задается в oracle9.sh, а $dbname – имя вашей базы, которое вы указали при ее создании.

Копируем файл /etc/oratab с основного узла на резер-вный и запускаем Oracle на резервном узле для провер-ки его работы.

После проверки работоспособности удаляем все содер-жимое точки монтирования (/D01) на резервном узле.

Установка DRBDДля установки DRBD нужно иметь исходные тексты ядра. Исходные тексты должны быть именно от того ядра, для ко-торого будет собираться drbd, иначе при попытке загрузки модуля (если его вообще удастся собрать) будут появлять-ся ошибки «unresolved symbols». Мне не удалось найти точ-но те исходники, из которых было собрано ядро из дистри-бутива, и поэтому я буду использовать самое свежее ядро на момент написания статьи – 2.4.32.

Нужно позаботиться, чтобы новое ядро было собрано в той же конфигурации, что и ядро, использовавшееся до него. Спасибо Михаилу Шигорину за подсказку, где най-ти оригинальный конфигурационный файл. В моем случае он находится в /boot/config-*. Копируем его вместо конфи-га нового ядра :

Компилируем ядро, устанавливаем. Проверяем рабо-тоспособность системы на новом ядре.

Схема построения кластера

#>chown –R oracle:oracle /Disk1/…/jre/linux

…connect internalshutdown…

#> cp /boot/config-2.4.26-std-smp-alt6 /usr/src/linux/.config

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

39№5, май 2006

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

Компилируем DRBD:

Устанавливаем:

Модуль находится в /lib/modules/2.4.32/kernel/drivers/block/. Подробное описание процесса компиляции и ус-тановки находится в файле INSTALL из пакета исходни-ков DRBD.

Перед настройкой DRBD нужно разбить запасенные диски на обоих узлах на разделы (раздел может быть и единственный). При этом те разделы, которые будут ис-пользоваться с DRBD, желательно сделать одного размера. Для этого используем fdisk или аналог. Например, на обо-их узлах разобьем диски на два раздела: основной – 35 Гб, для использования с DRBD и логический – остальное про-странство диска.

Настраиваем DRBD. Настройка производится через конфигурационный файл /etc/drbd.conf. Файл должен быть идентичен на обоих узлах кластера.

Добавим модуль drbd в /etc/modules.При установке init скрипт для DRBD копируется в /etc/

rc.d/init.d/drbd. Устанавливаем его:

Этот скрипт инициализирует подсистему DRBD, исполь-зуя параметры из файла /etc/drbd.conf. Результат работы скрипта аналогичен команде:

Теперь перезапускаем наш кластер и в /var/log/messages должны увидеть что-то вроде этого.

О том, что модуль загружен:

О том, что запущен сервис DRBD:

Дело в том, что изначально DRBD ничего не знает о том, какой из узлов ведущий, а какой ведомый. И теперь мы

должны определиться с этим и «сказать» DRBD. Делает-ся это командой:

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

За процессом синхронизации можно наблюдать на-брав:

Вывод будет примерно следующим:Основной узел:

Ведомый узел:

Создаем файловую систему на устройстве DRBD, жела-тельно чтобы она была журналируемой, это позволит уско-рить запуск сервисов на резервном узле (иначе перед за-пуском будет проведена проверка диска):

Останавливаем Oracle, если он работает. Переносим Oracle (бинарные файлы и базу) во временную директо-рию, например, так:

Монтируем устройство DRBD в /D01:

Копируем Oracle обратно в /D01. Пробуем запустить Oracle.

Установка HeartbeatКомпиляция и установка Heartbeat довольно проста и про-ходит в 3 этапа:

#> cd /usr/src/drbd-0.7.17#> make clean all

#> make install

#> chkconfig --add drbd

#> drbdadm up all

drbd: initialised. Version: 0.7.17 (api:77/proto:74)drbd: SVN Revision: 2093 build by root@altora1, 2006-03-14 18:42:04drbd: registered as block device major 147

drbd0: Creating state blockdrbd0: resync bitmap: bits=8513804 words=266058drbd0: size = 32 GB (34055216 KB)drbd0: 34055216 KB now marked out-of-sync by on disk bit-map.drbd0: Assuming that all blocks are out of sync (aka FullSync)drbd0: 34055216 KB now marked out-of-sync by on disk bit-map.drbd0: drbdsetup [2119]: cstate Unconfigured --> StandAlonedrbd0: drbdsetup [2122]: cstate StandAlone --> Unconnecteddrbd0: drbd0_receiver [2123]: cstate Unconnected --> WFConnectiondrbd0: drbd0_receiver [2123]: cstate WFConnection --> WFReportParamsdrbd0: Handshake successful: DRBD Network Protocol version 74drbd0: Connection established.drbd0: I am(S): 0:00000001:00000001:00000001:00000001:00drbd0: Peer(S): 0:00000001:00000001:00000001:00000001:00drbd0: drbd0_receiver [2123]: cstate WFReportParams --> Connecteddrbd0: I am inconsistent, but there is no sync? BOTH nodes inconsistent!drbd0: Secondary/Unknown --> Secondary/Secondary

#> drbdadm -- --do-what-I-say primary all

#> cat /proc/drbd

version: 0.7.17 (api:77/proto:74)SVN Revision: 2093 build by root@altora1, 2006-03-14 18:42:04 0: cs:Connected st:Primary/Secondary ld:Consistent ns:636228 nr:2984 dw:639212 dr:337464 al:22 bm:44 lo:0 pe:0 ua:0 ap:0 [====>...............] sync’ed: 20% (27200/34000)M ... ... 1: cs:Unconfigured

version: 0.7.17 (api:77/proto:74)SVN Revision: 2093 build by root@altora1, 2006-03-14 18:42:04 0: cs:Connected st: Secondary/Primary ld:Inconsistent ns:636228 nr:2984 dw:639212 dr:337464 al:22 bm:44 lo:0 pe:0 ua:0 ap:0 [====>...............] sync’ed: 20% (27200/34000)M ... ... 1: cs:Unconfigured

#> mkreiserfs /dev/drbd0

#> mv /D01/Ora /root/Oracle

#> mount -t reiserfs /dev/drbd0 /D01

#> cd /usr/src/heartbeat-2.0.4#> ./ConfigureMe configure

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

40

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

При первой попытке конфигуратор наверняка выдаст сообщения о том, что для установки Heartbeat не хватает нескольких пакетов. Перечень необходимых пакетов кон-фигуратор выдает в конце работы единым списком. Я сове-тую установить все требуемые пакеты и те, что обязатель-ны (ERROR), и те, что желательны (WARNING).

Компилируем и устанавливаем:

Для настройки Heartbeat использует 3 файла, находя-щиеся в директории /etc/ha.d: /etc/ha.d/ha.cf – общая настройка; /etc/ha.d/haresources – этот файл описывает ресурсы,

которые следует перемещать от узла к узлу; /etc/ha.d/authkeys – файл аутентификации.

Выполняем команду:

для установки init-скрипта пакета Heartbeat.Перезапускаем кластер. В логах должно появиться что-

то вроде этого:

Поздравляю, ваш кластер работает!

ЭксплуатацияПорядок включения узлов не имеет значения, т.к. узел, за-пустившийся первым, будет ждать запуска другого узла (в файле /etc/drbd.conf параметр wfc-timeout). Что делать, если один из узлов не стартует, мы обсудим ниже.

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

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

зовательском режиме. В этом режиме ни DRBD, ни Heartbeat не запускаются. Редактируем конфигурационный файл /etc/drbd.conf и устанавливаем параметр wfc-timeout в зна-чение, отличное от 0, например, 1 (равно 1 секунде). Снова перезагружаем узел уже в обычном режиме.

Как повлияет синхронизация данных по сети на ско-рость работы с Oracle и как значительно может уменьшить-ся производительность по сравнению с одиночным серве-ром? Здесь многое зависит как от скорости используемого сетевого соединения, так и от режима работы Oracle. Зна-чительное падение цен сделало доступным гигабитные ре-шения для бюджетного сектора. Учитывая, что DRBD буфе-ризирует данные и то, что скорость работы современных жестких дисков в реальных условиях пока еще значитель-но меньше, чем пропускная способность гигабитной сети, то в данном случае узким местом скорее станет скорость работы с дисками. В любом случае вы не должны заметить сколько-нибудь значительного проигрыша. Если вы исполь-зуете сеть 100 Mbit, то здесь тоже не все безнадежно. Ес-ли большая часть запросов к базе (как правило) состав-ляет запросы на выборку, то работа в основном будет ид-ти с диском на главном узле, и здесь скорость соединения в 100 Mbit практически никак не скажется на производитель-ности кластера. Если же основная работа с Oracle состо-ит в добавлении новых записей, то все зависит от объема новых данных, поступающих на запись. На основе своего опыта могу сказать, что Oracle на удаление и потом встав-ку 20000 записей тратил около 15 секунды на одиночном сервере. В объемах это где-то 5-10 Мб, учитывая индексы и служебную информацию. То есть у нас остается даже за-пас. Такова специфика работы сервера баз данных, хотя если бы мы с вами организовывали файл-сервер, то навер-няка заметили бы падение производительности.

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

Если вы используете единый источник бесперебойно-го питания для обоих узлов кластера, то для увеличения времени работы от батареи в случае отключения электро-снабжения советую в качестве второго узла кластера ис-пользовать более «легкую» машину (меньше CPU, жест-ких дисков и прочего). И при переходе кластера на работу от батареи оставлять рабочим только резервный узел. Де-лается это путем настройки демона, следящего за состоя-нием батареи, так, чтобы система на главном узле останав-ливалась, например, после 5 минут (чтобы не реагировать на кратковременные перебои) работы от батареи, а на ре-зервном узле работала бы уже до исчерпания заряда бата-реи. Выбор соответствующего демона зависит от марки ис-пользуемой вами батареи. Для широко распространенных батарей фирмы APC можно использовать демон apcupsd (http://www.sourceforge.net/projects/apcupsd). Он позволяет организовать взаимодействие по сети.

И не забывайте о резервном копировании, ведь клас-тер – это не панацея, а лишь одно из средств.

#> ./ConfigureMe make#> ./ConfigureMe install

#> chkconfig --add heartbeat

heartbeat: [1630]: info: Configuration validated. Starting heartbeat 2.0.4heartbeat: [1631]: info: heartbeat: version 2.0.4heartbeat: [1631]: info: Heartbeat generation: 7...ResourceManager[2195]: info: Running /etc/init.d/oracle-db start...oracle-db: Starting Oracle database: succeeded...ResourceManager[2195]: info: Running /etc/init.d/oracle-lsnr start...oracle-lsnr: Starting Oracle Net8 listener: succeeded...ResourceManager[2195]: info: Running /etc/init.d/httpd start...Mar 17 14:35:24 altora1 httpd: httpd startup succeeded...heartbeat: [2185]: info: local HA resource acquisition completed (standby).heartbeat: [1631]: info: Standby resource acquisition done [foreign].heartbeat: [1631]: info: Initial resource acquisition complete (auto_failback)heartbeat: [1631]: info: remote resource transition completed.

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

41№5, май 2006

bugtraq

Множественные уязвимости в Mozilla FirefoxПрограмма: Mozilla Firefox 1.5.0.1 и более ранние версии, Mozilla Suit версии до 1.7.13 .Опасность: Критическая.Описание: 1. Уязвимость существует из-за ошибки, кото-рая позволяет внедрить JavaScript-код в другую, в данный момент загружающуюся страницу. Удаленный пользователь может с помощью специально сформированного веб-сай-та выполнить произвольный код сценария в браузере жер-твы в контексте безопасности любого сайта.

2. Уязвимость существует из-за ошибки в garbage collection в JavaScript. Удаленный пользователь может вы-звать повреждение памяти и выполнить произвольный код на целевой системе.

3. Ошибка при обработке входных данных в реализа-ции каскадных стилей может позволить злоумышленнику дописать некоторые данные в конец массива.

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

5. Обнаружено две ошибки при обработке стилей -moz-grid и -moz-grid-group. Удаленный пользователь может выполнить произвольный код на целевой системе.

6. Ошибка обнаружена в методе InstallTrigger.install(). Удаленный пользователь может вызвать повреждение па-мяти на системе.

7. Уязвимость существует из-за неизвестной ошибки, которая позволяет в некоторых ситуациях подменить икон-ку с изображением безопасного замка и содержимое ад-ресной строки путем изменения месторасположения pop-up окна. Для успешной эксплуатации уязвимости опция «Entering secure site» должна быть включена (по умолча-нию отключена).

8. Уязвимость позволяет злоумышленнику обманом за-ставить пользователя скачать злонамеренный файл с по-мощью меню «Save image as...».

9. JavaScript функция, созданная вызовом eval() совмес-тно с методом XBL-привязки, может быть скомпилирована с некорректными привилегиями. Удаленный пользователь может выполнить произвольный код на целевой системе.

10. Обнаружена ошибка в методе Object.watch(), откры-вающем внутренний clone parent-объект функции. Уда-ленный пользователь может выполнить произвольный JavaScript-код на системе.

11. Обнаружена ошибка в способе зашиты сборки встро-енных XBL-связок. Удаленный пользователь может выпол-нить произвольный JavaScript-сценарий на системе с повы-шенными привилегиями.

12. Неизвестная ошибка позволяет удаленному поль-зователю выполнить произвольный код сценария посредс-твом массива window.controllers.

13. Уязвимость существует из-за ошибки при обработке определенной последовательности HTML-тегов. Удаленный пользователь может вызвать повреждение памяти и выпол-нить произвольный код на целевой системе.

14. Уязвимость обнаружена в методах valueOf.call() и valueOf.apply(). Удаленный пользователь может выпол-нить произвольный код сценария в браузере жертвы в кон-тексте безопасности произвольного сайта.

15. Обнаружено несколько ошибок в реализации DHTML. Удаленный пользователь может вызвать повреждение па-мяти и выполнить произвольный код на целевой системе.

16. Целочисленное переполнение обнаружено при обра-ботке CSS-свойства letter-spacing. Удаленный пользователь может вызвать переполнение динамической памяти и вы-полнить произвольный код на целевой системе.

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

18. Неизвестная ошибка существует в методе crypto.generateCRMFRequest(). Удаленный пользователь может выполнить произвольный код на целевой системе.

19. Ошибка при обработке сценариев в XBL-элементах может позволить злоумышленнику получить chrome при-вилегии с помощью модуля Print Preview.

20. Уязвимость существует из-за ошибки при провер-ке безопасности в методе js_ValueToFunctionObject(). Уда-ленный пользователь может выполнить произвольный код с помощью setTimeout() и ForEach.

21. Уязвимость существует из-за ошибки взаимодейс-твия между содержимым XUL-окна и механизмом History. Злоумышленник может обманом заставить пользователя взаимодействовать с невидимым пользовательским ин-терфейсом браузера. URL производителя: www.mozilla.com.Решение: Установите последнюю версию с сайта произ-водителя.

Выполнение произвольного кода и отказ в обслуживании в PHPПрограмма: PHP 4.4.2, PHP 5.1.2.Опасность: Высокая.Описание: Переполнение буфера обнаружено в функциях wordwrap(),array_fill() и substr_compare(). Удаленный поль-зователь, контролирующий входные параметры функций, может вызвать отказ в обслуживании или выполнить про-извольный код на целевой системе. Примеры:

URL производителя: www.php.net.Решение: В настоящее время способов устранения уязви-мости не существует.

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

<?$a = str_repeat ("A",438013);$b = str_repeat ("B",951140);wordwrap ($a,0,$b,0);?><?array_fill (1,123456789,"Infigo-IS");?><?substr_compare ("A","A",12345678);?>

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

42

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

Arch Linux: руководство к быстрому старту

Выбор пакетов для Slackware, на ваш взгляд, скудноват, а Gentoo собирается целую вечность? Попробуйте Arch Linux – удачное сочетание гибкости и скорости развертывания.

Валентин Синицын

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

43№5, май 2006

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

В этой статье мы поговорим об Arch Linux (www.archlinux.org) – срав-нительно молодом, первоприн-

ципном (то есть не базирующемся ни на какой из ныне существующих) дис-трибутиве Linux. Это не совсем об-зор – по ходу изложения будут давать-ся советы и рекомендации по практи-ческой работе с системой. Поскольку Arch Linux, как и большая часть сов-ременных ОС, не явно подразумевает, что пользователю не составляет труда выкачать из Интернета 100-200 Мб об-новлений, мы специально остановим-ся на специфике его использования в условиях нашей страны. Сразу же скажу, что речь не идет о локализа-ции – в этом смысле Arch Linux не от-личается от любого другого дистрибу-тива, а данная статья не преследует цель дублировать существующую до-кументацию.

Основателем Arch Linux является Джудд Винет (Judd Vinet). Первая вер-сия дистрибутива под номером 0.1 уви-дела свет 11 марта 2002 года, а теку-щая версия имеет номер 0.7.1 и дати-рована 5 января 2006 года.

Arch Linux является i686-оптимизи-рованным дистрибутивом. Что пони-мается под этими словами? Это зна-чит, все пакеты собираются с клю-чом «-march=i686», то есть использу-ют набор инструкций Pentium II и вы-ше. Как следствие, этот процессор яв-ляется «минимальным системным тре-бованием» к оборудованию. Как зна-ют пользователи Gentoo, пересбор-ка Linux под свою архитектуру позво-ляет достичь определенного (порой – весьма незначительного) прироста производительности, поэтому можно предположить, что на новых компью-терах Arch Linux будет работать быс-трее, чем, например, Slackware (оп-тимизация i486) или SUSE/Mandriva (i586). На самом деле на скорость работы влияет множество парамет-ров, и оптимизация здесь – далеко не главное. Существуют также порты Arch Linux на x86-64 и i586, однако мне не приходилось работать с ними поэ-тому в дальнейшем мы будем говорить только об основной ветви.

Arch Linux – дистрибутив для опыт-ного пользователя. Вы не найдете в нем графических мастеров-конфи-гураторов вроде YaST или Mandriva Control Center: все операции по ад-

министрированию производятся тем путем, который предусмотрел автор той или иной программы. Arch Linux вообще старается выдерживать «ав-торскую» линию – на пакеты почти не накладываются патчи (кроме три-виальных) и т.п. Как утверждает Ви-нет, основные идеи он позаимство-вал у CRUX (www.crux.nu) и Slackware (www.slackware.com) – так что антураж соответствующий.

Arch Linux имеет оригинальную ор-ганизационную структуру. Поскольку он в некотором смысле является дети-щем одного человека, здесь есть чет-ко очерченный набор «официальных» пакетов (коих в версии 0.7.1 насчиты-вается 357 штук) и, как некогда заме-тил Алексей Федорчук: «ни малей-шей тенденции к увеличению их чис-ла не просматривается». Официаль-ный Arch Linux скормен и строг: поми-мо базовой системы (arch-base) сюда входит графическая среда и легкие оконные менеджеры (FVWM, IceWM, WindowMaker), а также средства раз-работки, сервера и основные графи-ческие приложения: AbiWord, Gimp, Mozilla Firefox и Thunderbird. Ни KDE, ни Gnome, ни OpenOffice.org в этом списке нет, но это не значит, что их нет вообще: у «официального» Arch Linux существуют «полуофициальные» са-телиты, в первую очередь – репози-тарий Extra. Это – весьма объемная коллекция пакетов, не поддержива-емая г-ном Винетом лично. Не сто-ит думать, что Extra – нечто вроде linuxpacages.net – это просто репозита-рий, поддерживаемый другими людь-ми, что и придает ему «полуофициаль-ный», но отнюдь не «неофициальный» статус. Между репозитариями сущес-твует тесное взаимодействие, и мно-гие рассматривают Extra как неотъем-лемую часть Arch Linux.

Перечень репозиатриев Arch Linux не исчерпывается Extra и Current (это тот самый «официальный» Arch Linux, из которого в определенные мо-менты времени делают ISO-образы). Упоминания заслуживает Testing, в ко-тором появляются новые, еще не «об-катанные» версии программ (так, на-пример, в состав Arch Linux 0.7.1 входит X11R6.8.2, но на момент выхода дист-рибутива в свет X.Org 7.0 уже был до-ступен в Testing, а в Current он появил-ся лишь в середине февраля) и AUR

(Arch User Repository) – по-настояще-му неофициальный репозитарий, под-держиваемый пользователями Arch Linux. Содержимое AUR, за редким ис-ключением – не готовый бинарный па-кет, а его сборочный сценарий, так на-зываемый PKGBUILD. Arch Linux стре-мится предоставить самые послед-нии версии программ, поэтому вы-ход бинарных пакетов обычно проис-ходит вскоре после релиза исходных текстов (все зависит от конкретного maintainer): так, пакеты с KDE 3.5.2 по-явились в Extra спустя четыре дня пос-ле анонса, а в Testing они были еще за восемь дней до него.

Раз уж мы заговорили о бинарных пакетах и сборке, имеет смысл ска-зать пару слов и о пакетном менед-жере. Для управления двоичными па-кетами в Arch Linux используется ути-лита с забавным названием pacman. Сами пакеты имеют неудобный суф-фикс .pkg.tar.gz. Поддерживаются за-висимости (исключительно жесткие – это вам не Debian) и имеются средс-тва их автоматического разрешения – при помощи того же pacman. Если вы привыкли собирать программы из ис-ходных кодов – нет проблем: для этих целей предназначена благозвучная уху автолюбителя система ABS (Arch Build System) – аналог портов BSD, поз-воляющая быстро и эффективно соб-рать готовый пакет из авторских исход-ных текстов. Можно сказать, что Arch Linux – это бинарный дистрибутив, по-ощряющий сборку из исходных текс-тов: этакий Gentoo со stage3, раздутым до размеров дерева Portage.

Arch Linux использует rc-скрипты в стиле BSD и охотно перенимает све-жие решения. Так, Arch Linux 0.7.1 был одним из первых (но не первым) дис-трибутивом, отказавшимся от Hotplug в пользу Udev, что весьма ускорило загрузку. В него входит собственная система распознавания оборудования (HWD) и поддержка сетевых профилей на уровне стартовых сценариев.

Все это хорошо, спросит внима-тельный читатель, но где же взять Arch Linux? Канонический ответ сво-дится к следующему: скачать с сай-та проекта ISO-образ arch-0.7.1.iso или arch-0.7.1-base.iso (только базо-вая система), а затем догрузить все необходимые пакеты (KDE/Gnome, OpenOffice.org и т. д.) из Extra. К сожа-

Arch Linux: руководство к быстрому старту

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

44

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

лению, для большинства российских пользователей это не-приемлемо, но выход все же есть. Начиная с января этого года ежеквартальные срезы репозитариев Arch Linux мож-но заказать по почте (http://www.linuxcenter.ru/?good=1332). Будем считать, что вам удалось раздобыть Arch Linux тем или иным способом. Что дальше? Конечно же, установка! Весь процесс подробно описан на самом диске, в файле archdoc.txt (потрудившись, его можно найти и на ftp.archlinux.org). Мы же сосредоточимся на некоторых тонкостях, зна-ние которых позволит сделать развертывание системы до-статочно быстрым и безболезненным.

УстановкаИнсталлятор Arch Linux выдержан в духе Slackware: те же сценарии на языке оболочки плюс утилита dialog. Созда-тели дистрибутива настоятельно рекомендуют установить только базовую систему, а оставшиеся пакеты добрать вручную после перезагрузки системы и, как выясняется, не зря. Просматривая плоский список из 350 с лишним паке-тов, не мудрено и утомиться, а выбор двух несовместимых вариантов (например, hotplug и udev – см. выше) приведет к тому, что программа откажется продолжать свою работу и предложит начать все сначала. Зависимости тоже раз-решаются автоматически – никакой возможности поучас-твовать в этом процессе вам не предоставляется, а пото-му случайный выбор, скажем Mozilla Firefox приведет к то-

му, что на вашем компьютере появится вполне полноцен-ная X Window System не самой свежей версии (опять же см. выше). В общем, даже если у вас на руках полноценный DVD со всеми пакетами, будьте осторожны и не пренебре-гайте «советами бывалых».

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

Первая загрузкаПосле перезагрузки системы (которая, кстати, произойдет весьма быстро) вашему взору будет представлена чистая текстовая консоль. Впрочем, если вы все же не послуша-лись старших товарищей и попросили инсталлятор раз-вернуть что-то помимо базовой системы, у вас вполне мо-жет оказаться и X с простеньким оконным менеджером, но речь сейчас не о том. Независимо от того, ограничи-лись ли вы пресловутым arch-base или же выбрали все па-кеты без разбора, наверняка вы захотите установить до-полнител ные программы из репозитария Extra. Допустим также, что у вас, как и у подавляющего большинства насе-ления России, нет быстрого (и дешевого) канала в Интер-нет, поэтому вы где-то раздобыли текущий срез Arch Linux. Что дальше? Устанавливать пакеты, разрешая зависимос-ти вручную или не учитывая их вообще, – не выход. Нуж-но прописать путь к вашему локальному репозитарию Arch Linux (который, кстати, может располагаться в локальной же сети – подумайте об этом, если планируете установить Arch Linux на три и более компьютеров).

К сожалению (или к счастью), специального источника «cdrom», как в apt, в pacman не предусмотрено – програм-ме совершенно не важно, где находится зеркало, заданное тем или иным URL (и это правильно, иначе URL не был бы Универсальным локатором ресурсов). Таким образом, что-бы научить pacman обновляться с CD/DVD-ROM, достаточно прописать путь к локальному репозитарию, используя про-токол file://. Зеркала просматриваются в порядке их объяв-ления в соответствующих секциях файла /etc/pacman.conf, поэтому, добавив нужную строчку в самое начало, вы на-всегда отучите pacman «лазать по Интернету». Впрочем, со-ветую вам приберечь «жесткие меры» на крайний случай: вполне может статься, что вы захотите обновить какую-ни-будь небольшую программу именно из репозитария current, а не с локального диска. Исходя из этого, секция current файла /etc/pacman.conf может иметь следующий вид:

В результате при отсутствии подключения на консоль будет выдаваться множество сообщений о невозможнос-ти соединиться с ftp.foo.bar, а затем pacman установит нуж-ный пакет с DVD-ROM.

С репозитариями Extra и Testing можно поступить так-же, а можно – еще проще – просто добавить:

[current]# Список «настоящих» интернет-серверовInclude=/etc/pacman.d/currentServer= Ошибка! Недопустимый объект гиперссылки.

Рисунок 1. Рабочий стол Arch Linux – ничего необычного. Все самое интересное – за кулисами

Рисунок 2. Сине-бело-черная гамма – визитная карточка Arch Linux. Сайт проекта выдержан в том же стиле

Server=file://<путь к локальному репозитарию>

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

45№5, май 2006

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

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

46

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

«разумном» формате (.tar.gz, .tar.bz2, zip) и PKGBUILD.proto, если речь идет о новом пакете, после чего PKGBUILD.proto переименовывается в PKGBUILD и правится в соответствии с вашими требованиями. В сложных случаях мо-жет потребоваться использовать сце-нарий install, который легко создать на базе install.proto. Написание сце-нариев PKGBUILD находится за рам-ками данной статьи.

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

править значение переменных pkgname (имя пакета) и pkgver (вер-сия). Эти переменные используют-ся для заполнения массива source, содержащего имена архивов с ис-ходными текстами. Если формат нужного вам архива отличается от .tar.gz, нужно внести соответс-твующие изменения.

Естественно, необходимо описать саму процедуру сборки – подпро-грамму build(). В большинстве слу-чаев требуется лишь изменить па-раметры configure.

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

При этом подразумевается, что вы находитесь все в том же подкатало-

ге /var/abs, отвечающем вашему при-ложению.

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

Теперь можно собрать пакет:

Или же сразу и собрать, и устано-вить:

Если вы собрали что-то уникаль-ное и считаете, что ваш PKGBUILD мо-жет быть полезен другим пользовате-лям Arch Linux, подумайте о его публи-кации в AUR.

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

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

ЗаключениеТеперь вы представляете себе, что та-кое Arch Linux. Устанавливать ли эту систему на свой компьютер – решать только вам. Думается, что Arch Linux хорошо подойдет «продвинутым поль-зователям» Linux, которые произво-дят большую часть настроек из кон-фигурационных файлов и не слиш-ком связаны временными рамками, то есть могут позволить себе «дово-дить» систему в свободное от рабо-ты время.

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

в начало соответствующей секции. Для пущей уверенности можно заком-ментировать все остальные сервера. Альтернативный подход к разверты-ванию локального репозитария изло-жен в файле archdoc.txt.

Первую половину пакетного ме-неджмента мы, таким образом, на-строили. Осталось вторая – ABS. К счастью, она требует гораздо мень-шего внимания. В первом приближе-нии (особенно если вы не собираетесь пересобирать пакеты вручную) можно вообще забыть о ее существовании. Но я бы рекомендовал все же синхро-низировать дерево ABS, так сказать, на будущее. Эта задача выполняет-ся командой abs, которая в свою оче-редь использует cvsup, поэтому бо-лее-менее заметный трафик (поряд-ка 10-20 Мб без учета сжатия) будет сгенерирован только в первый раз. Вы же получите в свое распоряжение полностью готовый к использованию каталог /var/abs, а также два файла: PKGBUILD.proto и install.proto, которые можно использовать для компиляции своих собственных пакетов.

Эта операция (как, впрочем, и пересборка уже имеющихся в сис-теме пакетов) происходит следую-щим образом. Вы переходите в под-каталог /var/abs, отвечающий нужно-му вам приложению. Если речь идет о компиляции нового пакета «с ну-ля», каталог для него следует создать в /var/abs/local. Затем в этом ката-логе последовательно размещают-ся: добытый где-либо архив с исход-ными текстами программы в любом

makepkg -g >>PKGBUILD

makepkg

makepkg -i

Рисунок 3. Не нашли нужную программу в основном дистрибутиве. Пришло время обратиться к помощи сообщества – ArchLinux User-community Repository

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

47№5, май 2006

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

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

48

человек номера

Что такое судьба? Нечто навеч-но впечатанное в таинственные скрижали и определяющее каж-

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

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

ществования порой похожи на кадры из детектива с захватывающим сю-жетом.

Первый раз компьютер, тогда это называлось «электронно-вычисли-тельная машина», Алеша Сальников увидел в подростковом возрасте, ког-да учился в физико-математической школе-интернате №18 при МГУ им. Ло-моносова. Представьте себе картину: 15-летние мальчишки входят в комна-ту, где шумят какие-то механизмы, ми-гают лампочки, как на космическом ко-рабле, телетайп выводит рулоны бума-

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

Прихоти судьбыБиография IT-просветителя

Когда-то, протестуя против навязанных жизнью ролей – ученик, студент, преподаватель математики – Алексей Сальников, ныне директор крупнейшего в России IT-портала «ЦИТ Форум» (http://www.citforum.ru), вступил с судьбой в переговоры. Мол, ты дай мне другой вариант самореализации, а я обещаю не ныть на крутых поворотах. Договор вступил в силу.

Page 51: 042 Системный Администратор 05 2006

49№5, май 2006

человек номера

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

Следующий кадр. Наш герой уже учится в университете, успел прой-ти армию и даже поучительствовать в глухом селе на Смоленщине. На 4-м курсе практику Алексей Сальников проходил на ЗИЛе, в суперсовремен-ном вычислительном центре, создан-ном автозаводом и Академией на-ук. «Там было красиво, – вспомина-ет он мечтательно. – В стране таких вычислительных центров практичес-ки не было, разве что в закрытых уч-реждениях, в «ящиках». Сотрудники центра с нами говорили уважитель-но. Видно было, что это правильные люди, с ними было приятно общаться. И возникало желание там трудиться. Я два года параллельно с обучением работал в центре. А после, как закон-чил мехмат МГУ, туда же и распреде-лился. В конце 80-х там были сдела-ны знаменитые компьютеры семейс-тва БЕСТА. Был огромный коллектив. Часть людей занимались «железками», часть – программами. Если бы эту ли-нию продолжать дальше, все было бы хорошо. Но линия, к сожалению, не по-лучила развития».

Новый скачок во времени. Середи-на 90-х. Алексей Сальников – руково-дитель первого в России коммерческо-го учебного центра, чрезвычайно попу-лярного среди людей, внедряющих ин-формационные технологии в финансо-вую, промышленную и телекоммуника-ционную сферы. На учебный центр ра-ботают специалисты высокого уровня. Среди них знаток Интернета, сотруд-ник Курчатовского института. Как-то он пригласил Алексея и его соратни-ков посмотреть, что такое Сеть. Стоп-кадр весьма выразительный, почти ис-торический: «Мы приехали, а как раз случилось несчастье. Тогда Интернет в Россию попадал через Финляндию. И, как на грех, где-то под Питером эк-скаваторщик повредил провод. Поэто-му все очень медленно происходило. Мы смотрели на экран, где не спеша

грузилась какая-то страничка. Однако представить, как это выглядит на нор-мальной скорости, было несложно… Я всегда в нашей фирме занимался вопросами продвижения наших курсов. Это была моя главная обязанность. Когда я увидел, как работает Интер-нет, сразу сказал: «Это место для рек-ламы». А в 1997 году мне совершен-но случайно попалась книга англий-ского автора об интернет-маркетин-ге. И в нашем офисе как раз появил-ся плохонький, медленный, но все же выделенный канал. Бизнес есть биз-нес. Я прочитал книжку, мне стало ин-тересно. Следующий шаг – я объявляю курсы интернет-маркетинга. 60 взрос-лых умных людей приезжают слушать мои лекции. Каждый платит 300 дол-ларов за то, чтобы меня три дня слу-шать. Несколько лет я такой курс чи-тал. Мне было интересно изучать эту тему. В конце 90-х годов я был главным специалистом в России по интернет-маркетингу. Потом я стал проводить конференции по интернет-маркетингу. Толпы народа собирались. Хотя на пер-вых конференциях было очень немного людей, способных сказать что-то внят-ное на эту тему».

Тогда же организаторы Учебно-го центра решили, что хорошо бы на практике воплотить теоретические положения, о которых говорилось на их курсах, и создали ЦИТ Форум. Прос-то для того, чтобы рекламировать свои курсы. Как резюмирует сегодня Алек-сей: «ЦИТ Форум возник из небаналь-ного подхода к рекламе своей продук-ции. Потом продукция исчезла, а инс-трумент остался». Сегодня портал CITForum.ru – не имеющая аналогов техническая библиотека бесплатных ресурсов по информационным техно-логиям на русском языке.

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

Огонь, вода и медные трубыАлексей сам себя называет генера-тором идей. Самая гениальная из них родилась в 1992 году, когда Алексей

с супругой Еленой решили открыть собственное дело. Родилась совер-шенно неожиданно, как побочный про-дукт другой авантюрной идеи.

Сначала семейство рассуждало так: что могут делать и продавать про-граммисты? Естественно, программы. Какие? Для банков, которые первые в стране разбогатели и первыми захо-тели автоматизироваться. Это же золо-тая жила – полторы тысячи банков, ко-торым нужна специальная компьютер-ная программа под названием «Опер-день». Стали собирать информацию – как функционирует банк, какой долж-на быть программа. Читали специаль-ную литературу, свели дружбу с бан-киром, который согласился предоста-вить свой маленький банк в качестве полигона для отработки этой програм-мы, дать деньги на ее разработку. Увы, однажды банкир испарился. И совето-ваться стало не с кем.

Что делать? Ходить на поклон в другие банки? Нет, сказал себе Саль-ников, надо… сделать так, чтобы бан-киры сами пришли к нам. Все гениаль-ное – просто. «Взяли листок бумаги, на-писали: семинар «Автоматизация бан-ковской деятельности», 7-11 сентября 1992 года. Место проведения: Москва, Университет. Семинар платный. Ука-зали номер телефона в комнатке, ко-торую арендовали в университете. Ку-пили базу данных с адресами банков, тогда она продавалась в редакции га-зеты «Коммерсантъ». Написали про-грамму семинара, напечатали, разло-жили в конверты и отправили. Когда письма дошли, наш телефон просто разорвался. Звонили со всей страны из банков, спрашивали, как записать-ся, куда деньги переводить за участие. Почему получился такой эффект, по-нятно. Банкам надо было автоматизи-роваться, но никто не знал, как это де-лать. Мы были первые, кто предложил поучаствовать в семинаре на эту тему. Ну вот записали мы желающих учас-твовать, теперь надо семинар прово-дить. О чем говорить? Стали звонить в IBM, Hewlett-Packard, другие круп-ные компании, отправляли им по фак-су список банков и говорили: «Эти гос-пода желают вас выслушать». Они со-гласились выступить».

Алексей Сальников смеется, ког-да вспоминает первый семинар. За-явок тогда набралась добрая сотня.

Page 52: 042 Системный Администратор 05 2006

50

человек номера

Пригласили только 16 банков, которые оказались в списке первыми, но в ау-диторию, арендованную в Московском университете, набилось человек трид-цать, только успевали стулья подно-сить. Финансисты были непреклонны: мы приехали и мы будем участвовать в семинаре, возьмите деньги и дай-те нам возможность послушать! Се-минар длился целую неделю. Банки-ры остались им довольны. А органи-заторы Центра информационных тех-нологий… проснулись знаменитыми, как пишут в биографиях знаменитых актеров. Их офис на военной кафед-ре факультета ВМК МГУ на ближай-шую пятилетку стал самым популяр-ным местом для банкиров, разработчи-ков банковского софта, а позже – пред-ставителей крупных промышленных предприятий, которые интересовались информационными технологиями и их применением в прикладных областях. Идея писать банковские программы тихо умерла. Зачем, если можно за-рабатывать на семинарах?

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

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

Второе направление – учебные курсы по информационным техноло-гиям (citmgu.ru), которые читаются и по сей день, но, естественно, в эпо-ху обилия информации об IT и Интер-нете, уже далеко не столь популярны. А в 1993-1994 годах, вплоть до 1998-го, на курсы в Москву ехали так же мас-сово… как раньше в московские мага-зины за колбасой, простите за такое приземленное сравнение. Потому что здесь можно было услышать людей, которые знали все про IT, потому что только здесь можно было купить книги о сетях, операционных системах, базах данных и прочем. Дело было организо-вано умно и оперативно. Были собраны лучшие специалисты, которые в рекор-дно короткие сроки писали методички по своим предметам. Например, трех-сотстраничная книжка создавалась за три месяца! Сдавали свои учебники спецы по частям. Так что когда из-под пера автора выходили последние стро-ки, первые главы уже были не только отпечатаны, прочитаны корректора-ми, оформлены, проиллюстрированы нужными схемами, картинками и таб-личками, но даже размножены в соот-ветствии с количеством слушателей.

Потом приезжали «студенты» и полу-чали на руки две книги. Одна – крат-кое изложение лекций, другая – сбор-ник слайдов, которые преподаватели показывали в ходе учебы. Слушатели ничего не записывали в тетради, учи-теля ничего не писали на доске. На это не было времени. Предельная автома-тизация организации учебы, опера-тивность подачи информации принес-ли ЦИТу оглушительный успех. Неко-торые сотрудники отделов автомати-зации банков и крупных предприятий приезжали просто купить книги. Це-нообразование было простое: доллар за страницу… И покупали с большим удовольствием.

В эйфории успеха Алексей Сальни-ков и его коллеги не заметили, как по-ток слушателей резко уменьшился, опомнились только когда он совсем сошел на нет. Наступили другие вре-мена. Однако судьба, благосклонная к Алексею, приготовила ему «задел» для создания нового дела. Тот самый сайт в Интернете, который когда-то вы-весили для рекламы курсов. IT-портал стал новым делом Алексея. И тоже, ес-тественно, уникальным, ведь делать что-то как все – неинтересно!

Новый МакаренкоСегодня Алексей Сальников знает о своей новой сфере деятельности все. Как работать с рекламодателями, как строить работу портала. Хотя при-

Page 53: 042 Системный Администратор 05 2006

51№5, май 2006

человек номера

знается, что никогда не думал зани-маться изданием СМИ и получать до-ходы от рекламы! А мне такой поворот судьбы в жизни нашего героя совсем не кажется неожиданным. Ведь глав-ная задача IT-портала ЦИТ Форум – да-вать людям знания. Библиотекой пор-тала ежедневно пользуются тысячи IT-специалистов и менеджеров, пре-подавателей и студентов вузов. Поч-ти везде информационные техноло-гии преподают с помощью ЦИТ-Фору-ма. Преподаватели готовятся к лек-циям по скачанным материалам, да-ют студентам не домашние задания, а ссылки на ресурсы ЦИТ Форума. Так что ничего не изменилось кардиналь-но в деятельности Алексея Сальнико-ва. Он по-прежнему учит народ.

А ведь будучи студентом, Алексей мог легко угадать, что судьба ему при-готовила именно эту миссию – просве-тителя. Звучит патетически, но истина всегда немного банальна. Исключен-ный из университета на третьем кур-се, недоучившийся математик подался в учителя. Приехал в Смоленскую об-ласть, явился в облоно, оттуда его от-правили в дальнюю школу, где не было учителя математики. Доехал до шко-лы и… попал в тупик: учителя иска-ли летом, а он приехал в январе. Ко-нечно, вакансию давно уже худо-бед-но закрыли… Ехать назад не хотелось, и Алексей согласился на предложения директора школы-интерната стать вос-

питателем, то есть наблюдать за ре-бятами с первого по восьмой класс, которые приезжали в этот интернат из мелких окрестных сел на неделю. У Сальникова самые приятные воспо-минания о том периоде жизни: «На-до было прийти после уроков в шко-лу, забрать детей, сводить на обед, потом поиграть с ними, потом они са-дились делать уроки, я их консульти-ровал. Времени свободного у меня был вагон. Развлечений не было ни-каких. Была библиотека. Я брал там книги, например, сочинения Макарен-ко, шел домой – а я арендовал в этой деревне избу с огромной русской печ-кой в пол-комнаты – ложился на печ-ку и читал. Детишки были счастливы, ведь до этого их воспитывали скуч-ные пожилые бабушки. А я с ними иг-рал в футбол…».

Но даже не в этом был знак судьбы-благодетельницы, а в том, что, будучи воспитателем, Алексей научил читать одного деревенского мальчика. Па-рень учился в пятом классе и для крес-тьянской жизни имел все необходи-мые навыки – классно водил трактор и профессионально курил «Беломор». А вот читать в начальной школе ребен-ка не научили – просто с учительни-цей они не встречались никогда, доку-мент выдали, чтобы не портить цифры успеваемости по району. Занимались Алексей Михайлович и неграмотный пятиклассник после отбоя. Экспери-

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

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

Сам Алексей рассуждает скеп-тически: «Я знаю людей, моих одно-классников, которые добились гораздо большего, возглавляют крупнейшие IT-компании. По масштабам бизнеса они заведуют крейсерами. А у меня – ло-дочка…» Но именно эта лодочка выво-дит корабли в бурное море IT-техноло-гий. Без нее, возможно, ни один крей-сер не сдвинулся бы с места. Ну, или сделал бы это значительно позже.

Неплохую альтернативу предло-жила Алексею Сальникову судьба – быть на 100% востребованным. Ни он, ни кто другой не знает, каким конкрет-ным делом будет заниматься сегод-няшний директор ЦИТ Форума через полгода. Но я убеждена, что работать он будет вновь под грифом «Впервые в России» и обязательно – просвещать. Попутного ветра в парусах!

Оксана Родионова

Page 54: 042 Системный Администратор 05 2006

52

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

Настраиваем эффективную систему сетевой защиты Zorp

ModSecurity – Open Source firewall седьмого уровня – позволяет защититься от угроз, типичных для веб-сервера. Но в обычной сети можно встретить и другие сервисы, также нуждающиеся в защите.

Сергей Яремчук

Page 55: 042 Системный Администратор 05 2006

53№5, май 2006

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

Фильтры пакетов вроде ipchains во время работы использу-ют самые простые критерии,

и для фильтрации основываются на информации, содержащейся в за-головках IP-пакетов: IP-адреса источ-ника и назначения, протокол и номера портов источника и назначения, взя-тые с TCP/UDP-протоколов следую-щего уровня.

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

В Netfilter/iptables ядра 2.4/2.6 эта проблема решается за счет контро-ля состояния (stateful) флагов и по-рядковых номеров ТСР. Такой фильтр работает аналогично предыдущему и дополнительно просматривает фла-ги TCP и UDP-пакетов, а поэтому мо-жет определить, является ли этот па-кет попыткой установления нового со-единения. Если да, то в таблице состо-яний делается новая запись и действие разрешается, если нет, то проверяет-ся принадлежность существующим со-единениям и при положительном ре-зультате пакет пропускается. Кроме явного отсеивания приходящего мусо-ра, такие фильтры упрощают написа-ние правил фильтрации. Например, ес-ли ранее требовалось явно разрешить в правиле оба направления, т.е. от кли-ента к серверу и от сервера к клиен-ту, то теперь достаточно просто раз-решить соединение с сервером, за-бота же о доставке информации кли-енту полностью ляжет на плечи филь-тра пакетов.

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

прос большой длины или попробо-вать реализовать сross-site scripting атаку. Без посредника здесь точно не обойтись.

Подход ZorpСоздатель Syslog-NG венгр Балазс Шайдлер (Balazs Scheidler) разра-ботал еще одно полезное приложе-ние – Zorp. На заглавной странице сайта проекта [2] он дословно име-нуется как Modular Application Level Gateway (хотя в некоторых документах его название несколько другое – new generation proxy firewall).

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

Но в отличие от ModSecurity, ко-торый является отдельным приложе-нием и в идеальных условиях требу-ет установки на отдельный компью-тер, Zorp фактически представляет собой расширение к Netfilter/iptables. Таким образом, вся обработка проис-ходит на одном-единственном ком-пьютере, который находится на входе сети, что освобождает её от пакетов, которые все равно будут отброшены. Кроме того, функции устройств защи-

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

Взаимодействие сервера и клиента в случае использования Zorp показа-но на рис. 1. Клиент, желая установить соединение, посылает TCP SYN-пакет, который поступает на маршрутизатор с установленным iptables (ipchais), ис-пользующим Zorp. Полученный пакет проверяется на соответствие правил iptables. Если он должен быть обрабо-тан Zorp, то в записи следует указать цель TPROXY (iptables) или REDIRECT (ipchains). В качестве одного из пара-метров указывается порт, где Zorp бу-дет ждать подключения. Zorp получа-ет пакет, проверяет его на соответс-твие со своими правилами и запуска-ет соответствующий прокси, который инициализирует соединение с серве-ром и дальше действует уже от име-ни клиента, а в процессе работы про-веряет проходящий поток данных. Ес-тественно, и остальные цепочки так-же должны пропускать обработанные Zorp пакеты.

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

Рисунок 1. Принцип работы Zorp

Page 56: 042 Системный Администратор 05 2006

54

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

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

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

Версии ZorpВ настоящее время доступны три версии Zorp: Zorp Pro, Zorp GPL и Zorp Unofficial.

Zorp Unofficial ранее играл роль тестовой бета-версии, но последние два года фактически не развивается, его мож-но свободно получить на сайте [3].

Самой продвинутой является коммерческий Zorp Pro, представляющий собой доработанный Debian, который можно установить за 10 минут (без настройки). В его со-ставе имеются: 16 модулей, контролирующих свои протоколы; сервер управления (Zorp Management Server – ZMS),

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

возможно подключение модуля антивирусной провер-ки;

строгая аутентификация по любому протоколу, генери-рование ключей на лету на основании информации кли-ента;

возможность горячей перезагрузки без разрыва сущес-твующих связей;

техническая поддержка.

GPL-версия, распространяемая свободно, не имеет та-ких богатых возможностей, в ней есть модули, позволя-ющие контролировать только 6 типов протоколов (HTTP, FTP, PSSL, TELNET, WHOIS, FINGER) и Plug. Последний работает без проверки протокола и поддерживает про-токолы, использующие только один порт (SSH, MySQL, VNC, Microsoft Terminal Service, GOPHER, SMB/CIFS, TALK, SYSLOG, RSYNC). Также в GPL-версии для SSL возможна работа только с заранее сгенерированными ключевыми парами. И готовьтесь к тому, что собирать и настраивать все это придется самостоятельно и вручную. Используя версию Pro, относительно просто организовать однократ-ную аутентификацию (SSO – Single-sign-on authentication), с Zorp GPL сделать это невозможно. Осталось добавить, что использование Netfilter налагает ограничение по опе-рационной системе, здесь только GNU/Linux. Cам прокси в Zorp написан на языке С, а модули контроля – с приме-нением языка высокого уровня Python.

Установка Zorp GPLБалазс Шайдлер по совместительству является одним из майтайнеров Debian, поэтому самым простым спосо-бом установки является использование этого дистрибу-тива, который затем обновляется его до ZorpOS. Для это-го достаточно установить базовые пакеты Debian, затем

в файл /etc/apt/sources.list занести (для версии 3.0 woody) следующие строки:

И дать команду на обновление и установку:

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

Версии ядра 2.2 уже имеют встроенный прозрачный прокси, и для его активации требуется только включить в меню «Networking options → IP: firewalling», и активируем «Transparent proxy support». В следующих версиях 2.4/2.6, ког-да был введен iptables, такая возможность была убрана, по-этому перед компиляцией необходимо будет наложить патч tproxy [4]. Имя патча имеет вид cttproxy-2.6.15-2.0.4.tar.gz, где 2.6.15 означает версию ядра, для которого он предназна-чен, а 2.0.4 – версию tproxy. Также следует помнить о двух совместимостях. Версии TProxy 1.2.x совместимы со всеми версиями Zorp, но не подходят к ядрам серии 2.6, а версия TProxy 2.0 будет работать с ядрами 2.4 и 2.6, но совмести-ма только с Zorp, начиная с 2.1.9.

Для примера используем ядро 2.6.15:

Патчи для ядра находятся в каталоге patch_tree, не все являются обязательными, достаточно установить только 03-tproxy.diff.

При конфигурировании в «Networking options → IP: Netfilter Configuration → ...» включаем «Connection tracking», «IP tables support», «Full NAT» и «Transparent proxying» (см. рис. 2) с дополнительными опциями. В .config-файле это выглядит так:

Кроме того, для прозрачного прокси необходим вирту-альный dummy-интерфейс. Проследите, чтобы во вкладке «Network device support» был активирован пункт «Dummy net driver support». Если в процессе работы Zorp возник-

deb http://apt.balabit.hu/zorp-gpl-os/ ↵ zorp-os-3.0/3.0 security zorp-os common-gpl zorp-gpldeb http://apt.balabit.hu/zorp-gpl-os/ ↵ zorp-os-3.0/3.0 zorp-os common-gpl zorp-gpl

# apt-get -u upgrade

# tar xzvf cttproxy-2.6.15-2.0.4.tar.gz# tar xjvf linux-2.6.15.tar.bz2# cd linux-2.6.15

# for i in ../cttproxy-2.6.15-2.0.4/patch_tree/ ↵ 0{1,2,3}*.diff; do cat $i | patch -p1; done

CONFIG_NETFILTER=mCONFIG_IP_NF_TPROXY=mCONFIG_IP_NF_MATCH_TPROXY=mCONFIG_IP_NF_TARGET_TPROXY=mCONFIG_IP_NF_IPTABLES=mCONFIG_IP_NF_NAT=m

Page 57: 042 Системный Администратор 05 2006

55№5, май 2006

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

нут проблемы, то следует добавить отладочной инфор-мации. Заглянув в net/ipv4/netfilter/iptable_tproxy.c, найде-те строку:

То есть отладочный режим можно активировать глобально, поставив «CONFIG_ NETFILTER_DEBUG=y» либо заменив первую строку на:

В последних версиях модуль iptable_tproxy.o загружает-ся автоматически при запуске по мере необходимости, ес-ли используете ядро версии 2.4 или более ранние 2.6, то за-грузите его вручную при помощи modprobe.

Если с ядром все в порядке, то следующим шагом моди-фицируем и пересобираем утилиты iptables, чтобы они мог-ли работать с новой таблицей tproxy и новой целью TPROXY. В подкаталоге iptables лежат два патча. Один – для версии iptables 1.2.7a, второй – для 1.3

Zorp состоит из библиотеки libzorpll и собственно zorp. Последними версиями на момент написания статьи были libzorpll_3.1.2.2 и zorp_3.0.9.tar.gz. Каких-либо особенностей по их установке нет, делаем это обычным образом.

Настраиваем Dummy-интерфейсВо избежание недоразумений dummy-адрес не должен принадлежать реально существующему сетевому ад-ресу. В Debian добавляем следующие строки в файл /etc/networking/interfaces:

В RedHat и клонах, а также SuSE это будет файл ifcfg-dummy0, лежащий в /etc/sysconfig/network:

И затем:

В Slackware /etc/rc.d/ создаем файл /etc/rc.d/rc.inet4 та-кого содержания:

И запускаем:

Настраиваем ZorpДля настройки Zorp используются три файла, которые по умолчанию должны лежать в /etc/zorp/. Файл instances.conf содержит список примеров Zorp, с которыми нужно работать, и запускаемые сценарием zorpctl. Другой файл, zorpctl.conf, содержит глобальные настройки, связанные с работой самого zorpctl (разрешение автоматического рестарта, pid файл, дополнительные аргументы команд-ной строки). И третий файл, policy.py, хранит правила и по-литики, связанные с примерами.

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

Тогда при запуске утилиты zorpctl будут проверяться со-ответствующие разрешения.

Рисунок 2. Для использования Zorp необходимо пересобрать ядро

#if 1

# modprobe iptable_tproxy.o# lsmod | grep -i tproxy

iptable_tproxy 14340 0ip_nat 17600 1 iptable_tproxyip_conntrack 45516 2 iptable_tproxy,ip_natip_tables 9624 1 iptable_tproxy

# tar xzvf iptables-1.3.3.tar.gz# cd iptables-1.3.X# cat ../cttproxy-2.6.15-2.0.4/iptables/ ↵ iptables-1.3-cttproxy.diff | patch -p1# chmod +x extensions/.tproxy-test# make KERNELDIR=/usr/src/linux-2.6.15

auto dummy0iface dummy0 inet static address 10.2.3.4 netmask 255.255.255.255

BOOTPROTO='static'IPADDR='10.2.3.4'NETMASK='255.255.255.255'STARTMODE='onboot'

# ifup dummy0

# /etc/rc.d/rc.inet4 start

Starting network dummy0 as 10.2.3.4/255.255.255.255…

CHECK_PERMS="1"CONFIG_DIR=/etc/zorpCONFIG_DIR_OWNER=rootCONFIG_DIR_GROUP=zorpCONFIG_DIR_MODE=0750

# zorpctl start

Config directory has invalid permissions, expected:dir='/etc/zorp', owner='root', group='zorp', perm='0750'

# groupadd zorp# chown root:zorp /etc/zorp# chmod 0750 /etc/zorp/# zorpctl start

Starting Zorp Firewall Suite

#!/bin/shDEVICE='dummy0'DHCP='no'IPADDR='10.2.3.4'NETMASK='255.255.255.255'PROBE='no'. /etc/rc.d/functions-network "$@"

#ifdef CONFIG_NETFILTER_DEBUG#define DEBUGP printk

Page 58: 042 Системный Администратор 05 2006

56

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

Для удобства предположим, что на межсетевом экране имеются три сетевых интерфейса: eth0 – интранет-интерфейс с IP 192.168.0.1/24 – local; eth1 – DMZ с IP 10.0.0.1/24 – dmz; eth2 – Интернет с IP 111.222.333.444 – internet.

Дописываем в instances.conf. следующие строки:

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

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

Подключаем модули для работы c протоколами http, ftp, ssl и plug:

Ниже определяются зоны с соответствующими адресами и сервисами, которые они обеспечивают. Обратите внима-ние, что значения исходящих (outbound) и входящих (inbound) сервисов выбираются относительно самой зоны, а не меж-сетевого экрана. Поэтому, например, если из Интернета будут обращаться с запросом к веб-серверу, расположен-ному в DMZ, то это будет указано как outbound. В качестве названий допущенных сервисов можно выбрать любые, но при большом их количестве очень легко запутаться, поэто-му лучше выбрать такое описание, чтобы оно показывало его суть. Также если, например, для локальных пользова-телей разрешен доступ (outbound) к веб-серверу в DMZ (на-зовем параметр local_http), то он должен быть обязательно прописан и в inbound в записи dmz. Пустое значение означа-ет отсутствие параметров, т.е. фактически запрет сервисов, а звездочка «*» означает разрешение всех сервисов, кото-рые описаны в файле, а не все, которые вообще возможны. Но здесь необходимо помнить, что Zorp обрабатывает толь-ко те пакеты, которые передают ему Netfilter и TPROXY.

Для примера разрешим доступ к серверу, находящему-ся в DMZ, из локальной сети по протоколам http и для уда-ленного управления ssh, а из внешней сети – по http.

И теперь сервисы. Описание сервиса состоит из ис-ходной зоны, протокола и зоны назначения. Если услуга прозрачна и зона назначения не определяется, то ее опи-сание опускается. После адреса указывается порт, на ко-торый iptables будет направлять пакеты, предназначенные для этого сервиса.

В отличие от других сервисов веб-сервис имеет конкрет-ное расположение, поэтому направляем трафик internet_http при помощи DirectedRouter, а не TransparentRouter, как бы-ло в остальных случаях. Возможен вариант InbandRouter(), который соответствует непрозрачному прокси.

На первый взгляд, составлять правила очень непросто, но если заранее распланировать ресурсы, к которым требу-ется организовать доступ, указать адреса и порты, то пра-вила напишутся относительно быстро. Для того чтобы не запутаться в номерах портов, лучше выбирать их пример-но так: 22 → 50022 или 80 → 50080. Кроме того, на сай-те [3] и в документации проекта, можно найти ряд приме-ров позволяющих организовать: HTTPS-прокси, в том чис-ле и без шифрования трафика к серверу, включить адрес клиента в http-заголовок, избежать подбора пароля в ssh, поддерживать виртуальный узел, ограничить полосу и не-которые другие.

Вот так можно организовать фильтрацию содер-жимого URL http-запроса, для этого добавляем сервис local_internet_http и даем ему такое описание.

InetZone('local', '192.168.0.0/24' "## здесь через запятую можно указать несколько адресов outbound_services=["local_http", "local_ssh"]], inbound_services=[]) InetZone('dmz', '10.0.0.0/24', inbound_services=["local_http", "local_ssh", ↵ "internet_http"] )InetZone('internet', '0.0.0.0/0', outbound_services=["internet_http"], inbound_services=["*"])InetZone("localzone", "127.0.0.0/8", inbound_services=["*"])

def local(): Service("local_http", HttpProxy, router=TransparentRouter()) Service("local_ssh", PlugProxy, router=TransparentRouter())# вместо PlugProxy можно использовать PsslProxy

Listener(SockAddrInet('192.168.0.1', 50080), "local_http") Listener(SockAddrInet('192.168.0.1', 50022), "local_ssh")def dmz(): pass

def internet(): Service("internet_http", HttpProxy, router=DirectedRouter(SockAddrInet('10.0.0.2',80), ↵ forge_addr=TRUE)) Listener(SockAddrInet('111.222.333.444 ', 50080), "internet_http")

from Zorp.Matcher import *

class IDHttp(HttpProxyURIFilter):

local -v3 -p /etc/zorp/policy.py --autobind-ip 10.2.3.4dmz -v3 -p /etc/zorp/policy.py --autobind-ip 10.2.3.4internet --verbose=5 --policy /etc/zorp/policy.py ↵ --autobind-ip 10.2.3.4

zorp_ftp -v4 -p /etc/zorp/policy.py --threads 500 -- ↵ --no-auto-restart --fd-limit 1024 ↵ --process-limit 512

Zorp.firewall_name = 'zorp.domain.com'

from Zorp.Core import *from Zorp.Plug import *from Zorp.Http import *from Zorp.Ftp import *from Zorp.Pssl import *

Page 59: 042 Системный Администратор 05 2006

57№5, май 2006

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

Как видите, вначале на основе стандартного класса HttpProxyURIFilter, который определен в модуле Addon.py (по умолчанию в нем используются файлы blacklist-http и blacklist-http.ignore), был создан новый класс IDHttp, и за-тем применен при описания сервиса. Файлы http.black и http.white содержат список регулярных выражений, здесь мож-но указать URL, к которым необходимо запретить доступ, слова, при нахождении в запросе которых он будет пре-рываться. Например, добавив строку .*exe, можно запре-тить скачивать файлы с указанным расширением. Чтобы по ошибке не запретить доступ к ценным ресурсам, их сто-ит занести в http.white.

Используя следующую конструкцию, можно организо-вать NAT средствами самого Zorp.

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

Построение правил iptablesТаблица tproxy содержит все встроенные цепочки, наибо-лее естественно использовать PREROUTING. Самое про-стое правило, которое направит нужный пакет в Zorp, вы-глядит так:

Но чтобы не засорять Zorp мусором, отсеивая пакеты, которые не должны проходить через фильтр, средствами самого Netfilter, лучше указать интерфейс, с которого ожи-дается пакет, поэтому для каждого создадим свои цепочки. Остальные пакеты будут проходить в соответствии с поли-тикой по умолчанию (-Р):

Создаем цепочки для каждого интерфейса:

И привязываем их к своему интерфейсу:

Заполняем:

И разрешаем прохождение по цепочке INPUT:

Теперь можно запускать Zorp: «zorpctl start» и прове-рить результат.

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

Ссылки:1. Яремчук С. Как повысить безопасность веб-приложений. –

Журнал «Системный администратор», №2, 2006 г. – 60-64 с.2. Сайт проекта Zorp – http://www.balabit.com.3. Неофицальный сайт Zorp – http://zorp-unoff.sourceforge.net.4. Патч tproxy – http://www.balabit.com/products/oss/tproxy.5. Статья в «Linux Journal» – «Application Proxying with Zorp, Part

I и Part II»– http://www.linuxjournal.com.6. Статья в немецком «Linux magazin», № 12/04 – «Ampel-

Schaltung» – http://www.linux-magazin.de.

NATPolicy("local-internet", cacheable=TRUE, nat=GeneralNAT([(InetDomain(111.222.333.444/24'),InetDomain('192.168.0.0/24'))]))

NATPolicy("internet-local", cacheable=TRUE, nat=GeneralNAT([(InetDomain('192.168.0.0/24'),InetDomain('111.222.333.444/24'))]))

class DmzHTTP(HttpProxy): def config(self):HttpProxy.config(self)self.response["GET", "404"] = (HTTP_RSP_POLICY, self.filter404) def filter404(self, method, url, version, response):self.error_status = 404self.error_info = "Requested page was not accessible."return HTTP_RSP_REJECT

# iptables -t tproxy -A PREROUTING -j TPROXY --on-port 50080

# iptables -t tproxy -P PREROUTING ACCEPT

# iptables -t tproxy -N PRlocal# iptables -t tproxy -N PRdmz# iptables -t tproxy -N PRinternet

# iptables -t tproxy -A PREROUTING -i eth0 -j PRinternet# iptables -t tproxy -A PREROUTING -i eth1 -j PRlocal# iptables -t tproxy -A PREROUTING -i eth2 -j PRdmz

# iptables -t tproxy -A PRlocal -p tcp --dport 80 ↵ -j TPROXY --on-port 50080# iptables -t tproxy -A PRlocal -p tcp --dport 22 ! ↵ -d zorp.domain.com -j TPROXY --on-port 50022# iptables -t tproxy -A PRintenet -p tcp --dport 80 ↵ -j TPROXY --on-port 50080

# iptables -P INPUT DROP# iptables -A INPUT -m tproxy -j ACCEPT# iptables -A INPUT -m state ↵ --state ESTABLISHED,RELATED -j ACCEPT# iptables -A INPUT -i lo -j ACCEPT# iptables -N LOlocal# iptables -A INPUT -i eth1 -j LOlocal# iptables -A LOlocal -p tcp --dport 22 --syn -j ACCEPT# iptables -A LOlocal -p udp --dport 53 -j ACCEPT# iptables -A LOlocal -p tcp --dport 25 --syn -j ACCEPT# iptables -A LOlocal -j LOG --log-prefix "LOblue DROP: "# iptables -A LOlocal -j DROP# iptables -N LOdmz# iptables -A INPUT -i eth2 -j LOdmz # iptables -A LOdmz -p udp --dport 53 -j ACCEPT# iptables -A LOdmz -j DROP# iptables -N LOinternet # iptables -A INPUT -i eth0 -j LOinternet# iptables -A LOinternet -p udp -sport 53 -j ACCEPT# iptables -A LOinternet -p tcp --dport 25 --syn -j ACCEPT# iptables -A LOinternet -j DROP

matcher=RegexpFileMatcher('/etc/zorp/http.black', ↵ '/etc/zorp/http.white') def config(self): HttpProxyURIFilter.config(self) self.transparent_mode = 1def regexp(): Service("local_internet_http", IDHttp) Listener(SockAddrInet("192.168.0.1", 50090), ↵ " local_internet_http ")

# iptables -t tproxy -P OUTPUT ACCEPT

Page 60: 042 Системный Администратор 05 2006

58

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

Генная инженерия на службе распаковки PE-файлов

Крис Касперски

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

Как хитро я вас обманул! Ни о генах, ни о хромосомах речь здесь не идет. Искусственный

интеллект отдыхает на задворках ис-тории. Genetic – в переводе с гречес-кого «общий». Генетический распа-ковщик – универсальный распаков-щик, общий для всех упаковщиков/протекторов. Кстати говоря, «General Motors» – это не «двигатели для гене-

ралов», а двигатели вообще. Почувс-твуйте разницу!

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

перерасходу памяти и тормозит всю систему. Подробности – в статье «па-ковать или не паковать», электронную копию которой можно бесплатно ска-чать с ftp://nezumi.org.ru).

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

Page 61: 042 Системный Администратор 05 2006

59№5, май 2006

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

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

Но не будем философствовать на моральные темы, луч-ше поговорим о деле. А говорить мы будем преимуществен-но о PE-файлах NT-подобных системах (включая 64-битные редакции оных), в UNIX-мире упаковщиков намного мень-ше, но все-таки они есть (взять хотя бы Shiva ELF-protector). Если не углубляться в «политические» тонкости разногла-сий между UNIX и Windows, алгоритм распаковки – тот же самый, поэтому не будем на нем останавливаться, а пос-корее ринемся в бой!

Предварительный анализПрежде чем приступать к распаковке, не помешает убедить-ся: а упакована ли программа вообще? Графическая вер-сия IDA Pro поддерживает специальную панель «overview navigator», позволяющую визуализировать структуру ди-зассемблерного кода. В нормальных программах машин-ный код занимает значительную часть от общего объема, остальная часть приходится на данные (см. рис. 1).

В упакованных программах кода практически нет, и все пространство занято данными (см. рис. 2), объединенны-ми в один (или несколько) огромных массивов, которые IDA Pro не смогла дизассемблировать.

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

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

Попробуем взглянуть на таблицу секций (в hiew это де-лается так: <F8> – header, <F6> – ObjTbl). В нормальных

программах присутствуют секции с именами .text, .CODE, .data, rdata, .rsrc и, что самое главное, виртуальный размер (VirtualSize) кодовой секции практически всегда совпада-ет с физическим (PhysSize). К примеру, в «Блокноте», вхо-дящем в штатную поставку NT, разница составляет все-го 6600h – 65CAh == 36h байт, объясняемых тем, что вир-туальная секция, в отличие от физической, не требует вы-равнивания (см. рис. 3). А теперь упакуем наш файл с по-мощью ASPack (или аналогичного упаковщика) и посмот-рим, что от этого изменится (см. рис. 4):

Рисунок 1. Структура нормальной, неупакованной программы

Рисунок 2. Структура упакованной программы

Листинг 1. Пример бессмысленного (зашифрованного/упакованного) кода

01010072h imul esi, [edx+74h], 416C6175h01010079h ins byte ptr es:[edi], dx0101007Ah ins byte ptr es:[edi], dx0101007Bh outsd0101007Ch arpl [eax], ax0101007Eh push esi0101007Fh imul esi, [edx+74h], 466C6175h01010086h jb short loc_10100ED01010088h add gs:[ebx+5319Dh], cl0101008Fh add [ebx], cl

Рисунок 3. Раскладка секций неупакованного файла

Рисунок 4. Раскладка секций упакованного файла

Рисунок 5. Подсчет энтропии с помощью редактора HTE

Page 62: 042 Системный Администратор 05 2006

60

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

Ого! Сразу появились секции .aspack и .adata с именами, говорящими самими за себя. Впрочем, имена секций мож-но и изменить – это не главное. Вир-туальный размер секции .text (7000h) в два раза отличается от своего физи-ческого размера (3800h). А вот это уже говорит о многом! На самом деле, со-здателю ASPack было лень использо-вать «правильную» стратегию програм-мирования, вот он и выделил виртуаль-ный размер заблаговременно. Сущест-вуют упаковщики, «трамбующие» упа-кованные секции так, что виртуальный размер совпадает с физическим, а не-обходимая память динамически выде-ляется в процессе распаковки вызо-вом VirtualAlloc.

Еще можно попробовать измерять энтропию (меру беспорядка или сту-пень избыточности) подопытного фай-ла. Популярный hex-редактор HTE это умеет (см. рис. 5). Чем больше значе-ние энтропии, тем выше вероятность, что файл упакован и соответственно наоборот. Однако этот прием сраба-тывает далеко не всегда…

Также хотелось бы обратить внима-ние на бесплатную утилиту PEiD (http://peid.has.it), автоматически определяю-щую большинство популярных упаков-щиков/протекторов по их сигнатурам (см. рис. 6), и даже пытающуюся их рас-паковать. Впрочем, с распаковкой де-ла обстоят неважно, и лучше восполь-зоваться специализированными рас-паковщиками или написать свой собс-твенный (чуть позже мы покажем как).

Распаковка и ее альтернативыПозвольте задать дурацкий вопрос. В стремлении как можно быстрее рас-паковать программу, мы зачастую да-же не успеваем задуматься: а зачем?! Сразу же слышу возражения: мол, упа-кованную программу невозможно ди-зассемблировать. Да, невозможно, ну и что? Зато ее можно отлаживать, ис-

Поэтому универсальный распаков-щик никогда не помешает!

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

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

В поисках OEPСоздание распаковщика начинается с поиска OEP (Original Entry Point – ис-ходная точка входа). Наш депротек-тор должен как-то определить момент завершения распаковки/расшифров-ки «подопытной» программы – когда распаковщик выполнил все, что хотел, и уже приготовился передавать управ-ление распакованной программе-но-сителю. Это самая сложная часть ге-нетических распаковщиков, поскольку определить исходную точку входа в об-щем случае невозможно, вот и прихо-дится прибегать к различным ухищре-ниям. Чаще всего для этого использу-ется пошаговая трассировка, которой очень легко противостоять (чем боль-шинство упаковщиков/протекторов и занимается). Немногим лучше с за-дачей справляются трассеры нулевого кольца. Справиться с грамотно спро-ектированным трассером средствами прикладного уровня (а большинство упаковщиков/протекторов работают именно там) практически невозмож-но, однако разработка ядерных трассе-ров – слишком сложная задача для на-чинающих, поэтому лучше использо-вать готовый, разработанный группой легендарного Володи с не менее леген-дарным WASM. Правда, коммерческая составляющая до сих пор неясна и до-ступ к трассеру есть не у всех.

пользуя классический набор техник, подробно описанный в «фундамен-тальных основах хакерства» (элек-тронная копия лежит на ftp://nezumi.org.ru). Вот тут кто-то говорит, что не-которые упаковщики активно сопро-тивляются отладке! Что ж, попробуй-те запустить soft-ice уже после того, как упаковщик уже отработает свое и на экране появится главное окно про-граммы (NT, в отличии от 9x, позволяет пускать soft-ice в любое время) или ус-тановите неофициальный патч IceExt (http://stenri.pisem.net), скрывающий от-ладчик от большинства защит.

Ряд утилит типа LordPE (http://mitglied.lycos.de/yoda2k/news.htm) поз-воляет снимать с программы дамп пос-ле завершения распаковки, и хотя по-лученный образ exe-файла зачастую оказывается вопиюще некорректным и работающим нестабильно, для ди-зассемблирования он вполне приго-ден, особенно если его использовать в связке с отладчиком, помогающим «подсмотреть» значения некоторых переменных на разных стадиях ини-циализации.

Ах да! Упакованную программу не-льзя модифицировать, то есть накла-дывать на нее patch. То есть, даже пос-ле того как мы найдем заветный Jx, отключающий защиту, мы не сможем модифицировать упакованный файл, поскольку никакого Jx там, естест-венно, нет! Стоп! Кто говорит о взло-ме?! Этот прием используют не толь-ко хакеры! Некоторые вирусы так глу-боко вгрызаются в программу (и каж-дый раз немного по-разному), что «вы-ломать» их оттуда, не нарушив функ-циональности, нереально, вернее, ре-ально, но очень-очень трудно. Гораз-до легче найти Jx, ведущий к проце-дурам «размножения», и «вырезать» их. То же самое относится и к функци-ям деструкции...

Вот на этот случай и были приду-маны он-лайновые патчеры (on-line patchers), правящие программу «на ле-ту» непосредственно в оперативной памяти, минуя диск.

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

Рисунок 6. Внешний вид утилиты PEiD, автоматически определяющий тип упаковщика/проектора

Page 63: 042 Системный Администратор 05 2006

61№5, май 2006

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

На самом деле прибегать к трассировке никакой необхо-димости нет – одних лишь аппаратных точек останова для нашей задачи будет вполне достаточно. Иногда приходится слышать мнение, что работа с аппаратными точками оста-нова возможна только из режима ядра, то есть из драйве-ра. Это неверно. В «записках мыщъх’а» (электронную ко-пию которой можно свободно скачать с ftp://nezumi.org.ru) показано, как это сделать и с прикладного уровня, даже без прав администратора!

На первом этапе в качестве основного эксперименталь-ного средства мы будем использовать «Блокнот» из ком-плекта поставки NT, сжатый различными упаковщиками (которые мы только сможем найти) и знаменитый отладчик soft-ice. Кодирование последует потом. Чтобы писать кра-сиво и по сто раз не переписывать уже написанное и отла-женное, необходимо иметь соответствующий боевой опыт, для которого нам и понадобиться soft-ice.

Дамп живой программыСамый простой (и самый популярный) способ борьбы с упа-ковщиками – снятие дампа задолго после завершения рас-паковки. Дождавшись появления главного окна программы, хакер сбрасывает ее дамп, превращая его в PE-файл. Иног-да он работает, но чаще всего нет. Попробуем разобрать-ся почему. Возьмем классический «Блокнот» (которое в за-щищенности не обвинишь!) и, не упаковывая его никакими упаковщиками, попробуем снять дамп с помощью одного из самых лучших дамперов: Lord PE Deluxe (см. рис. 7).

Процесс дампирования проходит успешно, и образо-вавшийся файл даже запускается (см. рис. 8), но… оказы-вается не совсем работоспособен! Исчезли заголовок ок-на и все текстовые надписи в диалогах! Если мы не сумели снять дамп даже с такого простого приложения, как «Блок-нот», то с настоящими защитами нам и подавно не спра-виться! В чем же дело?!

Расследование показывает, что исчезнувшие тексто-вые строки хранятся в секции ресурсов и, стало быть, об-рабатываются функцией LoadString. Загружаем оригиналь-ный notepad.exe в IDA Pro (или любой другой дизассемблер по вкусу) и находим цикл, считывающий строки посредс-твом функции LoadStringW (суффикс «W» означает, что мы имеем дело со строками в формате Unicode). Ага, вот этот

цикл! Рассмотрим его повнимательнее (будьте уверены, тут есть чему поучиться):

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

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

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

Рисунок 7. Снятие дампа с работающего «Блокнота»

Листинг 2. Хитро оптимизированный цикл чтения строковых ресурсов

; ebp - указатель на LoadStringW01004825h mov ebp, ds:LoadStringW; указатель на таблицу ресурсов01004830h0100482Bh mov edi, offst off_10080C001004830h loc_1004830: ; CODE XREF: sub_10047EE+65↓j; грузим очередной указатель на uID в eax01004830h mov eax, [edi]; nBufferMax (максимальная длина буфера)01004832h push ebx; lpBuffer (указатель на буфер)01004833h push esi; передаем извлеченный uID функции01004834h push dword ptr [eax]01004836h push [esp+0Ch+hInstance] ; hInstance; считываем очередную строку из ресурса0100483Ah call ebp ; LoadStringW; грузим тот же самый uID в ecx0100483Ch mov ecx, [edi]; увеличиваем длину считанной строки на 10100483Eh inc eax; строка влезает в буфер?0100483Fh cmp eax, ebx; сохраняем указатель на буфер поверх старого uID; (он больше не понадобится)01004841h mov [ecx], esi01004841h01004841h; позиция для следующей строки в буфере01004843h lea esi, [esi+eax*2]; если буфер кончился, то это облом01004846h jg short loc_100488B; переходим к следующему uID01004848h add edi, 4; уменьшаем свободное место в буфере0100484Bh sub ebx, eax; конец таблицы ресурсов?0100484Dh cmp edi, offst off_1008150; мотаем цикл пока не конец ресурсов01004853h jl short loc_1004830

Листинг 3. «Защита» от дампинга живых программ

// глобальная инициализированная переменная// (на самом деле присваивать нуль необязательно// поскольку все глобальные переменные «сами»// обнуляются при запуске программы)void *p = 0;

Page 64: 042 Системный Администратор 05 2006

62

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

Очевидно, если снять дамп с программы после выделе-ния памяти, то при запуске PE-файла, полученного из тако-го дампа, память навсегда перестанет выделяться, а в гло-бальной переменной p окажется указатель, доставшийся ей в «наследство» от предыдущего запуска, однако соот-ветствующий регион памяти выделен не будет, и програм-ма либо рухнет, либо залезет в чужие данные, устроив там настоящий переполох!

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

Поиск стартового кода по сигнатурам в памятиНачинающие программисты считают, что выполнение программы начинается с функции main (на Си/Си++) или c ключевого слова begin (на Паскале). Первым всегда вы-зывается стартовый код (start-up code), устанавливающий первичный обработчик структурных исключений, иници-ализирующий RTL, вызывающий GetModuleHandleA для получения дескриптора текущего модуля и т. д. Тоже са-мое относится к DLL, главной функцией которой являет-ся DllMain.

Существует огромное множество разновидностей start-up кодов, выбираемых компилятором в зависимости от ти-па программы, ключей компиляции и т. д. Исходные текс-ты стартовых кодов, как правило, открыты. В частности, Microsoft Visual C++ хранят их в каталоге \Microsoft Visual Studio\VC98\CRT\SRC под именами crt*.*. Всего их около десятка.

Ниже (см. листинг 4) в качестве примера приведен один из стартовых кодов компилятора DELPHI:

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

Запоминаем ее адрес (в моей версии «Блокнота» она расположена по смещению 01006420h), загружаем упако-ванную программу в отладчик и устанавливаем аппаратную точку на исполнение по данному адресу – «BPM 1006420 X» (Внимание! По умолчанию отладчик ставит точку остано-ва на чтение/запись, что совсем не одно и тоже!). Обогнув распаковщик, отладчик (или наш дампер, который мы чуть позже отважимся написать) всплывает непосредственно в OEP! Самое время снимать дамп!

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

Пара популярных, но неудачных способов: GetModuleHandleA и fs:0Библиотека сигнатур – это, конечно, хорошо, но слиш-ком хлопотно. Новые версии компиляторов выходят чуть ли не каждую декаду, к тому же разработчики зачастую слегка модифицируют start-up код, ослепляя сигнатур-ный поиск. Что тогда? Достаточно часто в этих случаях ре-комендуется установка точек останова на API-функцию GetModuleHandleA («BPM GetModuleHandleA X») и на фильтр

Листинг 4. Пример стартового кода на DELPHI

CODE:00401EE8 start proc nearCODE:00401EE8 push ebpCODE:00401EE9 mov ebp, espCODE:00401EEB add esp, 0FFFFFFF0hCODE:00401EEE mov eax, offset dword_401EB8; Sysinit::InitExe()CODE:00401EF3 call @Sysinit@@InitExe$qqrpvCODE:00401EF8 push 0…; CODE XREF: start+B↓pCODE:00401D9C @Sysinit@@InitExe$qqrpv proc nearCODE:00401D9C push ebxCODE:00401D9D mov ebx, eaxCODE:00401D9F xor eax, eaxCODE:00401DA1 mov ds:TlsIndex, eaxCODE:00401DA6 push 0 ; lpModuleNameCODE:00401DA8 call GetModuleHandleACODE:00401DAD mov ds:dword_4036D8, eaxCODE:00401DB2 mov eax, ds:dword_4036D8CODE:00401DB7 mov ds:dword_40207C, eaxCODE:00401DBC xor eax, eaxCODE:00401DBE mov ds:dword_402080, eaxCODE:00401DC3 xor eax, eaxCODE:00401DC5 mov ds:dword_402084, eax; SysInit::_16395CODE:00401DCA call @SysInit@_16395CODE:00401DCF mov edx, offset unk_402078CODE:00401DD4 mov eax, ebxCODE:00401DD6 call sub_4018A4

Рисунок 8. Нормально работающий «Блокнот» (сверху) и тот же самый «Блокнот» после вснятия дампа – все текстовые строки исчезли

// выделить память, если она еще не выделенаif (!p) p = malloc(BUF_SIZE);

Page 65: 042 Системный Администратор 05 2006

63№5, май 2006

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

структурных исключений («BPM FS:0»). Но это не очень хо-рошие способы и ниже будет показано почему.

Начнем с функции GetModuleHandleA, которая присутс-твует практически в каждом стартовом коде (исключая неко-торые ассемблерные программы). Нажимаем <Ctrl+D> для вызова soft-ice, даем команду «BPM GetModuleHandleA X» (можно также дать «BPX GetModuleHandleA», но в этом слу-чае soft-ice внедрит в начало GetModuleHandleA програм-мную точку останова CCh, легко обнаруживаемую многи-ми защитными механизмами) и запускаем наш подопытный «Блокнот», предварительно зажевав его любым не слишком навороченным упаковщиком, например, ASPack или UPX. Поскольку установка точки останова носит глобальный ха-рактер, все программы, обращающиеся к GetModuleHandleA, будут вызывать всплытие отладчика. Внимательно смотри-те на имя программы, отображаемое отладчиком в правом нижнем углу (см. рис. 9), – если это не наша программа, жмем «x» или <Ctrl+D> для выхода из отладчика.

После серии ложных срабатываний в углу наконец-то появляется наш заветный NOTEPAD. Самое время сказать отладчику «P RET», чтобы выбраться из функции в непос-редственно вызывающий ее код, однако… этим вызываю-щим кодом оказываются отнюдь не окрестности исходной точки входа, а код самого распаковщика! И до OEP нам еще трассировать и трассировать. Определить нашу дислока-цию поможет карта памяти. Даем команду «MAP32» и смот-рим, что скажет отладчик (см. рис. 9).

Файл notepad.exe состоит из нескольких секций: .text (сжатый код исходной программы), .data (сжатые данные исходной программы), .rsrc (сжатые ресурсы исходной про-граммы), .aspack (код распаковщика) и .adata (данные рас-паковщика). Секция кода исходной программы заканчива-ется на адресе 100800h и все, что лежит ниже, ей уже не при-надлежит. В нашем случае функция GetModuleHandleA, вызывается кодом, расположенным по адресу 1010295h, который, как нетрудно установить, принадлежит секции .aspacack – то есть непосредственно самому распаковщику и к OEP никакого отношения не имеет (помимо распаков-щика, функцию GetModuleHandleA могут вызывать и дина-мические библиотеки, подключаемые статической компо-новкой, то есть через секцию импорта).

Выходим из отладчика, нажимая <Ctrl+D> до тех пор, пока вызов GetModuleHandleA не окажется внутри секции .text (если лень нажимать одну и ту же клавишу помногу раз, можно установить условную точку останова в стиле «BPM GetModuleHandleA X IF EIP < 0x1008000».

Ага! Вот, наконец, появилось что-то похожее на исти-ну (см. рис. 10).

Данный вызов действительно подлинный и, прокручи-вая экран окна CODE вверх, нам остается всего лишь най-ти стандартный пролог PUSH EBP/MOV EBP,ESP или RET, которым заканчивается предшествующая процедура. С вы-сокой степенью вероятности это и будет OEP, на которую можно поставить аппаратную точку останова, затем пере-запустить программу еще раз (не забыв при этом удалить точку останова на GetModuleHandleA) и в момент всплы-тия отладчика сделать программе дамп. При этом следу-ет помнить, что далеко не всегда GetModuleHandleA вызы-вается непосредственно из самого стартового кода! В час-

тности, DELPHI помещает GetModuleHandleA в функцию @Sysinit@@InitExe$qqrpv, а вот она-то уже и вызывается стартовым кодом (см. листинг 4)!

Это значит, что для достижения OEP, с момента «ловли» GetModuleHandleA нам придется раскрутить стек (команда «STACK» в soft-ice), поднявшись на один или два уровня вверх. Но на сколько конкретно подниматься? Чтобы отве-тить на этот вопрос, нам необходимо исследовать состоя-ние стека на момент вызова файла.

Остановив отладчик в точке входа EP (не путать с OEP, которую еще только предстоит найти), даем команду «D ESP» и смотрим (чтобы данные отображались не бай-тами, а двойными словами, необходимо сказать отладчи-ку «dd»):

Рисунок 9. Функция 1010295h:CALL [EBP+F4Dh] это на самом деле GetModuleHandleA, вызываемая таким заковыристым образом

Рисунок 10. Подлинный вызов GetModuleHandleA из окрестностей OEP

Листинг 5. Состояние стека на момент вызова файла

:d esp

Page 66: 042 Системный Администратор 05 2006

64

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

Адрес 77E87903h (для наглядности выделенный крас-ным), указывает куда-то внутрь KERNEL32.DLL и коман-да («U *ESP») позволяет узнать куда. Ага, здесь рас-положен безусловный переход на «PUSH EAX/CALL KERNEL32!ExitThread». То есть на процедуру завершения программы. Со времен MS-DOS не так уж и многое измени-лось. Там тоже на вершине стека лежал адрес возврата на exit, поэтому завершать работу программы можно не только через API, но и простой инструкцией RETN. Если стек сба-лансирован, она сработает правильно. Кстати, пара адре-сов на вершине стека 77E87903h/FFFFFFFFh до боли на-поминает термирующий обработчик структурных исклю-чений (термирующий – то есть последний в цепочке), кото-рым она по сути и является, ибо содержимое двойного сло-ва FS:[00000000h] указывает как раз на нее.

Сформулируем еще одно правило: признаком OEP явля-ется ситуация FS:[00000000h] == ESP && *ESP == 77E87903h (естественно, этот адрес варьируется от системы к системе, и на каждой из них должен вычисляться индивидуально!).

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

Попробуем отловить это событие?! А почему бы и нет! Только надо учесть, что, в отличие от API-функций, до-пускающих установку глобальных точек останова, точ-ка останова на FS:0 должна устанавливаться из контекс-та подопытного приложения. А как в него попасть? Необ-ходимо либо остановиться в точке входа в распаковщик (см. врезку «Что делать, если отладчик проскакивает точ-ку входа в распаковщик»), либо установить точку останова на GetModuleHandleA, дождаться первого ложного всплытия отладчика, совершенного в контексте нашего приложения (в правом нижнем углу горит notepad), затем удалить точ-ку останова на GetModuleHandleA и установить точку оста-

нова на фильтр структурных исключений: «BPM FS:0». Не-обходимо сразу подготовить себя к огромному количес-тву ложных срабатываний (структурные исключения ак-тивно использует не только распаковщик, но и сама опе-рационная система), и чтобы закончить отладку до конца сезона, необходимо воспользоваться условными точка-ми останова, ограничив диапазон срабатываний отладчи-ка секцией .text. В нашем случае это будет выглядеть так: «BPM FS:0 IF EIP < 0X100800» (предыдущую точку остано-ва перед этим следует удалить), после чего можно смело отправиться на кухню и варить пакетный рис, поскольку за компьютером нам делать уже нечего.

Даже незащищенный NOTEPAD.EXE вывалил окно от-ладчика спустя... 713.34 секунды (см. рис. 11), что немногим больше 12 минут. Это же целая вечность для процессора! (Для справки: эксперименты проводились на VMWare, за-пущенным под древним Pentium-III 733 МГц, современные процессоры справляются с этой ситуацией намного быст-рее – на то они и современные).

Но как бы там ни было, исходная точка входа найдена! Вот она, расположенная по адресу 10006420h! Как гово-риться, бери и властвуй!

Побочные эффекты упаковщиков, или Почему не работает VirtualProtectОчевидно, чтобы распаковывать кодовую секцию програм-мы, упаковщик должен иметь разрешение на запись (от-сутствующее по умолчанию), а по завершению распаков-ки восстанавливать исходные атрибуты, чтобы программа выглядела так, как будто ее не упаковали. Помимо кодовой секции, необходимо восстановить атрибуты секции .rdata, доступной, как и следует из ее названия, только на чтение. Для манипуляций с атрибутами страниц Windows предо-ставляет функцию VirtualProtect. И это практически единс-твенный путь, которым можно что-то сделать (не считая VirtualAlloc с флагом MEM_COMMIT, с которым связана ку-ча проблем).

Логично предположить, что функция VirtualProtect долж-на вызываеться после завершения распаковки в непосредс-

Листинг 6. Установка нового фильтра структурных исключений в стартовым коде

; ← исходная точка входа.text:01006420 55 push ebp.text:01006421 8B EC mov ebp, esp.text:01006423 6A FF push 0FFFFFFFFh.text:01006425 68 88 18 00 01 push dword_1001888; ← «наш» обработчик.text:0100642A 68 D0 65 00 01 push loc_10065D0; ← берем старый фильтр.text:0100642F 64 A1 00 00 00 00 mov eax, fs:0.text:01006435 50 push eax; ← ставим новый фильтр.text:01006436 64 89 25 00 00 00+ mov fs:0, esp

Рисунок 11. Ловля OEP на обработчик структурных исключений

0023:77EB834F 50 PUSH EAX0023:77EB8350 E87A83FDFF CALL KERNEL32!ExitThread

0023:0006FFC4 77E87903 FFFFFFFF 0011F458 7FFDF000 .y.w....X.......

0023:77E87903 E9470A0300 JMP 77EB834F

:u *esp

:u 77EB834F

0038:00000000 0006FFE0 00070000 0006E000 00000000 ................

:d fs:0

Page 67: 042 Системный Администратор 05 2006

65№5, май 2006

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

твенной близости от передачи управле-ния на OEP. Означает ли это, что, уста-новив точку останова на VirtualProtect, мы…

А вот и нет! Из трех наугад взятых упаковщиков: ASPack, PE-Compact и UPX только PE-compact вызывал VirtualProtect для манипуляций с атри-буты секций (да и то совсем для других целей), а все остальные оставляли их открытыми на запись даже после за-вершения распаковки! Вопиющее на-рушение спецификаций и неуважение к нормам хорошего поведения!

Смотрите сами.

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

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

Что делать, если отладчик проскакивает точку входа в распаковщикБерем исполняемый файл, загружаем его в NuMega SoftICE Symbol Loader, предварительно убедившись, что пиктограммма, изобра-щающая «электрическую лампочку», горит в полный накал, а оп-ция «Start at WinMain, Main, DllMain» активирована (см. рис. 12), что по идее должно отладчик заставить останавливаться в точке входа, но… При попытке загрузки программы soft-ice коварно иг-норирует наши распоряжения, нахально проскакивает точку вхо-да, совсем не собираясь в ней останавливаться.

Это известный глюк soft-ice, с которым борются по всем на-правлениям. Самый популярный (но не самый лучший) спо-соб заключается во внедрении INT 03h (CCh) в точку входа про-граммы.

Берем PE-файл, открываем его в hiew, нажимаем <Enter> для перехода в hex-режим, теперь <F8> (header) и <F5> (переход к точке входа в файл или сокращенно EP, не путать с OEP, кото-рую нам еще предстоит найти). Запоминаем содержимое байта под курсором (записываем на бумажке), переходим в режим ре-дактирование по <F3> и пишем «CC». Сохраняем изменения по <F9> и выходим. В самом soft-ice должен быть предварительно ус-тановлен режим всплытия по INT 03 (команда «I3HERE ON»).

Запускаем программу (просто запускаем без всяких там loader) и… попадаем в soft-ice, который непременно должен всплыть, иначе здесь что-то сильно не так. Теперь необходимо вернуть исправленный байт на место. Это делается так: даем ко-манду «WD» для отображения окна дампа (если только оно уже не отображается на экране), затем «DB», чтобы отображение шло по байтам (начинающим – так удобнее) и говорим «D EIP-1». Минус один появился оттуда, что soft-ice останавливается после CCh, увеличивая EIP на единицу. Даем команду «E» и редакти-руем дамп в интерактивном режиме меняя «CC» на «60» (число, записанное на бумажке). Остается только скорректировать ре-гистр EIP, что осуществляется командой: «R EIP = EIP – 1». Все! Команда «.» (точка) обновляет окно дизассемблера, перемещая нас в текущую позицию. Теперь можно отлаживать!

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

А вот второй способ. Гораздо более элегантный. Загружаем программу в hiew, переходим в hex-режим, жмем <F8> и вычис-

ляем адрес точки входа путем сложения Entrypoint RVA (в нашем случае – 10001h) с Image Base (в нашем случае 1000000h). Полу-чается 1010001h. Если считать лень, можно просто нажать <F5>, чтобы hiew перенес нас в точку входа, сообщив ее адрес (однако это не срабатывает на некоторых защищенных файлах с искажен-ной структурой заголовка). Хорошо, адрес EP получен. Вызыва-ем soft-ice путем нажатия на <Ctrl-D> и устанавливаем точку ос-танова на любую API-функцию, которую вызывает наша програм-ма (откуда – не суть важно). Это может быть и GetModuleHandleA («BPX GetModuleHandleA») и CreateFileA – да все что угодно! Вы-ходим из soft-ice и запускам нашу программу. Отладчик всплы-вает по точке останова на API. Убедившись, что правый нижний угол отражает имя нашего процесса (если нет, выходим из soft-ice и ждем следующего всплытия), устанавливаем аппаратную точку останова на EP, отдавая команду «BPX 0x1010001 X», где – 0x1010001 адрес точки входа в PE-файл. Выходим из soft-ice и пе-резапускаем программу. hint: soft-ice запоминает установленные точки вместе с контекстом отлаживаемой программы и не удаля-ет их даже после ее завершения. При повторном (и всех после-дующих) перезапусках, soft-ice будет послушно останавливаться на EP в точке останова. Ну разве это не здорово?!

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

Рисунок 12. Символьный загрузчик – хорошая штука, но не всегда работающая

В неупакованном «Блокноте» (см. рис. 13) секция .text имеет права на чтение и исполнение (executable/readable/code), секция .data – чтение и запись (writeable/readable/инициализи-рованные данные), секция .rsrc – толь-ко на чтение (readable/инициализиро-ванные данные). Короче, все как в при-личных домах.

Теперь упакуем файл с помощью ASPack. Запустим его и, дождав-шись окончания распаковки (на экра-не появляется главное окно програм-мы), снимем с него дамп (см. рис. 14). Вот это номер! Все секции имеют ат-

Page 68: 042 Системный Администратор 05 2006

66

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

К тому же в памяти по-прежнему болтаются секции .aspack и .adata, которые упаковщик не удосужился «под-чистить». Это хоть и несмертельно, но все-таки неакку-ратно.

А вот PE-compact преподносит нам настоящий сюрприз (см. рис. 15)! Секции .text и .data объединены в одну боль-шую секцию с атрибутами (executable/readable/writeable/code/инициализированные данные), а секция .rsrc, кото-рая не должна (по спецификации!) иметь права на запись, его все-таки имеет. Как говориться, с барского плеча ни-чего не жалко. Зато свои собственные секции PE-compact подчищает весьма аккуратно.

Что же касается UPX (см. рис. 16), то в целом он дви-жется по пути PE-compact: кодовую секцию с секций дан-ных он не объединяет, но атрибуты им назначает те же са-

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

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

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

Универсальный прием поиска OEP, основанный на балансе стекаВот мы и подобрались к самому интересному и универсаль-ному способу определения OEP, который к тому же легко ав-томатизировать. Упаковщик (даже если это не совсем кор-ректный упаковщик) просто обязан после распаковки вос-становить стек, в смысле вернуть регистр ESP на его за-конное место, указывающее на первичный фильтр струк-турных исключений, устанавливаемый системой по умол-чанию (см. листинг 5).

Некоторые упаковщики еще восстанавливают и регис-тры, но это уже необязательно.

Возьмем, к примеру, тот же ASPack и посмотрим в его начало (см. листинг 7):

Замечательно! Первая же команда сохраняет все ре-гистры в стеке. Очевидно, что непосредственно перед пе-редачей управления на OEP они будут восстановлены ко-мандой POPAD, выполнение которой очень легко отследить, установив точку останова на двойное слово, лежащее вы-ше верхушки стека: «BPM ESP – 4».

Результат превосходит все ожидания (см. листинг 8):

Распаковав программу, ASPack заботливо выталки-вает сохраненные регистры из стека, вызывая всплы-тие отладчика, и мы видим тривиальный код, передаю-щий управление на OEP «классическим» способом через «PUSH offset OEP/RET».

Рисунок 13. Исходный «Блокнот»

Рисунок 14. «Блокнот», упакованный ASPack

Рисунок 15. «Блокнот», упакованный PE-compact

Рисунок 16. «Блокнот», упакованный UPX

Листинг 7. Точка входа в распаковщик ASPack

:u eip; сохранить все регистры в стеке001B:01010001 60 PUSHAD; определить текущий EIP001B:01010002 E803000000 CALL 0101000A; спрятанные JMPS/POP EBP/INC EBP001B:01010007 E9EB045D45 JMP 465E04F7; следующие 2 строчки «эмуляция» команды jmp 01010008h001B:0101000C 55 PUSH EBP001B:0101000D C3 RET

Листинг 8. Передача управления на OEP

; ← на этой команде отладчик всплывает 001B:010103AF 61 POPAD001B:010103B0 7508 JNZ 010103BA ↵ (JUMP↓)001B:010103B2 B801000000 MOV EAX,00000001001B:010103B7 C20C00 RET 000C; ← адрес OEP001B:010103BA 6820640001 PUSH 1006420; ← передача управления на OEP001B:010103BF C3 RET

Page 69: 042 Системный Администратор 05 2006

67№5, май 2006

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

Поиск исходной точки входа не затратил и десятка се-кунд! Ну разве не красота?!

А теперь возьмем UPX и проверим, удастся ли нам провернуть этот трюк и над ним? Ведь мы же претендуем на универсальный примем!

Вот он, уже знакомый нам PUSHAD (см. листинг 9), со-храняющий все регистры в стеке и восстанавливающий их непосредственно перед передачей управления на OEP. Да-ем команду «BPM ESP-4» и выходим из отладчика, пока он не всплывет (см. листинг 10):

А вот и отличия! Передача управления осуществляется командой «JMP 1006420h», где 1006420h – исходная точ-ка входа. Похоже, что все упаковщики работают по одно-му и тому же алгоритму и ломаются с реактивной скоро-стью. Но не будем спешить! Возьмем PE-compact и прове-рим свою догадку на нем.

Плохо дело (см. листинг 11)! PE-compact никаких ре-гистров вообще не сохраняет, а «PUSH EAX» использует-ся только затем, чтобы установить свой обработчик струк-турных исключений. Тем не менее на момент завершения распаковки указатель стека должен быть восстановлен, следовательно, точка останова на «BPM ESP-4» все-таки может сработать….

Так, это срабатывание (см. листинг 12) явно ложное (су-дя по EIP, равному 77F8AF78h, мы находимся где-то внут-ри KERNEL32.DLL, использующим стек для нужд произ-водственной необходимости), нажимаем <Ctrl+D>, не же-лая здесь больше задерживаться.

Следующее всплытие отладчика (см. листинг 13), ни-чуть не более осмысленное, чем предыдущее. Ясно толь-ко одно: в стек заталкивается регистр EBP вместе с кучей других регистров. Судя по всему, это распаковщик сохра-няет их с одной лишь ему ведомой целью. Жмем <Ctrl+D> и ждем дальше – что нам еще покажут?

А вот на этот раз (см. листинг 14) нам повезло! Регистр EBP выталкивается из стека и вслед за этим осуществля-ется переход на OEP посредством команды «JMP EAX». Мы все-таки достигли ее! Вот только ложные срабатывания напрягают. Это мы, опытные хакеры, можем «визуально» отличить, где происходит передача на OEP, а где нет. С ав-томатизацией в этом плане значительно сложнее – у ком-пьютера интуиция отсутствует напрочь. А ведь мы всего лишь развлекаемся с давно побежденными упаковщика-ми… Про борьбу с протекторами речь еще не идет.

Возьмем более серьезный упаковщик FSG 2.0 by bart/xt (http://xtreeme.prv.pl, http://www.wasm.ru/baixado.php?mode=tool&id=345) и начнем его пытать.

Разочарование начинается c первых же команд (см. лис-тинг 15). FSG переназначает регистр ESP и хотя через не-которое время восстанавливает его вновь – особой радос-ти нам это не доставляет. Упаковщик очень интенсивно ис-пользует стек, поэтому точка останова на «BPM ESP-4» вы-дает миллион ложных срабатываний, причем большинство из них относится к циклам (см. листинг 16):

Код Значение

00000004h 16-битные смещения кода

00000020h code

00000040h инициализированные данные

00000080h неинициализированные данные

00000200h комментарии или другая вспомогательная информация

00000400h оверлей

00000800h не подлежит загрузке в память

00001000h Comdat

00500000h выравнивание по умолчанию

02000000h может быть выброшено из памяти

04000000h not cachable

08000000h not pageable

10000000h shareable

20000000h executable

40000000h readable

80000000h writeable

Таблица 1. Расшифровка атрибутов секций PE-файла

Листинг 9. Так начинается UPX

; сохранить все регистры в стеке001B:01011710 60 PUSHAD001B:01011711 BE00D00001 MOV ESI,0100D000001B:01011716 8DBE0040FFFF LEA ↵ EDI,[ESI+FFFF4000]001B:0101171C 57 PUSH EDI

Листинг 10. Так UPX передает управление на OEP

001B:0101185E 61 POPAD001B:0101185F E9BC4BFFFF JMP 01006420 ↵ (JUMP ↑)

Листинг 11. Точка входа в файл, упакованный PE-compact

001B:01001000 B874190101 MOV EAX,01011974001B:01001005 50 PUSH EAX001B:01001006 64FF3500000000 PUSH DWORD PTR ↵ FS:[00000000]001B:0100100D 64892500000000 MOV ↵ FS:[00000000],ESP

Листинг 12. Первое срабатывание точки останова на esp-4

001B:77F8AF78 FF7304 PUSH DWORD PTR ↵ [EBX+04]001B:77F8AF7B 8D45F0 LEA EAX,[EBP-10]001B:77F8AF7E 50 PUSH EAX

Листинг 13. Кузьмич?! Где это я?

; ← эта команда вызывает всплытие001B:010119A6 55 PUSH EBP001B:010119A7 53 PUSH EBX001B:010119A8 51 PUSH ECX001B:010119A9 57 PUSH EDI

Листинг 14. Переход на OEP

:u eip-1001B:01011A35 5D POP EBP001B:01011A36 FFE0 JMP EAX (01006420h)

Листинг 15. Многообещающая точка входа в упаковщик FSG

001B:01000154 8725B4850101 XCHG ESP,[010185B4]001B:0100015A 61 POPAD001B:0100015B 94 XCHG EAX,ESP001B:0100015C 55 PUSH EBP001B:0100015D A4 MOVSB

Page 70: 042 Системный Администратор 05 2006

68

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

Необходимо внести какое-то дополнительное условие (к счастью, soft-ice поддерживает условные точки остано-ва!), автоматически отсеивающее ложные срабатывания или хотя бы их часть. Давайте подумаем! Если стартовый код упакованной программы начинается со стандартного пролога типа «PUSH EBP/MOV EBP,ESP», то точка остано-ва «BPM ESP 4 IF *(ESP)= = EBP» отсеет кучу мусора, но... будет срабатывать на любом стандартном прологе нулевого уровня вложенности, а если упакованная программа имеет оптимизированный пролог, в котором регистр EBP не ис-пользуется, наш «хитрый» прием вообще не сработает!

А вот другая идея: допустим, управление на OEP переда-ется через «PUSH offset OEP/RETN», тогда на вершине сте-ка окажется адрес возврата, что опять-таки легко запрог-раммировать в условной точке останова. Еще управление может передаваться через «MOV EAX,offset OEP JMP EAX», что также легко проконтролировать и отследить, но вот про-тив «прямых» команд «JMP offset OEP» или «JMP [OEP]» ус-ловные точки останова бессильны. К тому же слишком мно-го вариантов получается. Пока их переберешь… Ложные срабатывания неизбежны! Попробуйте повоюйте с FSG… В какой-то момент кажется, что решения нет и наше дело труба, но это не так!

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

Взглянем на карту памяти еще раз (см. листинг 17):

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

В данном случае условная точка останова будет выгля-деть так (см. листинг 18) :

Невероятно, но после продолжительного молчания (а он и будет молчать, ведь стек распаковщиком используется очень интенсивно) отладчик неожиданно всплывает непос-редственно в OEP (см. листинг 19)!

Фантастика! А ведь FSG далеко не самый слабый упа-ковщик, фактически граничащий с протекторами. Однако данная методика поиска OEP применима и к протекторам. Выделяем секции, принадлежащие упакованной програм-ме, и устанавливаем точку останова на ESP – 4 в их грани-цах. Даже если стартовый код использует оптимизирован-ный пролог, первый же регистр (локальная переменная за-талкиваемая в стек), вызовет срабатывание отладчика. Ес-ли мы попадем не в саму OEP, то будет где-то очень-очень близко от нее... А найти начало оптимизированного проло-га можно и автоматом!

Таким образом, мы получаем в свои руки мощное оружие многоцелевого действия, которое легко реализовать в виде подключаемого модуля к LordPE, IDA Pro или самостоятель-ной утилиты. (Разработчикам упаковщиков на заметку: что-бы ослепить этот алгоритм, никогда не отделяйте код распа-ковщика от кода программы! Перемешивайте их в хаотич-ном порядке на манер «мясного рулета», тогда определять OEP по данной методике уже не получится, но методики, опи-санные выше, по-прежнему будут работать, если, конечно не предпринять против них определенных усилий).

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

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

Листинг 17. Две секции упакованной программы

MAP32NOTEPAD-fsg 0001 001B:01001000 00010000 CODE RWNOTEPAD-fsg 0002 001B:01011000 00008000 CODE RW

Листинг 18. «Магическая» последовательность, приводящаяся нас к OEP

BPM ESP-4 IF EIP > 0X1001000 && EIP < 0X1011000

Листинг 19. Отсюда начинается распакованный код исходной программы

001B:01006420 55 PUSH EBP001B:01006421 8BEC MOV EBP,ESP001B:01006423 6AFF PUSH FF001B:01006425 6888180001 PUSH 01001888001B:0100642A 68D0650001 PUSH 010065D0001B:0100642F 64A100000000 MOV ↵ EAX,FS:[00000000]001B:01006435 50 PUSH EAX001B:01006436 64892500000000 MOV ↵ FS:[00000000],ESP

Листинг 16. Фрагмент кода, генерирующий ложные срабатывания точки останова

001B:010001C1 5E POP ESI001B:010001C2 AD LODSD001B:010001C3 97 XCHG EAX,EDI001B:010001C4 AD LODSD001B:010001C5 50 PUSH EAX001B:010001C6 FF5310 CALL [EBX+10]

Page 71: 042 Системный Администратор 05 2006

69№5, май 2006

bugtraq

Переполнение буфера в Mozilla FirefoxПрограмма: Mozilla Firefox 1.5.0.2, возможно, более ран-ние версии. Опасность: Критическая.Описание: Уязвимость существует при обработке JavaScript-кода в библиотеках js320.dll и xpcom_core.dll. Удаленный пользователь может с помощью специально сформирован-ной веб-страницы вызвать переполнение буфера и выпол-нит произвольный код на целевой системе. Пример:

URL производителя: www.mozilla.com.Решение: В настоящее время способов устранения уязви-мости не существует.

<textarea cols="0" rows="0" id="x_OtherInfo" ↵ name="x_OtherInfo"></textarea> <script> var textarea = document.getElementsByName ↵ ("x_OtherInfo"); textarea=textarea.item(0); var htmlarea = document.createElement("div"); htmlarea.className = "htmlarea"; textarea.parentNode.insertBefore(htmlarea, textarea); var iframe = document.createElement("iframe"); htmlarea.appendChild(iframe); var doc = iframe.contentWindow.document; doc.designMode = "on"; doc.open(); doc.write("<iframe src=’’>"); iframe.contentWindow.focus() doc.close(); </script></textarea>

Множественные уязвимости в OracleПрограмма: JD Edwards EnterpriseOne 8.x, JD Edwards OneWorld 8.x, Oracle Application Server 10g, Oracle Collaboration Suite 10.x, Oracle Database 10g, Oracle Database 8.x, Oracle E-Business Suite 11i, Oracle Enterprise Manager 10.x, Oracle PeopleSoft Enterprise Tools 8.x, Oracle Pharmaceutical Applications 4.x, Oracle Workflow 11.x, Oracle9i Application Server, Oracle9i Collaboration Suite, Oracle9i Database Enterprise Edition, Oracle9i Database Standard Edition, Oracle9i Developer Suite.Опасность: Высокая.Описание: 1. Уязвимость существует из-за недостаточной обработки входных данных в компоненте Log Miner (пакет dbms_logmnr_session). Удаленный пользователь может про-извести SQL-инъекцию.

2. Обнаружена ошибка проверки границ данных в про-цедуре VERIFY_LOG, поставляемой совместно с пакетом sys.dbms_snapshot_utl. Удаленный пользователь может вы-звать переполнение буфера и выполнить произвольный код на целевой системе. Примечание: Для некоторых платформ исправление уяз-вимости №2 будет доступно только с 01/05/2006. Настоя-тельно рекомендуется запретить доступ к пакету sys.dbms_snapshot_utl до выхода пакета исправлений.URL производителя: www.oracle.com .Решение: Установите исправление с сайта производите-ля.

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

Множественные уязвимости в Mac OS XПрограмма: Apple Macintosh OS X 10.4.6 и более ранние версии.Опасность: Высокая. Описание: 1. Переполнение динамической памяти сущес-твует в функции BOMStackPop() в BOMArchiveHelper во время декомпрессии злонамеренных ZIP-архивов. Уда-ленный пользователь может вызвать отказ в обслужива-нии приложения.

2. Обнаружено несколько ошибок в функциях KWQListIteratorImpl(), drawText() и objc_msgSend_rtp() в бра-узере Safari при обработке специально сформированных HTML-тегов. Удаленный пользователь может вызвать отказ в обслуживании или выполнить произвольный код на це-левой системе.

3. Переполнение динамической памяти обнаружено в функции ReadBMP() при обработке BMP. Удаленный поль-зователь может вызвать отказ в обслуживании приложения или выполнить произвольный код на целевой системе.

4. Переполнение динамической памяти обнаружено в функции CFAllocatorAllocate() при обработке GIF-изобра-жений. Удаленный пользователь может вызвать отказ в об-служивании приложения или выполнить произвольный код на целевой системе.

5. Уязвимость существует в функции _cg_TIFFSetField () при обработке специально сформированных TIFF-изобра-жений. Удаленный пользователь может вызвать отказ в об-служивании приложения.

6. Переполнение динамической памяти существует в функции PredictorVSetField() при обработке TIFF-изобра-жений. Удаленный пользователь может с помощью специ-ально сформированного TIFF-файла выполнить произволь-ный код на целевой системе. URL производителя: www.apple.com/macosx.Решение: В настоящее время способов устранения уязви-мости не существует.

Целочисленное переполнение буфера в rsyncПрограмма: rsync 2.6.7, возможно более ранние версии. Опасность: Средняя.Описание: Целочисленное переполнение буфера обнару-жено в функции receive_xattr() в патче xattrs.diff. Удален-ный пользователь может с помощью специально сформи-рованных расширенных атрибутов вызвать переполнение буфера и выполнить произвольный код на целевой систе-ме. Для удачной эксплуатации уязвимости на системе дол-жен быть установлен патч xattrs.diff. URL производителя: www.samba.org/rsync.Решение: Установите последнюю версию (2.6.8) с сайта производителя.

Page 72: 042 Системный Администратор 05 2006

70

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

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

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

рантировать его доставку получате-лю. Когда количество абонентов не-велико и расположены они недалеко друг от друга (например, в пределах одного города), гарантированно доста-вить ключ абоненту достаточно прос-то. А если абоненты находятся в раз-ных городах или их количество очень велико? В таком случае организация надежного канала доставки ключевых данных – задача весьма непростая, требующая значительных затрат.

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

Для шифрования и дешифрова-ния применяются различные ключи.

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

Алгоритм RSA. ТеорияКриптосистема RSA, предложен-ная в 1977 году Ривестом (R. Rivest), Шамиром (A. Shamir) и Адлеманом (L. Adleman), предназначена для шиф-рования и цифровой подписи. В насто-ящее время RSA является наиболее

Используем средства библиотеки OpenSSL для криптографической защиты данныхЧасть 2

Благодаря своим уникальным свойствам ассиметричные алгоритмы шифрования применяются для защиты информации в тех областях, где использование симметричных алгоритмов затруднительно. Это защита сообщений электронной почты, HTTP-трафика, организация безопасного доступа для удаленного администрирования (Security Shell). Самый популярный представитель семейства ассиметричных алгоритмов – алгоритм RSA.

Владимир Мешков

Page 73: 042 Системный Администратор 05 2006

71№5, май 2006

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

распространенной криптосистемой – стандартом де-факто для многих криптографических приложений. Криптосисте-ма RSA широко применяется в составе различных стандар-тов и протоколов Интернета, включая PEM, S/MIME, PEM-MIME, S-HTTP и SSL.

Криптографическая стойкость алгоритма RSA основа-на на трудоемкости разложения на множители (факториза-ции) больших чисел. Термин «большие» означает, что чис-ло содержит 100~200 и более двоичных разрядов. Откры-тый и секретный ключи являются функциями двух больших простых чисел. Рассмотрим на примере, как выполняется генерация ключей алгоритма RSA, но вместо больших чи-сел для простоты изложения будем использовать малень-кие десятичные.

Для генерации парных ключей используются два слу-чайных простых числа, p и q. Вычисляется произведе-ние этих чисел n и значение функции Эйлера от числа n по формуле:

Далее выбирается ключ шифрования e такой, что e и значение функции Эйлера ϕ(n) являются взаимно просты-ми числами, т.е. числами, не имеющими общих делителей, кроме единицы (единицу еще называют тривиальным дели-телем). Теперь необходимо найти значение ключа дешиф-рования d такое, чтобы выполнялось равенство:

или

Уравнение [2] означает, что остаток от деления произ-ведения чисел e и d на значение функции Эйлера ϕ(n) дол-жен быть равен 1.

Условие [2] выполняется только в том случае, если e и ϕ(n) являются взаимно простыми числами. Число d назы-вается взаимно обратным к e по модулю ϕ(n). Уравнение [2] эквивалентно обнаружению таких d и v, что:

Поиск обратного значения числа по модулю выполняет-ся при помощи алгоритма Эвклида. Этот алгоритм позволя-ет найти наибольший общий делитель (НОД) двух чисел.

Рассмотрим пример. Пусть у нас имеются два простых числа: p=13 и q=17. Найдем произведение этих чисел:

и значение функции Эйлера от числа n=221:

Теперь выберем такое число e, чтобы оно было взаим-но простым с ϕ(n). Таким числом является, например, e=7. Далее надо найти обратное значение числа e, чтобы вы-

полнялось уравнение [2]. Для этого с помощью алгоритма Эвклида ищем значения d и v, удовлетворяющие соотно-шению [4]. Суть алгоритма сводится к проведению после-довательности операций деления с остатком. В соответс-твии с алгоритмом находим частное и остаток от деления ϕ(n) на e:

Частное равно 27, остаток – 3. Теперь последователь-но делим делитель на остаток (т. е. 7 на 3 в данном случае) до тех пор, пока в остатке не получим единицу:

А теперь распишем процесс получения остатка в об-ратном порядке:

Раскроем скобки:

В итоге получаем искомые числа d=55 и v=2. Числа d=55 и e=7 являются взаимно обратными по модулю 192, что подтверждает равенство:

Учитывая, что e=7 – это наш ключ шифрования, то чис-ло d=55 будет ключом дешифрования.

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

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

Шифрование сводится к вычислению:

Здесь Mi – это i-й блок сообщения, C

i – результат крип-

топреобразования. Выражаясь простым языком, мы долж-ны возвести значение M

i в степень e и найти остаток от де-

ления на n.Зашифруем нашу последовательность (65,66,67), зная,

что e=7 и n=221:

В зашифрованном виде наша последовательность бу-дет выглядеть как (91,144,50).

φ(n)=(p-1)(q-1) [1]

ed = 1(mod φ(n)) [2]

d = e-1(mod φ(n)) [3]

ed + φ(n)v = 1 [4]

n = 13 * 17 = 221

φ(n)=(p-1)(q-1)=(13-1)(17-1)=192

192 = 7 * 27 + 3

7 = 3 * 2 + 1

1 = 7 – 3 * 2 = 7 – (192 – 7 * 27) * 2 = 7 – (192 * 2 – 7 * 2 * 27)

1 = 7 + 7 * 54 – 192 * 2 = 7 * 55 – 192 * 2

7 * 55 = 1(mod 192)

A=41h=65, B=42h=66, C=43h=67

Ci = Mie(mod n)

C1 = 657(mod 221) = 91

C2 = 667(mod 221) = 144

C3 = 677(mod 221) = 50

Page 74: 042 Системный Администратор 05 2006

72

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

Для дешифрования необходимо выполнить следую-щую операцию:

Дешифруем последовательность (91,144,50) при d=55 и n=221:

Таким образом, исходная последовательность восста-новлена.

Шифрование RSA выполняется намного эффективнее, если правильно выбрать значение e. Чаще всего исполь-зуются 3, 17 и 65537. Стандарт X.509 рекомендует 65537, PEM – 3, PKCS#1 – 3 или 65537.

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

Функции библиотеки для защиты информации по RSA-алгоритмуПрежде чем изучить вышеозначенные функции, приоста-новимся на минуту и подумаем – если мы оперируем с чис-лами, разрядность которых составляет ~200 битов, то мы должны их где-то хранить. А ведь их надо не только хранить, но и проводить над ними различные математические опера-ции, такие как умножение, деление, возведение в степень и т. п. Очевидно, что стандартные типы языка программи-рования Си, например, long или double long, и прямое ис-пользование функций стандартной библиотеки этого язы-ка, таких как «+», «*» и т. п. для этих целей совершенно не-пригодны. Поэтому библиотека OpenSSL содержит ряд спе-циальных функций для работы с большими числами, раз-рядность которых превышает разрядность адресной шины и регистров процессора. Для хранения этих чисел исполь-зуется динамическая память. Базовым объектом библио-теки для работы с такими числами является объект типа BIGNUM. Этот тип определен в файле openssl/bn.h:

Приведем краткий перечень функций библиотеки для работы с большими числами: BIGNUM * BN_new(void) – создает объект типа BIGNUM

и возвращает указатель на него; int BN_add(BIGNUM *r, const BIGNUM *a, const

BIGNUM *b) – суммирует числа a и b, результат поме-щает в r (r=a+b);

int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) – выполняет операцию вычитания числа b из числа а, результат сохраняется в r (r=a-b);

int BN_mul (BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx) – умножает число a на число b и сохраняет результат в r (r=a*b). Последний параметр BN_CTX *ctx используется для хранения промежуточных результатов вычисления (а BN_CTX is a structure that holds BIGNUM temporary variables used by library functions);

int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *a, const BIGNUM *d, BN_CTX *ctx) – делит число a на b, частное сохраняется в dv, остаток – в rem (dv=a/b, rem=a%b).

Подробную информацию по функциям типа BN_* смот-рите на странице руководства man bn.

Все ассимметричные алгоритмы, реализованные в библиотеке, такие как RSA, DSA, Diffie-Hellman, использу-ют эти функции.

Генерация ключей алгоритма RSAКак в и случае симметричных алгоритмов, для криптогра-фической защиты информации по алгоритму RSA необхо-димо вначале сгенерировать открытый и секретный клю-чи. Генерацию ключей алгоритма RSA выполняет функция RSA_generate_key следующего вида:

Параметры функции: int num – размер ключа в битах; unsigned long e – это то самое число e, с которым мы

познакомились в пункте 2, когда рассматривали теоре-тические основы алгоритма RSA. Этот параметр обыч-но принимает значения 3, 17 или 65537.

Два последних параметра, указатели на функцию (*callback) и void *cb_arg, служат для предоставления об-ратной связи (feedback) с процессом генерации ключевой информации. Это, как правило, индикация хода выполне-ния операции генерирования ключей. Например, если мы выполним команду:

то увидим, как на экране начнут появляться символы «.» и «+», отображающие процесс формирования ключей. Най-дем в файле apps/genrsa.c исходных текстов библиотеки вызов функции RSA_generate_key:

Третий параметр – функция genrsa_cb – находится в этом же файле и имеет следующий вид:

#define BN_ULONG unsigned chartypedef struct bignum_st { /* Pointer to an array of 'BN_BITS2' bit chunks. */ BN_ULONG *d; int top; /* Index of last used d +1. */ /* The next are internal book keeping for bn_expand. */ int dmax; /* Size of the d array. */ int neg; /* one if the number is negative */ int flags; } BIGNUM;

RSA *RSA_generate_key(int num, unsigned long e, ↵ void (*callback)(int,int,void *), void *cb_arg);

openssl genrsa –out outfile 2048

rsa=RSA_generate_key(num,f4,genrsa_cb,bio_err);

static void MS_CALLBACK genrsa_cb(int p, int n, void *arg) { char c='*';

if (p == 0) c='.'; if (p == 1) c='+'; if (p == 2) c='*'; if (p == 3) c='\n'; BIO_write((BIO *)arg,&c,1); (void)BIO_flush((BIO *)arg);

Mi = Cid(mod n)

M1 = 9155(mod 221) = 65

M2 = 14455(mod 221) = 66

M3 = 5055(mod 221) = 67

Page 75: 042 Системный Администратор 05 2006

73№5, май 2006

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

Page 76: 042 Системный Администратор 05 2006

74

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

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

Результаты работы функции RSA_generate_key в виде открытого и закрытого ключа сохраняются в структуре типа RSA (см. include/openssl/rsa.h). Эти ключи необходимо из-влечь и записать в файлы для дальнейшей работы с ними. Делается это при помощи следующих двух функций:

Первая функция записывает в файл fp открытый ключ, который находится в структуре типа RSA, на которую указы-вает параметр x. Вторая функция изымает секретный ключ из структуры x и записывает его в файл fp. Как правило, секретный ключ зашифровывают, что способствует повы-шению его защищенности. Выбор алгоритма шифрования выполняется с помощью параметра const EVP_CIPHER *enc (контекст алгоритма шифрования, см. первую часть статьи). Но для шифрования необходимо задать ключевую фразу (пароль), и сделать это можно несколькими способами.

Можно указать в параметре cb (сокращение от callback) адрес функции, которая будет запрашивать пароль. Ес-ли указатель kstr не будет равен NULL, то в качестве па-роля будут использованы первые klen символов из масси-ва, на который указывает kstr, при этом параметр cb игно-рируется. Если cb == NULL, а параметр u не равен NULL, то u интерпретируется как строка, заканчивающаяся нулем, и эта строка используется как пароль. Также можно все па-раметры (kstr, cb, u) установить в NULL, и библиотека за-просит у нас парольную фразу самостоятельно, используя свои внутренние механизмы.

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

Если в вызове функции PEM_write_RSAPrivateKey мы вместо «hello» оставим NULL, то библиотека самостоятель-но попросит наc ввести парольную фразу для шифрования секретного ключа.

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

Эта функция шифрует flen байт из буфера, на который указывает параметр from, используя ключ из структуры RSA * rsa, и помещает результат в буфер to. Размер этого буфера должен быть равен размеру ключа, который опре-деляется при помощи функции RSA_size(RSA *).

Параметр padding используется для выбора режима вы-равнивания данных. В большинстве случаев используется значение RSA_PKCS1_PADDING, что соответствует стан-дарту PKCS#1. При использовании этого режима размер буфера from должен быть не меньше (RSA_size(rsa) – 11), т.е. на 11 байт меньше размера ключа. Размер выходных данных всегда будет кратен длине ключа.

Следующая программа демонстрирует использование функции RSA_public_encrypt для шифрования данных.

Листинг 1. Генерация ключей алгоритма RSA

#include <stdio.h>#include <openssl/rsa.h>#include <openssl/pem.h>

/* Имена ключевых файлов */#define PRIVAT "./privat.key"#define PUBLIC "./public.key"

void main(){ /* указатель на структуру для хранения ключей */ RSA * rsa = NULL; unsigned long bits = 2048; /* длина ключа в битах */ FILE *priv_key_file = NULL, *pub_key_file = NULL; /* контекст алгоритма шифрования */ const EVP_CIPHER *cipher = NULL;

priv_key_file = fopen(PRIVAT, "wb"); pub_key_file = fopen(PUBLIC, "wb");

int RSA_public_encrypt(int flen, unsigned char *from, ↵ unsigned char *to, RSA *rsa, int padding);

Листинг 2. Шифрование данных по алгоритму RSA

#include <openssl/rsa.h>#include <openssl/pem.h>

void main(int argc, char **argv){ /* структура для хранения открытого ключа */ RSA * pubKey = NULL; unsigned char *ptext, *ctext; FILE * pub_key_file = NULL;

/* Открываем входной и создаем выходной файлы */ int inf = open(argv[1], O_RDWR); int outf = open("./rsa.file", ↵ O_CREAT|O_TRUNC|O_RDWR, 0600);

/* Считываем открытый ключ */ pub_key_file = fopen(PUBLIC, "rb"); pubKey = PEM_read_RSAPublicKey(pub_key_file, NULL, ↵ NULL, NULL);

/* Определяем длину ключа */ int key_size = RSA_size(pubKey); ptext = malloc(key_size); ctext = malloc(key_size);

#ifdef LINT p=n;#endif }

int PEM_write_RSAPublicKey(FILE *fp, RSA *x);

int PEM_write_RSAPrivateKey(FILE *fp, RSA *x, ↵ const EVP_CIPHER *enc, unsigned char *kstr, ↵ int klen, pem_password_cb *cb, void *u);

/* Генерируем ключи */ rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);

/* Формируем контекст алгоритма шифрования */ OpenSSL_add_all_ciphers(); cipher = EVP_get_cipherbyname("bf-ofb");

/* Получаем из структуры rsa открытый и секретный ключи * и сохраняем в файлах. Секретный ключ шифруем с помощью * парольной фразы «hello» */ PEM_write_RSAPrivateKey(priv_key_file, rsa, cipher, ↵ NULL, 0, NULL, "hello"); PEM_write_RSAPublicKey(pub_key_file, rsa);

/* Освобождаем память, выделенную под структуру rsa */ RSA_free(rsa);}

Page 77: 042 Системный Администратор 05 2006

75№5, май 2006

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

Д е ш и ф р о в а н и е д а н н ы х в ы п ол н я е т фу н к ц и я RSA_private_decrypt:

Эта функция расшифровывает flen байт из буфера from, используя ключ rsa, и записывает результаты в буфер to.

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

int RSA_private_decrypt(int flen, unsigned char *from, ↵ unsigned char *to, RSA *rsa, int padding);

Листинг 3. Дешифрование файла, зашифрованного по RSA-алгоритму

#include <openssl/rsa.h>#include <openssl/pem.h>

void main(int argc, char **argv){ RSA *privKey = NULL; FILE *priv_key_file; unsigned char *ptext, *ctext;

/* Открываем входной и создаем выходной файл */

Работоспособность программ была проверена для ОС Linux Slackware 10.2, библиотека OpenSSL версии 0.9.7c

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

inf = open(argv[1], O_RDWR); outf = open("./test.rsa", ↵ O_CREAT|O_TRUNC|O_RDWR, 0600);

/* Открываем ключевой файл и считываем секретный ключ */ priv_key_file = fopen(PRIVAT, "rb"); privKey = PEM_read_RSAPrivateKey(priv_key_file, ↵ NULL, NULL, NULL);

/* Определяем размер ключа */ key_size = RSA_size(privKey); ctext = malloc(key_size); ptext = malloc(key_size);

/* Дешифруем файл */ while(1) { inlen = read(inf, ctext, key_size); if(inlen <= 0) break;

outlen = RSA_private_decrypt(inlen, ctext, ptext, ↵ privKey, RSA_PKCS1_PADDING); if(outlen < 0) exit(0);

write(outf, ptext, outlen); }}

/* Шифруем содержимое входного файла */ while(1) { inlen = read(inf, ptext, key_size - 11); if(inlen <= 0) break;

outlen = RSA_public_encrypt(inlen, ptext, ctext, ↵ pubKey, RSA_PKCS1_PADDING); if(outlen != RSA_size(pubKey)) exit(-1);

write(outf, ctext, outlen); }}

Page 78: 042 Системный Администратор 05 2006

76

IMHO

Беглый взгляд со стороныДля начала – что такое лицензия на программное обеспечение? Де-ло в том, что программу трудно от-нести к материальному объекту, пос-кольку она слишком легко и дёшево может быть растиражирована. Как следствие, её распространение силь-но отличается от прочих товаров. Ку-пив, скажем, утюг, вы становитесь его собственником и, в частности, може-те отдать/продать кому-то ещё. Тогда у вас утюга уже не будет (т.е. спрос со-

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

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

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

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

Лицензию? Вам какую?

Как часто мы слышим, что открытых лицензий на программное обеспечение развелось слишком много. BSD, Apache, CDDL, GPL2/3, LGPL… Даже для юристов это настоящий кошмар. А что же тогда говорить о нас, простых (хотя и системных) администраторах?

Сергей Супрунов

Page 79: 042 Системный Администратор 05 2006

77№5, май 2006

IMHO

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

Наиболее известной свободной лицензией является разработанная в FSF (Free Software Foundation) лицен-зия GNU GPL (General Public License). Однако помимо неё существует мас-са других лицензий, в которых и по-пытаемся разобраться хотя бы в об-щих чертах.

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

GNU GPL2 (GNU General Public License)Это детище Ричарда Столлмана (Richard Stallman), пришедшее в 1991 году на смену 1-й версии, имеет чёт-ко поставленную задачу – не допус-тить «закрытия» программ, которые первоначально были выпущены как свободные. GPL предоставляет право свободно использовать, модифици-ровать и распространять программу, при обязательном условии, что вмес-те с ней будут распространяться и её исходные коды, включая все сделан-ные изменения, и по той же самой ли-цензии. Допускается не включать ис-ходные коды в дистрибутив при усло-вии, что их можно будет свободно полу-чить в дальнейшем (например, скачав с ftp-сервера). Формально лицензия не требует от разработчика или дист-рибьютора распространять программу бесплатно, но в свете обязательности предоставления исходных кодов взи-мание платы за «сборку» в какой-то степени теряет смысл.

Здесь нужно сказать, что с GPL прочно связано ещё одно понятие – Copyleft. Это положение (в противо-положность Copyright), согласно ко-торому распространитель (т.е. право-обладатель) программного продукта не вправе ограничивать свободу даль-

нейшего распространения, модифика-ции, использования.

GNU LGPL (Lesser GPL)«Ограниченная» GPL, регламентиру-ющая права на программные библи-отеки. Содержит ряд пунктов, допус-кающих компоновку данной библио-теки с программами, распространяе-мыми по другим лицензиям. Разработ-чик библиотеки (или её модификации) вправе перевести её на лицензию GPL, однако обратная процедура уже будет невозможна.

BSDПожалуй, самая простая и демократич-ная открытая лицензия, занимающая всего несколько строк. Её смысл сво-дится к тому, что «делайте с програм-мой всё, что хотите, только не говори-те, будто это вы её написали». То есть единственное предъявляемое ею тре-бование – сохранение уведомлений об авторских правах. Таким образом, лицензия BSD не подпадает под поня-тие Copyleft, поскольку не запрещает ограничивать свободу этого или про-изводных продуктов. Сторонники GPL часто критикуют BSD за то, что она позволяет любому «украсть» разра-ботку. Действительно, если хорошая программа распространяется под BSD-лицензией, то существует ненулевая вероятность, что какая-нибудь круп-ная корпорация возьмёт этот код и бу-дет распространять программу как за-крытую под коммерческой лицензией. Очевидно, что у такой компании будет гораздо больше маркетинговых воз-можностей по продвижению и прода-же программы – большинство пользо-вателей могут даже и не догадывать-ся, что существует такая же програм-ма, но абсолютно бесплатная. К то-му же лицензия BSD не обязывает де-литься с сообществом модифициро-ванным кодом.

Формально всё это никоим обра-зом не ущемляет прав разработчика открытой версии – он остаётся авто-ром и владельцем кода и может его по-прежнему развивать и распростра-нять, как ему вздумается. То есть все возражения против BSD сводятся, по сути, к апелляции к морали. Впрочем, это личное право разработчика – пос-тупать со своим детищем так, как ему вздумается.

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

ArtisticПод этой лицензией распространяют-ся такие программы, как Razor, Perl (этот проект использует слегка моди-фицированную версию) и ряд других. Изменённый продукт может распро-страняться только в случае публика-ции в доступном виде модифициро-ванных исходных кодов либо при ус-ловии, что все изменённые файлы бу-дут переименованы. В принципе позво-ляет использовать программный про-дукт в коммерческих программах. FSF

Отказ от ответственностиНастоящая статья публикуется в соответс-твии с принципом «как есть» (а не «как пить дать»), что означает возможность нали-чия в ней ошибок и заблуждений, хотя ав-тор и стремился этого избежать. Сам факт публикации, а также указание на послед-ней странице журнала, что «За содержа-ние статьи ответственность несёт автор»,

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

Page 80: 042 Системный Администратор 05 2006

78

IMHO

не очень жалует эту лицензию за ту-манность её формулировок и относит её к несовместимым с GPL (за исклю-чением модифицированной лицензии, под которой распространяется Perl).

CDDL (Common Development and Distribution License)Лицензия, разработанная в Sun Microsystems. Требует распростра-нения программы вместе с правами на все сопутствующие патенты и толь-ко в исходных кодах, с обязательным уведомлением обо всех сделанных из-менениях. В двоичном виде допускает-ся распространение по другой лицен-зии, при условии, что это не ограничи-вает свободу доступа к исходному коду. Как и в лицензии Apache, предусмот-рен отзыв всех переданных прав на ПО и патенты в случае судебных претен-зий к разработчику или распространи-телю. В настоящее время под этой ли-цензией распространяется, в частнос-ти, OpenSolaris. Впрочем, как пишет в своём блоге Джонатан Шварц, пре-зидент компании Sun, рассматрива-ется перевод OpenSolaris на двойную лицензию CDDL/GPL3 (когда послед-няя будет опубликована), чтобы обес-печить совместимость с GPL и тем са-мым получить преимущества от вза-имного обмена кодом с Linux.

Характерной особенностью прак-тически всех свободных лицензий (да и коммерческие зачастую «гре-шат» этим) является обязательное ука-зание раздела, касающегося отказа от ответственности. То есть разработчик лицензируемой программы явно указы-вает, что не несёт никакой ответствен-ности за ошибки в работе программы, за ущерб вследствие неправильной работы ПО, и т. д. Для открытых про-грамм, которые легко могут модифи-цироваться без ведома разработчика, такое положение является вполне ес-тественным и понятным. Ну и, с другой стороны, зачем брать на себя какую-то ответственность, если это зачастую не приносит никакой прибыли?

Помимо представленных, есть мас-са других лицензий (организацией OSI одобрено более 60), порой охва-тывающих разработки одной компа-нии, или даже одну-единственную про-грамму. К таким можно отнести лицен-зии IBM, Apple, Eclipse Public License,

Qt Public License, открытые лицензии Intel, Jabber, Zope, и т. д.

Нужно заметить, что есть ещё и лицензии на документацию (на-иболее распространённой является опять-таки лицензия GNU – FDL (Free Documentation License)). Так что выби-рать есть из чего.

Там, за горизонтом…Естественно, нельзя обойти внима-нием и GNU GPL3. Что там ещё при-думал Столлман на благо всего чело-вечества?

Вторая версия GPL, честно про-служившая 15 лет, морально устарела. В ней не предусмотрена возможность распространять программный продукт посредством Интернета (имеется в ви-ду не скачивание дистрибутивов, а ис-пользование ПО как интернет-серви-са). В ней ничего не говорится о патен-тах, так что уже нельзя сказать, что она надёжно защищает право программы оставаться свободной.

И вот, в конце 2005 года FSF объ-явил о намерении обновить свою ос-новную лицензию. В настоящее вре-мя черновой вариант GPL3 вынесен на всеобщее обсуждение, а его при-нятие предполагается в конце этого – начале следующего года.

При беглом прочтении бросаются в глаза следующие нововведения: Вводится явное разделение по-

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

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

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

Добавлен пункт, запрещаю-щий использовать управление цифровыми правами (Digital Restriction Management, DRM). DRM – это законодательно защи-щаемые ограничения на доступ к информации (например, требо-вание специального ключа). В FSF считают, что подобные ограничения противоречат духу Open Source, где любой пользователь вправе отклю-чить любую функцию (в том числе и ту, которая отвечает за ограниче-ние доступа). Кстати, есть мнение, что отсутствие поддержки DRM в Linux может подорвать позиции этой ОС на рынке домашних раз-влекательных систем, поскольку лишит возможности пользовате-лей работать с защищёнными муль-тимедиа-файлами. Впрочем, в FSF настроены на этот счёт более опти-мистично.

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

Для тех, кто использовал GPL с формулировкой «вы вправе распро-странять её и/или модифицировать в соответствии с условиями версии 2 либо, по вашему выбору, с условиями более поздней версии GNU GPL, опуб-ликованной FSF» никаких проблем с переходом на версию 3 возникнуть не должно. Однако если продукт распро-странялся строго по GPL2 (как это име-ет место быть в случае с ядром Linux), для смены лицензии требуется согла-сие всех, кто так или иначе участво-вал в разработке данного программно-го продукта. Перспектива отыскивать каждого, кто десять лет назад внёс в ядро три строчки кода, и испраши-вать у него согласие на смену лицен-зии, естественно, не могла обрадовать разработчиков ядра Linux, что и стало причиной довольно резких заявлений Торвальдса о том, что Linux останется на GPL2. Впрочем, жизнь не стоит на месте, и когда-нибудь меняться при-дётся. Поживём – увидим.

Page 81: 042 Системный Администратор 05 2006

79№5, май 2006

IMHO

Кому и зачем всё это надоКазалось бы, ну есть какая-то про-грамма, ну не берут денег за то, что я пользуюсь ею… Ну вот и славненько! Какая мне разница, что именно там за лицензия?

С точки зрения обычного пользова-теля, так оно и есть. По большому счё-ту рассмотренные лицензии не явля-ются так называемыми EUL (End User License), т.е. они не столько регламен-тируют права конечного пользователя, сколько права разработчиков и рас-пространителей, которые будут ис-пользовать данную программу в сво-их продуктах или предоставлять услу-ги на основе данного продукта.

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

А вот для разработчиков (даже ес-ли разработка заключается в сборке готовых программ и библиотек в один дистрибутив) вопросы лицензирова-ния приобретают большое значение. Как вы видите, большинство откры-тых лицензий достаточно либераль-ны, и особых проблем с использова-нием «покрываемых» ими продуктов возникнуть не должно. Единственное, нужно не забывать о вопросах совмес-тимости разных лицензий. Например, вы не можете распространять свою программу под лицензией, не требу-ющей открывать исходный код, ес-ли она основана или включает в себя программный продукт, распростране-ние которого требует соблюдения от-крытости. Парадоксально, но лицен-зию QPL (Qt Public License), под кото-рой распространяется библиотека Qt, Free Software Foundation относит к не-совместимым с GPL. Впрочем, разра-ботчикам KDE, похоже, удалось обой-ти эту формальность.

Кстати говоря, проблемы совмес-тимости послужили причиной воз-никновения ещё одной особенности –

двойного лицензирования. Некоторые производители, желая обеспечить бо-лее широкие возможности использо-вания своей программы, выпускают её под несколькими лицензиями. В качес-тве примера можно привести PC-BSD, распространяющуюся под лицензиями GPL и BSD. Или, например, MySQL, ко-торая выпускается под GPL и под ком-мерческой лицензией.

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

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

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

Ждём с нетерпением…Что ж, на сегодняшний день лицен-зий действительно немало. Во многом

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

Тем не менее сокращение их чис-ла было бы на руку как разработчи-кам, так и конечным пользователям, поскольку сделало бы работу с раз-личным ПО более прозрачной и понят-ной. Так что будем надеяться, что GPL третьей версии удастся сделать при-влекательной для большинства раз-работчиков, что будет стимулировать отказ от различных «доморощенных» лицензий.

Ссылки:1. Лицензия GNU GPL2 – http://www.gnu.

org/licenses/gpl.html.2. Лицензия GNU LGPL – http://www.gnu.

org/copyleft/lesser.html.3. Черновик GNU GPL3 – http://gplv3.fsf.

org/draft.4. Лицензия Apache – http://apache.org/

licenses/LICENSE-2.0.5. Лицензия Artistic – http://www.perl.com/

pub/a/language/misc/Artistic.html.6. Лицензия Sun CDDL – http://www.sun.

com/cddl/cddl.html.7. Страница Open Source Initiative (OSI)

со ссылками на большинство откры-тых лицензий – http://www.opensource.org/licenses/artistic-license.php.

Free as a beer?У нас таких проблем не возникает – поня-тия «бесплатное» и «свободное» ПО до-статочно чётко разделяются на лингвис-тическом уровне. В английском же язы-ке ситуация несколько иная, и говоря «free software», приходится уточнять, име-ется в виду «free as a beer» (бесплатное, как пиво; нам бы такую аналогию в бли-жайший ларёк) или «free as Kipelov» (пом-ните: «Я свободен, словно птица в небе-сах…»). «Free» в первом контексте подра-зумевает бесплатность программы, но при этом её использование может быть сильно ограничено (только для личного пользова-ния, для ознакомительных целей, без пра-ва декомпиляции и т. д.).

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

Последнее время наметилась тен-денция к использованию вместо термина «free software как Кипелов» формулировки «open source software» (открытое програм-мное обеспечение, ПО с открытым кодом), что выглядит несколько лучше, но тоже до-пускает неоднозначность (можно открыть коды, но сопроводить это такой лицензией, что эти коды будет страшно трогать).

Возможно, со временем гибкий и изво-ротливый человеческий ум придумает-та-ки однозначные формулировки, пока же будем уточнять: «Free as a beer?», «Open as Linux?».

Page 82: 042 Системный Администратор 05 2006

80

web

В настоящее время вопрос поис-ка информации становится все более и более актуален. В се-

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

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

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

Возможности поискового движка DataparkSearch

Иван Максимов

Как организовать поиск информации на файловом сервере не только по названию и типу документа, но и по его контенту? Возможно ли создать подходящий инструмент, доступный и прозрачный для пользователей?

Page 83: 042 Системный Администратор 05 2006

81№5, май 2006

web

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

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

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

Начальные условияИмеется файловый сервер под уп-равлением ОС Linux. Для совместно-го использования файлов установле-ны популярные пакеты samba и pro-ftp. На диске используется файловая система reiserfs, как наиболее произ-водительная для работы с большим количеством маленьких файлов (до-кументы, около 3 тысяч, различных форматов: txt, html, doc, xls, rtf). Дан-ные отсортированы, но их объем рас-тет с каждым днем, удаление устарев-шей информации не решает пробле-му. Как организовать поиск по именам и типам документов, а также по кон-тенту? Как сделать его доступным для пользователей в локальной сети?

Для решения этих вопросов нам по-надобится поисковый движок, сервер баз данных (MySQL, firebirg, ...), веб-сервер Apache [13] и около гигабай-та дискового пространства для рабо-ты комплекса.

Какой из поисковых движков выбрать?Существуют локальные поисковые машины, такие как Google Desktop

возможно использовать его и в корпо-ративной среде.

MnogoSearch (бывший UdmSearch) – известный многим и достаточно рас-пространенный движок. Существу-ют версии как под Windows (30-днев-ная бесплатна версия), так и под *nix-платформы (лицензия GNU). Возмож-на работа практически со всеми рас-пространенными версиями СУБД SQL под обе платформы. К сожалению, на данный движок достаточно мно-го нареканий, поэтому я не остановил свой выбор на нём.

Wordindex – движок, находящийся в стадии разработки (на момент напи-сания статьи последняя доступная вер-сия 0.5 от 31 августа 2000 года). Рабо-тает в связке СУБД MySQL и веб-сер-вера Apache. Работоспособный про-ект представлен только на сайте раз-работчиков.

ASPseek – поисковая машина, по-лучившая в прошлом достаточно боль-шое распространение, но в 2002 году этот движок прекратил свое развитие (последняя доступная версия данной поисковой системы 1.2.10 от 22 июля 2002 года).

DataparkSearch – клон поискового движка MnogoSearch. Позволяет про-изводить поиск как по именам фай-лов, так и по их контенту. Обработка txt-файлов, HTML-документов и тэгов mp3 встроена, для обработки содер-жимого документов иного типа необ-ходимы дополнительные модули. Воз-можен поиск информации, как на ло-кальном жестком диске, так и в ло-кальной/глобальной сети (http, https, ftp, nntp и news).

Поисковая машина функциониру-

Search [1] или Ask Jeeves Desktop Search [2]. Возможно, для организа-ции поиска в маленькой компании или на рабочей станции пользователя, под управлением ОС Windows, эти движки могут быть полезны, но не в данном случае. Поисковые «монстры» вроде Яндекса очень дороги, но если требу-ется качественная помощь разработ-чиков, то крупным компаниям, воз-можно, следует подумать об его арен-де. Для *nix-семейства существует не-сколько проектов. Это движки: DataparkSearch [3] Wordindex [4] ASPseek [5] Beagle [6] MnogoSearch [7]

Перечисленные движки позицио-нируются как свободно распростра-няемые поисковые машины для рабо-ты в локальной и/или глобальной се-тях. Хочу заметить, что многие проек-ты не мультиплатформенные и не ра-ботают под операционными система-ми компании Microsoft. Для Windows-систем существуют серверные реше-ния, такие как: MnogoSearch и «Ищей-ка» [8].

Итак, коротко рассмотрим поиско-вые машины под *nix-платформу:

Beagle – преемник в SUSE Linux движка Htdig [9]. Последний дистри-бутив SUSE, в который вошел движок Htdig, был за номером 9, в последую-щих версиях компания Novell заменила его на beagle. Htdig закончил свое раз-витие в 2004 году, последняя доступ-ная версия – 3.2.0b6 от 31 мая 2004 года. Новый движок в SUSE позицио-нируется как локальный поисковик, но

РаботаСервер был установлен на машине: AMD Athlon 2500 Barton, 512 Мб DDR 3200 (Dual), HDD WD 200 Гб SATA (8 Мб кэш, 7200 оборотов). Конфигурация движка: дви-жок DataparkSearch (v4.38), СУБД MySQL (v4.1.11), веб-сервер Apache (v1.3.33), про-изводится индексация doc, xls, rtf (конвер-тация в text/plain), html, txt-файлов. Исполь-зуется режим хранения данных multi. Обра-ботка примерно 2 тыс. файлов, располо-женных на данной машине (размер на дис-ке ~1 Гб), и индексация их контента требует 40 мин, размер БД после работы пример-но равен 1 Гб. Должен заметить, что ско-

рость работы движка с нелокальными ре-сурсами будет зависеть от скорости кана-ла. Также скорость индексирования зави-сит от используемых парсетов. Использо-вание режима хранения cache улучшает скорость работы примерно на 15-20%. В ка-честве клиентского ПО используются веб-браузеры, проверялась работа на: Firefox, Opera, Konqueror, Microsoft Internet Explorer и даже Lynx – проблем не возникло. Всю ра-боту серверной части движка можно авто-матизировать с помощью всем известного демона cron, поместив в него нужные па-раметры для индексации данных.

Page 84: 042 Системный Администратор 05 2006

82

web

ет с самыми распространенными СУБД SQL, такими как MySQL [10], firebird [11], PostgreSQL [12] и другими. По заяв-лению разработчиков, DataparkSearch стабильно работает на различных *nix-операционных системах: FreeBSD, Solaris, Red Hat, SUSE Linux и других. По сравнению с MnogoSearch в движке были исправлены некоторые ошибки, изменены в лучшую сторону некоторые функции. На сайте разработ-чиков приведены ссылки на рабочие версии движка в се-ти Интернет. Большой плюс – качественная документация на русском языке.

Итак, сравнив все «за» и «против», для реализации по-иска на файловом сервере был выбран движок поисковой машины DataparkSearch.

УстановкаДля работы нам понадобятся: веб-сервер Apache, сервер базы данных MySQL и исходные коды DataparkSearch. Ус-танавливаем сервер Apache и БД MySQL (со всеми необхо-димыми библиотеками). Если на вашем сервере установле-на иная СУБД, то можно использовать и ее (см. документа-цию по движку). Далее распакуем архивы DataparkSearch и приступим к сборке нашего комплекса.

Запустим скрипт install.pl и ответим на необходимые воп-росы: выбор папки установки движка, базы данных и дру-гие относящиеся к параметрам работы движка. Рекомен-дуется оставит настройки по умолчанию. Опытные поль-зователи, прочитав документацию, расположенную в пап-ке doc, могут вручную сконфигурировать движок (коман-да configure). Если при инсталляции скрипт не может найти mysql, возможно не установлены библиотеки для разработ-чиков (libmysql14 devil). Теперь скомпилируем и установим DataparkSearch командами make и make install.

Минимальное конфигурированиеСоздадим базу данных:

Командой mysqlshow просмотрим все таблицы в БД. Сразу хочу отметить, что удобнее работать с MySQL с по-

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

Перезагрузим MySQL.Допустим, имя пользователя – searcher, пароль –

qwerty.Теперь создаём файл indexer.conf в папке /etc/ движка,

примеры данного файла (для некоторых задач) можно най-ти в папке /doc/samples исходников DataparkSearch. Пример с минимальными настройками приведен на рис. 1.

Рассмотрим файл подробнее. Как упомянуто в коммен-тарии, команда DBAddr указывает путь к SQL-серверу (в на-шем случае это MySQL), способ хранения данных и другие параметры (если необходимо). Существуют несколько ре-жимов хранения: если не указывать dpmode, то по умолча-нию будет значение single – самый медленный. Рекомен-дуется использовать режим cache, но если с ним возник-ли проблемы, можно использовать менее эффективный, но более простой в конфигурировании режим multi. Под-робное описание всех параметров dbmode находится в до-кументации.

DoStore хранит сжатые копии проиндексированных до-кументов. Sections – модуль, предоставляющий гибкие воз-можности индексирования. Допустим, можно создать огра-ничение по тэгу или настроить индексацию не только со-держимого файлов, но и URL (хост, путь, имя). Langmap – специальные языковые карты для распознавания кодиро-вок и языков, эффективны, если документы размером бо-лее 500 байт.

Второй необходимый конфигурационный файл – файл результатов поиска search.conf. Рекомендуется взять гото-вый шаблон (файл /etc/search.htm-dist) и отредактировать его под свои запросы. Нужно заметить, что основные па-раметры, указанные в файле indexer.conf, должны совпа-дать с параметрами в search.htm, иначе будут ошибки при работе движка. Search.htm состоит из нескольких блоков: первый – variables – содержит данные для работы движ-ка (скрипт search.cgi), а все остальные блоки необходимы для формирования html-страницы результатов поиска. При-мер блока variables в search.conf приведен на рис. 2.

Рассмотрим search.htm подробнее. Как видно, пара-метры DBAddr и LocalCharset совпадают с идентичны-ми параметрами в indexer.conf. Если ваш веб-клиент под-держивает формат xml, то можно установить параметр ResultContentType text/xml. Ниже идут HTML-блоки, необ-ходимые для дизайна страницы результатов, они здесь не представлены из-за большого объема. Рекомендуется пользоваться готовым шаблоном, расположенным в фай-ле /etc/search.htm-dist. В сопроводительной документации полностью описан формат HTML-блоков (дизайна), жела-ющие могут настроить его по своему вкусу.

Теперь можно запускать файл indexer из папки sbin движ-ка DataparkSearch с параметром -Ecreate. Если все было сде-лано правильно, то будут созданы необходимы sql-табли-

Рисунок 1. Минимальные набор параметров indexer.conf

Рисунок 2. Минимальные параметры search.htm

sh$ mysqladmin create search

sh#mysql --user=root mysqlmysql> GRANT ALL PRIVILEGES ON *.* TO пользователь@localhostIDENTIFIED BY 'пароль' WITH GRANT OPTION;exit

Page 85: 042 Системный Администратор 05 2006

83№5, май 2006

web

цы в БД. Если появились ошибки, следует проверить имя пользователя mysql и пароль в файле indexer.conf, это на-иболее распространенная ошибка.

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

Скопируем файл bin /search.cgi из директории DataparkSearch в папку cgi-bin нашего веб-сервера и отре-дактируем файл index.shtml нашего веб-сервера Apache (расположенный в папке html), добавив в него код фор-мы поиска:

Теперь можно зайти на ресурс localhost, используя лю-бой доступный браузер. В появившейся форме ввести ис-комое слово, допустим «процессор» (см. рис. 3). В итоге мы должны получить страницу с результатами поиска, ес-ли, конечно, такие документы существуют (см. рис. 4). Ес-ли вместо страницы с результатами поиска появится до-кумент с ошибками, то следует проверить работу скрип-та. Зайдя в директорию cgi-bin веб-сервера, выполним скрипт «seach.cgi test >> test.htm». Если страница результа-тов сформирована правильно, следует проверить конфи-гурацию сервера Apache: правильно ли указан путь до cgi-скрипта, выполняется ли тестовый скрипт test.cgi в дирек-тории веб-сервера.

Если test.htm пуст или также содержит ошибки, рекомен-дуется проверить, существуют ли данные в базе, делается это командой «indexer -S». Возможно, следует переиндек-сировать сервер командой «indexer – v 5» – максимальный уровень выдачи отладочной информации. Выставив в фай-ле search.htm команду LogLevel 5 и внимательно просмот-рев логи веб-сервера, можно выяснить, как выполняется обработка данных в SQL-сервере.

Добавление дополнительных модулей (парсетов)По умолчанию движок работает только с файлами html и txt, но возможно установить дополнительные модули (парсе-ты), которые преобразуют иные типы документов в html или txt (plain text). Возможна работа с xls (Excel), doc (Word), rtf (Word), ppt (Power Point), pdf (Acrobat Reader) и даже rpm (RedHar Package Manager)-файлами, в последнем будут отображаться только метаданные. В нашем случае пона-добится обработка офисных форматов. Для xls и doc су-ществует несколько парсетов: catdoc [14] преобразует до-кументы в txt-формат, XLHTML [15] и vwHtml [16] конверти-руют файлы в HTML-формат.

Я рекомендую использовать пакет catdoc, так как ско-рость преобразования в txt-формат намного выше преоб-разования в HTML-формат, к тому же программа XLHTML иногда «подвисала» при конвертировании документов. Хотя разработчики предвидели данную проблему и рекомендуют во избежание «зависания» парсета установить в indexer.conf

параметр ParserTimeOut 300 (число указывается в секундах), но время индексирования тогда еще более возрастет.

Также нам понадобится еще один парсет – unrtf [17] – для работы с rtf-файлами, он конвертирует документы в html-код или text/plain-формат на выбор пользователя.

Скачаем и установим нужные пакеты, для подключения парсета нужно добавить строки в indexer.conf:

Для формата xls (программа xls2csv входит в пакет catdoc):

для документов doc параметры выглядят так:

обработка RTF-документов:

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

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

Допустим, если необходимо проиндексировать rpm или iso-файлы и получить из них метаданные, вам понадо-бится сначала найти соответствующую программу (парсет) и добавить нужные параметры в index.conf. Список подде-рживаемых типов документов можно посмотреть, напри-

Рисунок 3. Форма ввода данных

<FORM METHOD=GET ACTION="/cgi-bin/search.cgi"><INPUT TYPE="text" NAME="q" VALUE=""><INPUT TYPE="submit" VALUE="Search"></FORM>

Рисунок 4. Страница результатов поиска

AddType text/rtf* *.rtf *.RTFAddType application/rtf *.rtf *.RTFMime text/rtf* text/html "/usr/local/bin/unrtf ↵ --text $1"Mime application/rtf text/html "/usr/local/bin/unrtf ↵ --text $1"

Mime application/vnd.ms-excel text/plain "xls2csv $1"AddType application/vnd.ms-excel *.xls *.XLS

Mime application/msword text/plain "catdoc $1"AddType application/vnd.ms-excel *.doc *.DOC

Page 86: 042 Системный Администратор 05 2006

84

web

мер, в файле mime.types сервера Apache. Готовые решения для конвертации файлов или получения из них метаданных можно найти среди настроек пакета Midnight Commander, в файле mc.ext.

Режим хранения cacheСуществует несколько способов ускорить работу движ-ка, один из них – использовать метод хранения данных cache. Для работы в этом режиме нам потребуются утили-ты cached и run-splitter, находящиеся в директории sbin от-носительно движка. Если у вас уже создана SQL-база дан-ных в другом режиме (dpmode), не забудьте сначала ее удалить и только потом изменить режим хранения. Очис-тим базу данных командами: «indexer -С» (очистка SQL-таб-лиц) и «indexer -Edrop» (удаление таблиц). Далее создайте из файла шаблона cached.conf-dist, расположенного в пап-ке etc нашего движка, файл cached.conf. Не забудем изме-нить в нем параметры доступа к SQL БД:

Теперь можно отредактировать файлы index.conf и search.conf, изменив в них параметры:

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

Далее перейдем в директорию sbin нашего движка и за-пустим утилиту cached с параметрами:

Демон запустится и будет записывать отладочную ин-формацию в файл cached.out. Порт работы cached по умол-чанию – 7000, но если необходимо, его можно изменить (в cached.conf).

Заново создадим SQL-таблицы для нового режима хра-нения данных командой «indexer -Ecreate» и проиндекси-руем сервер – indexer. После завершения выполним ко-манду:

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

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

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

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

В DataparkSearch имеется возможность индексиро-вать сегменты сетей, за это отвечает параметр: subnet 192.168.0.0/24 в indexer.conf.

Также возможно запрещать индексировать опреде-ленные типы файлов или конкретные папки на серверах: Disallow *.avi или Disallow */cgi-bin/*.

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

ВыводыПоисковый движок DataparkSearch – мощное средство для работы c веб-ресурсами, расположенными как в локальной сети, так и в глобальной. Проект постоянно развивается и дорабатывается, на момент написания статьи последняя стабильная версия движка 4.38 (от 13.03.2006) и снапшота 4.39 (от 19.04.2006). Должен заметить, что обновления пос-ледней версии происходят почти через день.

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

Ссылки:1. Google Desktop Search – http://desktop.google.com.2. Ask Jeeves Desktop Search – http://about.ask.com.3. DataparkSearch – http://www.dataparksearch.org.4. Wordindex – http://wordindex.sourceforge.net.5. ASPseek – http://www.aspseek.org.6. Beagle – http://beagle-project.org.7. MnogoSearch – http://www.mnogosearch.ru.8. Ищейка – http://www.isleuthhound.com.9. Htdig – http://htdig.org.

10. Mysql – http://www.mysql.com.11. Firebird – www.firebirdsql.org.12. PostgreSQL – http://www.postgresql.org.13. Apache – http://www.apache.org.14. Catdoc – http://www.45.free.net.15. XLHTML – http://chicago.sourceforge.net/xlhtml.16. vwHtml – http://wvware.sourceforge.net.17. unrtf – ftp://ftp.gnu.org/pub/gnu/unrtf.

indexer.confDBAddr mysql://searcher:qwerty@localhost/search/ ↵ ?dbmode=cache&cached=localhost:7000

search.htmDBAddr mysql://searcher:qwerty/search/?dbmode=cache

cached & 2> cached.out

run-splitter -k

DBAddr mysql://searcher:qwerty/search/?dbmode=cache

Page 87: 042 Системный Администратор 05 2006

85№5, май 2006

bugtraq

Переполнение буфера в ClamAVПрограмма: Clam AntiVirus (clamav) 0.80 по 0.88.1.Опасность: Средняя.Описание: Уязвимость существует из-за ошибки проверки границ данных в HTTP-клиенте в утилите Freshclam. Уда-ленный пользователь может вызвать переполнение стека, если размер HTTP-заголовков, полученных от веб-серве-ра, превышает 6 Kб. Удачная эксплуатация уязвимости воз-можна, если Freshclam используется для закачки обновле-ния сигнатур вирусов с злонамеренного сервера (напри-мер, посредством отравления DNS-кэша). URL производителя: www.clamav.net.Решение: Установите последнюю версию (0.88.2) с сайта производителя.

Множественные уязвимости в Symantec Scan EngineПрограмма: Symantec Scan Engine 5.0.Опасность: Средняя.Описание: 1. Ошибка дизайна обнаружена в механизме ау-тентификации, используемом Symantec Scan Engine. Уда-ленный пользователь может получить доступ к админист-ративному веб-интерфейсу с помощью специально сфор-мированного XML-запроса.

2. Symantec Scan Engine использует статический част-ный DSA-ключ для SSL-соединения между сервером и ад-министративным приложением. Данный ключ не может быть изменен. Удаленный пользователь может произвести атаку «человек посредине» и расшифровать передаваемые дан-ные между сервером и административным клиентом.

3. Symantec Scan Engine недостаточно ограничивает до-ступ к файлам в установочной директории приложения. Уда-ленный неавторизованный пользователь может с помощью HTTP-запроса скачать произвольные файлы приложения, например: конфигурационные файлы, лог файлы сканиро-ваний и файлы с текущим описанием вирусов. URL производителя: www.symantec.com.Решение: Установите последнюю версию (5.1) с сайта про-изводителя.

Множественные уязвимости в EtherealПрограмма: Ethereal 0.8.5 по 0.10.14.Опасность: Высокая.Описание: Различные типы ошибок (ошибки обработки границ данных, ошибки завышения на единицу, бесконеч-ный цикл) существуют в большом количестве диссекторов в Ethereal. Удаленный пользователь может аварийно завер-шить работу приложения, потребить все доступные ресур-сы на системе и выполнить произвольный код. URL производителя: www.ethereal.com.Решение: Установите последнюю версию (0.99.0) с сайта производителяПереполнение буфера и раскрытие

данных в MySQLПрограмма: MySQL 4.1.18 и более ранние версии, MySQL 5.0.20.Опасность: Средняя.Описание: 1. Уязвимость существует из-за недостаточной обработки данных в команде COM_TABLE_DUMP. Удален-ный пользователь может с помощью специально сформи-рованного пакета получить доступ к важным данным на системе (к частям запросов или результатам их выполне-ния другими пользователями).

2. Переполнение стека обнаружено в команде COM_TABLE_DUMP. Удаленный пользователь может послать серверу специально сформированную последователь-ность COM_TABLE_DUMP-пакетов и вызвать отказ в об-служивании или выполнить произвольный код на целе-вой системе. URL производителя: www.mysql.com.Решение: Установите последнюю версию (5.0.21) с сайта производителя.

SQL-инъекция в OracleПрограмма: Oracle 10g.Опасность: Низкая.Описание: Уязвимость существует из-за недостаточ-ной обработки входных данных в пакете DBMS_EXPORT_EXTENSION. Удаленный пользователь может выполнить произвольные SQL-команды в базе данных приложения. URL производителя: www.oracle.com.Решение: В настоящее время способов устранения уязви-мости не существует.

Раскрытие данных в MySQLПрограмма: MySQL 4.1.18, и более ранние версии, MySQL 5.0.20.Опасность: Низкая.Описание: Уязвимость существует при обработке име-ни анонимного пользователя (пользователя с пустым па-ролем) в процессе аутентификации. Удаленный пользо-ватель может послать серверу специально сформирован-ный пакет и получить доступ к важным данным на системе (к частям запросов или результатам их выполнения други-ми пользователями). URL производителя: www.mysql.com.Решение: Установите последнюю версию (5.0.21) с сайта производителя.

Отказ в обслуживании в ISC BINDПрограмма: ISC BIND 9.3.x и более ранние версии.Опасность: Низкая.Описание: Уязвимость существует из-за ошибки при обра-ботке TSIG в последующих сообщениях в механизме транс-фера зон. Удаленный пользователь может с помощью спе-циально сформированного TSIG в сообщении вызвать от-каз в обслуживании процесса named. URL производителя: www.isc.org.Решение: В настоящее время способов устранения уязви-мости не существует.

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

Page 88: 042 Системный Администратор 05 2006

86

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

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

Желание сэкономить и выбрать на-иболее оптимальный вариант посетило и студию Pixar, занявшуюся созданием первого полнометражного мультфиль-ма, созданного целиком при помощи компьютерной графики. В результате рабочие станции Silicon Graphics хоть и были использованы, но только в качес-тве рабочего инструмента для художни-ков и аниматоров, и лишь исключитель-но из-за многообразия программных пакетов, доступных для платформы. Что же касается серверов, составляв-ших систему просчёта (rendering farm), и систем хранения данных, тут компа-нию опередила Sun Microsystems.

Итог известен всем: выход в 1995 году анимационного мультфильма «Иг-

рушечная история» позволил Sun отоб-рать у Silicon Graphics частицу всемир-ной славы. Жестокая война продук-ции компании с рабочими станциями от DEC, Hewlett-Packard и уже упоми-навшейся Sun Microsystems, а также появление нового «конкурента» – про-цессора Pentium Pro вынудили Silicon Graphics признать, что она более не од-на и теперь ей придётся изрядно потру-диться, чтобы сохранить свои позиции в этом секторе рынка.

Однако первая настоящая «пощёчи-на» была получена от «злейшего врага всего компьютерного мира» – Microsoft. Как только Silicon Graphics объявила о лицензировании API OpenGL, эта ком-пания в срочном порядке записалась в члены комитета ARB. Между ними сразу же был заключен договор, со-гласно которому Silicon Graphics помо-жет Microsoft написать версию OpenGL для её новой операционной системы Windows NT, предназначенной для ра-бочих станций, работающих на различ-ных архитектурах (х86, PowerPC, PA-RISC Alpha, SPARC и MIPS). Работа бы-ла проделана, Windows NT – выпуще-

на, и все, казалось бы, были доволь-ны… до появления Windows 95.

В начале 1995 года Microsoft запус-тила программу по поддержке разра-ботки игр, работающих на её новой ОС. Суть этой программы заключалась в захвате персональными компьютера-ми, работающими на базе Windows 95, части рынка игровых консолей, на ко-тором в то время доминировали ком-пании Nintendo и Sega.

Microsoft приняла решение не ис-пользовать OpenGL, к тому времени успешно применявшийся в Windows NT, для обработки трёхмерной графи-ки в играх. Вместо этого она приоб-рела компанию Rendermorphics, Ltd. разработавшую API под названием RealityLab. После его доработки и пе-реименования в Direct3D Microsoft объ-явила о своём намерении сделать но-вый API единственным стандартом для Windows 95. Специально для этого компания отказалась предоставить не-обходимую информацию относительно своей новой операционной системы разработчикам приложений и игр под OpenGL. Фактически на протяжении

Надежда умирает последней: история компании SGIЧасть 2

Уход основателя Silicon Graphics Джима Кларка из компании изначально не был воспринят всерьёз. «Подумаешь, ушёл один человек, когда в компании таких, как он, – тысячи». Однако, если поломка даже единственной шестерёнки может стать причиной выхода из строя всего механизма, что ждало Silicon Graphics?

Дмитрий Мороз

Page 89: 042 Системный Администратор 05 2006

87№5, май 2006

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

длительного периода времени компа-ния специально «тормозила» развитие OpenGL, а также появление этого API на Windows 95. Примером может слу-жить тот факт, что приложения, напи-санные на базе OpenGL и работавшие на Windows NT, на Windows 95 запус-каться просто отказывались.

После этого последовала так назы-ваемая война API, в которую были вов-лечены не только производители гра-фических карт, но и разработчики при-ложений и игр, а также простые поль-зователи. Многочисленные статьи, сравнивающие оба стандарта, анали-тические очерки, публичные обраще-ния к Microsoft – всё это мир ПК пере-жил за каких-то два года. К 1997 го-ду компания смогла достаточно до-работать Direct3D (сделав его частью DirectX), чтобы не беспокоиться конку-ренции со стороны OpenGL, поэтому-таки сподобилась обеспечить его огра-ниченную поддержку в Windows 95. Од-нако к тому времени имидж Microsoft был уже подпорчен.

Тем не менее Sil icon Graphics не сильно огорчилась. Профессио-нальный рынок всё ещё принадлежал ей, а персональные компьютеры не могли составить конкуренции собс-

твенным системам компании. Поз-же это мнение окажется ошибочным, однако в 1995-97 гг. Silicon Graphics продолжала не спеша «плыть по те-чению».

Как известно, компьютер или в дан-ном случае рабочая станция являют-ся для артиста лишь инструментом, причём не самодостаточным. Кроме него необходимы и программы. По-нимала это и Silicon Graphics. Поэто-му 7 февраля 1995 года она объявила о покупке за 650 млн. долл. компаний Alias Research и Wavefront Technologies, являвшихся главными поставщика-ми программных продуктов в сфе-ре трёхмерной графики и анимации, а также промышленного дизайна, и их объединении в одну под назва-нием Alias|Wavefront (в апреле 2003 переименованную в Alias). Новоиспе-чённая компания начала параллельно с выпуском обновлённых версий уже успевших зарекомендовать себя про-грамм разработку графического паке-та нового поколения для трёхмерного моделирования и анимации под назва-нием Maya, который с выходом в 1997 году стал стандартом де-факто в про-изводстве компьютерных спецэффек-тов для кинофильмов.

12 июля 1995 года стал самым счас-тливым днём в истории компании – сто-имость одной акции Silicon Graphics со-ставила рекордные 45,25 долл., что на то время было в два раза больше сум-мы, которую просили за акцию Microsoft. В различных подразделениях компании по всему миру работали 12 тысяч чело-век. Сравните эти цифры с показателя-ми начала 2006 года: менее доллара за акцию и менее 2100 сотрудников.

Однако всё это ждало компанию в будущем, а пока 23 апреля 1996 года свет увидела игровая консоль Nintendo 64, являвшаяся результа-том проекта Project Reality. Для Silicon Graphics приставка значила одно – финансовые поступления. От прода-жи каждой консоли компания получа-ла свою частичку, которая позволила Silicon Graphics сделать одну из самых больших ошибок за время своего су-ществования – купить за 764 млн. долл. компанию Cray Research.

К тому времени Cray Research яв-лялась одним из двух основных пос-тавщиков параллельных векторных суперкомпьютеров. Кроме того, в ар-сенале компании присутствовали и обычные массивно-параллельные «суперы». Во время совершения сдел-ки доход Cray достиг отметки 900 млн. долл. В штате компании работало око-ло 4500 сотрудников.

Итак, что же Silicon Graphics при-обрела за баснословную сумму? Во-

Проект «Действительность»История появления консоли Nintendo 64 столь же интересна, как и сама игро-вая приставка. Когда к компании Sega of America поступили данные о будущей це-не их новой консоли Sega Saturn, которая должна была стоить $549, к ней обратился Джим Кларк, в то время ещё надеявший-ся воплотить свои мечты в недрах Silicon Graphics. «У меня есть несколько процессо-ров, производных архитектуры MIPS, кото-рые как нельзя лучше подойдут для вашей системы», – говорил он. Несмотря на согла-сие американского подразделения корпо-рации принять предложение Кларка, Sega Japan ответила отказом. Однако предпри-имчивый Джим обращался с целью поиска потенциального клиента не только к Sega, но и к другим компаниям. Одной из них была Nintendo, с радостью согласившаяся совместно с Silicon Graphics разрабатывать консоль следующего поколения.

В основе приставки лежат два про-цессора. Первый, NEC VR4300, основан-ный на базе ядра MIPS R4300i, работает на частоте 93,75 МГц и отвечает в основ-ном за игровую логику. Второй, RCP (час-

тота работы 62,5 МГц), состоит из двух от-дельных процессоров: RSP (занимается обработкой полигонов: трансформацией, освещением, обрезанием и т. д.) и RDP (на его плечах лежит Z-буферизация, ап-паратное сглаживание и текстурирование). Объём оперативной памяти RDRAM в 4 Мб мог быть увеличен вдвое путём установки в консоль специальной платы расширения. Nintendo 64 обрабатывала около 100 тыс. полигонов в секунду, хотя при отключении аппаратного сглаживания и других функ-ций эта цифра переваливала за полмил-лиона треугольников.

К сожалению, несмотря на свои выда-ющиеся графические возможности (кото-рые лишь немногим не дотягивали до уров-ня IRIS Crimson), использование морально устаревших картриджей в качестве носи-теля информации, а также банальный пе-ренос срока выхода консоли на год (с пла-нировавшегося 1995 на 1996 г.) не позво-лили Nintendo 64 стать лидером продаж. К концу 2002 года было продано 32 млн. приставок, тогда как основной конкурент, Sony PlayStation, разошлась по миру 100-миллионным тиражом.

Рисунок 1. Игровая консоль Nintendo 64

Рисунок 2. Рабочая станция O2

Page 90: 042 Системный Администратор 05 2006

88

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

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

Однако оставим Cray на некоторое время в покое и поговорим о Silicon Graphics, вернее, о новых продуктах, выпущенных компанией в 1996 году.

Обновление модельного ряда рабо-чих станций от Silicon Graphics состо-ялось 10 октября 1996 года, когда ми-ру была представлена модель O2, при-шедшая на замену станции Indy. Глав-ным новшеством О2 стала архитек-тура её памяти, представлявшая со-бой реализацию UMA (Unified Memory Architecture – унифицированная ар-хитектура памяти). Сердцем рабочей станции, кроме процессора, также яв-лялся специальный «контроллер памя-ти и графики», передававший данные между процессором и ОЗУ на скорости 2,1 Гбайт/с (в 20 раз быстрее ПК образ-ца 1996 года). CPU выступал как в ка-честве основного, так и графическо-го процессора. Все данные хранились в оперативной памяти, в результате че-го отпадала необходимость в исполь-зовании дополнительной видеопамя-ти. Приведём результат использова-ния UMA и O2 в частности. Поток виде-оданных, получаемый при помощи вхо-

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

Несмотря на позиционирование в качестве рабочей станции началь-ного уровня, O2 при установке более мощного процессора по производи-тельности «обходила» Indy, Indigo 2 с большинством графических карт, Power Challenge, и даже в некоторых случаях сервер Origin 200. Кстати, о нём, родимом. «Звездой» того вре-мени, бесспорно, стал анонс Silicon Graphics высокомасштабируемых сер-веров семейства Origin 2000 (поколе-ние SN-0), построенных на базе NUMA-архитектуры. Сервер начального уров-ня, Origin 200, мог содержать от одного до четырёх процессоров MIPS R10000, тогда как топовая модель, Origin 2000 – до 128 чипов и до 256 Гб ОЗУ. Дальней-шие усовершенствования позволили серверам Origin 2000 «нести на бор-ту» до 512 процессоров и до 2 Тб опе-ративной памяти.

Для демонстрации масштабируе-мости этих серверов также приведём один пример. Суперкомпьютер Blue Mountain, установленный в Лос-Ала-мосе был получен путём объединения пятидесяти систем Origin 2000. Общее количество процессоров в системе со-ставило 6400 штук.

Выпущенные в это же время графи-ческие суперкомпьютеры Onyx2 (быв-шие Onyx Reality Engine) представляли собой сервера Origin 2000 с графичес-

Передовая технологияNUMA (Non-Uniform Memory Access – до-ступ к неоднородной памяти) представля-ет собой многопроцессорную архитектуру, в которой местоположение оперативной памяти выбирается наиболее оптималь-ным образом для максимального умень-шения времени доступа.

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

Архитектура SN (Scalable Node – мас-штабируемый узел), разработанная Silicon Graphics, является примером реализации NUMA. В SN-системе процессоры, ОЗУ,

а также контроллер шин объединены вмес-те в единицу, известную как «узел», пред-ставляющий собой обычно одну плату. Уз-лы, в свою очередь, объединяются пос-редством высокопроизводительной вне-шней шины, названной NUMAlink. Внут-ренняя системная шина отсутствует. Вмес-то неё обмен данными между процессора-ми, памятью и устройствами ввода/выво-да происходит посредством линии пере-ключателей и маршрутизаторов. Основ-ное преимущество SN-систем, кроме высо-кой скорости передачи информации – мас-штабирование, которое происходит сразу во всех направлениях: с линейным увели-чением количества процессоров увеличи-вается объём ОЗУ, количество устройств ввода/вывода и т.д.

Рисунок 3. Сервера Origin 2000

первых, нереализованный товар на 600 млн. долл. Во-вторых, семейс-тво «суперсерверов» Superserver, ко-торое компания сразу же продала Sun Microsystems (моментально стар-товавший на базе купленной линей-ки проект «Starfire» вылился в появ-ление очень удачного семейства сер-веров Enterprise, благодаря которым Sun и по сей день конкурентоспособна в этом секторе рынка). В-третьих, но-вые каналы продаж (Cray поставляла свои системы в Министерство обороны США, Министерство топлива и энерге-тики, NASA, военные базы, крупные на-учно-исследовательские лаборатории и т. д.). И, наконец, в-четвёртых, техно-логии Cray, а также высококвалифици-рованных инженеров, большинство ко-торых, правда, через некоторое вре-мя уволили.

Политика Slicon Graphics по отно-шению к Cray была просто варварс-кой: производство векторных супер-компьютеров, которыми так славилась компания, было практически прекра-щено; Cray были «навязаны» собствен-ные сервера Silicon Graphics, над ко-торыми компания отныне должна бы-ла трудиться.

Однако всё это не шло в сравнение с главной проблемой, возникшей пос-ле приобретения. Silicon Graphics так долго и так рьяно соперничала с Cray на рынке суперкомпьютеров, что, как только обе компании стали парт-нёрами, они не смогли договориться

Page 91: 042 Системный Администратор 05 2006

89№5, май 2006

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

кими акселераторами InfiniteReality 2/3. Производительность Onyx2, как уже упоминалось в первой части статьи, достигла 2 млн. полигонов в секунду.

Завершил обновление модельно-го ряда Silicon Graphics выход в янва-ре 1997 года рабочей станции среднего уровня под названием Octane. Основ-ные её отличия от O2: упрощённая ар-хитектура Origin 2000, поддержка двух процессоров, до 2 Гб ОЗУ, а также ви-деокарты серии Impact 4-летней дав-ности, созданные ещё для Indigo 2.

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

Ещё одна проблема, на которую компания доселе не обращала вни-мания, – появление персональных компьютеров, стремительно догоняю-щих рабочие станции Silicon Graphics по производительности. Процессор-ную мощность им обеспечивала ком-пания Intel, тогда как графическую – «новоиспечённые» 3Dfx и nVidia (со-зданные, кстати, бывшими выходцами из Silicon Graphics). «Компания прос-то не верила в то, что персональные компьютеры, бывшие ещё в 1995 году «игрушками», будут прогрессировать так быстро, – говорил аналитик Jupiter Research Майкл Гартенберг. – Она поп-росту игнорировала Закон Мура».

«Silicon Graphics была всеобщей любимицей, компания считалась «ко-ролём горы» рабочих станций, – гово-рил аналитик Dataquest Питер Фоул-кис. – Но за своими «розовыми» очка-ми она не заметила, как рынок с неве-роятной скоростью меняется за её спи-

ной». И эти слова оказались прелюди-ей к началу упадка Silicon Graphics.

Первое массивное сокращение ра-бочего персонала в истории компании последовало на следующий день пос-ле анонса 27 октября 1997 г. неудов-летворительных показателей Silicon Graphics за прошедший финансовый квартал – 37 млн. долл. убытка (ос-новная причина – 50% падение спроса на рабочие станции компании), что бо-лее чем в полтора раза больше показа-теля за аналогичный квартал 1996 го-да. Генеральный директор Эд МакКра-кен объявил о том, что работу потеряют от 700 до 1000 сотрудников. Массовые увольнения сопровождались бегством и c более высоких постов. Так, вслед за Джимом Кларком компанию посте-пенно покинули президент Том Джер-молак, управляющий дизайнерскими разработками Alias/Wavefront Роберт Баргисс и исполнительный директор по международным финансовым опе-рациям Гари Лаер.

Продажи рабочих станций компа-нии шли из рук вон плохо. Более де-шёвые альтернативы из мира ПК стре-мительно догоняли продукцию Silicon Graphics по возможностям, а уж по со-отношению цена/производительность давно вырвались вперёд. «Silicon Graphics, по существу, вытесняли из рынка, на котором она до недавних пор была единственной, – говорил Гар-тенберг. – Она продолжала разрабаты-вать рабочие станции класса high-end, тогда как стандартные ПК к тому вре-мени уже обладали довольно хорошей

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

Все вышеперечисленные пробле-мы вынудили Эда МакКракена уйти с поста генерального директора ком-пании. Его место в январе 1998 года занял «убийца Silicon Graphics», ярый приверженец Microsoft Рик Белуццо, до этого практически «уничтоживший» разработки HP/UX (вариант UNIX) и ра-бочих станций на её основе в компа-нии Hewlett-Packard.

ДиверсантПервые же действия новоиспечённо-го CEO, направленные на «улучше-ние финансовых показателей компа-нии», не заставили себя ждать. В на-чале 1998 года Silicon Graphics офи-циально объявила о подписании со-глашения с Microsoft, согласно кото-рому обе компании будут разрабаты-вать графический API под названи-ем Fahrenheit, представляющий собой смесь DirectDraw, Direct3D и OpenGL и призванный «закончить войну стан-дартов 3D-графики» в Windows. Од-нако Microsoft, параллельно с работой над Fahrenheit, продолжала развивать свой DirectX, нагло копируя в него все новшества из «Фаренгейта». Доказа-тельством этого может служить заяв-ление одного из разработчиков DirectX, прозвучавшее в августе 1998 года: «Direct3D представляет собой API, ко-торый в будущем будет наиболее сов-

Несостоявшийся трёхмерный ИнтернетЕщё одна неудача, которую потерпела Silicon Graphics, была связана с VRML.

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

В середине 1994 года была придумана концепция трехмерного HTML: своеобраз-ного языка описания трехмерных сцен с под-держкой гиперссылок. Позже она получила название VRML. Для описания сцен был вы-

бран формат файлов программной библи-отеки Open Inventor, разработанной Silicon Graphics. В октябре того же года доработан-ный инженером Silicon Graphics формат пре-вратился в первую версию VRML.

В отличие от Sun Microsystems, Silicon Graphics не уделяла интернет-технологи-ям должного внимания. «Единственная их попытка заключалась в создании VRML, – говорил аналитик Jupiter Research Ноа Яс-скин. – Они потратили на него много вре-мени и денег, а отдача от проекта получе-на так и не была».

«Критической массы» для широкого распространения VRML не набрал и на се-годняшний день является в основном за-бавой для специалистов и немногих ин-тернет-магазинов.

Рисунок 4. Графические суперкомпьютеры Onyx2

Page 92: 042 Системный Администратор 05 2006

90

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

местим с Fahrenheit, к тому же оба они очень похожи».

Постепенно «сотрудничество» между двумя компаниями зашло в ту-пик, в результате чего в ноябре 1999 года Silicon Graphics объявила о пре-кращении работ со своей стороны. «Мы решили уменьшить наше учас-тие в разработке Fahrenheit», – та-кое заявление было опубликовано на сайте Silicon Graphics. За прошед-шие два года с момента начала работ над проектом собственный API компа-нии, OpenGL, практически не совер-шенствовался. В то же время Microsoft, пользуясь наработками инженеров Silicon Graphics, значительно модерни-зировала DirectX, превратив его в глав-ный API для разработки мультимедий-ных приложений под Windows.

Однако разработка Fahrenheit была лишь первым этапом роковой ошибки Silicon Graphics. Мотивируя своё реше-ние тем, что рабочие станции компа-нии более не могут соперничать с пос-тоянно развивающимися персональ-ными компьютерами, Белуццо объ-явил о появлении новой линейки Visual Workstation, основанной на базе про-цессоров Intel и работающей под уп-равлением Windows NT. Продажи пер-вых двух моделей, 320 (на базе двух процессоров Pentium II) и 540 (четыре процессора Pentium II Xeon), стартова-ли в начале января 1999 года.

В принципе Visual Workstation были не такими уж плохими. Вернее, на мо-мент выхода они были лучшими среди рабочих станций на базе процессоров х86. Являющаяся неким скрещивани-ем UMA и NUMA, архитектура IVC объ-

единяла ОЗУ, процессор, графическую, звуковую и сетевую подсистемы в еди-ное целое. Ядром Visual Workstation яв-лялся чип Lithium, функционирующий наподобие маршрутизатора и пред-ставляющий собой многопозицион-ный переключатель, призванный уб-рать узкие места системных шин рабо-чей станции. Графический чип системы, Cobalt, использовал оперативную па-мять для своих нужд, динамически вы-деляя необходимое в данный момент количество ОЗУ под видеопамять.

Тем не менее техническое пре-восходство новых рабочих станций от Silicon Graphics не спасло их от про-вала: продажи шли из рук вон плохо. Несмотря на более низкую цену (от 4 тыс. долл.) по-сравнению со своими MIPS-собратьями, O2 и Octane, Visual Workstation по-прежнему оставались дороже конкурентов, выпускаемых Dell и Compaq. «Современная реальность такова, что заново «изобретать коле-со» в некоторых сегментах рынка прос-то бессмысленно», – говорил по поводу сложившейся ситуации начальник отде-ла маркетинга Visual Workstation Джеф Стедман. «Лучшим решением для нас было бы улучшение стандартной плат-формы, уже принятой рынком».

Итак, постепенно свершилось то, во что никто не мог поверить – Silicon Graphics потеряла статус признанного лидера по производству графических станций. Хотя к этому времени её руко-водство уже не отрицало, что этот сег-мент рынка более не является для неё основным. А раз так, необходимо бы-ло избавиться от названия «Silicon Graphics», всё ещё прочно ассоцииро-вавшегося с термином «компьютер-ная графика». Отделом маркетинга компании была предложена идея о её переименовании. 13 апреля 1999 года Silicon Graphics International лишилась практически всех букв в собственном названии, получив имя SGI. «Такое ре-шение позволит SGI развиваться быс-трее, поскольку «брэнд» должен быть достаточно гибким, чтобы компания могла расширяться, пробуя себя в но-вых секторах рынка, и при этом оста-валась в памяти у людей, помнящих её как Silicon Graphics», – говорил по это-му поводу Клей Таймон, президент компании Landor Associates, занимаю-щейся разработками торговых марок и «брэндов». Однако смена названия

компании, по существу, на улучшение её финансового благосостояния никак не повлияла. К тому же SGI в то время было не до имени.

В 1999 году финансовое положе-ние компании продолжало ухудшать-ся: 40 млн. долл. убытка за истекший финансовый квартал и очередное падение курса акций до 14,75 долл. «Эти временные трудности закрыва-ют прогресс, который мы делаем в дру-гих областях нашего бизнеса: анонс новых продуктов, улучшенное качес-тво и эффективность, а также более низкие затраты», – объяснял по пово-ду ужасных показателей Рик Белуц-цо. «На данный момент мы фокусиру-ем наши усилия на получение отдачи в новых рынках».

С этими словами 10 августа 1999 года Белуццо объявил план глобаль-ной реорганизации компании. Во-пер-вых, Silicon Graphics в ближайшее вре-мя продаст подразделения, занимаю-щиеся Visual Workstation, MIPS и Cray, а также уволит 1500 инженеров, рабо-тающих в них. Во-вторых, компания на-чнёт переход от использования в сво-их системах процессоров MIPS и ОС IRIX на процессоры Intel Merced (буду-щий Itanium) и Linux. И, в-третьих, ком-пания откажется от создания собствен-ных графических карт в пользу реше-ний от сторонних разработчиков.

Под это «радостное» заявление Бе-луццо 23 августа 1999 г. принял реше-ние уйти из SGI. Нанеся ряд сокруши-тельных ударов компании и удостове-рившись в успешном завершении сво-их замыслов, он поспешно ретировал-ся с «тонущего корабля» и перебрал-ся к Microsoft, заняв должность испол-нительного директора.

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

Источники:1. http://arstechnica.com2. http://en.wikipedia.org3. http://www.cnet.com4. http://www.sgi.com5. http://www.theregister.co.uk

Редактор рубрикиКирилл Тихонов

Рисунок 5. Рабочая станция Octane

Рисунок 6. Рабочие станции Visual Workstation 320 и 540

Page 93: 042 Системный Администратор 05 2006

91№5, май 2006

конкурс

1 место – 30 000 рублей 2 место – 20 000 рублей 3 место – 10 000 рублей

Номинации1. За лучшую серию материалов2. За лучшую новую авторскую тему3. За лучшую аналитическую статью

Кто участвуетУчастие принимают все авторы, опубликовавшие свои статьи в журнале «Системный администратор» в тече-ние 2006 года. Напоминаем, что автором может стать лю-бой человек.

О номинациях1. Серией материалов считается блок из не менее чем

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

2. Статья, написанная на тему, придуманную автором и одобренную редакцией.

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

Кто судьиВ состав жюри войдут сотрудники редакции и предста-вители дружественных журналу информационных ре-сурсов.

Условия публикацииПринимаются материалы, нигде ранее не опубликованные (в том числе в Интернете, прочих глобальных сетях, печат-ных изданиях и т. д.). Статьи не рецензируются.

За содержание статьи ответственность несет автор.В течение двух недель редакция принимает решение

о публикации статьи и сообщает об этом автору.Редакция оставляет за собой право редактировать пре-

доставленные материалы.Редакция имеет эксклюзивное право на распростране-

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

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

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

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

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

Рекомендации авторамОбъем статьи – от 4 до 20 тыс. знаков. Если тема ста-тьи предполагает объем, превышающий 20 тыс. знаков –

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

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

Рекомендуем ознакомиться со статьями на интересую-щую вас тему, которые уже есть на нашем сайте.

Требования к виду присылаемых материаловСтатьи следует присылать в текстовом виде, предпочти-тельно в формате RTF или DOC. Имена пересылаемых файлов только на английском языке. Выравнивание столб-цов производится табуляцией, а не пробелом. В тексте ста-тьи рекомендуется указывать местоположение иллюстра-ций и подписи к ним, а сами иллюстрации не нужно встав-лять в тело документа, их нужно запаковать в отдельный архив. Иллюстрации должны быть строго в формате PNG. Листинги должны содержать не более 60 символов (вмес-те с пробелами) в одной строчке. Переносы строк листин-гов должны быть указаны в явном виде (---перенос стро-ки---). Если в статье приводятся ссылки на ресурсы в сети, URL должен быть указан в явном виде.

Контакты

Редакция журнала «Системный администратор» объявляет об учреждении 3 премий авторам по итогам 2006 года:

Адрес: 107045, г. Москва, Ананьевский переулок д. 4/2, стр. 1, Редакция «Учительской газе-ты», журнал «Системный администратор»

Телефон: (495) 628-82-53

Факс: (495) 628-82-53

Сайт: www.samag.ru

e-mail: [email protected], [email protected]

Page 94: 042 Системный Администратор 05 2006

92

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

Издание является переводом офици-ального руководства по настройке ком-мутаторов Catalyst. Благодаря сжато-му стилю повествования, авторам уда-лось поместить максимум информации в минимальный объем. Освоив матери-ал этой книги, вы без затруднений смо-жете работать с большинством моделей коммутаторов серии Catalyst. Вся книга четко структурирована, и поделена на 14

Перед вами не просто еще одна кни-га о С++, в которой будет говорить-ся о том, как «правильно» писать. Это нечто большее, это своего рода про-водник и помощник, а так же добрый советчик. В введении, которое носит название «философия неидеального практика» автор подробно описыва-ет четыре тезиса, а именно: «С++ ве-ликолепный язык, но не идеальный»,

глав, из которых вы узнаете о использо-вании интерфейса коммандной строки, функциях коммутаторов различных се-рий (2950, 3550, 4000, 5000, 6000). Рас-смотривается конфигурирование бло-ка Supervisor; конфигурирование интер-фейсов второго уровня: таблицы комму-тации, выбор порта, Ethernet, etherchanel, token ring порты; конфигурирование ин-терфейсов третьего уровня: WAN интер-фейсы, VLAN, таблицы маршрутизации. VLAN-сети и транкинг: конфигурация, назначение сетям VLAN портов, тран-кинг; протокол распределенного свя-зующего дерева (STP), многоуровне-вая коммутация (экспресс-коммутация Cisco, экспорт данных NetFlow, резер-вирование модулей MSFC в одном ус-тройстве, резервирование маршрути-заторов с помощью протокола HSRP). Многоадресные службы: IGMP-про-слушивание, протоколы CGMP, GMRP, RGMP. Балансировка нагрузки на серве-

Руководство Cisco по конфигурированию коммутаторов CatalystДэвид Хьюкаби, Стив Мак-Квери

ры (SLB): суть технологии, балансиров-ка нагрузки на брандмауэры, SLB-тесты. Управление трафиком и доступом к ком-мутатору (подавление широковещания, фильтрация протоколов, функции обес-печения безопасности портов, списки доступа VLAN сетей, аутентификация, списки разрешения доступа, конфигу-рирование служб SSH и Telnet, 802.1X). Управление коммутатором, качество об-служивания (QoS), поддержка переда-чи голосовых данных. Книга – хорошее приобретение для всех людей, которые так или иначе работают с оборудовани-ем фирмы Cisco.

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Cisco

Press».

«Cisco Press»

2004

560

5-8459-0700-4

≈ 589 руб.

Практический подход к решению проблем программирования C++Мэтью Уилсон

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

цовочных и прикрепляемых классах, а также о шаблонах и конструкторах. Отдельный раздел посвящен опера-торам – operator bool(), операторы ин-дексации и инкремента, арифметичес-кие типы. Расширение С++ : продолжи-тельность жизни возвращаемых зна-чений, память, многомерные массивы, функторы и диапазоны. В приложениях вы также найдете массу полезной ин-формации. Книга носит сугубо практи-ческий характер, и весь материал со-провождается большим количеством примеров. Отличная книга, рекомен-дую всем программистам на C++.

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Кудиц-

Образ».

«Кудиц-Образ»

2006

736

5-91136-006-3

≈ 511 руб.

Page 95: 042 Системный Администратор 05 2006

93№5, май 2006

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

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

Сейчас сложно представить, каки-ми могли бы быть сети без протокола динамической маршрутизации OSPF (Open Shortest Path First). Эта книга послужит вам как «учебником», так и справочным пособием по этому прото-колу маршутизации. Всего в книге три основные части, которые представле-ны десятью главами, и заключитель-ная часть с дополнительным материа-

Структура и реализация сетей на основе протокола OSPFТомас М. Томас II

лом и справочной информацией. «Ос-новные принципы функционирования протокола OSPF и организация взаи-модействия маршрутизаторов», так называется первый раздел, из кото-рого вы узнаете основные сведения об организации сетей и маршрути-зации (модель OSI, протоколы TCP/IP, типы сетевых топологий, принци-пы адресации, методы VLSM и CIDR). Введение в OSPF (краткий обзор ал-горитма SPF, иерархия маршрутиза-ции и эксплуатационная среда OSPF), способы взаимодействия по прото-колу OSPF (анонсы с информацией о состоянии каналов, способы переда-чи информации с помощью протоко-ла OSPF, управление анонсами LSA). Вторая часть носит название «Мар-шрутизация и проектирование сетей OSPF» в которой написано об основ-ных принципах проектирования (ме-тодология проектирования сети OSPF,

маштабируемость и топология сети, рассмотрены вопросы проектирова-ния различных областей). В третей части «Внедрение, устранение нару-шений в работе и управление сетью OSPF» автор повествует о протоко-ле SNMP, защите сети, рассмотре-ны основные команды, применяемые для поиска и устраниения неисправ-ностей в сети. Не остался без внима-ния и вопрос о применении протокола BGP и технологий MPLS в сетях OSPF. По окончания каждой главы матери-ал резюмируется и приводятся прак-тические примеры.

Eclipse IDEЭд Барнетлений». Основной упор сделан на рас-смотрение инструментария для разра-ботки приложений на Java. Из главы «Введение» вы узнаете общие сведения о Eclipse, установке, запуске и обнов-лении этого продукта. Во второй главе, с лаконичным названием «Верстак 101» будет рассмотрен интерфейс и основ-ные меню IDE Eclipse. Следом идет гла-ва «Java быстро», в которой написано о процессе создания проекта, кодирова-нии, запуске программы, отладке, юнит-тестирование, а также советы и хитрос-ти (помощник создания кода, шаблоны, автоматический вход, рефакторинг, ги-перссылки, быстрое исправление, по-иск, альбомные страницы, Java Build Path, конфигурация запуска). Для того чтобы не запутаться в множестве эк-ранов и панелей инструментов Eclipse, в главе «Экраны» перечислены основ-ные объекты. Содержание главы «Ко-ротко о разном» полностью оправды-

вает свое название. Из нее вы узнае-те о CVS, Ant, платформе веб-инстру-ментов, тестировании и производитель-ности, визуальном редакторе, AspectJ, разработке плагинов, платформе Rich Client. Завершает книгу глава «Получе-ние помощи», в которой автор предо-ставил список источников, из которых можно получить помощь по IDE Eclipse. Замечательная во всех отношениях книга – весь материал строго по делу, и без лишней воды. Если вы собирае-тесь, или уже работайте с Eclipse это издание станет вашим незаменимым спутником и помощником.

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

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Кудиц-

Образ».

«Кудиц-Образ»

2006

160

ISBN 5-91136-007-1

≈ 99 руб.

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Cisco

Press».

«Cisco Press»

2004

816

5-8459-0594-X

≈ 657 руб.

Page 96: 042 Системный Администратор 05 2006

94

подписка на 2006 год

Российская Федерация Подписной индекс: годовой – 20780, полугодовой – 81655 Каталог агентства «Роспечать» Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» Альтернативные подписные агентства: Агентство «Интер-Почта» (495) 500-00-60, курьерская

доставка по Москве Агентство «Вся Пресса» (495) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 ЛинуксЦентр www.linuxcenter.ru Подписка On-line http://www.arzi.ru http://www.gazety.ru http://www.presscafe.ru

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

ских изданий через предприятие по распространению

печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21) Казахстан – по каталогу «Российская Пресса» через

ОАО «Казпочта» и ЗАО «Евразия пресс» Беларусь – по каталогу изданий стран СНГ через РГО

«Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10) Узбекистан – по каталогу «Davriy nashrlar» российс-

кие издания через агентство по распространению пе-чати «Davriy nashrlar» (7000029, г. Ташкент, пл. Муста-киллик, 5/3, офис 33)

Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Да-вида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Сарьяна, 22)

Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42)

Молдавия – по каталогу через ГП «Пошта Молдавей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)

по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17)

по прайс-листу через ООО Агентство «Editil Periodice» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)

Подписка для Украины: Киевский главпочтамт Подписное агентство «KSS», тел./факс (044)464-0220

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

20780*

81655**

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

87836

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

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

Page 97: 042 Системный Администратор 05 2006

95№5, май 2006

подписка на 2006 год

Стоимость подписки через редакцию:

900* руб.за 6 номеров

1800* руб.за 12 номеров

Редакционная подпискаОткрыта подписка через редакцию. Вы можете оформить подписку на любое количество номеров 2006 года. Редак-ция не высылает журналы за пределы Российской Феде-рации.

Для юридических лиц: Отправьте заявку по факсу (495) 628-82-53 или по e-mail:

[email protected]. Укажите наименование и банковские реквизиты своей

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

Для физических лиц: Заполните нижеприведенную квитанцию, оплатите в лю-

бом банке и пришлите в редакцию копию с отметками банка.

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

* Включая НДС и почтовую доставку

№5(30) май 2005

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

www.samag.ruПочему MS SQL медленно работает?

Ищем причины

Строим защищенную беспроводную сеть:

WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить

удаленные файлы под BSD

Что важно знать об IP-телефонии

танавливаем Symantec Antivirus 9.0

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

Эффективно управляем

полями пользователей в AD

Контролируем безопасность сети

с помощью OSSIM

Интервью с Ларри Уоллом –

создателем языка Perl

Page 98: 042 Системный Администратор 05 2006

96

СИСТЕМНЫЙ АДМИНИСТРАТОР№5(42), Май, 2006 год

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир ЛукинРедакторАлексей КоршуновВнештатные редакторыАлексей БарабановКирилл ТихоновВалентин Синицын

РЕКЛАМНАЯ СЛУЖБАтел./факс: (495) 628-8253Евгения Тарабринаreс[email protected]

Верстка и оформление[email protected]Дизайн обложкиНиколай Петрочук

По вопросам распространенияобращайтесь по телефону:(495) 628-8253 (доб. 120)

107045, г. Москва,Ананьевский переулок, дом 4/2, стр. 1тел./факс: (495) 628-8253Сайт журнала: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр Положевец

УЧРЕДИТЕЛИВладимир ПоложевецАлександр Михалев

ИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейГП «Московская Типография №13»Тираж 11000 экз.

Журнал зарегистрированв Министерстве РФ по делам печати, телерадиовещания и средств массо-вых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.).

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

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

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

Спешите оформить подпискуна второе полугодие 2006 года!

Приобрести новые и старые номера журналавы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.

Доставка почтой в любую точку России.

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

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

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

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

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