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

Page 1

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

КА

БЫ С

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

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

ЛИ

СЬ

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

Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии

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

танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM

№5(42) май 2006

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

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

УЕ ХА Л

ВО

ТП УС К

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

Самый подробный материал о программе Sendmail в истории IT-журналистики! Настраиваем эффективную систему сетевой защиты Zorp

Так видит журнал читатель, оформивший подписку: №5(30) май 2005 подписной индекс 81655 www.samag.ru

Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD

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

Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl

Box Backup: узнайте всё о горячих резервных копиях! Лицензию? Вам какую? Как построить отказоустойчивый кластер с минимальным бюджетом

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

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

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

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



оглавление 3 ТЕНДЕНЦИИ

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

4 РЕПОРТАЖ

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

АДМИНИСТРИРОВАНИЕ 6 Box Backup – горячие резервные копии

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

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

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

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

Развитие IT-отдела связано с переходом от обслуживания базовой IT-инфраструктуры к созданию интранет-порталов и автоматизации бизнес-процессов. Эффективный инструмент для решения подобных задач – MS SharePoint. Иван Хрипунов i-ivank@microsoft.com Артем Черневский achern@microsoft.com

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

Ключ к управлению системой и приложениями. Константин Леонтьев klеоnt@miсrоsоft.соm

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

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

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

Валентин Синицын val@linuxcenter.ru

ЧЕЛОВЕК НОМЕРА 48 Прихоти судьбы. Биография IT-просветителя

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

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

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

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

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

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

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

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

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

Как организовать поиск информации на файловом сервере не только по названию и типу документа, но и по его контенту? Возможно ли создать подходящий инструмент, доступный и прозрачный для пользователей? Иван Максимов admin@ksanf.spb.ru

РЕТРОСПЕКТИВА 86 Надежда умирает последней: история компании SGI. Часть 2

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

92 КНИЖНАЯ ПОЛКА 41, 69, 85

BUGTRAQ

СПЕШИТЕ ОФОРМИТЬ ПОДПИСКУ НА II ПОЛУГОДИЕ 2006 ГОДА! №5, май 2006

1



тенденции 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.

тальных – на машинах представлены по две операционные системы». Также он сообщил, что переход оставшихся 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

Китай назвали крупнейшим 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, а у ос-

№5, май 2006

3


репортаж

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

К

онференция для разработчи- щедоступной кодовой базе, распро- можно увидеть изменения в последней версии Solaris?» – разработчики укаков Solaris Day прошла 19 апре- страняемой под лицензией CDDL. Выступление Каррэна заверши- зывают на значительно уменьшенное ля в один день с NetBeans Day. Эти два мероприятия стали отправ- лось курьезным случаем, вызванным время загрузки системы (благодаря ной точкой для впервые проводившей- вопросом слушателя о поддержке про- асинхронному запуску сервисов в SMF ся в России акции Sun Tech Days (20-21 цессоров Itanium в Solaris. Он снача- с учетом их зависимостей). Питер Карлсон продолжил расапреля). И несмотря на то что на Tech ла не мог понять (сделал вид, что не Days приехал с докладом легендарный мог?), о чем его спрашивают, а после крытие темы для разработчиков. Его Джеймс Гослинг, меня во всем этом того как несколько раз повторили сло- доклад был посвящен общим вопро3-дневном празднике, организован- во «Itanium», он ответил отчетливым сам миграции ПО с Linux на Solaris. ном Sun, заинтересовало именно пер- смешком в адрес этой разработки Intel, Иногда он почти в сатирической мавое событие, полностью посвященное что изрядно повеселило весь зал. Пос- нере пытался показать достоинства операционной системе компании. ле чего Фрэнк шутливо раскритиковал ОС от Sun, провоцируя слушателей На третьем этаже московской гос- процессор, «с которым теперь никто не вопросами в стиле «неужели вам еще что-то нужно?» и просьбами «назвать тиницы «Альфа» всех гостей встреча- знает, что делать». Затем на продолжительное время программу, которой не хватает в этом ли девушки, которые выдавали бейджи, программки для двух грядущих место докладчиков заняли наши со- списке!». (В это время за его спиной мероприятий (Solaris Day и NetBeans отечественники. «Рубрику» для раз- демонстрировались перечни привычDay) и анкеты. Никакого столпотворе- работчиков открыл обзор Sun Studio 11, ных для Linux-пользователей приложения и суеты не было. Оживление воз- сообщение о котором разбили на две ний, доступных и для Solaris.) В общем, никло к началу конференции, когда части. В первой рассказывалось о том, такой красноречивый тезис из доклачто из себя представляет данный про- да Карлсона, как «Solaris is better Linux всех пригласили пройти в зал. дукт, из чего состоит и на что спосо- than Linux», очень точно отображает бен, а во второй – о способах оптими- суть всего того, что он пытался донесКакие доклады Из иностранных докладчиков Sun зации, используемых в Sun Studio для ти до публики. А вот уже следующее сообщение, на конференцию прибыли два «техно- повышения производительности сопосвященное контейнерам Solaris, пологических евангелиста»: Фрэнк Кар- здаваемого ПО. Последовавший кофе-брейк (стоит казало, что в этой операционной систерэн и Питер Карлсон. Первому и выпала честь открывать Solaris Day в Моск- отметить, что как перерывы на кофе, ме пока не все идеально, как того хове. Каррэна рассказал о том, что и как так и обед оставили исключительно телось бы Карлсону (разумеется, повпоменялось в процессе разработки ОС положительные впечатления об орга- семестно, а не только в процессе пекомпании после открытия исходно- низации конференции) перешел в до- реноса приложений с Linux). Некотого кода, запуска проекта OpenSolaris, клад о разработке многопоточных при- рые вопросы, адресованные Андрею а также попутно в лаконичной форме ложений в среде ОС Solaris, существу- Дорофееву по поводу использования сообщил общие сведения о новшест- ющих для этого API и утилит. По «уров- зон в Solaris, показали, что данной вах Solaris 10. ню технической информации» (оценку технологии еще не хватает некоторых Фрэнк акцентировал всеобщее вни- под таким заголовком предлагали ста- ожидаемых заказчиками возможносмание на том, что OpenSolaris не явля- вить каждому докладу в раздававших- тей. Хотя, конечно, нужно учитывать, ется дистрибутивом – это лишь кодовая ся анкетах) это было, пожалуй, самое что зоны в Solaris появились не так давно и ведется активная работа над база, на основе которой любой желаю- серьезное выступление. Однако наибольший резонанс вы- их совершенствованием. щий может создать свою систему. СреЗавершать Solaris Day доверили ди существующих на сегодняшний день звал доклад Андрея Дорофеева о ноподобных решений он выделил Nexenta вой системе управления сервисами Карлсону с самым продолжительным OS, SchilliX и Belenix. Пример использо- в Solaris (Service Management Facility, докладом из всех, что были представвания OpenSolaris для построения пол- SMF), во время которого появилась не- лены на конференции. Питеру предстоноценной ОС уже с ближайшим рели- бывалая оживленность. Инновацион- яло подробно рассказать о DTrace. Еще зом, естественно, покажет и сама Sun: ный подход Sun к работе с сервисами в своем вступлении его коллега подгоSolaris 11 (и дальнейшие версии флаг- вызвал существенный интерес у слу- товил аудиторию, отметив, что DTrace манской ОС) будет основываться на об- шателей. На вопрос: «Как наглядно по праву считается одной из самых

4


репортаж выдающихся инновационных техноло- рерывов. Попутно я сослался на то, его главных достоинствах и новшестгий последнего времени, поэтому ни- что даже Мартин Финк, один из глав- вах, – у Sun прибавилась острая необчего удивительного в таком распоряд- ных Linux-специалистов HP, не так дав- ходимость в продвижeнии OpenSolaris. ке докладов нет. Карлсон начал с об- но на одной из конференций заметил, Этот решительный шаг, что предпринязора данного инструмента и простых, что лицензий на открытое ПО стало ла компания в недавнее время, и тено наглядных демонстраций того, как слишком много. Через некоторое вре- перь в Sun не без оснований делают он работает на своем ноутбуке, а за- мя в дискуссию ввязался и стоявший ставку на дальнейшее развитие идеи тем перешел к языку D. Затянувше- рядом Питер Карлсон, который про- использования модели Open Source. еся описание многочисленных конс- явил себя убедительным адвокатом Чем больше им удастся заинтеретрукций средства создания программ CDDL. В общих чертах их идеология совать в этом сообщество, тем луч(предназначенных в первую очередь (защиты новой лицензии) сводится к шую они получат отдачу, необходидля мониторинга и отслеживания ис- тому, что разработчик должен иметь мую для продуктов, лежащих в осноточников возникающих в системе про- возможность самостоятельно решать, ве их бизнеса, – это обычное правило, блем) на базе DTrace, возможно, бы- под какой лицензией ему опубликовы- работающее для всех компаний, прило не самым удачным завершением вать продукт, но при этом есть потреб- меняющих данную стратегию в отноконференции. Слушателей уже оста- ность в том, чтобы все модификации шении ПО с открытым кодом. Бытует мнение, что OpenSolaris – валось не так много, да и сам Питер, были доступны другим. В этом отноощущая «настроение масс», постарал- шении Sun приглянулась MPL, однако последняя отчаянная попытка Sun сося по возможности быстро завершить и здесь потребовались некоторые поп- хранить свои позиции на рынке серверсвое сообщение. равки для того, чтобы сделать лицен- ных операционных систем, где GNU/ зию более универсальной (убрать при- Linux-системы теснят UNIX-конкуренвязку к Mozilla и к США). тов. Если модель Open Source так поПочему CDDL? могла Linux, то почему она не возымеет Упоминание CDDL в первом доклаподобного эффекта для UNIX? Мнения де Каррэна вкупе со словами, что это Вместо заключения «истинное ПО с открытым кодом», по- Участники конференции, не поле- на этот счет среди членов сообщестбудило меня к достаточно распростра- нившиеся заполнить анкеты, получи- ва, журналистов и аналитиков расхоненному в сообществе вопросу. Зачем ли в подарок футболку с символикой дятся – причем обычно не в пользу Sun. Sun было придумывать очередную ли- OpenSolaris и лицензионную коробку А вот в компании думают иначе. Кто цензию Open Source, когда их и так су- Solaris с двумя DVD: редакциями этой был прав, как обычно, покажет время. Учитывая, что на OpenSolaris будет осществует изрядное множество? С та- ОС для x86 и для SPARC. Вполне естественно, что к обыч- нован уже следующий релиз Solaris, – ким вопросом, предварительно осведомив ответчика о том, что собираюсь ным задачам, возлагаемым на подоб- это будущее вполне обозримо. говорить на «религиозные» темы, я по- ные мероприятия: рассказать о самом Дмитрий Шурупов дошел к Фрэнку во время одного из пе- продукте (применительно к Solaris),

Пятая международная конференция

Современные технологии эффективной разработки веб-приложений с использованием PHP  Когда: 25-26 мая  Где: г. Москва, Центральный Дом Предпринимателя, ул. Покровка, д. 47/24, стр. 1 (м. Красные Ворота)

 Организаторы: Клуб разработчиков PHP и Интернет-агентство WebProfy

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

№5, май 2006

тию в работе организаций больше людей – и все с гораздо большим успехом, чем если бы каждая организация занималась этим самостоятельно. Вы сможете познакомиться как с историями успеха крупных интернет-проектов, так и с неудачными примерами. Участники конференции – профессиональные и повышающие свою квалификацию вебразработчики, руководители IT-отделов, крупных интернетпроектов, директора по развитию, а также потенциальные инвесторы и пресса. Программа конференции предусматривает: тематические выступления, мастер-класс по экстремальному программированию на РНР, олимпиада по РНР-програмированию. Впервые в 2006 году материалы конференции будут напечатаны в оффлайновой версии журнала «PhpInside». Мы приглашаем принять учатие в данном мероприятии всех активных разработчиков веб-приложений и тех, кому это интересно! Поторопитесь, количество мест ограниченно! По всем вопросам, связанным с регистрацией в качестве участников конференции обращайтесь к Максиму Смирнову по телефону: +7 (495) 585-9261, или пишите по адресу: phpconf2006@rambler.ru.

5


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

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

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

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

6

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

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


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

вышедшего из строя блока питания сервера без его выключения. (Думаю, вы сталкивались с такими компьютерами или хотя бы слышали о них.) Создание резервной копии файлов пользователя происходит в интерактивном режиме по мере их изменения. Схема работы проста:  При первоначальном запуске, система сканирует указанные ей директории и переносит их в архив. После чего следит за происходящим в файловой системе.  По мере обнаружения изменившихся файлов она переносит их в архив. Другими словами, в резервной копии всегда находятся самые последние версии файлов. В случае потери данных на исходной системе вы можете безболезненно и быстро восстановить их в полном объёме. Заманчиво, не правда ли? Система Box Backup может работать в довольно внушительном списке OS:  OpenBSD;  Linux;  NetBSD;  FreeBSD;  Darwin / Mac OS X 10.5;  Cygwin (Windows) (только клиент);  Native Windows (только клиент);  Solaris.

Online-бэкапирование Box Backup

Несколько вполне закономерных вопросов, которые возникают при первом ознакомлении с этой системой горячего резервного копирования:  Если пользователь удалил файлы, что будет с резервной копией?  Постоянное копирование файлов подразумевает огромный сетевой трафик и большую загрузку сервера бэкапов. Как решить эту проюлему?  Чем обеспечивается безопасность копий?  Если файлов очень много, то сколько ресурсов для своей работы потребуется программе для проверки изменений?

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

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

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

№5, май 2006

Процедура удаления

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

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

Безопасность резервного копирования Обеспечению безопасности уделено немало внимания.  Авторизация клиента на сервере бэкапов.  Безопасность передачи данных.  Шифрование данных.  Защита структуры данных.  Безопасность хранения данных. Для авторизации клиента на серверной стороне системы Box Backup используется SSL. На каждом компьютере, данные которого нуждаются в резервировании, создаётся SSLсертификат, подписываемый на сервере. Для обеспечения безопасной среды передачи данных используется TLSшифрование. Любые операции между клиентом и сервером происходят по шифрованому каналу. Это позволяет использовать систему резервного копирования даже в небезопасной среде без опасений, что данные могут быть перехвачены.

7


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

Установка серверной части Box Backup Я буду рассматривать установку Box Backup на примере системы Gentoo Linux. Установка в других системах будет отличаться только несколькими деталями. Итак, сначала установим серверную часть системы. Ebuild Box Backup есть в стандартном дереве портов, так что мы воспользуемся стандартной процедурой установки пакетов в системе Gentoo Linux. #emerge -av boxbackup

 /etc/boxbackup – директория, где будут созданы конфигурационные файлы. (Если вы устанавливаете систему не в Gentoo Linux, то по умолчанию используйте директорию /etc/box);  2048 – размер блока файлов;  /raid/0.0 и остальные – директории, где будут храниться непосредственно бэкапы. Эти директории должны быть созданы вами. Автоматически они созданы не будут. После того как файл конфигурации готов, создадим пользователя, от которого будет работать Box Backup. #useradd _bbstored

И создадим основной конфигурационный файл системы: #bbstored-config /etc/boxbackup hostname _bbstored

Где:  /etc/boxbackup – директория конфигурационных файлов;  hostname – имя компьютера;  _bbstored – имя пользователя, от которого работает система.

Если вы собирали пакет самостоятельно в другой сисОбратите внимание, что по умолчанию вам будет предложено установить более старую версию системы – 0.09. теме – для конфигурационных файлов используйте диЯ бы рекомендовал проследовать по дереву портов до нуж- ректорию /etc/box. Выполнение этой команды создаст осной ветки и установить более новую версию, так как в неё новной конфигурационный файл системы Box Backup внесли множество исправлений. /etc/boxbackup/bbstored.conf, в котором прописываются основные параметры. Присвоим нашему пользователю #cd /usr/portage/app-backup/boxbackup _bbstored права на директорию: #emerge -av boxbackup-0.10.ebuild

#chown -R _bbstored /etc/boxbackup/bbstored Разумеется, можно внести исправления в ваш /etc/ #chmod -R go-rwx /etc/boxbackup/bbstored portage/package.keywords, но я не вижу смысла делать это ради одного пакета (система не потребует других пакетов На этом конфигурирование серверной части системы для своей работы). Box Backup закончено. Остаётся лишь создать сертифиПосле того как сборка пакета закончится, можно при- кат SSL нашей системы и добавить учётные записи польступить непосредственно к конфигурированию. Здесь ва- зователей. Сделаем это после установки клиентской часжен один момент. ти на машину, с которой будет производиться резервное Если в вашей системе для резервного копирования нет копирование. raid-контролера, а просто используются несколько дисков, Box Backup предлагает создать несколько директо- Установка клиентской части системы рий, которые обеспечат избыточность в случае ошибок Box Backup в Linux на дисках. Так как мы говорим о Gentoo Linux и в предыдущем вывоЕсли raid установлен, то от применения этой структуры де команды: можно смело отказываться. #emerge -av boxbackup-0.10.ebuild Для использования «raid» от Box Backup выполним следующую команду: наверняка заметили флаг -client-only, то им и воспользуем#raidfile-config /etc/boxbackup 2048 /raid/0.0 /raid/0.1 ↵ ся. Выполним на системе, нуждающейся в резервировании, /raid/0.2 следующую команду: Или откажемся от его использования командой друго#cd /usr/portage/app-backup/boxbackup го вида: #USE='client-only' emerge boxbackup-0.10.ebuild

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

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

8

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


администрирование Здесь возможны два варианта:

 lazy – в этом режиме демон резервного копирования bbackupd постоянно следит за изменениями файлов, и как только изменённый файл закрывается, – переносит его в резервную копию.  snapshot – работа этого режима понятна по его названию. Один раз в установленный вами промежуток времени запускается команда bbackupctl sync, получив которую демон bbackupd начинает сканировать все указанные в конфигурационном файле директории. В случае обнаружения несовпадений даты последнего изменения файл переносится на сервер резервных копий. Какой режим предпочесть зависит напрямую от количества файлов, нуждающихся в резервировании, загруженности компьютера и сетевого трафика. Думаю, зависимости вполне очевидны. Скажу только, что если вы устанавливаете систему Box Backup на ноутбук, который часто работает вне локальной сети, где находится сервер бэкапов, то, наверное, стоит предпочесть режим snapshot. Разумеется, никто не мешает вам установить сервер Box Backup так, чтобы он был доступен извне. Но в таком случае следует учитывать количество трафика, которое будет создаваться компьютерами при резервном копировании. Запустим команду, которой создадим основной конфигурационный файл, ключ системы и SSL-сертификат для авторизации на удалённом сервере. #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 } }

Где:

 home-directory и etc – в данном случае это условные описания директорий для системы Box Backup. Именно под этими названиями они будут отображаться при запросе в резервную копию.  Path – собственно путь до директорий и файлов, нуждающихся в резервном копировании. При указании путей следует учитывать, что резервное копирование будет производиться рекурсивно, то есть со всеми подпапками.  ExcludeDir – это, как несложно догадаться, опция исключения из резервирования некоторой подпапки.  ExcludeFilesRegex – маска, указывающая расширения файлов, которые следует игнорировать и не переносить в резервную копию. Остальные опции не менее понятны и в отдельном описании не нуждаются. Режимы lazy и snapshot в конфигурационных файлах отличаются только параметрами: AutomaticBackup = no UpdateStoreInterval = 0 MinimumFileAge = 0 MaxUploadWait = 0

Где:  /etc/boxbackup – место хранения конфигурационных (в случае режима snapshot). Для изменения режима работы файлов; достаточно поменять значения этих переменных на другие  lazy – способ резервирования;  99 – имя учётной записи на сервере бэкапов (обычно параметры, которые всегда можно посмотреть на соседней я использую просто последние цифры IP-адреса ком- системе. Не стоит заново запускать команду конфигуриропьютера); вания, так как она подменит ваш ключ шифрования и SSL hostname – сетевое имя сервера бэкапов (не укажите сертификаты. В таком случае процедуру подписи придётся в данном параметре случайно имя вашего компьюте- повторять. (Конечно, можно предварительно скопировать ключ и SSL-сертификат, но... не проще ли изменить значера!);  /var/bbackupd – место, где будут храниться временные ние нескольких переменных?) Теперь, когда мы настроили клиентскую и серверную файлы системы Box Backup (убедитесь, что там достачасть системы Box Backup, самое время разобраться с серточно свободного места);  /home – путь для резервного копирования (папки легко тификатами SSL для авторизации. настраиваются в конфигурационном файле, и мы скоро об этом поговорим). SSL-сертификаты для серверной части Для создания базовой структуры сертификатов запустим Теперь нам осталось только указать папки, резерв- команду: ные копии которых мы хотим делать, и правила для них. #bbstored-certs ca init Основной конфигурационный файл Box Backup клиента находится в директории /etc/boxbackup и называется bbackupd.conf. Если вы получили какие-либо ошибки при выполнении Параметры, устанавливаемые в этом файле, содер- этой команды, убедитесь в первую очередь, что у вас устажат необходимые и весьма прозрачные пояснения, поэто- новлен пакет OpenSSL. После формирования сертификата, подпишем его: му я остановлюсь только на описании путей для резервного копирования. #bbstored-certs ca sign-server hostname-csr.pem Структура описания такова:

№5, май 2006

9


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

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

Ответив на запрос «Yes», мы подпишем сертификат и увидим инструкцию о том, что нам необходимо скопировать на клиента два файла:  /ca/clients/account_name-cert.pem  /ca/roots/serverCA.pem На клиентской стороне эти файлы положим в /etc/ boxbackup/bbackupd. Теперь осталось создать учётную запись для нашего клиента на резервирование.

Создание учётной записи в системе резервного копирования Для создания учётной записи воспользуемся командой: #bbstoreaccounts create account_name 0 10000M 15000M

Где:  account_name – имя учётной записи в числовом виде (например, как я уже говорил, последняя цифра в IP-адресе клиента).  10000M – мягкий лимит на размер бэкапа. В данном случае я выделил 10 Гб на пользователя (можно также указать 10G).  15000М – жёсткий лимит на размер бэкапа. После этого можно смело запускать сервисы клиента и сервера системы Box Backup. Система резервного копирования готово!

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

покажет детальную информацию о существующем положении дел в указанной учётной записи. Выглядеть это будет так: Account ID: 00000003 Last object ID: 390831 Blocks used: 59659618 (116522.69Mb)

10

Blocks used by old files: Blocks used by deleted files: Blocks used by directories: Block soft limit: Block hard limit: Client store marker:

110818 (216.44Mb) 1670369 (3262.44Mb) 73637 (143.82Mb) 61440000 (120000.00Mb) 64000000 (125000.00Mb) 1145862657000000

Как вы видите, всё довольно прозрачно и понятно. Команда: #bbstoreaccounts setlimit account_name 30000M 35000M

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

и, в случае возникновения ошибок, исправляем с помощью: #bbstoreaccount check account_name fix

Ну и напоследок, команда: #bbstoreaccounts delete account_name

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

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

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


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

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

Резервное копирование Windows-систем Пока что я обходил вниманием использование системы резервного копирования Windows-рабочих станций (и серверов, конечно). Объясню почему. На сайте [2] вы можете найти Windows native client, работающий, как минимум, в системах семейства Windows 2000 и Windows XP. В архиве вы найдёте все необходимые Рисунок 2. Список директорий (по меткам из конфигурационного файла) файлы, которые рекомендуется скопировать в директорию c:\Program Files\Box Backup\. Останется только сформировать сертификат клиента, подписать его на сервере и передать подписанный и серверный сертификаты обратно. Тут могут возникнуть некоторые сложности. Дело в том, что скрипты отвечающие за формирование сертификатов, написаны на языке Perl, и нет никаких гарантий, что он окажется в вашей Windows-системе. Можно путём долгих мучений добиться желаемого результата, но есть способ гораздо более быстрый и удобный. На любой вашей Linux-системе, предварительно сохранив директорию /etc/boxbackup/bbackupd в надёжном месте, сформировать сертификаты для Windows-системы. А почему нет? Ведь не важно, где будет создан ключ шифрования и сертификат. После этого останется только подписать вновь созданный сертификат и передать необходимые файлы на Windows-систему. И не забудьте вернуть содержимое папки bbackupd на его законное место. Таким образом осуществление «горячего» резервного Рисунок 3. Аскетичная Boxi копирования на Windows рабочих станциях так же станоFileEncKeys.raw. Поэтому настоятельно рекомендуется сковится весьма простой задачей. В MS Windows вам точно так же доступны все опции кон- пировать содержимое всех папок /etc/boxbackup/bbackupd фигурационных файлов Box Backup и оба режима – lazy, в какое-то выделенное, защищённое от несанкционированsnapshot. Для того чтобы проинсталировать bbackupd в ка- ного доступа место, а также перенести на внешний носичестве системного сервиса достаточно запустить команду: тель и убрать подальше. В случае утраты ключа восстановление файлов из арbbackupd -i хива станет невозможным. Также следует обратить внимание на синхронизацию Графическая оболочка Boxi также существует под времени на клиентских и серверной машинах, так как Box Windows, но по описанным выше причинам она вам вряд ли Backup использует в работе дату последнего изменения пока пригодится, только если вы не собираетесь вернуться файлов. Удачного вам горячего резервного копирования! к версии 0.09 Box Backup.

Это важно

Ссылки:

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

1. http://boxi.sourceforge.net 2. http://boxbackup.hostworks.ca/index.php/0.10

№5, май 2006

11


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

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

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

С

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

12

будут помнить червя Морриса, потряс- эффективной, появилось более чётшего мир в 1988 году) серьёзно подор- кое разделение на задачи, причём уже вали доверие к Sendmail в плане защи- не все из них требуют наличия прав сущённости системы. перпользователя. Говоря же о безопасОднако идёт время, меняется ситу- ности, надо признать, что последняя ация. Кое-что из сказанного выше не- критическая уязвимость была обнарусколько улучшилось, что-то вообще жена сравнительно недавно – 22 марта стало неправдой. Скажем, конфигу- 2006 года (к чести разработчиков, бырационный файл по-прежнему остал- ла она исправлена достаточно быстро). ся пугающе непонятным. Но ведь ник- Но вот предпоследняя датируется аж то вас и не заставляет его править! 18 сентября 2003 года. Конечно, если сравнивать Sendmail Для этого существуют более удобные и простые инструменты. Монолитность с такими альтернативами, как Postfix, сохранилась, но работа этого единс- Exim, Qmail, то по некоторым паратвенного «бинарника» стала более метрам он проигрывает своим конку-


администрирование рентам. Но только не в плане функциональности. Так что вряд ли стоит так просто сбрасывать его со счетов. Тем бо- Как всё начиналось лее что Sendmail по-прежнему остаётся почтовой програм- В конце семидесятых Эрик Олман (Eric Allman), работая в Универмой, устанавливаемой по умолчанию во FreeBSD, OpenBSD, ситете Беркли, бился над одной проблемой – как обмениваться электронной почтой в университетской сети, объединяющей неSolaris и ряде других систем. Впрочем, я не ставлю своей целью поднять очередную сколько машин, взаимодействующих между собой по разным проволну религиозных войн среди приверженцев того или токолам. Существовали, конечно, отдельные программы, обеспеиного MTA. Каждый вправе пользоваться тем инструмен- чивающие взаимодействие каждой пары машин, но Эрику хотетом, какой ему ближе по духу и лучше подходит для тех лось создать именно универсальную программу. И вот в 1983 году появилась первая версия программы или иных задач. Надеюсь, что аргумент «я не понимаю эту программу» не является для вас основным критерием вы- Sendmail, основанной на менее универсальной delivermail (разбора, что ставить и использовать. И после прочтения дан- работанной для сети ARPANET). Первоначально созданная ной серии вы сможете более осознанно подходить к вы- для BSD 4.1c, она постоянно развивалась, переносилась на друбору почтовой программы, руководствуясь исключитель- гие системы. Многие компании брали Sendmail за основу для построения собственных почтовых программ. но объективными данными. В настоящее время наиболее известной и распространёнВсё, о чём будет идти речь сегодня, относится к версии Sendmail 8.13.4 с последним патчем, работающей ной версией Sendmail является открытая программа, разрабатыво FreeBSD 6.0 (используется дистрибутивная установка). ваемая Sendmail Consortium при спонсорской помощи компании Применимость утверждений, примеров конфигурации, пу- Sendmail Inc. Последняя выпущенная версия – 8.13.6. тей к файлам и т. д. к другим системам и версиям не проЧем же они занимаются? Два верхних (с PID 596 и 600 верялась, но в большинстве случаев всё должно работать соответственно) запускаются при старте системы и постоаналогично. Учитывая, что на системах Linux в последнее время бо- янно присутствуют в памяти. Первый, как следует из опилее распространён Postfix (за исключением некоторых дис- сания, обслуживает входящие соединения, поступающие трибутивов), отвлекаться на особенности Sendmail в этих на порты, выделенные для SMTP-соединений: системах я не буду.

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

serg$ sockstat | grep 596

root root root root root

sendmail sendmail sendmail sendmail sendmail

596 596 596 596 596

3 4 5 6 7

tcp4 dgram tcp4 tcp4 tcp4

1.2.3.4:25 *:* -> /var/run/logpriv 127.0.0.1:25 *:* 10.0.0.254:25 *:* *:587 *:*

Как видите, помимо стандартного 25-го порта на обслуживаемых интерфейсах (рассматриваемая система имеет две сетевые карты – внешнюю, с условным IP-адресом 1.2.3.4, и внутреннюю – 10.0.0.254, а также непременный serg$ ls -l /usr/sbin | grep mailwrapper loopback-интерфейс 127.0.0.1) процесс 596 прослушивает lrwxr-xr-x 1 root wheel 21 11 ноя 10:01 hoststat -> /usr/sbin/mailwrapper порт 587. Этот порт (в /etc/services определён как «submission -r-xr-xr-x 1 root wheel 5236 11 ноя 10:01 mailwrapper 587/tcp») предназначен согласно RFC 2476 для приёма ноlrwxr-xr-x 1 root wheel 21 11 ноя 10:01 purgestat -> /usr/sbin/mailwrapper lrwxr-xr-x 1 root wheel 21 11 ноя 10:01 sendmail -> /usr/sbin/mailwrapper вых писем от клиентов, чтобы не перегружать данной работой основной, 25-й порт, служащий для пересылки сообserg$ ls -l /usr/bin | grep mailwrapper щений между серверами. (То есть более правильно в наlrwxr-xr-x 1 root wheel 21 11 ноя 10:01 mailq -> /usr/sbin/mailwrapper lrwxr-xr-x 1 root wheel 21 11 ноя 10:01 newaliases -> /usr/sbin/mailwrapper стройках почтовых клиентов – The Bat, Thunderbird, Outlook и проч. – указывать для исходящих соединений 587-й порт.) Если говорить точнее, то собственно работа выполня- В настоящее время протокол Submission используется не ется файлом /usr/libexec/sendmail/sendmail, а mailwrapper, слишком широко, и клиенты для отправки электронной почкак следует из его названия, является «обёрткой» к этому ты задействуют тот же 25-й порт, но ничего плохого в том, файлу. Система, как правило, пользуется ссылкой sendmail, что данный порт открыт, в принципе нет. Тем более что даностальные же запускаются администратором для решения ная рекомендация (я про RFC 2476) рано или поздно должна стать популярной. UNIX-сокет на /var/run/logpriv (с дескрипконкретных задач. Посмотрим, какие задачи возлагаются на программу тором 4) используется для записи журнальной информации Sendmail. Если посмотреть на вывод команды ps, то мож- с помощью syslog (обратите внимание, что поскольку этот но увидеть, что в системе активны сразу несколько про- процесс sendmail работает с правами суперпользователя, то используется привилегированный сокет). цессов sendmail: Думаю, задача этого процесса понятна – получив запрос serg$ ps awxo pid,user,command | grep sendmail | grep -v grep на соединение, он порождает дочерний процесс (в нашем выводе команды ps вы можете наблюдать два экземпляра 596 root sendmail: accepting connections (sendmail) 600 smmsp sendmail: Queue runner@00:30:00 for /var/spool/clientmqueue (sendmail) оных – с PID 83329 и 83670), который и занимается обслу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) живанием данного соединения согласно протоколу SMTP.

№5, май 2006

13


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

Кто кому родитель Рисунок 1. Приём сообщения

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

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

Второй процесс, PID которого равен 600, отвечает за обслуживание очереди. Если говорить точнее, то сам он очередь не обслуживает, а лишь запускает с заданным интервалом (в данном случае он составляет 30 минут, как видно из листинга) другой процесс, который и выполняет всю грязную работу. Ах да, я же ещё не рассказал, что такое очередь! Ничего, скоро этот пробел будет восполнен… Оставим на время наши процессы и разберёмся с базовыми принципами функционирования почтовой системы. В общем случае почтовый сервер может выполнять три рода операций: принимать сообщения для локальных клиентов, отправлять сообщения от ло-

14

Передача сообщения от локального пользователя на удалённый сервер выполняется в следующем порядке (см. рис. 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): 1. Удалённый сервер, желая передать нам сообщение, отправляет запрос на соединение на 25-й порт нашего сервера. 2. Процесс sendmail, обслуживающий соединения (тот, который в примере выше имеет PID 596), порождает дочерний процесс (назовём его sm1). 3. Дочерний процесс sm1 проверяет возможность принять данное сообщение (анализируя конверт, прежде всего «rcpt to:») и в случае положительного ответа помещает сообщение в очередь, в файлы qf (заголовки) и df (тело сообщения). Причём qf обычно создаётся в памяти и записывается на диск только в случае невозможности переВ случае транзитной передачи снаслать письмо сразу. То есть очередь – это каталог, куда временно чала выполняются пункты 1-4 алгоритсохраняются почтовые сообщения, ма приёма сообщения, затем выполняпроходящие через сервер элект- ется доставка согласно пунктам 4-5 алронной почты (по умолчанию ис- горитма передачи локального сообщепользуется /var/spool/mqueue). ния (см. рис. 3). 4. Если запись пройдёт успешно, Обратите внимание, что здесь всё Sendmail подтверждает факт при- завязано на выполнении основополаёма сообщения (принимая тем са- гающего требования – надёжности пемым на себя всю ответственность редачи. Ни при каких обстоятельствах за его дальнейшую судьбу) и завер- письмо не должно потеряться (разве шает соединение с удалённым сер- что в случае прямого попадания в сервером. вер из «базуки»). Промежуточная за5. Далее sm1 анализирует заголовок пись на диск, даже когда это, казалось сообщения и принимает решение бы, излишне, является обязательной, о том, что нужно с ним делать. Если поскольку только это гарантирует цеоно предназначено для локально- лостность данных в случае сбоя на серго пользователя, то вызывается ло- вере. Впрочем, «если нельзя, но очень кальный агент доставки, LDA (Local хочется – то можно», и здесь есть приDelivery Agent), которому даётся по- ёмы, позволяющие обойтись без «лишручение положить письмо в почто- ней» записи на диск (это мы обсудим в одной из последующих частей ставый ящик пользователя. 6. Когда LDA успешно выполняет до- тьи, где будем говорить об оптимизаставку, он рапортует об этом про- ции и нестандартной настройке). Если доставить сообщение по нацессу sm1, который удаляет сообщение из очереди и завершает значению с налёта не удалось (из-за свою работу. проблем с каналом, блокировки почто-


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

Возвращаясь к процессам

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

Ссылка-аналог

Назначение

sendmail -bi

newaliases

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

sendmail -bp

mailq

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

sendmail -bh

hoststat

Статистическая информация

sendmail -bH

purgestat

Очистка статистики

Как видите, Sendmail может выступать в трёх ипостасях – MTA, MSA и MDA. В таких инструментах, как Postfix и Qmail, ные для решения конкретных задач. В таблице 1 привоприменяется понятная структура «одна задача – одна про- дится соответствие «специализированной» команды клюграмма». Здесь же всё делает один исполнимый файл. чам программы sendmail. Если вы посмотрите на сценарии инициализации, исТак что не мудрено, что он обладает огромным количеством самых разных параметров. Перечислю здесь наибо- пользуемые системой, то увидите, что FreeBSD использулее востребованные (за подробностями обратитесь к стра- ет преимущественно ссылку sendmail с необходимыми для решения той или иной задачи ключами. нице man sendmail(8)):  -b: этот ключ указывает на то, что необходимо выполнить какое-то действие, и всегда дополняется уточня- Основы настройки Как же всё это настраивается? Начиная с 4-й (если не ошиющим ключом; баюсь) ветви, в системе FreeBSD основные настройки со -bd: работать в режиме демона;  -bm: работать в режиме отправки сообщения – анало- средоточены в каталоге /etc/mail (ранее, по крайней мере в 3.5-RELEASE, они размещались непосредственно в /etc). гично команде mail;  -bs: выводить команды SMTP на стандартный вывод Здесь вы найдёте следующие основные файлы:  your.domain.mc: основной конфигурационный файл (фактически, то же самое, что и «telnet localhost 25»); (так называемый master config, или просто mc-файл).  -bt: работать в режиме тестирования (позволяет выполЕго имя будет соответствовать доменному имени вашенить ряд команд, например, обработать адрес или опго сервера. Именно в него вносятся необходимые измеределить MX-запись для хоста); нения, и на его основе автоматически будет собирать -bv: проверить адрес получателя (фактически, «разся рабочий файл sendmail.cf. ворачивает» псевдонимы, показывая реального пользователя или скрипт, которые получат письмо). Сле-  your.domain.submit.mc: конфигурационный файл для работы в режиме доставки сообщений, когда Sendmail дующий пример показывает, что на моей системе адне обслуживает внешние соединения, а только отправресу postmaster соответствует скрипт maildigest.py, исляет почту от локальных пользователей (в этом слупользуемый для обработки сообщений антивирусночае Sendmail запускается с правами обычного польго пакета и сбора статистики по вирусной активности зователя и использует для работы очередь /var/spool/ на узле: clientmqueue). root# sendmail -bv postmaster  sendmail.cf, submit.cf: рабочие файлы конфигурации, которые и использует Sendmail. Настоятельно не реко"| /usr/local/scripts/maildigest/maildigest.py"... deliverable: mailer prog, user "| /usr/local/scripts/maildigest/maildigest.py" мендуется вносить в них исправления вручную, хотя никто и не запрещает это делать. Просто нужно иметь в виду, что в данном случае все сделанные вами изменения Другие полезные ключи: будут потеряны при первом же выполнении make install,  -C: с помощью этого ключа вы можете указать альтерпоскольку утилита make при сборке cf-файлов руководснативный файл конфигурации (отличный от /etc/mail/ твуется исключительно данными, содержащимися в mcsendmail.cf). файлах. Безусловно, учитываются и m4-шаблоны, разме -q: этот ключ задаёт период обработки очереди. Наприщённые в /usr/share/sendmail/cf/, но их тоже лучше не измер, указанный как -q30m, он установит обработку очеменять. реди сообщений каждые 30 минут.  -t: даёт указание извлечь адрес получателя из соответс-  aliases: здесь хранятся псевдонимы пользователей. Говоря упрощённо, псевдоним позволяет вам наиболее твующих полей заголовка самого почтового сообщения. простым способом перенаправлять почту, приходящую Может быть полезен при ручной отправке почты. на тот или иной почтовый ящик, на конкретного пользо -d: эти ключи задают уровень отладки. вателя. Этот же механизм используется для создания списков рассылки или перенаправления почты на вход Вот, кстати, приём, позволяющий получить информакакой-либо программы. цию о версии вашего Sendmail:  access: этот файл позволяет управлять доступом к почserg$ echo '' | /usr/sbin/sendmail -bt -d0 | grep Version товому серверу извне. Например, вы можете запретить доступ из конкретной подсети или разрешить пересылку Version 8.13.4 (relaying) почты для некоторых нелокальных адресов. Для сокращения числа ключей можно использовать  local-host-names: список хостов (их доменных имён), для которых сервер Sendmail будет принимать почту. другие ссылки на mailwrapper, специально предназначен-

№5, май 2006

15


администрирование Несколько слов про SMTP Simple Mail Transfer Protocol (SMTP) – простой протокол передачи электронной почты – является основным протоколом, на котором основана работа электронной почты в сети Интернет. Описан он в RFC 821, который дополнен рядом других рекомендаций. Наиболее серьёзным дополнением (скорее даже заменяющим документом) является RFC 2821, описывающий расширенный протокол SMTP и более соответствующий современным реалиям. SMTP является, скажем так, «терминальным» протоколом, то есть взаимодействие двух систем осуществляется путём обмена текстовыми строками. Клиент (хост, инициировавший соединение) передаёт на сервер (хост, принимающий соединение) команды, состоящие из четырёх букв и следующих далее параметров. Сервер отвечает трёхзначным числовым кодом с последующей строкой-пояснением. Типичный пример SMTP-диалога может выглядеть таким образом: serg$ telnet localhost 25 Connected to localhost. Escape character is '^]'. 220 server.ru ESMTP Sendmail 8.13.4/8.13.4; .. .. HELO me.domain.ru 250 server.ru Hello localhost [127.0.0.1], pleased to meet you MAIL From: me@me.domain.ru 250 2.1.0 me@me.domain.ru... Sender ok RCPT To: serg@server.ru 250 2.1.5 serg@server.ru... Recipient ok DATA 354 Enter mail, end with "." on a line by itself Hello! It’s a test message. . 250 2.0.0 k3BAK9Je017265 Message accepted for delivery QUIT 221 2.0.0 server.ru closing connection Connection closed by foreign host.

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

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

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

16

/usr/libexec/sendmail/sendmail

если mailwrapper будет вызван по ссылке mailq, то он запустит программу sendmail, которая размещается по указанному пути. Собственно говоря, любая команда будет запускать этот файл (архитектура-то монолитная), но теоретически здесь заложена возможность использовать для тех или иных задач внешние файлы или в дальнейшем безболезненно перейти на модульную структуру (это, в частности, используется в Postfix).  helpfile: здесь размещаются строки, которые Sendmail будет выводить во время SMTP-сеанса в ответ на команды HELP. Более подробно использование того или иного файла будет рассматриваться во второй части статьи. Обратите внимание, что около aliases, access и ряда других будут размещаться файлы с таким же именем, но суффиксом «.db». Это базы (обычно в формате hash, но также поддерживаются dbm и btree), которые и использует Sendmail в своей работе, чем достигается сокращение времени, расходуемого на разбор этих файлов. Следовательно, после внесения изменений в «хэшируемые» конфигурационные файлы вы должны пересоздавать соответствующие базы. Традиционно это выполняется командой makemap (для базы aliases – команда newaliases, являющаяся одной из ссылок на mailwrapper). Однако разработчики FreeBSD предоставили нам замечательный Makefile, который делает большую часть работы по обслуживанию почтовой системы, самостоятельно вызывая необходимые служебные утилиты. В данном случае достаточно перейти в каталог /etc/mail и выполнить команду make: root# cd /etc/mail root# make

При этом make самостоятельно определит, какие файлы были изменены, и пересоздаст соответствующие базы. Если были изменения в конфигурационном mc-файле, то эта же команда построит на его основе cf-файл (например, your.domain.cf; далее нужно будет ещё выполнить make install, чтобы этот файл был скопирован как sendmail.cf). При желании вы можете явно указать, что именно должно быть пересобрано: root# make aliases /usr/sbin/sendmail -bi -OAliasFile=/etc/mail/aliases /etc/mail/aliases: 167 aliases, longest 47 bytes, 2529 bytes total chmod 0640 /etc/mail/aliases.db

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

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


администрирование зывает этот сценарий с нужными параметрами. Обратите внимание, что в рассматриваемой версии FreeBSD запуск Что такое UUCP? sendmail при загрузке системы может выполняться дру- Unix to Unix Copy Program (UUCP) – некогда очень популярный гим сценарием – /etc/rc.d/sendmail. Это более соответству- протокол взаимодействия между удалёнными хостами. Переет принятому начиная с 5-й ветви порядку инициализации сылка электронной почты не была его единственной обязаннос(он был позаимствован из NetBSD), но подобное «двоев- тью, но эта услуга была наиболее востребована. Sendmail, будучи ластие» может в некоторых случаях привести к путанице разработанным как универсальный почтовый сервер, призванный и ошибкам (например, если вам нужно внести в эти файлы объединить разнородные сети, обладает поддержкой этого прокакие-то специфические изменения, то приходится особо токола (правда, реализация осуществляется сторонней программой – во FreeBSD это Taylor UUCP, установить её можно из колследить за их синхронизацией). Раз уж мы заговорили о сценариях инициализа- лекции портов: /usr/ports/net/freebsd-uucp). В настоящее время необходимости использовать этот протоции, рассмотрим параметры rc.conf, определяющие работу Sendmail. Основные настройки сосредоточены кол уже нет, но в редких случаях (например, в условиях коммутив файле /etc/defaults/rc.conf. По умолчанию переменная руемого доступа) он может оказаться полезен. sendmail_enable установлена в значение «NO», что подразумевает работу Sendmail только для отправки сообще- строки. Если вы хотите закомментировать какую-то дирекний локальных пользователей. MTA, обслуживающий вне- тиву, перенесите dnl в начало строки. шние соединения, запускаться не будет. Чтобы разрешить OSTYPE(freebsd6)dnl работу Sendmail в режиме MTA, следует установить значение этой переменной в «YES». Кстати, если вы хотите полТип операционной системы. Согласно данному параностью запретить работу Sendmail, используйте значение метру m4 будет выбирать необходимые для работы шаб«NONE», а не «NO». лоны (из /usr/share/sendmail/cf/ostype/), поэтому очень важОбратите внимание на одну важную переменную: но следить здесь за актуальностью информации (особенmta_start_script="/etc/rc.sendmail" но когда выполняется обновление системы на другую «ветку»). В первую очередь от этого параметра зависят приняИменно она определяет, какой из сценариев – /etc/ тые в той или иной системе полные имена агентов доставrc.sendmail или /etc/rc.d/sendmail – будет использоваться ки (LDA), используемые флаги и т. д. при загрузке системы. По соображениям «однозначности» DOMAIN(generic)dnl лучше оставить использование rc.sendmail, как это и предусмотрено по умолчанию. Ещё один параметр, влияющий на выбор шаблонов. Подробнее узнать об опциях, которые вы можете изменить, можно в самом файле /etc/defaults/rc.conf – он доста- Шаблоны можно найти в /usr/share/sendmail/cf/domain/, точно хорошо прокомментирован. Ну и при необходимос- в большинстве случаев следует использовать домен ти что-то переопределить внесите соответствующие стро- «generic». Впрочем, если вам нужны специфические параки в /etc/rc.conf (надеюсь, вы даже спросонья без запинки метры, которые по тем или иным причинам вам не хотелось скажете, почему не рекомендуется делать изменения не- бы выносить в конфигурационный файл, можно создать здесь свой «доменный» шаблон (посмотрите здесь же припосредственно в default-скриптах). меры для доменов Berkley.EDU) и использовать его.

Пример файла конфигурации

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

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

№5, май 2006

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

Подобным образом указывается, на каких адресах и портах следует прослушивать входящие соединения. Первая строка из приведённых (закомментированная) указывает ожидать входящие соединения на всех IPv4-интерфейсах. Если прослушивать нужно только конкретные интерфейсы, можно поступить так, как показано в последующих двух строках. FEATURE(use_cw_file)dnl define('confCW_FILE', '-o /etc/mail/local-host-names')dnl

Эти строки задают использование файла local-hostnames и указывают путь к нему. dnl FEATURE('accept_unqualified_senders')dnl dnl FEATURE('accept_unresolvable_domains')dnl

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

17


администрирование Системы-конкуренты По различным данным, среди наиболее популярных открытых серверов электронной почты наблюдается примерно такое соотношение: 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), имеющие свои достоинства и недостатки. В общем выбирать есть из чего.

позволяют несколько ослабить требования стандартов. Первая разрешает обслуживать не полностью квалифицированных отправителей (т.е. не имеющих полного имени формата user@domain). Вторая допускает работу с доменами, для которых не удалось определить их DNS-имя по IP-адресу. FEATURE(mailertable, 'hash -o /etc/mail/mailertable')dnl FEATURE(access_db, 'hash -o -T<TMPF> /etc/mail/access')dnl FEATURE(virtusertable, 'hash -o /etc/mail/virtusertable')dnl

Эти строки описывают пути к специальным файлам конфигурации. Обратите внимание, что имена баз указаны без суффикса «.db». FEATURE(blacklist_recipients)dnl dnl FEATURE('dnsbl', 'sbl.spamhaus.org')dnl FEATURE('dnsbl', 'relays.ordb.org')dnl FEATURE('dnsbl', 'dul.ru')dnl FEATURE('dnsbl', 'bl.spamcop.net')dnl

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

18

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

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

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

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

Ну а так указывается, какие агенты доставки будут использоваться. Здесь определены локальный агент доставки (LDA), и использование протокола SMTP для доставки на удалённые серверы (MDA). Закомментированная строка отвечала некогда за подключение агента, работающего по протоколу UUCP, ныне практически вымершему. Немного подробнее мы поговорим о конфигурации в следующий раз. После внесения всех изменений в mcфайл нужно выполнить следующие действия: root# root# root# root#

cd /etc/mail make make install make restart

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

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



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

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

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

M

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

20

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

Создаем веб-узел

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

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


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

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

Даже когда вы находитесь вне сети.

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

 Блокировка файлов определенных типов от публикации.

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

На странице представления также присутствует панель ссылок или панель инструментов, она содержит следующие команды:  Создать элемент – создает новую запись в списке;  Фильтр – позволяет задать фильтр по любому из представленных полей;  Изменить в таблице данных – показывает информацию в виде таблицы, по аналогии с листом Excel;  Связать с Outlook – открывает в приложении Outlook папку контактов, связанную с данным списком. Эта команда доступна только в списках, созданных с использованием шаблона «Контакты» или «События»;  Импортировать контакты – позволяет импортировать контакты, используя адресную книгу. Команда доступна только в списках на основе шаблона «Контакты».

Заполнив все поля, нажимаем здать список на основе шаблона «Контакты». Для создания списка на глав- кнопку «Создать». Попадаем на страной странице узла: http://server01/ ницу представления «Все контакты» phones/default.aspx в верхней панели (AllItems.aspx) вновь созданного списссылок выбираем «Создать». ка, его адрес – http://server01/phones/ На странице создания находим Lists/Employees/AllItems.aspx – легко раздел «Списки» и выбираем нужный читается и воспроизводится: сервер нам шаблон – «Контакты». Открывает- (server01); сайт телефонного справочся страница создания нового списка. ника (phones); списки (lists); сотрудниПри заполнении полей обратите вни- ки (employees). Названия полей представлены гиИмя файла представления можно перссылками для осуществления сормание на следующие моменты:  В поле «Имя» введите название не указывать – в этом случае откроет- тировки. списка по-английски – Employees ся представление по умолчанию. (сотрудники). При создании списНа странице представления отобра- Изменяем общие ка или библиотеки документов жаются поля «Вложения», «Фамилия», параметры SharePoint использует значение «Имя», «Организация», «Рабочий теле- Переходим по ссылке «Изменить наэтого поля для создания адреса фон», «Домашний телефон» и «Адрес стройки и столбцы». Открывается URL. Если это поле целиком состо- электронной почты». Обратите внима- страница настройки списка. Первый ит из национальных символов, ад- ние, что помимо контактной информа- раздел – «Общие параметры» содеррес будет сформирован из стан- ции в списке присутствует поле «Вло- жит ссылки на изменение общих надартной строки: List, List1, DocLib жение». Каждый элемент списка может строек списка, сохранение в качестве и т. д. При наличии в этом поле сме- содержать вложения, то есть некоторое шаблона, удаление, настройку разрешанного набора символов (латинс- количество файлов, связанных с дан- шений на данный список. Перейдем по ких, национальных и спецсимволов ным элементом. При просмотре эле- ссылке «Изменить общие параметры» «&, *» и т. д.) в URL попадут только мента списка в поле «Вложения» отоб- и на открывшейся странице параметлатинские. Пробелы будут замене- ражаются ссылки на вложенные фай- ров изменим в поле «Имя» название ны кодами «%20». Если получив- лы. Сами файлы хранятся в отдельной «Employees» на «Сотрудники». шийся адрес уже существует, в ко- папке на веб-узле. Поддержку вложеРаздел «Утверждение содержимонец будет добавлена цифра. Исхо- ний в списке можно отключить на стра- го» позволяет настроить утверждение дя из этого, рекомендуется при со- нице изменения параметров. каждого элемента списка. Это озназдании задавать имена латинскими символами, заменяя пробелы знаками подчеркивания. Это обеспечит более удобное чтение и воспроизведение адреса URL. Впоследствии имя можно будет изменить, но адрес URL не изменится.  Выберите, будет ли список отображаться на панели быстрого запуска. Для облегчения доступа к списку с главной страницы отметим «Отображать этот список на панели быстрого запуска? : Да». Рисунок 1. Вид веб-узла после создания

№5, май 2006

21


администрирование Также обратите внимание на почает, что после добавления элемен- боте со списками и библиотеками дота в список он не будет виден до мо- кументов. Например, при запросе дан- ле «Изменить (ссылка на изменение мента, пока пользователь с правами ных этого списка с помощью веб-сер- элемента)». Если показать это по«Управление списками» не пометит висов WSS, возвращено будет поле ле в представлении, то для каждого его как утвержденный. По умолчанию «Company», а не «Отдел». элемента будет отображена картинданная функциональность выключека со ссылкой на форму изменения элемента. на. Нам она не требуется, поэтому ни- Представления списка Отмеченные в данном представкаких изменений в данной секции про- На данный момент у нас есть только водить не будем. одно представление – «Все контак- лении столбцы служат для просмотОсталось указать лишь разреше- ты». Давайте рассмотрим его настрой- ра краткой информации о сотруднике. Это его имя, организация и контактния для пользователей на уровне эле- ки подробнее. Переходим по ссылке на имени ная информация – телефоны и адрес ментов. В соответствующем разделе укажем, что пользователи могут читать представления, попадаем на страницу электронной почты. Наверное, полезвсе элементы и не могут их редактиро- «Изменение представления». На стра- нее будет выводить вместо домашнего вать. Сохраняем параметры нажатием нице видим уже привычное деление номер сотового телефона сотрудника. Снимаем отметку напротив поля «Дона кнопку «Ок». на разделы. В разделе «Имя» можно изменить машний телефон» и устанавливаем ее название и имя файла для данного у поля «Сотовый телефон». Также для Столбцы списка В разделе «Столбцы» на странице на- представления. Будьте осторожны – поля «Сотовый телефон» задаем порястройки перечислены все имеющие- если вы измените имя файла пред- док 5 – такой же, как у поля с домашся столбцы за исключением служеб- ставления, файл *.aspx будет переиме- ним телефоном. Заметьте, что поряных, их типы данных и признак того, нован. Пользователи, имеющие пря- док полей автоматически изменился. что поле является обязательным для мые ссылки на данный файл, получат Тот факт, что поле «Домашний телезаполнения при добавлении или из- ошибку 404. фон» имеет порядок 6, не должен смуДоступные в списке столбцы пе- щать – это поле не отображается, и при менении элемента списка. Служебные столбцы списков – «Создано», «Со- речислены в одноименном разделе. следующем изменении представления здатель», «Изменено», «Автор изме- Те столбцы, которые отображаются всем полям будет выставлен правильнений», «Идентификатор». В эти поля в представлении, помечены и находят- ный порядок следования. автоматически заносится информация ся вверху списка. Справа от названия Также добавим в представление о дате создания или изменения и поль- каждого поля можно изменить поря- поле «Изменить», отметив его в списзователе, создавшем или изменившем док следования столбцов. ке и указав самый последний порядок элемент. В поле «Идентификатор» заОбратите внимание, что «Фамилия» следования. Заменим поле «Фаминосится уникальный порядковый но- присутствует в списке столбцов не- лия (ссылка на элемент с меню правмер элемента. Для изменения пара- сколько раз в виде полей «Фамилия», ки)» на поле «Фамилия (ссылка на элеметров столбца (типа хранимых дан- «Фамилия (ссылка на элемент с меню мент)» – с целью не перегружать польных, длины поля и т. д.) или его уда- правки)» и «Фамилия (ссылка на эле- зователей лишними элементами упления необходимо перейти по гиперс- мент)». На самом деле это один и тот равления (имеется в виду контекстное сылке на его имени. Можно добавить же столбец, но в первом случае отоб- меню элемента). Для изменения эленовый столбец и изменить их порядок ражается просто содержимое в виде ментов будет служить столбец «Измепо умолчанию. текста, во втором – к нему добавляет- нить», он будет находиться в самом Заметьте, в списке столбцов при- ся возможность вывода контекстного конце. Для просмотра полной инфорсутствует поле «Организация». Под- меню со ссылками на просмотр, прав- мации можно воспользоваться ссылразумевается, что это поле содержит ки, удаления элемента и т. д. и в треть- кой в поле «Фамилия». сведения о месте работы человека. ем случае формируется ссылка на проВ разделе «Сортировка» уже проДля решения нашей задачи – созда- смотр данного элемента списка. Под- ставлена сортировка сначала по фание телефонного справочника – это по- держка этих вариантов для одного по- милии, а затем по имени. Эти парале не требуется, так как подразумева- ля позволяет создавать представле- метры были заданы в шаблоне списется, что все сотрудники работают в од- ния списка с разными возможностями. ка. Здесь также можно указать поной компании. В то же время в списке Стоит отметить, такие варианты воз- рядок сортировки – по возрастанию не хватает поля «Отдел». Мы переиме- можны лишь для единственного поля, или по убыванию, для каждого из посоздаваемого автоматически. Это по- лей сортировки. Для целей сортировнуем поле «Организация» в «Отдел». Для переименования переходим ле нельзя удалить, нельзя изменить ки списка доступны только два поля, по ссылке «Организация» в спис- его тип, и оно является обязательным по которым можно проводить сортике полей и на открывшейся страни- к заполнению. Такое поле присутствует ровку в каждом представлении. Раздел «Фильтр» позволяет отобце в поле «Имя столбца» вводим «От- во всех списках и является единствендел» и сохраняем изменения. Мы по- ным полем при создании произвольно- рать элементы списка по определенменяли только название поля. Его имя, го списка. Поле имеет имя «Title», его ным критериям. Вы можете указать не«Company», осталось неизменным. название может быть разным, в нашем сколько значений фильтра. Добавление Это важно понимать и помнить при ра- случае – это «Фамилия». полей производится нажатием на ссыл-

22


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

№5, май 2006

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

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

23


администрирование Разрешения на веб-узле На любом веб-узле могут быть настроены разрешения как для отдельных пользователей, так и для групп. Вы можете добавлять на веб-узел пользователей и группы как локального сервера, так и домена. По умолчанию на веб-узле существуют следующие группы:  Читатель – доступ к веб-узлу только на чтение.  Участник – добавление содержимого в существующие библиотеки документов и списки.  Веб-дизайнер – создание списков и библиотек документов; настройка страниц веб-узла.  Администратор. Вы можете создавать собственные группы узла и назначать им права доступа, гибко оперируя разрешениями на узел, списки, библиотеки документов и персональные возможности. Так же можно создавать многоузловые группы, которым можно назначать права доступа на нескольких узлах. Права на узел верхнего уровня могут наследоваться дочерними узлами. Каждому списку, отдельно от разрешений узла, могут быть назначены сле-

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

24

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

рантирует уникальности данных, что может привести к дублированию контактов. Выход из ситуации – удаление контактов перед импортом, но это не самый удобный вариант. Помимо перечисленных, есть также другие способы. Например, создание собственного приложения импорта данных в список, используя объектную модель 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 поддерживает те поля, которые по умолчанию присутствуют в спис-


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

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

Рисунок 3. Библиотека рисунков

№5, май 2006

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

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

кциональность полезна при совместной работе над документами, но требует дополнительного дискового пространства. Заполняем поля на странице:  В поле «Имя» вводим название поанглийски – photos (фотографии).  В поле «Описание» вводим «Фотографии сотрудников».  Выбираем, будет ли библиотека отображаться на панели быстрого запуска.  В данной библиотеке поддержка версионности не нужна, поэтому отключаем ее.

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

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

25


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

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

26

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

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

 В ыч и с л я е м ы й ( в ыч и с л е н и е по другим столбцам). В столбце такого типа можно написать формулу, похожую на те, что используются в ячейках Excel. Подробную информацию о вычисляемых ячейках можно получить по ссылке «Дополнительные сведения» в разделе «Дополнительные параметры столбца». Используя формулу, мы сможем автоматически формировать ссылку на картинку, правда, пока вместо рисунка будет отображаться гиперссылка. Далее мы исправим ситуацию. Итак, вводим в поле «Формула» следующее: =СЦЕПИТЬ("http://server01/phones/ ↵ photos/";ЛЕВСИМВ ↵ ([Адрес электронной почты]; ↵ НАЙТИ("@";[Адрес электронной ↵ почты])-1);".jpg")

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


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

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

Теперь необходимо настроить вне- пает в роли поставщика данных, друшний вид веб-части – она не отобража- гая – в качестве приемника. Веб-частьет некоторых полей. Справа в заголовке приемник может на основе полученвеб-части нажмем кнопку со стрелкой ных данных изменять (фильтровать) вниз. Откроется меню веб-части. Его отображаемую информацию. Соедипервые три пункта позволяют управ- нения актуальны для веб-частей спислять отображением веб-части на стра- ков, библиотек документов, рисунков, нице. Пункт «Свернуть» позволяет по- представления данных и т. д. Добавим отображение фотограказывать только заголовок. Пункт «Закрыть» сделает веб-часть невидимой. фии сотрудника на нашей странице. Чтобы вновь ее отобразить, придет- Для этого соединим веб-часть списка ся открывать страницу во FrontPage контактов с присутствующей на страили другом редакторе, совместимом нице веб-частью рисунка. При этом с WSS. Для удаления веб-части со стра- в качестве передаваемой информации будем использовать ссылку на фотоницы выберите «Удалить». Для изменения настроек веб-час- графию сотрудника. Открываем страницу в конструктоти выберем пункт «Изменить общую веб-часть». В правой части окна от- ре. В меню веб-части «Сотрудники» покроется страница с параметрами веб- явился пункт «Соединения». Выбирачасти. Разделы «Вид», «Макет» и «До- ем его и далее «Предоставить строку». полнительно» присутствуют для всех Затем выбираем веб-часть, которой веб-частей. В этих разделах можно мы будем передавать данные, «Рисузадать название веб-части, разме- нок узла». В открывшемся окне выбиры и отображения веб-части и ее ме- раем поле, которое содержит путь к риню. Самый верхний раздел управляет сунку, в нашем случае это поле «Фото», текущим представлением списка для и нажимаем кнопку «Готово». веб-части. Выберем в списке «ВыбранЗаметьте, что слева в каждой строное представление» пункт «Все кон- ке списка сотрудников появился элетакты» и укажем, что нам не нужна мент со ссылкой. При нажатии на него панель инструментов. Заметьте, спи- в правой части страницы загружается сок отображается с использованием фотография сотрудника. Если не выпредставления «Все контакты». Неко- брано ничего, то есть когда мы перторые поля этого представления мож- вый раз заходим на страницу, вместо но скрыть. Переходим по ссылке «Из- рисунка отобразится текст, сообщаюменить текущее представление». От- щий о необходимости выбора сотрудкрывается окно редактирования пред- ника (см. рис. 4). ставления. Все изменения, которые будут сделаны на этой странице, будут Заключение касаться только одной веб-части. Сни- Созданный в примере телефонный маем отметки напротив поля «Изме- справочник вы можете модернинить». Сохраняем представление на- зировать, расширив функциональжатием кнопки «Ок». ность и улучшив внешний вид. Для Одна из возможностей веб-час- этого можно использовать редакВыберем пункт «Добавить веб-час- тей – поддержка соединения между тор, совместимый с технологиями ти → Обзор». Перетащим мышкой веб- ними. Две веб-части могут быть со- SharePoint, например Microsoft Office часть списка «Сотрудники» из правой единены в пределах страницы или уз- FrontPage 2003. Но это – тема для слечасти окна в левую. ла. При этом одна веб-часть высту- дующих статей. те заполнять столбец с адресом электронной почты, в столбце с фото будет обновляться ссылка. Сохраняем новый столбец. Теперь можно его переименовать, например, пусть его названием будет «Фото». Следующим шагом по улучшению справочника будет отображение данных на первой странице веб-узла. П е р ехо д и м н а гл а в н у ю с т р а ницу сайта, в нашем примере это http://server01/phones. Заходим в выпадающее меню «Изменить общую страницу». Если такого меню нет или оно называется «Изменить мою страницу», возможно, у вас нет соответствующих прав. Краткое назначение пунктов меню:  Добавить веб-части. Открывает страницу в конструкторе и окно со списком веб-частей. Кроме того, есть возможность поиска или импорта веб-части.  Изменить эту страницу в конструкторе. Отображает страницу в виде конструктора, с веб-зонами и возможностью изменять местоположение веб-частей.  Изменить общие веб-части. Открывает окно свойств выбранной веб-части для изменения ее настроек.  Общее представление. Переключается в представление для всех пользователей. Данный пункт доступен при наличии соответствующих разрешений на изменения страниц на узле.  Личное представление. Позволяет настроить внешний вид страницы и веб-частей по своему вкусу для конкретного пользователя.

№5, май 2006

27


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

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

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

В

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

28

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

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


администрирование dtmInstallDate = strOS.InstallDate но оформлены в виде DLL-библиотеки, взаимодействуюWscript.Echo WMIDateStringToDate(dtmInstallDate) щей с WMI через COM+. Next Замечу, что есть ряд провайдеров WMI, которые явFunction WMIDateStringToDate(dtmInstallDate) ляются посредниками между WMI и другими широко расWMIDateStringToDate = CDate(Mid(dtmInstallDate, ↵ 5, 2) & "/" & Mid(dtmInstallDate, 7, 2) & "/" & ↵ пространенными системами управления. К таким провайLeft(dtmInstallDate, 4) & " " & ↵ дерам в частности относятся: WMI SNMP Provider и WMI Mid (dtmInstallDate, 9, 2) & ":" & ↵ Mid(dtmInstallDate, 11, 2) & ":" & ↵ Performance provider. Конечно же, в задачу системного адMid(dtmInstallDate, 13, 2)) министратора не входит разработка провайдеров WMI – это End Function удел программистов, однако весьма полезно иметь предВозникает вопрос, почему дата и время в WMI представление об основных провайдерах и их функциях. В операционной системе Windows XP существует бо- ставлены столь странным образом. Ответ на самом делее 20 различных провайдеров WMI, каждый из которых ле прост. Вспомните, что одним из важнейших элеменрешает свой собственный узкий набор задач. Кроме того, тов WMI является язык WQL. Для удобства обработки даустанавливая драйверы, а также системное и прикладное ты и времени в WMI с помощью языка WQL (внутренней программное обеспечение, вы можете обнаружить, что их сортировки и группировки) все даты представлены так, разработчики включили в состав своего продукта допол- что в самых старших разрядах идет год, затем месяц, понительные WMI-провайдеры и классы. Из наиболее широ- том – день, потом часы, минуты и секунды. Соответственко известных программных продуктов, устанавливающих но для того, чтобы отсортировать массив данных, полученсвои WMI-провайдеры, можно отметить следующие: Intel ных из WMI по дате времени, не нужно делать никаких доProSet II, Citrix Metaframe и Presentation Server, Symantec полнительных усилий. Antivirus, Dell Open Manage, IBM DB2, HP Open View, Altiris Некоторые усилия потребуются при отображении этих Software Virtualization Solution, а также большинство продук- данных пользователю или сохранении их в отчете. С вытов и сервисов Microsoft. Замечу, что это далеко не полный ходом Windows XP эта задача стала решаться еще легче. список, а лишь то, что наиболее часто встречается в кор- В наборе объектов для сценариев WMI появился специальпоративных сетях. ный класс объекта SWbemDateTime. Он отвечает за предПоскольку все провайдеры нацелены на предостав- ставление даты и времени в удобном для чтения виде. ление различных функций и решение различных задач, То есть фактически проделывает ту же работу, что и фунто всё описание и примеры будут строиться не от одной об- кция WMIDateStringToDate из листинга 1. Пример испольщей задачи, как это было в предыдущей части, а от функ- зования этого класса дан в листинге 2. ций провайдера.

Обработка даты и времени в сценариях WMI Разберём простой пример по обработке даты и времени в сценариях WMI. Многие провайдеры WMI возвращают обратившейся к ним программе различные характеристики операционной системы и приложений, которые содержат даты и время. Эти данные представлены в специальном формате и нуждаются в предварительной обработке, прежде чем принять удобный для чиения вид. До выхода Windows XP эта задача оставалась на совести вызывающей программы и требовала от администратора написания подпрограммы преобразования форматов. Несмотря на то что алгоритм этой подпрограммы довольно прост – это требовало дополнительных усилий. Пример такой подпрограммы представлен в листинге 1. Если взглянуть внимательно, то эта подпрограмма всего лишь разбирает дату и время, которые вернула система WMI, на составляющие и представляет в более удобном для чтения виде. Листинг 1. Работа с датой и временем в WMI-сценариях. Работает на всех версиях ОС strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & ↵ strComputer & "\root\cimv2") Set objOS = objWMIService.ExecQuery("Select * ↵ from Win32_OperatingSystem") For Each strOS in objOS

№5, май 2006

Листинг 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.GetVarDate Next

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

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

29


администрирование 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-пакета. Листинг 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

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

30

темы и предоставляет подробный отчет о статусе посланного 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 = 0 For 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


администрирование 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

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

Как видно из примера, код WQL-запроса достаточно простой, поэтому, я полагаю, детально пояснять его не нужно. Обращу внимание лишь на одно существенNext ное обстоятельство: при работе с журналами необходимо использовать привилегию Security. В противном слуNext чае многие из запросов будут отклонены системой безоWScript.Echo "Удалось определить MTU трассы: " & ↵ пасности Windows. CStr(varMaxPacket + 28) Следующий пример, приведенный на листинге 6, покаАлгоритм работы этого сценария прост: мы посыла- зывает, как произвести очистку журнала приложений (хотя ем от нашего хоста до указанного целевого хоста пакеты, это может быть любой системный журнал аудита), испольс каждым шагом увеличивая их размер на 8 байт, устано- зуя метод ClearEventlog класса Win32_NTEventlogFile. Помивив специальный IP-флаг, запрещающий фрагментировать мо того, что нам необходимо указать привилегию Security, пакет. При этом мы следим за результатом, и как только нам также необходимо открыть конкретный экземпляр обънам вернется диагностический пакет, сообщающий о том, екта класса Win32_NTEventlogFile соответствующего журчто размер нашего исходного пакета больше допустимого, налу приложений. мы запоминаем размер последнего успешно прошедшего Листинг 6. Очистка системного журнала приложений по трассе пакета. (Application Event Log)

Обработка системных журналов

strComputer = "."

Следующий провайдер WMI, который может оказаться вам полезеным, – это провайдер системных журналов Windows. Классы, которые предоставляет в наше пользование этот провайдер, имеют названия: Win32_NTLogEvent, Win32 _ NTEventLogFile, Win32 _ NTLogEventLog, Win32_NTLogEventUser, Win32_NTLogEventComputer. Для нас наибольший интерес представляют первые два. Win32_NTLogEvent позволяет нам отслеживать события появления в системных журналах аудита новых записей. Для этого используется синхронная техника внутренних событий WMI.

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

Листинг 5. Отслеживание событий в системных журналах аудита strComputer = "." Set objWMIService = GetObject("winmgmts: ↵ {impersonationlevel=impersonate,(security)}!\\" & ↵

№5, май 2006

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

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

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

31


администрирование тве имен root\CIMv2, а в пространстве имен root\default. ча в цикле while, попутно делая раз в секунду (1000 миллиВ примере, приведенном в листинге 7, можно увидеть секунд) изменение этого самого ключа с помощью другого все основные приемы, необходимые для работы с реестром метода WMI: SetStringValue. Как только пройдет 20 секунд, через WMI. В их число входит создание и удаление клю- и мы 20 раз изменим указанный выше ключ, цикл заверчей и значений реестра, а также запись данных в значе- шается, и в самом конце сценария мы отменяем подписку ния реестра и отслеживание событий по изменению клю- на события WMI вызовом метода Cancel объекта MySink, чей и значений реестра. Провайдер StdRegProv предо- а также удаляем созданный ранее ключ реестра. ставляет системе WMI набор внешних источников событий для отслеживания изменений в реестре, что сущес- Работа с Active Directory через твенно повышает эффективность и скорость отслежива- WMI Directory Service provider ния этих событий. Еще один полезный и интересный провайдер WMI – это провайдер для работы со службой каталогов Microsoft Active Листинг 7. Работа с реестром через WMI Directory. Все классы этого провайдера определены в пространстве имен root\deirctory\ldap. Сразу хочу обратить вниSub REG_OnObjectReady(objObject, objAsyncContext) Wscript.Echo "Изменение в реестре: " & ↵ мание, что существует альтернативное средство для рабоobjObject.GetObjectText_() ты с Active Directory из сценариев и приложений – это ADSI End Sub (Active Directory Services Interfaces). Объектная библиотека '-------------------------------------------------------ADSI более проста и удобна в использовании, чем провайstrComputer = "." Const HKEY_LOCAL_MACHINE = &H80000002 дер WMI Directory Services, тем более что он является надstrKeyName = "SOFTWARE\aRegKey" стройкой над всё тем же ADSI. strValName = "MyValue" Зачем же тогда нужен этот провайдер?! – спросите вы. Set objWMIService = GetObject("winmgmts:\\" & ↵ Все довольно просто – поскольку WMI универсальное strComputer & "\root\DEFAULT") Set objReg = objWMIService.Get("StdRegProv") средство мониторинга и управления системой Windows и ее компонентами, то есть необходимость интегрировать objReg.CreateKey HKEY_LOCAL_MACHINE, strKeyName objReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyName, ↵ все средства управления системой через WMI. Кроме тоstrValName, "test0" го, поскольку некоторые программные продукты по своSet MySink = WScript.CreateObject( _ ей архитектуре могут использовать только WMI, то зада"WbemScripting.SWbemSink","REG_") ча управления Active Directory должна быть решена и чеobjWMIservice.ExecNotificationQueryAsync MySink, _ рез WMI в том числе. "SELECT * FROM RegistryValueChangeEvent WHERE " & ↵ В листинге 8 приведен пример простого сценария WMI, "Hive = 'HKEY_LOCAL_MACHINE'" &_" AND KeyPath = ‘" & ↵ Join(Split(strKeyName, "\"), "\\") & "'" & ↵ который модифицирует поле displayname указанного поль" AND ValueName = '" & strValName &"'" зователя Active Directory. WScript.Echo "Ожидаем события..."

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

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

32

Листинг 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", true objValSet.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, objValSet Next WScript.Echo "Свойства прользователя Active Directory ↵ обновлены"

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


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

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

№5, май 2006

В этом примере сценарий выводит показания счетчиков производительности для процессора. Для того чтобы понять, чем отличаются классы нормированных счетчиков производительности от ненормированных, я привел в листинге 10 почти тот же пример, но использующий класс с нормированными счетчиками производительности. Листинг 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_Sys100NS Next

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

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

33


администрирование совместимыми устройствами и системой WMI. Те, кто не- Таким образом, команда компиляции MOF файла должна плохо знаком с SNMP, понимают, что в основе WMI и SNMP выглядеть так: лежат похожие решения по хранению и представлению инmofcomp –AUTORECOVER <moffilename> формации. И WMI и SMNP поддерживают события (в терминологии SNMP это Trap-сообщения) и расширение базы данных (репозитория): в терминологии WMI это MOF-файОчевидно, что эти файлы должны быть доступны лолы, а в терминологии SNMP это базы MIB (Management кально, когда процесс автоматического восстановления Information Base). будет запущен, поэтому при компиляции с этим ключом В итоге при использовании SNMP-провайдера WMI ад- MOF-файлы копируются в папку %systemroot%\system32\ министратор получает в пространстве имен root\snmp пред- wbem. Относительно недавно (10 марта 2006 года) вышла обставление всех необходимых устройств, поддерживающих протокол SNMP. Присылаемые SNMP-устройствами Trap- новленная версия 1.1 сценария WMIDiag.vbs. Этот сценасообщения преобразуются в события WMI, которые можно рий разработан специалистами Microsoft для дополнительтакже отслеживать. Для добавления информации из баз ной диагностики WMI. Он обязательно должен запускатьданных в формате SNMP MIB в репозиторий WMI сущест- ся локально на той машине, на которой следует провести диагностику. Он поддерживает множество ключей командвует специальная утилита smi2smir.exe. При инсталляции ОС Windows по умолчанию провайдер ной строки для управления режимом своей работы. В часSNMP WMI не устанавливается – его необходимо устанав- тности его можно работать в «тихом режиме» (без вывода ливать через установку и удаление системных компонен- диагностических сообщений на экран – они будут записытов консоли Add/Remove Programs. ваться в файл, в системный журнал и/или отправляться по Затем необходимо произвести настройку SNMP-окру- электронной почте) или запускаться как задание Microsoft жения. В эту задачу входит определение в свойствах про- SMS 2003. С его помощью можно осуществлять множество разстранств имен раздела root\snmp так называемых SNMPcommunity для чтения, записи и оповещений, и импорти- ных тестов по проверке работоспособности WMI: проверровать в репозиторий WMI MIB-файлы. Некоторую допол- ку службы и COM-объектов WMI, чтение и запись в репонительную информацию по этой теме можно прочитать в зиторий, проверку целостности репозитория и определебиблиотеке MSDN [4]. ния классов и пространств имен, а также параметров реПосле того как SNMP-окружение настроено для этого естра и других системных служб и компонентов, влияющих провайдера, можно начинать работать с SNMP-совмести- на работу WMI. Пожалуй, самым ценным в этом сценарии мыми устройствами из сценариев WMI. Пример WQL-за- является то, что помимо диагностики и констатации пропроса для чтения свойств SNMP-совместимых устройств блем он выдает рекомендации по исправлению неисправвыглядит примерно так: ностей. В будущих версиях планируется сделать режим автоматического исправления некоторых типичных проблем, SELECT * FROM SNMP_DEVICE_ADDRESS WHERE ↵ которые он обнаруживает. SNMP_PROPERTY_NAME > 100 Подробное описание этого сценария (утилиты) с примеТаким образом, провайдер SNMP позволяет интегриро- рами и иллюстрациями можно найти по ссылке [5]. вать любые системы и устройства, поддерживающие SNMP, с технологией WMI. Вместо заключения В цикле статей о технологии WMI я постарался рассказать вам о всех важных и практически применимых сторонах Устраняем ошибки в WMI В данном разделе мы рассмотрим вопрос диагностики этого поистине универсального инструмента. Надеюсь, вы и устранения ошибок в WMI. Помимо штатного резерв- оцените его полезность. ного копирования и восстановления, выполнение которого доступно через консоль wmimgmt.msc. Существует еще Ссылки и литература: ряд средств диагностики и восстановления WMI. Для то- 1. Леонтьев К. Узнай секреты WMI: события и провайдеры. го чтобы разобраться, как они работают, нужно вспомнить, Часть I: дополнительные возможности. – Журнал «Системчто все элементы репозитория WMI могут быть описаны ный администратор», №3, март 2006 г. – 6-13 с. на языке MOF-файлов. Таким образом, используя компи- 2. Леонтьев К. Вы все еще не используете WMI? Часть I. – Журнал лятор MOF-файлов mofcomp.exe, вы можете заново вос«Системный администратор», №1, январь 2006 г. – 4-11 с. создать весь репозиторий WMI – главное для этого иметь Леонтьев К. Вы все еще не используете WMI? Часть II: пишем эти самые исходные MOF-файлы. При компиляции некотосценарии. – Журнал «Системный администратор», №2, феврые MOF-файлы могут быть помечены как компоненты авраль 2006 г. – 6-14 с. томатического восстановления – это означает, что при об- 3. Windows Management Instrumentation – http://msdn.microsoft. наружении серьезной ошибки в базе данных репозитория com/library/en-us/dnanchor/html/anch_wmi.asp. WMI запущенный процесс автоматического восстановле- 4. Setting up the WMI SNMP Environment – http://msdn.microsoft. ния самостоятельно скомпилирует и импортирует в репоcom/library/en-us/wmisdk/wmi/setting_up_the_wmi_snmp_ зиторий такие MOF-файлы. Для того чтобы пометить MOFenvironment.asp?frame=true. файлы как компонент автоматического восстановления при 5. WMIDiag – http://www.microsoft.com/technet/scriptcenter/topics/ его компиляции, нужно добавить опцию – AUTORECOVER. help/wmidiag.mspx.

34



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

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

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

К

огда работа предприятия зависит от функционирования серверов, всегда хочется быть уверенным в их надежности. И надежность эту даже можно измерить. Применительно к серверам эта величина называется «доступность» или «готовность», измеряется в процентах и означает, сколько времени в году сервер исправно функционирует. Идеальное ее значение – 100%. В таблице 1 приведены типичные значения готовности и расчетное время простоя для каждой из них. Что делать, чтобы увеличить этот показатель? Оптимальное решение – это дублирование всех узлов (т.е. серверов). Это решение позволит дописать к показателю готовности еще одну «9». А два функционально идентичных сервера, работающих как один, – это уже кластер. Варианты построения кластера выбираются в каждом конкретном случае. Я хочу привести пример построения кластера на примере СУБД Oracle 9i. Как я и писал выше, есть несколько вариантов решений. Их можно разделить по нескольким критериям: стоимость решения, оперативность восстановления системы после сбоя (см. таблицу 2). Поскольку основное требование к кластеру – высокая степень доступ-

36

ности, то варианты из нижнего ряда второй таблицы отвергаем сразу. Рассмотрим оставшиеся варианты с учетом требуемого бюджета. Выбираем DRBD + Heartbeat. Перевод статьи, посвященной бюджетным системам высокой готовности, в которой рассматривается выбранное нами решение, находится по адресу: http://www.opennet.ru/docs/RUS/ ha_cluster.

Назначение DRBD и Heartbeat DRBD – это блочное устройство, которое позволяет организовывать зеркалирование (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/heartbeat2.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 мог с большей ве-


администрирование роятностью определить, «умер» один из узлов кластера или нет. Может так случиться, что между узлами пропадет связь через 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. Этот материал написан, на мой взгляд, очень грамотно.

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

Время простоя в год

99

3.5 дня

99.9

9 часов

99.99

52.5 минуты

99.999

5 минут

 Руководство «Установка БД 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) altora1#> groupadd –g 789 oracle altora1#> useradd –g oracle –u 1234 oracle

и altora2#> groupadd –g 789 oracle altora2#> useradd –g oracle –u 1234 oracle

Заметьте: и номера, и имена одинаковы на обоих узлах! В качестве точки монтирования будем использовать каталог /D01. Итак. Для упрощения установки и автоматизации процесса запуска Oracle будем использовать скрипты из пакетов oraclepreinstall и oracle9-tuning из репозитория Alt Linux:

Высокая стоимость

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

 Использование встроенных средств Oracle для организации репликации в реальном времени между несколькими серверами (книга из документации под названием «Oracle Data Guard Concepts and Administration») «+» высокая надежность (в идеале, максимально возможная); гарантия сохранения информации на уровне транзакции; практически полная незаметность факта сбоя для пользователя «–» высокая стоимость лицензии  Использование специализированных аппаратных средств (сервер с высоким показателем доступности) «+» высокая надежность; «–» стоимость решения еще дороже, чем стоимость предыдущего варианта

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

Восстановление с задержкой

Восстановление в реальном (или почти) времени

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

№5, май 2006

 TSync (http://tsyncd.sourceforge.net) и аналогичные средства (rsync, unison, и т. д.) «+» простота конфигурирования «–» в зависимости от алгоритма может приводить к значительной загрузке системы; синхронизация данных происходит при окончании работы с файлом, что может при активной работе с диском привести к значительной задержке в синхронизации данных; требует дополнительной настройки для автоматического переключения с одного сервера на другой (возможно, что и на основе того же Heartbeat)  Средства Oracle для организации репликации (книга из документации под названием «Oracle 9i Advanced Replication») «+» работает в рамках лицензии Oracle Standard Edition; основано на встроенных механизмах Oracle «–» недостаток, общий для данной группы – отложенная синхронизация

37


администрирование Остановкой Oracle управляет скрипт /$ORACLE_HOME/ bin/dbshut. В этом скрипте на строках под номерами 79 и 84 расположены пары команд: … connect internal shutdown …

Схема построения кластера

 /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: #>chown –R oracle:oracle /Disk1/…/jre/linux

Стоит отметить, что таким способом можно решить проблему только с инсталлятором, клиентские GUI-приложения используют JRE версии 1.1.8. Для него мне не удалось найти подходящего обновленного JRE ни у SUN, ни на www.blackdown.org. Но в принципе клиентское GUI ПО на сервере не особо и нужно. Способ же, описанный в вышеупомянутом руководстве, работает для обоих типов JRE. При создании базы вы можете столкнуться с одной интересной проблемой. При установке мастер «зависает» перед самым моментом начала создания базы. Мой опыт подсказывает, что путь к тому месту, где должна обитать база, слишком длинный (больше некоторого числа символов). Сокращение длины пути к базе способно решить эту проблему. Вы можете дать этому свое объяснение, но для себя я сделал вывод, что такова особенность работы мастера и/или JRE и просто надо иметь это в виду.

38

Нас интересует команда 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-*. Копируем его вместо конфига нового ядра : #> cp /boot/config-2.4.26-std-smp-alt6 /usr/src/linux/.config

Компилируем ядро, устанавливаем. Проверяем работоспособность системы на новом ядре.


администрирование Компилируем DRBD: #> cd /usr/src/drbd-0.7.17 #> make clean all

должны определиться с этим и «сказать» DRBD. Делается это командой: #> drbdadm -- --do-what-I-say primary all

Устанавливаем: #> make install

Модуль находится в /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. Устанавливаем его: #> chkconfig --add drbd

Этот скрипт инициализирует подсистему DRBD, используя параметры из файла /etc/drbd.conf. Результат работы скрипта аналогичен команде: #> drbdadm up all

Теперь перезапускаем наш кластер и в /var/log/messages должны увидеть что-то вроде этого. О том, что модуль загружен: drbd: initialised. Version: 0.7.17 (api:77/proto:74) drbd: SVN Revision: 2093 build by root@altora1, 2006-03-14 18:42:04 drbd: registered as block device major 147

О том, что запущен сервис DRBD: drbd0: Creating state block drbd0: resync bitmap: bits=8513804 words=266058 drbd0: 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 --> StandAlone drbd0: drbdsetup [2122]: cstate StandAlone --> Unconnected drbd0: drbd0_receiver [2123]: cstate Unconnected --> WFConnection drbd0: drbd0_receiver [2123]: cstate WFConnection --> WFReportParams drbd0: Handshake successful: DRBD Network Protocol version 74 drbd0: Connection established. drbd0: I am(S): 0:00000001:00000001:00000001:00000001:00 drbd0: Peer(S): 0:00000001:00000001:00000001:00000001:00 drbd0: drbd0_receiver [2123]: cstate WFReportParams --> Connected drbd0: I am inconsistent, but there is no sync? BOTH nodes inconsistent! drbd0: Secondary/Unknown --> Secondary/Secondary

Дело в том, что изначально DRBD ничего не знает о том, какой из узлов ведущий, а какой ведомый. И теперь мы

№5, май 2006

запущенной на ведущем узле. После чего начинается процесс синхронизации дисков на обоих узлах кластера и содержимое раздела диска основного узла копируется на раздел диска ведомого узла. Будьте внимательны и аккуратны, советую проверить перед выполнением вышеприведенной команды еще раз конфигурационный файл DRBD! За процессом синхронизации можно наблюдать набрав: #> 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

Создаем файловую систему на устройстве DRBD, желательно чтобы она была журналируемой, это позволит ускорить запуск сервисов на резервном узле (иначе перед запуском будет проведена проверка диска): #> mkreiserfs /dev/drbd0

Останавливаем Oracle, если он работает. Переносим Oracle (бинарные файлы и базу) во временную директорию, например, так: #> mv /D01/Ora /root/Oracle

Монтируем устройство DRBD в /D01: #> mount -t reiserfs /dev/drbd0 /D01

Копируем Oracle обратно в /D01. Пробуем запустить Oracle.

Установка Heartbeat Компиляция и установка Heartbeat довольно проста и проходит в 3 этапа: #> cd /usr/src/heartbeat-2.0.4 #> ./ConfigureMe configure

39


администрирование При первой попытке конфигуратор наверняка выдаст зовательском режиме. В этом режиме ни DRBD, ни Heartbeat сообщения о том, что для установки Heartbeat не хватает не запускаются. Редактируем конфигурационный файл нескольких пакетов. Перечень необходимых пакетов кон- /etc/drbd.conf и устанавливаем параметр wfc-timeout в знафигуратор выдает в конце работы единым списком. Я сове- чение, отличное от 0, например, 1 (равно 1 секунде). Снова тую установить все требуемые пакеты и те, что обязатель- перезагружаем узел уже в обычном режиме. Как повлияет синхронизация данных по сети на сконы (ERROR), и те, что желательны (WARNING). Компилируем и устанавливаем: рость работы с Oracle и как значительно может уменьшиться производительность по сравнению с одиночным серве#> ./ConfigureMe make ром? Здесь многое зависит как от скорости используемого #> ./ConfigureMe install сетевого соединения, так и от режима работы Oracle. ЗнаДля настройки Heartbeat использует 3 файла, находя- чительное падение цен сделало доступным гигабитные рещиеся в директории /etc/ha.d: шения для бюджетного сектора. Учитывая, что DRBD буферизирует данные и то, что скорость работы современных  /etc/ha.d/ha.cf – общая настройка;  /etc/ha.d/haresources – этот файл описывает ресурсы, жестких дисков в реальных условиях пока еще значителькоторые следует перемещать от узла к узлу; но меньше, чем пропускная способность гигабитной сети, то в данном случае узким местом скорее станет скорость  /etc/ha.d/authkeys – файл аутентификации. работы с дисками. В любом случае вы не должны заметить сколько-нибудь значительного проигрыша. Если вы испольВыполняем команду: зуете сеть 100 Mbit, то здесь тоже не все безнадежно. Ес#> chkconfig --add heartbeat ли большая часть запросов к базе (как правило) составляет запросы на выборку, то работа в основном будет идти с диском на главном узле, и здесь скорость соединения для установки init-скрипта пакета Heartbeat. Перезапускаем кластер. В логах должно появиться что- в 100 Mbit практически никак не скажется на производительто вроде этого: ности кластера. Если же основная работа с Oracle состоит в добавлении новых записей, то все зависит от объема heartbeat: [1630]: info: Configuration validated. Starting heartbeat 2.0.4 новых данных, поступающих на запись. На основе своего heartbeat: [1631]: info: heartbeat: version 2.0.4 heartbeat: [1631]: info: Heartbeat generation: 7 опыта могу сказать, что Oracle на удаление и потом встав... ку 20000 записей тратил около 15 секунды на одиночном ResourceManager[2195]: info: Running /etc/init.d/oracle-db start ... сервере. В объемах это где-то 5-10 Мб, учитывая индексы 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 ... кластера на другой? Соединения клиентского ПО с Oracle 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) течении пары минут заново подключиться к Oracle, желаheartbeat: [1631]: info: remote resource transition completed. тельно, чтобы используемое вами клиентское ПО имело таПоздравляю, ваш кластер работает! кую возможность. Время перехода с одного узла кластера на другой составляет менее минуты. Если вы используете единый источник бесперебойноЭксплуатация Порядок включения узлов не имеет значения, т.к. узел, за- го питания для обоих узлов кластера, то для увеличения пустившийся первым, будет ждать запуска другого узла времени работы от батареи в случае отключения электро(в файле /etc/drbd.conf параметр wfc-timeout). Что делать, снабжения советую в качестве второго узла кластера исесли один из узлов не стартует, мы обсудим ниже. пользовать более «легкую» машину (меньше CPU, жестПорядок выключения узлов кластера зависит от при- ких дисков и прочего). И при переходе кластера на работу ложений, запущенных на этом кластере. Для нашего слу- от батареи оставлять рабочим только резервный узел. Дечая мы должны добиться, чтобы информация, храняща- лается это путем настройки демона, следящего за состояяся в базе Oracle, по завершении работы кластера бы- нием батареи, так, чтобы система на главном узле останавла в идентичном состоянии на обоих узлах и была «цель- ливалась, например, после 5 минут (чтобы не реагировать ной» (consistent). Мне представляется, что единственный на кратковременные перебои) работы от батареи, а на респособ этого добиться – выключать главный узел пер- зервном узле работала бы уже до исчерпания заряда батавым, тогда Oracle успешно завершит работу, и даже ес- реи. Выбор соответствующего демона зависит от марки исли Heartbeat на резервном узле успеет запустить Oracle, пользуемой вами батареи. Для широко распространенных то это уже не должно повлечь за собой какое-либо изме- батарей фирмы APC можно использовать демон apcupsd нение данных в базе, т.к. резервный узел также будет за- (http://www.sourceforge.net/projects/apcupsd). Он позволяет организовать взаимодействие по сети. вершать свою работу. И не забывайте о резервном копировании, ведь класТак что же делать, если один из узлов не запускается? Перезагружаем рабочий узел и загружаем систему в однополь- тер – это не панацея, а лишь одно из средств.

40


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. Уязвимость существует из-за неизвестной ошибки, которая позволяет в некоторых ситуациях подменить иконку с изображением безопасного замка и содержимое адресной строки путем изменения месторасположения popup окна. Для успешной эксплуатации уязвимости опция «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-тегов. Удаленный пользователь может вызвать повреждение памяти и выполнить произвольный код на целевой системе.

№5, май 2006

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(). Удаленный пользователь, контролирующий входные параметры функций, может вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. Примеры: <? $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);?>

URL производителя: www.php.net. Решение: В настоящее время способов устранения уязвимости не существует.

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

41


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

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

Валентин Синицын Выбор пакетов для Slackware, на ваш взгляд, скудноват, а Gentoo собирается целую вечность? Попробуйте Arch Linux – удачное сочетание гибкости и скорости развертывания.

42


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

В

этой статье мы поговорим об Arch министрированию производятся тем Linux (www.archlinux.org) – срав- путем, который предусмотрел автор нительно молодом, первоприн- той или иной программы. Arch Linux ципном (то есть не базирующемся ни вообще старается выдерживать «авна какой из ныне существующих) дис- торскую» линию – на пакеты почти трибутиве Linux. Это не совсем об- не накладываются патчи (кроме тризор – по ходу изложения будут давать- виальных) и т.п. Как утверждает Вися советы и рекомендации по практи- нет, основные идеи он позаимствоческой работе с системой. Поскольку вал у CRUX (www.crux.nu) и Slackware Arch Linux, как и большая часть сов- (www.slackware.com) – так что антураж ременных ОС, не явно подразумевает, соответствующий. Arch Linux имеет оригинальную орчто пользователю не составляет труда выкачать из Интернета 100-200 Мб об- ганизационную структуру. Поскольку новлений, мы специально остановим- он в некотором смысле является детися на специфике его использования щем одного человека, здесь есть четв условиях нашей страны. Сразу же ко очерченный набор «официальных» скажу, что речь не идет о локализа- пакетов (коих в версии 0.7.1 насчитыции – в этом смысле Arch Linux не от- вается 357 штук) и, как некогда замеличается от любого другого дистрибу- тил Алексей Федорчук: «ни малейтива, а данная статья не преследует шей тенденции к увеличению их чисцель дублировать существующую до- ла не просматривается». Официалькументацию. ный Arch Linux скормен и строг: помиОснователем Arch Linux является мо базовой системы (arch-base) сюда Джудд Винет (Judd Vinet). Первая вер- входит графическая среда и легкие сия дистрибутива под номером 0.1 уви- оконные менеджеры (FVWM, IceWM, дела свет 11 марта 2002 года, а теку- WindowMaker), а также средства разщая версия имеет номер 0.7.1 и дати- работки, сервера и основные графирована 5 января 2006 года. ческие приложения: AbiWord, Gimp, Arch Linux является i686-оптимизи- Mozilla Firefox и Thunderbird. Ни KDE, рованным дистрибутивом. Что пони- ни Gnome, ни OpenOffice.org в этом мается под этими словами? Это зна- списке нет, но это не значит, что их нет чит, все пакеты собираются с клю- вообще: у «официального» Arch Linux чом «-march=i686», то есть использу- существуют «полуофициальные» сают набор инструкций Pentium II и вы- телиты, в первую очередь – репозише. Как следствие, этот процессор яв- тарий Extra. Это – весьма объемная ляется «минимальным системным тре- коллекция пакетов, не поддерживабованием» к оборудованию. Как зна- емая г-ном Винетом лично. Не стоют пользователи Gentoo, пересбор- ит думать, что Extra – нечто вроде ка Linux под свою архитектуру позво- linuxpacages.net – это просто репозиталяет достичь определенного (порой – рий, поддерживаемый другими людьвесьма незначительного) прироста ми, что и придает ему «полуофициальпроизводительности, поэтому можно ный», но отнюдь не «неофициальный» предположить, что на новых компью- статус. Между репозитариями сущестерах Arch Linux будет работать быс- твует тесное взаимодействие, и мнотрее, чем, например, Slackware (оп- гие рассматривают Extra как неотъемтимизация i486) или SUSE/Mandriva лемую часть Arch Linux. (i586). На самом деле на скорость Перечень репозиатриев Arch Linux работы влияет множество парамет- не исчерпывается Extra и Current ров, и оптимизация здесь – далеко (это тот самый «официальный» Arch не главное. Существуют также порты Linux, из которого в определенные моArch Linux на x86-64 и i586, однако мне менты времени делают ISO-образы). не приходилось работать с ними поэ- Упоминания заслуживает Testing, в котому в дальнейшем мы будем говорить тором появляются новые, еще не «обтолько об основной ветви. катанные» версии программ (так, наArch Linux – дистрибутив для опыт- пример, в состав Arch Linux 0.7.1 входит ного пользователя. Вы не найдете X11R6.8.2, но на момент выхода диств нем графических мастеров-конфи- рибутива в свет X.Org 7.0 уже был догураторов вроде YaST или Mandriva ступен в Testing, а в Current он появилControl Center: все операции по ад- ся лишь в середине февраля) и AUR

№5, май 2006

(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. К сожа-

43


администрирование му, что на вашем компьютере появится вполне полноценная X Window System не самой свежей версии (опять же см. выше). В общем, даже если у вас на руках полноценный DVD со всеми пакетами, будьте осторожны и не пренебрегайте «советами бывалых». В остальном инсталлятор Arch Linux мало чем отличается от того же Slackware. Меню организовано чуть-чуть подругому, но человека, претендующего на работу в дистрибутиве для опытных пользователей, это вряд ли смутит.

Первая загрузка

Рисунок 1. Рабочий стол Arch Linux – ничего необычного. Все самое интересное – за кулисами

Рисунок 2. Сине-бело-черная гамма – визитная карточка Arch Linux. Сайт проекта выдержан в том же стиле

лению, для большинства российских пользователей это неприемлемо, но выход все же есть. Начиная с января этого года ежеквартальные срезы репозитариев Arch Linux можно заказать по почте (http://www.linuxcenter.ru/?good=1332). Будем считать, что вам удалось раздобыть Arch Linux тем или иным способом. Что дальше? Конечно же, установка! Весь процесс подробно описан на самом диске, в файле archdoc.txt (потрудившись, его можно найти и на ftp.archlinux. org). Мы же сосредоточимся на некоторых тонкостях, знание которых позволит сделать развертывание системы достаточно быстрым и безболезненным.

Установка Инсталлятор Arch Linux выдержан в духе Slackware: те же сценарии на языке оболочки плюс утилита dialog. Создатели дистрибутива настоятельно рекомендуют установить только базовую систему, а оставшиеся пакеты добрать вручную после перезагрузки системы и, как выясняется, не зря. Просматривая плоский список из 350 с лишним пакетов, не мудрено и утомиться, а выбор двух несовместимых вариантов (например, hotplug и udev – см. выше) приведет к тому, что программа откажется продолжать свою работу и предложит начать все сначала. Зависимости тоже разрешаются автоматически – никакой возможности поучаствовать в этом процессе вам не предоставляется, а потому случайный выбор, скажем Mozilla Firefox приведет к то-

44

После перезагрузки системы (которая, кстати, произойдет весьма быстро) вашему взору будет представлена чистая текстовая консоль. Впрочем, если вы все же не послушались старших товарищей и попросили инсталлятор развернуть что-то помимо базовой системы, у вас вполне может оказаться и 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 может иметь следующий вид: [current] # Список «настоящих» интернет-серверов Include=/etc/pacman.d/current Server= Ошибка! Недопустимый объект гиперссылки.

В результате при отсутствии подключения на консоль будет выдаваться множество сообщений о невозможности соединиться с ftp.foo.bar, а затем pacman установит нужный пакет с DVD-ROM. С репозитариями Extra и Testing можно поступить также, а можно – еще проще – просто добавить: Server=file://<путь к локальному репозитарию>


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

№5, май 2006

45


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

Или же сразу и собрать, и установить: makepkg -i Рисунок 3. Не нашли нужную программу в основном дистрибутиве. Пришло время обратиться к помощи сообщества – ArchLinux User-community Repository

Если вы собрали что-то уникальное и считаете, что ваш PKGBUILD может быть полезен другим пользователям Arch Linux, подумайте о его публикации в AUR. Все! Подготовительные этапы пройдены, и теперь вы можете оснащать свою систему всеми необходимыми приложениями. Используйте автоматическое разрешение зависимостей (pacman -S) – это сделает вашу жизнь проще, а блоки «конструктора», с которым приходится работать, крупнее.

в начало соответствующей секции. «разумном» формате (.tar.gz, .tar.bz2, Для пущей уверенности можно заком- zip) и PKGBUILD.proto, если речь идет ментировать все остальные сервера. о новом пакете, после чего PKGBUILD. Альтернативный подход к разверты- proto переименовывается в PKGBUILD ванию локального репозитария изло- и правится в соответствии с вашими требованиями. В сложных случаях можен в файле archdoc.txt. Первую половину пакетного ме- жет потребоваться использовать сценеджмента мы, таким образом, на- нарий install, который легко создать строили. Осталось вторая – ABS. на базе install.proto. Написание сцеК счастью, она требует гораздо мень- нариев PKGBUILD находится за рамшего внимания. В первом приближе- ками данной статьи. О том, как писать сценарии нии (особенно если вы не собираетесь пересобирать пакеты вручную) можно PKGBUILD, можно узнать из докуменвообще забыть о ее существовании. тации, поэтому ограничимся лишь об- Заключение Но я бы рекомендовал все же синхро- щими замечаниями: Теперь вы представляете себе, что танизировать дерево ABS, так сказать,  В первую очередь необходимо ис- кое Arch Linux. Устанавливать ли эту на будущее. Эта задача выполняетправить значение переменных систему на свой компьютер – решать pkgname (имя пакета) и pkgver (вер- только вам. Думается, что Arch Linux ся командой abs, которая в свою очередь использует cvsup, поэтому босия). Эти переменные используют- хорошо подойдет «продвинутым польлее-менее заметный трафик (порядся для заполнения массива source, зователям» Linux, которые произвосодержащего имена архивов с ис- дят большую часть настроек из конка 10-20 Мб без учета сжатия) будет сгенерирован только в первый раз. ходными текстами. Если формат фигурационных файлов и не слишВы же получите в свое распоряжение нужного вам архива отличается ком связаны временными рамками, полностью готовый к использованию от .tar.gz, нужно внести соответс- то есть могут позволить себе «довокаталог /var/abs, а также два файла: твующие изменения. дить» систему в свободное от рабоPKGBUILD.proto и install.proto, которые  Естественно, необходимо описать ты время. можно использовать для компиляции саму процедуру сборки – подпроЕсли же, напротив, речь идет о своих собственных пакетов. грамму build(). В большинстве слу- предприятии, где на первый план выЭта операция (как, впрочем, и чаев требуется лишь изменить па- ходит скорость развертывания, пропересборка уже имеющихся в сисраметры configure. стота управления, «дуракоупорность» теме пакетов) происходит следую-  Необходимо сгенерировать md5- и уж тем более сертификация стощим образом. Вы переходите в подсуммы для каждого архива – мас- ронних производителей, Arch Linux – каталог /var/abs, отвечающий нужносив md5sums. К счастью, эта зада- не самый лучший выбор. В общем, есму вам приложению. Если речь идет ча автоматизирована и выполняет- ли вы ищете простой настольный/серо компиляции нового пакета «с нуся стандартной командой: верный дистрибутив с большим коля», каталог для него следует создать личеством свежих пакетов, не отягоmakepkg -g >>PKGBUILD в /var/abs/local. Затем в этом катащенный средствами автоматической логе последовательно размещаютнастройки и связанным с ними «жирся: добытый где-либо архив с исходПри этом подразумевается, что вы ком», возможно, Arch Linux – это то, ными текстами программы в любом находитесь все в том же подкатало- что вам нужно.

46


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

№5, май 2006

47


человек номера

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

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

Ч

то такое судьба? Нечто навечно впечатанное в таинственные скрижали и определяющее каждый наш шаг? Или туманное будущее, неизвестное никому? Хочется верить, что ты сам себе хозяин, только от тебя зависит выбор профессии, семьи и прописки…

ществования порой похожи на кадры из детектива с захватывающим сюжетом. Первый раз компьютер, тогда это называлось «электронно-вычислительная машина», Алеша Сальников увидел в подростковом возрасте, когда учился в физико-математической школе-интернате №18 при МГУ им. Ломоносова. Представьте себе картину: Как в кино Знаки судьбы Алексей Михайлович 15-летние мальчишки входят в комнаСальников встречает регулярно. И по- ту, где шумят какие-то механизмы, мижаловаться на скучную жизнь никак гают лампочки, как на космическом коне может. Наоборот, перипетии его су- рабле, телетайп выводит рулоны бума-

48

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


человек номера чина должен быть всегда хорошо вы- грузилась какая-то страничка. Однако брит и прилично одет. Сам он ходил на представить, как это выглядит на норзанятия в безукоризненно отутюжен- мальной скорости, было несложно… ном костюме, сверкающей белизной Я всегда в нашей фирме занимался рубашке и галстуке. На занятиях по вопросами продвижения наших курсов. начальной военной подготовке учени- Это была моя главная обязанность. ки школы-интерната не просто любо- Когда я увидел, как работает Интервались ЭВМ, но и учились ею пользо- нет, сразу сказал: «Это место для рекваться: делали лабораторные работы, ламы». А в 1997 году мне совершенписали программки. но случайно попалась книга английСледующий кадр. Наш герой уже ского автора об интернет-маркетинучится в университете, успел прой- ге. И в нашем офисе как раз появилти армию и даже поучительствовать ся плохонький, медленный, но все же в глухом селе на Смоленщине. На 4-м выделенный канал. Бизнес есть бизкурсе практику Алексей Сальников нес. Я прочитал книжку, мне стало инпроходил на ЗИЛе, в суперсовремен- тересно. Следующий шаг – я объявляю ном вычислительном центре, создан- курсы интернет-маркетинга. 60 взросном автозаводом и Академией на- лых умных людей приезжают слушать ук. «Там было красиво, – вспомина- мои лекции. Каждый платит 300 долет он мечтательно. – В стране таких ларов за то, чтобы меня три дня слувычислительных центров практичес- шать. Несколько лет я такой курс чики не было, разве что в закрытых уч- тал. Мне было интересно изучать эту реждениях, в «ящиках». Сотрудники тему. В конце 90-х годов я был главным центра с нами говорили уважитель- специалистом в России по интернетно. Видно было, что это правильные маркетингу. Потом я стал проводить люди, с ними было приятно общаться. конференции по интернет-маркетингу. И возникало желание там трудиться. Толпы народа собирались. Хотя на перЯ два года параллельно с обучением вых конференциях было очень немного работал в центре. А после, как закон- людей, способных сказать что-то внятчил мехмат МГУ, туда же и распреде- ное на эту тему». Тогда же организаторы Учебнолился. В конце 80-х там были сделаны знаменитые компьютеры семейс- го центра решили, что хорошо бы тва БЕСТА. Был огромный коллектив. на практике воплотить теоретические Часть людей занимались «железками», положения, о которых говорилось на их часть – программами. Если бы эту ли- курсах, и создали ЦИТ Форум. Проснию продолжать дальше, все было бы то для того, чтобы рекламировать свои хорошо. Но линия, к сожалению, не по- курсы. Как резюмирует сегодня Алеклучила развития». сей: «ЦИТ Форум возник из небанальНовый скачок во времени. Середи- ного подхода к рекламе своей продукна 90-х. Алексей Сальников – руково- ции. Потом продукция исчезла, а инсдитель первого в России коммерческо- трумент остался». Сегодня портал го учебного центра, чрезвычайно попу- CITForum.ru – не имеющая аналогов лярного среди людей, внедряющих ин- техническая библиотека бесплатных формационные технологии в финансо- ресурсов по информационным техновую, промышленную и телекоммуника- логиям на русском языке. Но начало, начало – в этих трех ционную сферы. На учебный центр работают специалисты высокого уровня. кадрах истории жизни одного человеСреди них знаток Интернета, сотруд- ка. Алексей Сальников может со мной ник Курчатовского института. Как-то не согласиться, но я уверена, что эти он пригласил Алексея и его соратни- три эпизода – знаковые, и если бы я ков посмотреть, что такое Сеть. Стоп- снимала фильм об Алексее Михайкадр весьма выразительный, почти ис- ловиче, они были бы центральными торический: «Мы приехали, а как раз в картине. случилось несчастье. Тогда Интернет в Россию попадал через Финляндию. Огонь, вода И, как на грех, где-то под Питером эк- и медные трубы скаваторщик повредил провод. Поэто- Алексей сам себя называет генераму все очень медленно происходило. тором идей. Самая гениальная из них Мы смотрели на экран, где не спеша родилась в 1992 году, когда Алексей

№5, май 2006

с супругой Еленой решили открыть собственное дело. Родилась совершенно неожиданно, как побочный продукт другой авантюрной идеи. Сначала семейство рассуждало так: что могут делать и продавать программисты? Естественно, программы. Какие? Для банков, которые первые в стране разбогатели и первыми захотели автоматизироваться. Это же золотая жила – полторы тысячи банков, которым нужна специальная компьютерная программа под названием «Опердень». Стали собирать информацию – как функционирует банк, какой должна быть программа. Читали специальную литературу, свели дружбу с банкиром, который согласился предоставить свой маленький банк в качестве полигона для отработки этой программы, дать деньги на ее разработку. Увы, однажды банкир испарился. И советоваться стало не с кем. Что делать? Ходить на поклон в другие банки? Нет, сказал себе Сальников, надо… сделать так, чтобы банкиры сами пришли к нам. Все гениальное – просто. «Взяли листок бумаги, написали: семинар «Автоматизация банковской деятельности», 7-11 сентября 1992 года. Место проведения: Москва, Университет. Семинар платный. Указали номер телефона в комнатке, которую арендовали в университете. Купили базу данных с адресами банков, тогда она продавалась в редакции газеты «Коммерсантъ». Написали программу семинара, напечатали, разложили в конверты и отправили. Когда письма дошли, наш телефон просто разорвался. Звонили со всей страны из банков, спрашивали, как записаться, куда деньги переводить за участие. Почему получился такой эффект, понятно. Банкам надо было автоматизироваться, но никто не знал, как это делать. Мы были первые, кто предложил поучаствовать в семинаре на эту тему. Ну вот записали мы желающих участвовать, теперь надо семинар проводить. О чем говорить? Стали звонить в IBM, Hewlett-Packard, другие крупные компании, отправляли им по факсу список банков и говорили: «Эти господа желают вас выслушать». Они согласились выступить». Алексей Сальников смеется, когда вспоминает первый семинар. Заявок тогда набралась добрая сотня.

49


человек номера

Пригласили только 16 банков, которые оказались в списке первыми, но в аудиторию, арендованную в Московском университете, набилось человек тридцать, только успевали стулья подносить. Финансисты были непреклонны: мы приехали и мы будем участвовать в семинаре, возьмите деньги и дайте нам возможность послушать! Семинар длился целую неделю. Банкиры остались им довольны. А организаторы Центра информационных технологий… проснулись знаменитыми, как пишут в биографиях знаменитых актеров. Их офис на военной кафедре факультета ВМК МГУ на ближайшую пятилетку стал самым популярным местом для банкиров, разработчиков банковского софта, а позже – представителей крупных промышленных предприятий, которые интересовались информационными технологиями и их применением в прикладных областях. Идея писать банковские программы тихо умерла. Зачем, если можно зарабатывать на семинарах? Семинары и конференции – это первое направление работы Центра информационных технологий. С 1992 года они проводились регулярно, темы выбирались самые горячие, докладчики приглашались самые актуальные. Более того, в какой-то момент офис ЦИТа стал штабом общения для конкурирующих фирм, которые автоматизировали банки. Рабо-

50

чая группа из их представителей, вырабатывающая стандарты обмена информацией, заседала в ЦИТе. А самого Алексея Михайловича приглашали занять пост в Ассоциации производителей банковского софта… Второе направление – учебные курсы по информационным технологиям (citmgu.ru), которые читаются и по сей день, но, естественно, в эпоху обилия информации об IT и Интернете, уже далеко не столь популярны. А в 1993-1994 годах, вплоть до 1998-го, на курсы в Москву ехали так же массово… как раньше в московские магазины за колбасой, простите за такое приземленное сравнение. Потому что здесь можно было услышать людей, которые знали все про IT, потому что только здесь можно было купить книги о сетях, операционных системах, базах данных и прочем. Дело было организовано умно и оперативно. Были собраны лучшие специалисты, которые в рекордно короткие сроки писали методички по своим предметам. Например, трехсотстраничная книжка создавалась за три месяца! Сдавали свои учебники спецы по частям. Так что когда из-под пера автора выходили последние строки, первые главы уже были не только отпечатаны, прочитаны корректорами, оформлены, проиллюстрированы нужными схемами, картинками и табличками, но даже размножены в соответствии с количеством слушателей.

Потом приезжали «студенты» и получали на руки две книги. Одна – краткое изложение лекций, другая – сборник слайдов, которые преподаватели показывали в ходе учебы. Слушатели ничего не записывали в тетради, учителя ничего не писали на доске. На это не было времени. Предельная автоматизация организации учебы, оперативность подачи информации принесли ЦИТу оглушительный успех. Некоторые сотрудники отделов автоматизации банков и крупных предприятий приезжали просто купить книги. Ценообразование было простое: доллар за страницу… И покупали с большим удовольствием. В эйфории успеха Алексей Сальников и его коллеги не заметили, как поток слушателей резко уменьшился, опомнились только когда он совсем сошел на нет. Наступили другие времена. Однако судьба, благосклонная к Алексею, приготовила ему «задел» для создания нового дела. Тот самый сайт в Интернете, который когда-то вывесили для рекламы курсов. IT-портал стал новым делом Алексея. И тоже, естественно, уникальным, ведь делать что-то как все – неинтересно!

Новый Макаренко Сегодня Алексей Сальников знает о своей новой сфере деятельности все. Как работать с рекламодателями, как строить работу портала. Хотя при-


человек номера

знается, что никогда не думал зани- питателем, то есть наблюдать за ре- мент увенчался успехом. Благодарный маться изданием СМИ и получать до- бятами с первого по восьмой класс, мальчишка потом своего учителя даходы от рекламы! А мне такой поворот которые приезжали в этот интернат же на тракторе катал. Потом Алексей судьбы в жизни нашего героя совсем из мелких окрестных сел на неделю. восстановился в университете, законне кажется неожиданным. Ведь глав- У Сальникова самые приятные воспо- чил его, далекая смоленская деревня ная задача IT-портала ЦИТ Форум – да- минания о том периоде жизни: «На- ушла в прошлое… Но с тех пор, как мне кажется, нивать людям знания. Библиотекой пор- до было прийти после уроков в шкотала ежедневно пользуются тысячи лу, забрать детей, сводить на обед, чем другим Алексей Сальников в жизIT-специалистов и менеджеров, пре- потом поиграть с ними, потом они са- ни не занимается. Учит и учит неграподавателей и студентов вузов. Поч- дились делать уроки, я их консульти- мотных «мальчишек» тому, без чего ти везде информационные техноло- ровал. Времени свободного у меня сегодня не обойтись, как раньше негии преподают с помощью ЦИТ-Фору- был вагон. Развлечений не было ни- льзя было обойтись без элементарма. Преподаватели готовятся к лек- каких. Была библиотека. Я брал там ной грамоты. Сам Алексей рассуждает скепциям по скачанным материалам, да- книги, например, сочинения Макаренют студентам не домашние задания, ко, шел домой – а я арендовал в этой тически: «Я знаю людей, моих одноа ссылки на ресурсы ЦИТ Форума. Так деревне избу с огромной русской печ- классников, которые добились гораздо что ничего не изменилось кардиналь- кой в пол-комнаты – ложился на печ- большего, возглавляют крупнейшие ITно в деятельности Алексея Сальнико- ку и читал. Детишки были счастливы, компании. По масштабам бизнеса они ведь до этого их воспитывали скуч- заведуют крейсерами. А у меня – лова. Он по-прежнему учит народ. А ведь будучи студентом, Алексей ные пожилые бабушки. А я с ними иг- дочка…» Но именно эта лодочка вывомог легко угадать, что судьба ему при- рал в футбол…». дит корабли в бурное море IT-технолоНо даже не в этом был знак судьбы- гий. Без нее, возможно, ни один крейготовила именно эту миссию – просветителя. Звучит патетически, но истина благодетельницы, а в том, что, будучи сер не сдвинулся бы с места. Ну, или всегда немного банальна. Исключен- воспитателем, Алексей научил читать сделал бы это значительно позже. Неплохую альтернативу предлоный из университета на третьем кур- одного деревенского мальчика. Пасе, недоучившийся математик подался рень учился в пятом классе и для крес- жила Алексею Сальникову судьба – в учителя. Приехал в Смоленскую об- тьянской жизни имел все необходи- быть на 100% востребованным. Ни он, ласть, явился в облоно, оттуда его от- мые навыки – классно водил трактор ни кто другой не знает, каким конкретправили в дальнюю школу, где не было и профессионально курил «Беломор». ным делом будет заниматься сегодучителя математики. Доехал до шко- А вот читать в начальной школе ребен- няшний директор ЦИТ Форума через лы и… попал в тупик: учителя иска- ка не научили – просто с учительни- полгода. Но я убеждена, что работать ли летом, а он приехал в январе. Ко- цей они не встречались никогда, доку- он будет вновь под грифом «Впервые нечно, вакансию давно уже худо-бед- мент выдали, чтобы не портить цифры в России» и обязательно – просвещать. но закрыли… Ехать назад не хотелось, успеваемости по району. Занимались Попутного ветра в парусах! и Алексей согласился на предложения Алексей Михайлович и неграмотный Оксана Родионова директора школы-интерната стать вос- пятиклассник после отбоя. Экспери-

№5, май 2006

51


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

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

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

52


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

Ф

ильтры пакетов вроде ipchains во время работы используют самые простые критерии, и д ля фильтрации основываются на информации, содержащейся в заголовках IP-пакетов: IP-адреса источника и назначения, протокол и номера портов источника и назначения, взятые с TCP/UDP-протоколов следующего уровня. По сегодняшним меркам такой подход может обеспечить только самую минимальную защиту. Система защиты, использующая этот принцип, не владеет более подробной информацией о соединении. И приняв пакет, не может определить – устанавливается новое соединение либо пришедший пакет является частью уже установленного соединения, а может, это вообще случайный или враждебный пакет. Так работал ipchains, используемый совместно с Linux-ядром серии 2.2. В Netfilter/iptables ядра 2.4/2.6 эта проблема решается за счет контроля состояния (stateful) флагов и порядковых номеров ТСР. Такой фильтр работает аналогично предыдущему и дополнительно просматривает флаги TCP и UDP-пакетов, а поэтому может определить, является ли этот пакет попыткой установления нового соединения. Если да, то в таблице состояний делается новая запись и действие разрешается, если нет, то проверяется принадлежность существующим соединениям и при положительном результате пакет пропускается. Кроме явного отсеивания приходящего мусора, такие фильтры упрощают написание правил фильтрации. Например, если ранее требовалось явно разрешить в правиле оба направления, т.е. от клиента к серверу и от сервера к клиенту, то теперь достаточно просто разрешить соединение с сервером, забота же о доставке информации клиенту полностью ляжет на плечи фильтра пакетов. Кроме того, при использовании stateful-фильтров можно смело запрещать все соединения на номера портов выше 1024. Но опять же при всех положительных качествах контроль состояний не сможет защитить сервер от атак, направленных на конкретное приложение. Например, никто не помешает злоумышленнику послать за-

№5, май 2006

Рисунок 1. Принцип работы Zorp

прос большой длины или попробовать реализовать с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-соединения. То есть когда пользователь подключается к веб-серверу, последний отсылает ему сертификат, прокси может перехватить этот сертификат и отправить пользователю свой. Теперь, находясь посередине, можно беспрепятственно контролировать любой трафик. Таким же образом можно автоматически

53


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

Версии Zorp

в файл /etc/apt/sources.list занести (для версии 3.0 woody) следующие строки: deb http://apt.balabit.hu/zorp-gpl-os/ ↵ zorp-os-3.0/3.0 security zorp-os common-gpl zorp-gpl deb http://apt.balabit.hu/zorp-gpl-os/ ↵ zorp-os-3.0/3.0 zorp-os common-gpl zorp-gpl

И дать команду на обновление и установку: # apt-get -u upgrade

В настоящее время доступны три версии Zorp: Zorp Pro, Zorp GPL и Zorp Unofficial. В случае использования других дистрибутивов придется Zorp Unofficial ранее играл роль тестовой бета-версии, немного потрудиться, пересобрав все компоненты с исходно последние два года фактически не развивается, его мож- ных текстов, найти готовые прекомпилированные пакеты, отличные от deb, мне не удалось. Так как межсетевой экран но свободно получить на сайте [3]. Самой продвинутой является коммерческий Zorp Pro, должен иметь минимум компонентов и тем более не иметь представляющий собой доработанный Debian, который компилятора, то устанавливаем базовую систему, а собираможно установить за 10 минут (без настройки). В его со- ем все остальное на отдельном компьютере. В первую очеставе имеются: редь необходимо пересобрать ядро, оставив только необходимые опции, а также утилиты iptables.  16 модулей, контролирующих свои протоколы; Версии ядра 2.2 уже имеют встроенный прозрачный  сервер управления (Zorp Management Server – ZMS), с помощью которого удобно создавать и настраивать прокси, и для его активации требуется только включить правила работы системы фильтрации, клиенты, при по- в меню «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: GPL-версия, распространяемая свободно, не имеет та# tar xzvf cttproxy-2.6.15-2.0.4.tar.gz ких богатых возможностей, в ней есть модули, позволя# tar xjvf linux-2.6.15.tar.bz2 ющие контролировать только 6 типов протоколов (HTTP, # cd linux-2.6.15 FTP, PSSL, TELNET, WHOIS, FINGER) и Plug. Последний работает без проверки протокола и поддерживает проПатчи для ядра находятся в каталоге patch_tree, не все токолы, использующие только один порт (SSH, MySQL, являются обязательными, достаточно установить только VNC, Microsoft Terminal Service, GOPHER, SMB/CIFS, TALK, 03-tproxy.diff. SYSLOG, RSYNC). Также в GPL-версии для SSL возможна # for i in ../cttproxy-2.6.15-2.0.4/patch_tree/ ↵ работа только с заранее сгенерированными ключевыми 0{1,2,3}*.diff; do cat $i | patch -p1; done парами. И готовьтесь к тому, что собирать и настраивать все это придется самостоятельно и вручную. Используя При конфигурировании в «Networking options → IP: версию Pro, относительно просто организовать однократ- Netfilter Configuration → ...» включаем «Connection tracking», ную аутентификацию (SSO – Single-sign-on authentication), «IP tables support», «Full NAT» и «Transparent proxying» с Zorp GPL сделать это невозможно. Осталось добавить, (см. рис. 2) с дополнительными опциями. В .config-файле что использование Netfilter налагает ограничение по опе- это выглядит так: рационной системе, здесь только GNU/Linux. Cам прокси CONFIG_NETFILTER=m в Zorp написан на языке С, а модули контроля – с примеCONFIG_IP_NF_TPROXY=m нением языка высокого уровня Python. CONFIG_IP_NF_MATCH_TPROXY=m

Установка Zorp GPL

CONFIG_IP_NF_TARGET_TPROXY=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_NAT=m

Балазс Шайдлер по совместительству является одним Кроме того, для прозрачного прокси необходим виртуиз майтайнеров Debian, поэтому самым простым способом установки является использование этого дистрибу- альный dummy-интерфейс. Проследите, чтобы во вкладке тива, который затем обновляется его до ZorpOS. Для это- «Network device support» был активирован пункт «Dummy го достаточно установить базовые пакеты Debian, затем net driver support». Если в процессе работы Zorp возник-

54


безопасность нут проблемы, то следует добавить отладочной информации. Заглянув в net/ipv4/netfilter/iptable_tproxy.c, найдете строку: #ifdef CONFIG_NETFILTER_DEBUG #define DEBUGP printk

То есть отладочный режим можно активировать глобально, поставив «CONFIG_ NETFILTER_DEBUG=y» либо заменив первую строку на: #if 1

В последних версиях модуль iptable_tproxy.o загружается автоматически при запуске по мере необходимости, если используете ядро версии 2.4 или более ранние 2.6, то загрузите его вручную при помощи modprobe. # modprobe iptable_tproxy.o # lsmod | grep -i tproxy iptable_tproxy ip_nat ip_conntrack ip_tables

14340 17600 45516 9624

0 1 iptable_tproxy 2 iptable_tproxy,ip_nat 1 iptable_tproxy

Если с ядром все в порядке, то следующим шагом модифицируем и пересобираем утилиты iptables, чтобы они могли работать с новой таблицей tproxy и новой целью TPROXY. В подкаталоге iptables лежат два патча. Один – для версии iptables 1.2.7a, второй – для 1.3 # 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

Zorp состоит из библиотеки libzorpll и собственно zorp. Последними версиями на момент написания статьи были libzorpll_3.1.2.2 и zorp_3.0.9.tar.gz. Каких-либо особенностей по их установке нет, делаем это обычным образом.

Настраиваем Dummy-интерфейс Во избежание недоразумений dummy-адрес не должен принадлежать реально существующему сетевому адресу. В Debian добавляем следующие строки в файл /etc/networking/interfaces: auto dummy0 iface dummy0 inet static address 10.2.3.4 netmask 255.255.255.255

В RedHat и клонах, а также SuSE это будет файл ifcfg-dummy0, лежащий в /etc/sysconfig/network: BOOTPROTO='static' IPADDR='10.2.3.4' NETMASK='255.255.255.255' STARTMODE='onboot'

И затем: # ifup dummy0

№5, май 2006

Рисунок 2. Для использования Zorp необходимо пересобрать ядро

В Slackware /etc/rc.d/ создаем файл /etc/rc.d/rc.inet4 такого содержания: #!/bin/sh DEVICE='dummy0' DHCP='no' IPADDR='10.2.3.4' NETMASK='255.255.255.255' PROBE='no' . /etc/rc.d/functions-network "$@"

И запускаем: # /etc/rc.d/rc.inet4 start

Starting network dummy0 as 10.2.3.4/255.255.255.255…

Настраиваем Zorp Для настройки Zorp используются три файла, которые по умолчанию должны лежать в /etc/zorp/. Файл instances. conf содержит список примеров Zorp, с которыми нужно работать, и запускаемые сценарием zorpctl. Другой файл, zorpctl.conf, содержит глобальные настройки, связанные с работой самого zorpctl (разрешение автоматического рестарта, pid файл, дополнительные аргументы командной строки). И третий файл, policy.py, хранит правила и политики, связанные с примерами. В файле zorpctl.conf можно пока ничего не трогать, параметры по умолчанию пригодны для работы. Рекомендую снять знак комментария лишь со следующих строк: CHECK_PERMS="1" CONFIG_DIR=/etc/zorp CONFIG_DIR_OWNER=root CONFIG_DIR_GROUP=zorp CONFIG_DIR_MODE=0750

Тогда при запуске утилиты zorpctl будут проверяться соответствующие разрешения. # 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

55


безопасность Для удобства предположим, что на межсетевом экране имеются три сетевых интерфейса:  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. следующие строки: local -v3 -p /etc/zorp/policy.py --autobind-ip 10.2.3.4 dmz -v3 -p /etc/zorp/policy.py --autobind-ip 10.2.3.4 internet --verbose=5 --policy /etc/zorp/policy.py ↵ --autobind-ip 10.2.3.4

Первое поле – это имя примера, выбранное произвольно. Для каждого имени можно использовать отдельный файл, но можно сконфигурировать многочисленные зоны в пределах единственного файла. Опции -v или --verbose показывают уровень оповещения, а -р или --policy – на файл политик. Возможны и другие параметры, либо можно просто привязать Zorp к определенному сервису. Вроде такого: zorp_ftp -v4 -p /etc/zorp/policy.py --threads 500 -- ↵ --no-auto-restart --fd-limit 1024 ↵ --process-limit 512

Теперь файл политик policy.py. Он состоит из двух секций. Первая является глобальной и описывает зоны, основываясь на адресах и сервисах. Во второй описываются сервисы, которые будут пропущены через прокси. Помните, мы имеем дело с Python, разделение на блоки у которого производится табуляцией и пробелами, поэтому рекомендую здесь быть очень аккуратными: Zorp.firewall_name = 'zorp.domain.com'

Подключаем модули для работы c протоколами http, ftp, ssl и plug: from from from from from

Zorp.Core import * Zorp.Plug import * Zorp.Http import * Zorp.Ftp import * Zorp.Pssl import *

Для примера разрешим доступ к серверу, находящемуся в DMZ, из локальной сети по протоколам http и для удаленного управления ssh, а из внешней сети – по 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=["*"])

И теперь сервисы. Описание сервиса состоит из исходной зоны, протокола и зоны назначения. Если услуга прозрачна и зона назначения не определяется, то ее описание опускается. После адреса указывается порт, на который iptables будет направлять пакеты, предназначенные для этого сервиса. 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

В отличие от других сервисов веб-сервис имеет конкретное расположение, поэтому направляем трафик internet_http при помощи DirectedRouter, а не TransparentRouter, как было в остальных случаях. Возможен вариант InbandRouter(), который соответствует непрозрачному прокси. 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")

Ниже определяются зоны с соответствующими адресами На первый взгляд, составлять правила очень непросто, и сервисами, которые они обеспечивают. Обратите внимание, что значения исходящих (outbound) и входящих (inbound) но если заранее распланировать ресурсы, к которым требусервисов выбираются относительно самой зоны, а не меж- ется организовать доступ, указать адреса и порты, то прасетевого экрана. Поэтому, например, если из Интернета вила напишутся относительно быстро. Для того чтобы не будут обращаться с запросом к веб-серверу, расположен- запутаться в номерах портов, лучше выбирать их примерному в DMZ, то это будет указано как outbound. В качестве но так: 22 → 50022 или 80 → 50080. Кроме того, на сайназваний допущенных сервисов можно выбрать любые, но те [3] и в документации проекта, можно найти ряд примепри большом их количестве очень легко запутаться, поэто- ров позволяющих организовать: HTTPS-прокси, в том чисму лучше выбрать такое описание, чтобы оно показывало ле и без шифрования трафика к серверу, включить адрес его суть. Также если, например, для локальных пользова- клиента в http-заголовок, избежать подбора пароля в ssh, телей разрешен доступ (outbound) к веб-серверу в DMZ (на- поддерживать виртуальный узел, ограничить полосу и незовем параметр local_http), то он должен быть обязательно которые другие. прописан и в inbound в записи dmz. Пустое значение означаВот так можно организовать фильтрацию содерет отсутствие параметров, т.е. фактически запрет сервисов, жимого URL http-запроса, для этого добавляем сервис а звездочка «*» означает разрешение всех сервисов, кото- local_internet_http и даем ему такое описание. рые описаны в файле, а не все, которые вообще возможны. from Zorp.Matcher import * Но здесь необходимо помнить, что Zorp обрабатывает только те пакеты, которые передают ему Netfilter и TPROXY. class IDHttp(HttpProxyURIFilter):

56


безопасность matcher=RegexpFileMatcher('/etc/zorp/http.black', ↵ '/etc/zorp/http.white') def config(self): HttpProxyURIFilter.config(self) self.transparent_mode = 1 def regexp(): Service("local_internet_http", IDHttp) Listener(SockAddrInet("192.168.0.1", 50090), ↵ " local_internet_http ")

Как видите, вначале на основе стандартного класса HttpProxyURIFilter, который определен в модуле Addon.py (по умолчанию в нем используются файлы blacklist-http и blacklist-http.ignore), был создан новый класс IDHttp, и затем применен при описания сервиса. Файлы http.black и http. white содержат список регулярных выражений, здесь можно указать URL, к которым необходимо запретить доступ, слова, при нахождении в запросе которых он будет прерываться. Например, добавив строку .*exe, можно запретить скачивать файлы с указанным расширением. Чтобы по ошибке не запретить доступ к ценным ресурсам, их стоит занести в http.white. Используя следующую конструкцию, можно организовать NAT средствами самого Zorp. 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'))]))

Если заглянуть в модули, то можно обнаружить, что контролю поддаются практически все основные параметры поддерживаемых протоколов, по которым можно организовать фильтрацию либо другую их обработку. Например, использовав следующую конструкцию, можно обработать код ответа 404, заменив его своим сообщением. 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 = 404 self.error_info = "Requested page was not accessible." return HTTP_RSP_REJECT

Построение правил iptables Таблица tproxy содержит все встроенные цепочки, наиболее естественно использовать PREROUTING. Самое простое правило, которое направит нужный пакет в Zorp, выглядит так: # iptables -t tproxy -A PREROUTING -j TPROXY --on-port 50080

Но чтобы не засорять Zorp мусором, отсеивая пакеты, которые не должны проходить через фильтр, средствами самого Netfilter, лучше указать интерфейс, с которого ожидается пакет, поэтому для каждого создадим свои цепочки. Остальные пакеты будут проходить в соответствии с политикой по умолчанию (-Р): # iptables -t tproxy -P PREROUTING ACCEPT

№5, май 2006

# iptables -t tproxy -P OUTPUT 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

И разрешаем прохождение по цепочке INPUT: # 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

Теперь можно запускать 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 – «AmpelSchaltung» – http://www.linux-magazin.de.

57


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

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

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

К

ак хитро я вас обманул! Ни о генах, ни о хромосомах речь здесь не идет. Искусственный интеллект отдыхает на задворках истории. Genetic – в переводе с греческого «общий». Генетический распаковщик – универсальный распаковщик, общий для всех упаковщиков/ протекторов. Кстати говоря, «General Motors» – это не «двигатели для гене-

58

ралов», а двигатели вообще. Почувс- перерасходу памяти и тормозит всю твуйте разницу! систему. Подробности – в статье «паТак о чем же мы будем говорить? ковать или не паковать», электронную Все больше и больше программ рас- копию которой можно бесплатно скапространяется в упакованном виде, чать с ftp://nezumi.org.ru). и совсем не потому, что так они заниУсложнить взлом, затруднить анамают меньше места или загружают- лиз – вот для чего на самом деле исся быстрее, как это обещают разра- пользуются упаковщики, в конечботчики упаковщиков (на самом деле ном счете превратившиеся в проупаковка приводит к значительному текторы.


безопасность Одно и то же оружие используется как против хакеров, так и против легальных исследователей. Вирусы, черви, троянские кони практически всегда обрабатываются самыми последними версиями полиморфных протекторов, для которых распаковщики еще не написаны, и прежде чем антивирус научится распознавать заразу, программистам приходится проделать колоссальный объем работы. Существуют и другие мотивы, побуждающие распаковать программу: многие протекторы отказываются работать в присутствии пассивных отладчиков, не дружат с виртуальными машинами и эмуляторами… Но не будем философствовать на моральные темы, лучше поговорим о деле. А говорить мы будем преимущественно о PE-файлах NT-подобных системах (включая 64-битные редакции оных), в UNIX-мире упаковщиков намного меньше, но все-таки они есть (взять хотя бы Shiva ELF-protector). Если не углубляться в «политические» тонкости разногласий между UNIX и Windows, алгоритм распаковки – тот же самый, поэтому не будем на нем останавливаться, а поскорее ринемся в бой!

Предварительный анализ Прежде чем приступать к распаковке, не помешает убедиться: а упакована ли программа вообще? Графическая версия IDA Pro поддерживает специальную панель «overview navigator», позволяющую визуализировать структуру дизассемблерного кода. В нормальных программах машинный код занимает значительную часть от общего объема, остальная часть приходится на данные (см. рис. 1). В упакованных программах кода практически нет, и все пространство занято данными (см. рис. 2), объединенными в один (или несколько) огромных массивов, которые IDA Pro не смогла дизассемблировать. Впрочем, визуализация – довольно расплывчатый критерий. Существует сотни причин, по которым IDA Pro отвергает неупакованный код или, напротив, рьяно бросается дизассемблировать упакованную секцию, получая кучу бессмысленных инструкций, пример которых приведен в листинге 1:

Рисунок 1. Структура нормальной, неупакованной программы

Рисунок 2. Структура упакованной программы

Рисунок 3. Раскладка секций неупакованного файла

Рисунок 4. Раскладка секций упакованного файла

Листинг 1. Пример бессмысленного (зашифрованного/упакованного) кода 01010072h 01010079h 0101007Ah 0101007Bh 0101007Ch 0101007Eh 0101007Fh 01010086h 01010088h 0101008Fh

imul ins ins outsd arpl push imul jb add add

esi, [edx+74h], 416C6175h byte ptr es:[edi], dx byte ptr es:[edi], dx [eax], ax esi esi, [edx+74h], 466C6175h short loc_10100ED gs:[ebx+5319Dh], cl [ebx], cl

Рисунок 5. Подсчет энтропии с помощью редактора HTE

программах присутствуют секции с именами .text, .CODE, Осмысленность – вот главный критерий! Если дизассем- .data, rdata, .rsrc и, что самое главное, виртуальный размер блированный код выглядит «дико» и неясно, если в нем при- (VirtualSize) кодовой секции практически всегда совпадасутствует большое количество привилегированных инструк- ет с физическим (PhysSize). К примеру, в «Блокноте», вхоций – скорее всего он упакован/зашифрован. Или… это код, дящем в штатную поставку NT, разница составляет всепредназначенный совсем для другого процессора (напри- го 6600h – 65CAh == 36h байт, объясняемых тем, что вирмер, байт-код виртуальной машины), а может… это хитрый туальная секция, в отличие от физической, не требует выравнивания (см. рис. 3). А теперь упакуем наш файл с пообфускатор такой. В общем, вариантов много. Попробуем взглянуть на таблицу секций (в hiew это де- мощью ASPack (или аналогичного упаковщика) и посмотлается так: <F8> – header, <F6> – ObjTbl). В нормальных рим, что от этого изменится (см. рис. 4):

№5, май 2006

59


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

Рисунок 6. Внешний вид утилиты PEiD, автоматически определяющий тип упаковщика/проектора

Ого! Сразу появились секции .aspack и .adata с именами, говорящими самими за себя. Впрочем, имена секций можно и изменить – это не главное. Виртуальный размер секции .text (7000h) в два раза отличается от своего физического размера (3800h). А вот это уже говорит о многом! На самом деле, создателю ASPack было лень использовать «правильную» стратегию программирования, вот он и выделил виртуальный размер заблаговременно. Существуют упаковщики, «трамбующие» упакованные секции так, что виртуальный размер совпадает с физическим, а необходимая память динамически выделяется в процессе распаковки вызовом VirtualAlloc. Еще можно попробовать измерять энтропию (меру беспорядка или ступень избыточности) подопытного файла. Популярный hex-редактор HTE это умеет (см. рис. 5). Чем больше значение энтропии, тем выше вероятность, что файл упакован и соответственно наоборот. Однако этот прием срабатывает далеко не всегда… Также хотелось бы обратить внимание на бесплатную утилиту PEiD (http:// peid.has.it), автоматически определяющую большинство популярных упаковщиков/протекторов по их сигнатурам (см. рис. 6), и даже пытающуюся их распаковать. Впрочем, с распаковкой дела обстоят неважно, и лучше воспользоваться специализированными распаковщиками или написать свой собственный (чуть позже мы покажем как).

Распаковка и ее альтернативы Позвольте задать дурацкий вопрос. В стремлении как можно быстрее распаковать программу, мы зачастую даже не успеваем задуматься: а зачем?! Сразу же слышу возражения: мол, упакованную программу невозможно дизассемблировать. Да, невозможно, ну и что? Зато ее можно отлаживать, ис-

60

пользуя классический набор техник, подробно описанный в «фундаментальных основах хакерства» (электронная копия лежит на 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), правящие программу «на лету» непосредственно в оперативной памяти, минуя диск. Возникает неоднозначная ситуация: с одной стороны, избежать распаковки в большинстве случаев все-таки возможно, но с другой – работать с распакованным файлом намного удобнее и комфортнее (хотя бы по чисто психологическим соображениям).

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

Алгоритм распаковки Как пишутся распаковщики? Здесь есть разные пути. Хакер может долго и мучительно изучать алгоритм работы распаковщика в отладчике/дизассемблере, а потом столь же долго и мучительно разрабатывать автономный распаковщик, корректно обрабатывающий исполняемый файл с учетом специфики конкретной ситуации. А вот другой путь: запускаем программу на «живом» процессоре (или под эмулятором типа BOCHS), определяем момент завершения распаковки и тут же сохраняем образ памяти на диск, формируя из него PE-файл. В результате получится универсальный распаковщик, который мы и собираемся написать, но прежде – немного теории, для тех, кто еще не умеет распаковывать программы «руками».

В поисках OEP Создание распаковщика начинается с поиска OEP (Original Entry Point – исходная точка входа). Наш депротектор должен как-то определить момент завершения распаковки/расшифровки «подопытной» программы – когда распаковщик выполнил все, что хотел, и уже приготовился передавать управление распакованной программе-носителю. Это самая сложная часть генетических распаковщиков, поскольку определить исходную точку входа в общем случае невозможно, вот и приходится прибегать к различным ухищрениям. Чаще всего для этого используется пошаговая трассировка, которой очень легко противостоять (чем большинство упаковщиков/протекторов и занимается). Немногим лучше с задачей справляются трассеры нулевого кольца. Справиться с грамотно спроектированным трассером средствами прикладного уровня (а большинство упаковщиков/протекторов работают именно там) практически невозможно, однако разработка ядерных трассеров – слишком сложная задача для начинающих, поэтому лучше использовать готовый, разработанный группой легендарного Володи с не менее легендарным WASM. Правда, коммерческая составляющая до сих пор неясна и доступ к трассеру есть не у всех.


безопасность цикл! Рассмотрим его повнимательнее (будьте уверены, тут есть чему поучиться): Листинг 2. Хитро оптимизированный цикл чтения строковых ресурсов

Рисунок 7. Снятие дампа с работающего «Блокнота»

На самом деле прибегать к трассировке никакой необходимости нет – одних лишь аппаратных точек останова для нашей задачи будет вполне достаточно. Иногда приходится слышать мнение, что работа с аппаратными точками останова возможна только из режима ядра, то есть из драйвера. Это неверно. В «записках мыщъх’а» (электронную копию которой можно свободно скачать с ftp://nezumi.org.ru) показано, как это сделать и с прикладного уровня, даже без прав администратора! На первом этапе в качестве основного экспериментального средства мы будем использовать «Блокнот» из комплекта поставки NT, сжатый различными упаковщиками (которые мы только сможем найти) и знаменитый отладчик soft-ice. Кодирование последует потом. Чтобы писать красиво и по сто раз не переписывать уже написанное и отлаженное, необходимо иметь соответствующий боевой опыт, для которого нам и понадобиться soft-ice.

Дамп живой программы Самый простой (и самый популярный) способ борьбы с упаковщиками – снятие дампа задолго после завершения распаковки. Дождавшись появления главного окна программы, хакер сбрасывает ее дамп, превращая его в PE-файл. Иногда он работает, но чаще всего нет. Попробуем разобраться почему. Возьмем классический «Блокнот» (которое в защищенности не обвинишь!) и, не упаковывая его никакими упаковщиками, попробуем снять дамп с помощью одного из самых лучших дамперов: Lord PE Deluxe (см. рис. 7). Процесс дампирования проходит успешно, и образовавшийся файл даже запускается (см. рис. 8), но… оказывается не совсем работоспособен! Исчезли заголовок окна и все текстовые надписи в диалогах! Если мы не сумели снять дамп даже с такого простого приложения, как «Блокнот», то с настоящими защитами нам и подавно не справиться! В чем же дело?! Расследование показывает, что исчезнувшие текстовые строки хранятся в секции ресурсов и, стало быть, обрабатываются функцией LoadString. Загружаем оригинальный notepad.exe в IDA Pro (или любой другой дизассемблер по вкусу) и находим цикл, считывающий строки посредством функции LoadStringW (суффикс «W» означает, что мы имеем дело со строками в формате Unicode). Ага, вот этот

№5, май 2006

; ebp - указатель на LoadStringW 01004825h mov ebp, ds:LoadStringW ; указатель на таблицу ресурсов 01004830h 0100482Bh mov edi, offst off_10080C0 01004830h loc_1004830: ; CODE XREF: sub_10047EE+65↓j ; грузим очередной указатель на uID в eax 01004830h 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 в ecx 0100483Ch mov ecx, [edi] ; увеличиваем длину считанной строки на 1 0100483Eh inc eax ; строка влезает в буфер? 0100483Fh cmp eax, ebx ; сохраняем указатель на буфер поверх старого uID ; (он больше не понадобится) 01004841h mov [ecx], esi 01004841h 01004841h ; позиция для следующей строки в буфере 01004843h lea esi, [esi+eax*2] ; если буфер кончился, то это облом 01004846h jg short loc_100488B ; переходим к следующему uID 01004848h add edi, 4 ; уменьшаем свободное место в буфере 0100484Bh sub ebx, eax ; конец таблицы ресурсов? 0100484Dh cmp edi, offst off_1008150 ; мотаем цикл пока не конец ресурсов 01004853h jl short loc_1004830

В переводе на русский это звучит так: «Блокнот» берет очередной идентификатор строки из таблицы ресурсов, загружает строку, размещая ее в локальном буфере и сохраняя полученный указатель поверх… самого идентификатора, который уже не нужен! Это классический трюк с повторным использованием освободившихся переменных, известный еще со времен первых PDP, если не раньше. А вы все Microsoft ругаете! «Блокнот» писал не глупый хакер, бережно относящийся в системным ресурсам и к памяти, в частности. Для нас же это означает, что снятый с «живой» программы дамп будет неполноценным! Вместо реальных идентификаторов строк в секции ресурсов окажутся указатели на память, направленные в «космос», но ведь загрузчик ресурсов, приведенный в листинге 2, ожидает реальных идентификатор и к встрече с указателями морально не готов! Это и есть та причина, по которой PE-файл, изготовленный из дампа, ведет себя неправильно. Впрочем, бывает и хуже. Во многих программах встречается конструктор вида: Листинг 3. «Защита» от дампинга живых программ // глобальная инициализированная переменная // (на самом деле присваивать нуль необязательно // поскольку все глобальные переменные «сами» // обнуляются при запуске программы) void *p = 0;

61


безопасность // выделить память, если она еще не выделена if (!p) p = malloc(BUF_SIZE);

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

Поиск стартового кода по сигнатурам в памяти Начинающие программисты считают, что выполнение программы начинается с функции main (на Си/Си++) или c ключевого слова begin (на Паскале). Первым всегда вызывается стартовый код (start-up code), устанавливающий первичный обработчик структурных исключений, инициализирующий RTL, вызывающий GetModuleHandleA для получения дескриптора текущего модуля и т. д. Тоже самое относится к DLL, главной функцией которой является DllMain. Существует огромное множество разновидностей startup кодов, выбираемых компилятором в зависимости от типа программы, ключей компиляции и т. д. Исходные тексты стартовых кодов, как правило, открыты. В частности, Microsoft Visual C++ хранят их в каталоге \Microsoft Visual Studio\VC98\CRT\SRC под именами crt*.*. Всего их около десятка. Ниже (см. листинг 4) в качестве примера приведен один из стартовых кодов компилятора DELPHI:

Листинг 4. Пример стартового кода на DELPHI CODE:00401EE8 start proc near CODE:00401EE8 push ebp CODE:00401EE9 mov ebp, esp CODE:00401EEB add esp, 0FFFFFFF0h CODE:00401EEE mov eax, offset dword_401EB8 ; Sysinit::InitExe() CODE:00401EF3 call @Sysinit@@InitExe$qqrpv CODE:00401EF8 push 0 … ; CODE XREF: start+B↓p CODE:00401D9C @Sysinit@@InitExe$qqrpv proc near CODE:00401D9C push ebx CODE:00401D9D mov ebx, eax CODE:00401D9F xor eax, eax CODE:00401DA1 mov ds:TlsIndex, eax CODE:00401DA6 push 0 ; lpModuleName CODE:00401DA8 call GetModuleHandleA CODE:00401DAD mov ds:dword_4036D8, eax CODE:00401DB2 mov eax, ds:dword_4036D8 CODE:00401DB7 mov ds:dword_40207C, eax CODE:00401DBC xor eax, eax CODE:00401DBE mov ds:dword_402080, eax CODE:00401DC3 xor eax, eax CODE:00401DC5 mov ds:dword_402084, eax ; SysInit::_16395 CODE:00401DCA call @SysInit@_16395 CODE:00401DCF mov edx, offset unk_402078 CODE:00401DD4 mov eax, ebx CODE:00401DD6 call sub_4018A4

Собрав внушительную коллекцию стартовых кодов (или выдернув ее из IDA Pro), мы легко найдем OEP простым сканированием дампа, снятого с «живой» программы. Загружаем полученный дамп в hiew и, перебирая сигнатуры всех стартовых кодов, находим, который из них «наш». Первый байт стартового кода и будет точкой входа в программу – OEP. Запоминаем ее адрес (в моей версии «Блокнота» она расположена по смещению 01006420h), загружаем упакованную программу в отладчик и устанавливаем аппаратную точку на исполнение по данному адресу – «BPM 1006420 X» (Внимание! По умолчанию отладчик ставит точку останова на чтение/запись, что совсем не одно и тоже!). Обогнув распаковщик, отладчик (или наш дампер, который мы чуть позже отважимся написать) всплывает непосредственно в OEP! Самое время снимать дамп! (Помнится, в далекие времена DOS существовал универсальный распаковщик, который запускал сжатый/защищенный exe-файл в режиме трассировки и определял переход к исполнению программы по коду в окрестности точки входа – более-менее специфичному для каждого из компиляторов. Затем сохранял дамп памяти и почти всегда получал рабочий файл. Правда, если запакованная программа писалась на Ассемблере (что в те времена было не редкостью) и, как следствие, имела уникальную «сигнатуру», результаты были менее впечатляющими. – Прим. ред.)

Пара популярных, но неудачных способов: GetModuleHandleA и fs:0

Рисунок 8. Нормально работающий «Блокнот» (сверху) и тот же самый «Блокнот» после вснятия дампа – все текстовые строки исчезли

62

Библиотека сигнатур – это, конечно, хорошо, но слишком хлопотно. Новые версии компиляторов выходят чуть ли не каждую декаду, к тому же разработчики зачастую слегка модифицируют start-up код, ослепляя сигнатурный поиск. Что тогда? Достаточно часто в этих случаях рекомендуется установка точек останова на API-функцию GetModuleHandleA («BPM GetModuleHandleA X») и на фильтр


безопасность структурных исключений («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 вызывается непосредственно из самого стартового кода! В час-

№5, май 2006

Рисунок 9. Функция 1010295h:CALL [EBP+F4Dh] это на самом деле GetModuleHandleA, вызываемая таким заковыристым образом

Рисунок 10. Подлинный вызов GetModuleHandleA из окрестностей OEP

тности, DELPHI помещает GetModuleHandleA в функцию @Sysinit@@InitExe$qqrpv, а вот она-то уже и вызывается стартовым кодом (см. листинг 4)! Это значит, что для достижения OEP, с момента «ловли» GetModuleHandleA нам придется раскрутить стек (команда «STACK» в soft-ice), поднявшись на один или два уровня вверх. Но на сколько конкретно подниматься? Чтобы ответить на этот вопрос, нам необходимо исследовать состояние стека на момент вызова файла. Остановив отладчик в точке входа EP (не путать с OEP, которую еще только предстоит найти), даем команду «D ESP» и смотрим (чтобы данные отображались не байтами, а двойными словами, необходимо сказать отладчику «dd»): Листинг 5. Состояние стека на момент вызова файла :d esp

63


безопасность 0023:0006FFC4 77E87903 FFFFFFFF 0011F458 7FFDF000

.y.w....X.......

:u *esp 0023:77E87903 E9470A0300

JMP

77EB834F

PUSH CALL

EAX KERNEL32!ExitThread

:u 77EB834F 0023:77EB834F 50 0023:77EB8350 E87A83FDFF

:d fs:0 0038:00000000 0006FFE0 00070000 0006E000 00000000

................

Адрес 77E87903h (для наглядности выделенный красным), указывает куда-то внутрь KERNEL32.DLL и команда («U *ESP») позволяет узнать куда. Ага, здесь расположен безусловный переход на «PUSH EAX/CALL KERNEL32!ExitThread». То есть на процедуру завершения программы. Со времен MS-DOS не так уж и многое изменилось. Там тоже на вершине стека лежал адрес возврата на exit, поэтому завершать работу программы можно не только Рисунок 11. Ловля OEP на обработчик структурных исключений через API, но и простой инструкцией RETN. Если стек сбалансирован, она сработает правильно. Кстати, пара адре- нова на фильтр структурных исключений: «BPM FS:0». Несов на вершине стека 77E87903h/FFFFFFFFh до боли на- обходимо сразу подготовить себя к огромному количеспоминает термирующий обработчик структурных исклю- тву ложных срабатываний (структурные исключения акчений (термирующий – то есть последний в цепочке), кото- тивно использует не только распаковщик, но и сама оперым она по сути и является, ибо содержимое двойного сло- рационная система), и чтобы закончить отладку до конца сезона, необходимо воспользоваться условными точкава FS:[00000000h] указывает как раз на нее. Сформулируем еще одно правило: признаком OEP явля- ми останова, ограничив диапазон срабатываний отладчиется ситуация FS:[00000000h] == ESP && *ESP == 77E87903h ка секцией .text. В нашем случае это будет выглядеть так: (естественно, этот адрес варьируется от системы к системе, «BPM FS:0 IF EIP < 0X100800» (предыдущую точку останои на каждой из них должен вычисляться индивидуально!). ва перед этим следует удалить), после чего можно смело Кстати, раз уж мы затронули структурные исключения, отправиться на кухню и варить пакетный рис, поскольку не мешает познакомиться с ними поближе. Практически за компьютером нам делать уже нечего. Даже незащищенный NOTEPAD.EXE вывалил окно откаждый стартовый код начинает свою деятельность с установки своего собственного фильтра структурных исклю- ладчика спустя... 713.34 секунды (см. рис. 11), что немногим больше 12 минут. Это же целая вечность для процессора! чений, записывая в ячейку FS:0 новое значение. (Для справки: эксперименты проводились на VMWare, заЛистинг 6. Установка нового фильтра структурных исключений пущенным под древним Pentium-III 733 МГц, современные в стартовым коде процессоры справляются с этой ситуацией намного быст; ← исходная точка входа рее – на то они и современные). .text:01006420 55 push ebp Но как бы там ни было, исходная точка входа найдена! .text:01006421 8B EC mov ebp, esp .text:01006423 6A FF push 0FFFFFFFFh Вот она, расположенная по адресу 10006420h! Как гово.text:01006425 68 88 18 00 01 push dword_1001888 риться, бери и властвуй! ; ← «наш» обработчик .text:0100642A 68 ; ← берем старый .text:0100642F 64 .text:01006435 50 ; ← ставим новый .text:01006436 64

D0 65 00 01 push фильтр A1 00 00 00 00 mov фильтр 89 25 00 00 00+ mov

loc_10065D0

eax, fs:0 push eax

Побочные эффекты упаковщиков, или Почему не работает VirtualProtect

fs:0, esp

Очевидно, чтобы распаковывать кодовую секцию программы, упаковщик должен иметь разрешение на запись (отсутствующее по умолчанию), а по завершению распаковки восстанавливать исходные атрибуты, чтобы программа выглядела так, как будто ее не упаковали. Помимо кодовой секции, необходимо восстановить атрибуты секции .rdata, доступной, как и следует из ее названия, только на чтение. Для манипуляций с атрибутами страниц Windows предоставляет функцию VirtualProtect. И это практически единственный путь, которым можно что-то сделать (не считая VirtualAlloc с флагом MEM_COMMIT, с которым связана куча проблем). Логично предположить, что функция VirtualProtect должна вызываеться после завершения распаковки в непосредс-

Попробуем отловить это событие?! А почему бы и нет! Только надо учесть, что, в отличие от API-функций, допускающих установку глобальных точек останова, точка останова на FS:0 должна устанавливаться из контекста подопытного приложения. А как в него попасть? Необходимо либо остановиться в точке входа в распаковщик (см. врезку «Что делать, если отладчик проскакивает точку входа в распаковщик»), либо установить точку останова на GetModuleHandleA, дождаться первого ложного всплытия отладчика, совершенного в контексте нашего приложения (в правом нижнем углу горит notepad), затем удалить точку останова на GetModuleHandleA и установить точку оста-

64


безопасность твенной близости от передачи управления на OEP. Означает ли это, что, установив точку останова на VirtualProtect, мы… А вот и нет! Из трех наугад взятых упаковщиков: ASPack, PE-Compact и UPX только PE-compact вызывал VirtualProtect для манипуляций с атрибуты секций (да и то совсем для других целей), а все остальные оставляли их открытыми на запись даже после завершения распаковки! Вопиющее нарушение спецификаций и неуважение к нормам хорошего поведения! Смотрите сами.

В неупакованном «Блокноте» (см. рибут C0000040h, то есть такой же, как рис. 13) секция .text имеет права у секции данных – с правом на запись, на чтение и исполнение (executable/ но без прав исполнения. А вот это уже нехорошо! Мало тоreadable/code), секция .data – чтение и запись (writeable/readable/инициализи- го, что в кодовую секцию теперь может рованные данные), секция .rsrc – толь- писать кто угодно, так еще на процеско на чтение (readable/инициализиро- сорах с NX/XD-битами файл, обрабованные данные). Короче, все как в при- танный ASPack, исполняться не будет! Система выбросит грозное предупрежличных домах. Теперь упакуем файл с помощью дение с намеком на вирус, и большинсASPack. Запустим его и, дож дав- тво пользователей попросту сотрут ташись окончания распаковки (на экра- кой файл от греха подальше, а это знане появляется главное окно програм- чит, что создатель упакованной промы), снимем с него дамп (см. рис. 14). граммы потеряет клиента (и правильВот это номер! Все секции имеют ат- но – незачем было паковать!).

Что делать, если отладчик проскакивает точку входа в распаковщик Берем исполняемый файл, загружаем его в 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> и вычис-

№5, май 2006

ляем адрес точки входа путем сложения Entrypoint RVA (в нашем случае – 10001h) с Image Base (в нашем случае 1000000h). Получается 1010001h. Если считать лень, можно просто нажать <F5>, чтобы hiew перенес нас в точку входа, сообщив ее адрес (однако это не срабатывает на некоторых защищенных файлах с искаженной структурой заголовка). Хорошо, адрес EP получен. Вызываем soft-ice путем нажатия на <Ctrl-D> и устанавливаем точку останова на любую API-функцию, которую вызывает наша программа (откуда – не суть важно). Это может быть и GetModuleHandleA («BPX GetModuleHandleA») и CreateFileA – да все что угодно! Выходим из soft-ice и запускам нашу программу. Отладчик всплывает по точке останова на API. Убедившись, что правый нижний угол отражает имя нашего процесса (если нет, выходим из softice и ждем следующего всплытия), устанавливаем аппаратную точку останова на EP, отдавая команду «BPX 0x1010001 X», где – 0x1010001 адрес точки входа в PE-файл. Выходим из soft-ice и перезапускаем программу. hint: soft-ice запоминает установленные точки вместе с контекстом отлаживаемой программы и не удаляет их даже после ее завершения. При повторном (и всех последующих) перезапусках, soft-ice будет послушно останавливаться на EP в точке останова. Ну разве это не здорово?! Внимание! Динамические библиотеки, статически скомпонованные с программой, получают управление до EP!!! Это позволяет защитам предпринять некоторые действия еще до начала отладки! Поэтому, если что-то идет не так, первым делом проверьте код, содержащийся в DllMain всех динамических библиотек.

Рисунок 12. Символьный загрузчик – хорошая штука, но не всегда работающая

65


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

Рисунок 13. Исходный «Блокнот»

мые (чтение/запись/исполнение), вдобавок ко всему «забывая» вернуть им исходные имена (которые, впрочем, никто не проверяет). Исключение совсем секция .rsrc – некоторые программы теряют способность находить ресурсы, если эта секция названа как-то иначе. Вердикт – все упаковщики несомненное зло)! Ни один из них не соответствует спецификациям на PE-файл, зато побочных эффектов от упаковки хоть отбавляй! (Удивительно, как упакованные файлы еще ухитряются работать.) Отсюда – устанавливать точку останова на VirtualProtect никакого смысла нет.

Универсальный прием поиска OEP, основанный на балансе стека

Рисунок 14. «Блокнот», упакованный ASPack

Вот мы и подобрались к самому интересному и универсальному способу определения OEP, который к тому же легко автоматизировать. Упаковщик (даже если это не совсем корректный упаковщик) просто обязан после распаковки восстановить стек, в смысле вернуть регистр ESP на его законное место, указывающее на первичный фильтр структурных исключений, устанавливаемый системой по умолчанию (см. листинг 5). Некоторые упаковщики еще восстанавливают и регистры, но это уже необязательно. Возьмем, к примеру, тот же ASPack и посмотрим в его начало (см. листинг 7): Листинг 7. Точка входа в распаковщик ASPack

Рисунок 15. «Блокнот», упакованный PE-compact

Рисунок 16. «Блокнот», упакованный UPX

:u eip ; сохранить все регистры в стеке 001B:01010001 60 ; определить текущий EIP 001B:01010002 E803000000 ; спрятанные JMPS/POP EBP/INC EBP 001B:01010007 E9EB045D45 ; следующие 2 строчки «эмуляция» 001B:0101000C 55 001B:0101000D C3

PUSHAD CALL

0101000A

JMP 465E04F7 команды jmp 01010008h PUSH EBP RET

Замечательно! Первая же команда сохраняет все регистры в стеке. Очевидно, что непосредственно перед передачей управления на OEP они будут восстановлены командой POPAD, выполнение которой очень легко отследить, установив точку останова на двойное слово, лежащее выше верхушки стека: «BPM ESP – 4». Результат превосходит все ожидания (см. листинг 8):

К тому же в памяти по-прежнему болтаются секции Листинг 8. Передача управления на OEP .aspack и .adata, которые упаковщик не удосужился «подчистить». Это хоть и несмертельно, но все-таки неакку; ← на этой команде отладчик всплывает 001B:010103AF 61 POPAD ратно. 001B:010103B0 7508 JNZ 010103BA ↵ А вот PE-compact преподносит нам настоящий сюрприз (JUMP↓) 001B:010103B2 B801000000 MOV EAX,00000001 (см. рис. 15)! Секции .text и .data объединены в одну боль001B:010103B7 C20C00 RET 000C шую секцию с атрибутами (executable/readable/writeable/ ; ← адрес OEP 001B:010103BA 6820640001 PUSH 1006420 code/инициализированные данные), а секция .rsrc, кото; ← передача управления на OEP рая не должна (по спецификации!) иметь права на запись, 001B:010103BF C3 RET его все-таки имеет. Как говориться, с барского плеча ничего не жалко. Зато свои собственные секции PE-compact Распаковав программу, ASPack заботливо выталкиподчищает весьма аккуратно. вает сохраненные регистры из стека, вызывая всплыЧто же касается UPX (см. рис. 16), то в целом он дви- тие отладчика, и мы видим тривиальный код, передаюжется по пути PE-compact: кодовую секцию с секций дан- щий управление на OEP «классическим» способом через ных он не объединяет, но атрибуты им назначает те же са- «PUSH offset OEP/RET».

66


безопасность Поиск исходной точки входа не затратил и десятка секунд! Ну разве не красота?! А теперь возьмем UPX и проверим, удастся ли нам провернуть этот трюк и над ним? Ведь мы же претендуем на универсальный примем! Листинг 9. Так начинается UPX ; сохранить все регистры в стеке 001B:01011710 60 001B:01011711 BE00D00001 001B:01011716 8DBE0040FFFF EDI,[ESI+FFFF4000] 001B:0101171C 57

Код

Значение

00000004h

16-битные смещения кода

00000020h

code

00000040h

инициализированные данные

00000080h

неинициализированные данные

00000200h

комментарии или другая вспомогательная информация

PUSHAD MOV LEA

ESI,0100D000 ↵

00000400h

оверлей

00000800h

не подлежит загрузке в память

PUSH

EDI

00001000h

Comdat

00500000h

выравнивание по умолчанию

02000000h

может быть выброшено из памяти

04000000h

not cachable

08000000h

not pageable

10000000h

shareable

20000000h

executable

40000000h

readable

80000000h

writeable

Вот он, уже знакомый нам PUSHAD (см. листинг 9), сохраняющий все регистры в стеке и восстанавливающий их непосредственно перед передачей управления на OEP. Даем команду «BPM ESP-4» и выходим из отладчика, пока он не всплывет (см. листинг 10): Листинг 10. Так UPX передает управление на OEP 001B:0101185E 61 001B:0101185F E9BC4BFFFF (JUMP ↑)

Таблица 1. Расшифровка атрибутов секций PE-файла

POPAD JMP

01006420 ↵

Следующее всплытие отладчика (см. листинг 13), ниА вот и отличия! Передача управления осуществляется чуть не более осмысленное, чем предыдущее. Ясно толькомандой «JMP 1006420h», где 1006420h – исходная точ- ко одно: в стек заталкивается регистр EBP вместе с кучей ка входа. Похоже, что все упаковщики работают по одно- других регистров. Судя по всему, это распаковщик сохраму и тому же алгоритму и ломаются с реактивной скоро- няет их с одной лишь ему ведомой целью. Жмем <Ctrl+D> стью. Но не будем спешить! Возьмем PE-compact и прове- и ждем дальше – что нам еще покажут? рим свою догадку на нем. Листинг 11. Точка входа в файл, упакованный PE-compact 001B:01001000 B874190101 001B:01001005 50 001B:01001006 64FF3500000000 FS:[00000000] 001B:0100100D 64892500000000 FS:[00000000],ESP

MOV PUSH PUSH

EAX,01011974 EAX DWORD PTR ↵

MOV

Плохо дело (см. листинг 11)! PE-compact никаких регистров вообще не сохраняет, а «PUSH EAX» используется только затем, чтобы установить свой обработчик структурных исключений. Тем не менее на момент завершения распаковки указатель стека должен быть восстановлен, следовательно, точка останова на «BPM ESP-4» все-таки может сработать…. Листинг 12. Первое срабатывание точки останова на esp-4 001B:77F8AF78 FF7304 [EBX+04] 001B:77F8AF7B 8D45F0 001B:77F8AF7E 50

PUSH

DWORD PTR ↵

LEA PUSH

EAX,[EBP-10] EAX

Так, это срабатывание (см. листинг 12) явно ложное (судя по EIP, равному 77F8AF78h, мы находимся где-то внутри KERNEL32.DLL, использующим стек для нужд производственной необходимости), нажимаем <Ctrl+D>, не желая здесь больше задерживаться. Листинг 13. Кузьмич?! Где это я? ; ← эта команда вызывает всплытие 001B:010119A6 55 PUSH 001B:010119A7 53 PUSH 001B:010119A8 51 PUSH 001B:010119A9 57 PUSH

№5, май 2006

EBP EBX ECX EDI

Листинг 14. Переход на OEP :u eip-1 001B:01011A35 5D 001B:01011A36 FFE0

POP JMP

EBP EAX (01006420h)

А вот на этот раз (см. листинг 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) и начнем его пытать. Листинг 15. Многообещающая точка входа в упаковщик FSG 001B:01000154 001B:0100015A 001B:0100015B 001B:0100015C 001B:0100015D

8725B4850101 61 94 55 A4

XCHG POPAD XCHG PUSH MOVSB

ESP,[010185B4] EAX,ESP EBP

Разочарование начинается c первых же команд (см. листинг 15). FSG переназначает регистр ESP и хотя через некоторое время восстанавливает его вновь – особой радости нам это не доставляет. Упаковщик очень интенсивно использует стек, поэтому точка останова на «BPM ESP-4» выдает миллион ложных срабатываний, причем большинство из них относится к циклам (см. листинг 16):

67


безопасность Листинг 16. Фрагмент кода, генерирующий ложные срабатывания точки останова 001B:010001C1 001B:010001C2 001B:010001C3 001B:010001C4 001B:010001C5 001B:010001C6

5E AD 97 AD 50 FF5310

POP LODSD XCHG LODSD PUSH CALL

ESI EAX,EDI EAX [EBX+10]

Необходимо внести какое-то дополнительное условие (к счастью, 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): Листинг 17. Две секции упакованной программы MAP32 NOTEPAD-fsg NOTEPAD-fsg

0001 001B:01001000 00010000 CODE RW 0002 001B:01011000 00008000 CODE RW

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

68

В данном случае условная точка останова будет выглядеть так (см. листинг 18) : Листинг 18. «Магическая» последовательность, приводящаяся нас к OEP BPM ESP-4 IF EIP > 0X1001000 && EIP < 0X1011000

Невероятно, но после продолжительного молчания (а он и будет молчать, ведь стек распаковщиком используется очень интенсивно) отладчик неожиданно всплывает непосредственно в OEP (см. листинг 19)! Листинг 19. Отсюда начинается распакованный код исходной программы 001B:01006420 55 001B:01006421 8BEC 001B:01006423 6AFF 001B:01006425 6888180001 001B:0100642A 68D0650001 001B:0100642F 64A100000000 EAX,FS:[00000000] 001B:01006435 50 001B:01006436 64892500000000 FS:[00000000],ESP

PUSH MOV PUSH PUSH PUSH MOV

EBP EBP,ESP FF 01001888 010065D0 ↵

PUSH MOV

EAX ↵

Фантастика! А ведь FSG далеко не самый слабый упаковщик, фактически граничащий с протекторами. Однако данная методика поиска OEP применима и к протекторам. Выделяем секции, принадлежащие упакованной программе, и устанавливаем точку останова на ESP – 4 в их границах. Даже если стартовый код использует оптимизированный пролог, первый же регистр (локальная переменная заталкиваемая в стек), вызовет срабатывание отладчика. Если мы попадем не в саму OEP, то будет где-то очень-очень близко от нее... А найти начало оптимизированного пролога можно и автоматом! Таким образом, мы получаем в свои руки мощное оружие многоцелевого действия, которое легко реализовать в виде подключаемого модуля к LordPE, IDA Pro или самостоятельной утилиты. (Разработчикам упаковщиков на заметку: чтобы ослепить этот алгоритм, никогда не отделяйте код распаковщика от кода программы! Перемешивайте их в хаотичном порядке на манер «мясного рулета», тогда определять OEP по данной методике уже не получится, но методики, описанные выше, по-прежнему будут работать, если, конечно не предпринять против них определенных усилий).

Заключение Вот мы и научились находить OEP! Остается самая малость – сбросить дамп программы на диск. Но здесь не все так просто, как может показаться вначале, и многие упаковщики/проекторы этому всячески сопротивляются. В следующей статье мы покажем, как реализовать универсальный дампер, обходящий, в том числе и продвинутый механизм динамической шифровки, известный под именем CopyMemII, – это когда вся программа зашифрована и отдельные страницы памяти расшифровываются непосредственно перед их употреблением, а потом зашифровываются вновь. Также мы коснемся вопросов восстановления таблицы импорта и поговорим про распаковку DLL. В конечном счете получится мощный генетический распаковщик, обходящий всех своих конкурентов.


bugtraq Переполнение буфера в Mozilla Firefox Множественные уязвимости в 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) с сайта производителя.

Программа: Mozilla Firefox 1.5.0.2, возможно, более ранние версии. Опасность: Критическая. Описание: Уязвимость существует при обработке JavaScriptкода в библиотеках js320.dll и xpcom_core.dll. Удаленный пользователь может с помощью специально сформированной веб-страницы вызвать переполнение буфера и выполнит произвольный код на целевой системе. Пример: <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>

URL производителя: www.mozilla.com. Решение: В настоящее время способов устранения уязвимости не существует.

Множественные уязвимости в 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 . Решение: Установите исправление с сайта производителя.

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

№5, май 2006

69


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

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

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

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

70

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

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

Алгоритм RSA. Теория Криптосистема RSA, пред ложенная в 1977 году Ривестом (R. Rivest), Шамиром (A. Shamir) и Адлеманом (L. Adleman), предназначена для шифрования и цифровой подписи. В настоящее время RSA является наиболее


безопасность распространенной криптосистемой – стандартом де-факто полнялось уравнение [2]. Для этого с помощью алгоритма для многих криптографических приложений. Криптосисте- Эвклида ищем значения d и v, удовлетворяющие соотнома RSA широко применяется в составе различных стандар- шению [4]. Суть алгоритма сводится к проведению послетов и протоколов Интернета, включая PEM, S/MIME, PEM- довательности операций деления с остатком. В соответсMIME, S-HTTP и SSL. твии с алгоритмом находим частное и остаток от деления Криптографическая стойкость алгоритма RSA основа- ϕ(n) на e: на на трудоемкости разложения на множители (факториза192 = 7 * 27 + 3 ции) больших чисел. Термин «большие» означает, что число содержит 100~200 и более двоичных разрядов. Открытый и секретный ключи являются функциями двух больших Частное равно 27, остаток – 3. Теперь последовательпростых чисел. Рассмотрим на примере, как выполняется но делим делитель на остаток (т. е. 7 на 3 в данном случае) генерация ключей алгоритма RSA, но вместо больших чи- до тех пор, пока в остатке не получим единицу: сел для простоты изложения будем использовать малень7 = 3 * 2 + 1 кие десятичные. Для генерации парных ключей используются два случайных простых числа, p и q. Вычисляется произведеА теперь распишем процесс получения остатка в обние этих чисел n и значение функции Эйлера от числа n ратном порядке: по формуле: 1 = 7 – 3 * 2 = 7 – (192 – 7 * 27) * 2 = 7 – (192 * 2 – 7 * 2 * 27)

φ(n)=(p-1)(q-1)[1]

Раскроем скобки: Далее выбирается ключ шифрования e такой, что e 1 = 7 + 7 * 54 – 192 * 2 = 7 * 55 – 192 * 2 и значение функции Эйлера ϕ(n) являются взаимно простыми числами, т.е. числами, не имеющими общих делителей, кроме единицы (единицу еще называют тривиальным делиВ итоге получаем искомые числа d=55 и v=2. Числа телем). Теперь необходимо найти значение ключа дешиф- d=55 и e=7 являются взаимно обратными по модулю 192, рования d такое, чтобы выполнялось равенство: что подтверждает равенство: ed = 1(mod φ(n))

[2]

или d = e-1(mod φ(n))

[3]

Уравнение [2] означает, что остаток от деления произведения чисел e и d на значение функции Эйлера ϕ(n) должен быть равен 1. Условие [2] выполняется только в том случае, если e и ϕ(n) являются взаимно простыми числами. Число d называется взаимно обратным к e по модулю ϕ(n). Уравнение [2] эквивалентно обнаружению таких d и v, что: ed + φ(n)v = 1 [4]

7 * 55 = 1(mod 192)

Учитывая, что e=7 – это наш ключ шифрования, то число d=55 будет ключом дешифрования. Теперь разберемся, как выполняются операции шифрования и дешифрования информации по алгоритму RSA. Для шифрования исходное сообщение необходимо представить в виде последовательности чисел, содержащихся в интервале от 0 до n. Для примера, разобьем аббревиатуру ABC на числа в интервале (0,221). Для этого достаточно каждый символ записать в десятичном представлении: A=41h=65, B=42h=66, C=43h=67

Шифрование сводится к вычислению: Поиск обратного значения числа по модулю выполняется при помощи алгоритма Эвклида. Этот алгоритм позволяет найти наибольший общий делитель (НОД) двух чисел. Рассмотрим пример. Пусть у нас имеются два простых числа: p=13 и q=17. Найдем произведение этих чисел: n = 13 * 17 = 221

и значение функции Эйлера от числа n=221: φ(n)=(p-1)(q-1)=(13-1)(17-1)=192

Теперь выберем такое число e, чтобы оно было взаимно простым с ϕ(n). Таким числом является, например, e=7. Далее надо найти обратное значение числа e, чтобы вы-

№5, май 2006

Ci = Mie(mod n)

Здесь Mi – это i-й блок сообщения, Ci – результат криптопреобразования. Выражаясь простым языком, мы должны возвести значение Mi в степень e и найти остаток от деления на n. Зашифруем нашу последовательность (65,66,67), зная, что e=7 и n=221: C1 = 657(mod 221) = 91 C2 = 667(mod 221) = 144 C3 = 677(mod 221) = 50

В зашифрованном виде наша последовательность будет выглядеть как (91,144,50).

71


безопасность Для дешифрования необходимо выполнить следующую операцию: Mi = Cid(mod n)

Дешифруем последовательность (91,144,50) при d=55 и n=221: M1 = 9155(mod 221) = 65 M2 = 14455(mod 221) = 66 M3 = 5055(mod 221) = 67

Таким образом, исходная последовательность восстановлена. Шифрование 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: #define BN_ULONG unsigned char typedef 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;

Приведем краткий перечень функций библиотеки для работы с большими числами:  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);

72

 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 следующего вида: RSA *RSA_generate_key(int num, unsigned long e, ↵ void (*callback)(int,int,void *), void *cb_arg);

Параметры функции:

 int num – размер ключа в битах;  unsigned long e – это то самое число e, с которым мы познакомились в пункте 2, когда рассматривали теоретические основы алгоритма RSA. Этот параметр обычно принимает значения 3, 17 или 65537. Два последних параметра, указатели на функцию (*callback) и void *cb_arg, служат для предоставления обратной связи (feedback) с процессом генерации ключевой информации. Это, как правило, индикация хода выполнения операции генерирования ключей. Например, если мы выполним команду: openssl genrsa –out outfile 2048

то увидим, как на экране начнут появляться символы «.» и «+», отображающие процесс формирования ключей. Найдем в файле apps/genrsa.c исходных текстов библиотеки вызов функции RSA_generate_key: rsa=RSA_generate_key(num,f4,genrsa_cb,bio_err);

Третий параметр – функция genrsa_cb – находится в этом же файле и имеет следующий вид: 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);


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

№5, май 2006

73


безопасность #ifdef LINT p=n; #endif }

Как видно из текста этой функции, именно она выводит на экран символы «.» и «+», отображающие ход операции генерирования ключей. Результаты работы функции RSA_generate_key в виде открытого и закрытого ключа сохраняются в структуре типа RSA (см. include/openssl/rsa.h). Эти ключи необходимо извлечь и записать в файлы для дальнейшей работы с ними. Делается это при помощи следующих двух функций: 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);

Первая функция записывает в файл 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 бит. В целях экономии места код, выполняющий обработку ошибок, пропущен. Листинг 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");

74

/* Генерируем ключи */ 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); }

Если в вызове функции PEM_write_RSAPrivateKey мы вместо «hello» оставим NULL, то библиотека самостоятельно попросит наc ввести парольную фразу для шифрования секретного ключа.

Шифрование и дешифрование по алгоритму RSA Сформировав ключи, можно приступать к шифрованию данных. Для этого используется функция RSA_public_encrypt, которая имеет следующий прототип: int RSA_public_encrypt(int flen, unsigned char *from, ↵ unsigned char *to, RSA *rsa, int padding);

Эта функция шифрует flen байт из буфера, на который указывает параметр from, используя ключ из структуры RSA * rsa, и помещает результат в буфер to. Размер этого буфера должен быть равен размеру ключа, который определяется при помощи функции RSA_size(RSA *). Параметр padding используется для выбора режима выравнивания данных. В большинстве случаев используется значение RSA_PKCS1_PADDING, что соответствует стандарту PKCS#1. При использовании этого режима размер буфера from должен быть не меньше (RSA_size(rsa) – 11), т.е. на 11 байт меньше размера ключа. Размер выходных данных всегда будет кратен длине ключа. Следующая программа демонстрирует использование функции RSA_public_encrypt для шифрования данных. Листинг 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);


безопасность /* Шифруем содержимое входного файла */ 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);

Дешифрование данных выполняет функция RSA_private_decrypt: int RSA_private_decrypt(int flen, unsigned char *from, ↵ unsigned char *to, RSA *rsa, int padding);

Эта функция расшифровывает flen байт из буфера from, используя ключ rsa, и записывает результаты в буфер to. Следующий фрагмент программы демонстрирует использование функции RSA_private_decrypt для дешифрования данных. Листинг 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; /* Открываем входной и создаем выходной файл */

№5, май 2006

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

Работоспособность программ была проверена для ОС Linux Slackware 10.2, библиотека OpenSSL версии 0.9.7c Итак, вы разобрались с теоретическими основами алгоритма RSA и научились использовать некоторые функции библиотеки для защиты информации по этому алгоритму. Я говорю «некоторые», потому что этих функций в библиотеке очень много, и описать их в одной статье практически невозможно. Поэтому основным источником изучения средств библиотеки были и остаются официальная документация от разработчиков, а также любые исходные тексты программ, использующих эту библиотеку.

75


IMHO

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

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

Беглый взгляд со стороны Для начала – что такое лицензия на программное обеспечение? Дело в том, что программу трудно отнести к материальному объекту, поскольку она слишком легко и дёшево может быть растиражирована. Как следствие, её распространение сильно отличается от прочих товаров. Купив, скажем, утюг, вы становитесь его собственником и, в частности, можете отдать/продать кому-то ещё. Тогда у вас утюга уже не будет (т.е. спрос со-

76

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


IMHO мы, не создавая для пользователя никаких ограничений, решили бороться Отказ от ответственности за свободу своих детищ тем же оружи- Настоящая статья публикуется в соответсем, которое использовалось для огра- твии с принципом «как есть» (а не «как пить ничения этой свободы – лицензиями. дать»), что означает возможность налиНо, в противоположность коммерчес- чия в ней ошибок и заблуждений, хотя авким лицензиям, здесь явно указыва- тор и стремился этого избежать. Сам факт лось право пользователя распростра- публикации, а также указание на последнять программы любым способом, ис- ней странице журнала, что «За содержапользовать в любых целях, модифици- ние статьи ответственность несёт автор», ровать код и т. д. Наиболее известной свободной нейшего распространения, модификалицензией является разработанная ции, использования. в FSF (Free Software Foundation) лицензия GNU GPL (General Public License). GNU LGPL (Lesser GPL) Однако помимо неё существует мас- «Ограниченная» GPL, регламентируса других лицензий, в которых и по- ющая права на программные библипытаемся разобраться хотя бы в об- отеки. Содержит ряд пунктов, допускающих компоновку данной библиощих чертах. теки с программами, распространяемыми по другим лицензиям. РазработПредставляем главных чик библиотеки (или её модификации) игроков Сначала коротко познакомимся с ос- вправе перевести её на лицензию GPL, новными положениями наиболее рас- однако обратная процедура уже будет невозможна. пространённых открытых лицензий.

GNU GPL2 (GNU General Public License) Это детище Ричарда Столлмана (Richard Stallman), пришедшее в 1991 году на смену 1-й версии, имеет чётко поставленную задачу – не допустить «закрытия» программ, которые первоначально были выпущены как свободные. GPL предоставляет право свободно использовать, модифицировать и распространять программу, при обязательном условии, что вместе с ней будут распространяться и её исходные коды, включая все сделанные изменения, и по той же самой лицензии. Допускается не включать исходные коды в дистрибутив при условии, что их можно будет свободно получить в дальнейшем (например, скачав с ftp-сервера). Формально лицензия не требует от разработчика или дистрибьютора распространять программу бесплатно, но в свете обязательности предоставления исходных кодов взимание платы за «сборку» в какой-то степени теряет смысл. Здесь нужно сказать, что с GPL прочно связано ещё одно понятие – Copyleft. Это положение (в противоположность Copyright), согласно которому распространитель (т.е. правообладатель) программного продукта не вправе ограничивать свободу даль-

№5, май 2006

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

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

Формально всё это никоим образом не ущемляет прав разработчика открытой версии – он остаётся автором и владельцем кода и может его по-прежнему развивать и распространять, как ему вздумается. То есть все возражения против BSD сводятся, по сути, к апелляции к морали. Впрочем, это личное право разработчика – поступать со своим детищем так, как ему вздумается.

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

Artistic Под этой лицензией распространяются такие программы, как Razor, Perl (этот проект использует слегка модифицированную версию) и ряд других. Изменённый продукт может распространяться только в случае публикации в доступном виде модифицированных исходных кодов либо при условии, что все изменённые файлы будут переименованы. В принципе позволяет использовать программный продукт в коммерческих программах. FSF

77


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,

78

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. Впрочем, жизнь не стоит на месте, и когда-нибудь меняться придётся. Поживём – увидим.


IMHO Кому и зачем всё это надо

Казалось бы, ну есть какая-то про- Free as a beer? грамма, ну не берут денег за то, что я У нас таких проблем не возникает – поняпользуюсь ею… Ну вот и славненько! тия «бесплатное» и «свободное» ПО доКакая мне разница, что именно там за статочно чётко разделяются на лингвистическом уровне. В английском же язылицензия? С точки зрения обычного пользова- ке ситуация несколько иная, и говоря теля, так оно и есть. По большому счё- «free software», приходится уточнять, имету рассмотренные лицензии не явля- ется в виду «free as a beer» (бесплатное, ются так называемыми EUL (End User как пиво; нам бы такую аналогию в блиLicense), т.е. они не столько регламен- жайший ларёк) или «free as Kipelov» (помтируют права конечного пользователя, ните: «Я свободен, словно птица в небесколько права разработчиков и рас- сах…»). «Free» в первом контексте подрапространителей, которые будут ис- зумевает бесплатность программы, но при пользовать данную программу в сво- этом её использование может быть сильно их продуктах или предоставлять услу- ограничено (только для личного пользования, для ознакомительных целей, без праги на основе данного продукта. Системный администратор в ка- ва декомпиляции и т. д.). кой-то мере тоже является конечным пользователем. То есть его деятель- двойного лицензирования. Некоторые ность направлена не на модификацию производители, желая обеспечить бои распространение той или иной про- лее широкие возможности использограммы, а на соответствующую её на- вания своей программы, выпускают её стройку и дальнейшее сопровождение. под несколькими лицензиями. В качесКонечно, зачастую настройка связа- тве примера можно привести PC-BSD, на с модификацией продукта, но пос- распространяющуюся под лицензиями кольку результат этой модификации GPL и BSD. Или, например, MySQL, коредко выходит за пределы «личного» торая выпускается под GPL и под комиспользования, то вопросы лицензи- мерческой лицензией. Однако помимо прямой роли лирования здесь тоже особого значецензий на те или иные программы нения не имеют. А вот для разработчиков (даже ес- льзя забывать и о косвенных последсли разработка заключается в сборке твиях. Ведь это непосредственным обготовых программ и библиотек в один разом влияет на желание программисдистрибутив) вопросы лицензирова- тов заниматься разработкой открытых ния приобретают большое значение. программ и их распространением. С этой точки зрения лицензии, соКак вы видите, большинство открытых лицензий достаточно либераль- ответствующие «Copyleft», такие как ны, и особых проблем с использова- GPL, должны быть более привлеканием «покрываемых» ими продуктов тельны для разработчиков, поскольвозникнуть не должно. Единственное, ку гарантируют, что никто не сможет нужно не забывать о вопросах совмес- воспользоваться результатами их трутимости разных лицензий. Например, да в своих целях. Кроме того, «обратвы не можете распространять свою ная связь» в виде обязательного препрограмму под лицензией, не требу- доставления сообществу модифициющей открывать исходный код, ес- рованных исходных кодов способсли она основана или включает в себя твует более быстрому развитию пропрограммный продукт, распростране- граммы, поскольку подобный обмен ние которого требует соблюдения от- кодом позволяет использовать наилучкрытости. Парадоксально, но лицен- шие варианты. С другой стороны, лицензии в стизию QPL (Qt Public License), под которой распространяется библиотека Qt, ле BSD более удобны для дистрибьюFree Software Foundation относит к не- торов, поскольку позволяют использосовместимым с GPL. Впрочем, разра- вать такие программы и в коммерчесботчикам KDE, похоже, удалось обой- ких разработках. ти эту формальность. Кстати говоря, проблемы совмес- Ждём с нетерпением… тимости послужили причиной воз- Что ж, на сегодняшний день лиценникновения ещё одной особенности – зий действительно немало. Во многом

№5, май 2006

Во втором же случае понимается свобода программы в терминах лицензии GPL. Последнее время наметилась тенденция к использованию вместо термина «free software как Кипелов» формулировки «open source software» (открытое программное обеспечение, ПО с открытым кодом), что выглядит несколько лучше, но тоже допускает неоднозначность (можно открыть коды, но сопроводить это такой лицензией, что эти коды будет страшно трогать). Возможно, со временем гибкий и изворотливый человеческий ум придумает-таки однозначные формулировки, пока же будем уточнять: «Free as a beer?», «Open as Linux?».

они дублируют друг друга, отличаясь лишь незначительными особенностями, но преследуя одинаковые (по крайней мере, схожие) цели. Несовместимость некоторых положений несколько осложняет жизнь дистрибьюторам и разработчикам, желающим объединить в своём продукте несколько сторонних программ. Но в целом существующие лицензии неплохо уживаются друг с другом. Тем не менее сокращение их числа было бы на руку как разработчикам, так и конечным пользователям, поскольку сделало бы работу с различным ПО более прозрачной и понятной. Так что будем надеяться, что 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.

79


web

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

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

В

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

80

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

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


web программного обеспечения отреагирость работы движка с нелокальными реровали на данную потребность. На се- Работа годня существуют десятки поисковых Сервер был установлен на машине: AMD сурсами будет зависеть от скорости канамашин, работающих локально на PC, Athlon 2500 Barton, 512 Мб DDR 3200 (Dual), ла. Также скорость индексирования завитакже появились серверные поиско- HDD WD 200 Гб SATA (8 Мб кэш, 7200 сит от используемых парсетов. Использооборотов). Конфигурация движка: дви- вание режима хранения cache улучшает вые машины. Локальные поисковые машины жок DataparkSearch (v4.38), СУБД MySQL скорость работы примерно на 15-20%. В кав большинстве своем распространя- (v4.1.11), веб-сервер Apache (v1.3.33), про- честве клиентского ПО используются вебются бесплатно, тогда как корпора- изводится индексация doc, xls, rtf (конвер- браузеры, проверялась работа на: Firefox, тивные версии, позволяющие пользо- тация в text/plain), html, txt-файлов. Исполь- Opera, Konqueror, Microsoft Internet Explorer вателям производить поиск информа- зуется режим хранения данных multi. Обра- и даже Lynx – проблем не возникло. Всю рации на сервере, стоят достаточно до- ботка примерно 2 тыс. файлов, располо- боту серверной части движка можно авторого. Несомненно, покупая коммер- женных на данной машине (размер на дис- матизировать с помощью всем известного ческий продукт, мы получаем грамот- ке ~1 Гб), и индексация их контента требует демона cron, поместив в него нужные паную техническую поддержку и другие 40 мин, размер БД после работы пример- раметры для индексации данных. преимущества, но небольшие органи- но равен 1 Гб. Должен заметить, что скозации или владельцы частных сетей не всегда в состоянии заплатить ты- Search [1] или Ask Jeeves Desktop возможно использовать его и в корпосячи долларов за подобные продукты. Search [2]. Возможно, для организа- ративной среде. MnogoSearch (бывший UdmSearch) – К счастью, в мире Open Source сущес- ции поиска в маленькой компании или твуют свободные проекты, не уступаю- на рабочей станции пользователя, под известный многим и достаточно расщие по функциональности своим ком- управлением ОС Windows, эти движки пространенный движок. Существумерческим конкурентам, с качествен- могут быть полезны, но не в данном ют версии как под Windows (30-дневслучае. Поисковые «монстры» вроде ная бесплатна версия), так и под *nixной поддержкой и обновлениями. Сейчас мы рассмотрим один из ва- Яндекса очень дороги, но если требу- платформы (лицензия GNU). Возможриантов по организации поиска доку- ется качественная помощь разработ- на работа практически со всеми расментов на файловом сервере, кото- чиков, то крупным компаниям, воз- пространенными версиями СУБД SQL рый был реализован на конкретной можно, следует подумать об его арен- под обе платформы. К сожалению, де. Для *nix-семейства существует не- на данный движок достаточно мнозадаче. сколько проектов. Это движки: го нареканий, поэтому я не остановил свой выбор на нём.  DataparkSearch [3] Начальные условия Wordindex – движок, находящийся Имеется файловый сервер под уп-  Wordindex [4] в стадии разработки (на момент напиравлением ОС Linux. Для совместно-  ASPseek [5] сания статьи последняя доступная верго использования файлов установле-  Beagle [6] сия 0.5 от 31 августа 2000 года). Рабоны популярные пакеты samba и pro-  MnogoSearch [7] тает в связке СУБД MySQL и веб-серftp. На диске используется файловая Перечисленные движки позицио- вера Apache. Работоспособный просистема reiserfs, как наиболее производительная для работы с большим нируются как свободно распростра- ект представлен только на сайте разколичеством маленьких файлов (до- няемые поисковые машины для рабо- работчиков. ASPseek – поисковая машина, покументы, около 3 тысяч, различных ты в локальной и/или глобальной сеформатов: txt, html, doc, xls, rtf). Дан- тях. Хочу заметить, что многие проек- лучившая в прошлом достаточно больные отсортированы, но их объем рас- ты не мультиплатформенные и не ра- шое распространение, но в 2002 году тет с каждым днем, удаление устарев- ботают под операционными система- этот движок прекратил свое развитие шей информации не решает пробле- ми компании Microsoft. Для Windows- (последняя доступная версия данной му. Как организовать поиск по именам систем существуют серверные реше- поисковой системы 1.2.10 от 22 июля и типам документов, а также по кон- ния, такие как: MnogoSearch и «Ищей- 2002 года). DataparkSearch – клон поискового тенту? Как сделать его доступным для ка» [8]. Итак, коротко рассмотрим поиско- движка MnogoSearch. Позволяет пропользователей в локальной сети? изводить поиск как по именам файДля решения этих вопросов нам по- вые машины под *nix-платформу: Beagle – преемник в SUSE Linux лов, так и по их контенту. Обработка надобится поисковый движок, сервер баз данных (MySQL, firebirg, ...), веб- движка Htdig [9]. Последний дистри- txt-файлов, HTML-документов и тэгов сервер Apache [13] и около гигабай- бутив SUSE, в который вошел движок mp3 встроена, для обработки содерта дискового пространства для рабо- Htdig, был за номером 9, в последую- жимого документов иного типа необщих версиях компания Novell заменила ходимы дополнительные модули. Возты комплекса. его на beagle. Htdig закончил свое раз- можен поиск информации, как на ловитие в 2004 году, последняя доступ- кальном жестком диске, так и в лоКакой из поисковых ная версия – 3.2.0b6 от 31 мая 2004 кальной/глобальной сети (http, https, движков выбрать? Существуют локальные поисковые года. Новый движок в SUSE позицио- ftp, nntp и news). Поисковая машина функционирумашины, такие как Google Desktop нируется как локальный поисковик, но

№5, май 2006

81


web мощью веб-консоли phpmyadmin, но можно обойтись и стандартным набором утилит. Необходимо создать нового пользователя в MySQL:

Рисунок 1. Минимальные набор параметров indexer.conf

Рисунок 2. Минимальные параметры search.htm

ет с самыми распространенными СУБД 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.

Минимальное конфигурирование Создадим базу данных: sh$ mysqladmin create search

Командой mysqlshow просмотрим все таблицы в БД. Сразу хочу отметить, что удобнее работать с MySQL с по-

82

sh#mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO пользователь@localhost IDENTIFIED BY 'пароль' WITH GRANT OPTION; exit

Перезагрузим 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-табли-


web цы в БД. Если появились ошибки, следует проверить имя пользователя mysql и пароль в файле indexer.conf, это наиболее распространенная ошибка. Для тестирования рекомендуется проиндексировать небольшой участок ресурса, чтобы если возникнут ошибки, новая переиндексация не заняла много времени. Индексирование выполняется командой indexer без параметров, в итоге нам выведут результаты: затраченное время, количество документов и скорость работы. Ско пируе м файл bin /search.cgi и з д ир е к тор ии DataparkSearch в папку cgi-bin нашего веб-сервера и отредактируем файл index.shtml нашего веб-сервера Apache (расположенный в папке html), добавив в него код формы поиска:

Рисунок 3. Форма ввода данных

<FORM METHOD=GET ACTION="/cgi-bin/search.cgi"> <INPUT TYPE="text" NAME="q" VALUE=""> <INPUT TYPE="submit" VALUE="Search"> </FORM>

Теперь можно зайти на ресурс 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

№5, май 2006

Рисунок 4. Страница результатов поиска

параметр ParserTimeOut 300 (число указывается в секундах), но время индексирования тогда еще более возрастет. Также нам понадобится еще один парсет – unrtf [17] – для работы с rtf-файлами, он конвертирует документы в html-код или text/plain-формат на выбор пользователя. Скачаем и установим нужные пакеты, для подключения парсета нужно добавить строки в indexer.conf: Для формата xls (программа xls2csv входит в пакет catdoc): Mime application/vnd.ms-excel text/plain "xls2csv $1" AddType application/vnd.ms-excel *.xls *.XLS

для документов doc параметры выглядят так: Mime application/msword text/plain "catdoc $1" AddType application/vnd.ms-excel *.doc *.DOC

обработка RTF-документов: AddType text/rtf* *.rtf *.RTF AddType application/rtf *.rtf *.RTF Mime text/rtf* text/html "/usr/local/bin/unrtf ↵ --text $1" Mime application/rtf text/html "/usr/local/bin/unrtf ↵ --text $1"

Cтоит напомнить, что некоторые Windows-приложения иногда создают файлы с тем же расширением в верхнем регистре, поэтому добавим в список AddType те же расширения, но с иными названиями. Для индексации можно добавлять любые типы документов, но движок будет показывать только ссылки на имена файлов. Допустим, если необходимо проиндексировать rpm или iso-файлы и получить из них метаданные, вам понадобится сначала найти соответствующую программу (парсет) и добавить нужные параметры в index.conf. Список поддерживаемых типов документов можно посмотреть, напри-

83


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 БД: DBAddr mysql://searcher:qwerty/search/?dbmode=cache

Теперь можно отредактировать файлы index.conf и search.conf, изменив в них параметры: indexer.conf DBAddr mysql://searcher:qwerty@localhost/search/ ↵ ?dbmode=cache&cached=localhost:7000 search.htm DBAddr mysql://searcher:qwerty/search/?dbmode=cache

можно добиться большей функциональности и гибкости движка, все зависит от поставленных задач. Для повышения скорости работы поиска движка можно использовать модуль 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) и снапшота жима cache и внести необходимые изменения в конфигу- 4.39 (от 19.04.2006). Должен заметить, что обновления посрационные файлы. ледней версии происходят почти через день. Далее перейдем в директорию sbin нашего движка и заМы не рассматривали вопрос о создании публичпустим утилиту cached с параметрами: ного поискового сервиса в Интернете, если же вам это требуется, ознакомтесь с соответствующей документаcached & 2> cached.out цией по СУБД, веб-серверу и другим моментам, касающимся защиты информации от несанкционированноДемон запустится и будет записывать отладочную ин- го доступа. формацию в файл cached.out. Порт работы cached по умолчанию – 7000, но если необходимо, его можно изменить Ссылки: (в cached.conf). 1. Google Desktop Search – http://desktop.google.com. Заново создадим SQL-таблицы для нового режима хра- 2. Ask Jeeves Desktop Search – http://about.ask.com. нения данных командой «indexer -Ecreate» и проиндекси- 3. DataparkSearch – http://www.dataparksearch.org. руем сервер – indexer. После завершения выполним ко- 4. Wordindex – http://wordindex.sourceforge.net. манду: 5. ASPseek – http://www.aspseek.org. run-splitter -k

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

Дополнительные функции В приведенной конфигурации использовались минимальные параметры настройки, с помощью дополнительных

84

6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.

Beagle – http://beagle-project.org. MnogoSearch – http://www.mnogosearch.ru. Ищейка – http://www.isleuthhound.com. Htdig – http://htdig.org. Mysql – http://www.mysql.com. Firebird – www.firebirdsql.org. PostgreSQL – http://www.postgresql.org. Apache – http://www.apache.org. Catdoc – http://www.45.free.net. XLHTML – http://chicago.sourceforge.net/xlhtml. vwHtml – http://wvware.sourceforge.net. unrtf – ftp://ftp.gnu.org/pub/gnu/unrtf.


bugtraq Множественные уязвимости в 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) с сайта производителя.

Переполнение буфера и раскрытие данных в 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. Решение: В настоящее время способов устранения уязвимости не существует.

№5, май 2006

Переполнение буфера в ClamAV Программа: Clam AntiVirus (clamav) 0.80 по 0.88.1. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки проверки границ данных в HTTP-клиенте в утилите Freshclam. Удаленный пользователь может вызвать переполнение стека, если размер HTTP-заголовков, полученных от веб-сервера, превышает 6 Kб. Удачная эксплуатация уязвимости возможна, если Freshclam используется для закачки обновления сигнатур вирусов с злонамеренного сервера (например, посредством отравления DNS-кэша). URL производителя: www.clamav.net. Решение: Установите последнюю версию (0.88.2) с сайта производителя.

Множественные уязвимости в 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. Опасность: Низкая. Описание: Уязвимость существует при обработке имени анонимного пользователя (пользователя с пустым паролем) в процессе аутентификации. Удаленный пользователь может послать серверу специально сформированный пакет и получить доступ к важным данным на системе (к частям запросов или результатам их выполнения другими пользователями). URL производителя: www.mysql.com. Решение: Установите последнюю версию (5.0.21) с сайта производителя.

Отказ в обслуживании в ISC BIND Программа: ISC BIND 9.3.x и более ранние версии. Опасность: Низкая. Описание: Уязвимость существует из-за ошибки при обработке TSIG в последующих сообщениях в механизме трансфера зон. Удаленный пользователь может с помощью специально сформированного TSIG в сообщении вызвать отказ в обслуживании процесса named. URL производителя: www.isc.org. Решение: В настоящее время способов устранения уязвимости не существует.

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

85


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

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

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

Хочешь жить – умей вертеться К 1994 году продажи рабочих станций Silicon Graphics перевалили за отметку в полмиллиона единиц в год. Количество приложений для платформы достигло 1300 штук. Несмотря на это, цены как на аппаратное, так и программное обеспечение являлись для многих непреодолимым барьером. Желание сэкономить и выбрать наиболее оптимальный вариант посетило и студию Pixar, занявшуюся созданием первого полнометражного мультфильма, созданного целиком при помощи компьютерной графики. В результате рабочие станции Silicon Graphics хоть и были использованы, но только в качестве рабочего инструмента для художников и аниматоров, и лишь исключительно из-за многообразия программных пакетов, доступных для платформы. Что же касается серверов, составлявших систему просчёта (rendering farm), и систем хранения данных, тут компанию опередила Sun Microsystems. Итог известен всем: выход в 1995 году анимационного мультфильма «Иг-

86

рушечная история» позволил Sun отоб- на, и все, казалось бы, были довольрать у Silicon Graphics частицу всемир- ны… до появления Windows 95. В начале 1995 года Microsoft запусной славы. Жестокая война продукции компании с рабочими станциями тила программу по поддержке разраот DEC, Hewlett-Packard и уже упоми- ботки игр, работающих на её новой навшейся Sun Microsystems, а также ОС. Суть этой программы заключалась появление нового «конкурента» – про- в захвате персональными компьютерацессора Pentium Pro вынудили Silicon ми, работающими на базе Windows 95, Graphics признать, что она более не од- части рынка игровых консолей, на кона и теперь ей придётся изрядно потру- тором в то время доминировали комдиться, чтобы сохранить свои позиции пании Nintendo и Sega. в этом секторе рынка. Microsoft приняла решение не исОднако первая настоящая «пощёчи- пользовать OpenGL, к тому времени на» была получена от «злейшего врага успешно применявшийся в Windows NT, всего компьютерного мира» – Microsoft. для обработки трёхмерной графиКак только Silicon Graphics объявила о ки в играх. Вместо этого она приоблицензировании API OpenGL, эта ком- рела компанию Rendermorphics, Ltd. пания в срочном порядке записалась разработавшую API под названием в члены комитета ARB. Между ними RealityLab. После его доработки и песразу же был заключен договор, со- реименования в Direct3D Microsoft объгласно которому Silicon Graphics помо- явила о своём намерении сделать ножет Microsoft написать версию OpenGL вый API единственным стандартом для её новой операционной системы для Windows 95. Специально для этого Windows NT, предназначенной для ра- компания отказалась предоставить небочих станций, работающих на различ- обходимую информацию относительно ных архитектурах (х86, PowerPC, PA- своей новой операционной системы RISC Alpha, SPARC и MIPS). Работа бы- разработчикам приложений и игр под ла проделана, Windows NT – выпуще- OpenGL. Фактически на протяжении


ретроспектива длительного периода времени компа- твенным системам компании. Позния специально «тормозила» развитие же это мнение окажется ошибочным, OpenGL, а также появление этого API однако в 1995-97 гг. Silicon Graphics на Windows 95. Примером может слу- продолжала не спеша «плыть по тежить тот факт, что приложения, напи- чению». Как известно, компьютер или в дансанные на базе OpenGL и работавшие на Windows NT, на Windows 95 запус- ном случае рабочая станция являюткаться просто отказывались. ся для артиста лишь инструментом, После этого последовала так назы- причём не самодостаточным. Кроме ваемая война API, в которую были вов- него необходимы и программы. ПоРисунок 1. Игровая консоль Nintendo 64 лечены не только производители гра- нимала это и Silicon Graphics. Поэтофических карт, но и разработчики при- му 7 февраля 1995 года она объявила ложений и игр, а также простые поль- о покупке за 650 млн. долл. компаний зователи. Многочисленные статьи, Alias Research и Wavefront Technologies, сравнивающие оба стандарта, анали- являвшихся главными поставщикатические очерки, публичные обраще- ми программных продуктов в сфения к Microsoft – всё это мир ПК пере- ре трёхмерной графики и анимации, жил за каких-то два года. К 1997 го- а также промышленного дизайна, ду компания смогла достаточно до- и их объединении в одну под назваработать Direct3D (сделав его частью нием Alias|Wavefront (в апреле 2003 DirectX), чтобы не беспокоиться конку- переименованную в Alias). Новоисперенции со стороны OpenGL, поэтому- чённая компания начала параллельно Рисунок 2. Рабочая станция O2 таки сподобилась обеспечить его огра- с выпуском обновлённых версий уже 12 июля 1995 года стал самым счасниченную поддержку в Windows 95. Од- успевших зарекомендовать себя пронако к тому времени имидж Microsoft грамм разработку графического паке- тливым днём в истории компании – стобыл уже подпорчен. та нового поколения для трёхмерного имость одной акции Silicon Graphics соТем не менее Silicon Graphics моделирования и анимации под назва- ставила рекордные 45,25 долл., что на не сильно огорчилась. Профессио- нием Maya, который с выходом в 1997 то время было в два раза больше сумнальный рынок всё ещё принадлежал году стал стандартом де-факто в про- мы, которую просили за акцию Microsoft. ей, а персональные компьютеры не изводстве компьютерных спецэффек- В различных подразделениях компании по всему миру работали 12 тысяч челомогли составить конкуренции собс- тов для кинофильмов. век. Сравните эти цифры с показателятота работы 62,5 МГц), состоит из двух от- ми начала 2006 года: менее доллара за Проект «Действительность» История появления консоли Nintendo 64 дельных процессоров: RSP (занимается акцию и менее 2100 сотрудников. Однако всё это ждало компанию столь же интересна, как и сама игро- обработкой полигонов: трансформацией, вая приставка. Когда к компании Sega of освещением, обрезанием и т. д.) и RDP в будущем, а пока 23 апреля 1996 America поступили данные о будущей це- (на его плечах лежит Z-буферизация, ап- года свет увидела игровая консоль не их новой консоли Sega Saturn, которая паратное сглаживание и текстурирование). Nintendo 64, являвшаяся результадолжна была стоить $549, к ней обратился Объём оперативной памяти RDRAM в 4 Мб том проекта Project Reality. Для Silicon Джим Кларк, в то время ещё надеявший- мог быть увеличен вдвое путём установки Graphics приставка значила одно – ся воплотить свои мечты в недрах Silicon в консоль специальной платы расширения. финансовые поступления. От продаGraphics. «У меня есть несколько процессо- Nintendo 64 обрабатывала около 100 тыс. жи каждой консоли компания получаров, производных архитектуры MIPS, кото- полигонов в секунду, хотя при отключении ла свою частичку, которая позволила рые как нельзя лучше подойдут для вашей аппаратного сглаживания и других функ- Silicon Graphics сделать одну из самых системы», – говорил он. Несмотря на согла- ций эта цифра переваливала за полмил- больших ошибок за время своего существования – купить за 764 млн. долл. сие американского подразделения корпо- лиона треугольников. рации принять предложение Кларка, Sega К сожалению, несмотря на свои выда- компанию Cray Research. К тому времени Cray Research явJapan ответила отказом. Однако предпри- ющиеся графические возможности (котоимчивый Джим обращался с целью поиска рые лишь немногим не дотягивали до уров- лялась одним из двух основных поспотенциального клиента не только к Sega, ня IRIS Crimson), использование морально тавщиков параллельных векторных но и к другим компаниям. Одной из них устаревших картриджей в качестве носи- суперкомпьютеров. Кроме того, в арбыла Nintendo, с радостью согласившаяся теля информации, а также банальный пе- сенале компании присутствовали совместно с Silicon Graphics разрабатывать ренос срока выхода консоли на год (с пла- и обычные массивно-параллельные нировавшегося 1995 на 1996 г.) не позво- «суперы». Во время совершения сделконсоль следующего поколения. В основе приставки лежат два про- лили Nintendo 64 стать лидером продаж. ки доход Cray достиг отметки 900 млн. цессора. Первый, NEC VR4300, основан- К концу 2002 года было продано 32 млн. долл. В штате компании работало оконый на базе ядра MIPS R4300i, работает приставок, тогда как основной конкурент, ло 4500 сотрудников. Итак, что же Silicon Graphics прина частоте 93,75 МГц и отвечает в основ- Sony PlayStation, разошлась по миру 100обрела за баснословную сумму? Воном за игровую логику. Второй, RCP (час- миллионным тиражом.

№5, май 2006

87


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

Рисунок 3. Сервера Origin 2000

первых, нереа лизованный товар на 600 млн. долл. Во-вторых, семейство «суперсерверов» Superserver, которое компания сразу же продала Sun Microsystems (моментально стартовавший на базе купленной линейки проект «Starfire» вылился в появление очень удачного семейства серверов Enterprise, благодаря которым Sun и по сей день конкурентоспособна в этом секторе рынка). В-третьих, новые каналы продаж (Cray поставляла свои системы в Министерство обороны США, Министерство топлива и энергетики, NASA, военные базы, крупные научно-исследовательские лаборатории и т. д.). И, наконец, в-четвёртых, технологии Cray, а также высококвалифицированных инженеров, большинство которых, правда, через некоторое время уволили. Политика Slicon Graphics по отношению к Cray была просто варварской: производство векторных суперкомпьютеров, которыми так славилась компания, было практически прекращено; Cray были «навязаны» собственные сервера Silicon Graphics, над которыми компания отныне должна была трудиться. Однако всё это не шло в сравнение с главной проблемой, возникшей после приобретения. Silicon Graphics так долго и так рьяно соперничала с Cray на рынке суперкомпьютеров, что, как только обе компании стали партнёрами, они не смогли договориться

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 с графичес-

Передовая технология

а также контроллер шин объединены вместе в единицу, известную как «узел», представляющий собой обычно одну плату. Узлы, в свою очередь, объединяются посредством высокопроизводительной внешней шины, названной NUMAlink. Внутренняя системная шина отсутствует. Вместо неё обмен данными между процессорами, памятью и устройствами ввода/вывода происходит посредством линии переключателей и маршрутизаторов. Основное преимущество SN-систем, кроме высокой скорости передачи информации – масштабирование, которое происходит сразу во всех направлениях: с линейным увеличением количества процессоров увеличивается объём ОЗУ, количество устройств ввода/вывода и т.д.

NUMA (Non-Uniform Memory Access – доступ к неоднородной памяти) представляет собой многопроцессорную архитектуру, в которой местоположение оперативной памяти выбирается наиболее оптимальным образом для максимального уменьшения времени доступа. Например, скорость работы процессора с собственной локальной памятью всегда будет значительно выше, чем с нелокальной (памятью, которая «принадлежит» другому процессору или разделена между ними). Архитектура SN (Scalable Node – масштабируемый узел), разработанная Silicon Graphics, является примером реализации NUMA. В SN-системе процессоры, ОЗУ,


ретроспектива кими акселераторами 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 Питер Фоулкис. – Но за своими «розовыми» очками она не заметила, как рынок с невероятной скоростью меняется за её спи-

Рисунок 4. Графические суперкомпьютеры Onyx2

№5, май 2006

Несостоявшийся трёхмерный Интернет Ещё одна неудача, которую потерпела Silicon Graphics, была связана с VRML. VRML – стандарт языка описания трехмерных сцен, содержащих объекты, а также возможные взаимодействия между объектами и наблюдателем. Основное применение нашёл в сети Интернет в качестве средства представления статической и интерактивной информации в виде виртуальной трехмерной среды, содержащей различные объекты. В середине 1994 года была придумана концепция трехмерного HTML: своеобразного языка описания трехмерных сцен с поддержкой гиперссылок. Позже она получила название VRML. Для описания сцен был вы-

бран формат файлов программной библиотеки Open Inventor, разработанной Silicon Graphics. В октябре того же года доработанный инженером Silicon Graphics формат превратился в первую версию VRML. В отличие от Sun Microsystems, Silicon Graphics не уделяла интернет-технологиям должного внимания. «Единственная их попытка заключалась в создании VRML, – говорил аналитик Jupiter Research Ноа Ясскин. – Они потратили на него много времени и денег, а отдача от проекта получена так и не была». «Критической массы» для широкого распространения VRML не набрал и на сегодняшний день является в основном забавой для специалистов и немногих интернет-магазинов.

ной». И эти слова оказались прелюди- производительностью, и при этом стоей к началу упадка Silicon Graphics. или в несколько раз дешевле. На проПервое массивное сокращение ра- тяжении долгого времени компания не бочего персонала в истории компании понимала, что происходит, а когда до последовало на следующий день пос- неё дошло – было уже поздно». Все вышеперечисленные проблеле анонса 27 октября 1997 г. неудовлетворительных показателей Silicon мы вынудили Эда МакКракена уйти Graphics за прошедший финансовый с поста генерального директора комквартал – 37 млн. долл. убытка (ос- пании. Его место в январе 1998 года новная причина – 50% падение спроса занял «убийца Silicon Graphics», ярый на рабочие станции компании), что бо- приверженец Microsoft Рик Белуццо, лее чем в полтора раза больше показа- до этого практически «уничтоживший» теля за аналогичный квартал 1996 го- разработки HP/UX (вариант UNIX) и рада. Генеральный директор Эд МакКра- бочих станций на её основе в компакен объявил о том, что работу потеряют нии Hewlett-Packard. от 700 до 1000 сотрудников. Массовые увольнения сопровождались бегством Диверсант и c более высоких постов. Так, вслед Первые же действия новоиспечённоза Джимом Кларком компанию посте- го CEO, направленные на «улучшепенно покинули президент Том Джер- ние финансовых показателей компамолак, управляющий дизайнерскими нии», не заставили себя ждать. В наразработками Alias/Wavefront Роберт чале 1998 года Silicon Graphics офиБаргисс и исполнительный директор циально объявила о подписании сопо международным финансовым опе- глашения с Microsoft, согласно которациям Гари Лаер. рому обе компании будут разрабатыПродажи рабочих станций компа- вать графический API под названинии шли из рук вон плохо. Более де- ем Fahrenheit, представляющий собой шёвые альтернативы из мира ПК стре- смесь DirectDraw, Direct3D и OpenGL мительно догоняли продукцию Silicon и призванный «закончить войну станGraphics по возможностям, а уж по со- дартов 3D-графики» в Windows. Одотношению цена/производительность нако Microsoft, параллельно с работой давно вырвались вперёд. «Silicon над Fahrenheit, продолжала развивать Graphics, по существу, вытесняли свой DirectX, нагло копируя в него все из рынка, на котором она до недавних новшества из «Фаренгейта». Доказапор была единственной, – говорил Гар- тельством этого может служить заявтенберг. – Она продолжала разрабаты- ление одного из разработчиков DirectX, вать рабочие станции класса high-end, прозвучавшее в августе 1998 года: тогда как стандартные ПК к тому вре- «Direct3D представляет собой API, комени уже обладали довольно хорошей торый в будущем будет наиболее сов-

89


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

Рисунок 5. Рабочая станция Octane

Рисунок 6. Рабочие станции Visual Workstation 320 и 540

местим с 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 объ-

90

единяла ОЗУ, процессор, графическую, компании, по существу, на улучшение звуковую и сетевую подсистемы в еди- её финансового благосостояния никак ное целое. Ядром Visual Workstation яв- не повлияла. К тому же SGI в то время лялся чип Lithium, функционирующий было не до имени. В 1999 году финансовое положенаподобие маршрутизатора и представляющий собой многопозицион- ние компании продолжало ухудшатьный переключатель, призванный уб- ся: 40 млн. долл. убытка за истекший рать узкие места системных шин рабо- финансовый квартал и очередное чей станции. Графический чип системы, падение курса акций до 14,75 долл. Cobalt, использовал оперативную па- «Эти временные трудности закрывамять для своих нужд, динамически вы- ют прогресс, который мы делаем в друделяя необходимое в данный момент гих областях нашего бизнеса: анонс количество ОЗУ под видеопамять. новых продуктов, улучшенное качесТем не менее техническое пре- тво и эффективность, а также более восходство новых рабочих станций низкие затраты», – объяснял по повоот Silicon Graphics не спасло их от про- ду ужасных показателей Рик Белуцвала: продажи шли из рук вон плохо. цо. «На данный момент мы фокусируНесмотря на более низкую цену (от 4 ем наши усилия на получение отдачи тыс. долл.) по-сравнению со своими в новых рынках». MIPS-собратьями, O2 и Octane, Visual С этими словами 10 августа 1999 Workstation по-прежнему оставались года Белуццо объявил план глобальдороже конкурентов, выпускаемых Dell ной реорганизации компании. Во-пери Compaq. «Современная реальность вых, Silicon Graphics в ближайшее вретакова, что заново «изобретать коле- мя продаст подразделения, занимаюсо» в некоторых сегментах рынка прос- щиеся Visual Workstation, MIPS и Cray, то бессмысленно», – говорил по поводу а также уволит 1500 инженеров, рабосложившейся ситуации начальник отде- тающих в них. Во-вторых, компания нала маркетинга Visual Workstation Джеф чнёт переход от использования в своСтедман. «Лучшим решением для нас их системах процессоров MIPS и ОС было бы улучшение стандартной плат- IRIX на процессоры Intel Merced (будуформы, уже принятой рынком». щий Itanium) и Linux. И, в-третьих, комИтак, постепенно свершилось то, пания откажется от создания собственво что никто не мог поверить – Silicon ных графических карт в пользу решеGraphics потеряла статус признанного ний от сторонних разработчиков. лидера по производству графических Под это «радостное» заявление Бестанций. Хотя к этому времени её руко- луццо 23 августа 1999 г. принял решеводство уже не отрицало, что этот сег- ние уйти из SGI. Нанеся ряд сокрушимент рынка более не является для неё тельных ударов компании и удостовеосновным. А раз так, необходимо бы- рившись в успешном завершении своло избавиться от названия «Silicon их замыслов, он поспешно ретировалGraphics», всё ещё прочно ассоцииро- ся с «тонущего корабля» и перебралвавшегося с термином «компьютер- ся к Microsoft, заняв должность исполная графика». Отделом маркетинга нительного директора. компании была предложена идея о её SGI ничего не оставалось, как срочпереименовании. 13 апреля 1999 года но искать Белуццо замену. Порядком Silicon Graphics International лишилась «потрёпанную» компанию возглавил практически всех букв в собственном новый управляющий, Боб Бишоп. Одназвании, получив имя SGI. «Такое ре- нако сможет ли он вернуть ей былую шение позволит SGI развиваться быс- славу? трее, поскольку «брэнд» должен быть достаточно гибким, чтобы компания Источники: могла расширяться, пробуя себя в но- 1. http://arstechnica.com вых секторах рынка, и при этом оста- 2. http://en.wikipedia.org валась в памяти у людей, помнящих её 3. http://www.cnet.com как Silicon Graphics», – говорил по это- 4. http://www.sgi.com му поводу Клей Таймон, президент 5. http://www.theregister.co.uk компании Landor Associates, занимающейся разработками торговых марок Редактор рубрики и «брэндов». Однако смена названия Кирилл Тихонов


конкурс

Редакция журнала «Системный администратор» объявляет об учреждении 3 премий авторам по итогам 2006 года:  1 место – 30 000 рублей  2 место – 20 000 рублей  3 место – 10 000 рублей

Номинации

1. За лучшую серию материалов 2. За лучшую новую авторскую тему 3. За лучшую аналитическую статью

Кто участвует Участие принимают все авторы, опубликовавшие свои статьи в журнале «Системный администратор» в течение 2006 года. Напоминаем, что автором может стать любой человек.

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

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

Рекомендации авторам Объем статьи – от 4 до 20 тыс. знаков. Если тема статьи предполагает объем, превышающий 20 тыс. знаков –

№5, май 2006

О номинациях 1. Серией материалов считается блок из не менее чем двух статей. Тема серии – по собственному выбору автора или же по выбору редакции. 2. Статья, написанная на тему, придуманную автором и одобренную редакцией. 3. Аналитическая статья может быть написана на тему, предложенную автором или же на тему, заказанную редакцией.

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

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

Требования к виду присылаемых материалов Статьи следует присылать в текстовом виде, предпочтительно в формате RTF или DOC. Имена пересылаемых файлов только на английском языке. Выравнивание столбцов производится табуляцией, а не пробелом. В тексте статьи рекомендуется указывать местоположение иллюстраций и подписи к ним, а сами иллюстрации не нужно вставлять в тело документа, их нужно запаковать в отдельный архив. Иллюстрации должны быть строго в формате PNG. Листинги должны содержать не более 60 символов (вместе с пробелами) в одной строчке. Переносы строк листингов должны быть указаны в явном виде (---перенос строки---). Если в статье приводятся ссылки на ресурсы в сети, URL должен быть указан в явном виде.

Контакты Адрес:

107045, г. Москва, Ананьевский переулок д. 4/2, стр. 1, Редакция «Учительской газеты», журнал «Системный администратор»

Телефон:

(495) 628-82-53

Факс:

(495) 628-82-53

Сайт:

www.samag.ru

e-mail:

imp@samag.ru, secretar@samag.ru

91


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

Практический подход к решению проблем программирования C++ Мэтью Уилсон

Перед вами не просто еще одна книга о С++, в которой будет говориться о том, как «правильно» писать. Это нечто большее, это своего рода проводник и помощник, а так же добрый советчик. В введении, которое носит название «философия неидеального практика» автор подробно описывает четыре тезиса, а именно: «С++ великолепный язык, но не идеальный»,

«будьте смиренны», «сделайте ком- цовочных и прикрепляемых классах, пилятор вашим ординарцем» и «ни- а также о шаблонах и конструкторах. когда не сдавайтесь: решение всегда Отдельный раздел посвящен операможно найти». После столь философ- торам – operator bool(), операторы инского вступления, начинаются первая дексации и инкремента, арифметичесчасть, которая называется «Базовые кие типы. Расширение С++ : продолжиконцепции». Из нее вы узнаете о при- тельность жизни возвращаемых знанудительном проектировании (огра- чений, память, многомерные массивы, ничения, соглашения и утверждения), функторы и диапазоны. В приложениях проблеме жизненного цикла объекта, вы также найдете массу полезной ининкапульсации ресурсов, данных, ти- формации. Книга носит сугубо практипах значений, моделях доступа к объ- ческий характер, и весь материал соектам. Вторая часть: двоичный интер- провождается большим количеством фейс приложения, динамические биб- примеров. Отличная книга, рекоменлиотеки, поточная организация вычис- дую всем программистам на C++. лений, статические объекты, оптимизация. В разделе, посвященном язы-  Издательство: «Кудиц-Образ» ковым проблемам, автор рассказыва-  Год издания: 2006 ет о фундаментальных типах, масси-  Количество страниц: 736 вах и указателях, синтаксисе, именах,  ISBN: 5-91136-006-3 вводимих typedef. Следующая часть –  Цена: ≈ 511 руб. «Осознанные преобразования», из нее Книга предоставлена издательством «Кудицвы узнаете о приведении типов, обли- Образ».

Руководство Cisco по конфигурированию коммутаторов Catalyst Дэвид Хьюкаби, Стив Мак-Квери

Издание является переводом официального руководства по настройке коммутаторов Catalyst. Благодаря сжатому стилю повествования, авторам удалось поместить максимум информации в минимальный объем. Освоив материал этой книги, вы без затруднений сможете работать с большинством моделей коммутаторов серии Catalyst. Вся книга четко структурирована, и поделена на 14

92

глав, из которых вы узнаете о использо- ры (SLB): суть технологии, балансироввании интерфейса коммандной строки, ка нагрузки на брандмауэры, SLB-тесты. функциях коммутаторов различных се- Управление трафиком и доступом к комрий (2950, 3550, 4000, 5000, 6000). Рас- мутатору (подавление широковещания, смотривается конфигурирование бло- фильтрация протоколов, функции обеска Supervisor; конфигурирование интер- печения безопасности портов, списки фейсов второго уровня: таблицы комму- доступа VLAN сетей, аутентификация, тации, выбор порта, Ethernet, etherchanel, списки разрешения доступа, конфигуtoken ring порты; конфигурирование ин- рирование служб SSH и Telnet, 802.1X). терфейсов третьего уровня: WAN интер- Управление коммутатором, качество обфейсы, VLAN, таблицы маршрутизации. служивания (QoS), поддержка передаVLAN-сети и транкинг: конфигурация, чи голосовых данных. Книга – хорошее назначение сетям VLAN портов, тран- приобретение для всех людей, которые кинг; протокол распределенного свя- так или иначе работают с оборудованизующего дерева (STP), многоуровне- ем фирмы Cisco. вая коммутация (экспресс-коммутация Cisco, экспорт данных NetFlow, резер-  Издательство: «Cisco Press» вирование модулей MSFC в одном ус-  Год издания: 2004 тройстве, резервирование маршрути-  Количество страниц: 560 заторов с помощью протокола HSRP).  ISBN: 5-8459-0700-4 Многоадресные службы: IGMP-про-  Цена: ≈ 589 руб. слушивание, протоколы CGMP, GMRP, Книга предоставлена издательством «Cisco RGMP. Балансировка нагрузки на серве- Press».


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

Структура и реализация сетей на основе протокола OSPF Томас М. Томас II

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

лом и справочной информацией. «Ос- маштабируемость и топология сети, новные принципы функционирования рассмотрены вопросы проектировапротокола OSPF и организация взаи- ния различных областей). В третей модействия маршрутизаторов», так части «Внедрение, устранение наруназывается первый раздел, из кото- шений в работе и управление сетью рого вы узнаете основные сведения OSPF» автор повествует о протокооб организации сетей и маршрути- ле SNMP, защите сети, рассмотрезации (модель OSI, протоколы TCP/ ны основные команды, применяемые IP, типы сетевых топологий, принци- для поиска и устраниения неисправпы адресации, методы VLSM и CIDR). ностей в сети. Не остался без внимаВведение в OSPF (краткий обзор ал- ния и вопрос о применении протокола горитма SPF, иерархия маршрутиза- BGP и технологий MPLS в сетях OSPF. ции и эксплуатационная среда OSPF), По окончания каждой главы материспособы взаимодействия по прото- ал резюмируется и приводятся пракколу OSPF (анонсы с информацией о тические примеры. состоянии каналов, способы передачи информации с помощью протоко-  Издательство: «Cisco Press» ла OSPF, управление анонсами LSA).  Год издания: 2004 Вторая часть носит название «Мар-  Количество страниц: 816 шрутизация и проектирование сетей  ISBN: 5-8459-0594-X OSPF» в которой написано об основ-  Цена: ≈ 657 руб. ных принципах проектирования (ме- Книга предоставлена издательством «Cisco тодология проектирования сети OSPF, Press».

Eclipse IDE Эд Барнет

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

№5, май 2006

лений». Основной упор сделан на рассмотрение инструментария для разработки приложений на Java. Из главы «Введение» вы узнаете общие сведения о Eclipse, установке, запуске и обновлении этого продукта. Во второй главе, с лаконичным названием «Верстак 101» будет рассмотрен интерфейс и основные меню IDE Eclipse. Следом идет глава «Java быстро», в которой написано о процессе создания проекта, кодировании, запуске программы, отладке, юниттестирование, а также советы и хитрости (помощник создания кода, шаблоны, автоматический вход, рефакторинг, гиперссылки, быстрое исправление, поиск, альбомные страницы, Java Build Path, конфигурация запуска). Для того чтобы не запутаться в множестве экранов и панелей инструментов Eclipse, в главе «Экраны» перечислены основные объекты. Содержание главы «Коротко о разном» полностью оправды-

вает свое название. Из нее вы узнаете о CVS, Ant, платформе веб-инструментов, тестировании и производительности, визуальном редакторе, AspectJ, разработке плагинов, платформе Rich Client. Завершает книгу глава «Получение помощи», в которой автор предоставил список источников, из которых можно получить помощь по IDE Eclipse. Замечательная во всех отношениях книга – весь материал строго по делу, и без лишней воды. Если вы собираетесь, или уже работайте с Eclipse это издание станет вашим незаменимым спутником и помощником.

    

Издательство: «Кудиц-Образ» Год издания: 2006 Количество страниц: 160 ISBN: ISBN 5-91136-007-1 Цена: ≈ 99 руб. Книга предоставлена издательством «КудицОбраз».

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

93


подписка на 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 по каталогу агентства «Пресса России» * **

94

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


подписка на 2006 год Редакционная подписка Открыта подписка через редакцию. Вы можете оформить подписку на любое количество номеров 2006 года. Редакция не высылает журналы за пределы Российской Федерации.

Для юридических лиц:

 Отправьте заявку по факсу (495) 628-82-53 или по e-mail: info1@samag.ru.

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

№5

(30 по )м д ww писн w.s ой ай 2 am ин 0

05 По ag дек Ищ чем .ru с 8165 5 ем у M пр S S Ст WP роим ичин QL м A-E з ы ед ле nte ащи На нн стр rpr ще ор is н аи Ка аб e, ную ва ота 80 уд к во ем 2.1 бес ет? ал сс UP е x т н а S Чт EA пров ны но по ов P-T од е ф вит дL аж LS ную inu ай ь но лы се x в к тана зн ть: по ать ор вл д п и ор ва Эф BS об ати ем D IPпо фек вн Sy тел ля ти ой ma ми вн еф Ко се nte по о у он ти c ль пр с п нтро и и A зо ав ntiv ом ли ва ля ощ ру iru Ин тел ем ью ем s9 ей со терв .0 OS без зд ью вA SIM оп ате с D ас ле Ла но м я рр сть зы и У се ка ол ти Pe лом rl –

Для физических лиц:

 Заполните нижеприведенную квитанцию, оплатите в любом банке и пришлите в редакцию копию с отметками банка.  После поступления платежа редакция начнет отправлять вам номера.

Стоимость подписки через редакцию: 900* руб. за 6 номеров 1800* руб. за 12 номеров

* Включая НДС и почтовую доставку

№5, май 2006

95


СИСТЕМНЫЙ АДМИНИСТРАТОР №5(42), Май, 2006 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редактор Алексей Коршунов Внештатные редакторы Алексей Барабанов Кирилл Тихонов Валентин Синицын РЕКЛАМНАЯ СЛУЖБА тел./факс: (495) 628-8253 Евгения Тарабрина reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Николай Петрочук По вопросам распространения обращайтесь по телефону: (495) 628-8253 (доб. 120) 107045, г. Москва, Ананьевский переулок, дом 4/2, стр. 1 тел./факс: (495) 628-8253 Сайт журнала: www.samag.ru РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев

ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Современный Linux-сервер: виртуализация сетевых устройств В серверном эксплуатационном цикле часто возникает потребность во всевозможных манипуляциях над сетевыми подключениями в режиме on-line. Переведя последние в категорию виртуальных можно значительно упростить их обслуживание и предусмотреть многие внештатные ситуации.

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

ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета»

Пишем систему динамической защиты ресурсов сети

Отпечатано типографией ГП «Московская Типография №13» Тираж 11000 экз.

Серверные журналы, проще говоря, протоколы, содержат в себе инфор-

Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.). За содержание статьи ответственность несет автор. За содержание рекламного объявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены.

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

Linux в школе? Из всех сфер применения вычислительной техники наиболее интересной является использование Linux в сфере образования. Конечно, сегодняшняя ситуация с программами, ориентированными на сферу образования, еще далека от идеальной: программы локализованы не полностью, нет стандартного интерфейса, не хватает подготовленных специалистов и прочее. Но главное, что общими усилиями процесс сдвинулся с места. И не использовать заложенный в Open Source потенциал – просто преступление.

Уважаемые читатели! Спешите оформить подписку на второе полугодие 2006 года! Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.

Доставка почтой в любую точку России.

96


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