Page 1

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

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

ЛИ

СЬ

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

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

Postfix: диагностируем и устраняем неисправности Asterisk и Linux: миссия IP-телефония

ЗА

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

УЕ ХА Л

ВО ТП УС К

КА

БЫ С

№6(31) ИЮНЬ 2005 подписной индекс 81655 www.samag.ru

Насколько неуязвима ваша беспроводная сеть?

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

Используем одноразовые пароли для удаленного входа на сервер Как защититься от fingerprinting? Solaris 10 в качестве десктопа? Пробуем! Ускоряем MS SQL Server Модифицируем BIOS

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

№6(31) июнь 2005

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

Ищем дополнительные источники дохода


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

56 Изучаем принципы работы Heimdal Kerberos

ИНТЕРВЬЮ 4 ALT Linux: третье пришествие. Скоро на экранах ваших машин

Интервью с Алексеем Смирновым, генеральным директором компании ALT Linux. Андрей Бешков tigrisha@sysadmins.ru

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

Михаил Кондрин mkondrin@hppi.troitsk.ru

61 Защищенная почтовая система с Tiger Envelopes Сергей Яремчук grinder@ua.fm

64 Насколько неуязвима ваша беспроводная сеть?

8 Postfix: диагностируем и устраняем неисправности Андрей Бешков tigrisha@sysadmins.ru

12 Asterisk и Linux: миссия IP-телефония Михаил Платов platov@cs.vsu.ru

20 Испытываем Antmon – новую систему мониторинга

Крис Касперски kk@sendmail.ru

70 Как защититься от fingerprinting? Сергей Борисов imp@samag.ru

WEB 77 Используем ImageMagick в веб-разработке

Сергей Жуматий serg@guru.ru

25 Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 3 Алексей Барабанов alekseybb@mail.ru

32 Решаем нестандартные задачи с помощью стандартного Windows Scripting Host Михаил Кошкин Blackmail@bk.ru

Кирилл Сухов geol@altertech.ru

HARDWARE 81 Модифицируем BIOS Крис Касперски kk@sendmail.ru

IMHO 86 Размышления о UNIX

37 Solaris 10 в качестве десктопа? Пробуем! Андрей Маркелов andrew@markelov.net

40 Файловые системы пространства пользователя

Сергей Супрунов amsand@rambler.ru

ПОЛЕЗНЫЕ СОВЕТЫ 88 Системный администратор – ищем дополнительные источники дохода

Сергей Яремчук grinder@ua.fm

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

44 Ускоряем MS SQL Server Юлия Шабунио yshabunio@eastwind.ru

49 MySQL 5 – что нового предлагают нам разработчики? Кирилл Сухов geol@altertech.ru

БЕЗОПАСНОСТЬ 53 FreeBSD tips: повышаем безопасность с помощью одноразовых паролей Сергей Супрунов amsand@rambler.ru

№6, июнь 2005

Роман Марков stepan-razin@newmail.ru

48, 52, 76, 94 BUGTRAQ ПО ВАШИМ МНОГОЧИСЛЕННЫМ ПРОСЬБАМ В редакцию продолжают поступать звонки и письма от читателей, которые оформили подписку на второе полугодие с опозданием, начиная с сентябрьского номера, пропустив выпуски за июль и август. Специально для вас мы открыли редакционную подписку на первые два номера следующего полугодия. Подробности смотрите на сайте журнала www.samag.ru в разделе «Подписка».

1


тенденции Microsoft наращивает возможности своей линейки программ для образования Компания Microsoft провела в июне для партнеров семинар «Решения Microsoft для системы образования и подготовки кадров». Ведущие менеджеры по работе с образованием поделились опытом внедрения технологий и программных продуктов Microsoft за рубежом и в России, а также представили новые решения для сферы образования на базе платформы Microsoft Learning Gateway (MLG). В первой части семинара Джим Леви и Айдан МкКарти рассказали о новых версиях системы управления ИТ-ресурсами учебного заведения Learning Network Manager и системы управления учебным контентом и процессом обучения Class Server применительно к школьному и вузовскому образованию. Особое внимание было уделено возможностям взаимодействия с органами управления образованием и существующему опыту в странах Европы. Вторая часть семинара была посвящена представлению отечественных проектов: Сергей Паринов рассказал о текущем внедрении и перспективах развития портала Высшей школы экономики на базе технологий MS SharePoint Portal Server 2003, а Алексей Мороз в свою очередь поделился результатами использования программного продукта MS Class Server для организации дистанционного обучения в Российской академии правосудия Верховного суда РФ и Высшего арбитражного суда РФ. Решения Microsoft для сферы образования уже обсуждались на страницах журнала (см. №11, 2004 г.), поэтому отметим только ключевые изменения в политике Microsoft. Во-первых, можно констатировать существенное увеличение и коммерциализацию интереса к сфере образования на уровне высших учебных заведений и правительства (ориентация на решения для электронного правительства). Об этом свидетельствует явно декларируемая коммерческая целесообразность работ в области образования: «There is Serious Money in Education – together we can unlock the Safe!» (В образовании есть серьезные деньги – вместе мы можем отпереть этот сейф!), которая базируется на увеличении количества платных студентов в вузах до 50%, существовании нескольких высокобюджетных федеральных целевых программ по информатизации образования (до 1 млрд. $) и росте спроса на услуги по дистанционному обучению (elearning) в крупных предприятиях. Во-вторых, поддерживая современную тенденцию, Microsoft на передний план выдвигает интеграционную платформу MLG и ее возможности по расширению и развитию, которые потенциально могут компенсировать все существующие на сегодняшний день преимущества программных продуктов конкурентов. При этом Microsoft продолжает наращивать возможности своей линейки программ для образования, выпуская новые версии и распространяя бесплатные elearning-компоненты для разработчиков в среде .Net. В третьих, Microsoft делает первые шаги к автоматизации образовательных процессов с точки зрения повышения эффективности бизнеса. На текущий момент представители Microsoft говорят о заинтересованности в решениях только для организации порталов и IT-инфраструктуры образовательных

2

учреждений, а остальные вопросы перекладываются на партнеров. Так, например, существует CRM-решение для сферы образования от компании Distinction на базе MS Business Solutions, которое активно используется в Великобритании. Конечно, говорить о серьезной проработанности вопросов организации бизнес-процессов в образовании на базе технологий Microsoft еще рано, однако уже сейчас активно ведутся работы по направлению Management information systems, куда пока в упрощенном виде, но уже входят решения для отчетности на базе Business Intelligence, финансовые и кадровые модули. Для повышения эффективности взаимодействия с существующими системами могут использоваться возможности Enterprise Application Integration (EAI) на базе XML-webservices и BizTalk Server 2003. Более подробную информацию о докладах на семинаре и программных продуктах Microsoft можно найти по адресу: http://www.microsoft.com/Rus/Education.

Андрей Филиппович

Завершение серии PA-RISC – конец эпохи мини-ЭВМ? В центре высоких технологий HP в Москве прошла прессконференция, посвященная развитию бизнес-критичных серверов, представлению процессора PA-8900, проблемам защиты инвестиций и внедрению технологии виртуализации серверных ресурсов. Создание нового процессора серии PA-8900 завершает историю архитектуры PA-RISC и как следствие знаменует конец продолжателей класса мини-ЭВМ от HP. За время своего развития эти процессоры увеличили рабочую частоту в 20 раз и производительность в 60. Последний процессор имеет сокетную совместимость с Intel Itanium, и поэтому системы на его основе определяются как «Itanium READY». В дальнейшем планируется поддержка только двух архитектур – x86 и Itanium. Для владельцев HP 9000 это означает неизбежную замену процессоров в новых системах на Itanium, и их должен заинтересовать компромиссный способ обновления существующих систем такого класса. Идея, положенная в основу нового семейства серверов HP Integrity, за счет стандартизации оборудования позволяет смешивать серверные модули разной архитектуры и осуществлять поэтапное обновление бизнес-критичных серверов, обычно работающих в режиме non-stop. Это позволяет надеяться, что точно так же, при следующей смене архитектуры на более прогрессивную, существующее серверное оборудование не придется 100% списывать. Владельцам персоналок такой способ частичной модернизации хорошо знаком. Еще большие возможности сбережения инвестиций открывает технология виртуализации, при которой виртуальными становятся сами сервера, раскладываемые по многопроцессорным кластерным системам для лучшей балансировки нагрузки, а, значит, и для создания оптимального ценового соответствия оборудования решаемой задачи. Теперь можно с уверенностью утверждать, что микро-ЭВМ доминируют во всех сферах применения.

Алексей Барабанов


тенденции Nokia присоединяется к миру Open Source Начиная с конца мая компания Nokia демонстрирует показательную благосклонность к сообществу Open Source. Так, например, анонсируется Nokia 770 Internet Tablet – интернетпланшет, основанный на открытой ОС Linux (а не привычной Symbian). Причем также сообщается о планах компании опубликовать исходный код продукта в надежде привлечь разработчиков к написанию программного обеспечения для устройства. Далее следует заявление о том, что в ядре Linux разрешается использовать запатентованные технологии Nokia. «Nokia полагает, что инвестиции, сделанные со стороны независимых разработчиков и компаний в ядро Linux, и открытое ПО, без сомнения, выгодны и заслуживают доверия», – гласит официальное заявление компании. Однако вскоре этот жест доброй воли был подвергнут резкой критике Ричарда Столлмана, который и здесь обнаружил подвох: «... Free Software Directory (каталог свободного ПО) насчитывает более 4000 пакетов. В заявлении Nokia ничего не говорится о них, так что здесь по-прежнему остается потенциальная опасность атаки Nokia в будущем». Однако это не остановило Nokia, и компания на конференции GUADEC объявила о том, что подарит GNOME Foundation доходы с продажи 500 своих устройств Nokia 770. И в середине июня, вновь подчеркивая интерес к Open Source, компания сообщила о намерении воспользоваться технологиями WebCore и JavaScriptCore, основанными на коде KHTML и KJS от KDE (Konqueror), в новый браузер для смартфонов Nokia 60.

дакции LiveDVD, на котором содержится более 4 Гб популярных пакетов.

Sun опубликовала исходный код Solaris Компания Sun наконец-то выполнила свое обещание и опубликовала исходный код своей ОС Solaris под лицензией CDDL в рамках проекта OpenSolaris. Всего было открыто более 5 миллионов строк кода, однако это не все – исходники некоторых других компонентов должны будут появиться позже. Вскоре Джон Фаулер сообщает о замене в OpenSolaris загрузчика на открытый GRUB, что позволило «существенно расширить прямую поддержку аппаратуры». А вскоре после релиза OpenSolaris Йорг Шиллинг выпустил первый основанный на нем LiveCD-дистрибутив – SchilliX.

Достижения проектов по портированию Linux Появились новости о развитии Linux во встраиваемой среде. Так, например, энтузиастам удалось запустить ядро открытой ОС и заставить работать framebuffer на КПК Dell Axim X50. Очередных успехов достиг и проект портирования Linux на iPod: теперь стал возможным просмотр изображений и запись аудио, а в ближайшее время ожидается поддержка устройств 4G iPod и iPod mini. Кроме того, разработчики DS Linux (версии Linux для Nintendo DS) смогли создать виртуальную клавиатуру для экрана приставки.

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

Новые подробности об отношениях *BSD и Linux На прошедшем в Бразилии форуме FISL 6.0 Маршалл Маккузик, один из авторов FreeBSD, поделился воспоминаниями о том, с чего начинал Линус Торвальдс. По его словам, автор ядра Linux в свое время заявил, что ему бы «не пришлось создавать Linux, если бы в начале 90-х на BSD не подали судебный иск». Другой представитель лагеря BSD, Тео де Раадт, отметился интервью, в котором подчеркнул, что не сомневается в превосходстве OpenBSD над Linux в плане чистоты исходного кода системы. Кроме того, он отметил, что крупные компании (вроде IBM), поддерживающие ОС Linux, на самом деле фактически превращают разработчиков Open Source в бесплатную рабочую силу.

Первые летние релизы популярных Linux-дистрибутивов После неоднократных отходов от плана выпуска новой стабильной версии одного из наиболее популярных Linux-дистрибутивов проект Debian 6 июня представил столь долгожданный «Sarge». Время разработки заняло около трех лет, вследствие чего отныне планируется ускорить процесс подготовки стабильных релизов Debian GNU/Linux. А уже через неделю был обнародован и выпуск очередной версии Fedora Core – бесплатного наследника Red Hat Linux, поддерживаемого сообществом Open Source. И в конце месяца разработчики KNOPPIX объявили о релизе анонсированного на конференции LinuxTag обновления к своему дистрибутиву. Впервые система была выпущена в ре-

№6, июнь 2005

3


интервью

ALT LINUX: ТРЕТЬЕ ПРИШЕСТВИЕ СКОРО НА ЭКРАНАХ ВАШИХ МАШИН

На данный момент существует всего два русских Linux-дистрибутива – ALT и ASP. Сегодня редактор нашего издания встретился с Алексеем Смирновым, генеральным директором компании ALT Linux, – чтобы задать ему вопросы, интересующие многих пользователей этого дистрибутива.

Г

лавный вопрос, волнующий наших читателей, когда выйдет Alt Linux 3.0 и насколько сильно он будет отличаться от своего предшественника Alt Linux 2.4? На данный момент Alt Linux Compat 3.0 проходит внутреннее тестирование. К примеру, у меня на ноутбуке он уже стоит и работает очень даже хорошо. Со дня на день должна появиться OEM-версия Compact 3.0, затем выйдет розничная версия. Ну а к осени должен появиться Alt Linux Master 3.0. Как обычно, у нас произошло обновление большинства прикладных пакетов, но это не главное. Основное изменение по сравнению с версией 2.4 – это переход на новую систему инсталляции и настройки системы. Хочу для примера отметить тот факт, что во время установки нет необходимости перезагружаться. В процес-

4

се инсталляции используются те же самые модули, что и при последующей настройке системы. В эту версию встроен пакет Alterator, который отвечает за инсталляцию и конфигурирование системы. Его прототипом были модули конфигурирования, эксплуатировавшиеся ранее в «ИВК КОЛЬЧУГА». Благодаря этому нововведению процесс инсталляции системы сильно упростился. При создании «Кольчуги» мы исходили из расчета на то, что мест, где может применяться типовое решение на базе Alt Linux, гораздо больше, чем опытных администраторов. Соответственно нужно максимально облегчить процедуру инсталляции. В версии 3.0 на первом этапе производится установка на жесткий диск минимальной рабочей системы, затем управление передается ей. Все остальные процессы, такие как соз-

дание файлов устройств и добавление дополнительных пакетов, происходят в рамках настройки уже работающей системы. Плюс ко всему вышесказанному мы перешли на ядро 2.6 и соответственно легко можем выпустить Live CD одновременно с полной версией дистрибутива. Одним из важных нововведений в ALT Linux версии 3.0 можно назвать переход на UTF-8. Это позволит избавиться от проблемы с ворохом разных кодировок кириллических символов. На данный момент большинство приложений отлично работают в новой среде, хотя некоторые консольные программы еще не совсем дружат с этой кодировкой. Думаю, что со временем эти шероховатости постепенно будут сглажены. На данный момент в ALT Linux 2.4 нет удобных визуальных средств кон-


интервью фигурирования системы. Насколько мне известно, эту роль призвана выполнять внутрифирменная разработка, фигурирующая под кодовым именем Alterator. Стоило ли затевать свой собственный проект, если доступен для свободного использования Yast от Suse? Понимаете ли, когда мы начинали разрабатывать Alterator, свободного Yast еще не существовало. Стоит учитывать тот факт, что наш проект начался позже, чем Yast, соответственно мы могли учиться на чужих ошибках и заложить в его основу идеи, которых нет у других. Если сравнивать Yast и Alterator, то нужно обратить внимание на то, что Yast не хранит настройки системы в конфигурационных файлах. Для этих целей используется свое промежуточное хранилище, на основании которого потом редактируются эти самые файлы. Получается, что до тех пор, пока мы пользуемся Yast для настройки параметров системы, все идет хорошо. Но как только конфигурационные файлы изменены вручную, от Yast приходится отказаться, потому что будет уничтожать ваши исправления и целостность настроек. С Alterator таких проблем возникнуть не может. Все настройки берутся напрямую из конфигурационных файлов, и после синтаксического анализа ими можно легко манипулировать через систему настройки. Те настройки, которые Alterator не распознал, будут сохранены без изменений. Плюсом такого решения является высокая модульность и возможность работы через любой интерфейс. К примеру, в разных вариантах поставки Alterator-ом можно будет управлять через консоль, веб-интерфейс, X-window, сетевой сокет или что-нибудь еще. Простор для фантазии разработчика прикладных интерфейсов практически ничем не ограничен. Опять же свой собственный проект поддерживать гораздо проще, и развивается он динамичнее. Тут и инструментарий на руках, и с разработчиками легче контактировать. В чужие проекты, особенно в такие большие, как Yast, сложно вводить свои инновации. Как я уже отметил, еще одним полезным свойством Alterator можно считать его высокую модульность. Думаю, что не возникнет никаких проблем с добавлением новой функциональности. К при-

№6, июнь 2005

меру, на основе Alterator и LDAP, который выступает в качестве хранилища объектов, можно будет построить достаточно гибкую систему управления группами машин, сервисов, пользователей. Думаю, что подобная система будет очень удобна и гибка. За счет этих качеств она с легкостью впишется в рамки любого предприятия. Для нашей компании Alterator – один из самых приоритетных проектов, на его разработку брошена «команда тяжеловесов», это в свою очередь значит, что стоит ожидать динамичного развития этой подсистемы. Как вы уже упоминали, ALT Linux версии 3.0, кроме всего прочего, будет выходить на Live CD. Собираетесь ли вы выпускать какойлибо диалект вашего дистрибутива, предназначенный для создания встроенных систем? У нас есть такие планы. Хотя на самом деле каждый раз, когда меня спрашивают, где используется ALT Linux, я испытываю смущение. Довольно часто к нам извне приходит информация о самых разнообразных применениях ALT Linux. Был случай, когда на адрес техподдержки пришло письмо с просьбой помочь в наладке системы видеонаблюдения, работающей на основе нашего дистрибутива. Навели справки, оказалось, что в России существует предприятие, вполне успешно занимающееся производством этих систем. Недавно нам прислали снимок игрового автомата, построенного на базе ALT Linux. Получается, что мы о таких событиях узнаем последними. Периодически у нас в компании всплывают разнообразные идеи по использованию встроенного ALT Linux. В частности, есть версии для наладонников. В общем, мы занимаемся этим по мере сил. Достаточно много пользователей дистрибутива жалуются на то, что сайт altlinux.ru последние несколько лет практически не развивается. Намерены ли вы предпринять что-либо для исправления этой ситуации? Сейчас мы занимаемся полной переработкой нашего сайта. Дабы не соврать, точных сроков окончания работ называть не буду. Параллельно с этим развивается проект онлайновой

документации docs.altlinux.ru. Конечно, сейчас на него нет ссылок со страниц главного сайта и найти его нелегко, но думаю, что со временем это будет исправлено. На данный момент силами нашей команды разработана удобная инфраструктура, позволяющая облегчить процесс создания и сопровождения документации. Изначально массивы текстов хранятся в XML – это позволяет без особых трудозатрат верстать такой текст в любой выходной формат, хоть в бумажную книгу, хоть в онлайновое руководство или в документацию, идущую в комплекте с разными дистрибутивами. Но работа с XML непроста, поэтому мы как раз решили это упростить. Думаю, что плоды этой работы можно будет увидеть уже в ближайшее время. Раз мы заговорили о документировании, хотелось бы спросить, не планирует ли команда ALT Linux привлекать авторов со стороны для описывания процесса создания тех или иных востребованных решений на основе дистрибутива. На данный момент в процессе документирования участвует некоторое количество специалистов из комьюнити. Но, как вы понимаете, все виды востребованных решений описать в приемлемые сроки будет трудно. Поэтому мы считаем, что если есть какието типовые решения, то их проще не описывать, а закодировать в скриптах и дать конечному потребителю стандартный интерфейс для того, чтобы управлять аспектами работы получившегося комплекса. Любое оконченное описание это, по сути, техническое задание, разумнее было бы сразу же воплотить его в коде и отдавать потребителю специализированный продукт. В мире не так много людей, которые хотели бы читать объемные книги и разбираться с особенностью работы межсетевого экрана Linux. Большинство все-таки предпочтет графический интерфейс с возможностью удобно осуществлять типовые действия по настройке со стандартными заготовками правил для NAT и разрешением работы по наиболее часто используемым протоколам. Мы считаем, что в этой нише будущее за специализированными решениями вроде ALT Linux SOHO Server.

5


интервью Есть пословица «Как вы лодку назовете, так она и поплывет». Среди пользователей дистрибутива, знакомых с легендой о Сизифе, обреченном на бесконечный тяжкий труд, многие считают, что команда ALT не столько занимается изготовлением готового продукта, сколько ведет процесс ради самого процесса. Как вы прокомментируете данное утверждение? Ещё говорят, что Сизиф – это символ бесплодного труда. В таких случаях мы советуем почитать «Легенду о Сизифе» Камю. Сизиф – это ведь не только хранилище пакетов, это еще и наша технологическая база. Работая с ним, мы используем систему входного контроля пакетов, распределенную сборку с помощью hasher и другие интересные вещи. Опираясь на эту технологию, мы можем гибко управлять процессом создания коробочных решений. Соответственно создание дистрибутива с помощью Сизифа превращается в довольно простую задачу, которую можно выполнять довольно регулярно. Все-таки это сильно отличается от сборки дистрибутива подручными средствами на коленке. Понятно, что Сизиф в силу своей специфики никогда не будет законченной работой, но это и хорошо, потому что означает развитие технологии, которая легко позволяет адаптировать систему к любым условиям. Многие администраторы, пользующиеся ALT Linux, жалуются на недостаточное количество пакетов в комплекте дистрибутива. К сожалению, самостоятельная сборка пакетов – процесс нетривиальный, и он под силу довольно малому количеству пользователей дистрибутива. В то же время официальная команда поддержки часто отказывается собирать те или иные пакеты, необходимые для работы со стандартными сервисами, под предлогом небезопасности этих программ. Не лучше ли было доверить выбор того, что устанавливать, конечному пользователю и не ограничивать его искусственными запретами? Большинство дистрибутивов, наоборот, хвалятся количеством пакетов по умолчанию. Может, стоило бы все-таки включать такие пакеты в стандарт-

6

ный репозитарий с пометкой «использовать на свой страх и риск»? В ALT Linux 2.4 Master имеется 5775 бинарных пакетов, вряд ли такое количество можно назвать недостаточным. В процессе создания дистрибутива вопросам безопасности уделяется очень много внимания. Мы считаем, что для начинающего администратора, неспособного самостоятельно собирать пакеты, лучше всего подходит система, сразу же после установки работающая в наиболее защищенном режиме. Поэтому приходится немного затягивать гайки, иначе приемлемого уровня безопасности не добиться. Опытный администратор, умеющий собрать пакет, уже способен сам решить, что ему нужно подкрутить и где можно при необходимости ослабить те или иные запреты. Я думаю, что если в том или ином пакете есть уязвимость, то его не стоит собирать и класть в дистрибутив. С программами, распространяемыми без исходных кодов, следует поступать так же. В случае крайней необходимости их можно запустить в chroot. Иначе получается, что мы провоцируем администратора пользоваться заведомо небезопасными решениями. На двух последних выставках Softool проводилось тестирование наших серверов. На них работал дистрибутив ALT Linux, установленный стандартным способом. Все желающие могли попробовать взломать систему. Добиться успеха в этом начинании никому не удалось, думаю, что это хороший повод для гордости. Мы считаем, что безопасность и стабильность работы должна быть превыше всего. О каких интересных проектах вы хотели бы еще рассказать нашим читателям? На данный момент активно развивается направление сотрудничества с Министерством экономического развития. Последние два года мы выполняли для них достаточно объемные заказы, а в этом году даже выиграли тендер на разработку системы публикации под свободной лицензией результатов работ, выполненных по госзаказу. Это сотрудничество началось с разработки «Рекомендаций по использованию свободного программного обеспечения в государственном секторе».

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


интервью получить исходный код и право самостоятельной сборки продукта из него. Только таким образом можно быть уверенным, что получаемый продукт действительно соответствует своим исходным кодам, делает именно то, что декларируется и свободен от закладок. В случае если мы намерены достаточно долго эксплуатировать продукт, нужно решить вопрос с правами на модифицирование исходного кода. Иначе любой, кто, используя это ПО, построит достаточно большую систему, автоматически становится заложником поставщика. В случае покупки ПО проблемы лицензирования мы кратко рассмотрели, если же ПО или научное исследование разрабатывается на заказ, то все становится еще сложнее. Анализируя российское законодательство, мы обнаружили, что обладателем исключительных прав по умолчанию становится не заказчик, а исполнитель разработки, если иное не указано в контракте. Мы считаем, что такое положение лучше всего подходит для разработок выполняемых сторонними силами в рамках госзаказа. Во-первых, автор должен иметь возможность продолжать развивать свой продукт. Вовторых, государству не нужны исключительные права, потому что они связаны с излишним отягощением и непрофильным расходованием средств, в этом случае придется все это тем или иным образом ставить на баланс и тратить средства на борьбу с контрафактным распространением. Побочным вредом этих обстоятельств можно считать автоматическое изымание хороших идей из рыночного пространства. Кроме того, не происходит поступления программного продукта в хозяйственный оборот. Таким образом, получается, что для успешной работы с приобретенным ПО государству достаточно иметь права на пользование, тиражирование, распространение и модификацию. Другое важное требование – это публикация результатов таких разработок госзаказчиком под свободной лицензией. Отсюда вывод: в общем случае лицензирование по модели GPL вполне подходит для государственных заказов. Минэкономразвития воспользовалось значительной частью этих рекомендации, и тендеры 2005 года про-

№6, июнь 2005

интервью

иходили уже с учетом новых правил. В частности, было объявлено, что все материалы, полученные в результате выполнения работ, будут выходить под свободными лицензиями. На мой взгляд, эта работа повлекла за собой довольно революционные изменения в менталитете заказчика. Теперь есть четкое понимание, что ПО – это не только какой-то функционал, но и набор передаваемых авторских имущественных прав. Таким образом, теперь не функционал, а права становятся предметом тендера. Как вы представляете себе операционную систему вашей мечты? Существует ли таковая? Если нет, то какая из ОС, имеющихся в наличии, наиболее близка к вашему идеалу? Представление об идеале у всех разное. В данном случае мне больше всех нравится Linux. Ключевыми аспектами являются разнообразие ПО, возможность разных стилей работы, динамическое развитие и свободная лицензионная политика. Соответственно если хочется чего-то, чего еще нет, нужно лишь взять и реализовать это самому. Если не секрет, хотелось бы узнать, собирается ли ALT Linux расширяться и привлекать новых разработчиков? Конечно. Резкого увеличения числа сотрудников ожидать не стоит, но все же мы понемногу расширяемся. К сожалению, за нашей спиной нет большой фирмы с огромным мешком денег, соответственно мы вынуждены экономить и инвестировать сами в себя. Сейчас мы живем с колес – в этом есть свои плюсы и минусы, поэтому нанимать дополнительных разработчиков удается только в случае появления новых масштабных проектов. Наличие ALT Linux Team для нас в этом плане очень важно, получается, что вокруг всегда есть достаточно много квалифицированных специалистов, работающих в рамках одной технологии с нами. Исторически сложилось так, что большинство людей, принятых к нам на работу, в свое время засветилось в ALT Linux Team.

Андрей Бешков, фото автора

7

7


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

POSTFIX: ДИАГНОСТИРУЕМ И УСТРАНЯЕМ НЕИСПРАВНОСТИ Postfix прост и надежен в эксплуатации, словно автомат Калашникова. Но все же неискоренимое человеческое любопытство нет-нет, да и заставляет нас задумываться над вопросами: Что будет, если в один прекрасный день Postfix перестанет работать? Смогу ли я понять, почему это произошло? Удастся ли мне его починить?

АНДРЕЙ БЕШКОВ

В

предыдущих статьях [1, 2] мы говорили о том, как Postfix устроен изнутри, почему я считаю его одним из лучших SMTP MTA и как с его помощью построить корпоративный почтовый сервер. Многие читатели, ознакомившись с этими материалами, принялись за создание собственных систем на основе Postfix. Судя по откликам, 99% из них преуспели в этом начинании, у подавляющего большинства почтовый сервер работает в штатном режиме без каких-либо проблем уже год или более. Все, о чем будет говориться сегодня, проверялось на версиях Postfix 2.2 под FreeBSD, Solaris и несколькими дистрибутивами Linux. Под всеми перечисленными системами приемы, которым я вас научу, работают практически одинаково. Мелкие различия в формате вывода информации на экран или названии директорий, в которых лежит тот или иной файл, в данном случае несущественны. Поэтому я думаю, что у вас не возникнет проблем с применением полученных знаний.

Начинаем диагностику Итак, представим, что неприятности все же случились. Произошло это по вине неловкого администратора или аппаратного сбоя – неважно, наша задача – найти неполадки и исправить их. Каменщики обычно пляшут от печки, а мы начнем диагностику с проверки, запущен ли главный процесс Postfix. Сделать это проще всего командой: # ps -ax | grep master 22628

?

Ss

0:00

/usr/lib/postfix/master

В некоторых дистрибутивах Linux того же эффекта можно добиться командой:

# netstat -na | grep LISTEN | grep 25 tcp

0

0 0.0.0.0:25

0.0.0.0:*

LISTEN

Теперь неплохо было бы приказать Postfix самому провести внутреннюю диагностику. # postÞx check

postfix: fatal: /etc/postfix/main.cf, line 100: missing ‘=’ after attribute name: “mynetworks_style”

Как видите, в данном случае проблема состоит в неправильном синтаксисе файла main.cf. Впрочем, эта команда работает не только с конфигурационными файлами, заодно она позволяет убедиться, что все необходимые служебные файлы и директории имеют надлежащие права и принадлежат кому положено. Стоит отметить тот факт, что, если в результате проверки будут обнаружены проблемы с какими-либо директориями, Postfix попытается самостоятельно исправить их атрибуты. В случае успешности этого действия на экране не появится никаких предупреждений. Ну а если самостоятельно разобраться с проблемами не удастся, сообщения об ошибках будут достаточно детализированы и легко понятны даже начинающему администратору. Иногда случается так, что служебные директории бывают полностью удалены, в этом случае Postfix постарается самостоятельно восстановить их. Единственное, чего он не умеет создавать – бинарные выполняемые файлы взамен утраченных. После выполнения команды check неплохо было бы перезагрузить Postfix, в идеале это требуется редко, но иногда лучше перестраховаться: # postÞx stop # postÞx start

# service postÞx status

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

8

Если все вышеперечисленные действия не спасли «отца русской демократии» и почта все еще не работает – значит пришло время заняться анализом протоколов работы почтовой системы. Обычно они находятся в /var/log/mail/ или /


администрирование var/log/maillog. Если вам не удалось найти нужный файл, то в зависимости от того, какая система syslog у вас используется, посмотрите в /etc/syslog.conf или /etc/syslog-ng.conf. Поищите в этих файлах строки, где встречается mail, и вам сразу все станет понятно. Итак, с местонахождением протоколов мы определились, теперь следует посмотреть, что в них записано. В общем виде записи в протоколе должны выглядеть так: Jun 12 17:23:41 altlinux postfix/postfix-script: starting the Postfix mail system Jun 12 17:23:41 altlinux postfix/master[23846]: daemon started -- version 2.1.6

Каждая запись состоит из нескольких компонентов. Перечисляем по порядку: дата и время события, имя хоста, имя компонента postfix и ID процесса, ну и, наконец, само сообщение. Я уже упоминал, что Postfix является не монолитной программой, а целым содружеством демонов, во главе которых стоит процесс master. С точки зрения безопасности это неоспоримое преимущество, потому что отказ одного компонента не приведет к падению всех остальных. Но в то же время благодаря такому подходу каждая программа подсистемы самостоятельно отвечает за протоколирование результатов своей работы. Получается, что, несмотря на свое главенство, процесс master обладает лишь необходимым минимумом информации о подчиненных процессах. К примеру, он может сообщить, что, судя по коду ошибки, у процесса с определенным ID проблемы, но сути их master все равно не знает. В большинстве случаев поиск по ID процесса, на который пожаловался master, дает исчерпывающую информацию о неполадках в системе. Для указания серьезности ошибки служат специально зарезервированные слова. Давайте рассмотрим их значение. ! panic – произошло что-то из ряда вон выходящее. Вы, видимо, нашли какую-то серьезную ошибку в работе Postfix, которую вряд ли сможете исправить самостоятельно. Стоит отметить, что за несколько лет эксплуатации Postfix мне ни разу не приходилось встречать сообщения об ошибках подобного типа. ! fatal – продолжение работы невозможно до тех пор, пока ошибка не будет исправлена. Обычно причиной таких сообщений становится отсутствие важных файлов или прав на доступ к каким-либо объектам. ! error – ошибка может быть фатальной или нет, но обычно продолжение работы системы невозможно. ! warning – предупреждение о не фатальных ошибках. Может указывать на некоторые несущественные проблемы или ошибки в конфигурации. Посмотрим на одну из самых типичных записей об ошибке: Jun 12 17:41:28 altlinux postfix/smtpd[24506]: fatal: open database /etc/postfix/helo_restriction.db: No such file or directory Jun 12 17:41:29 altlinux postfix/master[23846]: warning: process /usr/lib/postfix/smtpd pid 24506 exit status 1 Jun 12 17:41:29 altlinux postfix/master[23846]: warning: /usr/lib/postfix/smtpd: bad command startup -- throttling

Судя по сообщению от postfix/master[23846], процесс postfix/smtpd[24506] аварийно завершил свою работу, потому что не смог найти файл служебных таблиц /etc/postfix/helo_restriction.db.

№6, июнь 2005

DB-файлы – это бинарная форма вспомогательных таблиц, используемых Postfix во время работы. Обычно она создается из текстовых файлов специального формата с помощью команды postmap <имя текстового файла>. Начинающие администраторы при попытке расширить функциональность postfix довольно часто забывают создавать вспомогательные таблицы, которые сами же прописали в main.cf. Обычно Postfix записывает в файлы протокола достаточно информации для того, чтобы понять, в чем именно заключается проблема, но иногда бывает полезно увеличить «разговорчивость» некоторых компонентов системы. Для этого открываем файл master.cf, выбираем нужный компонент системы и дописываем к его ключам запуска -v. К примеру, строка, заставляющая демона cleanup подробнее отчитываться о своих действиях, выглядит вот так: cleanup -

unix 0

n cleanup -v

-

Выполняем команду postfix reload и смотрим, что происходит. Если полученные сведения все еще не устраивают нас, добавляем через пробел к ключам запуска еще одну -v, и так до тех пор, пока не получим необходимую подробность. Подобный метод можно применять к любому из компонентов Postfix. При проблемах с входящими SMTP-соединениями добавляют подробности компоненту smtpd. Если нас интересует доставка, то ключ надо добавить к параметрам демона очереди qmgr. Плюс зависимости от направления, в котором должно уйти письмо, внести такие же изменения в параметры вызова агентов доставки smtp, lmtp, pipe, local, virtual. Также можно глобально указать ключ -v для программы postfix, которая в свою очередь передает параметры в master. Делается это, к примеру, вот так: # /usr/sbin/postÞx -v

Как и в предыдущих примерах, количество повторений -v указывает, насколько подробными должны быть выводимые сообщения. Следующей весьма полезной для отладки командой является postconf. Она выводит на экран огромное количество информации о состоянии внутренних переменных и таким образом позволяет посмотреть, каковы на данный момент настройки postfix. Кстати, стоит отметить, что значение практически всех переменных, выводимых postconf, вы можете переопределить в файле main.cf. К примеру, узнать версию Postfix можно, выполнив: # postconf | grep version

А с помощью postconf -m можно увидеть, с какими типами баз данных умеет работать ваш экземпляр Postfix. # postconf –m static cidr cdb nis regexp

9


администрирование environ proxy btree unix hash

Представим, что нам необходимо посмотреть, что стало с тем или иным письмом. Подобная задача довольно часто встает перед администратором почтовой системы, когда пользователь звонит и жалуется, что ему два дня назад отправили письмо, а он его до сих пор не получил. Отследить путь прохождения письма довольно просто: нужно открыть файл протокола, найти сообщения о соединении с интересующего хоста. К примеру, нам интересно увидеть, куда делось письмо от vasa@unreal.net к ira@unreal.net. Ищем в протоколе vasa@unreal.net, например, с помощью grep и находим следующие строки: Jun 12 19:11:19 altlinux postfix/smtpd[27445]: connect from clif.unreal.net[10.10.21.75] Jun 12 19:12:09 altlinux postfix/smtpd[27445]: F29D3562E: client=clif.unreal.net[10.10.21.75] Jun 12 15:12:27 altlinux postfix/cleanup[27482]: F29D3562E: message-id=20050612151145.F29D3562E@mailhost.unreal.net Jun 12 19:12:27 altlinux postfix/qmgr[27342]: F29D3562E: from=<vasa@unreal.net >, size=363, nrcpt=1 (queue active) Jun 12 15:12:29 altlinux postfix/smtpd[27445]: disconnect from clif.unreal.net[10.10.21.75]

Из них следует, что письмо было принято от clif.unreal. net[10.10.21.75], и ему присвоен ID F29D3562E почтовой очереди. Выполним следующую команду: # grep /var/log/maillog F29D3562E Jun 12 19:12:27 altlinux postfix/local[27491]: F29D3562E: to=<ira@unreal.net >, relay=local, delay=42, status=sent (delivered to command: /usr/bin/procmail -a $DOMAIN -d $LOGNAME) Jun 12 19:12:27 altlinux postfix/qmgr[27342]: F29D3562E: removed

Проверим доставку Судя по выводу, письмо было успешно доставлено в почтовый ящик пользователя, что и требовалось доказать. Иногда бывает нужно проверить, как передается почта между нашим сервером и каким-либо другим. В случае если администрируемый сервер доступен для нас по SMTP, выполнить это достаточно просто. А что делать, если сервер предназначен для внутренней почты компании и находится в закрытой сети, соответственно у нас к нему есть доступ только по ssh или telnet? Первый способ – проверить прохождение почты: отправить письмо из командной строки с помощью команды mail и затем проанализировать то, что будет написано в файлах протокола. Большинство администраторов делает именно так, но есть более удобный путь. С помощью команды sendmail можно проверить прохождение почты гораздо более простым способом. # sendmail -v vasa@unreal.net

После доставки письма к vasa@unreal.net все данные, касающиеся этого факта, будут не только записаны в протокол, но еще и отправлены почтой пользователю, от имени которого была запущена программа. В нашем случае это пользователь root. # sendmail -bv vasa@unreal.net

10

Если воспользоваться такой командой, то на финальной стадии доставка письма будет прервана и пользователь не получит тестового письма, но все записи протокола так же, как и в предыдущем случае, придут к нам в почтовый ящик. Еще одним удобным способом посмотреть, что происходит во время SMTP-сессии, является директива debug_ peer_list из файла main.cf. Глобально включать отладку всех SMTP-соединений было бы очень накладно, поэтому в нее стоит добавлять только список хостов, взаимодействие с которыми мы хотим отслеживать тщательнее, чем обычно. К примеру, для наблюдения за передачей писем между нами и yandex.ru, mail.ru, pochta.ru и 10.10.10.23 строка могла бы выглядеть вот так: debug _ peer _ level = 2 debug _ peer _ list = yandex.ru, mail.ru pochta.ru ↵ 10.10.10.23/32 10.10.10.0/24

Как видите, хосты можно перечислять двумя путями – через запятую и через пробел. Впрочем, как вы уже убедились, никто не мешает в качестве хоста указывать IP-адреса или целые подсети вроде 10.10.10.0/32. С данной возможностью стоит обращаться очень осторожно, потому что каждая SMTP-сессия, попадающая под наш фильтр, записывает в файл протокола примерно 20 Кб текста. При большом потоке писем между нами и наблюдаемым хостом стоит немного зазеваться, и место на файловой системе /var может закончиться довольно быстро. Директива debug_peer_level указывает, насколько подробными должны быть отчеты. По умолчанию ее значение равно 2. Если хочется заглянуть чуть глубже в процесс работы Postfix, можно воспользоваться услугами стандартных трассировщиков системных вызовов. Для разных систем их имена могут несколько отличаться, но, скорее всего, вы легко найдете в своей системе что-то вроде trace, strace, truss или ktrace. Следить за каким-либо процессом довольно просто – нужно всего лишь вызвать команду, актуальную для вашей системы с ключом -p и номером процесса. Ну а если и это не помогло, можно провести отладку с помощью интерактивного отладчика xgdb или его не интерактивного собрата gdb. За этот функционал отвечает директива debugger_command из файла main.cf. Впрочем, я сильно сомневаюсь, что она пригодится кому-то из вас. По крайней мере мне за последние три года ни разу не пришлось воспользоваться ею, даже под большой нагрузкой, Postfix работал без каких-либо нареканий. Думаю, на данном этапе можно остановиться. вы уже достаточно хорошо подготовлены для самостоятельного поиска неисправностей в работе Postfix, если таковые встретятся на вашем пути. В следующей статье мы поговорим о методиках анализа узких мест в работе почтовой системы и способах тонкой настройки нацеленной на увеличение производительности.

Литература: 1. Бешков А. Почтовая система для среднего и малого офиса. – Журнал «Системный администратор», №5, май 2003 г. – 46-54 с. 2. Бешков А. Архитектура Postfix. – Журнал «Системный администратор», №6, июнь 2004 г. – 04-08 с.


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

ASTERISK И LINUX – МИССИЯ IP-ТЕЛЕФОНИЯ

У вас уже есть офисная мини-АТС или вы только планируете ее покупку? Думаете о предоставлении новых возможностей для повышения эффективности работы сотрудников? Сегодня мы приоткроем дверь в мир Open Source IP-телефонии, рассмотрев возможности одного из самых популярных продуктов для Linux – Asterisk PBX.

МИХАИЛ ПЛАТОВ

И

так, что же такое Asterisk? Читаем на официальном сайте [1]: «Asterisk – полностью программная учрежденческая АТС (УАТС), работающая под управлением операционной системы Linux». По возможностям (см. [2]) Asterisk зачастую опережает своих традиционных собратьев. Поддерживаются практически все популярные протоколы IP-телефонии (SIP, H323, SCCP, ADSI). Помимо стандартных и общеизвестных, Asterisk также имеет свой собственный протокол – IAX. Его можно использовать как для подключения обычных клиентов, так и для передачи голосового трафика между несколькими серверами Asterisk. Для сопряжения с «традиционной телефонией» имеются аналоговые (FXO, FXS) и цифровые модули расширения (E1, T1). С помощью As-

12

terisk вы сможете реализовать проект любого масштаба – от простого домашнего сервера голосовой почты до телефонного сервера предприятия с функциями IVR (Interactive Voice Response – система голосовых меню). Сегодня мы рассмотрим простой пример установки и настройки сервера Asterisk для работы с несколькими пользователями.

Можно ли на него посмотреть? Думаю, что после знакомства со списком возможностей (а это более 70 позиций) у вас возникло желание как можно быстрее взглянуть на Asterisk своими глазами. Спешу вас обрадовать – посмотреть на Asterisk без его установки можно! Для этого воспользуйтесь специальным LiveCD, обра-


администрирование зами сетевой загрузки для PXE-совместимой сетевой платы или карты CompactFlash [3]. Однако, если вы считаете LiveCD или другие способы «знакомства» излишними, можете сразу перейти к инсталяции, только предварительно давайте разберемся, что именно мы будем устанавливать.

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

Процесс установки. Что нам стоит «*» построить Asterisk является свободно распространяемым продуктом для платформы. Рекомендуемый способ установки – компиляция из исходных кодов. (Существуют бинарные пакеты для Redhat/Fedora, Debian, а также ebuild для Gentoo, правда, как правило, более старой версии по сравнению с тем, что доступно на сайте.) Однако прежде чем что-либо компилировать, необходимо получить исходный код Asterisk. Сделать это можно двумя способами: ! Скачать tarball с официального сайта [1]. ! Загрузить исходный код с CVS-сервера проекта. Первый способ достаточно прост, и вряд ли он вызовет какие-то проблемы, поэтому при установке Asterisk воспользуемся вторым способом. К тому же, если вам потребуется установить HEAD-версию, вам просто придется использовать CVS. (Для Asterisk основной веткой CVS является HEAD, поэтому для загрузки STABLE-версии необходимо указать ревизию (-r v1-0).) Процесс компиляции для обеих веток абсолютно одинаков, поэтому все, что написано далее, применимо и для HEAD, и для STABLE. Итак, нам понадобятся 3 модуля: zaptel – модуль аналоговой телефонии, libpri – модуль цифровой телефонии, и сам Asterisk. Для загрузки модулей с сервера CVS выполните следующие команды: # # # #

cd /usr/src export CVSROOT=:pserver:anoncvs@cvs.digium.com:/usr/cvsroot cvs login # введите пароль anoncvs cvs checkout -r v1-0 zaptel libpri asterisk

После выполнения последней команды в /usr/src будут созданы соответствующие подкаталоги. Процесс уста-

№6, июнь 2005

новки достаточно прост – необходимо поочередно зайти в каждый из каталогов и выполнить команды make clean и make install: # # # # # #

cd zaptel make clean install cd ../libpri make clean install cd ../asterisk make clean install samples

Последняя команда не только скомпилирует и установит Asterisk, но и скопирует стандартные файлы конфигурации в /etc/asterisk. Вообще установочный скрипт копирует файлы в 3 основных каталога: ! /etc/asterisk – расположение конфигурации; ! /usr/lib/asterisk/modules – место хранения модулей Asterisk; ! /var/lib/asterisk/ – здесь находятся дополнительные файлы asterisk (звуки, agi-скрипты, картинки и т. д.). Сам же исполняемый файл обычно помещается в /usr/ sbin/asterisk. Для проверки правильности установки выполним следующую команду: # asterisk -vvvvvcd

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

Рисунок 1. Консоль Asterisk

Не вдаваясь в подробности, напишем в консоли stop now и перейдем к более детальной настройке.

Чего же мы хотим? Прежде чем приступить к редактированию конфигурационных файлов Asterisk, давайте определим, что же именно мы хотим от него получить. Итак, нам необходимо: ! Обеспечить возможность разговора абонентов по IP (SIP). ! Создать персонифицированные голосовые ящики (с автоматической отсылкой голосовых сообщений на e-mail). ! Настроить «перехват», передачу и парковку звонков.

13


администрирование Таблица 1. Сравнениваем возможности программных клиентов SIP

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

А ты меня слышишь? Первое, что мы сделаем с нашим сервером, – научим его обслуживать внутренние звонки. Начнем с редактирования файла /etc/asterisk/sip.conf. Убедимся, что в секции general присутствуют следующие строки: [general] context=default allowguest=no bindport=5060 bindaddr=0.0.0.0

В первой строке мы определяем контекст, в который будут попадать все входящие звонки. Во второй строке мы запрещаем неавторизованный доступ к нашему серверу, что особенно важно в случае, если Asterisk будет доступен из Интернета. В двух последующих строках мы задаем порт и интерфейс, на котором ожидаем запросы SIP-клиентов. Теперь несколько слов о самих клиентах – они могут быть как программными (приложение на компьютере), так и аппаратными (автономное устройство, реализующее один из протоколов Asterisk). Для первого знакомства с Asterisk нам вполне хватит возможностей программных клиентов. Наиболее известные из них: X-Ten X-Lite, sjPhone, FireFly, MS Messenger, kPhone. Возможности этих программ лучше всего сравнивать, представив их в виде таблицы (см. таблицу 1). В зависимости от решаемой задачи можно использовать различные программные клиенты. Если ваш сервер будет преимущественно использоваться для внутренних звонков, то имеет смысл обратить внимание на программы с более функциональным интерфейсом (X-lite, sjPhone). В случае большого количества междугородних звонков (либо работы в условиях ограниченной пропускной способности или ненадежного канала) лучше использовать программы, 1 2 3

поддерживающие кодек G729 (из бесплатных – firefly). Для тестового примера предположим, что у нас есть 3 пользователя, использующие X-lite, sjPhone и MS Messenger соответственно. Отразим эту информацию в конфигурационных файлах. Начнем с sip.conf: [200] ; xlite phone type=friend host=dynamic username=200 secret=user1 _ password nat=no canreinvite=no context=ofÞce callerid=”User1” <200> allow=gsm allow=ulaw allow=alaw [201] ;sjphone type=friend host=dynamic username=201 secret=user2 _ password dtmfmode=rfc2833 context=ofÞce callerid=”User2” <202> allow=gsm allow=ulaw allow=alaw [203] ; ms messenger type=friend host=dynamic username=202 secret=user3 _ password dtmfmode=rfc2833 context=ofÞce callerid=”User3” <203> allow-ulaw allow-alaw

Небольшие пояснения по параметрам конфигурации. Поле type, определяющее тип клиента, может принимать три значения: ! user – возможны только входящие звонки; ! peer – возможны только исходящие звонки;

Доступно с использованием бесплатной внешней библиотеки. Здесь приводится субъективная оценка автора. Поддержка расширенной функциональности доступна в коммерческой версии.

14


администрирование ! friend – разрешены как исходящие, так и входящие вызовы.

Поле host позволяет определить IP-адрес, с которого разрешены подключения для данного клиента. В нашем случае задавать такое ограничение особого смысла нет, поэтому оставим динамические адреса (dynamic). Поля username и secret определяют имя пользователя и пароль, которые должны использоваться клиентом при регистрации. Dtmfmode задает способ передачи сигналов DTMF. Параметр nat говорит, может ли данный клиент работать из-за NAT. Canreinvite разрешает (yes) или запрещает (no) установку прямого соединения между участниками (минуя Asterisk). Некоторые клиенты поддерживают строго определенные способы работы, что необходимо отражать в файлах конфигурации. Context – имя контекста, в котором будет находиться данный абонент. CallerID – идентификационная строка, отображается при звонках от данного пользователя (АОН). После задания всех вышеописанных настроек и сохранения файла sip.conf перейдем к определению номерного плана. Для этого нам понадобится отредактировать файл /etc/asterisk/extensions.conf. Но, прежде чем запустить редактор, давайте более детально посмотрим на то, что входит в стандартную поставку. Номерной план в Asterisk (Dial plan) задается при помощи так называемых расширений (extension). В файле стандартной установки можно увидеть следующее: [demo] exten => exten => exten => exten => exten => exten => exten =>

s,1, Wait,1 s,n, Answer s,n, SetVar(TIMEOUT(digit)=5) s,n, SetVar(TIMEOUT(response)=10) s,n(restart), BackGround(demo-congrats) s,n(instruct), BackGround(demo-instruct) s,n, WaitExten

Обработка контекста demo начинается с записей, в которых «s» является первым символом. Так, сначала Asterisk подождет 1 секунду, потом поднимет трубку и ответит на звонок, установит значения переменных (строки 2, 3), проиграет содержимое файлов demo-congrats и demo-instruct и будет ожидать набора добавочного номера. Следующие строки определяют конкретные номера в контексте demo: exten exten exten exten exten exten exten

=> => => => => => =>

2,1, BackGround(demo-moreinfo) 2,n,Goto(s,instruct) 3,1, SetVar(Language()=fr) 3,2, Goto(s, restart) 8500, 1, VoiceMailMain 8500, n, Goto,s 1000, 1, Goto(default,s,1)

Итак, определены 4 номера – 2, 3, 8500 и 100. При звонке на номер 2 мы прослушаем сообщение demo-moreinfo, после которого Asterisk перенаправит нас в начало, к сообщению demo-instruct. Набрав номер 3, мы изменим язык данной сессии на французский. (Чтобы Asterisk мог «разговаривать» с вами на французском языке, необходимо наличие соответствующих файлов озвучки в папке /var/lib/asterisk/sounds/fr.) При наборе номера 8500 нам ответит си4

стема голосовой почты Asterisk. Номер 1000 отправит нас в начало контекста demo. Надеюсь, что теперь ситуация с контекстами немного прояснилась. Теперь добавим наши телефоны в этот номерной план. Для этого создадим следующий контекст: [ofÞce] exten => 200,1, Macro(stdexten,200,SIP/200) exten => user1, 1, Goto(200|1) exten => 201,1, Macro(stdexten,201,SIP/201) exten => user2, 1, Goto(201|1) exten => 202,1, Macro(stdexten,202,SIP/202) exten => user3, 1, Goto(202|1) include => demo

Мы определили три номера и три псевдонима, при наборе которых активируется макрос stdexten, отвечающий за обработку вызовов пользователей. Псевдонимы позволят звонить абоненту не только по его номеру, но и по имени. В качестве параметров макросу передается номер данного пользователя и имя его SIP-устройства. Давайте посмотрим, что же делает этот макрос: [macro-stdexten] exten => s, 1, Dial (${ARG2},20,t4) exten => s, 2, Goto(s-$(DIALSTATUS),1) exten => s-NOANSWER, 1, Voicemail(u${ARG1}) exten => s-NOANSWER, 2, (Goto(default,s,1)) exten => s-BUSY, 1, Voicemail(b,${ARG1}) exten => s-BUSY, 2, (Goto(default,s,1)) exten => _ s-., 1, Goto(s-NOANSWER) exten => a, 1, VoiceMailMain(${ARG1})

Данный макрос звонит указанному пользователю. Если в течение 20 секунд никто не ответил или вызываемый абонент был занят, звонящему проиграется соответствующее сообщение, после чего он получит возможность оставить сообщение голосовой почты. Правда, пока у наших абонентов голосовых ящиков еще нет. Исправим это недоразумение, добавив в файл /etc/asterisk/voicemail.conf следующие строки: [general] format=wav49 maxmessage=300 [ofÞce] 200 => 123, User1, user1@mail.company.com,,attach=yes 201 => 456, User2, user2@mail.company.com,,attach=yes 202 => 789, User3, user3@mail.company.com,,attach=yes

Этим мы определили 3 ящика голосовой почты для наших пользователей, с паролями 123, 456, 789 соответственно. При поступлении нового сообщения пользователю незамедлительно будет отсылаться e-mail на указанный адрес. Во вложении письма будет присутствовать само голосовое сообщение в формате wav (вместо wav можно использовать любой формат, поддерживаемый сервером). Максимальная длина сообщения – 5 минут. Если в качестве параметра ящика указать attach=no, то высылаться будет только уведомление об оставленных сообщениях. Для того чтобы сообщения отправлялись, нам понадобится определить еще один параметр – команду для отправки почты. По умолчанию она имеет следующий вид: ;mailcmd=/usr/sbin/sendmail –t

Символ t отсутствует в стандартной конфигурации. Если мы хотим использовать передачу звонков, его необходимо добавить.

№6, июнь 2005

15


администрирование Как видно из названия, для работы данной функции необходимо, чтобы на компьютере с Asterisk был установлен почтовый сервер sendmail или другой, имеющий подобной интерфейс вызова (postfix, exim и др.). Информацию по настройке почтового сервера можно найти в [4-6]. Для работы с голосовой почты с телефона в нашем номерном плане используется номер 8500. После ввода номера телефона и пароля пользователь получает доступ к интерфейсу управления своим голосовым ящиком. Помимо стандартных возможностей прослушивания перемещения и удаления сообщений пользователь может самостоятельно записывать персональные приветствия, менять свой пароль или отправлять голосовые сообщения другим пользователям. На этом базовую настройку Asterisk можно считать законченной, теперь самое время перейти к настройке наших программных клиентов.

Устанавливаем и запускаем соответствующий файл установки. Для настройки нажимаем на «кнопку с отверткой» (см. рис. 3).

Рисунок 3. Элемент интерфейса sjPhone после установки

Переходим на закладку «Profile» и нажимаем на кнопку «New». Создадим новый профиль «Asterisk» с типом «Calls though SIP Proxy». Перейдем на закладку «SIP Proxy» и введем IP-адрес (или имя) сервера Asterisk и нажмем «ОК» (см. рис. 4).

Настраиваем X-Lite Идем на сайт http://www.xten.com. Скачиваем, устанавливаем и запускаем программу X-Lite. При первом запуске программа предложит настроить микрофон и откроет окно настроек SIP прокси-сервера. В этом окне определим следующее: Enabled - Yes Display Name - Asterisk Username – 200 Authorization User – 200 Password – user1 _ password Domain/Realm - asterisk SIP Proxy – 192.168.0.205 Outbound Proxy – 192.168.0.20 Register – Always

Если все настройки сделаны правильно, то в окне X-Lite мы увидим:

Рисунок 4. Настраиваем параметры SIP sjPhone

В появившемся окне введем имя и пароль для данного сервера – 201 и user2_password соответственно. После закрытия окна свойств sjphone изменит свой вид. Если данные введены правильно, то мы увидим следующее (см. рис. 5).

Рисунок 2. X-Lite, зарегистрированный на сервере Asterisk

Теперь можно попробовать позвонить по тестовым номерам стандартной инсталляции – 2, 3, 1000, 1234, 1236, 500, 600, 8500, 200, 201, 202. При звонках на последние два номера вам, скорее всего, ответит Allison Smith – обладательница приятного голоса, которым разговаривает Asterisk. Эти телефоны пока еще не настроены, и о том, как их можно найти, Asterisk еще ничего не знает. Что ж, давайте исправим это недоразумение!

Настраиваем sjphone Скачиваем с сайта http://www.sjlabs.com программу sjphone. 5

IP-адрес или DNS-имя машины с Asterisk.

16

Рисунок 5. sjPhone, зарегистрированный на сервере Asterisk

Настраиваем Windows Messenger Если устанавливать специального клиента не хочется, можно попробовать разговаривать с помощью Windows Messenger. Работа с Asterisk не является для него стандартной


администрирование возможностью, так что вооружимся редактором реестра и отправимся в путь. Если мы используем Windows Messenger версии ниже 4.7, то нам понадобится следующий ключ реестра: HKEY_CURRENT_USER\Software\Microsoft\MessengerService. Если же установлена версия 5.1, то ключ будет другим6: HKEY_CURRENT_USER\Software\Policies\Microsoft\Messenger. По данному адресу нам необходимо исправить значение поля CorpPC2Phone с «0» на «1». Перезапустим Messenger. Из меню откроем «Tools → Options → Accounts». В поле «Communications Service Account» введем имя пользователя Asterisk – 202@asterisk. Нажмите на кнопку «Advanced» и в открывшемся диалоговом окне введите адрес сервера Asterisk, попутно отметьте UDP в качестве транспорта. Теперь попробуем подключиться к серверу Asterisk (sign in) с именем 202@asterisk. В случае успеха мы увидим следующее (см. рис. 6).

версален. Вы определяете так называемые группы вызова – телефоны, звонки на которые можно перехватывать, а также для каждого из телефонов определяете, какие группы они могут перехватывать (см. рис. 7).

Рисунок 7. Группы вызова и группы перехвата

В нашем случае мы реализуем самый простой вариант перехвата звонков – все телефоны смогут перехватывать звонки друг друга. Для этого внесем некоторые дополнения в файл sip.conf. В секциях описания наших телефонов (200, 201, 202) добавим две строчки: callgroup=1 pickupgroup=1

Теперь добавим саму возможность «перехвата» звонков, внеся соответствующие изменения в номерной план. В контекст [office] после правил вызова абонентов добавим следующую строчку7: exten => *8,1,PickUP()

Рисунок 6. Windows Messenger, зарегистрированный на сервере Asterisk

Итак, теперь все три клиента настроены. Связь можно проверить, позвонив с каждого из них на приведенные выше номера нашего сервера.

Иду на перехват! Как вы, наверное, уже догадались, сейчас речь пойдет о «перехвате звонков». Для начала несколько слов о том, что же это такое в понимании Asterisk. Допустим, вы слышите, как у человека рядом звонит телефон, а его самого на месте нет. По специфике вашей деятельности вы сами можете ответить на этот звонок, не заставляя звонившего лишний раз обращаться к голосовой почте. Для того чтобы не подходить к телефону физически, можно «перехватить» звонок со своего телефона. Нажав определенную последовательность клавиш, вы сможете ответить на «чужой» вызов. В Asterisk поддерживается два вида таких «перехватов»: ! в рамках указанной группы; ! конкретного номера. Для перехвата конкретного номера вы набираете на телефоне: *8#номер_звонящего_телефона, после чего звонок переключается на ваш номер. Первый способ более уни6 7

Теперь, после перезагрузки номерного плана Asterisk, у нас появится возможность перехвата вызовов. Для этого, когда вы услышите звонок телефона, просто нажмите *8, и разговор будет переключен на ваш телефон.

Можно здесь припарковаться? Под «парковкой» в Asterisk понимается следующая ситуация: вам кто-то позвонил, в процессе разговора вы поняли, что вам нужно перейти к другому телефону. Вы «паркуете» ваш звонок в определенном месте, подходите к другому телефону и «подключаете» оставленный ранее звонок. Парковка в Asterisk сделана с использованием другой удобной возможности – передачи звонка. Определив некую последовательность символов (по умолчанию это 1#), можно в процессе разговора переводить звонки другим абонентам. Специфика же парковки заключается в том, что есть некие места – парковочные слоты, в которые собеседников можно помещать и забирать. Давайте разберемся со всем этим на практике. Параметры парковки и передачи вызовов определяются в файле features.conf. В стандартной инсталляции для парковки звонков определяется 20 номеров, начиная с номера 701. Для активации функции убедимся, что файл features.conf содержит следующие данные: [general] parkext => 700 parkpos => 701-720

Если такого пути нет, его необходимо создать. CorpPC2Phone имеет тип DWORD. Если вам нужно просто включить возможность перехвата для всех абонентов Asterisk, вместо модификации номерного плана можно просто раскомментировать строчку pickupexten в файле features.conf.

№6, июнь 2005

17


администрирование context => parkedcalls xfersound =beep xferfailsound = beeper featuredigittimeout = 1000

Описание конфигурационных файлов Asterisk

[featuremap] blindxfer => #1

Итак, для «парковки» звонка будем использовать номер 700, при его обратном подключении (или ошибке подключения) мы будем слышать звуковой сигнал, для активации режима передачи звонка будем использовать последовательность #1, при этом пауза между нажатиями кнопок не должна превышать одной секунды. Теперь внесем изменения в номерной план, добавив в контекст [office] следующую строчку: include => parkedcalls

Теперь, если во время разговора мы наберем 1#700, звонок «припаркуется» в свободный слот (Эллисон проговорит нам его номер). Затем мы можем подойти к другому телефону (при данных настройках на это у нас есть 45 секунд) и, набрав известный нам номер слота, продолжить разговор с данного телефона.

Включаем межгород (Межгород? Соединяю...) Для совершения междугородних звонков можно использовать как более «родной» для Asterisk протокол SIP, так и более распространенный среди российских провайдеров IPтелефонии протокол H323. Поддержка H323 появляется после установки определенных модулей (в нашей инсталляции этих модулей пока нет), а вот SIP присутствует по умолчанию. Кроме того, есть как минимум один российский провайдер, работающий с этом протоколом, – сеть Тарио [7]. Работа в данной сети не бесплатна, поэтому предварительно нам придется зарегистрироваться8. После этого можно приступить к настройке. Откроем уже знакомый нам файл sip.conf и добавим в него следующие записи 9: [tario _ out] type=peer host=адрес _ сервера _ tario username= номер _ лицевого _ счета _ tario fromusername=номер _ лицевого _ счета _ tario fromdomain=домен _ tario secret= пароль _ tario usereqphone=yes

Для входящих вызовов: register => номер _ лицевого _ счета _ tario:пароль@tario _ in [tario _ in] type=user context=tario _ inc host=ip _ адрес _ сервера _ tario

Для исходящих звонков через этого провайдера будем использовать префикс 8. В контексте [office] добавим следующую строчку: exten => _ 8, Dial(SIP/${EXTEN:1}@tario _ out,20,rT) 8 9

Конструкция EXTEN:1 означает то, что при передаче звонка шлюзу провайдера первый символ будет отбрасываться. Все входящие звонки от провайдера будем принимать в контекст [tario_inc]. Его можно сконфигурировать примерно так: [tario _ inc] exten => s,1,Wait, 1 exten => s, 2, Answer exten => s,3, BackGround(local-welcomе) exten => s,4, WaitExten exten => 200,1, Macro(stdexten,200,SIP/200) exten => 201,1, Macro(stdexten,201,SIP/201) exten => 202,1, Macro(stdexten,202,SIP/202) exten => 8500,1, VoiceMailMain exten => 8500,n, Hangup

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

Несколько слов о безопасности При определении контекстов, доступ к которым будут получать внешние пользователи, необходимо дважды (а то и трижды) подумать. Так, если бы в последнем примере

О том, как это сделать, вы сможете прочитать на официальном сайте [7]. Предполагается, что подключение к провайдеру производится с компьютера, имеющего реальный интернет-адрес (без NAT).

18


администрирование вместо «ручного» создания правил для дозвона до каждого пользователя мы бы просто написали: include => ofÞce

то все внешние пользователи, звонящие на наш сервер, помимо вполне легального доступа к внутренним номерам и серверу голосовой почты также получили бы не совсем легальный доступ к междугородним звонкам с использованием нашего провайдера. Однако дублировать записи вызова тоже не слишком красиво, поэтому более правильно было бы перенести все доступные извне правила маршрутизации в отдельный контекст [office-rules], а в контексте [office] вместо них написать так: [ofÞce] include => [ofÞce-rules] exten => _ 8, Dial(SIP/${EXTEN:1}@tario _ out,20,rT

После этого в контексте [tario-inc] вместо повторного перечисления правил дозвона до пользователей можно смело написать include => [office-rules]. При такой схеме officerules не содержит ничего лишнего, и соответственно воспользоваться нашим «межгородом» внешние пользователи уже не смогут.

Заключение Итак, сегодня мы рассмотрели основы настройки Asterisk и связанные с этим подробности – файлы конфигурации пользователей, настройки номерного плана, настрой-

№6, июнь 2005

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

Литература и ссылки: 1. 2. 3. 4.

http://www.asterisk.org. http://www.asterisk.org/index.php?menu=features. http://www.automated.it/asterisk. Шергин Д. Установка IMAP4-сервера на базе Cyrusimapd + sendmail. – Журнал «Системный администратор», №10, октябрь, 2003 г. – 10-14 c. 5. Бешков А. Архитектура Postfix. – Журнал «Системный администратор», №6, июнь, 2004 г. – 4-8 c. 6. Стахов В. Почтовая система на базе MTA Exim. – Журнал «Системный администратор», №7, июль, 2004 г. – 6-13 c. 7. http://www.tario.net. 8. http://www.voip-info.org. 9. http://www.asterisk-support.ru. 10. http://lists.digium.com. 11. Платов М. Что важно знать об IP-телефонии. – Журнал «Системный администратор», №5, май, 2005 г. – 20-25 c.

19


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

ИСПЫТЫВАЕМ ANTMON – НОВУЮ СИСТЕМУ МОНИТОРИНГА Неприятности с компьютерами и сервисами случаются в самый неподходящий момент. Избежать их, быстро исправить положение, а иногда и предвидеть – всё это может мониторинг. Antmon – новая система мониторинга, созданная для того, чтобы жизнь сисадмина была спокойнее.

СЕРГЕЙ ЖУМАТИЙ 20


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

В

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

Какие системы мониторинга бывают Большинство некоммерческих систем мониторинга нацелены на простейший мониторинг доступности узла или работоспособности конкретного сервиса. Многие имеют встроенные методы проверок и не могут быть дополнены, часть не имеет средств оповещения о сбоях (например, Ganglia). Из заслуженно известных систем стоит упомянуть PIKT, OpenView и Nagios. Последние два продукта, кроме широкой функциональности, имеют и разветвлённые средства визуализации. Какому админу не будет приятно посмотреть на красивую картинку своей сети? К недостаткам Nagios, да и большинства других систем мониторинга (к примеру, snmp-обработчики открытых snmpсерверов) можно отнести реализацию процедуры сбора не «вшитых» намертво параметров. Каждый модуль для мониторинга нового параметра (или группы параметров) представляет собой отдельную программу, которая запускается всякий раз, когда необходимо получить значения параметров. А если таких параметров десяток и не на одном, а нескольких серверах? Для серьёзного мониторинга сервера нужно снимать данные по температурам, скорости вращения вентиляторов, загрузке процессоров, объёмам передаваемых данных. А к тому же неплохо бы смотреть активность сервисов (кто «съел» всю память – почтовик, база данных или самописный сервер приложений?). А если надо собирать статистику не только по доступности какого-либо сервиса, но и локальные данные на удалённых серверах? К примеру, свободный объём на диске или температуру процессора? Накладных расходов набегает немало, и каждый раз запускать десяток программ становится накладно. Да и запускаются все они на головной машине, проверяя параметр удалённо. Есть способы решения этих проблем. Например, написать свой сервис, который будет снимать нужные данные и отдавать их по SNMP. Решение хорошее, но что если на сервере уже есть сервис для SNMP? Весьма веро-

№6, июнь 2005

ятно, что будет иметь место конфликт по портам. Можно повесить свой сервер SNMP и на нестандартный порт, но тогда агенту мониторинга надо будет объяснять, что одни данные надо с этого порта брать, а другие – с того... Есть серверы SNMP, которые допускают подключение внешних обработчиков, но все такие обработчики для получения одного значения каждый раз запускают отдельный процесс, а если их с десяток и опрашивать их надо часто? Да и написать такой сервис тоже дело не получаса... Многие наверняка скажут: «Ничего, мы же пользуемся». Не буду спорить, во многих случаях подход себя оправдывает (всё-таки SNMP именно для этого и создавался), но, как показывает практика, не всегда. К примеру, получение по SNMP статистики с коммутатора 3Com 3300 по всем портам может занять около минуты – проверено. А это далеко не всегда хорошо. OpenView является коммерческим продуктом и полностью основан на использовании SNMP. Если вы используете серьёзные дорогостоящие системы хранения и базы данных, то, скорее всего, у вас уже есть поддержка агентов для OpenView, и его использование будет весьма продуктивно. Однако, чтобы добавить к нему своего агента для съёма нестандартных параметров (OpenView позволяет это делать), придётся изрядно попотеть... Взять хотя бы минимальные требования для пакета OpenView Operations, который необходим для разработки: HP-UX version 11.0, 11.11/Solaris 8,9, 1 GB dedicated RAM/5 GB for management server installation, Oracle 9i Enterprise. Вышесказанное не уменьшает достоинств упомянутых систем мониторинга. Но когда мне пришлось контролировать несколько десятков узлов вычислительного кластера и серверы для его поддержки, оказалось, что требования к системе мониторинга довольно высоки, и мало какие из существующих систем могут им удовлетворить. Особенно если добавить требование повышенной надёжности. Что делать, если завис или оказался недоступен сервер с головным монитором? Если канал в Интернет «умер»? Тогда админ уже ничего не узнает.

Система Antmon Для решения обозначенных проблем я создал систему мониторинга Antmon (http://parcon.parallel.ru/antmon). Она была создана под конкретный комплекс, но заложенные в неё принципы построения дают ей очень широкие (как я полагаю) возможности применения. Пока и головные серверы, и агенты системы работают только под UNIX-совместимыми операционными системами, под Windows они не тестировались, но порт агента и головного сервера под эту платформу планируется в самое ближайшее время. Кроме того, система продолжает развиваться, и я всегда открыт пожеланиям. Кратко сформулирую требования, которые легли в основу Antmon: ! лёгкая расширяемость (написать модуль расширения для снятия нестандартных параметров или реакции на нештатную ситуацию должно быть по силам среднему программисту); ! нетребовательность к ресурсам (затраты на работу мониторов должны быть минимальны);

21


администрирование ! высокая стабильность (отказ головного сервера не должен приводить к полному отказу системы, по крайней мере администратор должен узнать об этом первым).

Рассмотрим общую архитектуру системы Antmon и заодно увидим, как в ней удовлетворяются сформулированные требования.

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

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

22

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

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

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

Примеры Вот пример конкретного конфигурационного файла с комментариями.


администрирование Листинг 1. Кольцевая конфигурация heads head1 head2 serv # Используем 3 головных сервера с именами # head1, head2 и serv topo 1 2 3 2 # Описываем топологию. # Кратко – 1–й сервер будет посылать пакеты 2–му # для подтверждения того, что он «жив», # 2–й – 3–му, а 3–й – 2–му. # # Если 1–й сервер откажет, об этом узнает только 2–й # (но он «расскажет» 3–му) head _ ping 120 # Посылаем ping (точнее keep _ alive) остальным серверам # каждые 2 минуты head _ tmout 300 # Если в течение 5 минут нет сигнала от другого сервера, # он считается сбойным action mail _ servfail action _ mail root@superserver.ru action _ line Server $addr fails. # Описываем действие – передать на вход модулю # action _ mail указанную строку, сам модуль # action _ mail запускается с параметром – адресом # администратора action mail _ status action _ mail root@superserver.ru action _ line $name on server $addr is $state # Ещё одно действие – тоже отсылка письма action down action _ shutdown action _ line $addr # Другой вариант реагирования – зайти на указанный сервер # по ssh и выполнить shutdown action log action _ log /var/log/Antmon _ log action _ line $addr $name $val $state # Реагирование в виде записи в файл журнала on _ head _ death mail _ servfail # В случае сбоя головного сервера оповестить # администратора с помощью описанного выше действия # mail _ servfail ##################################################### # Описание параметров мониторинга. # Все инструкции описывают шаблон для параметра – # диапазон значений, реакции на события и т. п. # # Инструкции names или addr _ set «актуализируют» шаблон, # реализуя описанные параметры на сервере из инструкции # addresses или на указанных серверах с именем # из инструкции name соответственно. # # Шаблон не обнуляется после «актуализации», # так что нет необходимости описывать каждый параметр # заново – достаточно модифицировать предыдущий

mons 1 2 # Проверять могут мониторы head1 и head2. # head1 имеет приоритет names http.antmod test _ url # Формат: имя модуля [аргументы] название # В этот момент происходит объявление сенсора # с указанным именем на агенте по адресам, # указанным в последней инструкции addr либо addresses # (тогда объявляются сенсоры на всех перечисленных хостах) addresses host1 host2 host3 min 5000 max 100000 min _ ret 5500 max _ ret 100000 ret _ count 2 # Меняем параметры сенсоров. # Описанные ранее параметры, которые не изменены, # не сбрасываются! # Проверяем на 3-х хостах on _ fail down mons 2 3 # Ответственные мониторы – head2 и serv. # head2 имеет приоритет names fans.antmod w83781-isa-0290 w83781-isa-0290 fan1 # Объявляем сенсор adsdresses node1 node2 node3 node4 # Объявляем сенсоры с указанным ранее # в инструкции names именем на узлах node1–node4 # # Проверяем вентилятор процессора на узлах node1–node4, # используя их локальные агенты

В этом примере всего два сенсора. Один из них (доступность веб-страницы) контролируется сервером head1 и страхуется сервером head2, а второй – сервером head2 и страхуется сервером serv. Как видим, настройка головных мониторов – дело несложное. Агенты в конфигурации не нуждаются, достаточно их установить, запустить и скопировать в рабочий каталог необходимые модули. Ещё один пример, чуть сокращённый – конфигурация мониторинга трёх площадок с контролем доступности друг друга (предполагается, что VPN они не соединены). Листинг 2. Три площадки heads site1 site2 site3 # Головные сервера площадок – site1, site2 и site3

addressess host1 # Имя хоста, на котором работает агент

topo 1 2 3 1 # Все контролируют друг друга

min 200 max 200 # Диапазон допустимых значений кода веб–страницы

action mail _ fail action _ mail root@superserver.ru action _ line $name fails. action sms _ servfail action _ sms 1234567 action _ line Server $addr fails.

min _ ret 200 max _ ret 200 # Диапазон значений для возврата в состояние «ОК» bad _ count 2 # Один сбой странички допускаем, 2 – уже нет ret _ cout 1 # Для возврата в состояние «ОК» достаточно одного # «хорошего» результата её опроса

action log action _ log /var/log/Antmon _ log action _ line $addr $name $val $state action restart _ base action _ baserst action _ line restart on _ head _ death sms _ servfail # Шлём sms, если один из серверов помер

on _ fail mail _ state log # При сбое – информировать администратора и сделать # запись в журнале

addr 192.168.10.10 # Сервер баз данных min 0 max 0 # Код успешного статуса базы данных

on _ ret mail _ state log # При возврате в состояние «ОК» – тоже address serv1 # проверять будем на агенте на head1

min _ ret 0 max _ ret 0 # Диапазон значений для возврата в состояние «ОК»

№6, июнь 2005

23


администрирование bad _ count 1 # Первый же сбой фатален ret _ cout 1 on _ fail mail _ fail restart _ base log # При сбое базы – перестартовать её. # Информировать администратора и сделать запись # в журнале on _ ret log mons 1 # Проверять будет только site1 names dbcheck.antmod database addr 1.2.3.4 # Вторая площадка с реальными адресами on _ fail mail _ fail log mons 2 1 3 # Первая и третья площадки могут быть «на подхвате» names smtp.antmod mail.myserv.ru; http.antmod www.myserv.ru # В инструкции names можно определить и несколько # сенсоров addr 5.6.7.8 # Третья площадка с реальными адресами mons 3 2 1 names smtp.antmod mail.serv2.ru; http.antmod www.serv2.ru # За этот сенсор ответственны все mons 3 min 0 max 70 min _ ret 0 max _ ret 60 names fantemp.antmod w83781-isa-0290 w83781-isa-0290 fan1 # Вентилятор на 5.6.7.8 контролирует только site3

Заметим, что все сенсоры, кроме вентилятора на третьей площадке, имеют два состояния – 0 и 1. 0 означает нормальную работу. Поэтому диапазон «хороших» значений (0-0) прописывается один раз и потом просто наследуется сенсорами, объявляемыми позднее до тех пор, пока этот диапазон не переопределяется. Другой пример – мониторинг состояния вычислительного кластера из 8 узлов, его доступности извне (с внешнего сервера в другой сети) и проверка работоспособности сайта кластера. Сейчас вычислительные кластеры отнюдь не редкость, так что пример может быть весьма показателен. Листинг 3. Кластер и внешняя площадка. heads clusterhead friend.ru topo 1 2 1 # Оба контролируют друг друга action mail _ fail action _ mail root@superserver.ru action _ line $name fails. action sms _ servfail action _ sms 1234567 action _ line Server $addr fails. action log action _ log /var/log/Antmon _ log action _ line $addr $name $val $state on _ head _ death sms _ servfail # Шлём sms, если один из серверов помер on _ fail action _ log mail _ fail on _ ret action _ log addresses node1 node2 node3 node4 node5 node6 node7 node8 mons 1 min 0 min _ ret 0 max 2.3

24

max _ ret 1.9 # Максимально допустимая нагрузка на 2-процессорный узел bad _ count 3 ret _ cout 2 names sysstat.antmod loadavg max 70 # Максимальная температура names fantemp.antmod w83781-isa-0290 w83781-isa-0290 fan1 max 2 bad _ count 1 ret _ cout 1 names sysstat.antmod names sysstat.antmod names sysstat.antmod names sysstat.antmod

eth0 _ rcv _ errs eth0 _ sent _ errs eth0 _ sent _ colls nfs _ retrans

on _ fail mail _ fail log on _ ret log mons 1 2 min 200 min _ ret 200 max 201 max _ ret 201 addresses localhost # Небольшое жульничество, каждый головной сервер будет # опрашивать локального агента, но сначала это будет # делать только первый names http.antmod www.server.com

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

Недостатки Antmon Отмечу и недостатки. Система Antmon пока не работает на платформе Windows (хотя я не проверял вариант компиляции под cygwin). Кроме того, полный перенос логики на головные сервера имеет свою отрицательную сторону – излишнюю передачу данных для некоторых видов параметров мониторинга. Иногда удобнее, чтобы агент сам определял валидность параметра и только в случае смены его статуса (OK → FAIL, например) информировал об этом головной сервер, аналогично механизму Trap в SNMP. В систему Antmon уже заложена основа для реализации такой схемы работы (параллельно с вышеописанной).

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


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

АВТОМАТИЗАЦИЯ MS WINDOWS, ИЛИ AUTOIT КАК МЕЧТА ЭНИКЕЙЩИКА ЧАСТЬ 3

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

АЛЕКСЕЙ БАРАБАНОВ Создаем диск автоматической установки Если мы собираемся вас инструктировать перед обновлением программного обеспечения системы, не беспокойтесь. Мы ведь никуда не денемся, когда это закончится!

За основу возьмем диск Windows XP Professional с интегрированным 2-м сервиспаком, что на сегодня является наиболее свежей версией. Это будет единственное соприкосновение с Windows в процессе производства. Все остальные действия будем совершать в среде Linux. Базовые сведения по процессу автоматической установки Windows, вы можете получить, воспользовавшись ссылками [1, 2]. Теперь перейдем от теории к практике. Сначала подготовим исходный материал для построения дистрибутивного диска. Здесь особо отмечу, что не стоит излишне демонизировать этот процесс. Дистрибутив – это обычный набор архивов, записанный вместе с установщиком на CD-диск. Совершенно не важно, какое имя имеет полученный диск, какая у него дата создания, и какая контрольная сумма у имиджа этого диска и файлов, в него входящих. Точно также не следует надеяться найти загрузчик диска в 20 секторе. Главное, чтобы установщик на таком диске нашел все нужное для своей работы. Очевидно, что изначально установщик имеет очень много встроенных возможностей. Но так как нас интересует лишь один вариант установки, то можно с уверенностью утверждать, что часть файлов с оригинального дистрибутивного

№6, июнь 2005

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

Подготовим дистрибутивные файлы Итак, приступим. Все пути в Linux будут приводиться с использованием «/» и задавая их положение в Linux-нотации, а пути в Windows – с «\» и с указанием буквы, использованного устройства или подразумевая положение от рассматриваемого корня, например от I386 (см. листинг 1). Листинг 1. Содержимое исходного диска, примонтированного в точке /cdrom /cdrom # ls -als total 2990 2 dr-xr-xr-x 1 root root 2048 Sep 7 2004 . 4 drwxr-xr-x 16 root root 4096 Mar 14 14:32 .. 2 dr-xr-xr-x 1 root root 2048 Sep 7 2004 Autorun 5 -r--r--r-- 1 root root 4952 Oct 20 2001 Bootfont.bin 312 dr-xr-xr-x 1 root root 319488 Sep 7 2004 I386 2 dr-xr-xr-x 1 root root 2048 Sep 7 2004 Soft 1 -r-xr-xr-x 1 root root 10 Aug 23 2001 WIN51 1 -r-xr-xr-x 1 root root 10 Aug 23 2001 WIN51IP 1 -r--r--r-- 1 root root 2 Aug 29 2002 WIN51IP.SP1 1 -r--r--r-- 1 root root 56 May 19 2003 autorun.inf 2 dr-xr-xr-x 1 root root 2048 Sep 7 2004 cmpnents 2 dr-xr-xr-x 1 root root 2048 Sep 7 2004 crack 35 -r--r--r-- 1 root root 35371 Jul 17 2004 readme.htm 1 -r--r--r-- 1 root root 29 Feb 11 2003 serial.txt 2524 -r--r--r-- 1 root root 2584576 Aug 17 2004 setup.exe 97 -r--r--r-- 1 root root 98665 Jul 17 2004 setupxp.htm 1 -r--r--r-- 1 root root 2 Aug 17 2004 win51ip.SP2

25


администрирование Выберем местом создания нового дистрибутива /heap/ Windows/uawsp2. Скопируем туда часть исходного диска, исключив очевидно лишнее, и добавив то, что указано в листинге 2. Листинг 2. Рабочая директория после копирования исходного диска /heap/Windows/uawsp2 # ls -als total 168 4 drwxr-xr-x 3 root root 4096 Feb 6 00:12 $OEM$ 4 drwxr-xr-x 6 root root 4096 Mar 3 14:54 . 4 drwxr-xr-x 10 root root 4096 Mar 16 13:17 .. 8 -r--r--r-- 1 root root 4952 Oct 20 2001 Bootfont.bin 116 dr-xr-xr-x 7 root root 114688 Feb 2 21:45 I386 4 -r-xr-xr-x 1 root root 10 Aug 23 2001 WIN51 4 -r-xr-xr-x 1 root root 10 Aug 23 2001 WIN51IP 4 -r--r--r-- 1 root root 2 Aug 29 2002 WIN51IP.SP1 4 -r--r--r-- 1 root root 26 Feb 2 22:43 autorun.inf 4 drwxr-xr-x 2 root root 4096 Dec 5 14:52 boot 8 -r--r--r-- 1 root root 4286 Apr 11 2003 icon.ico 4 -r--r--r-- 1 root root 2 Aug 17 2004 win51ip.SP2

Прокомментирую состав файлов в корне дистрибутивного диска: $OEM$ – директория с дополнительным ПО, о ее содержимом мы поговорим позже; Bootfont.bin – шрифт текстового режима установки; I386 – директория с дистрибутивными файлами; WIN51 – маркерный файл, соответствующий Windows v5.1; WIN51IP – маркерный файл, соответствующий Windows XP Professional; WIN51IP.SP1 – маркерный файл, соответствующий первому сервиспаку; autorun.inf – блокировка автозапуска; boot – директория загрузчика; icon.ico – иконка диска; win51ip.SP2 – маркерный файл, соответствующий второму сервиспаку. Обратите внимание, регистр символов для наименований служебных меток не имеет значения и все имена соответствуют правилу 8.3. Это верно только в отношении указанных файлов. Все остальные названия файлов уже не ограничиваются спецификацией имен древнего FAT и ортодоксальной версии ISO9660. Маркерные файлы, содержимое которых далее никак не обрабатывается, то есть может быть любым, и Bootfont.bin берем с исходного диска. Иконка имеет чисто косметическое значение (см. листинг 3). Листинг 3. Файл автозапуска /heap/Windows/uawsp2 # cat autorun.inf [autorun] ICON=Icon.ico

312 2 2 36 2 2 2 2 2 4

dr-xr-xr-x dr-xr-xr-x dr-xr-xr-x dr-xr-xr-x dr-xr-xr-x dr-xr-xr-x dr-xr-xr-x dr-xr-xr-x dr-xr-xr-x dr-xr-xr-x

1 1 1 1 1 1 1 1 1 1

root root root root root root root root root root

root root root root root root root root root root

319488 2048 2048 36864 2048 2048 2048 2048 2048 4096

Sep Sep Sep Sep Sep Sep Sep Sep Sep Sep

7 7 7 7 7 7 7 7 7 7

2004 2004 2004 2004 2004 2004 2004 2004 2004 2004

. .. ASMS COMPDATA DRW SYSTEM32 WIN9XMIG WIN9XUPG WINNTUPG lang

При копировании исключим те поддиректории, что относятся к вариантам установки Windows XP в режиме миграции и обновления с предыдущих версий. Получится следующее: Листинг 5. Дистрибутивные поддиректории, которые надо составить /heap/Windows/uawsp2 # ls -als I386 | grep dr-x 116 4 16 4 4 4

dr-xr-xr-x 7 root root dr-xr-xr-x 15 root root dr-xr-xr-x 2 root root dr-xr-xr-x 4 root root dr-xr-xr-x 2 root root dr-xr-xr-x 2 root root

114688 4096 16384 4096 4096 4096

Feb Sep Sep Sep Sep Sep

2 7 7 7 7 7

21:45 2004 2004 2004 2004 2004

Это позволит сильно сократить размеры создаваемого дистрибутива и освободит место для размещения дополнительных программ. Директории $OEM$ и boot будут созданы и наполнены содержимым в процессе дальнейшей работы. В сумме получилось весьма немного: Листинг 6. Объем оставшегося дистрибутива /heap/Windows/uawsp2 # du -sh 437M

.

Для дополнительных программ остается еще почти 300 Мб, а с учетом overburn еще больше. Теперь заполним директорию boot. Это техническая директория, используемая в процессе построения имиджа загружаемого диска. В нее надо будет поместить загрузчик для ISO9660 и далее указать ее же как целевую для размещения каталога диска. В собранном диске эта директория вместе с содержимым будет скрыта от просмотра. Так, в нее надо положить загрузочный сектор для Windows. Как уже было сказано, нет простого способа экстрагировать этот сектор из рабочего имиджа. Дело в том, что ISO9660 имеет структуру подобную архивному файлу, и положение загрузочного сектора определяется порядком его обхода при построении имиджа. Поэтому рекомендуется или найти этот сектор в Интернете, или загрузить прилагаемый к этой статье [3]. Загрузочный сектор в ходе своего выполнения обращается к двум другим фазам загрузки (см. листинг 7). Листинг 7. Подстроки, выделенные из загрузчика /heap/Windows/uawsp2 # strings boot/ntboot.bin

Самым важным преобразованиям подвергнем директорию с дистрибутивными файлами I386. В исходном диске она содержит следующие поддиректории: Листинг 4. Поддиректории с дистрибутивными файлами /cdrom # ls -als I386 | grep dr-x

26

. ASMS COMPDATA DRW SYSTEM32 lang

CDBOOT: Cannot boot from CD - Code: 0 CDBOOT: Couldn't find NTLDR CDBOOT: Memory overflow error &8G SVRP XZ^[ SETUPLDR.BINBOOTFIX.BINI386


администрирование Можно понять по последней строке, что они размещены в директории I386 под именами SETUPLDR.BIN и BOOTFIX.BIN. Последний из них является тем самым программным кодом, который запрашивает разрешения загрузки с CD: Листинг 8. Подстрока сообщения, сопровождающего загрузку /heap/Windows/uawsp2 # strings I386/BOOTFIX.BIN Press any key to boot from CD.

И в случае нажатия любой клавиши на локальной клавиатуре управление передается на SETUPLDR.BIN, который в свою очередь и производит запуск процедуры установки. Вот окончательное содержимое директории boot: Листинг 9. Содержимое директории boot /heap/Windows/uawsp2 # ls -als boot total 12 4 drwxr-xr-x 2 root root 4096 Mar 17 01:05 . 4 drwxr-xr-x 5 root root 4096 Mar 17 17:17 .. 4 -rw-r--r-- 1 alekseybb users 2048 Dec 5 14:25 ntboot.bin

Приступаем к установке Установка Windows XP производится в три этапа. Каждый из которых начинается с загрузки, и все, кроме последнего, завершаются перезагрузкой. Перечислю все происходящие внутри этапов технологические действия в порядке их наступления и попутно прокомментирую самое важное.

Первый этап Происходит в текстовом режиме: 1. Запуск загрузчика установочного диска boot/ntboot.bin. 2. Запуск i386/bootfix.bin. 3. Запуск i386/setupldr.bi. 4. Чтение и интерпретация i386/txtsetup.sif, i386/winnt.sif и других *.sif. 5. Загрузка драйверов оборудования. 6. Запуск system32/ntdll.dll и system32/smss.exe. 7. Копирование файлов с дистрибутивного диска. 8. Обновление hive*.inf в реестр. 9. Перезагрузка. Первые три пункта уже были описаны. Четвертый, на котором, кстати, проверяется синтаксическая правильность используемых файлов, весьма интересен. Txtsetup.sif содержит подробное описание всех дистрибутивных файлов и дисковых меток win51ip.sp*, задает режимы запуска первой фазы «/fastdetect /noguiboot /nodebug» и многое другое. Читать это «чудище» размером в 468 Кб одно удовольствие. Модифицируя указанный текстовый файл, можно с Windows творить что угодно. В этом же файле должны быть «прописаны» и автоматически устанавливаемые драйвера. Но самый важный в контексте рассматриваемой темы – файл winnt.sif. Это тот самый файл ответов, который позволяет выполнять автоматическую установку и настройку Windows. Этот файл надо будет создать. Его кодировка, как и всех текстовых управляющих файлов, должна соответствовать кодовой странице cp866. Но так как вся разработка ведется под Linux, то первоначальный набор этого файла про-

№6, июнь 2005

изводится в локали среды разработки, в данном случае в koi8-r, а затем полученный файл конвертируется в нужную кодировку и размещается в директории I386 (см. листинг 10). Подготовленную версию файла вы можете посмотреть по ссылке [4]. Листинг 10. Конвертация в cp866 # iconv -f koi8-r -t cp866 WINNT.SIF.koi8r | ↵ awk '{print $0 "\015"}' > ↵ /heap/Windows/uawsp2/I386/WINNT.SIF

Текст обильно снабжен комментариями. Поэтому не буду приводить его полностью. Лишь отмечу то, что имеет вариантную настройку, важную для нас. На первом этапе у нас есть выбор, сделать ли установку полностью автоматической или оставить ручной выбор раздела. Выберем последнее в секции, определяющей размещение данных: [Data] ; Включим режим ручного выбора раздела установки. AutoPartition=0

При полностью автоматической установке не произойдет ничего плохого, если все работы производятся только в рамках предприятия. Но ручной вариант позволяет применять полученный диск еще и в приватной практике, когда жесткие диски разбиваются не столь единообразно. Для этого в секции, отвечающей за режимы автоматической установки, укажем запрет автоматического переразбиения диска и автоматического преобразования файловой системы: [Unattended] ; Запрещаем автоматическое переразбиение диска. Repartition=No

То есть все необходимые вопросы, касающиеся размещения устанавливаемой системы на жестком диске будут заданы персоне, присутствующей за консолью рабочей станции. Такой режим позволит избежать ошибок изза случайно оставленных в лотках дисках автоматической установки и при необходимости избежать уничтожения локальных данных. На этом же этапе все специально подготовленные данные с дистрибутивного диска будут скопированы на целевой раздел. Дополнительные данные помещаются в директорию $OEM$. Например, как показано в листинге 11. Листинг 11. Размещение дополнительных обоев /heap/Windows/uawsp2 # ls -als \$OEM\$/\$\$/Web/Wallpaper total 484 4 drwxr-xr-x 4 drwxr-xr-x 320 -rw-r--r-156 -rw-r--r--

2 3 1 1

root root alekseybb alekseybb

root 4096 Feb root 4096 Dec users 320111 Oct users 154966 Oct

2 26 26 26

21:56 16:31 2003 2003

. .. oaks.jpg winter.jpg

А если нужно добавить некоторые программные файлы так, чтобы они далее могли находиться автоматически, то следует их разместить так, как показано в листинге 12. Листинг 12.Размещение дополнительных программ /heap/Windows/uawsp2 # ls -als \$OEM\$/\$\$/System32

27


администрирование total 280 4 drwxr-xr-x 4 drwxr-xr-x 240 -rw-r--r-32 -rw-r--r--

2 4 1 1

root root root root

root 4096 Mar root 4096 Mar root 241664 Nov root 31232 Aug

19 22 6 18

01:48 23:08 2003 2003

. .. KIX32.EXE cmdow.exe

Другими словами, директория $OEM$/$$ соответствует директории установки ОС на целевом диске. Если следовать установкам по умолчанию, то для Windows XP это C:\WINDOWS. Чтобы в директории C:\Documents and Settings разместить специальную команду, которая будет далее использоваться для настройки профиля вновь создаваемых локальных пользователей, то следует сделать так: Листинг 13. Размещение дополнительных команд /heap/Windows/uawsp2 # ls -als ↵ \$OEM\$/\$1/Documents\ and\ Settings total 12 4 drwxr-xr-x 2 root root 4096 Mar 18 18:25 . 4 drwxr-xr-x 6 root root 4096 Feb 7 23:00 .. 4 -rw-rw-r-- 1 root users 740 Feb 6 12:45 usersetup.cmd

Все эти файлы будут на первом этапе скопированы в одноименные директории на локальном диске так, что его корень будет соответствовать директории $OEM$/$1 на дистрибутивном диске. Придерживаться правила 8.3, как и было ранее заявлено, здесь не следует. Таким же образом с создаваемого установочного диска будут переноситься дистрибутивные файлы прикладного программного обеспечения. Достаточно все нужные файлы поместить в директорию $OEM$/$1/InstData, и в процессе выполнения первого этапа установки все они будут скопированы в C:\InstaData. После установки эту директорию надо будет не забыть удалить, и лучше сделать это автоматически.

Второй этап Следующий этап продолжается в графическом режиме. Его основные шаги перечислены ниже. В некоторых строках записаны временные метки, соответствующие этому этапу, так называемые T-*. Кстати сказать, временная метка не имеет точного соответствия с затратами времени на процесс установки, который всецело зависит от мощности компьютера. 1. 39 минут – запуск setup.exe/syssetup.dll (syssetup.inf). 2. Загрузка nt5.cat и *.cat. 3. Выполнение *.inf. 4. Запуск ocmanage.dll. 5. Определение оборудования (machine.inf). 6. 37 минут – установка драйверов устройств. 7. Запуск intl.cpl (intl.inf). 8. Запрос CD-KEY. 9. Установка компонентов ОС (sysoc.inf). 10. 32 минуты – установка поддержки сети. 11. 29 минут – копирование всех необходимых файлов ОС. 12. 25 минут – завершение установки. 13. 22 минуты – установка меню «Пуск» (shell.inf). 14. 18 минут – регистрация компонентов (OLE regsrv). 15. 13 минут – запуск $OEM$/Cmdlines.txt. 16. 9 минут – сохранение параметров.

28

17. 8 минут – сохранение настроек (sfc.dll сканирует все системные файлы для создания базы WFP). 18. Создание signhash Hardware ID. 19. Удаление временных файлов. 20. Перезагрузка. Это самый длительный этап установки. Он, как и следующий, будет автоматизирован полностью. Фактически, во время 2-го этапа ставится ядро операционной системы. Рассмотрим некоторые важные действия и настройки: На этом этапе задается пароль встроенного бюджета Администратор. Его можно указать в зашифрованном виде, но тогда полученный диск лишится своей универсальности, т. к. пароль, назначенный в процессе установки, носит явно временный характер, то выберем самую простую его форму. [GuiUnattended] ; Задаем пароль Администратора. AdminPassword="admin» EncryptedAdminPassword=No

Второй параметр из секции, отвечающей за автоматическую установку в графическом режиме, задает число автоматических перезагрузок. Обратите внимание, на третьем этапе штатной установки будут запущены инсталляторы прикладного программного обеспечения, после чего перезагрузка будет произведена еще раз. То есть нужно установить счетчик автоматических авторизаций на 2. А если для выполнения каких-то действий, например, перезагрузки в режиме сохранения для выполнения некоторых модификаций, потребуется еще одна перезагрузка, то счетчик надо будет увеличить дополнительно. [GuiUnattended] ; Установим режим автоматического входа в систему ; от имени Администратора AutoLogon=Yes ; Число автоматических входов. AutoLogonCount=2

Следующий раздел отвечает за пользовательские данные. Применительно к Windows, это практически данные покупателя. Итак, мы снова вернулись к вопросу лицензирования. Рассмотрим его подробнее. В процедуре обычной установки пользователю предлагается ввести код с установочного диска. Теоретически эта проблема решается следующими строками из winnt.sif: [UserData] ; Подставляем установочный ключ для Windows XP ProductID=XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

Где вместо ХХХХ подставляется код лицензии. Но дело в том, что если бы защита от копирования Windows ограничивалась только эти кодом, то всякая автоматическая установка означала бы нарушение лицензии, так как приводила бы к установке одной лицензионной копии продукта на множество компьютеров. Хитроумные обитатели предместья Сиэтла отлично понимали, что загнали себя в тупик. И тогда появились специальные механизмы активации Windows или WPA (Windows Product Activation) вместе со счетчиком наработки или OOBE (Out Of Box Experience). Теперь


администрирование автоматическая установка копий ОС под идентичными лицензионными ключами не снимала необходимость активации копии в течение 30 дней. Для ряда потребителей это уже достаточный уровень решения проблемы автоматической установки. Те же, кто требует большего, должны выбрать или легальный путь преодоления этой проблемы, или обходной. Как уже было сказано выше, легальным является способ использования такой лицензии, которая предусматривает серийную установку. Для MS Windows это так называемая корпоративная лицензия или VL (Volume License). Здесь надо очень тщательно следить за тем, чтобы число установок не превысило числа оплаченных копий. Обходной путь заключается в создании такого дистрибутива, чтобы механизмы защиты от несанкционированного копирования и активации копий не мешали выполнению технологических функций. При этом не исключается номинальная оплата нужного числа копий. То есть вне зависимости от выбранного технологического пути создания диска с автоматической процедурой установки и, значит, активации копии, вопросы выполнения требований законодательства по защите прав интеллектуальных собственников могут решаться совершенно бесконфликтным путем и в согласии с совестью системного администратора. Далее производится настройка сети. Предполагаем, что выбираются стандартные сетевые настройки, ориентированные на раздачу динамических адресов провайдером DHCP и соответственно случайное имя компьютера. Любой другой способ не позволит выполнить установку нескольких компьютеров одновременно. То есть при назначении или фиксированного адреса, или фиксированного имени обязательно необходимо вмешательство сисадмина для смены их на постоянные значения. Причем если со сменой имени рабочей станции нет проблем, то смена сетевого адреса из сеанса удаленного подключения к рабочему столу неминуемо приведет к разрыву соединения, что, впрочем, не фатально. [UserData] ; Задаем случайное имя. ComputerName=* [Networking] ; Зададим сетевые настройки по умолчанию InstallDefaultComponents=Yes

Далее обращаю ваше внимание на раздел [Components], который управляет установкой программ, входящих в дистрибутив ОС. Обычно в этом разделе запрещают установку игрушек и прочих утилит, которые далее не предполагается использовать. В нем самое большое число строк. Настройка этого раздела всецело зависит от политики системного администрирования. Например, в отношении игрушек: разрешение установки встроенных игр, на взгляд автора, уменьшает стремление пользователей к установке игрушек сторонних производителей. Хотя всегда можно проконтролировать состав установленных на рабочей станции программ удаленно с помощью snmp. Поскольку в согласии с нашей технологией предполагается управление создаваемой рабочей станцией с удаленных терминалов, то следующая настройка просто необходима:

№6, июнь 2005

[TerminalServices] ; разрешить RDP AllowConnections=1

Вернемся к вопросу установки дополнительного программного обеспечения. За 13 минут до завершения 2-го этапа установки запускается интерпретация команд из файла $OEM$/Cmdlines.txt. Этот файл предоставляет возможность добавления дополнительных действий по настройке, по установке обновлений MS Windows или приложений третьих производителей. Но поскольку в точке Т-13 операционная система настроена еще не в полной мере, то не все полноформатные GUI-приложения можно запускать из Cmdlines.txt. В таком режиме многие установочные процедуры не работают. Поэтому опустим описанную возможность установки, тем более, что есть способ со всех точек зрения максимально привлекательный для этого – запуск при первом логоне в систему, так называемый GuiRunOnce. Строго говоря, есть еще и третий способ, но об этом позднее. Принято считать, что этим путем удобно вносить изменения в реестр, так как ветка HCU здесь относится к пользовательскому профилю по умолчанию. Из методологических целей воспользуемся именно таким путем для добавления пользователей в систему. Очень удобно для управления компьютерами в сети использовать единого административного пользователя. Пользователи временами меняют пароли и забывают их, а так всегда есть способ даже удаленно поправить подобную проблему. Естественно, этот бюджет не должен совпадать с бюджетом администратора на серверах сети. Необходимые команды можно вписать непосредственно в Cmdlines.txt, но если туда записать обращение к внешнему командному файлу, тогда можно быть уверенным, что выполнение команд будет происходить в стандартной среде. Поэтому создадим $OEM$/ Cmdlines.txt и наполним его следующим содержимым: Листинг 14. Содержимое Cmdlines.txt [Commands] "mkusers.cmd"

А в файл $OEM$/mkusers.cmd запишем команды создания пользователя localadmin с неустаревающим паролем admin и присвоим этому пользователю статус локального администратора: Листинг 15. Содержимое mkusers.cmd net user localadmin admin /add net localgroup Администраторы localadmin /add net accounts /maxpwage:unlimited

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

Третий этап Последний этап установки состоит из следующих действий:

29


администрирование 1. 2. 3. 4. 5. 6.

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

В 1-4 пунктах все очевидно. Здесь практически нечего настраивать или менять в процессе автоматической установки. Разве что запретить добавление пользовательских бюджетов: [GuiUnattended] ; Запретим запрос о создании пользовательских бюджетов AutoLogonAccountCreation=No

А вот пятый пункт является ключевым. Как уже было сказано выше, здесь происходит запуск установки прикладного программного обеспечения. Все необходимые для этого команды записываются после маркера секции [GuiRunOnce] строка за строкой в обрамлении двойных кавычек. На самом деле эти команды не интерпретируются непосредственно из файла winnt.sif, а предварительно записываются в соответствующую ветвь реестра HKEY_ CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runonce и после выполнения удаляются из нее автоматически. И есть даже такие схемы установки, где эти данные добавляются в реестр динамически при выполнении Cmdlines.txt. Но не будем все так усложнять. Наоборот, вынесем все команды в отдельный исполняемый файл GuiRunOnce.cmd, вызов которого запишем в winnt. sif в секции GuiRunOnce. Так можно будет уменьшить число модифицируемых компонентов на создаваемом диске и сократить проблемы из-за синтаксических ошибок, поскольку ошибка во внешнем файле никак не скажется на остальной процедуре установки и тогда в аварийном случае возможен еще путь ручной установки приложений прямо с диска. Полный текст файла GuiRunOnce. cmd, можно получить по ссылке [5], естественно, в кодировке koi8-r. Теперь определимся с перечнем дополнительных действий, которые следует выполнить на этой стадии автоматической установки. Исходя из специфики применения рабочей станции, для которой создается диск автоматической установки, пусть набор действий будет следующим: 1. Модификации реестра HKEY_LOCAL_MACHINE. 2. Установка прикладного программного обеспечения. 3. Копирование данных в «Documents and Settings». 4. Удаление директории InstData. 5. Перезапуск компьютера. Первый шаг совершенно очевиден. Надо сделать простые настройки реестра Windows в разделах HKEY_LOCAL_ MACHINE в соответствии с предполагаемой средой работы. Существует целый пласт литературы, посвященной вопросам тюнинга реестра этой чудной операционной системы. Нет смысла повторяться, поскольку авторы этого «карманного» чтива и так друг у друга все списывают «наперегонки». Каждый может выбрать, что понравилось. Отмечу лишь то, что важно в нашем контексте.

30

Во-первых, для успешного подключения в домен на Samba внесем правочку SignOrSeal: Листинг 16. Исправление в реестре для подключения в домен на Samba [HKEY _ LOCAL _ MACHINE\SYSTEM\CurrentControlSet\Services\ Netlogon\Parameters] "requiresignorseal"=dword:00000000

И, во-вторых, поскольку в SP2 добавлен firewall, то для того чтобы можно было управлять создаваемой рабочей станцией через подключение к рабочему столу, разрешим доступ к порту 3389 из локальной сети и подсетей, используемых как туннельные. И здесь же еще настроим доступ к snmp для снятия учетных данных. Листинг 17. Исправление в реестре для разрешения работы нужных сетевых служб [HKEY _ LOCAL _ MACHINE\SYSTEM\CurrentControlSet\Services\ SharedAccess\Parameters\FirewallPolicy\StandardProfile\ GloballyOpenPorts\List] "3389:TCP"="3389:TCP:192.168.0.0/255.255.255.0, ↵ 192.168.10.0/255.255.255.0:Enabled:@xpsp2res.dll,-22009" "161:UDP"="161:UDP:LocalSubNet:Enabled:SNMP"

Лучше каждую правку определенной ветви реестра сохранять в отдельном файле, и все их поместить в $OEM$/ $1/InstData. И тогда можно будет манипулировать соответствующими настройками, просто комментируя команды изменения реестра. Сами же команды должны выглядеть примерно так: Листинг 18. Команда обновления реестра %systemdrive%\windows\regedit /s %systemdrive%\ ↵ InstData\WinXP _ SignOrSeal.reg

Для установки прикладного программного обеспечения используются заранее созданные и скомпилированные программы на AutoIt. Например, установка MS Office XP из размещенного в директории $OEM$/$1/InstData/OfficeXP дистрибутива производится командой: Листинг 19. Установка MS Office %systemdrive%\InstData\install _ office.exe ↵ %systemdrive%\InstData\OfficeXP\SETUP.EXE

При этом путь до файла штатного установщика Office XP передается в программу AutoIt как параметр: Run ( $CmdLine[1] )

Копирование данных в «Documents and Settings» необходимо производить динамически. Если разместить в этой директории нужные поддиректории и файлы заранее, то при настройке пользовательских профилей они будут исключены из работы, так же как это происходит при установке Windows поверх старой версии. Поэтому и исправление параметров запуска Far, если, конечно, мы его используем, и добавление специальных установочных команд в директорию автозагрузки будем производить так, как указано далее:


администрирование Листинг 20. Команды дополнительных настроек copy %systemdrive%\InstData\farmanag.lnk ↵ "%systemdrive%\Documents and Settings\All Users\ ↵ Главное меню\Программы\FAR manager\ ↵ FAR manager.lnk" /b /y copy %systemdrive%\InstData\farmanag.lnk ↵ "%systemdrive%\Documents and Settings\All Users\ ↵ Рабочий стол\FAR manager.lnk" /b /y copy /Y "%systemdrive%\Documents and Settings\ ↵ usersetup.cmd" "%systemdrive%\Documents and Settings\ ↵ Default User\Главное меню\Программы\Автозагрузка\" copy /Y "%systemdrive%\Documents and Settings\ ↵ usersetup.cmd" "%systemdrive%\Documents and Settings\ ↵ Администратор\Главное меню\Программы\Автозагрузка\" copy /Y "%systemdrive%\Documents and Settings\ ↵ usersetup.cmd" "%systemdrive%\Documents and Settings\ ↵ localadmin\Главное меню\Программы\Автозагрузка\"

Здесь важно отметить, что в первом случае правится меню и десктоп, принадлежащие всем пользователям рабочей станции. А вот добавление команды в автозагрузку надо произвести не только для профиля по умолчанию, но и для профиля Администратора, который сразу же после завершения стадии GuiRunOnce будет активирован, и для профиля пользователя, которого мы ранее создали как предполагаемый служебный бюджет. Теперь самое время вспомнить, что, кроме запуска инсталляторов прикладного программного обеспечения, надо еще не забыть удалить директорию C:\InstData и для верности перезапустить компьютер. Вот это уже надо делать из секции [GuiRunOnce]. В итоге должно получиться следующее: [GuiRunOnce] ; запусим установку прикладных программ "%systemdrive%\InstData\GuiRunOnce.cmd" ; удалим дистрибутивы прикладных программ "%systemdrive%\WINDOWS\system32\cmd.exe /c rmdir ↵ %systemdrive%\InstData /s /q" ; запустим перезагрузку компьютера "%systemdrive%\WINDOWS\system32\shutdown -r -f -t 180"

Длительная задержка перезагрузки нужна для того, чтобы успели пройти все остальные работы по настройке и отработал usersetup.cmd, который был скопирован в автозагрузку Администратора. Если возникает необходимость в еще одной стадии установки, например, надо перезагрузить систему в режим сохранения для выполнения какихто действий, тогда следует создать еще один командный файл для 4-й стадии, назовем его step4.cmd. И в конец секции [GuiRunOnce] перед вызовом команды shutdown записать следующее: copy /Y %systemdrive%\InstData\step4.cmd ↵ "%USERPROFILE%\Главное меню\Программы\Автозагрузка\" bootcfg /raw «"/fastdetect /safeboot:minimal ↵ /sos /bootlog /noguiboot" /id 1

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

№6, июнь 2005

титься или об удалении командного файла step4.cmd, или о его автоматическом отключении.

Собираем диск Итак, все работы по подготовке данных завершены и теперь можно создать образ загрузочного диска: Листинг 21. Сборка загрузочного диска # mkisofs -v -J -N -D -relaxed-filenames -no-iso-translate \ -input-charset koi8-r \ -P «Ivan Ivanovich» \ -p «Handy Man» \ -V «WXPSP2 _ RU» \ -A «mkisofs» \ -b boot/ntboot.bin -no-emul-boot -c boot/boot.catalog \ -hide boot -hide-joliet boot \ -o wxpsp2 _ ru.iso \ /heap/Windows/uawsp2

Отметим некоторые из использованных параметров. Вопервых, включаем расширение Joliet, для того чтобы на полученном диске читались длинные имена, которые были использованы в директории $OEM$ – ключ «-J». Во-вторых, укажем, что исходная локаль имен файлов koi8-r. Если в применяемой системе не так, то следует поправить – параметр «-input-charset koi8-r». В-третьих, запишем, что используется только загрузочный сектор, а не имидж флоппи-диска, и заодно запретим доступ к загрузочной информации – ряд параметров «-b boot/ntboot.bin -no-emul-boot -c boot/boot. catalog -hide boot -hide-joliet boot». Остальное все очевидно и создается в полном согласии с «man mkisofs». «Прожигание» самого диска CD-R/RW является тривиальной задачей, которая не должна вызывать вопросов, посему опустим ее описание. Точно так же каждому сисадмину должно быть ясно, что и в этой статье, и в тех скриптах и действиях, которые будут предприняты по материалам статьи, могут вкрасться ошибки. Поэтому рекомендуется сначала получить устойчивый результат на эмуляторе VMWare. В заключительной части статьи рассмотрим некоторые аспекты практического использования полученного диска и добавим к полученному программу сбора информации о конфигурации компьютера.

Ссылки: 1. Оригинальная информация по созданию дисков автоматической установки MS Windows: http://www.microsoft.com/resources/documentation/WindowsServ/2003/all/ techref/en-us/Default.asp?url=/Resources/Documentation/ windowsserv/2003/all/techref/en-us/W2K3TR_unatt_how. asp?frame=true&hidetoc=true. 2. Дополнительная информация по созданию дисков автоматической установки MS Windows: http://unattended. oszone.net. 3. Загрузчик диска: http://www.barabanov.ru/arts/autoit/ ntboot.bin. 4. Файл управления автоматической установкой: http:// www.barabanov.ru/arts/autoit/WINNT.SIF.koi8r. 5. Командный файл, запускаемый в процессе автоматической установки: http://www.barabanov.ru/arts/autoit/GuiRunOnce.cmd.koi8-r. 6. Архив исходных текстов: http://www.barabanov.ru/arts/ autoit/src.tgz.

31


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

РЕШАЕМ НЕСТАНДАРТНЫЕ ЗАДАЧИ С ПОМОЩЬЮ СТАНДАРТНОГО WINDOWS SCRIPTING HOST

Достаточно часто в администрировании приходится сталкиваться с разовыми задачами, программные решения для которых под рукой отсутствуют, а путешествие по Интернету не приносит требуемого результата. Для таких случаев в операционной системе Windows панацеей практически от всех бед может стать Windows Scripting Host. Его возможности позволят вам в короткие сроки составить нужный алгоритм и решить возникшую проблему.

МИХАИЛ КОШКИН

С

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

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

32

зволяющая определить, какие устройства для хранения информации (далее – диски) имеются в системе. ' Получение доступа к объектам FileSystem Object Dim fso : Set fso = ↵ WScript.CreateObject("Scripting.FileSystemObject") ' Перебираем все диски (HDD, FDD, CD и др.), имеющиеся ' в системе Dim i For Each i In fso.Drives …. Next

В теле цикла с использованием дескриптора, содержащегося в переменной i, могут быть получены такие свойства (из наиболее значимых в рамках тематики статьи), как: буква диска – i.DriveLetter; тип диска – i.DriveType (см. таблицу 1). Кроме того, с использованием дескриптора доступа к элементам файловой системы fso дополнительно могут быть получены все основные характеристики носителя: ! тип файловой системы носителя – fso.GetDrive(i.DriveLetter).FileSystem; ! серийный номер тома – Hex(fso.GetDrive(i.DriveLetter). SerialNumber); ! метка тома – fso.GetDrive(i.DriveLetter).VolumeName;


администрирование Таблица 1. Возможные значения типа диска для i.DriveType

! общий размер диска – FormatNumber (fso.GetDrive(i.DriveLetter).TotalSize /1048576, 1) & " Мб");

! размер незанятого пространства диска – FormatNumber

(fso.GetDrive(i.DriveLetter).FreeSpace /(1024*1024), 1) & " Мб").

При разработке кода программы необходимо учитывать то обстоятельство, что в считывающем устройстве необязательно присутствие носителя (дискеты в дисководе или диска CD в приводе), и при обработке функций для получения свойств носителя могут возникнуть ошибки. Для таких случаев в языке VBScript используются конструкции On Error Resume Next, Err.Number и Err.Clear, позволяющие пользователю сформировать код для самостоятельной обработки исключений (см. рис. 1).

Ниже приводится структура рекурсивной процедуры обхода подкаталогов для решения задачи поиска на диске файлов, обладающих необходимыми свойствами. Sub WorkSubFolder(sdrivename) Dim sfolder : set sfolder=fso.getfolder(sdrivename) ' Для работы с подкаталогами источника Dim ssfolder : set ssfolder=sfolder.SubFolders ' Для работы с файлами каталога источника Dim ssÞles : set ssÞles=sfolder.Files Dim fo ' Цикл обработки подкаталогов каталога источника For Each fo In ssfolder WorkSubFolder SDriveName&"\"&fo.name Next ' Для всех файлов текущего каталога вызывается процедура ' WorkForFile Dim Þ : For Each Þ In ssÞles : ↵ WorkForFile sfolder&"\"&Þ.name : Next End sub

Файлы, имена которых содержат интересующее расширение, могут быть найдены с применением функции fso.GetExtensionName(fullnamefile) (см. рис. 2).

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

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

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

Для поиска файлов с определенной сигнатурой в простейшем случае достаточно воспользоваться функциями открытия файла (fr=fso.OpenTextFile(FullNameFile, 1, false)), чтения данных из файла (s_read=fr.Read(1)) и закрытия файла (fr.Close) (см. рис. 3).

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

№6, июнь 2005

Рисунок 3. Результаты поиска файлов-контейнеров шифрованных дисков с использованием заданной сигнатуры

При работе с томами файловой системы NTFS будьте готовы к ситуациям, когда доступ с правами пользователя к некоторым подкаталогам будет запрещен (например,

33


администрирование «System Volume Information», который размещается в корневом каталоге тома). Необходимо также учитывать то обстоятельство, что при значительных размерах дисков и большом количестве файлов поиск может выполняться достаточно продолжительное время.

Ярлыки Информацию о пристрастиях пользователя можно почерпнуть при изучении файлов-ярлыков, которые формируются при различных обстоятельствах (будь то история работы с файлами Microsoft Office или раздел Recent). Для анализа достаточно обработать дату создания файла, являющегося ярлыком, и параметр TargetPath, в котором содержится информация о запускаемом файле. Dim wshshell : Set wshshell = ↵ WScript.CreateObject("WScript.Shell") Dim shortcut : Set shortcut = ↵ wshshell.CreateShortcut(fullnameÞlelnk) ' Вывод информации с названием и полным путем ' к запускаемому файлу WScript.Echo( shortcut.TargetPath ) Dim fso : Set fso=CreateObject("Scripting.FileSystemObject") Dim Þlelnk : Set Þlelnk = ↵ fso.getÞle(строка с полным названием файла-ярлыка) ' Вывод информации о дате создания файла-ярлыка WScript.Echo( Þlelnk.DateCreated )

' Открываем файл fullnameÞle с документом Word ' с паролем " " Dim doc Set doc = wordapp.Documents.Open(fullnameÞle, _ False, _ blnReadOnly, _ False, " ") If Err.Number = 5408 then ' Обработка файла с документом Word, который имеет пароль End if ' Метаданные с пользовательскими свойствами документа Dim propitem For Each propitem In ↵ wordapp.ActiveDocument.CustomDocumentProperties ' В цикле обрабатываются propitem.Type и propitem.Value Next ' Метаданные со стандартными свойствами документа For Each propitem In ↵ wordapp.ActiveDocument.BuiltInDocumentProperties ' В цикле обрабатываются propitem.Type и propitem.Value Next Err.Clear On Error GoTo 0

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

Рисунок 4. Результаты поиска файлов-ярлыков в двух пользовательских каталогах

Документы Word Возможности использования элементов ActiveX позволяют серьезно расширить область применения пользовательских программ на VBScript. Примером этому может стать описание подхода получения метаданных документов Microsoft Word. К слову сказать, за последние три года содержимое метаданных послужило поводом для ряда неприятных историй с крупными компаниями и даже государствами (случаи с досье правительства Британии о военном потенциале Ирака и исковым заявлением компании SCO). Следующий пример демонстрирует возможность получения метаданных для документа Microsoft Word, а также позволяет отследить ситуации, когда документ зашифрован с использованием пароля. On Error Resume Next Dim wordapp : Set wordapp = ↵ WScript.CreateObject("Word.Application")

34

Следует отметить, что документы Microsoft Word могут содержать и другие метаданные, которые нельзя получить путем применения стандартных функций работы с документами Word, для этого требуется визуальный контроль содержимого. В файле могут обнаружиться такие данные, как: ! имя и полный путь к файлу с документом; ! адреса электронной почты или информация о веб-сервере; ! имена принтеров; ! текстовые фрагменты, удаленные из документа в некоторый момент до сохранения; ! текстовые фрагменты из других документов, не имеющих отношения к данному, попавшие в него из-за ошибок в Microsoft Word.

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


администрирование Dim wshshell : Set wshshell = ↵ WScript.CreateObject("WScript.Shell") Dim wshproenv : Set wshproenv = ↵ wshshell.Environment("PROCESS") wshproenv (var _ env)

Таблица 3. Ключи, которые могут представлять интерес при изучении компьютера

Таблица 2. Возможные значения строкового параметра var _ env для W2K

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

Таблица 4. Для Win98 и WinME используются отдельные ключи, располагающиеся в других ветвях Рисунок 6. Результаты обработки значений некоторых ключей реестра

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

WMI В случаях, если есть возможность запустить скрипт под управлением изучаемой операционной системы версии W2К, полезную информацию можно получить используя Microsoft Windows Management Instrument (WMI). Достаточно подробно подходы работы с WMI описаны в статьях Ивана Коробко, опубликованных в журнале «Системный администратор» в 2004 г. В общем случае код инициализации работы с WMI выглядит следующим образом.

№6, июнь 2005

' Подключение к службе WMI локального компьютера Dim wbemservices Set wbemservices = GetObject("winmgmts://127.0.0.1/Root/Cimv2")

Далее следует использовать информацию с названиями необходимых классов и их свойств, знание о которых можно почерпнуть в процессе изучения объектной модели WMI с помощью утилиты WMI Object Browser. Так, например, получить данные, о включенных на момент проверки сетевых интерфейсах, можно с помощью следующего кода. Dim objectitems Set objectitems = wbemservices.ExecQuery("Select * ↵ from Win32 _ NetworkAdapter") Dim objectitem For Each objectitem In objectitems If objectitem.MacAddress<>"" then

35


администрирование WScript.echo("Сетевая карта название: " + ↵ objectitem.Name + Chr(13) + _ ↵ " производитель: " ↵ & objectitem.Manufacturer + Chr(13) + _ ↵ " MAC: " & objectitem.MacAddress) End if Next

Использование возможностей WMI позволяет разработчику сценария на языке VBScript получить: ! информацию об установленном в системе оборудовании (марка и параметры жесткого диска, тип и частота процессора, размер оперативной памяти, тип BIOS, характеристики и названия видео-, звуковой и сетевой карт и пр.); ! данные протокола работы, имеющие отношение к определенным событиям (запуск, остановка операционной системы, установка и извлечение USB-устройства, установка и удаление программного обеспечения и т. п.); ! параметры настройки компьютера (название компьютера, рабочая группа, название ОС и дата установки, перечень загружаемых ОС, список пользователей ОС, имя зарегистрировавшегося пользователя, время последней загрузки и пр.). Подводя итог изложению возможностей VBScript для изучения компьютерной системы, следует остановиться на ограничениях, отдельные из которых уже упоминались в статье. ! Полный набор возможностей VBScript может быть задействован только в случае запуска программ для анализа на изучаемой системе. ! Невозможно достичь высокого быстродействия для программ на VBScript. ! При наличии на исследуемом компьютере нескольких операционных систем Windows или даже более одного рабо-

36

Рисунок 7. Результаты обработки свойств классов Win32 _ ComputerSystem, Win32 _ OperatingSystem и Win32 _ UserAccount

чего пользователя реализация решений с использованием скриптовых языков существенно усложняется. А в случаях, когда на диске имеется раздел операционной системы Linux, VBScript оказывается просто бесполезен. ! Запуск программ WSH, вообще говоря, влечет за собой изменения на носителе изучаемого компьютера, что не всегда приемлемо, а работа с образами в отдельных случаях может быть достаточно проблематичной. ! Для VBScript отсутствуют механизмы восстановления на носителях удаленной информации (глубокий анализ подходов для восстановления данных с носителей, обладающих различной файловой структурой, скрупулезно был изложен Крисом Касперски в предыдущих номерах журнала за 2004-2005 гг.). В качестве бонуса для заинтересованных читателей автором подготовлен набор скриптов, в которых реализованы все возможности VBScript, изложенные в статье (см. http:\\ www.samag.ru раздел «Исходный код»).


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

SOLARIS 10 В КАЧЕСТВЕ ДЕСКТОПА? ПРОБУЕМ!

Лучший способ изучить новую операционную систему – постоянно работать в ее среде. В какой ОС мы больше всего работаем? Правильно, в той, что стоит на нашем десктопе. Попробуем погрузиться в одну из самых успешных коммерческих UNIX-систем, поставив ее на свой рабочий компьютер.

АНДРЕЙ МАРКЕЛОВ

В

ноябре прошлого года компания Sun Microsystems анонсировала выход бесплатной операционной системы Solaris 10 для платформы x86. Новую ОС может скачать и использовать любой, кто зарегистрируется на сайте http:\\www.sun.com и примет лицензионное соглашение. Компания планирует зарабатывать по схеме, успешно применяемой Red Hat, то есть брать деньги за платную техническую поддержку. Кроме того, 14 июня этого года Sun Microsystems открыла исходные коды своей операционной системы. Они доступны всем желающим на специально созданном сайте http://www.opensolaris.org по лицензии CDDL. Также нужно сделать замечание относительно платформы x86. Solaris на x86 работает с версии 2.1 – то есть более 10 лет. Правда, в прошлом Solaris OE ассоциировалась со SPARC. Компания Sun Microsystems решила ра-

№6, июнь 2005

зорвать эту связь в сознании заказчиков, сделав ставку на процессоры фирмы AMD. Все это делает операционную систему Solaris прямым конкурентом Linux и в частности Red Hat Enterprise Linux. И хотя пока невозможно определенно сказать, насколько удачно пойдут дела у Sun Microsystems и удастся ли Solaris получить приток «свежей крови» благодаря открытию исходных кодов, но посмотреть, что же представляет из себя эта операционная система, без сомнения, стоит.

Что нового в системе? Итак, что же появилось революционного в новой версии одной из самых распространенных ОС из семейства коммерческих UNIX? Во многих обзорах и на самом сайте http:\\www.sun.com уже не раз рассматривались новшества и технологии, включенные в Solaris 10. Поэтому я не буду подробно о

них рассказывать и ограничусь лишь перечислением. ! Solaris Containers (Zones) – появилась возможность создавать «виртуальные сервера» на одной машине со своими отдельными ресурсами и своей копией операционной системы. ! Dynamic Tracing – полезная функция, позволит вам в реальном времени практически без потери в производительности отслеживать огромное число внутренних функций и процессов операционной системы на глубоком уровне. Про DTrace и Zones на русском языке можно почитать на сайте http://solaris.reys.net. Могу порекомендовать еще один неплохой русскоязычный ресурс http://solaris-center.ru. ! Predictive Self Healing – автоматическая диагностика и восстановление в случае сбоев (как программных так и аппаратных).

37


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

Рисунок 1. Первый запуск Solaris 10

Две широко разрекламированные функции ZFS (новая файловая система) и Project «Janus» (бинарная совместимость c Linux) пока в релиз не вошли, но обещаются разработчиками в обновлениях.

Устанавливаем Solaris 10 на рабочую станцию x86 Для начала было бы неплохо обнаружить свое оборудование в списке Hardware Compability List, доступном по адресу: http://www.sun.com/bigadmin/hcl. Но, поскольку в нем содержится крайне мало систем и комплектующих, надежда на то, что вы найдете там свое «железо», крайне мала. Окончательно же убедиться в том, что Solaris будет работать на конкретной конфигурации, можно только экспериментальным путем. В отличие от предыдущей версии, для установки которой было достаточно двух CD, «десятка» идет уже на четырех. Первый диск при этом является загрузочным. На пятом, дополнительном Software Companion CD, содержится ряд наиболее часто используемого открытого программного обеспечения, собранного под Solaris. По отдельности пакеты из состава Software Companion можно скачать по адресу: http:// www.sun.com/software/solaris/freeware. Полная установка Solaris 10 занимает достаточно много времени. Субъективно – как минимум в два раза дольше, чем Linux или Windows. Если вы хотите получить систему с двойной или тройной загрузкой, то лучше устанавливать Solaris после того, как вы поставили Windows, но до Linux. Загрузчик Solaris сможет распо-

38

Рисунок 2. JDS в Solaris 10

знать установленную копию операционной системы от Microsoft. RHEL или Fedora распознает как Windows, так и Solaris. Поэтому, для того чтобы вручную не возиться с загрузчиками – проще использовать приведенную последовательность установки. В процессе инсталляции вам будут заданы стандартные для установки любой системы вопросы: настройки сети, имя машины и тому подобное. При первом знакомстве стоит выбрать полную установку. Я пробовал устанавливать Solaris 10 для x86 на нескольких рабочих станциях, и хотя всегда указывал наличие серверов DNS и их IP-адреса, программа установки ни разу не создавала файла /etc/resolv.conf. Вероятно, это особенность сборки для x86, потому что при установке Solaris 10 для платформы SPARC с подобной проблемой я не столкнулся. А поэтому на x86, первым делом после окончания процесса инсталляции, вам нужно создать этот файл и прописать свои DNS-сервера. Без resolv.conf X-Window стартовать у вас не будет. Кстати, в состав Solaris 10 для платформы x86 входят два X-сервера: X.org и «родной» от Sun Microsystems. Переключаться между ними можно при помощи утилиты kdmconfig. Следующим шагом после создания resolv.conf можно создать пользователя, под которым мы и будем работать. Причем в отличие от Linux потребуется более развернутый синтаксис команды useradd: # useradd -d /export/home/user -m ↵ -s /bin/bash user

Как видно, в качестве shell можно

использовать более дружественный для выходца из мира Linux командный интерпретатор bash, чем работающий по умолчанию korn. Ну и не забудьте вашему пользователю назначить пароль командой passwd. Итак, после всех этих манипуляций вы должны увидеть графическое приглашение ввести имя пользователя и пароль. При первом заходе в систему вам будет предложен выбор между классической CDE (Common Desktop Enviroment) в ее инкарнации 1.6 и Java Desktop System 3, которая фактически представляет из себя Gno-me 2.6. Надо заметить, что в поставку ОС включен Star Office 7 update 4, хотя для легального использования этого офисного пакета его все равно необходимо приобретать отдельно. В качестве веб-браузера поставляется Mozilla 1.7, а в роли почтового клиента выступает Evolution. При желании можно поиграть в стандартные для поставки Gnome игры и работать с изображениями в Gimp версии 2.0.2. По субъективным ощущениям на одинаковом оборудовании, Gnome под Linux 2.4 работает значительно медленнее. Особенно это хорошо было заметно на ноутбуке Asus M5N с 256 Мб оперативной памяти. С поддержкой русского языка – проблем я не обнаружил. Все приложения нормально отображают русские символы, а с переключением раскладок справился переключатель из состава Gnome. При его использовании необходимо из предложенных трех вариантов раскладки выбрать «Plain Russian keymap». Однако интерфейс лучше оставить английским. Дело в том,


администрирование С чего начинался Solaris Фирма Sun Microsystems была основана в 1982 году при участии известного в мире UNIX г-на Била Джоя (например, он является автором стандартного для UNIX-систем редактора vi). Название фирмы произошло от первых букв Stanford University Network, так как большинство основателей было именно из этого университета. В 1983 году вышла первая версия операционной системы SunOS – предшественника Solaris, реализации BSD UNIX от Sun. Спустя два года вышла вторая версия продукта, в которой впервые была представлена новая разработка фирмы – NFS, известная сейчас каждому системному администратору. SunOS успешно развивалась с десяток лет, пока в 1992 году не было объявленно, что SunOS 4.1.4, основанная на BSD UNIX, станет последней из разработанных версией, и в дальнейшем Sun Microsystems переходит на

UNIX System V, релиз 4. Новая операционная система была названа Solaris, и первой выпущенной версией стала Solaris 2. Первой же версией Solaris фирма Sun стала называть снятую с производства SunOS. Год спустя вышла Solaris 2.2 с поддержкой симметричных мультипроцессорных систем, а также версии для х86. C выхода Solaris 2.6 в 1997 году, графический интерфейс CDE становится стандартным компонентом этой ОС. В 1998 году выходит Solaris 7 – полностью 64-разрядная система с поддержкой средств программирования на языке Java. Четыре года спустя – самая распространенная на данный момент версия под номером девять. В 2004 году был анонсирован выход Solaris 10, а в середине июня этого года Sun Microsystems открыла исходные коды своей операционной системы.

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

ствующего на дополнительном Software Companion CD, воспользоваться коллекцией пакетов с http://www. blastwave.org. Сайт содержит более 1000 пакетов (почти 5 Гб) регулярно обновляющегося открытого ПО, собранного для платформы Solaris. Для обновления и установки пакетов достаточно всего лишь одной команды pkgget, при этим автоматически разреша-

Начинаем работать Несколько освоившись в системе, предлагаю обратить внимание на перечень корректно работающего оборудования. Очень высока вероятность того, что звуковая карта не будет работать с идущими в поставке драйверами. В форумах я даже видел сообщение от инженера Sun Microsystems, который рекомендовал посмотреть на сторонние драйвера. В частности на Open Sound System (http://www.opensound.com), бесплатную для персонального не коммерческого использования, и бесплатные драйвера с сайта http://www.tools.de/solaris/audio. Если вы решите использовать OSS – единственным неудобством будет необходимость раз в четыре месяца обновлять лицензию. В настоящее время в Solaris не реализован так называемый проект «Янус», обещающий бинарную совместимость с ОС Linux, а именно Red Hat Enterprise Linux. Поэтому для упрощения установки программ и управления обновлениями я рекомендую вместо самостоятельной сборки необходимого свободного софта, отсут-

№6, июнь 2005

ются зависимости пакетов и скачиваются все пакеты, от которых зависит устанавливаемый. Например, если вы привыкли не к Gnome а KDE, то вполне можете поставить сборку с http://www.blastwave.org. Сделать это «не просто, а очень просто» – командой pkg-get -i kde_gcc. По окончании установки в опции dtlogin помимо JDS и CDE вы должны получить и KDE. Перед тем как устанавливать что-либо, ознакомьтесь с краткой инструкцией, доступной на http://www. blastwave.org/howto.html. Еще одна альтернативная коллекция пакетов для Solaris объемом более 20 Гб, на которую можно обратить внимание, расположена по адресу: http:// www.sunfreeware.com. Также на просторах Интернета можно найти игры, собранные под Solaris. В частности, со странички http:// members.tripod.com/~Vitaly_Filatov можно скачать небезызвестный Heretic. В целом можно сказать, что Solaris 10 обеспечивает достаточно удобную рабочую среду на персональном компьютере. Вы можете продолжать пользоваться почти всеми программами из числа тех, к которым привыкли под Linux и под Solaris. Основной недостаток рассматриваемой операционной системы – малый спектр поддерживаемого оборудования. Надеюсь, что с открытием исходных кодов ОС этот список будет расширяться.

Рисунок 3. Помимо Gnome вы можете работать в традиционной CDE

39


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

ФАЙЛОВЫЕ СИСТЕМЫ ПРОСТРАНСТВА ПОЛЬЗОВАТЕЛЯ Сегодня администраторы и пользователи сталкиваются со многими новыми технологиями, на изучение которых требуется время. При этом полученные ранее навыки работы и привычные инструменты могут не пригодиться или показаться неудобными. «Синтетические» файловые системы, работающие в пространстве пользователя, позволяют скрыть разницу в работе конкретных протоколов и применять для всех задач одни и те же инструменты.

СЕРГЕЙ ЯРЕМЧУК

В

се является файлами – ключевая концепция UNIX-систем. Файлами является даже периферийное оборудование компьютера, разделы жесткого диска. При этом для приложений доступ к файлу устройства или отправка данных другому процессу практически не отличима от доступа к обычному текстовому файлу, что позволяет пользователю применять одни и те же команды для вывода текстового файла на консоль, печати файла, вывода звука через /dev/dsp и пр. Синтетические файловые системы, работающие в пространстве пользователя, реализуют аналогичный подход к самым разнообразным источникам информации. Файлами является все, с чем приходится иметь дело пользователю такой файловой системы – почтовые ящики, веб-страницы и ftp-серверы, защищенные SSH-соединения, архивы и другие локальные данные… Работа вне ядра: ! Упрощает установку и использование приложений. ! Позволяет минимизировать последствия краха. ! Позволяет использовать для программирования языки, отличные от С. ! Отлаживать такие приложения легче. ! Появляется возможность вынести часть кода во внешние библиотеки. ! Нет необходимости в переписывании кода для новых ядер. ! Исходя из всего перечисленого, появляется возможность создавать инструменты для самых разнообразных задач.

Например, в настоящее время существуют проекты SULF – Stackable User-Level Filesystem (http://pobox.com/ ~vgough/fuse-csharp.html) и FUSE-J (http://www.cl.cam.ac.uk/ ~Etdm25/fuse-j). Первый позволяет написать свою файловую систему на C, второй на Java. Интерфейс спроектирован так, чтобы обеспечить простую, эффективную и прозрачную работу с поддержкой привычной семантики. Первоначально разработанный для поддержки AVFS (http://www.inf.bme.hu/~mszeredi/avfs), FUSE (http://fuse. sourceforge.net) вскоре стал отдельным проектом и на сегодня имеет приличный список файловых систем, использующих его наработки. Совсем недавно код FUSE включен в дерево ядра -mm Эндрю Мортона (Andrew Morton). К со-

40

жалению, второй подобный проект, LUFS – Linux Userland FileSystem (http://lufs.sourceforge.net/lufs) несмотря на надпись на сайте «Actively maintained» обновлялся в последний раз в конце 2003 года, поэтому уже можно говорить о прекращении работ. Принцип работы такой системы ясен из рис. 1. Модуль ядра перехватывает запросы к VFS и создает для пользователя иллюзию работы с обычной файловой системой, на которой эмулируется специальное дерево каталогов, отвечающее семантике хранимых в ней данных. Теперь для работы с этими файлами можно применять привычные утилиты, например, для копирования файлов через защищенное ssh-соединение достаточно воспользоваться cp. Модуль ядра и библиотека связываются через дескриптор специального файла /proc/fs/fuse/dev, через который и происходит взаимодействие.

Реализации файловых систем для защиты информации На сайте проекта FUSE можно найти только небольшую программу – пример, демонстрирующую возможности, основной же интерес представляют собой сторонние разработки, список которых можно найти на http://fuse.sourceforge. net/filesystems.html. На момент написания статьи список насчитывал 22 проекта, большая часть из которых еще не достигла состояния релиза и стабильная работа не гарантируется в том числе и самими разработчиками, к тому же их не всегда возможно откомпилировать без проблем. Поэтому весь список перечислять не буду, остановлюсь только на некоторых самых интересных. EncFS – Encrypted Filesystem (http://pobox.com/~vgough/ encfs.html) реализует зашифрованную файловую систему. Как и другие подобные файловые системы, основное назначение EncFs – защита персональных данных, резервных копий. Работа отличается от «loopback» систем, работающих в режиме ядра. При этом в EncFs размер файловой системы может динамично изменяться. Некоторые метаданные остаются видимыми, что позволяет программе резервирования определить количество файлов, их размер, приблизительно количество знаков в имени (само имя шифруется) , т.е. узнать изменившиеся файлы. Но програма резервирования не может их расшифровать, таким образом, резервные копии можно сделать без расшифровки.


администрирование Выбрана ручная конфигурация. Доступны следующие алгоритма шифрования: 1. blowfish-compat : алгоритм совместим с EncFS 0.2-0.6 -- длина ключа 160 бит -- размер блока 64 байт Введите номер соответствующий Вашему выбору: 1 Выбранный алгоритм "blowfish-compat" Using key size of 160 bits Using filesystem block size of 64 bytes Доступны следующие алгоритмы зашифровки: 1. Block : Block encoding, hides file name size somewhat 2. Stream : Шифрование потока, сохраняет имена файлов как только возможно Введите номер соответствующий Вашему выбору: 2

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

Работать с такой файловой системой можно как с локального, так и удаленного узла, а также сменных носителей вроде CD-ROM. Проверим ее в работе. Первым делом требуется установить fuse. Здесь ничего сложного. # # # # #

tar -xzvf fuse-2.2.1.tar.gz cd fuse-2.2.1 ./conÞgure && make make install /sbin/modprobe fuse

Проверяем загружен ли соответствующий модуль: # /sbin/lsmod | grep fuse fuse

24020

0 (unused)

Новая файловая система должна быть в списке известных ФС. # cat /proc/Þlesystems | grep fuse nodev

fuse

Все работает. Для примера работы можно зайти в подкаталог fuse-2.2.1/example/ и запустить тестовую программу.

Выбранный алгоритм "Stream"" Enable filename initialization vector chaining? This makes filename encoding dependent on the complete path, rather then encoding each path element individually. This is normally desireable, therefor the default is Yes. Any response that does not begin with 'n' will mean Yes: Yes Enable per-file initialization vectors? This adds about 8 bytes per file to the storage requirements. It should not affect performance except possibly with applications which rely on block-aligned file io for performance. The default here is Yes. Any response that does not begin with 'n' will mean Yes: Включить имя файла в IV цепочку заголовков? Эта опция позволит сделать данные файла зависимыми от полного файлового пути. Если файл переименовать, то нельзя будет его расшифровать. Если включить эту опцию, то жесткие ссылки на файлы не будут поддерживаться файловой системой. Значение по умолчанию No. Любой ввод не начинающийся на 'y' будет воспринят как No: Enable block authentication code headers on every block in a file? This adds about 12 bytes per block to the storage requirements for a file, and significantly affects performance but it also means [almost] any modifications or errors within a block will be caught and will cause a read error. The default here is No. Any response that does not begin with 'y' will mean No: Yes Add random bytes to each block header? This adds a performance penalty, but ensures that blocks have different authentication codes. Note that you can have the same benefits by enabling per-file initialization vectors, which does not come with as great of performance penalty. Select a number of bytes, from 0 (no random bytes) to 8: 4

#./fusexmp /mnt/fuse/ -d unique: 2, opcode: INIT (26), nodeid: 0, insize: 44 INIT: 5.1 unique: 2, error: 0 (Success), outsize: 24

Теперь, глядя на содержимое каталога /mnt/fuse/, можно обнаружить дерево основной файловой системы. Настала очередь EncfFS. Для работы, кроме архива с самой файловой системой, требуется наличие библиотек OpenSSL и Rlog (http://rlog.sourceforge.net). Устанавливается EncfFS обычным образом, после компиляции будут доступны два исполняемых файла – еncfs и encfsctl. При помощи первой можно создать или примонтировать зашифрованную файловую систему. $ encfs ~/.crypt ~/crypt Директория "/home/sergej/.crypt" не существует. Создать ее? (y,n) y Директория "/home/sergej/crypt" не существует. Создать ее? (y,n) y Создание нового зашифрованного раздела. Выберите одну из следующих букв: введите "x" для режима эксперта, введите "p" для режима максимальной секретности, любой другая буква для выбора стандартного режима. ?> x

№6, июнь 2005

Конфигурация завершена. Создана файловая система с следующими свойствами: Шифр файловой системы: "ssl/blowfish-v0.2", версия 2:0:1 Шифр файла: "nameio/stream", версия 2:1:2 Размер ключа: 160 бит Размер блока: 64 байт, включая 12 байт MAC заголовок Каждый файл содержит 8-ми байтный заголовок с уникальными IV данными. Файловые имена зашифрованы с использованием IV цепочек. Введите пароль для доступа к файловой системе. Запомните пароль, так как в случае утери его, будет невозможно восстановить данные. Тем не менее этот пароль можно изменить с помощью утилиты encfsctl. Новый пароль EncFS: Повторите пароль EncFS:

Как видите, при создании новой файловой системы доступно два предустановленных режима standard и paranoia (шифр AES, размер ключа 256, размер блока – 512), а также режим expert, при использовании которого можно выбрать все параметры самому (половина вопросов при этом будет задана по-русски). Теперь можно проверить работу вновь созданной ФС: # cd crypt/

41


администрирование # echo «Это зашифрованное сообщение» > testÞle # cat testÞle Это зашифрованное сообщение

Размонтируем и смотрим, что в каталоге: # fusermount -u ~/crypt # ls ./.crypt/ Srdhn7yaqbS-Q1

Также невозможно прочитать содержимое файлов. Кроме того, можно задать дополнительные параметры, которые позволяют автоматически размонтировать файловую систему в случае неактивности в течение какого-то промежутка времени, организовать доступ нескольким пользователям и некоторые другие. При помощи утилиты encfsctl можно проверить параметры файловой системы или сменить пароль. Например: $ encfsctl ./.crypt Версия 5; создана EncFS 1.2.1 (ревизия 20040813) Шифр файловой системы: "ssl/blowfish-v0.2", версия 2:0:1 Шифр файла: "nameio/stream", версия 2:1:2 Размер ключа: 160 бит Размер блока: 64 байт, включая 12 байт MAC заголовок Каждый файл содержит 8-ми байтный заголовок с уникальными IV данными. Файловые имена зашифрованы с использованием IV цепочек.

Для использования в военных, правительственных и других организациях, в которых уделяется особое внимание режиму секретности, разработана файловая система Phonebook (http://www.freenet.org.nz/phonebook), использующая технологию, получившую название «Deniable Encryption technology». Её разработчики пытаются учесть «человеческий фактор», являющейся основной причиной многих проблем, возникающих при защите информации. Суть этой технологии заключается в использовании нескольких слоев кодирования, каждый со своим паролем, поэтому чтобы получить доступ, необходимо знать уже два параметра: название слоя и пароль. В случае ошибки набора будет создан новый слой, никакого сообщения об ошибке выведено не будет. При этом есть возможность создать несколько слоев с одним именем, но разными паролями, в случае взлома будет раскрыта информация только в одном из них. Все файлы шифруются индивидуально (256-Blowfish, CFB-режим, плюс SHA1 хеш), в случайном порядке изменяется и время доступа к файлу. Файлы могут быть записаны на CD-ROM или доступ к ним можно получить через сеть (например, NFS).

SSH через файловый менеджер Следующая интересная файловая система shfs – (Secure) SHell FileSystem (http://shfs.sourceforge.net), использующая FUSE, позволяет монтировать удаленные системы, используя ssh-соединения и работать с ними как с обычной локальной системой. После стандартной установки пользователю будут доступны две утилиты shfsmount и shfsumount. В общем случае строка запуска выглядит так: shfsmount[user@]host:[dir]] mountpoint [options]

Далее:

42

# mount -t shfs sergej@somewhere.com: /mnt/local The authenticity of host ' somewhere.com (192.168.0.20)' can't be established. RSA key fingerprint is 1a:49:b0:db:df:19:69:af:45:16:da:4b:3a:36:ab:fe. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added ' somewhere.com,192.168.0.20' (RSA) to the list of known hosts. sergej@somewhere.com 's password:

Если теперь посмотреть в /mnt/local, то в нем обнаружатся файлы, расположенные на удаленном компьютере. По умолчанию монтируется домашний каталог пользователя, при необходимости можно указать на конкретный каталог, порт отличный от принятого по умолчанию и прочие параметры соединения. Для удобства можно создать символическую ссылку и вызывать команду привычным образом. # ln-s /sbin/mount.shfs /sbin/shfsmount # mount -t shfs sergej@somewhere.com: /mnt/local

Практически такими же возможностями обладает пакет sshfs-fuse, доступный для закачки с сайта проекта fuse (http://prdownloads.sourceforge.net/fuse/sshfs-fuse-1.1.tar. gz?download). Работа с ним отличается только используемой командой. # sshfs sergej@somewhere.com:/tmp /mnt/local # mount | grep shfs sergej@somewhere.com: on /mnt/local type shfs ↵ (version=2,mnt=/mnt/local,fd=5)

Сетевые ресурсы в окне МС Подобным образом можно смонтировать и SMB-ресурсы Windows машин. Проект SMB for Fuse (http://hannibal.lr-s.tudelft.nl/ ~vincent/fusesmb) позволяет монтировать не только отдельные ресурсы, как это делается обычным способом при помощи smbclient и smbmount, но и полностью всю рабочую группу или компьютер. Затем к ресурсам можно обращаться из любого приложения, как к локальным файлам. Кэширование при помощи скрипта fusesmbcache ускоряет просмотр доступных ресурсов. Этот скрипт необходимо запускать при помощи cron. # crontab -e */30 * * * * fusesmbcache &> /dev/null

И теперь мониторим ресурсы. # mkdir ~/net # fusermount ~/net fusesmb &

В указанном каталоге появится дерево каталогов, соответствующих рабочим группам, входящим в них компьютерам и доступным ресурсам. Не менее интересной является разработка еще одного Open Source проекта FunFS – Fast User Network FileSystem (http://www.luminal.org/wiki/index.php/FunFS/FunFS), цель которого – полноценная замена NFS. Особое внимание было уделено повышению надежности и безопасности соединений. К сожалению, на данный момент FunFS находится в состоянии альфа-версии, поэтому о сколько-нибудь серьезном его применении пока говорить еще рано. Практически аналогична ситуация с проектом fusedav (http://0pointer.de/ lennart/projects/fusedav), позволяющим монтировать Web-


администрирование DAV (http://www.webdav.org) ресурсы. Разработки идут вяло, хотя версия 0.1, доступная в настоящее время на сайте, в принципе функциональна. Впрочем, и AVFS (http://sourceforge.net/projects/avf) позволяет также просматривать удаленные ресурсы (ftp, http, dav), и кроме того монтирует архивы (tar, tar.gz, zip) в дерево файловой системы.

Контроль версий файлов Wayback (User-level Versioning File System for Linux, http:// wayback.sourceforge.net) позволяет сохранять старые версии текстовых файлов, независимо от их количества, и каталогов, в которых они располагаются. Работает wayback на любом блочном устройстве с любой файловой системой. Для отката такая система ведет файл журнала, в котором описываются все изменения. Монтируется новая файловая система при помощи скрипта mount.wayback. $ ./mount.wayback ~/wayback/ /mnt/disk fusermount: unable to open fuse device /proc/fs/fuse/dev: No such file or directory

Скрипт пытается загрузить модуль fuse. Если он раннее был загружен, то появится такое сообщение. Поэтому для работы его необходимо первоначально выгрузить. # /sbin/rmmod fuse # ./mount.wayback ~/wayback/ /mnt/disk # mount | grep fuse /proc/fs/fuse/dev on /mnt/disk type fuse (rw,nosuid,nodev)

# echo «test» > /mnt/disk/test # ls /mnt/disk/ test

Смотрим содержимое: # ls ~/wayback/ test test~.

versionfs! version test.

versionfs! version

# echo «test2» >> /mnt/disk/test # echo «test3» >> /mnt/disk/test # ls ~/wayback/ test ~test ~test. versionfs! version test~. versionfs! version test. versionfs! version

Отмечается более быстрая работа с файлами по сравнению с CVS. Но если все таки необходим доступ именно к системе CVS, то некоторые, возможно, предпочтут использовать довольно удобную cvsfs (http://sourceforge.net/projects/cvsfs), позволяющую смонтировать CVS и работать с ней как с локальной файловой системой. При этом пользователю будут доступны изменения, без необходимости закачки всего дерева каталогов. В данный момент пользователь ограничен только самым последним релизом, использовав знаки ‘@@’ в имени файла (например filename@@1.1) можно получить доступ к любой версии файла. Второй вариант lufs_unionfs (http://alumnus.caltech.edu/ ~muresan/projects/lufs_unionfs.html), которая основана на LUFS. Такая система имеет два каталога, основной работает в режиме «только для чтения» (некий образ, содержимое которого остается постоянным), а в дополнительный будут занесены все изменения и новые файлы (идея взята с проекта unionfs (http://www.fsl.cs.sunysb.edu/project-unionfs.

№6, июнь 2005

html). В точке монтирования это будет выглядеть, как обычная файловая система, но всегда можно будет вернуться в исходное состояние.

Работа с e-mail, bluetooth и устройствами Для пользователей почтового сервиса Gmail доступна файловая система GmailFS – Gmail Filesystem (http://richard.jones. name/google-hacks/gmail-filesystem/gmail-filesystem.html). Это написанное на Python приложение, использующее библиотеку libgmail (http://libgmail.sourceforge.net) для связи с Gmail. Позволяет монтировать почтовый аккаунт как обычную файловую систему и пользоваться в дальнейшем обычными командами вроде ls, rm, cp, grep и другими утилитами, позволяющими быстро разобраться с 1 Гб информации. Не менее интересны файловые системы, позволяющие получить доступ к различным устройствам. Среди них btfs – Bluetooth FileSystemMapping (http://www.mulliner.org/bluetooth/ btfs.php), при помощи которой можно узнать обо всех доступных bluetooth-устройствах просто использовав команду ls. # ls -la /OPUSH /OPUSH/SE _ T630 /OPUSH/myPalm

Для пересылки файлов – ср. # cp Þle.txt /OPUSH/myPalm

К сожалению, в данный момент получить файлы от устройств таким образом невозможно. Аналогично, если вы считаете, что специализированные утилиты, предназначенные для работы с цифровыми фотокамерами вроде gtkam, не удобны и предпочитаете использовать для этого стандартные инструменты, попробуйте gphoto2-fuse-fs (http://www.hep.phy.cam.ac.uk/~lester/gphoto2-fuse-fs). Используя эту файловую систему, можно смонтировать в режиме «только для чтения» фотокамеру и просматривать изображения. Для доступа к памяти в мобильных телефонах Siemens разработана файловая система SieFS (http:// chaos.allsiemens.com/siefs), которая в настоящее время работает с телефонами 45, 55 и 65 серий. Проблему доступа к данным и настройкам во время выполнения программы (что особенно актуально для встроенных устройств) пытаются решить разработчики проекта RTA – Run Time Access (http://www.runtimeaccess.com), представляющего специализированный постоянно загруженный интерфейс к внутренним данным работающего приложения. Используя его, можно получить доступ ко всем структурам выполняющейся программы через Postgres-интерфейс, информация которого теперь будет видна пользователю как таблицы базы данных или как дерево файловой системы. И теперь к ним можно получить доступ любым удобным способом (консоль, веб-интерфейс, SNMP и др.). Это не все разработки, использующие FUSE. Остальную информацию можно найти на сайте проекта. Но как видите, подобные файловые системы заметно упрощают работу пользователя. К сожалению, большинство разработок находятся еще в состоянии альфа-версии, так что окончательное решение придется принимать на свой страх и риск.

43


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

УСКОРЯЕМ MS SQL SERVER

Что может быть хуже сервера, который неизвестно из-за чего стал работать слишком медленно? Только сервер, который работает слишком медленно по хорошо известной и неустраняемой причине! Чтобы реже сталкиваться с такой ситуацией, рассмотрим методы борьбы с причинами замедления работы Microsoft SQL Server.

ЮЛИЯ ШАБУНИО

В

первой части статьи (см. «Почему MS SQL медленно работает? Ищем причины» – №5, 2005 г.) мы рассмотрели способы локализации проблемы, кроме одного – как обнаруживать дедлоки? Для начала изучим оставшийся вопрос и после этого перейдем непосредственно к сегодняшней теме.

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

44

бок, то вот с каким процессом и на каких объектах случилось пересечение – непонятно. К счастью, в SQL Profiles входит великолепная возможность отследить всю цепочку блокировок с помощью Locks\Lock:Deadlock Chain. Чтобы эффективно ею воспользоваться, можно построить следующий шаблон: 1. События: ! Locks\Lock:Deadlock Chain ! Locks\Lock:Deadlock ! Security Audit\Audit Login ! Security Audit\Audit Logout ! Session\ExistingConnection Первые два события нам нужны, чтобы отследить собственно блокировки. Остальные понадобятся для иден-

тификации проблемного процесса. Дело в том, что событие «Deadlock Chain» ничего не пишет об участвующих процессах, кроме SPID. Поэтому нам потребуется регистрировать еще и входы и выходы из системы. По SPID и времени дедлока мы сможем точно найти записи о его подключении и отключении, а значит – найдём описание процесса. Событие «ExistingConnection» даст нам список тех процессов, на вход которых в систему мы уже опоздали. 2. Поля данных: ! EventClass ! SPID ! StartTime ! ObjectID (объект, на котором был дедлок)


администрирование ! IndexID (индекс, участвовавший в ! ! ! !

дедлоке) Mode EventSubClass (в каком режиме была попытка блокировки) стандартные поля для определения смысла процесса – Application Name, NTUserName и так далее TextData

Первые два поля я выношу в список полей, определяющих порядок сортировки (называется он почемуто Groups). 3. Фильтры в данном случае никакие не нужны. Подключение/отключение пользователя не самое частое явление в работе сервера, а уж дедлоки и подавно. Итак, шаблон готов. Сохраняем, запускаем и... готовимся к долгому ожиданию. Редко сервер доходит до такого состояния, что дедлок случается каждую минуту. Даже в очень тяжелых случаях приходится подождать пару часов, а то и дней, прежде чем наберётся материал для анализа. Поэтому я советую настроить сохранение счётчиков в файл и забыть о них на сутки как минимум. Особенностью в данном случае является еще и то, что когда у вас упорядочение задаётся по нескольким полям в Groups, то работать с ними в онлайн-режиме очень неудобно: из-за ошибки в профайлере курсор всё время скачет. Приходится или останавливать процесс сбора информации, или работать с сохранённым файлом журнала. При анализе обратите внимание на то, что событие Deadlock Chain реализуется одним и тем же процессом с маленьким номером. Это системный процесс, который следит за ошибками, но сам в них не участвует. Процессыучастники дедлока указываются в TextData события Deadlock Chain. Не могу не упомянуть о методе, позволяющем сохранять подробную информацию о случившемся дедлоке без использования профайлера. Это включение trace-флагов: DBCC TRACEON(1204, -1)

К сожалению, документирован только один из них – 1024, как раз и обозначающий сохранение информации о дедлоке. Но нам нужен еще и -1

№6, июнь 2005

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

Решаем проблемы производительности Итак, вы нашли, в какой точке возникает проблема производительности и какого она рода. Поздравляю! Вы сделали 3/4 работы. Осталось совсем немного, всего лишь исправить ситуацию.

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

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

Используйте составные индексы Microsoft SQL Server 7.0 не умел использовать в одном запросе два индекса на таблицу. Версия 2000 на это способна, но скорость выполнения за-

проса вас вряд ли обрадует. Поэтому, если какие-то два поля таблицы участвуют в большинстве запросов, – не делайте два индекса по каждому из столбцов. Сделайте один составной! Составной индекс имеет еще и то преимущество, что если он содержит все нужные для запроса поля, то обращение к таблице не понадобится. Значит, можно избежать операции Bookmark Lookup (поиска страницы в базе по известному индексу), что позволяет увеличить скорость работы раза в два. Мне приходилось добавлять в составной индекс поля, которые в индексе, в общем-то, и не нужны, но позволяют избежать поиска по родительской таблице.

Разделяйте часто и редко используемые данные кластерным индексом Выбирая кластерный индекс, имейте в виду, что именно он определяет физический порядок записей таблицы на диске. Физический порядок определяет соседство записей на страницах, а те, в свою очередь, задают порядок загрузки и выгрузки страниц в память сервера. А это значит, что часто лучшим кластерным индексом будет такой, который разделяет часто и редко используемые записи. Давайте для примера рассмотрим таблицу заказов. Предположим, что у нас есть ClientID – идентификатор клиента и OrderDate – дата заказа. Пусть большая часть запросов содержит условие на ClientID как точное равенство и условие на OrderDate как диапазон. Рассмотрим ситуацию, в которой заказов в таблице очень много, но активно используется только заказы за последнюю неделю, и в запросе чаще всего указывается именно этот период. Классические рекомендации советуют выбрать индекс (ClientID, OrderDate). По первому полю будет происходить точное сравнение, по второму – сканирование диапазона. Так бы и стоило поступить, не будь этот индекс кластерным. Если вы сделаете такой кластерный индекс, то заказы за последнюю неделю будут разбросаны по всей базе данных! Загрузка их всех в память просто невозможна, и каждый запрос к данным нового клиента приведёт к физическому (а не логическому) чтению. Если же вы используете в качестве кластерно-

45


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

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

Самый главный совет – не следуйте советам В том числе и этому, да. Все советы даются для частных случаев, которые могут никогда не сложиться в вашей базе данных. Проверяйте. Меняйте индексы, делайте запросы и следите за производительностью. Анализ планов запросов – это мощнейший инструмент, но даже он порой даёт сбои и неправильно оценивает стоимость различных вариантов выполнения. Самый надёжный вариант – это в QA щелкнуть правой кнопкой в окне редактирования, выбрать Current Connection Properties, а там – галочки Set statistics time и Set statistics IO. И затем уже выполнить тестовый запрос. Уверяю вас, если время компиляции и выполнения

46

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

Управляем планами запросов Эта задача немного проще предыдущей. Если нужный индекс на базе данных уже есть, но MS SQL Server им почему-то не пользуется, то довольно просто уговорить его это сделать. Стоп, не тянитесь писать with (index=<ИмяИндекса?>)! Это тоже вариант, но он нужен на крайний случай. Предлагаю вам свой список мер: Выполните запрос dbcc freeproccache. Этот нехитрый запрос очищает кэш скомпилированных планов запроса и даёт серверу возможность перекомпилировать планы заново. Если сбой, нарушивший генерацию плана, был единичный, то новые алгоритмы окажутся правильными, и система оживёт. Но если вам приходится часто использовать dbcc freeproccache, то будьте внимательны – это может быть последствием какого-то неблагополучия сервера в целом. Cгенерируйте дополнительную статистику. Вот уж чего, как говорится, много не бывает. Её можно «навешивать» хоть на каждое поле. Главное – не забывать регулярно выполнять перегенерацию (а лучше создать задание для регулярного выполнения таких действий). Используйте подсказки для MS SQL Server, оставаясь в рамках стандарта ANSI-SQL. Предположим, что сервер выбрал использование индекса по полю, которое кажется вам наименее подходящим в такой ситуации. Всё просто – в секции запроса where пишите условие по этому полю не в виде прямого равенства или диапазона (например, Name = ‘Иван’), а с помощью функции COALESCE(<Имя поля>, <Имя поля>). Например, coalesce(Name, Name) = ‘Иван’. Это совершенно корректно математически, но при этом проблемный индекс по указанному полю не может быть использован. Другой пример –

представьте, что у вас есть условие типа where @Number like Code + ‘%’. Если бы запрос был построен как Code like @Number + ‘%’, сервер сам догадался бы использовать индекс по Code. Но в нашем варианте Code используется в составе сложного выражения, и оптимизатор пасует. Человеку же очевидно, что @Number like Code + ‘%’ может быть верно только тогда, когда @Number >= Code, так как у них одинаковые первые символы, но @Number длиннее. Вот тут и имеет смысл добавить в условия @Number >= Code, так как оно не изменит логики и поможет серверу самостоятельно избрать нужный запрос. Упростите запросы. Например, мне известны ситуации, в которых планы запросов сильно «плавали» при внешних соединениях (join) с представлениями (view), построенными на внешних соединениях. И только если всё предыдущее не помогло, используйте подсказки MS SQL Server. Они порой дают великолепный непосредственный результат, но с ними необходимо проявлять осторожность – в другой ситуации, на других данных или с другой загрузкой вынужденный план запроса иногда сильно деградирует. Немного сложнее приходится, в ситуации если вас устраивают выбранные индексы, но не устраивают методы и порядок слияния. MS SQL Server позволяет настраивать и эти моменты, но тут выбор возможностей очень ограничен. Вы можете сделать порядок соединений жёстко зависящим от порядка их упоминания в запросе (force order), выбрать метод соединения (loop|merge|hash join) или указать, что несколько строк в результирующем запросе вам нужны раньше других (FAST число строк). Будьте осторожны, выбирая соединение хэшированием (hash join). Оно даёт порой потрясающие результаты по производительности, но всегда требует очень много памяти. И когда вашему серверу перестанет ее хватать, такие запросы не только заметно деградируют по скорости, но сильно замедлят работу в целом. И наоборот, если сервер работает в состоянии нехватки оперативной памяти, изменение метода слияния с hash на loop может увеличить число логических чтений, но при этом волшеб-


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

Как лечить блокировки Лечение блокировок очень часто делается командой kill. Что может быть проще: уничтожил головной процесс – и всё заработало! Но у этого подхода есть и отрицательные моменты. Первый – распределённые блокировки склонны повторяться. Так что не исключено, что через некоторое время вы будете дежурить в офисе весь день и всю ночь и держать палец над кнопкой kill. Второй – убивая головной процесс, мы теряем всю информацию о распределённой блокировке. Впоследствии мы можем так никогда и не узнать, что же на самом деле произошло, и не сможем принять меры к тому, чтобы ситуация больше не повторялась. Третья причина – далеко не всегда уничтожение головного процесса приведёт просто к перезапуску клиентского приложения. Иногда ценой вопроса является несколько дней работы целого подразделения. Более правильным вариантом работы является продуманная стратегия блокировок. Но её нельзя делать без хорошего представления о конкретной системе и предметной области. Нужно знать, для каких запросов сгодятся «грязные данные» и какого рода неточности тут могут возникнуть. Некоторые проблемы можно лечить расстановкой подсказки nolock или переводом целых процессов на низший уровень изоляции транзакций. В других ситуациях может потребоваться исправление существенных ошибок проектирования. Например, представьте, что в одной таблице оказались данные справочного типа, запрашиваемые постоянно множеством процессов и активно изменяемые, и важные поля. Эта ситуация будет приводить к постоянным блокировкам – читающие процессы будут мешать изменяющим, и наоборот. Одно из решений – выполнять чтение справочных данных с флагом nolock. Но если это почему-то неприемлемо, то можно воспользоваться другим способом. А именно: разделить эту таблицы на две, с созданием на месте старой таблицы представления (view) с «instead of» триггерами. При этом процессы, запрашивающие

№6, июнь 2005

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

Снимаем дедлоки Как уже говорилось, дедлоки, завязанные на несколько объектов, снимаются довольно легко. Ведь такой дедлок означает, что к одним и тем же объектам базы данных разные транзакции обращаются в разном порядке. Достаточно установить один какой-то порядок и проследить, чтобы он везде выполнялся. Если вы решили везде обращаться сначала к А, и только потом к Б, а необходимо сделать наоборот, то надо просто установить сначала блокировку на А, а потом можно работать с Б и снова с А в своё удовольствие. Например, это можно сделать так: declare @l tinyint select @l = 1 ↵ from A with (tablockx) ↵ where 1 = 2

Менее понятно, что делать с дедлоками в рамках одной таблицы. Часто они решаются четким указанием режима уровня блокировок (pagelock, например). Тогда сервер не будет повышать эту блокировку до табличного уровня без крайней необходимости. Возможно, что придётся поработать с индексами и планами запросов, приводящих к взаимной блокировке. Ну и наконец, самый надёжный способ борьбы с дедлоками на уровне таблицы – это подсказка with (tablock) или изменение режима блокировок с помощью sp_indexoption. Конечно, производительность в этой ситуации может пострадать (а может и нет, зависит от конкретной БД). Но зато дедлоков не будет наверняка.

Проблемы на аппаратном уровне Как уже говорилось, решать эту проблему должен не администратор базы

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

Заключение Описанные сценарии не претендуют на полноту или оптимальность, но они работают, и я использую их ежедневно. Надеюсь, что набор приёмов и рекомендаций пригодится вам при решении проблем производительности MS SQL Server.

Литература и ссылки: 1. Дэн Тоу. Настройка SQL для профессионалов (O’REILLY, «Питер», – 2004 г.). См. обзор в рубрике «Книжная полка» в журнале «Системный администратор», №3, 2005 г. Книга нравится мне тем, что представляет собой не перечень разных правил с неясными граничными условиями применения, а содержит очень чёткие алгоритмы. 2. Блокировки SQL Server 7.0/2000 – теория и практика устранения проблем (По материалам статьи KB224453 Understanding and Resolving SQL Server 7.0 or 2000 Blocking Problems): http://www.sql.ru /articles / mssql/2004/04112301ResolvingBlockingProblems.shtml. 3. Иван Бодягин. Deadlocks. Что такое взаимоблокировки и как с ними бороться (http://www.rsdn.ru/article/db/ deadlocks.xml) – подробный анализ причин возникновения дедлоков, методы диагностики и разрешения. 4. Полезные флаги трассировки SQL Server 7.0 и 2000 (по материалам статьи Randy Dyess «Documented and Undocumented Trace Flags for SQL Server 2000 and 7.0»): http:// www.sql.ru/articles/mssql/02080603 DocumentedAndUndocumentedTraceFlagsForSQLServer.shtml. 5. Рассылка «MS SQL Server – дело тонкое...» – http://subscribe.ru/catalog/comp.soft.winsoft.sqlhelpyouself. 6. Форум на сайте SQL.ru: http:// w w w.sql.ru / forum /ac tualtopic s. aspx?bid=1.

47


bugtraq Отказ в обслуживании в Nortel VPN Router при обработке IKE-пакетов Программа: Nortel VPN Router версии до 5.05.200; Models 1010, 1050, 1100, 600, 1600, 1700, 1740, 2600, 2700, 4500, 4600 и 5000. Опасность: Средняя. Описание: Удаленный пользователь может послать маршрутизатору один IKE-пакет со специально сформированным ISAKMP-заголовком и вызвать отказ в обслуживании устройства. URL производителя: www.nortel.com. Решение: Установите последнюю версию от производителя.

Отказ в обслуживании при обработке DNS-сообщений в продуктах Cisco Программа: Cisco ATA 180 Series Analog Telephone Adaptors: Cisco IP Phone 7900 Series, Cisco Unity Express 2.x, Cisco ACNS Software Version 4.x – 5.x, Cisco 500 Series Content Engines, Cisco 7300 Series Content Engines, Cisco Content Routers 4400 series, Cisco Content Distribution Manager 4600 series, Cisco Content Engine Module for Cisco 2600, 2800, 3600, 3700 и 3800 series Integrated Service Routers. Опасность: Низкая. Описание: Уязвимость существует в реализации DNS во время декомпрессии сжатого DNS-сообщения. Удаленный пользователь может с помощью специально сформированного DNS-пакета, содержащего некорректную информацию, вызвать отказ в обслуживании устройства. URL производителя: www.cisco.com. Решение: Установите исправление от производителя.

Межсайтовый скриптинг и загрузка произвольных файлов в CuteNews Программа: CuteNews все версии. Опасность: Высокая. Описание: Удаленный пользователь может произвести XSS-нападение и выполнить произвольные команды на целевой системе. 1. Уязвимость существует из-за некорректной обработки данных в некоторых значениях URL. Удаленный пользователь может внедрить произвольный HTML-сценарий и получить файлы cookie, связанные с аутентификацией пользователя. Пример: http://[target]/index.php?mod=editnews&action=editnews&id=[id] &source=<script>alert(document.cookie);</script>

2. Авторизованный пользователь может загрузить и выполнить произвольный php-сценарий. Функция переименования изображений не проверяет имя входящего и исходящего файлов, что делает возможным загрузить gif/jpg-файл с комментарием в виде php-кода () с последующей сменой расширения. Кроме того, отсутствие фильтрации символов обхода каталога («../») делает возможным загрузку злонамеренного файла на каталог выше относительно уязвимого скрипта при наличии соответственных прав доступа URL производителя: www.cutephp.com. Решение: Способов устранения уязвимости не существует в настоящее время.

48

Целочисленное переполнение в небезопасной инициализации файлов в GDB Программа: GDB версии до 6.3-r3. Опасность: Низкая. Описание: Обнаруженные уязвимости позволяют локальному пользователю выполнить произвольный код на целевой системе. 1. По умолчанию приложение читает файл .gdbinit из текущей рабочей директории. Локальный пользователь может заманить целевого пользователя, запустившего приложение в директорию со специально сформированным .gdbinitфайлом и повысить свои привилегии на системе. 2. Локальный пользователь может с помощью специально сформированного бинарника вызвать целочисленное переполнение и повысить свои привилегии на системе. Решение: Установите последнюю версию от производителя.

Удаленный административный доступ в Symantec Brightmail AntiSpam Программа: Symantec Brightmail AntiSpam версии до 6.0.2. Опасность: Низкая. Описание: Уязвимость существует из-за того, что пароль на доступ к базе данных является статическим. Удаленный пользователь может получить доступ к сообщениям, находящимся на карантине, и некоторой системной информации. URL производителя: www.symantec.com. Решение: Установите последнюю версию от производителя.

Удаленное выполнение произвольного кода в библиотеке Computer Associates Vet Программа: CA InoculateIT 6.0 (all platforms including Notes/ Exchange, CA eTrust Antivirus r6.0 all platforms including Notes/ Exchange, CA eTrust Antivirus r7.0 all platforms including Notes/ Exchange, CA eTrust Antivirus r7.1 all platforms including Notes/ Exchange, CA eTrust Antivirus for the Gateway r7.0 all modules and platforms, CA eTrust Antivirus for the Gateway r7.1 all modules and platforms, CA eTrust Secure Content Manager all releases, CA eTrust Intrusion Detection all releases, CA BrightStor ARCserve Backup (BAB) r11.1 Windows, CA Vet Antivirus, Zonelabs ZoneAlarm Security Suite, Zonelabs ZoneAlarm Antivirus. Опасность: Критическая. Описание: Библиотека Computer Associates Vet обеспечивает возможность сканирования файлов на предмет обнаружения вирусов и позволяет антивирусным продуктам анализировать различные потоки в поисках злонамеренного ПО. Переполнение кучи обнаружено при обработке OLE-потоков. Успешная эксплуатация уязвимости позволит злоумышленнику получить полный контроль над системой. Решение: Установите обновление от производителя.

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


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

MySQL 5 – ЧТО НОВОГО ПРЕДЛАГАЮТ НАМ РАЗРАБОТЧИКИ? 10 лет, с 1995 года, нас критиковали за отсутствие возможностей, присущих «настоящим» СУБД. Пятой версией мы ответили на все вопросы сразу. Дэвид Аксмарк, один из основателей MySQL

На лето запланирован выход новой, пятой версии популярнейшего сервера баз данных – MySQL. Как правило, смена первой цифры в номере версии означает довольно радикальные перемены. Это удивительно – возможности четвёртой ветки, появившейся чуть более года назад, освоены и приняты ещё далеко не всеми разработчиками. И тем не менее уже сейчас MySQL 5 доступна для тестирования в виде бета-версии. Что действительно нового предлагают её создатели?

КИРИЛЛ СУХОВ «Просто набор индексированных файлов!», «недо-база данных» – такие слова в адрес СУБД MySQL нередко можно найти на форумах разработчиков. И приходится признать – они имели под собой основание. MySQL при всех её достоинствах (нетребовательность к ресурсам, быстродействие, высокая производительность, на простых запросах, низкая стоимость владения) имела очевидные недостатки. Отсутствовали элементарные средства контроля целостности данных, не было механизма транзакций, да что там, не было даже вложенных запросов, а о хранимых процедурах и триггерах приходилось только мечтать. Положение изменилось с выходом версий 4.0 и 4.1. Помимо вышеупомянутых вложенных запросов и транзакций было осуществлено ещё множество нововведений. Появилась возможность задания кодировок на уровне базы данных, таблиц и столбцов, поддержка Unicode (utf8 и ucs2), включён геометрический тип данных – GIS, введёно понятие «подготовленных выражений» (prepared statements). С выходом MySQL 5 нас ждут ещё более радикальные изменения. Разработчики из MySQL AB установили довольно высокую планку – вплотную приблизиться к стандарту SQL:2003. Большая часть новых возможностей уже

№6, июнь 2005

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

Хранимые процедуры Данной функциональности, пожалуй, больше всего не хватало разработчикам. Смысл применения хранимых процедур (stored procedures) и функций – сохранять на сервере скомпилированные блоки SQL-кода. После единожды написанной, отлаженной и скомпилированной процедуры или функции, её можно вызывать из вашего приложения, передавая на сервер вместо обычного запроса, только вызов процедуры и аргументы. При этом не только снижаются затраты на трафик и повышается производительность. Главное преимущество состоит в том, что бизнес-логика приложения, возложенная на базу данных, становится прозрачней и переносимей. Как процедуры, так и функции могут возвращать значения (в виде набора записей). Различие состоит в том, что функция вызывается из запроса, а процедура из отдельной команды. На настоящий момент реализация хранимых процедур не поддерживает никаких внешних языков, но (по крайней

49


администрирование мере, так заявляется) соответствует стандарту SQL:2003, позволяющему применять условные конструкции, итерации и обработку ошибок. Пример создания хранимой процедуры в MySQL 5: CREATE PROCEDURE p () LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT 'A Procedure' <-SELECT CURRENT _ DATE, RAND() FROM t

В данном случае мы создали процедуру с именем p, которая возвращает текущую дату и псевдослучайное число из таблицы t. Пример ее вызова и возвращаемого результата: mysql> call p2() +--------------+-----------------+ | CURRENT_DATE | RAND() | +--------------+-----------------+ | 2005-06-27 | 0.7822275075896 | +--------------+-----------------+ 1 row in set (0.26 sec) Query OK, 0 rows affected (0.26 sec)

Чуть более сложный пример создания и использования функции: CREATE FUNCTION factorial (n DECIMAL(3,0)) RETURNS DECIMAL(20,0) DETERMINISTIC BEGIN DECLARE factorial DECIMAL(20,0) DEFAULT 1; DECLARE counter DECIMAL(3,0); SET counter = n; factorial _ loop: REPEAT SET factorial = factorial * counter; SET counter = counter - 1; UNTIL counter = 1 END REPEAT; RETURN factorial; END

В приложении: INSERT INTO t VALUES (factorial(pi)) SELECT s1, factorial (s1) FROM t UPDATE t SET s1 = factorial(s1) WHERE factorial(s1) < 5

Разумеется эфективность применения хранимых пороцедур существенно возрастает при вызове их с параметрами (аргументами). Ниже дан пример процедуры с обработкой переданых ей параметров: CREATE PROCEDURE p1 (IN parameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; IF variable1 = 0 THEN INSERT INTO t VALUES (17); END IF; IF parameter1 = 0 THEN UPDATE t SET s1 = s1 + 1; <-ELSE UPDATE t SET s1 = s1 + 2; END IF; END;

и в результате запроса мы получим: mysql> SELECT * FROM t +----+ | s1 | +----+ | 6 | | 6 | +------+ 2 rows in set (0.01 sec)

Кроме условных, возможны и любые циклические конструкции: CREATE PROCEDURE p3 () BEGIN DECLARE v INT; SET v = 0; WHILE v < 5 DO INSERT INTO t VALUES (v); SET v = v + 1; END WHILE; END;

Вызов процедуры: mysql> CALL p3() +------+ | s1 | +------+ ………… | 0 | | 1 | | 2 | | 3 | | 4 | +------+ Query OK, 1 row affected (0.00 sec)

Также применимы итерации, переходы, словом, всё, что предполагает стандарт. Внутри функций и хранимых процедур осуществлена реализация курсоров, но, к сожалению, она пока ограничена (ASESITIVE, READ ONLY и NONSCROLL): CREATE PROCEDURE p25 (OUT return _ val INT) BEGIN DECLARE a,b INT; DECLARE cur _ 1 CURSOR FOR SELECT s1 FROM t; DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; OPEN cur _ 1; REPEAT FETCH cur _ 1 INTO a; UNTIL b = 1 END REPEAT; CLOSE cur _ 1; SET return _ val = a; END;

Триггеры Триггеры похожи на хранимые процедуры. Это тоже скомпилированные SQL-запросы, хранимые на сервере. Отличие состоит в том, что триггер начинает работать в ответ на определённое событие, а именно на запросы UPDATE и DELETE. Пример создания и работы триггера:

Вызов процедуры теперь будет таким:

CREATE TABLE t22 (s1 INTEGER)

mysql> CALL p2(0) // Query OK, 2 rows affected (0.28 sec)

CREATE TRIGGER t22 _ bi BEFORE INSERT ON t22

50


администрирование FOR EACH ROW BEGIN SET @x = ‘Trigger was activated!’; SET NEW.s1 = 55; END;

После этого при выполнении запросов получим: mysql> INSERT INTO t22 VALUES (1) mysql> SELECT @x, t22.* FROM t22 // вызывается триггер +------------------------+------+ | @x | s1 | +------------------------+------+ | Trigger was activated! | 55 | +------------------------+------+ 1 row in set (0.00 sec)

К сожалению, на данный момент триггеры в MySQL могут обращаться только к своей таблице. Это, конечно, не делает данный механизм совсем бесполезным, но существенно сужает его возможности. Тради Пелзер (Trudy Pelzer) из MySQL AB заявляет, что разработчики трудятся сейчас над снятием этого ограничения, но достигнут ли они результатов к моменту релиза пятой версии, не сообщается.

Представления Представления (views) можно сравнить с временными таблицами, наполненными динамически формируемым содержимым. В общем-то, неименованные представления (те самые вложенные запросы) были доступны ещё в версии 4.1. В настоящей реализации есть две возможности создания представлений: с использованием алгоритма временных таблиц MySQL и с созданием самостоятельной таблицы. Нас интересует именно второй способ (первый был реализован, скорее всего, исходя из соображений совместимости и унификации). Такие представления позволяют значительно снизить объём кода, в котором часто повторялись простые объединения таблиц. К ним (после создания) применимы любые запросы, возвращающие результат в виде набора строк. То есть команды SELECT, UPDATE, DELETE, можно применять так же, как и к реальным таблицам. Важно и то, что посредством представлений можно более гибко распоряжаться правами пользователей базы данных, так как в этом случае есть возможность предоставлять доступ на уровне отдельных записей различных таблиц. Пример создания и работы простейшего (и потому абсолютно бесполезного) представления: mysql> CREATE VIEW v AS SELECT column1 FROM t; Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO v VALUES (1); Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM v; +---------+ | column1 | +---------+ | 1 | +---------+ 1 row in set (0.00 sec)

Словарь данных Иметь доступ к значениям метаданных – совершенно необходимое требование к современной СУБД. Ранее такая

№6, июнь 2005

возможность в MySQL достигалась различными SHOW-командами, но такой подход имеет очевидные недостатки. Эти команды нельзя использовать в простых запросах с соединениями, и, что существенно, они не соответствовали стандартам, будучи специфичными для MySQL. В новой версии СУБД появилась новая служебная база данных – INFORMATION_SCHEMA. Её наличие продиктовано тем же стандартом SQL:2003, и именно она решает задачу реализации словаря данных (data dictionary). INFORMATION_SCHEMA содержит таблицы, описывающие состояние и параметры сервера, в том числе определения и сущности таблиц. Это виртуальная база данных – физически (в виде файлов на диске) она не существует, вся информация динамически предоставляется сервером. Пример использования этой таблицы: mysql> -> -> ->

SELECT table _ name, table _ type, engine FROM INFORMATION _ SCHEMA.tables WHERE table _ schema = ‘tp’ ORDER BY table _ type ASC, table _ name DESC;

+------------+------------+--------+ | table_name | table_type | engine | +------------+------------+--------+ | t2 | BASE TABLE | MyISAM | | t1 | BASE TABLE | InnoDB | | v1 | VIEW | NULL | +------------+------------+--------+

Другой пример работы со словарём данных – просмотр привелегий: mysql> SELECT * FROM -> INFORMATION _ SCHEMA.COLUMN _ PRIVILEGES\G ************************ 1. row ************************ GRANTEE: 'peter'@'%' TABLE_CATALOG: NULL TABLE_SCHEMA: tp TABLE_NAME: t1 COLUMN_NAME: col1 PRIVILEGE_TYPE: UPDATE IS_GRANTABLE: NO ************************ 2. row ************************ GRANTEE: 'trudy'@'%' TABLE_CATALOG: NULL TABLE_SCHEMA: tp TABLE_NAME: t2 COLUMN_NAME: col1 PRIVILEGE_TYPE: SELECT IS_GRANTABLE: YES

Заключение Темп, взятый командой MySQL AB два года назад, впечатляет. Полным ходом идёт работа над MySQL 5.1, в которой планируется осуществить такие возможности, как поддержка внешних ключей (foreign key) для всех типов таблиц (в настоящий момент она существует только для таблиц InnoDB), новые схемы репликации (online backup) и кэширования таблиц и многое другое. Более того, в разделе официального руководства по MySQL (MySQL Reference Manual), озаглавленном «Что не планируется реализовать?», прямо сказано, что таких задач просто нет – реализовать планируется всё! Существует, правда, мнение, что новые возможности MySQL нивелируют её основные преимущества, такие как быстродействие, простота и нетребовательность к ресурсам. Возможно, в чём-то критики и правы, но пока разработчикам удавалось этого избежать. Будем, надеяться, что удастся и далее.

51


bugtraq Межсайтовый скриптинг в Sambar Server Отравление DNS-кеша и установка NetBIOS-подключения в Microsoft Internet Программа: Sambar Server 6.2 Security and Acceleration (ISA) Server Опасность: Низкая. Описание: Уязвимость существует из-за недостаточной фильтрации некоторых входных данных. Удаленный пользователь может с помощью специально сформированного URL выполнить произвольный HTML-сценарий в браузере жертвы в контексте безопасности уязвимого сайта. URL производителя: http://www.sambar.com. Решение: Установите последнюю версию (6.2.1) с сайта производителя.

Программа: Microsoft ISA Server 2000 SP2; Wspsrv.exe версии до 3.0.1200.411. Опасность: Средняя. Описание: Уязвимость существует, когда клиентские рабочие станции являются SecureNAT-клиентами для ISA-сервера. Большое количество трафика, генерируемого клиентами, может вызвать отказ в обслуживании ISA-сервера. URL производителя: www.microsoft.com. Решение: Установите исправление от производителя: http:// support.microsoft.com/kb/894864/EN-US.

Программа: Microsoft Internet Security and Acceleration (ISA) Server. Опасность: Низкая. Описание: Две уязвимости обнаружены в Microsoft Internet Security and Acceleration (ISA) Server. Удаленный пользователь может отравить кеш. Удаленный пользователь может также установить NetBIOS-подключение к ISA Server. Сервер с ошибками обрабатывает HTTP-заголовки. Удаленный пользователь может представить специально сформированный HTTP-запрос, содержащий множество ContentLength-заголовков, чтобы отравить кеш целевого ISA server [CVE: CAN-2005-1215]. В результате возможно получить доступ к содержанию, которое блокируется сервером, или заставить целевого пользователя посетить просмотреть произвольную информацию. Удаленный пользователь может использовать все предустановленные NetBIOS-фильтры, чтобы установить NetBIOS-подключение к целевому ISA Server [CVE: CAN-2005-1216]. URL производителя: www.microsoft.com. Решение: Установите соответствующее обновление.

Переполнение буфера и обход каталога в FutureSoft TFTP Server 2000

Переполнение буфера в Meteor FTP-сервере

Программа: FutureSoft TFTP Server 2000 версия 1.0.0.1. Опасность: Критическая. Описание: Обнаруженные уязвимости позволяют удаленному пользователю получить доступ к потенциально важным данным и скомпрометировать систему. 1. Переполнение стека возможно из-за ошибки при обработке запросов на чтение и запись. Удаленный пользователь может в качестве имени файла указать слишком длинную строку, вызвать переполнение стека и выполнить произвольный код с привилегиями пользователя SYSTEM. 2. Отсутствует фильтрация символов обхода каталога. Удаленный пользователь может выйти за пределы корневого каталога TFTP-сервера и получить доступ к потенциально важным данным на целевой системе. Решение: Способов устранения уязвимости не существует в настоящее время.

Программа: Meteor FTP Server 1.5 Опасность: Высокая. Описание: Переполнение буфера обнаружено при обработке команд USER, PASS и PORT. Удаленный пользователь может с помощью специально сформированных команд вызвать переполнение буфера и вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. Пример:

Отказ в обслуживании в Microsoft ISA Server 2000

Поднятие локальных привилегий в Антивирусе Касперского Программа: Антивирус Касперского версии 5.0.227, 5.0.228 и 5.0.335 для Windows 2000. Опасность: Низкая. Описание: Программа не снимает бит Супервизора со странички драйвера klif.sys. В результате уязвимость позволяет локальному пользователю подгрузить динамическую библиотеку, которая будет выполнена в адресном пространстве процесса с высоким уровнем привилегий. URL производителя: www.kaspersky.ru. Решение: Способов устранения уязвимости не существует в настоящее время.

52

USER (A x 80) (Following 4 Bytes = New Return Point) PASS 0wn3r PORT 127,0,0,1,18,12 (Must be same as connecting IP)

Решение: Способов устранения уязвимости не существует в настоящее время.

Переполнение буфера в IBM WebSphere Application Server Программа: IBM WebSphere Application Server 5.0. Опасность: Высокая. Описание: Два переполнения буфера существуют в административной консоли сервера при обработке данных в кодировке Unicode при включенной опции ‘global security option’. Удаленный пользователь может послать специально сформированные данные на порты 9080 (HTTP), 9090 (HTTP) и 9043 (HTTPS) приложения, чтобы вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.ibm.com. Решение: Установите последнюю версию (5.0.2.11) с сайта производителя.

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


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

FreeBSD TIPS: ПОВЫШАЕМ БЕЗОПАСНОСТЬ С ПОМОЩЬЮ ОДНОРАЗОВЫХ ПАРОЛЕЙ

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

СЕРГЕЙ СУПРУНОВ

И

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

№6, июнь 2005

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

53


администрирование Система FreeBSD предоставляет еще один удобный инструмент – одноразовые пароли. Начиная с FreeBSD 5-й версии, они реализуются системой OPIE (One-time Passwords In Everything), основанной на S/Key. Замечу, что OPIE существует и в большинстве дистрибутивов Linux, так что все описанное вы можете применить в этих системах. Однако для конкретизации изложения я буду описывать именно реализацию OPIE на FreeBSD 5.3.

В чем заключается идея В общих чертах это выглядит следующим образом: при попытке войти на сервер после ввода имени пользователя вы получаете строку-оклик, содержащую номер итерации и некоторую последовательность символов – так называемое «зерно» (seed): login as: serg otp-md5 496 ko5622 ext Password:

Далее вам нужно ввести парольную фразу (отзыв), соответствующую указанному номеру и «зерну». Для генерации паролей используется утилита opiekey (поэтому одноразовые пароли на жаргоне иногда называют «опиками»). Ей нужно передать текущий номер последовательности и «зерно», затем будет запрошена секретная фраза (она задается во время активации учетной записи пользователя) и выведен список шести коротких слов, которые и являются одноразовым паролем-отзывом. В отличие от системного пароля одноразовый нечувствителен к регистру символов, так что вводить его можно и маленькими буквами. Если в ответ на первое приглашение «Password:» просто нажать <Enter>, то появится еще одно, с включенным эхо-отображением вводимых символов, что позволит вам видеть вводимый текст на экране. При следующем входе номер последовательности уменьшится, и вводить нужно будет уже другой отзыв. Таким образом, вам не нужно заботиться о сохранности одноразового пароля после того, как он будет использован, – вы можете смело разложить листок с паролем на столе в присутствии пользователя, включить эхо-повтор вводимых символов и, ни от кого не прячась, спокойно набирать парольную фразу. Поскольку после нажатия <Enter> данный пароль теряет свою актуальность, его знание уже никому ничего не дает. Собственно, основная идея использования одноразовых паролей как раз и заключается в том, что никакая секретная информация (в данном случае таковой является секретная фраза, на основе которой осуществляется генерация паролей) по сети не передается.

Приступаем к реализации Во FreeBSD уже все готово для использования одноразовых паролей. Достаточно создать для пользователей, которые будут работать по данной схеме, соответствующие записи в файле /etc/opiekeys. Новая запись создается следующей командой: root# opiepasswd -c test

54

Adding test: Only use this method from the console; NEVER from remote. If you are using telnet, xterm, or a dial-in, type ^C now or exit with no password. Then run opiepasswd without the -c parameter. Using MD5 to compute responses. Enter new secret pass phrase: Again new secret pass phrase: ID test OTP key is 499 ko6010 RACE DAYS CHEF ARE CAW LEAF

Ключ -c дает команду создать запись для пользователя, в данном случае это пользователь test. Если имя пользователя не указано, создается (или изменяется) запись для текущего пользователя. Обычный пользователь может управлять своей записью, root – записями всех пользователей. Перед началом работы выводится предупреждение, что утилиту opiepasswd следует запускать только в защищенном режиме (с физической консоли или через ssh), чтобы исключить возможность перехвата секретной фразы. Знание данной фразы позволит любому человеку сгенерировать одноразовый пароль для входа под вашим именем. После всех предупреждений запрашивается секретная фраза. Она понадобится вам в дальнейшем для генерации паролей и управления своей записью. Утилита требует, чтобы длина этой фразы была от 10 до 127 символов, иначе вы получите сообщение об ошибке: Secret pass phrases must be between 10 and 127 characters long.

В конце работы утилита выдает текущие номер последовательности (по умолчанию – 499) и слово-«зерно», в данном примере – ko6010. Запоминать эти значения не нужно – они будут выводиться на экран при каждой попытке войти в систему. Последней строкой выводится парольная фраза, которая к данному моменту уже бесполезна и служит только для проверки, – следующий номер последовательности устанавливается в 498. Обратите внимание, что как только счетчик достигнет 0, вход в систему станет невозможным. Поэтому необходимо заблаговременно осуществлять повторную инициализацию записи в /etc/opiekeys, для чего используется opiepasswd без ключей. Также с помощью ключа -n вы можете задать начальное значение счетчика. Замечу, что переинициализация выполняется без запроса секретной фразы (она остается прежней). Используются только одноразовые пароли, так что повторная инициализация может быть выполнена и удаленно, с использованием небезопасного соединения. Также утилита opiepasswd используется для дезактивации записи того или иного пользователя. Для этого используется ключ -d. Дезактивация не удаляет запись пользователя из файла opiekeys, а просто «забивает» секретную фразу звездочками. Теперь при входе пользователя в систему по-прежнему будет выдаваться строка-«оклик», но получить для нее правильную парольную фразу будет уже невозможно. Чтобы полностью отменить запрос на ввод одноразового пароля и вернуться к прежней аутентификации системным паролем, достаточно удалить для соответствующего пользователя строку в файле /etc/opiekeys.


администрирование Следующая утилита, которая может быть полезна, – opieinfo. Она возвращает текущие значения номера последовательности и «зерна» для пользователя. Например, ее можно использовать, перед тем как генерировать пароли. Утилита opiekey имеет несколько полезных ключей. Например, с помощью ключа -n можно указать, сколько паролей должно быть сгенерировано начиная с текущего номера итерации: serg$ opieinfo 498 ko5623

serg$ opiekey -n 5 498 ko5623 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: 494: LOOK RUSH WIFE BREW ROBE LAM 495: TERN MOCK MA LED PA MELD 496: NIL FALL AKIN FUSE MIND SLUR 497: GINA MOP AKIN SHAW CALF COMA 498: FLY GONE GAB MYRA WONT SANK

Теперь эти пароли можно аккуратно сохранить в надежное место и ехать с ними в командировку или к клиенту – средство для пяти безопасных входов в систему у вас есть. Естественно, генерировать пароли можно и по мере необходимости, например, на своем домашнем компьютере или ноутбуке с помощью соответствующей утилиты. Но к такому инструменту предъявляются серьезные требования безопасности, поскольку во время генерации вы должны быть уверены, что никто не узнает вашу секретную фразу. Вы можете настроить вход в систему как исключительно по одноразовым паролям, так и разрешив использование постоянных паролей, предоставив пользователю право выбирать в зависимости от ситуации, как входить в систему. Например, вам может быть удобнее вводить системный пароль при работе из офиса, а «опики» использовать при необходимости зайти на сервер с «чужой» территории. Для определения возможных способов доступа используется файл /etc/opieaccess. По умолчанию, как только для пользователя появляется запись в /etc/opiekeys, он уже не может пользоваться системным паролем. Чтобы разрешить вход по обоим паролям, нужно в opieaccess создать запись типа permit для нужных адресов. Например, чтобы разрешить вход под системным паролем из локальной сети, а для внешних соединений оставить только «опики», можно использовать следующую строку: permit 192.168.0.0 255.255.255.0 # permit 0.0.0.0 0.0.0.0

Закомментированная строка разрешит использование обоих типов паролей с любого адреса. Правило deny позволяет явно запретить использование системного пароля для указанной подсети. Обратите внимание, что разрешение вводить системные пароли делает возможным использование уже скомпрометированного пароля, сводя на нет преимущества системы OPIE. Единственное, что при этом достигается,– это существенное снижение вероятности раскрыть свой пароль при

№6, июнь 2005

работе в незащищенном режиме. Поэтому к вопросу раздачи прав следует относиться очень внимательно. Более тонко процедуру входа в систему можно определить в настройках PAM (см. /etc/pam.d/system и прочие файлы). Нужно заметить, что не все приложения могут работать с одноразовыми паролями. Например, во FreeBSD утилиты login, su, ssh, telnetd поддерживают аутентификацию OPIE, popper – нет (но если вход с системным паролем разрешен, проблем с использованием этой программы не возникает). По умолчанию, если поддержка OPIE какимто сервисом имеется, в соответствующем файле каталога /etc/pam.d будет присутствовать pam_opie.so. Попытка аутентификации на FTP-сервере (FreeBSD 5.3, стандартный ftpd) с одноразовым паролем выявила интересную проблему – с помощью клиента ftp вход по «опику» выполнялся нормально, а вот попытка войти под системным паролем (например, с использованием менеджера FAR) завершалась неудачей, хотя настройки позволяли использование системного пароля. Разбор полета показал, что проблема заключается в разрешении имен. Происходило следующее – в процессе установки соединения IP-адрес клиента преобразовывался в доменное имя типа client.domain. provider.ru, которое обрезалось до client.domain, после чего система пыталась определить IP-адрес этого «хоста», чтобы установить права на вход с системным паролем в соответствии с /etc/opieaccess. Это, естественно, не получалось, и возвращалась ошибка «Неизвестный хост client.domain». Если же вход на сервер FTP выполнялся с машины, адрес которой не присутствует в базе DNS, то все работало отлично. Вылечить это удалось добавлением следующей строчки в /etc/resolv.conf: options ndots:3

Эта строка заставляет функции разрешения имен (см. man resolver) возвращать в качестве доменного имени часть имени хоста до третьей точки, то есть целиком. По умолчанию параметр ndots равен 1, что и приводило к описанной выше ситуации. Во FreeBSD 5.4 данная проблема уже не наблюдается. В заключение замечу, что на моей системе права доступа к файлу /etc/opiekeys по умолчанию были установлены в rw-r--r--, что позволяло читать его абсолютно всем. Поскольку данный файл хранит, хоть и в зашифрованном виде, ключевую фразу, которая используется при генерации одноразовых паролей, то такой либеральный доступ к нему выглядит не самой лучшей идеей. Возможно, это необходимо для работы некоторых утилит, но в моем случае после установки прав в rw------- никаких проблем пока не обнаружилось. И, несмотря на банальность того, что я сейчас скажу, считаю своим долгом предупредить – любые действия, связанные с изменением порядка входа в систему, должны выполняться осознанно и с предельной осторожностью. В случае с OPIE нужно очень постараться, чтобы полностью заблокировать себе доступ в систему. Но тем не менее всегда полезно иметь запасной вариант, например, создать для использования одноразовых паролей другую учетную запись и, лишь убедившись в ее работоспособности, переводить на новую схему остальных пользователей.

55


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

ИЗУЧАЕМ ПРИНЦИП РАБОТЫ НЕIMDAL KERBEROS Как только ваша подконтрольная локальная сеть начнет развиваться и расширяться, возникнут новые задачи: Как синхронизировать системные учетные записи растущего числа пользователей? Как управлять доступом пользователей к сетевым сервисам внутри локальной сети? При этом сервисы могут работать на разных компьютерах, а определенные службы держат собственные учетные записи для авторизованных пользователей. Решением послужит введение единой системы регистрации в локальной сети с помощью протокола Kerberos.

МИХАИЛ КОНДРИН

Ч

тобы подробнее разобраться с возникающими задачами, рассмотрим ситуацию с организацией распределенной вычислительной системы. Разумеется, чем больше компьютеров входят в кластер, тем выше его вычислительная мощность. Наиболее распространненные системы кластерных вычислений на сегодня – Parallel Virtual Machine и Message Passing Interface. Обе позволяют пользователю, в данном случае разработчику программ, пересылать куски данных, нуждающихся в обработке, между узлами кластера и синхронизировать получение результатов с разных узлов. Это фасад системы. За кулисами происходит обращение к удаленному командному интерпретатору и вызов определенных программ в нем. То есть администратору такой системы необходимо добиться, чтобы пользователи кластера имели доступ к командному интерпретатору на узлах кластера и, более того, этот доступ должен быть беспарольным для каждой пары компьютеров в кластере. Не очень-то удобна система, где запуск нескольких параллельных копий программы требует от пользователя регистрации на каждом из узлов кластера. Таким образом, во-первых, информация о пользователях должна совпадать на всех этих компьютерах. Один из вариантов решения – иметь одинаковые копии /etc/passwd и /etc/shadow на каждом из узлов с их последующим обновлением с помощью скриптов при добавлении нового пользователя. Во-вторых, если в качестве удаленного командного интерпретатора используется rsh, то добиться беспарольного входа с помощью внесения всех компьютеров, входящих в этот кластер, в файл /etc/hosts.equiv (этот файл также должен совпадать на всех узлах кластера). Однако использование rsh гарантирует вам проблемы с безопасностью, если предположить возможность доступа к кластеру извне локальной сети, который, как вы помните, должен быть беспарольным. Можно сконфигурировать доступ по адресу компьютера (с помощью tcp-wrappers) и бороться с ip-spoofing внешними средствами или настраивать openssh в качестве удаленного командного интерпретатора. В последнем случае вам придется мириться с тем, что процессорные циклы будут расходоваться не на расчет, а на кодирование/раскодирование блоков данных. Тем не менее ни одно из этих решений нельзя считать удачным. Далеко не каждому из вас приходится сталкиваться с

56

настройками вычислительных кластеров. Но именно эта проблема построения распределенной вычислительной системы Athena заставила в начале 80-х годов программистов из Массачусетского технологического института разработать и внедрить протокол удаленной аутентификации пользователей. Комбинирование специальных криптографических средств позволяло, с одной стороны, свести на нет вероятность перехвата паролей и иметь шифрованный канал для передачи данных между компьютерами (эта возможность могла отключаться по желанию пользователя). А с другой – иметь систему с единой регистрацией (single sign-on), что дает возможность пользователю регистрироваться один раз при входе в систему и в дальнейшем иметь свободный доступ к сетевым ресурсам на основе этой регистрации. Понятно, что число пользователей, которым такая функциональность была бы удобна, значительно превышает число нуждающихся в распределенных системах, и в дальнейшем этот протокол, получивший название Kerberos (по имени трехголового пса из древнегреческих мифов, стерегущего вход в царство мертвых), стал широко применяться независимо от Athena как система регистрации в крупных финансовых и академических учреждениях.

Kerberos с точки зрения пользователя На пользовательском уровне все реализации Kerberos выглядят однотипно, поэтому рассмотрим, как это происходит в моем случае. Регистрация в Kerberos осуществляется командой kinit, которая автоматически вызывается при моем входе на рабочую станцию под управлением Windows XP. В результате мне выдается основной документ, удостоверяющий мою личность в Kerberos, – «супербилет», билет, гарантирующий получение доступа к сетевым службам (или TGT – ticket granting ticket). При этом у меня всегда есть возможность зарегистрироваться в Kerberos под другим именем с помощью все той же команды kinit, что приводит к обновлению начального билета. Теперь предположим, что я хочу посмотреть логи на своем router/firewall под управлением Linux. Я открываю терминал cygwin. Первое, что можно сделать, – просмотреть имеющиеся билетики: mike@alex ~\$ klist


безопасность История создания Kerberos В 1983 году была начата работа по созданию системы Athena. Работу финансировали компании IBM и DEC, и в 1987 году была выпущена первая версия протокола Kerberos (Kerberos 4). Дальнейшая эксплуатация выявила недостатки протокола, и обновленный вариант Kerberos 5 вышел в свет в 1993 году. В настоящее время 4 версия практически не используется, но в реализациях протокола от МТИ совместимость с предыдущей версией продолжает сохраняться. К 1993 году протокол Kerberos уже завоевал популярность, и многие компании, разработчики программного обеспечения стремились использовать его в своих программных продуктах. Но тут имел место юридический казус – дело в том, что в то время в США еще действовали законы, введенные еще во время холодной войны, запрещающие экспорт военных технологий. Поскольку криптографическая защита, использованная в Kerberos, классифицировалась как военная технология, это создавало препятствия для использования его в программных продуктах сторонних фирм и распространения его за пределами США. Для решения этой проблемы была выпущена версия протокола Kerberos 4, из которого была изъята вся сильная криптография. Эта реализация Kerberos получила название Bones (кости), и ограничения на ее Credentials cache: FILE:/tmp/krb5cc_1017 Principal: mike@HPPI.TROITSK.RU Issued Expires Principal May 29 22:18:22 May 30 22:18:22 krbtgt/HPPI.TROITSK.RU@HPPI.TROITSK.RU

В списке, как вы видите, имеется только один билет – тот самый TGT. Credential Cache – это файл, в котором хранятся полученные мной сертификаты. По умолчанию его название – это комбинация /tmp/krb5cc_ и id пользователя. Срок действия любого билетика ограничен по времени – это снижает интерес к его перехвату со стороны злоумышленника. Теперь я запускаю командный интерпретатор на удаленном компьютере: \$ telnet -F relay Trying 192.168.1.254... Connected to relay.hppi.troitsk.ru. Escape character is '^]'. Waiting for encryption to be negotiated... [ Trying mutual KERBEROS5 (host/relay.hppi.troitsk.ru@HPPI.TROITSK.RU)... ] [ Kerberos V5 accepts you as ``mike@HPPI.TROITSK.RU'' ] [ Kerberos V5 accepted forwarded credentials ] Encryption negotiated.

\$klist Credentials cache: FILE:/tmp/krb5cc_1000 Principal: mike@HPPI.TROITSK.RU Issued Expires Principal May 29 22:21:16 May 30 22:18:22 krbtgt/HPPI.TROITSK.RU@HPPI.TROITSK.RU

Вот пример магии Kerberos в действии – воспользовавшись моим супербилетом, Kerberos прозрачно для пользователя организует доступ к сетевому ресурсу (в данном случае он фигурирует под именем host/relay.hppi.troitsk.ru@HPPI. TROITSK.RU) и более того – telnet при помощи Kerberos автоматически шифрует весь сетевой трафик между клиентом и сервером. Список билетов при этом не меняется – ключ -F позволяет перемещать имеющиеся у меня билетики с компьютера на компьютер. Закрытие telnet-сессии автоматиче-

№6, июнь 2005

экспорт уже не действовали. В 1997 году группа программистов из Стокгольмского Королевского университета, взяв за основу Bones, проделала обратную работу и вставила недостающую криптографическую функциональность. Вот так экспортные ограничения Соединенных Штатов способствовали развитию европейского hi-tech. Впоследствии ими же была выпущена реализация протокола Kerberos 5, получившая название Heimdal. Heimdal (Хеймдалль) – это божество из скандинавского пантеона, чьи функции состояли в охране стратегических коммуникаций, а именно – моста, разделяющего Асгард и Мидгард. Так же, как и в случае с древнегреческим прототипом Kerberos, здесь эксплуатируется образ неподкупного стража. Интересно отметить, что мотивом для программистов из Стокгольмского университета, так же как и для их коллег из МТИ, являлась задача обеспечения публичного доступа к вычислительному кластеру. Последним эпизодом из истории Kerberos стало объявление компанией Microsoft в 1999 году о поддержке Kerberos в своей будущей операционной системе NT 5.0 (впоследствии названной Windows 2000), что действительно было реализовано в качестве компонента Active Directory. В настоящее время Kerberos является промышленным стандартом удаленной аутентификации пользователей. ски очищает кэш на удаленном компьютере с помощью вызова команды kdestroy, так что вы можете не опасаться, что ваш кэш может быть использован кем-то еще. Так как супербилет по-прежнему со мной, то это позволяет мне получить доступ к другому компьютеру, серверу Kerberos. \$telnet -F kenga Trying 192.168.1.253... Connected to kenga.hppi.troitsk.ru. Escape character is '^]'. Waiting for encryption to be negotiated... [ Trying mutual KERBEROS5 (host/kenga.hppi.troitsk.ru@HPPI.TROITSK.RU)... ] [ Kerberos V5 accepts you as ``mike@HPPI.TROITSK.RU'' ] [ Kerberos V5 accepted forwarded credentials ] Encryption negotiated. mike@kenga:~\$

Точно так же я могу получить доступ к любому сетевому сервису – например, к локальному ftp-серверу. mike@kenga:~\$ ftp kenga Connected to kenga.hppi.troitsk.ru. 220 kenga FTP server (Version 6.00+Heimdal 0.6.3) ready. Trying GSSAPI... Authenticated to <host/kenga.hppi.troitsk.ru@HPPI.TROITSK.RU> Authentication successful. Name (kenga:mike): S:232-Linux 2.4.25. S:232 User mike logged in. S:230 Password not necessary Remote system type is UNIX. Using binary mode to transfer files. ftp> bye S:221 Goodbye.

Заметьте, что во всех случаях мне не потребовался ввод пароля. Доступ ко всем компьютерам мне предоставлялся на основании моего TGT. Все операции c Kerberos (выдача билетов, добавление/удаление пользователей и т. д.) фиксируются в его логах, и можете убедиться, что вся моя ак-

57


безопасность тивность с перемещениями от компьютера к компьютеру зафиксирована в файле /var/log/krb5kdc.log. Для удобства я разделил кусок log-файла на 4 части, соответствующие процессам получения доступа к моей рабочей станции, удаленного доступа к двум серверам и серверу ftp. 2005-05-29T22:18:22 AS-REQ mike@HPPI.TROITSK.RU from IPv4:192.168.1.45 for krbtgt/HPPI.TROITSK.RU@HPPI.TROITSK.RU 2005-05-29T22:18:22 Using des-cbc-crc/des-cbc-md5 2005-05-29T22:18:22 Requested flags: renewable_ok, renewable, forwardable 2005-05-29T22:18:23 sending 574 bytes to IPv4:192.168.1.45 2005-05-29T22:18:23 TGS-REQ mike@HPPI.TROITSK.RU from IPv4:192.168.1.45 for krbtgt/HPPI.TROITSK.RU@HPPI.TROITSK.RU [renewable, forwardable] 2005-05-29T22:18:23 sending 593 bytes to IPv4:192.168.1.45 ...... 2005-05-29T22:21:15 TGS-REQ mike@HPPI.TROITSK.RU from IPv4:192.168.1.45 for host/relay.hppi.troitsk.ru@HPPI.TROITSK.RU 2005-05-29T22:21:16 sending 546 bytes to IPv4:192.168.1.45 2005-05-29T22:21:16 TGS-REQ mike@HPPI.TROITSK.RU from IPv4:192.168.1.45 for krbtgt/HPPI.TROITSK.RU@HPPI.TROITSK.RU [forwarded, forwardable] 2005-05-29T22:21:16 sending 589 bytes to IPv4:192.168.1.45 ...... 2005-05-29T22:21:43 TGS-REQ mike@HPPI.TROITSK.RU from IPv4:192.168.1.254 for host/kenga.hppi.troitsk.ru@HPPI.TROITSK.RU 2005-05-29T22:21:44 sending 550 bytes to IPv4:192.168.1.254 2005-05-29T22:21:44 TGS-REQ mike@HPPI.TROITSK.RU from IPv4:192.168.1.254 for krbtgt/HPPI.TROITSK.RU@HPPI.TROITSK.RU [forwarded, forwardable] 2005-05-29T22:21:44 sending 593 bytes to IPv4:192.168.1.254 ...... 2005-05-29T22:22:27 TGS-REQ mike@HPPI.TROITSK.RU from IPv4:192.168.1.253 for ftp/kenga.hppi.troitsk.ru@HPPI.TROITSK.RU 2005-05-29T22:22:27 Server not found in database: ftp/kenga.hppi.troitsk.ru@HPPI.TROITSK.RU: No such entry in the database 2005-05-29T22:22:27 sending 145 bytes to IPv4:192.168.1.253 2005-05-29T22:22:27 TGS-REQ mike@HPPI.TROITSK.RU from IPv4:192.168.1.253 for host/kenga.hppi.troitsk.ru@HPPI.TROITSK.RU 2005-05-29T22:22:27 sending 550 bytes to IPv4:192.168.1.253 2005-05-29T22:22:28 TGS-REQ mike@HPPI.TROITSK.RU from IPv4:192.168.1.253 for krbtgt/HPPI.TROITSK.RU@HPPI.TROITSK.RU [forwarded, forwardable] 2005-05-29T22:22:28 sending 546 bytes to IPv4:192.168.1.253

Вы можете сказать: «Как же так – протоколы telnet и ftp небезопасны и правильнее использовать openssh. И ничего удивительного в беспарольной аутентификации нет – ту же самую функциональность обеспечивает ssh, предоставляя возможность регистрироваться по парам публичных/секретных ключей». Все правильно. Только для того, чтобы в сети из N компьютеров обеспечить доступ по ssh с любого из этих компьютеров на любой другой, вам придется в общем случае проделать 2N*{число пользователей} перемещений публичных ключей (каждая пара компьютеров в сети обменивается публичными ключами пользователей), что в случае больших сетей трудноосуществимо. В то же время с помощью Kerberos вам нужно только зарегистрировать каждый из компьютеров на сервере Kerberos и иметь один ключ на каждом из хостов (в отличие от ssh в Kerberos используется симметричное шифрование) – итого 2N операций. Что же касается первой части вопроса, то я использую специальный «керберизованный» вариант telnet, что защищает соединения между хостами не хуже, чем ssh. Главный недостаток стандартного telnet (и не только его) состоит в том, что при аутентификации на удаленном компьютере telnet пересылает пароль пользователя по сети в виде открытого текста, что позволяет злоумышленнику перехватить его. Ssh обходит эту опасность с помощью несимметричного шифрования пароля. А каким же образом Kerberos удается избегать брешей в защите связанных с удаленной аутентификацией?

Удаленная аутентификация в Kerberos Делается это с помощью уже упоминавшихся ранее билетиков/сертификатов (tickets/credentials – оба слова используются как синонимы) – специальным образом изготовлен-

58

ных и упакованных шифровальных ключей. В Kerberos как пользователь, так и сетевая служба не различаются между собой и именуются principal (принципал – юридический термин, означающий лицо, поручающее агенту совершить сделку от его имени), что весьма точно описывает функции принципалов в Kerberos. Принципалы определяются своим именем и паролем, причем в случае сетевой службы в качестве этого пароля выступает ключ, хранящийся на том же компьютере, где работает защищаемый сервис. База данных принципалов хранится на сервере Kerberos, и при необходимости проверить аутентичность пользователя или сервиса, компьютеры, объединенные в сектора (realms), соединяются с этим сервером. По поводу терминологии: точный перевод «realm» («царство») применительно к Kerberos не прижился, а иногда используемый термин «домен» не кажется мне удачным, поскольку слово и так перегружено. Так же, как и в случае с DNS, главный контроллер сектора Kerberos (Key Distribution Center, KDC, центр выдачи ключей) может иметь как дополнительные, slave, контроллеры (что позволяет обеспечить бесперебойную работу при выходе из строя основного контроллера), так и в одиночку держать несколько секторов. Типичное имя принципала, например, сервиса удаленного доступа к командному интерпретатору компьютера, выглядит таким вот образом: host/kdc.myrealm.ru@MYREALM.RU, что обозначает сервис с основным именем (primary name) host и характеристикой (instance) kdc.myrealm.ru, принадлежащий сектору MYREALM.RU. Разделение имен принципалов на несколько частей позволяет различать, с одной стороны, разные службы, работающие на одном хосте (с помощью primary name, host в нашем случае). А с другой – среди нескольких однотипных служб, работающих в сети, выбирать конкретную, запущенную на определенном сервере (с помощью поля instance, которая в нашем случае совпадает с именем компьютера). Название секторa не обязано повторять доменное имя сети, но именно такое правило наименований считается устоявшейся практикой. Теперь посмотрим, что происходит, если пользователь joeuser (а точнее, принципал joeuser@MYREALM.RU – поле instance для «живых» пользователей обычно не используется) пытается получить доступ к этому серверу. Предполагается, что как клиентская программа telnet, так и telnetd демон собраны с поддержкой Kerberos (обе эти программы входят в дистрибутив Heimdal). Разумеется, как сам сервер, так и пользователь должны быть зарегистрированы в одном и том же секторе Kerberos. Как обычно, сеанс подключения к серверу начинается с того, что пользователь запускает telnet со своим регистрационным именем и именем удаленного компьютера telnet -l joeuser kdc.myrealm.ru. Клиентская программа после этого обращается к KDC с просьбой предоставить для joeuser доступ к хосту kdc.myrealm.ru. Kerberos генерирует по определенным правилам шифровальный ключ (session key) и разыскивает по своей базе данных принципалов joeuser и host/kdc.myrealm.ru, а также их пароли (ключи). Если пароли найдены (в противном случае сеанс заканчивается аварийно – т.к. кто-то из этих двух принципалов не зарегистрирован в секторе Kerberos), Kerberos приступает к генерированию сессионного ключа (session key). С помощью ключа принципала host/kdc.myrealm.ru он шифрует сгенерированный session key вместе с именем пользователя joeus-


безопасность er, потом прилагает к зашифрованному блоку вторую копию того же session key и снова шифрует получившийся билетик с помощью пароля пользователя. После этого пакет отсылается клиентской программе. Если к этому времени пользователь набрал свой пароль и он совпадает с паролем, использованным Kerberos при шифровке, то клиентская программа сумеет расшифровать билетик. Далее, половина билетика (с session key) остается пользователю, а вторая, которая не может быть расшифрована клиентом, поскольку ключ сервера ей неизвестен, пересылается на сервер. Сервер расшифровывает ее с помощью своего ключа и таким образом узнает как session key, так и имя пользователя, что позволяет серверу авторизовать его своими собственными средствами. За- Рисунок 1. метим, что помимо регистрации в этом случае имеется возможность использовать полученный session key, поскольку в итоге он известен как клиенту, так и серверу, для шифрования сетевого трафика в рамках данной сессии, чем многие приложения и пользуются. Схематически процесс обмена сертификатами показан на рис. 1. Что еще интересного в используемом Kerberos механизме аутентификации? Дело в том, что Kerberos оказывается еще более параноидальным, чем мы предполагали вначале, т.е. считает ненадежными не только сетевые соединения (ни один из паролей, как вы могли заметить, не передается в открытую по сети), но и клиентский, и даже серверный компьютер. Для каждого из них ключ/пароль партнера так и остается неизвестным – только session key, который для потенциального взломщика интереса не представляет, поскольку используется только в данной сессии. Как известно, безопасность и удобство пользователей вещи взаимоисключающие. Но ученым из МТИ удалось найти удачный компромисс, придумав еще одну замечательную вещь – ticket granting ticket (TGT). Если пытаться переводить этот термин на русский – «билет для выдачи других билетов», что-то вроде единого проездного. Смысл его в том, что пользователь сети проходит полностью процедуру регистрации (с вводом имени и пароля) в своем секторе только один раз, а сертификат, полученный в результате, затем используется клиентскими приложениями как эквивалент пользовательского пароля для получения доступа к сетевым сервисам. Процесс выдачи ТGT ничем не отличается от описанного выше, только в качестве службы, к которой пользователь получает доступ, выступает сам Kerberos – его Ticket Granting Service. После получения TGT записывается в кэш-файл на диске клиентского компьютера и затем по мере надобности извлекается оттуда. В схеме, описанной выше, session-key, закодированный в TGT используется вместо пароля пользователя при шифровании сертификата, предоставляемого для доступа к сетевому ресурсу. И хотя TGT хранится в кэше на диске рабочей станции пользователя, угроза, связанная с его перехватом, не столь уж серьезна, поскольку его действенность ограничена по времени. TGT позволяет организовать в корпоративной сети single sign-on (система единой регистрации) систему. Например, с помощью замены системного login на кер-

№6, июнь 2005

Процесс обмена сертификатами

беризованный аналог (программа с тем же именем входит в состав Heimdal Kerberos) при входе на рабочую станцию пользователь получает TGT, который затем используется для генерирования билетиков, специфичных для какой-нибудь из сетевых служб. Таким образом, следует помнить, что при любой аутентификации в Kerberos всегда участвуют два принципала – один соответствует пользователю, пытающемуся получить доступ к сервису, а второй – самому этому сервису. Мы не будем рассматривать более сложный механизм аутентификации, так называемый user-to-user, когда сетевой сервис не имеет собственной записи в базе данных Kerberos, а использует сертификаты пользователя, запустившего сервис. Аутентификация user-to-user могла бы быть полезна, например, для X-серверов, но и для них эта методика не получила большого распространения. Так в общих чертах выглядит принцип работы Kerberos. Многие детали реализации протокола Kerberos при этом пришлось опустить. В частности, формат сертификата в действительности более сложен, чем описано здесь. В него входит время выдачи и срок годности сертификата, адрес компьютера, на который отсылается сертификат, и флажки, позволяющие контролировать использование сертификатов и тем самым настраивать политику безопасности внутри сектора Kerberos. Скажем, с помощью снятия флажка forwardable можно «привязать» сертификат к одному компьютеру и запретить его перемещение на другие хосты. Пример, рассмотренный в начале статьи, был бы невозможен в этом случае – после получения удаленного доступа мне каждый раз потребовалось бы вводить пароль для запроса нового TGT. В следующем номере журнала мы перейдем к практической части и развернём инфраструктуру Kerberos в локальной сети.

Литература, ссылки: 1. Гребенников Р. Танцуем Самбу. – Журнал «Системный администратор», №11, ноябрь 2004 г. – 32-38 с. 2. Фундаментальное обсуждение протокола Kerberos (на англ.) можно найти в ссылках на сайте Массачусетского технологического института: http://web.mit.edu/kerberos/www/papers.html.

59


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

ЗАЩИЩЕННАЯ ПОЧТОВАЯ СИСТЕМА С TIGER ENVELOPES

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

СЕРГЕЙ ЯРЕМЧУК

Н

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

№6, июнь 2005

втихаря отправляться обычным способом, либо придется ему просить это сделать кого-нибудь другого, что тоже неприемлемо. Не выгонять же из-за этого лучшего бухгалтера. Администратору в этом случае лучше всего взять ситуацию под свой полный контроль. Хорошим примером такого подхода является VPN, пользователь может и не догадываться, что работает по защищенному каналу. Аналогичным путем пошли разработчики защищенной почтовой системы Tiger Envelopes (http://www.tigerprivacy.com).

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

61


безопасность ко раз, на другом конце код будет сниматься слой за слоем, таким образом повышается устойчивость и общая защита. В более поздних версиях, кроме сообщения, планируется кодировать и заголовок (например, кодирование поля «Тема» позволит скрыть характер самого сообщения). На сегодняшний день существует две версии Tiger Envelopes: Free и Business. Первая доступна для свободного скачивания, предназначена для индивидуального использования и распространяется под лицензией GPL. Более расширенная версия Business является коммерческой, и хотя также доступен исходный код, но он прилагается исключительно для контроля. Написан Tiger на Java, и в настоящее время доступны пакеты, собранные под Windows, Mac OS X и GNU/Linux. Каждый пакет, кроме непосредственно Tiger Envelopes, включает систему кодирования, виртуальную машину Java под используемую операционную систему и исходный код. Кроме того, если собирать систему самостоятельно, то с сайта разработчиков можно скачать исходники (как это сделать, можно прочитать в http://www.tigerprivacy.com/docs/InstallSource. html). Расширяемый API, основанный на CORBA-интерфейсе, названный Open Crypto Engine (OCE), позволяет использовать на принципе любую доступную систему шифрования, написанную на любом языке, и менять ее при необходимости (например, при обнаружении уязвимости в конкретной реализации). В настоящее время доступны расширения для Bouncy Castle (http://www.bouncycastle.org), GPG (http://www. gnupg.org) и PGP (http://www.pgpi.com). При этом ключи задаются фактически для группы абонентов, а не индивидуальных пользователей, что в целом облегчает администрирование и обмен информацией с корреспондентами, которым нет теперь необходимости в обмене ключами с каждым сотрудником организации. В будущем разработчики планируют добавить сервер ключей, который должен еще более упростить использование системы.

Установка и настройка В общем, процесс установки и настройки Tiger Envelopes для Windows и GNU/Linux (а судя по описанию, и для Mac OS X) отличается только особенностями самих систем, т.е. фактически используемыми каталогами, в которые будут распакованы файлы. Итак, после запуска исполняемого файла, скачанного с сайта по ссылке (размер для Windows – 35 Мб, Linux – 45 Мб), программа установки проверит систему на совместимость. После чего в следующем окне необходимо ввести параметры почтового ящика, который будет защищаться тигром, вкладки «More Info» и «Advanced» позволяют более тонко настроить параметры. В этом же окне вводится ключевая фраза (passphrase), необходимая при генерации ключа GPG (для того чтобы Tiger Envelopes мог дальше переправить сообщение, необходимо активировать хотя бы один действующий почтовый ящик) (см. рис. 1). Далее создается ключ, выводится отчет, сообщающий об успешном создании почтового аккаунта, и программа начинает устанавливаться и прописывает себя в автозагрузку. Вот в принципе и все. Установленную программу в Windows можно найти в C:\Program Files\TigerPrivacy\FreeEnvelopes (отдельно в C:\gnupg распаковывается GPG). В Linux Tiger Envelopes найдете в /usr/local/bin/FreeEnvelopes. Внутри этого каталога имеется подкаталог с документацией,

62

исходные тексты (src), библиотеки и прочее. Здесь же лежит ряд скриптов (или исполняемых файлов в зависимости от ОС), которые понадобятся для настройки, проверки статуса и тестирования. Например, Preferences позволит добавить (изменить настройки, удалить) почтовый ящик, показать, экспортировать, импортировать и удалить ключи, протестировать конфигурацию. Кроме этого, в папке Envelopes, которая будет размещена в каталоге текущего пользователя (в моем случае это C:\Documents and Settings\Sergej\Envelopes и /home/sergej/Envelopes), создается ряд подкаталогов, в которых будут сохраняться открытые ключи (PublicKeys), входящие и исходящие сообщения (messages), файлы журнала (logs), плюс здесь же, в файлах XML-формата, найдете индивидуальные настройки пользователя.

Рисунок 1. Для того чтобы Tiger Envelopes мог дальше переправить сообщение, необходимо активировать хотя бы один действующий почтовый ящик

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

Рисунок 2. Для отправки и получения почты через Tiger Envelopes, необходимо изменить настройки почтового клиента

В качестве SMTP-сервера для исходящих сообщений и ставим имя компьютера, на котором установлен Tiger En-


безопасность velopes, вариантами могут быть IP-адрес, localhost либо 127.0.0.1. Номер порта заменяем на 9025. Сервер для получения почты через POP3 также указываем на этот компьютер, а номер порта правим на 9110. И не менее важно: пользователя, которого в почтовом клиенте обычно прописываем без доменного имени, пишем полностью. В моем случае пользователь grinder был заменен на grinder@ua.fm. Для тестирования работы в Tiger Envelopes по умолчанию создаются два пользователя. Имя: Test User Почтовый адрес: test@tigerprivacy.local Пароль: 256 AV Audio Имя: Test User2 Почтовый адрес: test2@tigerprivacy.local Пароль: Memory F4800000

В каталоге, куда установлен Tiger, имеется скрипт Test, предназначенный для тестирования работы, имитирующий обмен данными между двумя этими пользователями. После чего нужно проверить работу в реальных условиях, обменявшись сообщениями. Теперь письмо, отправленное с вашего компьютера, автоматически будет зашифровано. В теле письма будет содержаться открытый ключ, а в конце после расшифровки будет добавлено такое сообщение. Tiger Envelopes decrypted this message at 2005-06-25 04:49:06.774 UTC.

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

№6, июнь 2005

Get your privacy back with free email envelopes at <a href="http://tigerprivacy.com">Tiger Privacy</a> Tiger Envelopes encrypted this message at 2005-06-25 04:33:34.573 UTC.

Принятое зашифрованное сообщение будет расшифровано автоматически, если поступило обычное, т.е. не закрытое письмо, то к нему будет добавлена подпись, предупреждающая, что так поступать не стоит. Tiger Envelopes warning: Got this message without an envelope. Anyone could have read it.

В целом вся дальнейшая работа проходит прозрачно для пользователей, не подозревающих о шифровании. Несмотря на то, что Tiger написан на Java, раздражающей «заторможенности», присущей приложениям, работающим в этой среде, замечено не было. Единственным организационным моментом, который может вызвать нестыковку, является обмен сообщениями с корреспондентами, ключи которых не внесены в базу. Здесь, очевидно, все зависит от политики компании, количества сотрудников и прочих составляющих. Можно, например, разрешить обмен открытой информацией только строго определенным лицам, на которых и возложить обязанности по согласованию этих моментов. Сервер Tiger Envelopes является довольно удобным инструментом, позволяющим очень просто наладить обмен зашифрованными сообщениями. Для пользователей его работа будет прозрачной, а использование «групповых» ключей упрощает администрирование и избавляет администратора от многих проблем, связанных с обменом ключевыми данными.

63


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

НАСКОЛЬКО НЕУЯЗВИМА ВАША БЕСПРОВОДНАЯ СЕТЬ? Масштабное внедрение беспроводных устройств протекает довольно болезненно. То тут, то там появляются сообщения об их взломе, который уже давно превратился в настоящий радиоспорт для тинейджеров. Попробуем разобраться, насколько велика угроза и что можно противопоставить коварным хакерам.

КРИС КАСПЕРСКИ

Б

еспроводные технологии прочно вошли в нашу жизнь и, похоже, не собираются никуда уходить. С их помощью организуются точки доступа в Интернет, строятся полноценные локальные сети, лишенные змеящихся кабелей, и делается множество других удивительных вещей. Се мей ство стан дар тов IEEE 802.11 описывает протоколы передачи данных, работающие на частоте 2,4 ГГц и обеспечивающие скорость вплоть до 11 Мбитс/с (протокол 802.11b) или даже 54 Мбит/с (протокол 802.11g). Все вместе они образуют WLAN (Wireless Local Area Network – Беспроводная Локальная Сеть). Фактически WLAN представляет собой обыкновенный Ethernet, только без проводов (см. рис. 1). Это значит, что беспроводные сети наследуют все уязвимости обыкновенных проводных сетей и добавляют к ним свои собственные. Описывать классические Ethernet-уязвимости, такие, например, как подложный ARP-сервер, не интересно, лучше обсудим «беспроводной» аспект (рис. 1). Для защиты от злоумышленников разработчики IEEE 802.11 протоколов предприняли целый комплекс противохакерских мер: аутентификация, шифрование тра фи ка, привязка к MAC-

64

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

Аутентификация и шифрование Согласно стандарту IEEE 802.11, существует три базовых режима безопасности, выбираемых беспроводным устройством в зависимости от уровня секретности:

! открытый режим (ни шифрование,

ни аутентификация не используются); ! защищенный режим без аутентификации, но с шифрованием трафика; ! защищенный режим с аутентификацией и шифрованием трафика. Шифрование в обоих случаях осуществляется по WEP-протоколу (Wired Equivalent Privacy – эквивалент проводной защищенности), опирающемуся на потоковый криптоалгоритм RC4. Исходные данные (data) нарезаются на фреймы (fames) с размером 1.518 бит (впрочем, размер задан не жестко и в зависимости от конфигурации оборудования он может существенно отличаться). Для каждого фрейма определяется и укладывается в пакет 32-битная контрольная сумма (ICV), вычисляемая по алгоритму CRC32. Эффективный ключ шифрования (PRNG – Pseudo-Random Number Generator – генератор псевдослучайных чисел) генерируется на основе двух ключей – 40-битного секретного ключа (secret key или WEP key), назначаемого пользователем, и 24-битного вектора инициализации (IV – Initialization Vector), генерируемого случайным образом для каждого пакета. Все вместе это называет-


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

Рисунок 1. OSI-модель, подтверждающая родственные связи между протоколами 802.3 (Ethernet) и 802.11 (WLAN)

ся 64-битным шифрованием и представит собой классический пример американского маркетинга по одурачиванию доверчивых пользователей. В самом деле, зачем потребителю знать, что для взлома ключа злоумышленнику достаточно подобрать всего лишь 40 бит из 64! Вектора инициализации назначаются самим WLAN-устройством и передаются в открытом виде. Зачем они нужны? А затем, что используемый криптоалгоритм легко вскрывается атакой по открытому тексту. Если злоумышленнику известен хотя бы один исходный байт в каждом фрейме, ключ шифрования восстанавливается без труда, поскольку различные части ключа многократно применяются к различным частям зашифрованных фреймов. Чтобы этого избежать, никакой ключ шифрования не должен использоваться дважды. Вектора инициализации автоматически изменяются с каждым пакетом, что обеспечивает «прозрачную» смену ключа, без ведома и участия пользователя (см. рис. 2). Строго говоря, для шифрования используется не один секретный ключ, а целых четыре, последовательно назначаемых пользователем при конфигурации беспроводного оборудования.

Рисунок 2. Расчет контрольной суммы и шифрование трафика по протоколу WEP

Смена ключей происходит произвольным образом (номер ключа передается вместе с зашифрованным пакетом), но на безопасность передачи данных это никак не влияет. Если хакер сможет взломать один ключ, он сломает и четыре (см. рис. 3). Упрощенно процесс шифрования потока данных выглядит так (расчет контрольной суммы здесь не показан): K=IV.WEPkey → KSA(K) → PRNG (K)XOR data stream, где функции KSA(A) и PRNG(К) выражаются следующим псевдокодом (см. листинг 1, 2 и рис. 4). Аутентификация осуществляется по старой доброй схеме запрос/отклик (challenge/response). Клиент (Client или Station), желающий подключится к точке доступа (Access Point), посылает запрос на аутентификацию (Authentication Request). Точка доступа генерирует 128-байтовый псевдослучайный «испытательный текст» (Challenge Text) и отправляет его клиенту. Получив «испытательный текст», клиент шифрует его 64-битным ключом, полученным

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

№6, июнь 2005

на основе секретного WEP-ключа и произвольного вектора инициализации. Зашифрованный испытательный текст (Encrypted Challenge Text) вместе с вектором инициализации передается на точку доступа, где происходит обратный процесс: используя имеющийЛистинг 1. Псевдокод функции KSA(A), инициализирующей массив S, используемый впоследствии для генерации псевдослучайной последовательности // инициализация for(i = 0; i < N; i++) S[i] = i; j = 0; // перемешивание байт, оно же // скремблирование (scrambling) for i = 0; i<N; i++ { j = j + S[i] + K[i % length]; swap(S[i], S[j]); } Листинг 2. Псевдокод функции PRNG(K), генерирующей псевдослучайную последовательность, используемую для шифрования потока данных операцией XOR // инициализация: static int i = 0; static int j = 0; // цикл генерации: i = i + 1; j = j + S[i]; swap(S[i], S[j]); return S[S[i] + S[j]];

Рисунок 4. Блок-схема алгоритма шифрования WEP, используемого для шифрования трафика и аутентификаци

65


безопасность ся в ее распоряжении секретный WEPключ и открытый вектор инициализации, точка доступа расшифровывает пакет и сравнивает полученный текст с оригинальным испытательным текстом. Если они совпадают, аутентификация считается успешной и клиенту отправляется подтверждение доступа (Confirm Success) (см. рис. 5). Независимо от выбранного режима секретности, точка доступа может использовать привязку к MAC-адресам и проверку SSID/ESSID ([Extended] Service Set IDentifiсation – идентификация [расширенного] комплекта услуг, условно называемая «именем сети»), отсекая всех непрошеных нарушителей еще на стадии подключения (технология Access Control List – список управления доступом). Для самоуспокоения такая мера, может быть, и сгодится, но вот злоумышленников она остановит навряд ли. И MAC, и SSID передаются по сети открытым текстом, так что их перехват не представляет никакой проблемы. Перепрограммировать MAC-адрес своей карты чуть сложнее, но хакеры с этим легко справляются (даже если карта не позволяет сделать этого программным образом – а подавляющее большинство карт это позволяет – атакующий всегда может «перешить» ПЗУ). Что же касается SSID, то он и вовсе прописывается с пользовательского интерфейса, поскольку используется исключительно как «маркер», позволяющий беспроводному устройству отличить одну сеть от другой. Борьба с хакерами в его задачу не входит. Тем не менее это еще не значит, что SSID можно не заполнять (а большинство пользователей именно так и поступает)!

Рисунок 5. Схема аутентификации клиента, используемая в протоколе WEP

66

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

осуществляется каждые 5 минут), поэтому его очень легко отличить ото всех остальных. Главное, чтобы жертва согласилась принять письмо, а не удалила его на сервере как спам. Существуют и другие эффективные атаки против WLAN, описание которых можно найти, например, в статье «What’s Wrong With WEP?» (http:// www.ilabs.interop.net/WLANSec/What_ is_wrong_with_WEP-lv03.pdf).

Ошибки разработчиков WEP-протокола

статью «Weaknesses in the Key Scheduling Algorithm of RC4» («Слабые места алгоритма распределения ключей RC4»), мгновенно сделавшую их знаменитыми. Впоследствии все атаки этого типа стали обозначаться аббревиатурой FMS – по первым буквам первооткрывателей: Fluhrer-MantinShamir. Они обнаружили существование крупных классов слабых («weak») ключей, в которых крошечная часть битов ключа оказывает значительное влияние на зашифрованные данные. Поскольку в формировании эффективного ключа участвует вектор инициализации, генерируемый произвольным образом, в общий шифропоток неизбежно попадает некоторое количество слабых ключей. Собрав достаточный объем трафика, злоумышленник отбирает па ке ты, зашифрованные слабыми ключами (такие пакеты называются «слабыми» или «интересными» – interesting). Каждый слабый пакет с 5% степенью вероятности восстанавливает один байт секретного ключа, поэтому общее количество пакетов, которые атакующему необходимо собрать для реализации атаки, в первую очередь зависит от степени его везучести. В среднем для взлома требуется порядка 6 миллионов зашифрованных пакетов. В зависимости от интенсивности трафика и пропускной способности канала, на это уходит от нескольких часов до нескольких дней, хотя в некоторых случаях атака заканчивается уже через несколько минут. И это при 104-битном ключе! Так работает AirSnort и многие другие хакерские утилиты, которые любой злоумышленник может свободно скачать из сети. Если обмен данными между легальными клиентами и точкой досту-

Стандартный 64-битный ключ шифрования легко взла мы ва ет ся лобовым перебором. Учитывая, что фактическая длина секретного ключа составляет всего лишь 40 бит, в среднем нам достаточно перебрать 240 /2 = 549 755 813 888 комбинаций. При скорости перебора в сотню миллионов ключей в секунду (вполне умеренная скорость для современных процессоров) атака займет всего час – полтора. Злоумышленнику достаточно перехватить всего один зашифрованный пакет, а затем терзать его до тех пор, пока контрольная сумма расшифрованного пакета не совпадет с ICV. «Стучаться» на точку доступа при этом совершенно необязательно! (С учетом существования четырех секретных ключей продолжительность полного цикла перебора несколько возрастает, однако не столь радикально). Для предотвращения лобовой атаки производители беспроводного оборудования увеличили длину секретной части ключа до 104 бит, попутно породив проблему обратной совместимости. Добавьте сюда 24 бита вектора инициализации и вы получите так называемое 128-битное шифрование. Подобрать 104-битный ключ вслепую уже нереально (при прежней скорости перебора в среднем на это уйдет 281 70 013 338 405 097 811 часов или 3 215 754 947 306 518 веков, что значительно превышает не только оставшееся время существования Солнца, но и возраст Вселенной), однако хакерам удалось найти более короткий путь, сократив время взлома в миллиарды раз. В августе 2001 года три криптоаналитика: Scott Fluhrer, Itsik Mantin и Adi Shamir опубликовали свою подрывную


безопасность па незначителен или практичества зашифрованных пакетов, ски отсутствует, злоумышленник так что для восстановления клюможет заставить жертву генерича атакующему потребуется соровать большое количество травсем немного времени. Данный фика, даже не зная секретного алгоритм реализован в chopper, ключа. Достаточно просто переaircrack, WepLab и других хакерхватить «правильный» пакет и, не ских утилитах, недостатка в которасшифровывая, ретранслирорых испытывать не приходится. вать его вновь. В частности, ARPВ новом оборудовании, позапрос вызовет неизбежный ARPстроенном по технологии WPA – ответ. Отличить APR-запросы от Wi-Fi Protected Access (защищенвсех остальных пакетов очень ный Wi-Fi доступ), защищенность просто: frame.pkt_len == 68 (разбеспроводных устройств вновь мер кадра) и wlan.da == FF:FF: была усилена. На место WEP приFF:FF:FF:FF (адрес назначения). шел TKIP (Temporal Key Integrity Обычно для передачи запросов Protocol – протокол краткосрочиспользуется отдельная WLANной целостности ключей), генеРисунок 6. Внешний вид утилиты dwepcrack, карта (при этом расстояние межрирующий динамические клюреализующей усиленную разновидность FMS-атаки на WEP-ключи ду антеннами приемной и передачи, сменяющие друг друга через ющей карт должно составлять по мень- рам пришлось искать новые пути для пару минут. Для совместимости с сушей мере 15 см, чтобы избежать вза- атаки. И они были найдены! ществующим оборудованием TKIP исВ августе 2004 года хакер по име- пользует тот же самый потоковый алимных наводок), хотя некоторые карты ухитряются перехватывать трафик и ни KoreK про де мон ст ри ро вал исхо- горитм шифрования, что и WEP – RC4, одновременно с этим бомбардировать дный код нового криптоанализатора, но в каждый зашифрованный пакет тевзламывающего даже «сильные» век- перь укладывается специальный восьжертву пакетами. Хакеры из лаборатории H1kari of торы инициализации. Для восстанов- мибайтный код целостности сообщеDasb0den Labs усилили FMS-алгоритм, ления 40-битного ключа ему требова- ния, рассчитанный по алгоритму Miсократив количество необходимых па- лось всего 200 тысяч пакетов с уни- chael, предотвращающий ретранслякетов с 6 миллионов до 500 тысяч, а в кальными векторами инициализации, цию подложных пакетов. Процедура некоторых случаях 40/104 битный ключ а для 104-битного – 500 тысяч. Количе- аутентификации осуществляется по взламывается всего с 3 тысячами па- ство пакетов с уникальными вектора- протоколу EAP (Extensible Authenticaкетов, что позволяет атаковать даже ми инициализации в среднем состав- tion Protocol – расширенный протокол домашние точки доступа, не напрягая ляет порядка 95% от общего количе- аутентификации), использующему лиих избыточным трафиком. Усиленный алгоритм атаки реализован в утилите dwepcrack, входящей в состав пакета BSD-airtools, а также в другом хакерском инструментарии (рис. 6). Разработчики оборудования отреагировали вполне адекватным образом, изменив алгоритм генерации векторов инициализации так, чтобы слабые ключи уже не возникали. Теперь даже dwepcrack требовалось перехватить свыше 10 миллионов пакетов, но даже в этом случае успешная расшифровка ключа не гарантирована! Устройства, выпущенные после 2002-2003 гг., скорее всего уже защищены от FMSатаки, а более древние модели решают эту проблему путем обновления прошивки (правда, не все производители выпустили такое обновление). Впрочем, даже сегодня, в середине 2005 года, в эксплуатации находится множество уязвимых устройств, особенно на периферии, куда уходят все нереализованные складские запасы. Тем Рисунок 7. Схема аутентификации, осуществляемой по WPA-протоколу с выделенным не менее, ситуация такова, что хакеRadius-сервером

№6, июнь 2005

67


безопасность бо RADIUS-сервер (Remote Authentication Dial-In User Service – служба дистанционной аутентификации пользова те лей по коммутируемым линиям), либо предустановленный общий ключ PSK (pre-shared key). В процессе аутентификации сервер генерирует парный мастер ключ (PMK – Pairwise Master Key) и передает его Клиенту. Несмотря на относительную новизну этой технологии, в комплект airckack уже входит специальный модуль WZCOOK, отображающий PMK-ключ. Для несанкционированного подключения к точке доступа, защищенной технологией WPA, этого оказалось вполне достаточно. Впрочем, атакующий модуль все еще недостаточно отлажен и потому в некоторых случаях он не срабатывает (см. рис. 7). Стандарт IEEE 802.11i описывает более продвинутую систему безопасности, основанную на криптоалгоритме AES и известную под именем WPA2. Готовых утилит для ее взлома в открытом виде пока не наблюдается, так что с этой технологией можно чувствовать себя в безопасности, по крайней мере, какое-то время она продержится. Обладателям устаревшего оборудования настоятельно рекомендуется пробить VPN-тоннели, задействовать SSL-шифрование или подключить любые другие способы защиты, изначально ориентированные на небезопасные каналы передачи данных. Существует только один способ проверить, насколько безопасно приобретаемое вами беспроводное устройство – это атаковать его! Каждый уважающий себя администратор должен отчетливо представлять, какой инструментарий находится на службе у хакеров, знать его сильные и слабые места. Бояться хакерских утилит не нужно! Ни один закон не запрещает «взламывать» свою собственность, принадлежащую вам по праву, поэтому никаких юридических проблем здесь не возникает, а под категорию «вредоносных» программ обсуждаемые утилиты не попадают. Как показывает практика, больше всех волнуется тот, кто не контролирует ситуацию, образно говоря, находясь в темноте с завязанными глазами. Когда-то боялись привидений, сейчас боятся хакеров, вирусов и червей. А все почему? Потому что не знают, как построить надежную защитную

68

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

От антенны до программы Радиус действия большинства беспроводных устройств ограничен дистанцией в 10-100 метров (точная цифра зависит от класса и конструктивных особенностей конкретного оборудования), поэтому атакующий должен находиться в непосредственной близости от жертвы. Одни хакеры вооружаются карманными компьютерами (они же «наладонники» или Pocket PC), другие предпочитают десктоп с WLAN-картой, подключенной к внешней антенне. Добротная антенна направленного типа, снабженная усилителем мощности, уверенно держит связь на расстояниях до 1,5-2 км, а в некоторых случаях и больше того, так что простой бдительности для его обнаружения уже будет недостаточно! При выборе WLAN-карты атакующий должен убедиться, что выбранные хакерские утилиты (и в первую очередь сниффер) умеют работать с данным чипсетом. Список поддерживаемого оборудования обычно публикуется на сайтах разработчиков соответствующих программ или содержится в документации. Наибольшей любовью пользуется чипсет Prism/Prism2 и беспроводные карты на его основе (например Senao 2511-CD-PLUS). Он

отлично документирован, причем документация распространяется не по подписке, а бесплатно раздается всем желающим! Из программного обеспечения нам понадобится сетевой сканнер, сниффер и взломщик паролей. Их можно найти практически на любой платформе. На Pocket PC обычно используется связка MiniStumbler/Sniffer Portable/Airscanner Mobile. MiniStumbler обнаруживает присутствие сети в данной точке, измеряет интенсивность сигнала, отображает SSID/MAC-адреса и определяет, задействовано WEP-шифрование или нет. Sniffer Portable и Airscanner Mobile захватывают все пролетающие мимо пакеты и записывают их в файл, который затем переносится на ноутбук или настольный ПК и пропускается через взломщик паролей (процессорных ресурсов карманного компьютера для взлома паролей за разумное время пока что недостаточно) (см. рис. 8). Основной сниффер под LINUX и BSD это, конечно же, Kismet, изначально ориентированный на исследовательские цели. Он поддерживает большое количество оборудования и беспроводных протоколов, удобен в использовании и к тому же абсолютно бесплатен. Перехватывает сетевой трафик, показывает SSID и MAC-адреса, подсчитывает количество пакетов со слабыми векторами инициализации и т. д. Из взломщиков паролей в последнее время реально работают только aircrack и WepLap, причем первый работает значительно лучше.

Рисунок 8. Оружие наладонников — снифферы pocketWiNc (слева) и Mobile Sniffer (справа)


безопасность Под Windows перехват беспроводного трафика реализуется гораздо сложнее и кроме сниффера нам потре бу ют ся модифицированные версии драйверов для WLAN-карты. Из коммерческих снифферов можно порекомендовать Airopeek, из некоммерческих – утилиту airdump, входящую в состав aircrack и портированную под Windows. Еще мож но ис поль зо вать Sniffer Pro или любой другой подходящий сниффер. На Mac весь хакерский инструментарий собран в одном флаконе – утилите по имени KisMAC, которая настолько проста, что ей сможет пользоваться даже ребенок. Здесь есть и сетевой сканер, и сниффер, и парольный переборщик (brute force), и криптоанализатор слабых векторов инициализации. Предусмотрена даже такая мелочь, как планировщик, позволяющий осуществлять атаки по расписанию.

В общем, на недостаток хакерского инструментария жаловаться не приходится, в глазах так и рябит от разнообразия. Загрузочный лазерный диск Auditor Security Collection уже содержит весь необходимый инструментарий и модифицированные драйвера, поддерживающие большое количество разнообразных беспроводных устройств. 518-мегабай т ный ISO-образ можно бесплатно скачать с веб-сайта компании Moser Informatik, расположенного по адресу: http://www.moser-informatik. ch, очень удобная штука для тестов на проникновение.

Заключение Так все-таки безопасны беспроводные сети или нет? Устройства, поддерживающие стандарт IEEE 802.11i (WPA2), еще никому взломать не удалось и, судя по всему, в обозримом будущем и не удастся. Все остальное оборудование

Литература: 1. Andrew A. Vladimirov, Konstantin V. Gavrilenko, Andrei A. Mikhailovsky. Wi-Foo. – Addison Wesley, ISBN : 0-321-20217-1, 592 с. – лучшая книга по взлому беспроводных сетей с большим количеством практических примеров, ориентированная на хакеров и криптоаналитиков. 2. Jon Edney, William A. Arbaugh. Real 802.11 Security: Wi-Fi Protected Access and 802.11i. – Addison Wesley, ISBN : 0-321-13620-9, 480 с. – неплохая книга по безопасности беспроводных сетей, ориентированная на теоретиков и системных администраторов. 3. Bob Fleck, Bruce Potter. 802.11 Security. – O’Reilly, ISBN: 0-596-00290-4, 208 с. – сильно теоретизированная, но в целом весьма не плохая книга по атакам на WLAN. 4. Weaknesses in the Key Scheduling Algorithm of RC4: библия всех исследователей WEP-ключей, написанная тройкой магов Scott Fluhrer, Itsik Mantin и Adi Shamir (на англ.): http://www.smallnetbuilder.com / Weblink-req=visit-lid=66.php. 5. Practical Exploitation of RC4 Weaknesses in WEP Environments by David Hulton: статья, описывающая усиленный вариант FMS-атаки на WEP с примерами исходного кода (на

№6, июнь 2005

6.

7.

8.

9.

ан г л.): http://www.dachb0den.com/ projects/bsd-airtools/wepexp.txt. Wireless Security Auditor (WSA): статья из исследовательского центра IBM, описывающая проблемы безопасности беспроводных протоколов (на англ.): http://www.research.ibm. com/gsal/wsa. Атаки на WEP: практическое пособие атакующего, сравнение различных хакерских утилит, советы по их настройке (на рус.): http://www. securitylab.ru/53508.html и http:// www.securitylab.ru/54769.html. Dispelling the Myth of Wireless Security: слегка ус та рев шая статья о способах взлома беспроводных сетей, но комментарии к ней вполне актуальны (на англ.): http://www. oreillynet.com/pub/a/wireless/excerpt/ wirlsshacks_chap1/index.html. NetStumbler-форум: форум, на котором общаются WLAN-хакеры (на англ.): http://www.netstumbler.org.

Ссылки на инструментарий: 1. NetStumbler: монитор беспроводной сети, работающий под Windows 2000/XP, версия для Windows CE называется MiniStumbler и работает на Pocket PC: http://www.netstumbler. com/downloads. 2. Airscanner Mobile: бесплатный

(WEP и WPA1) вскрывается без труда. Ни частая смена секретных ключей, ни SSID, ни привязка к MAC-адресам, ни даже так называемое 128-битное шифрование от настоящих хакеров не спасает и годится разве что на роль пугала, отпугивающего новичков и просто любопытствующих пользователей, впервые взявших сниффер в руки. Что же касается WPA1, то по этому поводу существуют различные мнения. Начнем с того, что схема аутентификации непосредственно в сам протокол WPA1 не входит и осуществляется сторонними средствами. Это может быть и EAP-MD5, и EAP-TLS и MS-CHAP… То есть сама по себе поддержка WPA1 ничего не решает! Безопасность обеспечивается лишь правильной настойкой оборудования, а это требует соответствующей квалификации обслуживающего персонала! Поэтому, если вы не уверены в себе, от использования WPA1 лучше воздержаться.

3. 4.

5. 6. 7.

8. 9.

сниф фер для Pocket PC: http:// www.snapfiles.com/get/pocketpc/ airscanner.html. PocketWarrior: бесплатный сниффер под Windows CE и Pocket PC: http://pocketwarrior.sourceforge.net. kismet: сниффер номер один под Linux, BSD и MacOS, ориентированный на хакерскую деятельностью и распространяющийся в исходных текстах, версия под Windows облада ет ог ра ни чен ны ми воз мож но стя ми и потому не ре ко мен ду ет ся: http://www.kismetwireless.net. Airopeek: достойный сниффер под Windows: http://www.wildpackets. com/products/airopeek. Sniffer Portable: http://www.snmp. co.uk/nai/amnesty.htm. aircrack: лучший взломщик WEP и WPA-паролей на сегодняшний день, распространяющийся на некоммерческой основе; в комплект поставки входит сниффер, работающий на Linux и Windows 2000/XP: http://www. cr0.net:8040/code/network/aircrack. AirSnort: устаревший взломщик WEP-паролей: http://airsnort.shmoo. com. kisMAC: утилита для атаки на беспроводные сети под MAC OS: сниффер и взломщик паролей в одном флаконе: http://binaervarianz.de/projekte/programmieren/kismac/download.php.

69


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

КАК ЗАЩИТИТЬСЯ ОТ FINGERPRINTING? Чаще всего хакерская атака начинается с fingerprinting – сбора информации о точной версии операционной системы и публичных сервисов. Приняв меры для противодействия удалённому снятию отпечатков системы, вы сможете остановить большинство атак на свою систему на самом ранем этапе.

СЕРГЕЙ БОРИСОВ 70


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

Ч

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

дого производителя. К ним можно отнести протоколы стека TCP/IP, SNMP, HTTP, Telnet, FTP. Таким образом, достаточно подобрать хороший набор тестов, в которых различные системы ведут себя по-разному.

Fingerprinting стека протоколов TCP/IP-серверов

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

Сетевой стек в разных операционных системах различается по нескольким параметрам, и для каждого из них есть технология получения отличий. Часть возможных исследований, в результатах которых есть различия, приведена в таблице 1. Этого вполне достаточно, чтобы легко распознать эти системы. Кроме этого можно проводить исследования: ! значения поля ACK в TCP-заголовке в ответах на нестандартные запросы; ! закона изменения ISN сервера; ! флага DontFragment в IP-заголовке; ! ICMP-заголовка эхо-ответа; ! время отсылки повторных пакетов в реализации TCP; ! модели протокола TCP (TCP-reno, TCP-Vegas, TCP-Tahoe, TCP-newreno, TCP-SACK), которые по-разному реагируют на ухудшение пропускной способности канала, появление частых ошибок и пропадание связи.

Сбор баннеров

Fingerprinting публичных сервисов

Это один из классических методов fingerprinting. Он заключается в опросе открытых в системе сервисов и анализа возвращаемых ими стандартных приглашений (баннеров). Помимо этого сервисы иногда предоставляют дополнительную возможность для определения версии ОС. Так, например, ftp-сервис может позволить выполнение команды SYST, которая выдает версию операционной системы. Заголовок веб-сервера можно получить командой:

Большинство публичных сервисов или служб используют достаточно сложные протоколы, которые подвержены снятию отпечатков (SMTP, IMAP, Telnet, FTP, HTTP, LPD, IKE, SNMP). От прав ка большого количества нестандартных или неправильных команд позволяет определить как версию публичного сервиса на сервере, так и операционную систему. Подробности об активном fingerprinting вы можете найти в [1, 2].

От чего защищаться?

# echo 'GET / HTTP/1.0\n' | nc securitylab.ru 80 | ↵ grep '^Server:' Server: Apache/2.0.52 (Unix)

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

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

Таблица 1. Результаты исследования стека TCP/IP Windows, Linux и FreeBSD

№6, июнь 2005

71


безопасность ся во внутренней сети организации, когда мы имеем непосредственный доступ к нормальному рабочему трафику. Это одно из первых действий при моделировании внутреннего нарушителя для обнаружения слабостей политики безопасности внутренней сети. Примеры пассивного fingerprinting можно посмотреть по ссылкам [3, 4, 5].

Исследование технических характеристик системы Это анализ таких отличительных характеристик, как время работы сервера с момента последней перезагрузки, отклонение таймера системных часов, серийные номера физических частей сервера (например, MAC-адрес сервера в том же сегменте сети). Подробнее об этом: http://www.caida. org/outreach/papers/2005/fingerprinting. Возможность исследования технических характеристик системы может быть полезна в первую очередь как косвенная улика при инцидентах безопасности. Итак, мы разобрали, почему возможен fingerprinting операционной системы и публичных сервисов, теперь рассмотрим, как с ним бороться.

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

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

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

72

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

Практическая реализация на уровне сети Грамотная топология сети – это самая эффективная контрмера удаленному исследованию систем. Первая возможная мера – фильтрация трафика с использованием межсетевого экрана. Лучше всего оставить открытым доступ только к одному порту публичного сервиса, фильтровать нестандартные сетевые запросы, ICMP-трафик. Используя межсетевой экран, можно подменять часть трафика на уровне приложений. Возможна замена приветственных баннеров и ответов при ошибке на универсальные и отражающие корпоративную политику в целом. Это будет альтернативой изменению настроек на каждом сервере. Выделение демилитаризованной зоны, четкое разделение внутренних и внешних сервисов – эти механизмы помимо своих основных задач увеличивают защищенность от fingerprinting. Размещение двух публичных сервисов на одном сервере приводит к резкому повышению вероятности определения версии системы. Если по каким-то причинам невозможно от этого отказаться, тогда можно разместить сервисы в различных виртуальных машинах (jail) или с помощью настройки NAT межсетевого экрана связать один внутренний IP-адрес c несколькими внешними IP-адресами, по одному на каждый сервис. Тогда внешнему исследователю будет казаться, что приложения запущены на разных серверах. Сегментация трафика, активный поиск слушающих устройств, рассылка ложных пакетов (с поддельными заголовками) в локальной сети уменьшают опасность пассивного fingerprinting. Приведу несколько примеров части конфигурации различных межсетевых экранов, которая поможет реализовать защиту от fingerprinting.

Пример 1. Конфигурация межсетевого экрана IPFW (для ОС семейства *BSD) # Отбрасываем пакеты с нестандартными IP-опциями /sbin/ipfw add deny log all from any to 195.195.195.1 ↵ in via xl0 ipoptions ssrr /sbin/ipfw add deny log all from any to 195.195.195.1 ↵ in via xl0 ipoptions lsrr /sbin/ipfw add deny log all from any to 195.195.195.1 ↵


безопасность in via xl0 ipoptions rr # Запрещаем пакеты с Timestampf #/sbin/ipfw add deny log all from any to 195.195.195.1 ↵ in via xl0 ipoptions ts # Запрещаем пакеты с некорректными TCP-флагами. # NULL-пакеты – второй тест nmap /sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpßags !syn,!ack,!rst # XMAS-пакеты – третий тест nmap /sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpßags syn,Þn,urg,psh,!ack /sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpßags syn,Þn,!ack, # Седьмой тест nmap /sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpßags Þn,urg,psh,!ack /sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpßags Þn,!ack /sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpßags urg,!ack /sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpßags psh,!ack

↵ ↵ ↵ ↵ ↵ ↵ ↵

# Разрешаем ICMP-пакеты, только echo и echo _ replay /sbin/ipfw add allow icmp from any to 195.195.195.1 ↵ icmptypes 8 via xl0 /sbin/ipfw add allow icmp from any to 195.195.195.1 ↵ icmptypes 0 via xl0 /sbin/ipfw add deny log icmp from any to any via xl0 # Можно различным образом блокировать закрытые порты # При запросе на закрытый порт можно просто отбрасывать # пакеты /sbin/ipfw add deny tcp from any to 195.195.195.195 ↵ 136-139 in via rl0 # Можно отправлять в ответ tcp rst или icmp host unreachable # на запросы к закрытым TCP- и UDP-портам, но такие ответы # убыстряют сканирование и демаскируют межсетевой экран /sbin/ipfw add reject udp from any to any in via rl0 /sbin/ipfw add reset tcp from 195.195.195.195 ↵ to any 136-139 in via rl0 # Разрешаем только корректные пакеты на порты публичных # сервисов /sbin/ipfw add pass tcp from any to 195.195.195.1 25 ↵ in via xl0 tcpßags syn,!ack,!psh,!Þn,!urg,!rst /sbin/ipfw add pass tcp from any to 195.195.195.1 25 ↵ in via xl0 tcpßags ack,!syn,!psh,!Þn,!urg,!rst /sbin/ipfw add pass tcp from any to 195.195.195.1 25 ↵ in via xl0 tcpßags ack,psh,!syn,!Þn,!urg,!rst /sbin/ipfw add pass tcp from any to 195.195.195.1 25 ↵ in via xl0 tcpßags ack,Þn,!syn,!psh,!urg,!rst

Пример 2. Конфигурация межсетевого экрана IP-Filter (для ОС семейства *NIX) Редактируем файл ipf.rules: # IP options block in log level local3.info quick on xl0 ↵ from any to 195.195.195.1 with opt ssrr block in log level local3.info quick on xl0 ↵ from any to 195.195.195.1 with opt lsrr block in log level local3.info quick on xl0 ↵ from any to 195.195.195.1 with opt rr # TCP ßags block in log level local3.info quick proto tcp from any to 195.195.195.1 ßags SF/SF block in log level local3.info quick proto tcp from any to 195.195.195.1 ßags SFUP/SFUP block in log level local3.info quick proto tcp from any to 195.195.195.1 ßags FPU/FPU block in log level local3.info quick proto tcp from any to 195.195.195.1 ßags F/F block in log level local3.info quick proto tcp from any to 195.195.195.1 ßags U/U block in log level local3.info quick proto tcp from any to 195.195.195.1 ßags P/P

↵ ↵ ↵

# Реакция на закрытые порты block in log level local3.info quick on xl0 proto tcp ↵ from any to 195.195.195.1 port = 136 >< 140 block in log level local3.info quick on xl0 proto udp ↵ from any to 195.195.195.1 # Разрешаем только правильные tcp-запросы к публичному # сервису pass in quick on xl0 proto tcp ↵ from any to 195.195.195.1 port = 25 ßags S/S pass in quick on xl0 proto tcp ↵ from any to 195.195.195.1 port = 25 ßags A/A pass in quick on xl0 proto tcp ↵ from any to 195.195.195.1 port = 25 ßags AP/AP pass in quick on xl0 proto tcp ↵ from any to 195.195.195.1 port = 25 ßags AF/AF

Пример 3. Конфигурация межсетевого экрана PF-FILTER (для ОС семейства *BSD) # Нормализация трафика автоматически отфильтрует # нестандартные пакеты атакующего, изменит TTL scrub in on xl0 all fragment reassemble min-ttl 20 max-mss 1440 scrub on xl0 all reassemble tcp # можно манипулировать IP-опциями, например, сбрасывать # флаг DF в 0 scrub out on xl0 all no-df # Фильтрация TCP-флагов block in quick proto tcp ßags SF/SFRA block in quick proto tcp ßags SFUP/SFRAU block in quick proto tcp ßags FPU/SFRAUP block in quick proto tcp ßags F/SFRA block in quick proto tcp ßags U/SFRAU block in quick proto tcp ßags P/P

from any to 195.195.195.1 ↵ from any to 195.195.195.1 ↵ from any to 195.195.195.1 ↵ from any to 195.195.195.1 ↵ from any to 195.195.195.1 ↵ from any to 195.195.195.1 ↵

# Разрешаем ICMP только echo request и echo reply pass in quick on xl0 proto icmp ↵ from any to 195.195.195.1 icmp-type echoreq pass in quick on xl0 proto icmp ↵ from any to 195.195.195.1 icmp-type echorep pass out quick on xl0 proto icmp ↵ from 195.195.195.1 to any icmp-type echoreq pass out quick on xl0 proto icmp ↵ from 195.195.195.1 to any icmp-type echorep block in log-all quick on xl0 proto icmp from any to any block out log-all quick on xl0 proto icmp from any to any # Блокируем закрытые порты block in log-all quick on xl0 proto tcp ↵ from any to 195.195.195.1 port 136 >< 140 block in log quick on xl0 proto udp from any to 195.195.195.1 # Фильтруем входящие пакеты на публичный сервис pass in quick on xl0 proto tcp from any to 195.195.195.1 ↵ port = 25 ßags S/SA synproxy state

↵ ↵ ↵

# Разрешенные icmp types pass in quick on xl0 proto icmp ↵ from any to 195.195.195.1 icmp-type echo pass in quick on xl0 proto icmp ↵ from any to 195.195.195.1 icmp-type echorep

№6, июнь 2005

pass out quick on xl0 proto icmp ↵ from 195.195.195.1 to any icmp-type echorep pass out quick on xl0 proto icmp ↵ from 195.195.195.1 to any icmp-type echo block in log level local3.info quick on xl0 proto icmp ↵ from any to any block out log level local3.info quick on xl0 proto icmp ↵ from any to any

Пример 4. Конфигурация межсетевого экрана PIX Firewall В межсетевом экране PIX Firewall реализован механизм ASA, который отбрасывает не SYN-пакеты, которые не являются частью установленного соединения (2, 4, 6, 7 тесты NMAP), так что большая часть работы по защите от fingerprinting выполняется по умолчанию.

73


безопасность # Разрешаем исходящие ping access-group 101 in interface outside access-list 101 permit icmp any host 209.165.200.246 ↵ echo-reply # Разрешаем входящие ping access-list 101 permit icmp any host 209.165.200.246 echo # Включаем анализатор протоколов приложений. Какие точно # правила фильтрации использует PIX, не ясно. Но тот факт, # что реально клиент устанавливает соединение не с сервером # приложений, а с PIX затрудняет Þngerprinting fuxup protocol ftp 21 Þxup protocol smtp 25 # Для фильтрации нестандартных или неправильных # TCP/IP-пакетов PIX использует встроенную IDS # с фиксированным набором сигнатур ip audit name Þngeraudit atack action alarm drop ip audit name Þngeraudit info action alarm drop # Выберем только те сигнатуры, которые имеют отношение # к Þngerprinting # Нужные нам сигнатуры: # ID Название Тип 400000 1000 IP options-Bad option list Informational 400002 1002 IP options-Timestamp Informational 400007 1100 IP Fragment Attack Attack 400008 1101 IP Unknown IP Protocol Attack 1102 Impossible IP Packet Attack 400009 1103 IP Fragments Overlap Attack 400023 2150 Fragmented ICMP TrafÞc Attack 400026 3040 TCP NULL ßags Attack 400027 3041 TCP SYN+FIN ßags Attack 400028 3042 TCP FIN only ßags Attack # Остальные сигнатуры можно исключить из политики no ip audit name Þngeraudit signature sigN ip audit interface outside Þngeraudit

Остальные межсетевые экраны можно сконфигурировать соответствующим образом.

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

Изменение параметров стека TCP/IP операционных систем Так, в Windows мы можем менять следующие параметры стека TCP/IP в разделах реестра HKEY_LOCAL_MACHINE\ SYSTEM\Current ControlSet\Services\Tcpip\Parameters и HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\ID of Adapter: ! KeepAliveInterval – время ожидания перед повторной отправкой пакета, если на предыдущий ответ не получен. ! MTU – максимальный размер пакета, который передается через сеть. ! TcpMaxConnectRetransmissions – количество повторных отсылок SYN-пакета, на который не получен ответ при установке соединения. ! TcpMaxDataRetransmissions – количество повторных отсылок остальных пакетов, на которые не получен ответ. ! TcpWindowSize – максимальный размер окна TCP-соединения, в байтах. ! DefaultTTL – определяет значение TTL по умолчанию в заголовках IP-пакета. ! Tcp1323Opts=1 – изменять значения TCP window и timestamps в соответствии с RFC 1323.

74

Операционные системы семейства UNIX позволяют изменять стек TCP/IP гораздо более гибко. В системе FreeBSD добавим следующие опции в конфигурацию ядра: # Параметр ID в заголовке IP-пакета генерируется случайно Options random _ ip _ id # Отбрасываются пакеты с флагами syn+Þn Options tcp _ drop _ synÞn Options icmp _ bandlim # Включаем контроль над ICMP

После этого необходимо пересобрать ядро и перезагрузить систему. Теперь можно производить настройки на ходу: # Определяем реакцию системы при получении пакета # на закрытый TCP-порт sysctl net.inet.tcp.blackhole=2 # Определяем реакцию системы при получении пакета # на закрытый UDP-порт sysctl net.inet.udp.blackhole=1 # Определяем размер окна TCP-соединения sysctl net.inet.tcp.sendspace=64395 sysctl net.inet.tcp.recvspace=64395 # Определяем TTL в заголовке IP-пакета sysctl net.inet.ip.ttl=128 sysctl net.inet.tcp.drop _ synÞn=1 # Указываем ОС изменять параметры window и timestamps # в соответствии с RFC 1323. sysctl net.inet.tcp.rfc1323=1

Или мы можем закрепить эти параметры в файле /etc/ sysctl.conf. В операционной системе Linux в конфигурацию ядра добавим опции CONFIG_PROC_FS и CONFIG_SYSCTL, которые позволяют менять элементы /proc без перезагрузки системы или перекомпиляции ядра. # Запрет ICMP echo (ping): echo "1" > /proc/sys/net/ipv4/icmp _ echo _ ignore _ broadcasts echo "1" > /proc/sys/net/ipv4/icmp _ echo _ ignore _ all # Изменяем IP TTL по умолчанию echo "128" > /proc/sys/net/ipv4/ip _ default _ ttl Скорость генерации ICMP пакетов (по умолчанию 100) echo "70" > /proc/sys/net/ipv4/icmp _ ratelimit # Количество повторных отсылок пакетов, на которые # не получен ответ echo "5" > /proc/sys/net/ipv4/tcp _ synack _ retries echo "5" > /proc/sys/net/ipv4/tcp _ syn _ retries 5 # Устанавливаем стандартный размер TCP window echo "64395" > /proc/sys/net/core/rmem _ default echo "64395" > /proc/sys/net/core/wmem _ default # Изменять параметры TCP window и timespamp # в соответствии с 1323. echo "1" > /proc/sys/net/ipv4/tcp _ window _ scaling echo "1" > /proc/sys/net/ipv4/tcp _ timestamps # Разрешить использование SACK в соответствии # с RFC2018 (SACK будет добавляться в tcp options) Echo "1" > /proc/sys/net/ipv4/tcp _ sack

Продукты, которые реализуют защиту системы от fingerprinting на уровне операционной системы: ! FingerPrintFucker ! IP Personality ! Morth В операционной системе Solaris изменять параметры TCP/IP можно утилитой /usr/sbin/ndd. Изменения вступают в силу только после перезагрузки системы. # Изменяем стандартное значение maximux segmet size. ndd -set /dev/tcp tcp _ mss _ def 546 # Отключим «path MTU discovery» и система перестанет # ставить бит «don’t fragment» ndd -set /dev/ip ip _ path _ mtu _ discovery 0 # Устанавливаем закон генерации ISN действительно


безопасность # случайным образом. ndd –set /dev/tcp tcp _ strong _ iss 2 # Изменяем стандартное значение tcp window size ndd -set /dev/tcp tcp _ xmit _ hiwat 64395 ndd -set /dev/tcp tcp _ recv _ hiwat 64395 # Изменяем стандартное время жизни пакета (TTL) ndd –set /dev/tcp tcp _ ip _ ttl 128

Защита от fingerprinting публичных сервисов на верхнем уровне Для маскировки приложений можно произвести изменение конфигурации, изменение исходников или установить специальное ПО, которое будет фильтровать сетевой трафик на уровне приложения. Защита от HTTP fingerprinting: ! Замена стандартных баннеров. ! Фильтрация или преобразование заголовков HTTP. ! Настройка кодов ошибок, таких как 404 или 500. ! Использование дополнительного ПО. Для веб-сервера IIS есть продукт ServerMask, который позволяет настроить три вышеописанных способа защиты. Он имеет профили для маскировки под различные сервера. Для веб-сервера APACHE перед компиляцией в src/include/httpd.h находим строки: # deÞne SERVER _ BASEPRODUCT "Apache" # deÞne SERVER _ BASEREVISION "X.X.X"

Вместо него напишем (выдаем за ОС Windows + IIS) # deÞne SERVER _ BASEPRODUCT "Microsoft-IIS" # deÞne SERVER _ BASEREVISION "5.0"

Дополнительно проверим, что в http.conf есть: # IIS не ставит подпись в рапортах об ошибках ServerSignature Off # Для того чтобы выдавать только ту информацию, # которую мы изменили ServerTokens Min

Защита от SMTP fingerprinting: ! Фильтрация заголовков исходящей почты защитит пользовательские почтовые программы и серверные почтовые приложения, расположенные во внутренней сети организации от ID fingerprinting. На внешнем почтовом сервере Sendmail, можно использовать опции: MASQUERADE _ AS(mail.somedomain.com) MASQUERADE _ DOMAIN(mailofÞce.somedomain.com)

чтобы заголовки почтовых сообщений из вашей локальной сети перезаписывались заново так, как будто они посылаются непосредственно с почтового сервера mail.somedomain.com. Для почтового сервера QMAIL есть фильтр qmail-masq, который позволяет изменять заголовки исходящих писем, подменяя внутренние адреса внешним. Для организаций, которые предоставляют почтовые услуги сторонним организациям или пользователям, необходимы более сложные фильтры, изменяющие лишь ту часть заголовка почтового письма, где есть информация о внутренних почтовых ретрансляторах (relay).

№6, июнь 2005

! Замена стандартных баннеров, кодов и ответов ошибок

возможна путем изменения соответствующих конфигурационных файлов. Это позволяет защитить от fingerprinting внешний почтовый сервер.

Например, в Windows 2000 smtp запустить metaedit.exe, выбрать lm\smtpsvc\<номер виртуального сервера>: «Edit → new» в ID ввести 36907, в Data ввести баннер. В Postfix редактируем /etc/postfix/main.cf: smtpd _ banner = secure SMTP server

В Sendmail редактируем sendmail.cf: # SMTP initial login message (old $e macro) O SmtpGreetingMessage=$j secure SMTP server; $b

В EXIM редактируем /etc/exim.conf: smtpd _ banner = secure SMTP server

В QMAIL необходимо отредактировать файл smtpgreeting, в котором хранится приветственное сообщение. Аналогично настраиваются коды и ответы ошибок в конфигурационных файлах или в исходниках до компиляции.

Защита от исследования таймеров Возможными контрмерами могут служить, например, методы маскирующего перекоса временной диаграммы с улучшенной генерацией случайных чисел. Можно отключить timestamps там, где они не нужны (например, на модемном соединении). # sysctl net.ipv4.tcp _ timestamps=0 net.ipv4.tcp _ timestamps = 0

Заключение Фильтрация и модификация заголовков и другие методы защиты от fingerprinting, являются элементом «security through obscurity» (безопасности за счет незнания) и не могут использоваться в качестве основного средства защиты.

Литература и ссылки: 1. http://cherepovets-city.ru/insecure/runmap/runmap-osdetect.htm. 2. http://cherepovets-city.ru/insecure/runmap/runmap-versionscan.htm. 3. http://www.securitylab.ru/49847.html. 4. http://www.honeynet.org/papers/finger. 5. http://lcamtuf.coredump.cx/p0f.shtml. 6. Маскировка локальных адресов в QMail – http:// www.folug.org/sviluppo/qmail-masq/qmail-masq.html. 7. Параметры конфигурации TCP/IP и NBT для Windows XP – http://support.microsoft.com/kb/314053/ru. 8. Сравнение трех пакетных фильтров FreeBSD 5.3 (IPFW, PF, IPFILTER) – http://www.opennet.ru/docs/RUS/ipfw_pf_ ipfilter/index.html. 9. CP tuning cookbook. 10. Кейт Е. Страссберг. Полный справочник по брандмауэрам.: Пер. с англ. – М.: Издательский дом «Вильямс», 2004 г.

75


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

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

Программа: Hosting Controller 6.1 HotFix 2.0 и более ранние версии. Опасность: Средняя. Описание: Уязвимость существует в сценарии UserProfile.asp из-за недостаточной обработки правил доступа. Удаленный авторизованный пользователь может изменить e-mail целевого пользователя и затем воспользоваться формой восстановления пароля, чтобы получить доступ к учетной записи жертвы. Таким образом, злоумышленник может получить доступ к произвольной учетной записи приложения, в том числе и к учетной записи администратора. Пример:

Программа: GNU Mailutils 0.6. Опасность: Высокая. Описание: Уязвимости позволяют удаленному пользователю вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. 1. Уязвимость форматной строки обнаружена в imap4dсервере. Удаленный пользователь может с помощью специально сформированной команды вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. Пример:

<form action=»http://[URL]/admin// ↵ accounts/UserProÞle.asp?action=updateproÞle» method=»post»> Username : <input name=»UserList» value=»hcadmin» type=»text» size=»50»> < br> emailaddress : <input name=»emailaddress» value=»Crkchat@msn.com» type=»text» size=»50»> < br> Þrstname : <input name=»Þrstname» value=»Crkchat» type=»text» size=»50»> < br> < input name=»submit» value=»submit» type=»submit»> < /form>

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

SQL-инъекция и межсайтовый скриптинг в PostNuke Программа: PostNuke 0.750 и более ранние версии. Опасность: Средняя. Описание: Уязвимость позволяет удаленному пользователю произвести XSS-нападение и выполнить произвольные SQL-команды в базе данных приложения. 1. Уязвимость существует в сценарии /modules/Messages/readpmsg.php из-за недостаточной обработки входных данных в параметре start. Удаленный пользователь может с помощью специально сформированного URL выполнить произвольные SQL-команды в базе данных приложения. Пример: http://[target]/[postnuke _ dir]/modules.php?op= modload&name=Messages&Þle=readpmsg& start=0%20UNION%20SELECT%20pn _ uname, null,pn _ uname,pn _ pass,pn _ p

2. Удаленный пользователь может с помощью специально сформированного URL выполнить произвольный HTMLсценарий в браузере жертвы в контексте безопасности уязвимого сайта. Пример: http://[target]/[postnuke _ dir]/modules.php?op= modload&name=Messages&Þle=rea dpmsg& start=0’<h1>cXIb8O3 and sp3x - SecurityReason </h1>&total _ messages=1

URL производителя: www.postnuke.com. Решение: Установите последнюю версию (0.750b) с сайта производителя.

76

%n%n%n%n%n die

2. Переполнение буфера обнаружено в утилите mail в функции header_get_field_name() файла mailbox/header.c. Удаленный пользователь может с помощью специально сформированного сообщения выполнить произвольные команды на системе с привилегиями пользователя, запустившего утилиту. 3. Переполнение кучи обнаружено в imap4d-сервере при обработке почтовых сообщений. Удаленный авторизованный пользователь может выполнить произвольные команды на системе или вызвать отказ в обслуживании. 4. Обнаружен отказ в обслуживании в imap4d-сервере при обработке аргументов команды FETCH. Удаленный авторизованный пользователь может с помощью специально сформированной команды заставить приложения потреблять все доступные ресурсы на системе. URL производителя: www.gnu.org/software/mailutils/mailutils.html. Решение: Установите последнюю версию (0.6.90) от производителя.

Повышение привилегий в Qpopper Программа: Qpopper версии до 4.0.6. Опасность: Низкая. Описание: Уязвимость существует при обработке конфигурационных файлов. Локальный пользователь может перезаписать произвольные файлы с root-привилегиями на системе и создать новые файлы с правами на чтение и запись для всех пользователей. Решение: Установите последнюю версию от производителя.

Отказ в обслуживании в продуктах Cisco в опции TCP/IP Timestamp Программа: VxWorks SN5400 series routers; Cisco CSS11000 switch series; Cisco AP350 и AP1200 series; MGX8200, MGX8800 и MGX8900 series switches. Опасность: Низкая. Описание: Удаленный пользователь может послать пакет со специально сформированной TCP timestamp опцией и заморозить текущую TCP-сессию. URL производителя: www.cisco.com. Решение: Установите исправление от производителя.

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


web

ИСПОЛЬЗУЕМ IImage mageM Magick В ВЕБ-РАЗРАБОТКЕ

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

КИРИЛЛ СУХОВ ля подобных действий также широко применяется библиотека GD, имеющая в арсенале своей второй версии , довольно внушительный список функций. Работать с GD можно посредством PHP, Perl, Tcl и некоторых других языков. Она имеет широкие возможности, но качество результирующих изображений часто оставляет желать лучшего. Кроме того, такие действия, как изменение пропорций, «обрезка» изображения, манипуляции с цветами, вставка другого рисунка, хоть и возможны, но крайне неудобны. Здесь на помощь приходит пакет ImageMagick (http://imagemagick.org), представляющий прекрасное средство для обработки изображений. Работа с ним возможна посредством интерфейсов для различных языков программирования (Perl, Python, PHP, C). Сегодня мы рассмотрим способы и приёмы работы с графикой PHP с использованием пакета ImageMagick.

Что представляет собой ImageMagick? Коротко поясню, чем является этот пакет и какие задачи можно решить

№6, июнь 2005

с его помощью. Вообще говоря, я использую не совсем детерминированный термин «пакет», хотя данный продукт называют обычно библиотекой и даже утилитой. На самом деле это согласованный (что немаловажно) набор утилит для работы с графикой, причём в полном соответствии с идеологией каждая из них выполняет свою задачу. Конечно, возможности ImageMagick не могут сравниться с потенциалом графического процессора, но для наших задач это и не нужно. Если вы пользователь *nix-операционной системы, то ImageMagick у вас, скорее всего, уже установлен или по крайней мере присутствует в дистрибутиве. В противном случае забираем его по адресу http://www.imagemagick.org/script/ download.php (присутствуют также версии для Windows и MacOS).

Способы применения Для PHP-разработчика есть два основных пути работы с изображениями с помощью ImageMagic: выполнять команды пакета, пользуясь функцией exec() (или system()), или использовать класс imagick из репозитария PEAR. Большинство программистов применяют

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

Возможности пакета Наверное, самая часто используемая утилита ImageMagic – это convert. Её возможности мы продемонстрируем на достаточно типовой задаче конвертации графических файлов из одного

77


web net/script/command-line-tools.php) или в документации, идущей вместе с дистрибутивом.

формата в другой. Вот как просто проходит эта операция: // исходный файл $primary="test.jpg"; // имя нового файла $secundary ="test2.gif"; exec("convert ". $primary." " ↵ test2.gif);

Вот и всё! Под именем test2.gif мы получили копию исходного изображения в новом формате. Разумеется, продемонстрированная функциональность довольно скромна, но в справке по convert можно найти более 150 (!) опций этой утилиты, ознакомившись с которыми, начинаешь понимать, почему в названии пакета присутствует слово magick. Скажем, уменьшить вес картинки можно, просто включив одну из опций: exect("convert ". $primary." ↵ -resize 30% ". test.gif);

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

Рисунок 1. Исходное фото

Картинка (в формате jpg) занимает 124 Kb. После вышеприведённого преобразования получаем рисунок в формате gif (рис. 2), «весящий» уже 37 Kb.

Рисунок 2. Уменьшаем «вес» фотографии

Конечно, потеря качества есть, но любой человек, работавший до этого с GD, признает результат замечательным. Воспользуемся какой-нибудь ещё возможностью convert, например, изменим цвета оригинала: exect("convert ". $primary." ↵ -coloreze 0, 0, 50 ". test2.gif);

результат на рис. 3.

78

Использование модуля Imagick

Рисунок 3. Экспериментируем с цветом

Опции утилиты реализуют огромное количество различных трансформаций изображения – изменение размеров и координат, применение разнообразных фильтров, размытие, наложение тени и многое другое. На полное их описание не хватило бы всего журнала, поэтому лучше кратко опишем возможности остальных утилит. Утилита mogrify во многом повторяет функциональность convert, но результаты преобразования она сохраняет в исходном файле. Кроме того, данная утилита позволяет работать с группой файлов по маске. ! Montage – позволяет комбинировать изображения, создавать композиции. ! Animate – как видно из названия, используется для анимации, позволяет работать с анимированными gif-файлами. ! Combine – комбинирует изображения (очень удобна для нанесения логотипов на картинки). ! Import – «снимает» изображение заданной области экрана. ! Composite – также позволяет создавать композиции нескольких изображений и изменять форму изображения. ! Identify – возвращает информацию о параметрах изображения. Утилита conjure стоит несколько особняком, она представляет собой командный процессор для встроенного скриптового языка Magick Scripting Language (MSL). Основная при ручной работе утилита display является «обвёрткой» для остальных функций преобразования графики, нам в данном случае бесполезна. Более подробную информацию по использованию утилит пакета можно увидеть на официальном веб-сайте ImageMagic (http://www.imagemagick.

Недостатки вызова утилит ImageMagick как внешних программ становятся очевидны, когда операции по манипуляциям с изображениями являются обычной функциональностью приложения. Банальный пример – публичная веб-галерея со средними возможностями. Как уже говорилось выше, класс для работы с пакетом присутствует (вернее, присутствовал) в репозитарии PEAR. Относительно недавно на его основе был создан PECLмодуль imagick, доступный в настоящее время по адресу: http://pecl.php. net/package/imagick (присутствует и версия под Windows, в виде скомпилированной dll, скачать её можно здесь: http://snaps.php.net/win32/PECL_4_3). PECL – это репозитарий модулей PHP, не входящих в официальный дистрибутив. Большинство из них находятся в разработке, а самые успешные становятся штатными расширениями (из недавних это модуль SOAP). Расширение устанавливается как обычный php-модуль, в папку ext/imagick (или, в зависимости от версии PHP, в extensions/imagick), затем в конфигурационном файле php.ini, в секции Dynamic Extensions, прописываются соответствующие строчки: ;для UNIX систем extension= imagick.so ;для Windows extension=msql.dll

После перезагрузки веб-сервера, функции imagick становятся доступны. Предупреждение для программистов, решивших опробовать возможности пакета на операционной системе Windows, – скомпилированная dll будет работать только самой последней версией интерпретатора PHP. Разумеется, модуль imagick не предоставит доступ ко всем возможностям ImageMagick (по уверению его создателя, пока), но наиболее распространенные действия с графикой в веб-программировании в нём уже реализованы. К сожалению, на момент написания статьи официальная документа-


web ция на модуль практически отсутствовала, поэтому я постараюсь осветить работу всех доступных в данное время функций. Следует также заметить, что расширение в разработке и все его функции имеют статус экспериментальных, в частности это обозначает, что использовать их нужно осторожно (use this function at your own risk). Правда, в моей практике никаких опасных сбоев замечено не было. Работа с расширением происходит так: <?php $handle = imagick _ create () or ↵ die ("Could not create handle") imagick _ read($handle,"myimg.gif"); imagick _ set _ attribue($handle, ↵ array("quality"=>10, ↵ "format"=>"jpeg"); imagick _ write($handle,"myimg.jpg"); imagick _ free($handle); ?>

В первой строчке функцией imagick_ create() мы получаем указатель на новый экземпляр imagick, который потом используем во всех дальнейших действиях. Затем с помощью imagick_ read() считываем существующее изображение. Формат файла при этом определяется автоматически, если же этого не происходит, разработчики рекомендуют использовать префикс из названия формата, отделённый от имени файла двоеточием (например, GIF:mygif.gif). Данная функция позволяет задавать в качестве второго параметра и URL (например, http://my.server. com/picture.gif). Другой пример использования imagick_read(): <?php $handle = image _ new() or die ↵ ("Could not connect"); imagick _ read($handle, ↵ array("mypic.gif", ↵ "http://my.server.com/mypic.png")); imagick _ write($handle, ↵ "PNG:mypic.myext"); imagick _ free($handle); ?>

В данном случае применяется image_ new(), синоним и вероятная замена imagick_create (). Функция imagick_set_attribue() изменяет атрибуты рисунка, получая в качестве второго параметра их массив. В настоящее время доступны следующие атрибуты: ! adjoin ! magick ! delay ! quality ! format ! size

№6, июнь 2005

Пояснять их значение, я думаю, нет необходимости. Получить атрибуты существующего изображения можно функцией imagick_set_attribute(), принимающей в качестве параметров указатель и имя атрибута. Сейчас доступны следующие значения: ! format ! height ! magick ! width ! quality Конечно, список не впечатляет, но всё, что здесь написано, касается версии модуля 0.1, а он активно разрабатывается. Imagick_write() осуществляет запись результата в указанный файл локальной файловой системы, при этом формат файла определяется по заданному расширению. В случае нераспознавания формата рекомендации такие же, как и для функции imagick_ read(). Наконец imagick_free(), как нетрудно догадаться из названия, освобождает указатель и все связанные с ним ресурсы. Что осталось за рамками нашего небольшого примера? Прежде всего группа функций для преобразования изображений: ! imagick_copy_shear() – усекает изображение до заданных размеров; ! imagick_copy_ crop() – также усекает, но с возможностью задания начальных координат; ! imagick_copy_rotate() – поворачивает изображение вокруг своей оси на заданный угол; ! imagick_copy_sample() – масштабирует изображение. Все эти функции возвращают указатель на новый ресурс, оставляя исходный (являющийся входным параметром) неизменным. Функция imagick_copy_resize(), также возвращающая указатель на новый ресурс, позволяет задать размеры изображения, применить к нему фильтр, а также контрастность/размытие (в зависимости от знака входного параметра). На данный момент доступны следующие фильтры:

Imagick_convert() преобразует один файл в другой или (когда конечный файл не указан) выводит его в браузер. Её упрощённый вариант imagick_ dump(), выводит картинку на экран. Imagick_annotate() добавляет к изображению текст, принимая в качестве второго параметра массив его атрибутов. Пример работы этой функции: imagick _ annotate($handle,array( "primitive"=>"text 150,150 ↵ hello world", "pointsize"=>60, "antialias"=>1, "stroke"=>’green’, "Þll»=>’#ff7755’, "font»=>"Arial.ttf", "rotate"=>90 ));

Imagick_list-magickinfo() выводит список доступных файловых форматов (в настоящие время таковых более 130, правда, некоторые из них доступны только для чтения). В заключение хочу заметить, что лидер проекта Imagick, Christian Stocker, в предварительной документации к модулю сетует на нехватку у него свободного времени на доработку и приглашает желающих в ней поучаствовать. Как он утверждает: «It’s really not very hard». Приветствуются также пожелания о том, какие функции следует реализовать в первую очередь. Так что, коллеги, всё в наших руках.

Ссылки: 1. Адрес проекта – http://pecl.php.net/ package/imagick. 2. Examples of ImageMagick Usage – http://www.cit.gu.edu.au/~anthony/ graphics/imagick6. 3. Graphics from the command line – http://www-106.ibm.com/developerworks/library/l-graf/?ca=dnt-428.

79


hardware

МОДИФИЦИРУЕМ BIOS

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

КРИС КАСПЕРСКИ

Е

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

№6, июнь 2005

правило, уже устаревшую), и раздобыть прошивку для своего оборудования весьма затруднительно, к тому же нет никаких гарантий, что под видом «улучшенного» BIOS вам не подсунут заживо похороненную или, что еще хуже, умышленно троянизированную версию. А моддинг? Разве не заманчиво заставить компьютер перемигиваться клавиатурными огоньками во время загрузки или выводить красочный логотип на экран?! Одним словом, модифицировать BIOS не только можно, но и нужно. Главным образом мы будем говорить об Award BIOS. В AMI все сильно по-другому… Однако когданибудь мы доберемся и до них. Кстати говоря, фирма Award была выкуплена Phoenix и в настоящее время существует только как бренд. А это значит, что последние версии PhoenixBIOS устроены точно так же, как и Award, поскольку их разрабатывает одна и та же фирма, правда, на старые прошивки это утверждение не распространяется. Впрочем, существуют готовые редакторы и для них, но не будет зао-

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

Что нам понадобится Для экспериментов нам потребуется материнская плата с Award-BIOS на борту. Опознать микросхему BIOS очень легко – на ней обычно наклеена голографическая этикетка, которую необходимо оторвать, чтобы обнажить маркировку. Маркировка представляет последовательность цифр наподобие «28F1000PPC-12C4». Как ее расшифровать? Идем на http://www.datasheetarchive.com, заполняем строку запроса и получаем pdf-файл с подробным описанием чипа (так называемый datasheet). Теперь необходимо найти идентичный или совместимый чип FLASH-памяти, над которым мы, собственно, и будем экспериментировать. Его можно приобрести в специализированном радиомагазине или вытащить с поломанной материнской платы. Большого дефицита эти чипы не представляют, поскольку в материнских платах используются серийные микросхе-

81


hardware

Рисунок 1. Микросхема Award BIOS с традиционной голографической наклейкой, по которой её легко определить

мы, выпускаемые независимыми поставщиками. Для «горячей» замены BIOS (т.е. выдергивания микросхемы с работающей платы) русские умельцы аккуратно обвязывают микросхему нитками, а затем осторожно тянут вверх (можно, конечно, просто подковырнуть отверткой, но при этом легко что-то закоротить), а вот иностранцы после эпидемии «чиха» придумали специальные приспособления – chip extractor (съемщик чипов) и BIOS savior (BIOS-спаситель). По сути дела, это одно и то же приспособление, только торговые марки разные. Приобрести их можно в радиомагазинах или заказать по Интернету (см. рис. 1-6). Еще нам потребуется документация на чипсет материнской платы. Компании Intel и AMD бесплатно выкладывают все, что нужно на сайт. Другие производители (VIA, SiS) держат документацию под спудом и отдают только за деньги плюс подписку о неразглашении. В частности, на дисках, рассылаемых компанией AMD, встречается много интересной документации со штампом «confidential», пролистывая которую, ощущаешь волнующее чувство причастности к тайне. Комплект утилит для прошивки BIOS можно найти на сайте разработчика конкретного BIOS или производителя материнской платы. Некоторые производители (например, ASUS) вносят в BIOS большое количество изменений, в результате чего «родные» утилиты от Award перестают с ними работать и приходится использовать инструментарий, поставляемый вместе с материнской платой. Обычно там содержится: ! awdflsh.exe – «прожигатель»; ! modbin – простой редактор BIOS;

82

Рисунок 2. Набор BIOS Savior kit для безопасного извлечения микросхемы BIOS с материнской платы и «кроватка» для резервного BIOS с переключателем, устанавливаемым на заднюю панель

Рисунок 3. Положение рук при съемке микросхемы

! cbrom – просматривает содержимое BIOS и добавляет новые модули в прошивку.

Все эти утилиты можно найти на сайте www.rom.by. Там же находится замечательный «патчер» BIOS – BP.exe (сокращение от «BIOS Patсher»), исправляющий ошибки в известных ему прошивках и разблокирующий многие заблокированные возможности. Нашим основным инструментом будет интерактивный редактор BIOS Award BIOS Editor, который можно бесплатно скачать c http://awdbedit.sourceforge.net.

Рисунок 4. Установка «кроватки» с двойным BIOS — снизу оригинальная микросхема, сверху — экспериментальная

Как мы будем действовать Модификация BIOS – очень рискованное занятие. Малейшая ошибка – и система отказывается загружаться, выдавая унылый черный экран. Большинство современных материнских плат снабжено защитой от неудачных прошивок, однако обычно она срабатывает лишь тогда, когда BIOS действительно поврежден (например, не соответствует контрольная сумма). Вот для этих целей нам и требуется второй BIOS! Запускаем материнскую плату, считываем содержимое прошивки соответствующей утилитой (или скачиваем обновленную версию с сайта производителя), модифицируем ее по своему вкусу, затем, не выключая компьютера, аккуратно вынимаем оригинальный чип, откладывая его в сторону, и вставляем чип, над которым мы будем экспериментировать. Остается запустить AWDFLASH.EXE и зашить модифицированную прошивку в BIOS. Теперь, случись вдруг что, мы всегда сможем вернуть оригинальный чип на место, исправить ошибку в экспериментальной прошив-

Рисунок 5. Двойной BIOS в собранном состоянии

Рисунок 6. Переключатель, отвечающий за выбор между оригинальным (ORG) и экспериментальным (RD1) BIOS

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


hardware

Рисунок 7. Award BIOS editor, готовый к модификации текстовых строк, отображающихся при загрузке системы

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

Первые эксперименты Запускаем Award BIOS editor (кстати говоря, он запускается только из-под GUI, а под FAR просто «слетает»), в меню File выбираем файл с прошивкой, которую мы будем модифицировать (предварительно ее необходимо скачать с сайта производителя или запустить AWDFLASH.EXE с ключом /sy, чтобы сохранить текущую прошивку в файл). В левой колонке выбираем пункт «System BIOS» и смотрим, что хорошего тут можно изменить. А изменить тут можно очень многое! Например, имя BIOS, высвечивающееся при загрузке (в моем случае это: Award Modular BIOS v6.00PGN), дату выхода и название чипсета (03/29/ 2001-i815-W83627F-6A69RI3DC-00) и другие идентификационные строки подобного типа. А давайте напишем «assembled at military-industrial USA factory», чтобы потом подшучивать над приятелями (см. рис. 7). Точно так же можно заменить все надписи в «BIOS Setup» (они находятся во вкладке «BIOS Options») и отредактировать значения по умолчанию (те самые, что загружаются по

№6, июнь 2005

Рисунок 8. Разблокирование заблокированных возможностей в «BIOS Setup» в Award BIOS editor

команде «load default BIOS configuration») под свой вкус. Наибольший интерес представляют пункты, помеченные как «Disabled». Это и есть опции, заблокированные производителем! Простым переводом радиокнопки в состояние «Active» мы разблокируем их! Разумеется, никакой гарантии, что система после этого заработает, у нас нет. Чаще всего блокируются недоделанные или нестабильно работающие режимы и возможности. Реже – производитель просто не хочет, чтобы материнские платы начального уровня конкурировали с дорогими моделями, вот и тормозит их. Нестабильно работающая материнская плата способна разрушить содержимое жесткого диска еще в процессе загрузки Windows, поэтому экспериментировать

на своем рабочем винчестере недопустимо! Используйте запасной жесткий диск, на котором нет ничего ценного. Запустите несколько тестирующих программ и дайте им поработать несколько суток. Если за это время не произойдет ни перезагрузок, ни зависаний, можно переходить на основной жесткий диск, на всякий случай, предварительно зарезервировав его содержимое (см. рис. 8). А хотите изменить логотип, высвечивающийся в северо-восточном углу экрана? Это совсем несложно сделать. Старые BIOS хранили картинку в секции «LOGO» в нестандартном формате, условно называемом logo-форматом. С ним была связана куча ограничений, и требовался специальный конвертор, иногда прилагаемый к ма-

Как прожигают BIOS

схемой FLASH-памяти (читать или прожигать), доступный через прерывания INT 15h и INT 16h (подробности– в Interrupt List Ральфа Брауна). Award BIOS такой возможности не имеют и программируются через порты ввода/вывода. Конструктивно FLASH-микросхема подключена к южному мосту чипсета, поэтому описание интерфейса взаимодействия с BIOS, следует искать именно в документации на южный мост. Как вариант, можно воспользоваться готовым программатором, с которым поставляется все неРисунок 9. Микросхема FLASH-памяти, подключенная обходимое программное обек южному мосту спечение.

AMI BIOS имеют специальный интерфейс, позволяющий работать с микро-

83


hardware теринской плате, но чаще его приходилось писать самостоятельно. Сейчас же секция «LOGO» в большинстве случаев пуста, а картинка хранится в секции «EPA pattern» в стандартном BMP-формате. Ограничений на размер и глубину цветности нет никаких, однако не все BIOS поддерживают слишком большие и цветастые картинки. Что произойдет, если подсунуть BIOS картинку, которую он не в состоянии обрабатывать? Ничего страшного! Система либо откажется выводить ее на экран или выведет с искажениями. Чтобы не попасть впросак, рекомендуется отталкиваться от уже существующей картинки: извлекаем оригинальный логоРисунок 10. Страничка из документации на чипсет, описывающая конфигурационные регистры тип в файл (в Award BIOS Editor за это отвечает команда «Export as ки в настойках BIOS и увеличить ее! А Windows BMP»), загружаем его в Paint для этого нам вновь пригодится Award и правим в свое удовольствие без из- BIOS editor (см. рис. 11). А вот еще один трюк. Запустив уже менения глубины цветности и размеров. Один из примеров такой работы упомянутую утилиту BP.EXE с ключом /c, мы сможем вручную задать имя проприведен ниже. При желании можно зашить в BIOS цессора, высвечивающееся при заполноэкранный логотип, высвечива- грузке, и его тактовую частоту. Реальемый при загрузке. Этим занимается ная тактовая частота отображаться одноименная утилита от Award, вхо- уже не будет. Почему бы не написать дящая в штатный комплект поставки «AMD Pentium-V 666 GHz beta» и не помногих материнских плат ASUS. Од- хвастаться перед друзьями? Да много чего можно придумать! В нако в некоторых BIOS задержка вывода полноэкранного логотипа столь умелых руках BP.EXE и Award BIOS edмала, что ряд CRT-мониторов просто itor творят настоящие чудеса! Как бы не успевают прогреться за это время! там ни было, после всех издевательств Но ведь не переходить же ради это- прошивка должна быть залита в BIOS. го на LCD-монитор? Разумеется, нет! О том, как это сделать, можно прочиДостаточно найти величину задерж- тать в документации на материнскую плату (см. рис. 12).

Редактирование BIOS

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

84

Настройка PCI-регистров Конфигурирование чипсета осуществляется специальными регистрами, доступными через шину PCI. При загрузке системы BIOS настраивает процессор, контроллер системной шины, контроллер оперативной памяти и всю прочую периферию в соответствии с настройками, выбранными в «BIOS Setup». Однако практически ни один BIOS не дает доступа ко всем настройкам чипсета или умышленно ограничивает диапазон доступных значений. Как быть, что делать?

Запускаем Award BIOS editor, заходим в System BIOS, находим вкладку «Chipset Registers» и открываем документацию на чипсет. Где-то там должен быть раздел «PCI Configuration Registers» или чтото в этом роде. Для каждого из регистров будет указано устройство (device), к которому он «подключен», номер функции (function) и номер самого регистра, также называемый смещением (offset). Все регистры 8-битные, однако несколько последовательных регистров могут объединяться в слова или даже двойные слова. Сравнение конфигурационных возможностей чипсета с BIOS Setup показывает, что часть настроек в ней отсутствуют. Даже в заблокированных возможностях (о которых мы уже говорили выше) их нет! В частности, мой любимый AMD 761 поддерживает намного больший диапазон таймингов, чем указано в BIOS Setup. Взять хотя бы величину tPR (time to precharge), определяющую время закрытия DRAM-страницы, в процессе которого происходят возврат данных в банк памяти и его перезарядка. По умолчанию BIOS ставит 3 такта и не дает его изме-

Рисунок 11. Изменение стандартного логотипа, выводимого при загрузке на экран

Рисунок 12. Прожигание BIOS специализированной утилитой от ASUS


hardware нять. Чтобы сократить tPR до вания BIOS или расширения 1 такта, необходимо модифиего возможностей. Они перецировать 8 и 7 биты регистра числены во врезке. Dev 0:F0:0x54, присвоив им В рамка х одной- единзначение 2 («10» в двоичной ственной статьи просто ненотации). Остальные биты не возможно охватить все подтрогать! А как это сделать? робности этого увлекательНеобходимо наложить маного процесса целиком, поску (mask), которая в данном этому не воспринимайте ее случае будет выглядеть так: как законченный путеводи«XXXX XXX1 1XXX XXXX». тель. Скорее это пригласиКак видно, 8 и 7 биты установтельный билет в удивительлены в единицу, остальные ный мир, скрытый в недрах помечены знаком «Х», указынебольшой микросхемы. И вающим BIOS, что данный бит пускай кто-то скажет, что ренеобходимо оставить без издактирование BIOS носит менений (см. рис. 10). скорее познавательный, чем Запись «Dev0:F0:0x54» практический характер (устаобозначает: Device 0:Function навливать «разблокированРисунок 13. Разгон системы при помощи редактирования конфигурационных регистров 0:Register 0x54. На самом деный» BIOS в ответственный ле этих регистров целых два. Регистр ши возможности будут довольно огра- сервер я бы не рискнул)! Но должны 0x54 хранит младшую, а 0x55 – стар- ничены. же у администратора быть хоть кашую половину слова. Следователькие-то развлечения, тем более что но, в 0x54 необходимо занести 80h Заключение экспериментировать со списанными («10.00.00.00»), а в 0x55 – 01h. Соот- Кроме Award BIOS editor существуют материнскими платами никто не заветственно в первом случае маска бу- и другие программы для редактиро- прещает! дет равна 80h («1X.XX.XX.XX»), а во DUAL-BIOS своими руками втором 01h. Возвращаемся к Award BIOS Edi- Каждый радиолюбитель, умеющий tor, находим регистр с номером 0x54 держать паяльник в руках, может дораи, кликнув правой клавишей мыши, ботать материнскую плату, установив выбираем пункт «modify». В появив- на нее сразу две микросхемы FLASH– шемся окне первые три поля (Regis- памяти. Тогда между ними можно буter, PCI, PCI) оставляем без измене- дет переключаться без труднодоступний (это номер регистра, устройства ного и притом весьма дорогостоящего и функции), а вот с двумя последую- chip-extractor. Как видно из рис. 14, ниРисунок 14. Принципиальная схема DUAL-BIOS щими полями «Resister» и «Value» при- чего сложного в DUAL-BIOS нет. дется разобраться особо. Мы не можем 8. Исходные тексты пары устаревших просто взять и записать значение 0x- Интересные ссылки: прошивок (на ассемблере): http:// 1. http://www.biosmods.com (на англ.) 80, поскольку в этом регистре уже храmiscellaneous.newmail.ru. 2. Статьи по прошивке и их доработнятся какие-то параметры, модифи9. Описание формата BIOS для его ке (на русс.): http://www.rom.by. цирующие остальные поля. Мы должручной распаковки (на рус.): http:// 3. FAQ по BIOS (на рус.): http://www. ны устанавливать лишь «наши» биwww.winsov.ru/bios002.php. ixbt.com/mainboard/faq/biosfaq.shtml. ты (в данном случае это бит 7), а над 4. Сайт хакера, исследовавшего ку- 10. Статья по редактированию региостальными выполнить операцию лостров чипсета (на рус.): http://www. чу BIOS вдоль и поперек (на англ.): гическое «OR» по маске. Аналогичным tweakfactor.com/articles/tweaks/ http://www.geocities.com/mamanzip. образом настраивается и регистр 55h amd762/1.html. 5. Статья о модификации BIOS (на (см. рис. 13). англ.): http://www.ryston.cz/petr/bios/ 11. Разгон системы путем редактироваЗалив обновленную прошивку в ния регистров чипсета: http://www. ga586hx_mod.html. BIOS и установив качественные модуoverclockers.com/tips105/index.asp. 6. Статья известнейшего хакера по ли памяти, мы с удовлетворением завнедрению своего кода в BIOS (на 12. Утилита для модификации регистмечаем, что быстродействие системы ров чипсета: http://www.h-oda.com. англ.):http://www.codebreakers-jourощутимо возросло, особенно на операnal.com/include/getdoc.php?id=83& 13. Редактор Award BIOS: http://awdциях хаотичного доступа к памяти, когbedit.sourceforge.net. article=38&mode=pdf. да закрытие DRAM-страниц происхо7. Новые идеи по внедрению своего ко- 14. Утилита для автоматизированнодит чуть ли не на каждом шагу. го внедрения своего кода в BIOS: да в BIOS (на англ.): http://www.codeАналогичным образом можно реhttp://webzoom.freewebs.com/tmod/ breakers-journal.com/include/getdoc.p дактировать и остальные регистры, отAwdhack.zip. hp?id=127&article=58&mode=pdf. сутствующие в BIOS Setup, однако на-

№6, июнь 2005

85


IMHO

РАЗМЫШЛЕНИЯ О UNIX Различия операционных систем семейств Windows и UNIX видны практически с первого взгляда и в процессе работы становятся все более отчетливыми. Попытаемся обобщить и систематизировать основные принципы UNIX, делающие представителей этого семейства операционных систем именно такими, какие они есть.

П

онимание этих особенностей, причем не на интуитивном уровне, а вполне осознанное, должно помочь пользователям, «воспитанным» на DOS и Windows, при переходе на UNIX-подобные системы. Я не претендую на абсолютную истинность мыслей, которые здесь прозвучат. Так или иначе, но каждый будет пропускать все сквозь призму своего опыта.

Какой должна быть идеальная ОС? Для начала попытаемся сформулировать некоторые требования к идеальной с точки зрения конечного пользователя операционной системе. Во-первых, система должна быть понятной, не требующей обучения (разве что экспресс-курсов вождения мыши) для начала работы. Назовем это требованием интуитивной понятности. Во-вторых, с системой должно быть удобно работать. Из курсов эргономики и психологии известна так называемая формула «7 ± 2», согласно которой человек способен охватить своим вниманием одновременно от 5 до 9 объектов. Таким образом, и операционная система должна строиться с расчетом, чтобы пользователю не приходилось постоянно держать в уме большее количество возможных действий, ключей и т. д. То есть важно, чтобы конечный результат мог быть получен за небольшое количество «ходов». Это будет требование эргономичности. В-третьих, разработчики системы должны гарантировать, что их детище будет в любой ситуации вести себя так, как описано в инструкции (не забывайте, что речь идет об идеальной системе; юридически такие гарантии предоставляют единицы). То есть добавляется еще требование ответственности разработчика.

86

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

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

Процедурные и проективные ОС

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

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

Документирование систем


IMHO или иного объекта. То есть документация вырождается в инструкцию. В UNIX, наоборот, информация о системе приобретает первостепенное значение. Поскольку в силу требования экономности интерфейс ориентирован в первую очередь на удобство для системы, а не для пользователя, то любой инструмент такой ОС должен быть снабжен подробным описанием того, как им пользоваться. Чтобы иметь возможность модифицировать систему, информация о ней должна быть еще более полной и охватывать не только возможные способы ее использования, но и описывать внутреннее устройство. Говоря другими словами, проективная система должна быть информационно открытой. И верхом такой открытости являются доступные исходные коды, поскольку никакое описание на естественном языке не может обладать такой полнотой.

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

№6, июнь 2005

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

Кто несет ответственность: разработчики или пользователь? Следующий принцип, вытекающий из требования модифицируемости, – отказ от ответственности разработчика. Раз пользователь вправе менять в системе все, что ему заблагорассудится, то и вся ответственность за последствия ложится на него. То есть UNIX ориентирован на квалифицированного пользователя, который любое действие выполняет осознанно. А раз так, то можно сэкономить немного (а иногда и много) ресурсов на «откате» – пользователю предоставляется возможность отменить последнюю операцию только в том случае, если существует вероятность опечатки. Например, в редакторе vi существует отмена последнего действия, но только последнего – у пользователя будет время увидеть свою ошибку и исправить ее, а если совсем «заредактируется» – всегда к его услугам возможность выйти без сохранения. При работе в командной строке, как правило, ни возможности возврата, ни дополнительных вопросов не предусматривается. Действительно, вряд ли можно совершенно случайно набрать «rm -Rf/ ». А раз уж эта команда была набрана, значит, именно она и должна быть выполнена. В конце концов, это оскорбительно, когда какая-то «железяка» сомневается в правильности ваших решений.

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

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

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

87


полезные советы

СИСТЕМНЫЙ АДМИНИСТРАТОР – ИЩЕМ ДОПОЛНИТЕЛЬНЫЕ ИСТОЧНИКИ ДОХОДА

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

РОМАН МАРКОВ

Т

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

88

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

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


полезные советы товка, повышение квалификации и поиски новых идей.

С чего начать? Прежде всего с оценки собственной квалификации. Именно исходя из этого вы сможете понять – нужно ли срочно ее повышать (либо осваивать другие технологии – об этом мы также поговорим) или уже можно брать «с места в карьер». Тут возможным решением является совмещение самообразования и поиска дополнительной работы, а зачастую – и повышение/расширение своей квалификации уже на дополнительном рабочем месте. Стоит ответить на вопрос – а какие все-таки сети и программное обеспечение вы в состоянии администрировать, не напрягаясь и не затрачивая на это более одного часа в день. На самом деле, даже час в день – это много при удаленном администрировании небольшой сети до 10-20 компьютеров. Мой личный опыт, а также информация коллег показывают, что, как правило, при отлаженной схеме на это тратится не более двух-трех часов в неделю при условии, что система отлажена и работает безупречно, а пользователи не задают глупых вопросов каждые 5 минут. На этих аспектах мы более подробно остановимся далее. Теперь необходимо упомянуть о профессиональных навыках. Не хочется обидеть уважаемых и чтимых мной представителей UNIX-сообщества, однако на данный момент среднестатистической операционной системой для рабочих станций (да и для серверов) в мелких и средних российских фирмах все же является Microsoft Windows. Поэтому, если вы действительно хотите получить возможность дополнительного заработка, эти ОС придется хорошо изучить. В противном случае вы не будете востребованы большинством таких компаний, а именно они и являются для вас потенциальными клиентами. Любые фразы о том, что «можно все настроить под Linux, 1С запустить в режиме эмуляции, а OpenOffice абсолютно такой же, как и Microsoft Office» почти во всех случаях обречены на провал – никто не захочет работать в другой операционной среде, обучаться заново и пр. При этом я ни в коем случае не говорю о том, что проблематичным окажет-

№6, июнь 2005

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

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

интересам периодически организуют встречи «за пивом», на которых специалисты знакомятся воочию, а также ведут неспешные беседы. Обязательно приходите на такие встречи – на них вы сможете на других посмотреть и себя показать, понять, кто может быть полезен вам, а кому, возможно, окажетесь полезны вы. Это не означает, что вы обязательно должны быть профессионалом для участия в них. Напротив, это поможет накопить хорошую базу знаний о проблемных ситуациях, не проверяя их на себе. Постепенно опыт будет расти, и задавать вопросы вы будете гораздо реже, чем отвечать на них. Однако помните, что стремление как можно больше «засветиться», отвечая не по существу, а также на вопросы, в которых вы некомпетентны, принесет только отрицательную славу. Лучше меньше, но абсолютно точно. Пройдет много времени, прежде чем другие участники смогут нанять вас, вместо того чтобы сделать работу самостоятельно. Однако главный минус саморекламы среди коллег состоит в том, что все они получают зарплату за свой труд, и даже если вы приобретете репутацию исключительного профессионала, их фирмы все равно не смогут предложить вам даже разовые работы – очень трудно объяснить руководству, что необходимо нанимать специалиста со стороны. Для эффективной саморекламы принимайте участие не только в конференциях для системных администраторов. Крайне полезным окажется участие в форумах для смежных специальностей – программистов бухгалтерских систем, например 1С:Предприятие, даже если вы не являетесь таким специалистом. В данный момент одним из самых популярных общероссийских форумов является «Территория 1С» на www.kuban.ru. Однако стоит помнить, что в нем действительно участвуют почти все города России и некоторые города СНГ, поэтому, может быть, понадобится дополнительно найти похожий ресурс для своего региона. Почему же так полезно участвовать в подобных форумах и почему в конференциях именно этого направления вы имеете шанс найти своего потенциального работодателя? Дело в том, что на таких конференциях под грифом «Offtopic» постоянно

89


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

90

ли данные очные знакомства подкреплять дальнейшей постоянной помощью на таком форуме – очень скоро вы приобретете популярность именно как грамотный сетевой специалист. Дальнейшее общение обязательно принесет вам для начала маленькие поручения в виде разовых работ по настройке, а в дальнейшем и постоянные контракты на обслуживание. Ваша главная задача – правильно себя позиционировать и обязательно лично знакомиться с та кими специалистами. Не следует бояться посещать такие мероприятия по причине того, что вы плохо разбираетесь конкретно в данном программном продукте и направлении. Если грамотно провести подготовительную работу на форуме, отвечая на вопросы, являющиеся вашим коньком, то на встрече вас узнают, вспомнят и будут очень часто обращаться за советом. Именно во время таких встреч вы обрастете нужными контактами и оставите свои координаты для потенциальных заказчиков. Не забудьте визитки. Указанная в них должность должна сразу отвечать на вопрос: почему необходимо обратиться именно к вам? Например: «Системный администратор», «Ведущий технический специалист» и т. д. Если у вас нет визиток, закажите их в любой полиграфической фирме – их цена на сегодняшний день крайне низка. Всегда помните, что делать прямые или косвенные намеки на то, что вы можете решить сложный вопрос за деньги, на форумах запрещено. Но когда репутация хорошего специалиста будет заработана, ситуация может поменяться, так как даже завуалированный намек на то, что вы можете помочь, вызовет обращение к вам другим способом (например, по уже известному людям телефону). К сожалению, такое повышение собственной известности в определенных кругах – сложный, трудоемкий и долгосрочный процесс. Однако он приносит великолепные результаты, и в какой-то момент вы начнете понимать, что даже через несколько месяцев отсутствия на форуме вас по-прежнему будут приглашать на встречи. Например, в Санкт-Петербурге такое неформаль ное общение специалистов по платформе 1С:Предприятие существует уже более 6 лет, и большинство до-

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

Как успешно провести переговоры? Теперь стоит поговорить о стиле проведения переговоров, если вас уже пригласили на собеседование, чтобы подробнее ознакомиться с предлагаемыми вами услугами и рассказать о тех проблемах, которые необходимо ре шить. Очень внимательно отнеситесь к этим советам – они не голословны и в большинстве своем помогают выделиться из числа других кандидатов.

Предварительная договоренность о встрече Как правило, это телефонный звонок. Уже в этот момент вы должны произвести первое впечатление на потенциального заказчика, ведя разговор четко и уверенно. Дайте понять собеседнику, что вы деловой человек, проявив пунктуальность при назначении времени встречи. Четко оговорите дату, время и место встречи, узнайте, кого необходимо будет найти (ФИО и должность), какие документы необходимо взять с собой. Всегда имейте при себе паспорт, чтобы не попасть впросак на проходной, вынудив сотрудника ком па нии улаживать эти вопросы. Назначайте встречу на точное время, а не «с утра до обеда» – цените время других, и они оценят вас. Максимально допустимое уточнение времени – до 30 минут, при условии вашей ссылки на трудности проезда из-за пробок. Наличие автомобиля, кстати, большой плюс в данном случае. Если он у вас есть – не за-


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

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

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

№6, июнь 2005

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

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

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

ОТ РЕДАКЦИИ Есть еще один эффективный способ дополнительно зарабатывать, о котором не упомянул Роман Марков в своей статье. Впрочем, он только что продемонстрировал его на деле – каждый из вас может стать автором нашего журнала! Поделитесь с коллегами положительным опытом, расскажите об успешном решении проблем - это принесет вам дополнительный доход, уважение и известность в IT-кругах. Ваши статьи, исследования, разработки и заметки отправляйте на адрес sekretar@samag.ru для Натальи Хвостовой.

91


книжная полка Linux. Программирование в примерах Арнольд Роббинс Из эпиграфа к книге: «Одним из лучших способов научиться программированию является чтение хорошо написанных программ». Именно этому совету и последовал автор. Все рассматриваемые темы сопровождаются изучением конкретных примеров, большинство из которых являются исходным кодом канонической версии UNIX v7. Среди подробно рассмотренных тем: аргументы, опции и переменные окружения. Управление памятью на уровне пользователя, файлы и файловый ввод/вывод. Каталоги и служебные данные файлов, общие библиотечные интерфейсы. Среди более сложных тем: управление процессами и каналы, сигналы, интернационализация и локализация, расширенные интерфейсы. Отдельная глава книги посвящена отладке приложений. Весь материал основан на личном опыте автора, полученном более чем за 15 лет программирования, а «житейские» советы, которыми он делится, приходятся всегда кстати. На мой взгляд, это одно из лучших изданий, посвященных программированию на С под Linux из появившихся за последнее время. Издательство «КУДИЦ-ОБРАЗ», 2005 г. – 657 стр. ISBN 59579-0059-1 (ориг. 0-13-142964-7).

UNIX/Linux. Теория и практика программирования Брюс Моли Книга посвящена вопросам системного программирования в среде UNIX. Основная задача издания показать, как работает UNIX изнутри. В качестве основных языков разработки выступают C и shell script. Приводятся подробные сведения о вводе/выводе для файлов и устройств, а также о таймерах, драйверах терминала. Рассмотрены вопросы, посвященные созданию соединения между локальными и удаленными процессами, сокетам. Отдельные главы посвящены POSIX-нитям, параллельным функциям и IPC. На всем протяжении книги излагаемый материал сопровождается примерами исходного кода и иллюстрациями. В качестве примеров автор предлагает разработку собственных версий команд who, ls, pwd, простого варианта sh и минимальную версию веб-сервера httpd. Контрольные вопросы и задания в конце каждой из глав помогут читателю проверить, насколько хорошо был усвоен прочитанный материал. Издательство «КУДИЦ-ОБРАЗ», 2004 г. – 576 стр. ISBN 593378-087-1 (ориг. 0-13-008396-8).

№6, июнь 2005

Порождающее программирование. Методы, инструменты, применение К. Чарнецки, У. Айзенекер Основной философией порождающего программирования является идея перехода к полуавтоматическому производству различного ПО. В книге речь идет о методах и инструментах порождающего программирования и удачно сочетаются теоретические и практические сведения. Среди рассмотренных тем: методы и приемы анализа и проектирования (инженерия предметной области и объектно-ориентированные методы анализа проектирования, моделирование характеристик), технологии реализации (родовое программирование, компонентно-ориентированные методики шаблонного программирования на С++, аспектно-ориентированное программирование, генераторы, статическое и ментальное программирование на С++). В разделе практических примеров рассмотрены варианты реализации спискового контейнера и порождающей библиотеки расчета матриц. Материал сопровождается большим количеством примеров и иллюстраций. Книга рассчитана на опытных программистов. Издательство «Питер», 2005 г. – 731 стр. ISBN 5-469-001180 (ориг. ISBN 0-201-30977-7).

Windows server 2003. Справочник Митч Таллоч Это издание можно смело назвать настольной книгой любого администратора ОС Windows 2003. Автор разделил задачи на выполняемые с помощью графического интерфейса и на исполняемые из командной строки, что несомненно очень удобно. Приводятся подробные сведения о DHCP, AD, DFS, DNS, WINS, автоматических обновлениях, аудите, групповых политиках, делегировании прав, дистанционном управлении рабочим столом, доменах, консоли управления MMC и многом другом. Среди рассмотренных команд и утилит командной строки: bootcfg, diskpart, driverquery, net, netsh, route, rsh и других, многие из них появились только в W2k3. На всем протяжении изложения материала автор применяет «справочный» стиль изложения, раскрывающий самую суть задачи. Издательство «Питер», 2005 г. – 748 стр. ISBN 5-469-00023-0 (ориг. 0-596-00404-4).

Рубрику ведет Александр Байрак

93


bugtraq Множественные уязвимости в Ipswitch Imail-сервере

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

Программа: Ipswitch Imail 8.13 и более ранние версии. Опасность: Критическая. Описание: Обнаруженные уязвимости позволяют удаленному пользователю вызвать отказ в обслуживании, получить доступ к потенциально важным данным и выполнить произвольный код с системными привилегиями. 1. Уязвимость обнаружена при обработке входных данных в команде STATUS в IMAP-сервере. Слишком длинное имя почтового ящика может вызвать переполнение стека и позволить удаленному авторизованному пользователю выполнить произвольный код на целевой системе с привилегиями Local System. 2. Уязвимость существует при обработкe NULL-символов в команде LSUB в процессе IMAPD32.EXE. Удаленный пользователь может с помощью специально сформированного аргумента команды заставить уязвимый процесс потреблять все доступные ресурсы на системе, что приведет к отказу в обслуживании. 3. Уязвимость обнаружена в команде LOGIN. Удаленный неавторизованный пользователь может послать в качестве имени пользователя строку длиной более 2000 байт, вызвать переполнение стека и выполнить произвольный код на целевой системе. 4. Уязвимость существует при обработке некоторых символов (% : * @ &) в команде LOGIN. Удаленный неавторизованный пользователь может с помощью специально сформированного имени пользователя выполнить произвольный код на целевой системе. 5. Уязвимость обнаружена при обработке запроса к несуществующим javascript сценариям (jsp) в Imail Web Calendaring. Удаленный неавторизованный пользователь может с помощью символов обхода каталога прочитать произвольные файлы на системе. Пример:

Программа: BEA WebLogic 6.1, 7.0, 8.1. Опасность: Средняя. Описание: Обнаруженные уязвимости позволяют удаленному пользователю получить доступ к потенциально важной информации и вызвать отказ в обслуживании. 1. Пользователь с привилегиями Monitor security role может манипулировать JDBC-пулами. Уязвимые приложения: WebLogic Server / Express 8.1 Service Pack 2 (all platforms), WebLogic Server / Express 8.1 Service Pack 3 (all platforms). 2. Ошибка при обработке исключений в security provider позволяет злоумышленнику управлять аудитом исключений. Уязвимые приложения: WebLogic Server / Express 8.1 Service Pack 3 (all platforms), WebLogic Server / Express 7.0 Service Pack 5 (all platforms). 3. Приложение не требует пройти повторную аутентификацию пользователей после изменений политик безопасности. Уязвимые приложения: WebLogic Server / Express 7.0 Service Pack 5 (all platforms). 4. После неудачной авторизации пароль пользователя может быть опубликован на странице авторизации. Уязвимые приложения: WebLogic Portal 8.1 through Service Pack 3 (all platforms). 5. Ошибка при обработке файлов куки может замедлить работу кластера сайтов. Уязвимые приложения: WebLogic Server / Express 7.0 through Service Pack 5 (all platforms). 6. Межсайтовый скриптинг возможен при обработке некоторых входных данных. Уязвимые приложения: WebLogic Server / Express 8.1 through Service Pack 4 (all platforms), WebLogic Server / Express 7.0 through Service Pack 6 (all platforms). 7. Удаленный неавторизованный пользователь может подключиться к LDAP-серверу и получить доступ к потенциально важной информации или вызвать отказ в обслуживании. Уязвимые приложения: WebLogic Server / Express 8.1 through Service Pack 4 (all platforms), WebLogic Server / Express 7.0 through Service Pack 5 (all platforms). 8. Возможен отказ в обслуживании. Уязвимые приложения: WebLogic Server / Express 6.1 Service Pack 4 (all platforms). URL производителя: www.bea.com. Решение: Установите исправления от производителя.

GET /bla.jsp?\..\..\..\..\..\..\..\..\..\..\boot.ini HTTP/1.0 Connection: Close Host: example.com User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Pragma: no-cache

6. Уязвимость при обработке данных в команде SELECT в IMAP сервере позволяет удаленному авторизованному пользователю вызвать отказ в обслуживании. Злоумышленник может послать строку длиной более 260 байт и аварийно завершить работу приложения. URL производителя: www.ipswitch.com. Решение: Установите исправление от производителя: ftp:// ftp.ipswitch.com/Ipswitch/Product_Support/IMail/imail82hf2.exe.

Ошибка при обработке zip-архивов в MailScanner Программа: MailScanner 4.41.3. Опасность: Низкая. Описание: Уязвимость существует при обработке определенных типов zip-файлов. Удаленный пользователь может обойти фильтрацию сообщений и заставить приложение не генерировать отчет об обнаружении вируса. URL производителя: www.sng.ecs.soton.ac.uk/mailscanner. Решение: Установите обновление с сайта производителя.

94

Отказ в обслуживании в ImageMagick и GraphicsMagick XWD-декодере Программа: ImageMagick версии до 6.2.2-3; GraphicsMagick версии до 1.1.6-r1. Опасность: Средняя. Описание: Уязвимость существует при обработке цветовых масок в XWD-декодере. Удаленный пользователь может с помощью специально сформированного изображения (цветовая маска установлена в ноль) заставить уязвимое приложение потреблять все доступные ресурсы на системе. Решение: Установите последнюю версию от производителя.

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


подписка на II полугодие 2005 Российская Федерация

! Казахстан – по каталогу «Российская Пресса» через

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

! Беларусь – по каталогу изданий стран СНГ через РГО

! Подписной индекс: 81655

ОАО «Казпочта» и ЗАО «Евразия пресс»

«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)

! Узбекистан – по каталогу «Davriy nashrlar» российские

!

! !

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

!

издания через агентство по распространению печати «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

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

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

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

№6, июнь 2005

95


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

96

ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Устанавливаем jabberкластер на базе ejabberd Jabber в настоящее время становится все более распространенным в корпоративной и интернет-среде. Крупные jabber-серверы находятся под постоянной высокой нагрузкой. Одним из методов оптимизации стабильности и производительности является кластеризация. В данной статье будет описана настройка одного из наиболее продвинутого по возможностям jabber-сервера в кластерном варианте – ejabberd.

Kerberos поверх LDAP Настроим открытую версию Kerberos Heimdal для работы с OpenLDAP в качестве бэкэнда для хранения своих данных. Такое решение позволит нам создать единое хранилище всей информации для обеспечения процесса аутентификации и авторизации пользователей в GNU/Linux.

Настраиваем антивирус-прокси Несомненно антивирусная защита должна быть обязательным атрибутом грамотно спланированной IT-стратегии организации. И для не обремененного лишними деньгами бюджета IT-отдела закупка и установка на всех пользовательских компьютерах антивирусных программ может стать вполне весомой статьей расходов. Можно ли как-то избежать лишних расходов? Если на клиентских рабочих местах отсутствуют или отключены НГМД, а по-

чта уже проверяется каким-нибудь открытым антивирусом, типа Clamav, то единственным возможным источником вирусов может являться &laquo;дикий интернет&raquo;. И если доступ пользователям открыт только через протокол HTTP, то только его нам и остается сканировать. Делать это удобнее и дешевле на сервере и при помощи открытого ПО, чем мы и займемся.

Kaspersky Antivirus 5.0 в составе Sendmail Настраиваем 5-ю версию антивируса Касперского в составе почтовой системы Sendmail. Отличий от прошлых конфигураций несколько: в настройке и реализации протокола связи антивируса; в использовании milter; стыковка компонентов осуществляется с минимальными затратами и настройками; а также появилась возможность использовать антивирус для рабочих станций UNIX.

Используем технологию LinuxBIOS на системах VIA EPIA-M Почти каждый из вас в детстве играл в конструктор, собирал железную дорогу или машинки. Есть такая фраза, что по мере взросления у сильной половины человечества игрушки не исчезают, а только становятся более дорогими. Вот и сегодня мы попытаемся своими руками собрать из своеобразного конструктора – связки LinuxBIOS и VIA EPIA-M – домашнюю barebone-систему.

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

031 Системный Администратор 06 2005  

НЕОЖ ИДАННО ЗАКОНЧИЛИСЬ БЫСТРО РАСКУПИЛИ ТИРАЖ НОВОГОДНИЕ №6(31) ИЮНЬ 2005 подписной индекс 81655 www.samag.ru ЗАТЯНУЛИСЬ КАНИКУЛЫ ОТПУСКА Д...

Read more
Read more
Similar to
Popular now
Just for you